diff --git a/.vscode/settings.json b/.vscode/settings.json index 86a60618f..a1e9c79c0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -157,7 +157,14 @@ "sledge_abi_symbols.h": "c", "mutex": "c", "lock.h": "c", - "route_latency.h": "c" + "route_latency.h": "c", + "wasm_globals.h": "c", + "*.bak": "c", + "sandbox_set_as_initialized.h": "c", + "sandbox_set_as_allocated.h": "c", + "sandbox_total.h": "c", + "system_error": "c", + "metrics_server.h": "c" }, "files.exclude": { "**/.git": true, diff --git a/Makefile b/Makefile index 929f95a86..7c7c48f93 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ libsledge.clean: .PHONY: runtime runtime: make -C runtime - + ./rsync.sh .PHONY: runtime.clean runtime.clean: diff --git a/applications/Makefile b/applications/Makefile index 382b87026..3517f9ca4 100644 --- a/applications/Makefile +++ b/applications/Makefile @@ -12,7 +12,7 @@ LDFLAGS=-shared -fPIC -Wl,--export-dynamic,--whole-archive -L../libsledge/dist/ # LDFLAGS=-flto -fvisibility=hidden # Strips out calls to assert() and disables debuglog -CFLAGS+=-DNDEBUG +# CFLAGS+=-DNDEBUG dist: mkdir -p dist diff --git a/libsledge/Makefile b/libsledge/Makefile index 9f0d4df69..e5dde7f47 100644 --- a/libsledge/Makefile +++ b/libsledge/Makefile @@ -5,7 +5,7 @@ INCLUDES := -Iinclude/ CFLAGS := -fPIC -O3 -flto -ftls-model=initial-exec # Strips out calls to assert() and disables debuglog -CFLAGS+=-DNDEBUG +# CFLAGS+=-DNDEBUG # CFI Sanitizer # CFLAGS+=-fvisibility=default -fsanitize=cfi diff --git a/libsledge/include/sledge_abi.h b/libsledge/include/sledge_abi.h index 2b47f86ec..e7a904ec9 100644 --- a/libsledge/include/sledge_abi.h +++ b/libsledge/include/sledge_abi.h @@ -28,6 +28,7 @@ struct sledge_abi__wasm_memory { uint64_t capacity; /* Size backed by actual pages */ uint64_t max; /* Soft cap in bytes. Defaults to 4GB */ uint8_t *buffer; /* Backing heap allocation. Different lifetime because realloc might move this */ + uint64_t id; }; /* This structure is the runtime representation of the unique state of a module instance diff --git a/libsledge/src/memory_instructions.c b/libsledge/src/memory_instructions.c index 2e8be9097..55d4bf172 100644 --- a/libsledge/src/memory_instructions.c +++ b/libsledge/src/memory_instructions.c @@ -18,6 +18,7 @@ INLINE float get_f32(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(float *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -26,6 +27,7 @@ INLINE double get_f64(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(double *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -34,6 +36,7 @@ INLINE int8_t get_i8(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(int8_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -42,6 +45,7 @@ INLINE int16_t get_i16(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(int16_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -50,6 +54,7 @@ INLINE int32_t get_i32(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(int32_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -58,6 +63,7 @@ INLINE int64_t get_i64(uint32_t offset) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); return *(int64_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset]; } @@ -67,6 +73,7 @@ INLINE void set_f32(uint32_t offset, float value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(float *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } @@ -75,6 +82,7 @@ INLINE void set_f64(uint32_t offset, double value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(double *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } @@ -83,6 +91,7 @@ INLINE void set_i8(uint32_t offset, int8_t value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(int8_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } @@ -91,6 +100,7 @@ INLINE void set_i16(uint32_t offset, int16_t value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(int16_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } @@ -99,6 +109,7 @@ INLINE void set_i32(uint32_t offset, int32_t value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(int32_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } @@ -107,6 +118,7 @@ INLINE void set_i64(uint32_t offset, int64_t value) { assert(sledge_abi__current_wasm_module_instance.memory.buffer != NULL); + assert(offset < sledge_abi__current_wasm_module_instance.memory.size); *(int64_t *)&sledge_abi__current_wasm_module_instance.memory.buffer[offset] = value; } diff --git a/rsync.sh b/rsync.sh new file mode 100755 index 000000000..398858515 --- /dev/null +++ b/rsync.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# rsync -ru --progress --exclude={'res','out.txt','out.dat','err.dat'} ./tests/* emil@c220g2-011017.wisc.cloudlab.us:/users/emil/sledge-server/tests/ +# rsync -ru --progress --exclude={'res','out.txt','out.dat','err.dat'} ./tests/* emil@c220g2-011016.wisc.cloudlab.us:/users/emil/sledge-client/tests/ + +# rsync -ru --progress --exclude={'thirdparty','res','err.dat','out*','*.log'} ./tests ./runtime emil@c220g2-011314.wisc.cloudlab.us:/users/emil/sledge-server/ +# rsync -ru --progress --exclude={'res','err.dat','out*','*.log'} ./tests emil@c220g2-011323.wisc.cloudlab.us:/users/emil/sledge-client/ + +rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log','input*'} ./tests ./runtime emil@128.105.145.72:/users/emil/sledge-server/ +rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log','mt-juan/input-cnn','mt-emil/input-cnn'} ./tests ./runtime emil@128.105.145.71:/users/emil/sledge-client/ +# rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log','mt-juan/input-cnn','mt-emil/input-cnn'} ./tests ./runtime emil@128.105.145.70:/users/emil/sledge-client/ +rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log','input*'} ./tests ./runtime emil@128.105.145.70:/users/emil/sledge-server/ +# rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log'} ./tests ./runtime emil@128.105.145.132:/users/emil/sledge-client/ + +# If on a network where only 443 is allowed use this (after allowing port forwarding ssh to 443 on the server): +# rsync -ru -e 'ssh -p 443' --progress --exclude={'res','out.txt','out.dat','err.dat'} ./tests/* emil@server:/users/emil/sledge-server/tests/ +# rsync -ru -e 'ssh -p 443' --progress --exclude={'res','out.txt','out.dat','err.dat'} ./tests/* emil@client:/users/emil/sledge-client/tests/ + + +# lab-dell (don't forget to provide the private key in the config file inside .ssh folder) +# rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log'} ./tests ./runtime lab@161.253.75.227:/home/lab/sledge-emil/ + +# CMU (don't forget to provide the private key in the config file inside .ssh folder) +# rsync -ru --progress --exclude={'thirdparty','res','err.dat','out*','*.log'} ./tests ./runtime gwu@arena0.andrew.cmu.edu:/home/gwu/sledge/ + +# esma +# rsync -ru --progress --exclude={'thirdparty','res-*','err.dat','out*','*.log'} ./tests emil@161.253.75.224:/home/emil/sledge-client/ diff --git a/runtime/Makefile b/runtime/Makefile index 4cc736271..50e43fa45 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -14,10 +14,10 @@ CFLAGS=-std=c18 -pthread CFLAGS+=-D_GNU_SOURCE # Release Flags -CFLAGS+=-O3 -flto +# CFLAGS+=-O3 -flto # Debugging Flags -# CFLAGS+=-O0 -g3 +CFLAGS+=-O0 -g3 # CFI Sanitizer # CFLAGS+=-fvisibility=default -fsanitize=cfi @@ -43,6 +43,7 @@ CFLAGS += -DEXECUTION_HISTOGRAM # It is recommended (not mandatory) to enable this flag along with the EXECUTION_HISTOGRAM flag: # CFLAGS += -DADMISSIONS_CONTROL +# CFLAGS += -DTRAFFIC_CONTROL # Debugging Flags @@ -62,6 +63,7 @@ CFLAGS += -DEXECUTION_HISTOGRAM # Various Informational Logs for Debugging # CFLAGS += -DLOG_EXECUTION_HISTOGRAM # CFLAGS += -DLOG_ADMISSIONS_CONTROL +# CFLAGS += -DLOG_TRAFFIC_CONTROL # CFLAGS += -DLOG_CONTEXT_SWITCHES # CFLAGS += -DLOG_HTTP_PARSER # CFLAGS += -DLOG_TENANT_LOADING @@ -74,7 +76,7 @@ CFLAGS += -DEXECUTION_HISTOGRAM # This adds an array of sandbox states to all sandbox structs and appends states at each transition # The history trucates when the number of elements equal SANDBOX_STATE_HISTORY_CAPACITY -# CFLAGS += -DLOG_STATE_CHANGES +CFLAGS += -DLOG_STATE_CHANGES # This dumps per module *.csv files containing the cycle a sandbox has been in RUNNING when each # page is allocated. This helps understand the relationship to memory allocation and execution time. diff --git a/runtime/include/arch/x86_64/context.h b/runtime/include/arch/x86_64/context.h index 5c261f769..b5b59b481 100644 --- a/runtime/include/arch/x86_64/context.h +++ b/runtime/include/arch/x86_64/context.h @@ -56,7 +56,9 @@ arch_context_restore_fast(mcontext_t *active_context, struct arch_context *sandb assert(sandbox_context != NULL); /* Assumption: Base Context is only ever used by arch_context_switch */ - assert(sandbox_context != &worker_thread_base_context); + // assert(sandbox_context != &worker_thread_base_context); + /* Assumption: Not switching to the same context */ + assert(active_context != &sandbox_context->mctx); assert(sandbox_context->regs[UREG_SP]); assert(sandbox_context->regs[UREG_IP]); diff --git a/runtime/include/current_sandbox.h b/runtime/include/current_sandbox.h index ac58b4ccb..90b63092e 100644 --- a/runtime/include/current_sandbox.h +++ b/runtime/include/current_sandbox.h @@ -10,6 +10,10 @@ extern thread_local struct sandbox *worker_thread_current_sandbox; void current_sandbox_start(void); +void current_sandbox_exit(void); +void interrupted_sandbox_exit(void); +int sandbox_validate_self_lifetime(struct sandbox *); +void sandbox_kill_self(struct sandbox *); /** * Getter for the current sandbox executing on this thread @@ -51,16 +55,27 @@ current_sandbox_set(struct sandbox *sandbox) /* This is because the event core does not maintain core-assigned deadline */ if (!listener_thread_is_running()) runtime_worker_threads_deadline[worker_thread_idx] = UINT64_MAX; } else { + assert(sandbox->state == SANDBOX_RUNNABLE || sandbox->state == SANDBOX_PREEMPTED); + // if(sandbox->state == SANDBOX_PREEMPTED && sandbox->original_owner_worker_idx != worker_thread_idx) printf("SAND_id: %lu, WASM_id: %lu, wrk: %d\n", sandbox->id, sledge_abi__current_wasm_module_instance.abi.memory.id, worker_thread_idx); + // else + // printf("Else SAND_id: %lu, WASM_id: %lu, wrk: %d, orig_wrk %d\n", sandbox->id, sledge_abi__current_wasm_module_instance.abi.memory.id, worker_thread_idx, sandbox->original_owner_worker_idx); sledge_abi__current_wasm_module_instance.wasi_context = sandbox->wasi_context; + assert(sandbox->memory->abi.capacity > 0); + assert(sandbox->memory->abi.size > 0); + assert(sandbox->memory->abi.max > 0); memcpy(&sledge_abi__current_wasm_module_instance.abi.memory, &sandbox->memory->abi, sizeof(struct sledge_abi__wasm_memory)); +assert(sledge_abi__current_wasm_module_instance.abi.memory.size == sandbox->memory->abi.size); +assert(sledge_abi__current_wasm_module_instance.abi.memory.id == sandbox->id); sledge_abi__current_wasm_module_instance.abi.table = sandbox->module->indirect_table; wasm_globals_update_if_used(&sandbox->globals, 0, &sledge_abi__current_wasm_module_instance.abi.wasmg_0); worker_thread_current_sandbox = sandbox; + if (!listener_thread_is_running()) runtime_worker_threads_deadline[worker_thread_idx] = sandbox->absolute_deadline; } + barrier(); } extern void current_sandbox_sleep(); diff --git a/runtime/include/dbf.h b/runtime/include/dbf.h new file mode 100644 index 000000000..2f1928fbb --- /dev/null +++ b/runtime/include/dbf.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include "tenant.h" +#include "message.h" + +#define DBF_USE_LINKEDLIST +// static const bool USING_AGGREGATED_GLOBAL_DBF = true; + +/* Returns pointer back if successful, null otherwise */ +// extern void *global_dbf; +extern void **global_virt_worker_dbfs; +extern void *global_worker_dbf; + +struct demand_node { + struct ps_list list; + uint64_t abs_deadline; + uint64_t demand; + // uint64_t demand_sum; + // struct sandbox_metadata *sandbox_meta; + struct tenant *tenant; +}; + +typedef enum dbf_update_mode +{ + DBF_CHECK_AND_ADD_DEMAND, /* normal mode for adding new sandbox demands */ + DBF_FORCE_ADD_NEW_SANDBOX_DEMAND, /* work-conservation mode*/ + DBF_FORCE_ADD_MANUAL_DEMAND, /* work-conservation mode*/ + DBF_REDUCE_EXISTING_DEMAND, /* normal mode for reducing existing sandbox demands */ + // DBF_CHECK_EXISTING_SANDBOX_EXTRA_DEMAND, /* special case when a sandbox goes over its expected exec */ + DBF_DELETE_EXISTING_DEMAND /* normal mode for removing existing sandbox demand */ +} dbf_update_mode_t; + +typedef int (*dbf_get_worker_idx_fn_t)(void *); +typedef uint64_t (*dbf_get_time_of_oversupply_fn_t)(void *); +typedef void (*dbf_print_fn_t)(void *, uint64_t); +typedef bool (*dbf_try_update_demand_fn_t)(void *, uint64_t, uint64_t, uint64_t, uint64_t, dbf_update_mode_t, void *, struct sandbox_metadata *sandbox_meta); +typedef uint64_t (*dbf_get_demand_overgone_its_supply_at_fn_t)(void *, uint64_t, uint64_t, uint64_t); +typedef void (*dbf_free_fn_t)(void *); + +struct dbf_config { + dbf_get_worker_idx_fn_t get_worker_idx_fn; + // dbf_get_max_relative_dl_fn_t get_max_relative_dl_fn; + dbf_get_time_of_oversupply_fn_t get_time_of_oversupply_fn; + dbf_print_fn_t print_fn; + // dbf_grow_fn_t grow_fn; + dbf_try_update_demand_fn_t try_update_demand_fn; + dbf_get_demand_overgone_its_supply_at_fn_t get_demand_overgone_its_supply_at_fn; + dbf_free_fn_t free_fn; +}; + +int dbf_get_worker_idx(void *); +// uint64_t dbf_get_max_relative_dl(void *); +uint64_t dbf_get_time_of_oversupply(void *); +void dbf_print(void *, uint64_t); +// void *dbf_grow(void *, uint64_t); +bool dbf_try_update_demand(void *, uint64_t, uint64_t, uint64_t, uint64_t, dbf_update_mode_t, void *, struct sandbox_metadata *sandbox_meta); +uint64_t dbf_get_demand_overgone_its_supply_at(void *, uint64_t, uint64_t, uint64_t); +void dbf_free(void *); + +void dbf_plug_functions(struct dbf_config *config); + +void *dbf_list_initialize(uint32_t, uint8_t, int, struct tenant *); +void *dbf_array_initialize(uint32_t, uint8_t, int, struct tenant *); +void *dbf_initialize(uint32_t num_of_workers, uint8_t reservation_percentile, int worker_idx, struct tenant *tenant); + + +bool +dbf_list_try_add_new_demand(void *dbf_raw, uint64_t start_time, uint64_t abs_deadline, uint64_t adjustment, struct sandbox_metadata *sm); + +void +dbf_list_force_add_extra_slack(void *dbf_raw, struct sandbox_metadata *sm, uint64_t adjustment); + +void +dbf_list_reduce_demand(struct sandbox_metadata *sm, uint64_t adjustment, bool delete_node); \ No newline at end of file diff --git a/runtime/include/global_request_scheduler.h b/runtime/include/global_request_scheduler.h index 437fccd37..71421c4c0 100644 --- a/runtime/include/global_request_scheduler.h +++ b/runtime/include/global_request_scheduler.h @@ -3,6 +3,7 @@ #include #include "sandbox_types.h" +#include "sandbox_functions.h" /* Returns pointer back if successful, null otherwise */ typedef struct sandbox *(*global_request_scheduler_add_fn_t)(struct sandbox *); @@ -18,8 +19,13 @@ struct global_request_scheduler_config { }; -void global_request_scheduler_initialize(struct global_request_scheduler_config *config); -struct sandbox *global_request_scheduler_add(struct sandbox *); -int global_request_scheduler_remove(struct sandbox **); -int global_request_scheduler_remove_if_earlier(struct sandbox **, uint64_t targed_deadline); -uint64_t global_request_scheduler_peek(void); +void global_request_scheduler_initialize(struct global_request_scheduler_config *config); +struct sandbox *global_request_scheduler_add(struct sandbox *); +int global_request_scheduler_remove(struct sandbox **); +int global_request_scheduler_remove_if_earlier(struct sandbox **, uint64_t targed_deadline); +uint64_t global_request_scheduler_peek(void); +void global_request_scheduler_update_highest_priority(const void *element); +struct sandbox_metadata global_request_scheduler_peek_metadata(); +// struct sandbox_metadata global_request_scheduler_peek_metadata_must_lock(const uint64_t now, struct sandbox *); +void global_default_update_highest_priority(const void *element); +struct sandbox_metadata global_default_peek_metadata(); diff --git a/runtime/include/global_request_scheduler_mtdbf.h b/runtime/include/global_request_scheduler_mtdbf.h new file mode 100644 index 000000000..4166b0725 --- /dev/null +++ b/runtime/include/global_request_scheduler_mtdbf.h @@ -0,0 +1,5 @@ +#pragma once + +#include "global_request_scheduler.h" + +void global_request_scheduler_mtdbf_initialize(); diff --git a/runtime/include/http.h b/runtime/include/http.h index 22af51375..f661e6ae1 100644 --- a/runtime/include/http.h +++ b/runtime/include/http.h @@ -36,6 +36,20 @@ "Connection: close\r\n" #define HTTP_RESPONSE_404_NOT_FOUND_LENGTH 59 +#define HTTP_RESPONSE_408_REQUEST_TIMEOUT \ + "HTTP/1.1 408 Request Timeout\r\n" \ + "Server: SLEdge\r\n" \ + "Connection: close\r\n" \ + "\r\n" +#define HTTP_RESPONSE_408_REQUEST_TIMEOUT_LENGTH 67 + +#define HTTP_RESPONSE_409_CONFLICT \ + "HTTP/1.1 409 Conflict\r\n" \ + "Server: SLEdge\r\n" \ + "Connection: close\r\n" \ + "\r\n" +#define HTTP_RESPONSE_409_CONFLICT_LENGTH 60 + #define HTTP_RESPONSE_413_PAYLOAD_TOO_LARGE \ "HTTP/1.1 413 Payload Too Large\r\n" \ "Server: SLEdge\r\n" \ @@ -70,6 +84,10 @@ http_header_build(int status_code) return HTTP_RESPONSE_400_BAD_REQUEST; case 404: return HTTP_RESPONSE_404_NOT_FOUND; + case 408: + return HTTP_RESPONSE_408_REQUEST_TIMEOUT; + case 409: + return HTTP_RESPONSE_409_CONFLICT; case 413: return HTTP_RESPONSE_413_PAYLOAD_TOO_LARGE; case 429: @@ -91,6 +109,10 @@ http_header_len(int status_code) return HTTP_RESPONSE_400_BAD_REQUEST_LENGTH; case 404: return HTTP_RESPONSE_404_NOT_FOUND_LENGTH; + case 408: + return HTTP_RESPONSE_408_REQUEST_TIMEOUT_LENGTH; + case 409: + return HTTP_RESPONSE_409_CONFLICT_LENGTH; case 413: return HTTP_RESPONSE_413_PAYLOAD_TOO_LARGE_LENGTH; case 429: diff --git a/runtime/include/http_router.h b/runtime/include/http_router.h index 2472e27b2..94a8d6119 100644 --- a/runtime/include/http_router.h +++ b/runtime/include/http_router.h @@ -49,10 +49,7 @@ http_router_add_route(http_router_t *router, struct route_config *config, struct #endif const uint64_t expected_execution = route.relative_deadline / 2; -#ifdef ADMISSIONS_CONTROL - /* Addmissions Control setup */ route.execution_histogram.estimated_execution = expected_execution; -#endif #ifdef EXECUTION_HISTOGRAM /* Execution Histogram setup */ diff --git a/runtime/include/listener_thread.h b/runtime/include/listener_thread.h index 31bd2c16e..cfa59ada3 100644 --- a/runtime/include/listener_thread.h +++ b/runtime/include/listener_thread.h @@ -5,10 +5,26 @@ #include "http_session.h" #include "module.h" +#include "ck_ring.h" +#include "sandbox_state.h" +#include "dbf.h" -#define LISTENER_THREAD_CORE_ID 1 +#define LISTENER_THREAD_CORE_ID 1 +#define LISTENER_THREAD_RING_SIZE 10240 /* the acutal size becomes 255 */ -extern pthread_t listener_thread_id; +struct comm_with_worker { + ck_ring_t worker_ring; + struct message worker_ring_buffer[LISTENER_THREAD_RING_SIZE]; + int worker_idx; +}; // __attribute__((aligned(CACHE_PAD))); ///// TODO: this necessary? + +CK_RING_PROTOTYPE(message, message) + +extern pthread_t listener_thread_id; +extern int listener_thread_epoll_file_descriptor; +extern struct comm_with_worker *comm_from_workers; +extern struct comm_with_worker *comm_from_workers_extra; +extern struct comm_with_worker *comm_to_workers; void listener_thread_initialize(void); noreturn void *listener_thread_main(void *dummy); @@ -23,3 +39,14 @@ listener_thread_is_running() { return pthread_self() == listener_thread_id; } + +static inline void +comm_with_workers_init(struct comm_with_worker *comm_with_workers) +{ + assert(comm_with_workers); + + for (int worker_idx = 0; worker_idx < runtime_worker_threads_count; worker_idx++) { + ck_ring_init(&comm_with_workers[worker_idx].worker_ring, LISTENER_THREAD_RING_SIZE); + comm_with_workers[worker_idx].worker_idx = worker_idx; + } +} diff --git a/runtime/include/local_runqueue.h b/runtime/include/local_runqueue.h index 432eea108..b7bfb7686 100644 --- a/runtime/include/local_runqueue.h +++ b/runtime/include/local_runqueue.h @@ -17,8 +17,10 @@ struct local_runqueue_config { local_runqueue_get_next_fn_t get_next_fn; }; -void local_runqueue_add(struct sandbox *); -void local_runqueue_delete(struct sandbox *); -bool local_runqueue_is_empty(); -struct sandbox *local_runqueue_get_next(); -void local_runqueue_initialize(struct local_runqueue_config *config); +void local_runqueue_add(struct sandbox *); +void local_runqueue_delete(struct sandbox *); +bool local_runqueue_is_empty(); +struct sandbox *local_runqueue_get_next(); +void local_runqueue_initialize(struct local_runqueue_config *config); +// void local_runqueue_update_highest_priority(const void *element); +// struct sandbox_metadata local_runqueue_peek_metadata(); diff --git a/runtime/include/local_runqueue_mtdbf.h b/runtime/include/local_runqueue_mtdbf.h new file mode 100644 index 000000000..c8eed1785 --- /dev/null +++ b/runtime/include/local_runqueue_mtdbf.h @@ -0,0 +1,7 @@ +#pragma once + +#include "module.h" + +void local_runqueue_mtdbf_initialize(); + +size_t queue_length(); diff --git a/runtime/include/message.h b/runtime/include/message.h new file mode 100644 index 000000000..8941e6792 --- /dev/null +++ b/runtime/include/message.h @@ -0,0 +1,33 @@ +#ifndef MESSAGE_H +#define MESSAGE_H + +#include "runtime.h" + +typedef enum +{ + MESSAGE_CFW_PULLED_NEW_SANDBOX, + MESSAGE_CFW_REDUCE_DEMAND, + MESSAGE_CFW_DELETE_SANDBOX, /* normal mode for deleting new sandbox demands */ + MESSAGE_CFW_EXTRA_DEMAND_REQUEST, + MESSAGE_CFW_WRITEBACK_PREEMPTION, + MESSAGE_CFW_WRITEBACK_OVERSHOOT, + + MESSAGE_CTW_SHED_CURRENT_JOB +} message_type_t; + +struct message { + uint64_t sandbox_id; + uint64_t adjustment; + uint64_t total_running_duration; + uint64_t remaining_exec; + uint64_t timestamp; + struct sandbox *sandbox; + struct sandbox_metadata *sandbox_meta; + message_type_t message_type; + int sender_worker_idx; + uint8_t state; + bool exceeded_estimation; +}; // PAGE_ALIGNED; + + +#endif /* MESSAGE_H */ diff --git a/runtime/include/module.h b/runtime/include/module.h index 390379d84..2fd4012fc 100644 --- a/runtime/include/module.h +++ b/runtime/include/module.h @@ -1,5 +1,10 @@ #pragma once +// #include +// #include +// #include +// #include + #include "current_wasm_module_instance.h" #include "pool.h" #include "sledge_abi_symbols.h" @@ -113,9 +118,11 @@ module_initialize_pools(struct module *module) { /* Create only a single pool for the preprocessing module, since it is executed only by the event core. */ const int n = module->type == APP_MODULE ? runtime_worker_threads_count : 1; - for (int i = 0; i < n; i++) { - wasm_memory_pool_init(&module->pools[i].memory, false); - wasm_stack_pool_init(&module->pools[i].stack, false); + for (int i = 0; i < 1; i++) { + // wasm_memory_pool_init(&module->pools[i].memory, false); + // wasm_stack_pool_init(&module->pools[i].stack, false); + wasm_memory_pool_init(&module->pools[i].memory, true); + wasm_stack_pool_init(&module->pools[i].stack, true); } } @@ -123,7 +130,7 @@ static inline void module_deinitialize_pools(struct module *module) { const int n = module->type == APP_MODULE ? runtime_worker_threads_count : 1; - for (int i = 0; i < n; i++) { + for (int i = 0; i < 1; i++) { wasm_memory_pool_deinit(&module->pools[i].memory); wasm_stack_pool_deinit(&module->pools[i].stack); } @@ -167,7 +174,8 @@ module_allocate_stack(struct module *module) { assert(module != NULL); - struct wasm_stack *stack = wasm_stack_pool_remove_nolock(&module->pools[worker_thread_idx].stack); + // struct wasm_stack *stack = wasm_stack_pool_remove_nolock(&module->pools[worker_thread_idx].stack); + struct wasm_stack *stack = wasm_stack_pool_remove(&module->pools[0].stack); if (stack == NULL) { stack = wasm_stack_alloc(module->stack_size); @@ -178,10 +186,17 @@ module_allocate_stack(struct module *module) } static inline void -module_free_stack(struct module *module, struct wasm_stack *stack) +module_free_stack(struct module *module, struct wasm_stack *stack, int orig_wrk_idx) { + assert(orig_wrk_idx >= 0); + // if (module->pools[worker_thread_idx].stack.size == RUNTIME_WORKER_POOL_SIZE) { + // assert(0); + // wasm_stack_free(stack); + // return; + // } wasm_stack_reinit(stack); - wasm_stack_pool_add_nolock(&module->pools[worker_thread_idx].stack, stack); + // wasm_stack_pool_add_nolock(&module->pools[worker_thread_idx].stack, stack); + wasm_stack_pool_add(&module->pools[0].stack, stack); } static inline struct wasm_memory * @@ -198,7 +213,8 @@ module_allocate_linear_memory(struct module *module) assert(starting_bytes <= (uint64_t)UINT32_MAX + 1); assert(max_bytes <= (uint64_t)UINT32_MAX + 1); - struct wasm_memory *linear_memory = wasm_memory_pool_remove_nolock(&module->pools[worker_thread_idx].memory); + // struct wasm_memory *linear_memory = wasm_memory_pool_remove_nolock(&module->pools[worker_thread_idx].memory); + struct wasm_memory *linear_memory = wasm_memory_pool_remove(&module->pools[0].memory); if (linear_memory == NULL) { linear_memory = wasm_memory_alloc(starting_bytes, max_bytes); if (unlikely(linear_memory == NULL)) return NULL; @@ -207,9 +223,26 @@ module_allocate_linear_memory(struct module *module) return linear_memory; } +thread_local static uint16_t max_size = 0; + static inline void -module_free_linear_memory(struct module *module, struct wasm_memory *memory) +module_free_linear_memory(struct module *module, struct wasm_memory *memory, int orig_wrk_idx) { + assert(orig_wrk_idx >= 0); + // if (module->pools[worker_thread_idx].memory.size == RUNTIME_WORKER_POOL_SIZE) { + // assert(0); + // wasm_memory_free(memory); + // return; + // } wasm_memory_reinit(memory, module->abi.starting_pages * WASM_PAGE_SIZE); - wasm_memory_pool_add_nolock(&module->pools[worker_thread_idx].memory, memory); + // wasm_memory_pool_add_nolock(&module->pools[worker_thread_idx].memory, memory); + wasm_memory_pool_add(&module->pools[0].memory, memory); + // if (17 < module->pools[0].memory.size) { + // // max_size = module->pools[0].memory.size; + // printf("Module %s - [Worker]=Sizes\n", module->path); + // for (int i=0; i< 1; i++) { + // printf("%u ", module->pools[i].memory.size); + // } + // printf("\n\n"); + // } } diff --git a/runtime/include/pool.h b/runtime/include/pool.h index 733664c55..61e788f51 100644 --- a/runtime/include/pool.h +++ b/runtime/include/pool.h @@ -12,6 +12,7 @@ bool use_lock; \ lock_t lock; \ struct ps_list_head list; \ + uint16_t size; \ }; \ \ static inline bool STRUCT_NAME##_pool_is_empty(struct STRUCT_NAME##_pool *self) \ @@ -26,6 +27,7 @@ ps_list_head_init(&self->list); \ self->use_lock = use_lock; \ if (use_lock) lock_init(&self->lock); \ + self->size = 0; \ } \ \ static inline void STRUCT_NAME##_pool_deinit(struct STRUCT_NAME##_pool *self) \ @@ -52,6 +54,8 @@ obj = ps_list_head_first_d(&self->list, struct STRUCT_NAME); \ assert(obj); \ ps_list_rem_d(obj); \ + assert(self->size > 0); \ + self->size--; \ \ return obj; \ } \ @@ -79,6 +83,8 @@ assert(!self->use_lock || lock_is_locked(&self->lock)); \ \ ps_list_head_add_d(&self->list, obj); \ + self->size++; \ + /*assert(self->size <= RUNTIME_WORKER_POOL_SIZE); */ \ } \ \ static inline void STRUCT_NAME##_pool_add(struct STRUCT_NAME##_pool *self, struct STRUCT_NAME *obj) \ diff --git a/runtime/include/priority_queue.h b/runtime/include/priority_queue.h index 7b1650ccb..f1974ea1f 100644 --- a/runtime/include/priority_queue.h +++ b/runtime/include/priority_queue.h @@ -18,16 +18,20 @@ * @returns priority (a uint64_t) */ typedef uint64_t (*priority_queue_get_priority_fn_t)(void *element); +typedef void (*priority_queue_update_priority_fn_t)(const void *element); +typedef void (*priority_queue_update_idx_fn_t)(void *element, size_t idx); /* We assume that priority is expressed in terms of a 64 bit unsigned integral */ struct priority_queue { - priority_queue_get_priority_fn_t get_priority_fn; - bool use_lock; - lock_t lock; - uint64_t highest_priority; - size_t size; - size_t capacity; - void *items[]; + priority_queue_get_priority_fn_t get_priority_fn; + priority_queue_update_priority_fn_t update_priority_fn; + priority_queue_update_idx_fn_t update_idx_fn; + bool use_lock; + lock_t lock; + uint64_t highest_priority; + size_t size; + size_t capacity; + void *items[]; }; /** @@ -47,6 +51,11 @@ static inline void priority_queue_update_highest_priority(struct priority_queue *priority_queue, const uint64_t priority) { priority_queue->highest_priority = priority; + + if (priority_queue->update_priority_fn) { + // priority_queue->update_priority_fn((priority_queue->size > 0) ? priority_queue->items[1] : NULL); + priority_queue->update_priority_fn(priority_queue->items[1]); + } } /** @@ -60,6 +69,7 @@ priority_queue_append(struct priority_queue *priority_queue, void *new_item) { assert(priority_queue != NULL); assert(new_item != NULL); + // assert(priority_queue->update_idx_fn != NULL); assert(!priority_queue->use_lock || lock_is_locked(&priority_queue->lock)); int rc; @@ -67,6 +77,9 @@ priority_queue_append(struct priority_queue *priority_queue, void *new_item) if (unlikely(priority_queue->size > priority_queue->capacity)) panic("PQ overflow"); if (unlikely(priority_queue->size == priority_queue->capacity)) goto err_enospc; priority_queue->items[++priority_queue->size] = new_item; + if (priority_queue->update_idx_fn) { + priority_queue->update_idx_fn(priority_queue->items[priority_queue->size], priority_queue->size); + } rc = 0; done: @@ -116,6 +129,10 @@ priority_queue_percolate_up(struct priority_queue *priority_queue) void *temp = priority_queue->items[i / 2]; priority_queue->items[i / 2] = priority_queue->items[i]; priority_queue->items[i] = temp; + if (priority_queue->update_idx_fn) { + priority_queue->update_idx_fn(priority_queue->items[i], i); + priority_queue->update_idx_fn(priority_queue->items[i / 2], i / 2); + } /* If percolated to highest priority, update highest priority */ if (i / 2 == 1) priority_queue_update_highest_priority(priority_queue, priority_queue->get_priority_fn( @@ -168,7 +185,7 @@ priority_queue_percolate_down(struct priority_queue *priority_queue, int parent_ assert(priority_queue != NULL); assert(priority_queue->get_priority_fn != NULL); assert(!priority_queue->use_lock || lock_is_locked(&priority_queue->lock)); - assert(!listener_thread_is_running()); + // assert(!listener_thread_is_running()); bool update_highest_value = parent_index == 1; @@ -183,6 +200,11 @@ priority_queue_percolate_down(struct priority_queue *priority_queue, int parent_ void *temp = priority_queue->items[smallest_child_index]; priority_queue->items[smallest_child_index] = priority_queue->items[parent_index]; priority_queue->items[parent_index] = temp; + if (priority_queue->update_idx_fn) { + priority_queue->update_idx_fn(priority_queue->items[smallest_child_index], + smallest_child_index); + priority_queue->update_idx_fn(priority_queue->items[parent_index], parent_index); + } parent_index = smallest_child_index; left_child_index = 2 * parent_index; @@ -216,8 +238,8 @@ priority_queue_dequeue_if_earlier_nolock(struct priority_queue *priority_queue, assert(priority_queue != NULL); assert(dequeued_element != NULL); assert(priority_queue->get_priority_fn != NULL); - assert(!listener_thread_is_running()); assert(!priority_queue->use_lock || lock_is_locked(&priority_queue->lock)); + // assert(!listener_thread_is_running()); int return_code; @@ -225,9 +247,13 @@ priority_queue_dequeue_if_earlier_nolock(struct priority_queue *priority_queue, if (priority_queue_is_empty(priority_queue) || priority_queue->highest_priority >= target_deadline) goto err_enoent; - *dequeued_element = priority_queue->items[1]; + *dequeued_element = priority_queue->items[1]; + if (priority_queue->update_idx_fn) { priority_queue->update_idx_fn(*dequeued_element, 0); } priority_queue->items[1] = priority_queue->items[priority_queue->size]; priority_queue->items[priority_queue->size--] = NULL; + if (priority_queue->update_idx_fn && priority_queue->items[1]) { + priority_queue->update_idx_fn(priority_queue->items[1], 1); + } priority_queue_percolate_down(priority_queue, 1); return_code = 0; @@ -287,6 +313,29 @@ priority_queue_initialize(size_t capacity, bool use_lock, priority_queue_get_pri return priority_queue; } +/** + * Initializes some additional properties of Priority Queue Data structure. TODO: Unite with above + * @param capacity the number of elements to store in the data structure + * @param use_lock indicates that we want a concurrent data structure + * @param get_priority_fn pointer to a function that returns the priority of an element + * @return priority queue + */ +static inline struct priority_queue * +priority_queue_initialize_new(size_t capacity, bool use_lock, priority_queue_get_priority_fn_t get_priority_fn, + priority_queue_update_priority_fn_t update_priority_fn, + priority_queue_update_idx_fn_t update_idx_fn) +{ + assert(update_idx_fn != NULL); + + struct priority_queue *priority_queue = priority_queue_initialize(capacity, use_lock, get_priority_fn); + + priority_queue->update_priority_fn = update_priority_fn; + priority_queue->update_idx_fn = update_idx_fn; + if (update_priority_fn) priority_queue->update_priority_fn(NULL); + + return priority_queue; +} + /** * Double capacity of priority queue * Note: currently there is no equivalent call for PQs that are not thread-local and need to be locked because it is @@ -412,6 +461,10 @@ priority_queue_delete_nolock(struct priority_queue *priority_queue, void *value) if (priority_queue->items[i] == value) { priority_queue->items[i] = priority_queue->items[priority_queue->size]; priority_queue->items[priority_queue->size--] = NULL; + if (priority_queue->update_idx_fn) { + priority_queue->update_idx_fn(value, 0); + priority_queue->update_idx_fn(priority_queue->items[i], i); + } priority_queue_percolate_down(priority_queue, i); return 0; } @@ -438,6 +491,52 @@ priority_queue_delete(struct priority_queue *priority_queue, void *value) return rc; } +/** + * @param priority_queue - the priority queue we want to delete from + * @param idx - the index of the value we want to delete + */ +static inline void +priority_queue_delete_by_idx_nolock(struct priority_queue *priority_queue, const void *value_to_remove, + const size_t idx) +{ + assert(priority_queue != NULL); + assert(idx <= priority_queue->size); + assert(idx >= 1); + assert(priority_queue->update_idx_fn); + if (scheduler != SCHEDULER_MTDS && scheduler != SCHEDULER_MTDBF) assert(!listener_thread_is_running()); + assert(!priority_queue->use_lock || lock_is_locked(&priority_queue->lock)); + + void *r = priority_queue->items[idx]; + assert(r == value_to_remove); + priority_queue->update_idx_fn(r, 0); + + if (idx == priority_queue->size) { + // priority_queue->size--; + priority_queue->items[priority_queue->size--] = NULL; + priority_queue_percolate_down(priority_queue, idx); + return; + } + + priority_queue->items[idx] = priority_queue->items[priority_queue->size]; + priority_queue->items[priority_queue->size--] = NULL; + priority_queue->update_idx_fn(priority_queue->items[idx], idx); + priority_queue_percolate_down(priority_queue, idx); +} + +/** + * @param priority_queue - the priority queue we want to delete from + * @param idx - the index of the value we want to delete + * @returns 0 on success. -1 on not found + */ +static inline void +priority_queue_delete_by_idx(struct priority_queue *priority_queue, const void *value_to_remove, const size_t idx) +{ + lock_node_t node = {}; + lock_lock(&priority_queue->lock, &node); + priority_queue_delete_by_idx_nolock(priority_queue, value_to_remove, idx); + lock_unlock(&priority_queue->lock, &node); +} + /** * @param priority_queue - the priority queue we want to add to * @param dequeued_element a pointer to set to the dequeued element diff --git a/runtime/include/ps_list.h b/runtime/include/ps_list.h index fb2ec30ff..2d63849d7 100644 --- a/runtime/include/ps_list.h +++ b/runtime/include/ps_list.h @@ -183,7 +183,13 @@ ps_list_ll_rem(struct ps_list *l) for (iter = ps_list_head_first((head), __typeof__(*iter), lname); !ps_list_is_head((head), iter, lname); \ (iter) = ps_list_next(iter, lname)) +/* Reverse iteration without mutating the list */ +#define ps_list_foreach_rev(head, iter, lname) \ + for (iter = ps_list_head_last((head), __typeof__(*iter), lname); !ps_list_is_head((head), iter, lname); \ + (iter) = ps_list_prev(iter, lname)) + #define ps_list_foreach_d(head, iter) ps_list_foreach(head, iter, PS_LIST_DEF_NAME) +#define ps_list_foreach_rev_d(head, iter) ps_list_foreach_rev(head, iter, PS_LIST_DEF_NAME) /* * Iteration where the current node can be ps_list_rem'ed. diff --git a/runtime/include/route.h b/runtime/include/route.h index e7812cb5b..4d8d47ca0 100644 --- a/runtime/include/route.h +++ b/runtime/include/route.h @@ -4,6 +4,9 @@ #include #include "execution_histogram.h" +// #include "admissions_info.h" +// #include "estimated_exec_info.h" +// #include "module.h" #include "http_route_total.h" #include "module.h" #include "perf_window.h" diff --git a/runtime/include/route_config.h b/runtime/include/route_config.h index e2fd2a4b7..72a18ad69 100644 --- a/runtime/include/route_config.h +++ b/runtime/include/route_config.h @@ -5,6 +5,7 @@ #include #include "admissions_control.h" +#include "traffic_control.h" #include "runtime.h" #include "scheduler_options.h" @@ -95,7 +96,7 @@ route_config_validate(struct route_config *config, bool *did_set) return -1; } - if (config->relative_deadline_us > (uint32_t)RUNTIME_RELATIVE_DEADLINE_US_MAX) { + if (config->relative_deadline_us == 0 || config->relative_deadline_us > (uint32_t)RUNTIME_RELATIVE_DEADLINE_US_MAX) { fprintf(stderr, "Relative-deadline-us must be between 0 and %u, was %u\n", (uint32_t)RUNTIME_RELATIVE_DEADLINE_US_MAX, config->relative_deadline_us); return -1; diff --git a/runtime/include/runtime.h b/runtime/include/runtime.h index c467bf152..5a02fbcbf 100644 --- a/runtime/include/runtime.h +++ b/runtime/include/runtime.h @@ -24,10 +24,14 @@ #define RUNTIME_LOG_FILE "sledge.log" #define RUNTIME_MAX_EPOLL_EVENTS 128 -#define RUNTIME_MAX_TENANT_COUNT 32 +#define RUNTIME_MAX_TENANT_COUNT 320 #define RUNTIME_RELATIVE_DEADLINE_US_MAX 3600000000 /* One Hour. Fits in uint32_t */ -#define RUNTIME_RUNQUEUE_SIZE 256 /* Minimum guaranteed size. Might grow! */ +#define RUNTIME_RUNQUEUE_SIZE 2560 /* Minimum guaranteed size. Might grow! */ #define RUNTIME_TENANT_QUEUE_SIZE 4096 +#define RUNTIME_WORKER_POOL_SIZE 8 /* Set to zero if no pooling desired */ + +#define RUNTIME_MAX_CPU_UTIL_PERCENTILE 100 +#define RUNTIME_MAX_ALIVE_SANDBOXES 1048576 // 1 << 20 enum RUNTIME_SIGALRM_HANDLER { @@ -40,16 +44,22 @@ extern bool runtime_preemption_enabled; extern bool runtime_worker_spinloop_pause_enabled; extern uint32_t runtime_processor_speed_MHz; extern uint32_t runtime_quantum_us; +extern uint64_t runtime_quantum; extern enum RUNTIME_SIGALRM_HANDLER runtime_sigalrm_handler; extern pthread_t *runtime_worker_threads; extern uint32_t runtime_worker_threads_count; extern int *runtime_worker_threads_argument; extern uint64_t *runtime_worker_threads_deadline; extern uint64_t runtime_boot_timestamp; +extern uint64_t runtime_max_deadline; +extern bool sandbox_refs[]; +extern uint16_t extra_execution_slack_p; extern void runtime_initialize(void); extern void runtime_set_pthread_prio(pthread_t thread, unsigned int nice); extern void runtime_set_resource_limits_to_max(void); +extern void runtime_cleanup(); +void runtime_set_policy_and_prio(); /* External Symbols */ extern int expand_memory(void); @@ -67,3 +77,15 @@ runtime_print_sigalrm_handler(enum RUNTIME_SIGALRM_HANDLER variant) return "TRIAGED"; } } + +static const bool USING_WORK_CONSERVATION = true; + +static const bool USING_LOCAL_RUNQUEUE = false; +static const bool USING_TRY_LOCAL_EXTRA = true; + +static const bool USING_WRITEBACK_FOR_PREEMPTION = !USING_LOCAL_RUNQUEUE; +static const bool USING_WRITEBACK_FOR_OVERSHOOT = false; + +static const bool USING_AGGREGATED_GLOBAL_DBF = USING_LOCAL_RUNQUEUE || false; + +static const bool USING_EARLIEST_START_FIRST = false; diff --git a/runtime/include/sandbox_functions.h b/runtime/include/sandbox_functions.h index 0f28516d2..c38b31508 100644 --- a/runtime/include/sandbox_functions.h +++ b/runtime/include/sandbox_functions.h @@ -12,12 +12,14 @@ * Public API * **************************/ -struct sandbox *sandbox_alloc(struct module *module, struct http_session *session, struct route *route, - struct tenant *tenant, uint64_t admissions_estimate); -int sandbox_prepare_execution_environment(struct sandbox *sandbox); -void sandbox_free(struct sandbox *sandbox); -void sandbox_main(struct sandbox *sandbox); -void sandbox_switch_to(struct sandbox *next_sandbox); +struct sandbox *sandbox_alloc(struct module *module, struct http_session *session, uint64_t admissions_estimate, + uint64_t sandbox_alloc_timestamp); +struct sandbox_metadata *sandbox_meta_alloc(struct sandbox *sandbox); +int sandbox_prepare_execution_environment(struct sandbox *sandbox); +void sandbox_free(struct sandbox *sandbox); +void sandbox_main(struct sandbox *sandbox); +void sandbox_switch_to(struct sandbox *next_sandbox); +void sandbox_process_scheduler_updates(struct sandbox *sandbox); /** * Free Linear Memory, leaving stack in place @@ -28,7 +30,9 @@ sandbox_free_linear_memory(struct sandbox *sandbox) { assert(sandbox != NULL); assert(sandbox->memory != NULL); - module_free_linear_memory(sandbox->module, (struct wasm_memory *)sandbox->memory); + // if (worker_thread_idx != sandbox->original_owner_worker_idx) + // printf("Me: %d, Orig: %d, Tenant: %s\n", worker_thread_idx, sandbox->original_owner_worker_idx, sandbox->tenant->name); + module_free_linear_memory(sandbox->module, (struct wasm_memory *)sandbox->memory, sandbox->original_owner_worker_idx); sandbox->memory = NULL; } @@ -48,13 +52,29 @@ static inline uint64_t sandbox_get_priority(void *element) { struct sandbox *sandbox = (struct sandbox *)element; + if (scheduler == SCHEDULER_SJF) return sandbox->remaining_exec; return sandbox->absolute_deadline; } +static inline uint64_t +sandbox_get_priority_global(void *element) +{ + struct sandbox *sandbox = (struct sandbox *)element; + return sandbox->absolute_deadline - sandbox->remaining_exec; +} + +static inline void +sandbox_update_pq_idx_in_runqueue(void *element, size_t idx) +{ + assert(element); + struct sandbox *sandbox = (struct sandbox *)element; + sandbox->pq_idx_in_runqueue = idx; +} + static inline void -sandbox_process_scheduler_updates(struct sandbox *sandbox) +local_sandbox_meta_update_pq_idx_in_tenant_queue(void *element, size_t idx) { - if (tenant_is_paid(sandbox->tenant)) { - atomic_fetch_sub(&sandbox->tenant->remaining_budget, sandbox->last_state_duration); - } + assert(element); + struct sandbox_metadata *sandbox_meta = (struct sandbox_metadata *)element; + sandbox_meta->pq_idx_in_tenant_queue = idx; } diff --git a/runtime/include/sandbox_perf_log.h b/runtime/include/sandbox_perf_log.h index 0610f2d3d..1b89e4685 100644 --- a/runtime/include/sandbox_perf_log.h +++ b/runtime/include/sandbox_perf_log.h @@ -13,9 +13,25 @@ static inline void sandbox_perf_log_print_header() { if (sandbox_perf_log == NULL) { perror("sandbox perf log"); } - fprintf(sandbox_perf_log, "id,tenant,route,state,deadline,actual,queued,uninitialized,allocated,initialized," - "runnable,interrupted,preempted," - "running_sys,running_user,asleep,returned,complete,error,proc_MHz,payload_size\n"); + fprintf(sandbox_perf_log, + "id,tenant,route,state,deadline,actual,queued,uninitialized,allocated,initialized," + "runnable,interrupted,preempted," + "running_sys,running_user,asleep,returned,complete,error,proc_MHz,response_code,guarantee_type,payload_size\n"); +} + +/** + * Prints key performance metrics for a denied request (by AC) to perf_log + * This is defined by an environment variable + * @param module + */ +static inline void +sandbox_perf_log_print_denied_entry(struct tenant *tenant, struct route *route, uint16_t response_code) +{ + /* If the log was not defined by an environment variable, early out */ + if (sandbox_perf_log == NULL) return; + + fprintf(sandbox_perf_log, "-1,%s,%s,Deny,%lu,0,0,0,0,0,0,0,0,0,0,0,0,0,0,%u,%u,0,0\n", tenant->name, route->route, + route->relative_deadline, runtime_processor_speed_MHz, response_code); } /** @@ -29,16 +45,15 @@ sandbox_perf_log_print_entry(struct sandbox *sandbox) /* If the log was not defined by an environment variable, early out */ if (sandbox_perf_log == NULL) return; - uint64_t queued_duration = sandbox->timestamp_of.dispatched - sandbox->timestamp_of.allocation; + uint64_t queued_duration = sandbox->timestamp_of.dispatched - sandbox->timestamp_of.allocation; // TODO: Consider writeback /* * Assumption: A sandbox is never able to free pages. If linear memory management * becomes more intelligent, then peak linear memory size needs to be tracked * seperately from current linear memory size. */ - fprintf(sandbox_perf_log, - "%lu,%s,%s,%s,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%u,%u,%d,%d\n", sandbox->id, - sandbox->tenant->name, sandbox->route->route, sandbox_state_stringify(sandbox->state), + fprintf(sandbox_perf_log, "%lu,%s,%s,%s,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%lu,%u,%u,%d,%d\n", + sandbox->id, sandbox->tenant->name, sandbox->route->route, sandbox_state_stringify(sandbox->state), sandbox->route->relative_deadline, sandbox->total_time, queued_duration, sandbox->duration_of_state[SANDBOX_UNINITIALIZED], sandbox->duration_of_state[SANDBOX_ALLOCATED], sandbox->duration_of_state[SANDBOX_INITIALIZED], sandbox->duration_of_state[SANDBOX_RUNNABLE], @@ -46,7 +61,7 @@ sandbox_perf_log_print_entry(struct sandbox *sandbox) sandbox->duration_of_state[SANDBOX_RUNNING_SYS], sandbox->duration_of_state[SANDBOX_RUNNING_USER], sandbox->duration_of_state[SANDBOX_ASLEEP], sandbox->duration_of_state[SANDBOX_RETURNED], sandbox->duration_of_state[SANDBOX_COMPLETE], sandbox->duration_of_state[SANDBOX_ERROR], - runtime_processor_speed_MHz, sandbox->response_code, 0, sandbox->payload_size); + runtime_processor_speed_MHz, sandbox->response_code, sandbox->global_queue_type, sandbox->payload_size); } static inline void diff --git a/runtime/include/sandbox_set_as_allocated.h b/runtime/include/sandbox_set_as_allocated.h index 89a5fe72f..8a8973281 100644 --- a/runtime/include/sandbox_set_as_allocated.h +++ b/runtime/include/sandbox_set_as_allocated.h @@ -20,11 +20,12 @@ sandbox_set_as_allocated(struct sandbox *sandbox) { assert(sandbox); assert(sandbox->state == SANDBOX_UNINITIALIZED); + sandbox->state = SANDBOX_ALLOCATED; uint64_t now = __getcycles(); /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); - sandbox->timestamp_of.allocation = now; + // sandbox->timestamp_of.allocation = now; sandbox->timestamp_of.last_state_change = now; sandbox_state_history_init(&sandbox->state_history); sandbox_state_history_append(&sandbox->state_history, SANDBOX_ALLOCATED); diff --git a/runtime/include/sandbox_set_as_complete.h b/runtime/include/sandbox_set_as_complete.h index 2c2c68436..84647c0af 100644 --- a/runtime/include/sandbox_set_as_complete.h +++ b/runtime/include/sandbox_set_as_complete.h @@ -29,15 +29,12 @@ sandbox_set_as_complete(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_RETURNED: { - sandbox->timestamp_of.completion = now; + case SANDBOX_RETURNED: break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Error\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); @@ -48,13 +45,11 @@ sandbox_set_as_complete(struct sandbox *sandbox, sandbox_state_t last_state) sandbox_state_totals_increment(SANDBOX_COMPLETE); sandbox_state_totals_decrement(last_state); - struct route *route = sandbox->route; - #ifdef EXECUTION_HISTOGRAM /* Execution Histogram Post Processing */ const uint64_t execution_duration = sandbox->duration_of_state[SANDBOX_RUNNING_USER] + sandbox->duration_of_state[SANDBOX_RUNNING_SYS]; - execution_histogram_update(&route->execution_histogram, execution_duration); + execution_histogram_update(&sandbox->route->execution_histogram, execution_duration); #endif #ifdef ADMISSIONS_CONTROL @@ -65,7 +60,7 @@ sandbox_set_as_complete(struct sandbox *sandbox, sandbox_state_t last_state) /* Terminal State Logging for Sandbox */ sandbox_perf_log_print_entry(sandbox); sandbox_summarize_page_allocations(sandbox); - route_latency_add(&route->latency, sandbox->total_time); + route_latency_add(&sandbox->route->latency, sandbox->total_time); /* State Change Hooks */ sandbox_state_transition_from_hook(sandbox, last_state); diff --git a/runtime/include/sandbox_set_as_error.h b/runtime/include/sandbox_set_as_error.h index 68a13b79a..eb29d2907 100644 --- a/runtime/include/sandbox_set_as_error.h +++ b/runtime/include/sandbox_set_as_error.h @@ -33,40 +33,54 @@ sandbox_set_as_error(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_ALLOCATED: + case SANDBOX_INITIALIZED: + assert(sandbox->memory == NULL); break; - case SANDBOX_RUNNING_SYS: { - local_runqueue_delete(sandbox); - sandbox_free_linear_memory(sandbox); + case SANDBOX_PREEMPTED: + /* Global work-shedding scenario, where we kill a job right after pullling from global queue */ + if (USING_LOCAL_RUNQUEUE) { + local_runqueue_delete(sandbox); + } else { + assert(sandbox->owned_worker_idx == -2); + assert(sandbox->pq_idx_in_runqueue == 0); + } + + // sandbox_free_linear_memory(sandbox); break; - } - default: { + case SANDBOX_RUNNABLE: /* When using local queues */ + case SANDBOX_RUNNING_SYS: + case SANDBOX_INTERRUPTED: + assert(sandbox->owned_worker_idx >= 0); + assert(sandbox->pq_idx_in_runqueue >= 1); + local_runqueue_delete(sandbox); + // sandbox_free_linear_memory(sandbox); + break; + default: panic("Sandbox %lu | Illegal transition from %s to Error\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); sandbox->last_state_duration = now - sandbox->timestamp_of.last_state_change; - if (last_state == SANDBOX_RUNNING_SYS) { - sandbox->remaining_exec = (sandbox->remaining_exec > sandbox->last_state_duration) - ? sandbox->remaining_exec - sandbox->last_state_duration - : 0; - } + if(last_state == SANDBOX_RUNNING_SYS) sandbox->last_running_state_duration += sandbox->last_state_duration; sandbox->duration_of_state[last_state] += sandbox->last_state_duration; sandbox->timestamp_of.last_state_change = now; sandbox_state_history_append(&sandbox->state_history, SANDBOX_ERROR); sandbox_state_totals_increment(SANDBOX_ERROR); sandbox_state_totals_decrement(last_state); + sandbox->timestamp_of.completion = now; + sandbox->total_time = sandbox->timestamp_of.completion - sandbox->timestamp_of.allocation; + #ifdef ADMISSIONS_CONTROL /* Admissions Control Post Processing */ admissions_control_subtract(sandbox->admissions_estimate); #endif /* Return HTTP session to listener core to be written back to client */ - http_session_set_response_header(sandbox->http, 500); + const int http_status_code = (sandbox->response_code > 0) ? sandbox->response_code / 10 : 500; + http_session_set_response_header(sandbox->http, http_status_code); sandbox->http->state = HTTP_SESSION_EXECUTION_COMPLETE; http_session_send_response(sandbox->http, (void_star_cb)listener_thread_register_http_session); sandbox->http = NULL; @@ -85,8 +99,8 @@ sandbox_set_as_error(struct sandbox *sandbox, sandbox_state_t last_state) static inline void sandbox_exit_error(struct sandbox *sandbox) { - assert(sandbox->state == SANDBOX_RUNNING_SYS); - sandbox_set_as_error(sandbox, SANDBOX_RUNNING_SYS); + // assert(sandbox->state == SANDBOX_RUNNING_SYS); + sandbox_set_as_error(sandbox, sandbox->state); sandbox_process_scheduler_updates(sandbox); } diff --git a/runtime/include/sandbox_set_as_initialized.h b/runtime/include/sandbox_set_as_initialized.h index 9ff7771a1..704fe2b0f 100644 --- a/runtime/include/sandbox_set_as_initialized.h +++ b/runtime/include/sandbox_set_as_initialized.h @@ -24,14 +24,12 @@ sandbox_set_as_initialized(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_ALLOCATED: { + case SANDBOX_ALLOCATED: break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Preempted\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); diff --git a/runtime/include/sandbox_set_as_interrupted.h b/runtime/include/sandbox_set_as_interrupted.h index b49f51c25..6579c61ba 100644 --- a/runtime/include/sandbox_set_as_interrupted.h +++ b/runtime/include/sandbox_set_as_interrupted.h @@ -15,6 +15,7 @@ static inline void sandbox_set_as_interrupted(struct sandbox *sandbox, sandbox_state_t last_state) { assert(sandbox); + assert(last_state == SANDBOX_RUNNING_USER); /* WARNING: All code before this assignment is preemptable */ sandbox->state = SANDBOX_INTERRUPTED; @@ -25,10 +26,7 @@ sandbox_set_as_interrupted(struct sandbox *sandbox, sandbox_state_t last_state) /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); sandbox->last_state_duration = now - sandbox->timestamp_of.last_state_change; - assert(last_state == SANDBOX_RUNNING_USER); - sandbox->remaining_exec = (sandbox->remaining_exec > sandbox->last_state_duration) - ? sandbox->remaining_exec - sandbox->last_state_duration - : 0; + sandbox->last_running_state_duration += sandbox->last_state_duration; sandbox->duration_of_state[last_state] += sandbox->last_state_duration; sandbox->timestamp_of.last_state_change = now; /* We do not append SANDBOX_INTERRUPTED to the sandbox_state_history because it would quickly fill the buffer */ @@ -44,8 +42,6 @@ static inline void sandbox_interrupt(struct sandbox *sandbox) { sandbox_set_as_interrupted(sandbox, sandbox->state); - - sandbox_process_scheduler_updates(sandbox); } @@ -69,9 +65,9 @@ sandbox_interrupt_return(struct sandbox *sandbox, sandbox_state_t interrupted_st sandbox_state_totals_increment(interrupted_state); sandbox_state_totals_decrement(SANDBOX_INTERRUPTED); - if (sandbox->absolute_deadline < now) { - // printf("Interrupted Sandbox missed deadline already!\n"); - } + // if (sandbox->absolute_deadline < now) { + // printf("Interrupted sandbox #%lu of %s missed deadline in worker #%d!\n", sandbox->id, sandbox->tenant->name, worker_thread_idx); + // } barrier(); /* WARNING: Code after this assignment may be preemptable */ diff --git a/runtime/include/sandbox_set_as_preempted.h b/runtime/include/sandbox_set_as_preempted.h index 3d30c93f1..d87069fd2 100644 --- a/runtime/include/sandbox_set_as_preempted.h +++ b/runtime/include/sandbox_set_as_preempted.h @@ -27,14 +27,12 @@ sandbox_set_as_preempted(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_INTERRUPTED: { + case SANDBOX_INTERRUPTED: break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Preempted\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); @@ -55,4 +53,6 @@ sandbox_preempt(struct sandbox *sandbox) { assert(sandbox->state == SANDBOX_INTERRUPTED); sandbox_set_as_preempted(sandbox, SANDBOX_INTERRUPTED); + + // sandbox_process_scheduler_updates(sandbox); } diff --git a/runtime/include/sandbox_set_as_returned.h b/runtime/include/sandbox_set_as_returned.h index 239322ce8..0bf3694c9 100644 --- a/runtime/include/sandbox_set_as_returned.h +++ b/runtime/include/sandbox_set_as_returned.h @@ -31,29 +31,28 @@ sandbox_set_as_returned(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_RUNNING_SYS: { + case SANDBOX_RUNNING_SYS: local_runqueue_delete(sandbox); - sandbox_free_linear_memory(sandbox); + // sandbox_free_linear_memory(sandbox); break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Returned\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); sandbox->last_state_duration = now - sandbox->timestamp_of.last_state_change; - sandbox->remaining_exec = (sandbox->remaining_exec > sandbox->last_state_duration) - ? sandbox->remaining_exec - sandbox->last_state_duration - : 0; + sandbox->last_running_state_duration += sandbox->last_state_duration; sandbox->duration_of_state[last_state] += sandbox->last_state_duration; sandbox->timestamp_of.last_state_change = now; sandbox_state_history_append(&sandbox->state_history, SANDBOX_RETURNED); sandbox_state_totals_increment(SANDBOX_RETURNED); sandbox_state_totals_decrement(last_state); + sandbox->timestamp_of.completion = now; + sandbox->total_time = sandbox->timestamp_of.completion - sandbox->timestamp_of.allocation; + http_session_set_response_header(sandbox->http, 200); sandbox->http->state = HTTP_SESSION_EXECUTION_COMPLETE; http_session_send_response(sandbox->http, (void_star_cb)listener_thread_register_http_session); diff --git a/runtime/include/sandbox_set_as_runnable.h b/runtime/include/sandbox_set_as_runnable.h index 6b404d53d..b780a52a9 100644 --- a/runtime/include/sandbox_set_as_runnable.h +++ b/runtime/include/sandbox_set_as_runnable.h @@ -29,20 +29,20 @@ sandbox_set_as_runnable(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_INITIALIZED: { - sandbox->timestamp_of.dispatched = now; + case SANDBOX_INITIALIZED: + if(sandbox->timestamp_of.dispatched == 0) sandbox->timestamp_of.dispatched = now; local_runqueue_add(sandbox); + // sandbox->owned_worker_idx = worker_thread_idx; + assert(sandbox->original_owner_worker_idx == -2); + sandbox->original_owner_worker_idx = worker_thread_idx; break; - } - case SANDBOX_ASLEEP: { + case SANDBOX_ASLEEP: local_runqueue_add(sandbox); break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Runnable\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); @@ -63,5 +63,7 @@ static inline void sandbox_wakeup(struct sandbox *sandbox) { assert(sandbox->state == SANDBOX_ASLEEP); + assert(0); // Now sandbox should not sleep + sandbox_set_as_runnable(sandbox, SANDBOX_ASLEEP); } diff --git a/runtime/include/sandbox_set_as_running_sys.h b/runtime/include/sandbox_set_as_running_sys.h index 556b11a49..ef43d2115 100644 --- a/runtime/include/sandbox_set_as_running_sys.h +++ b/runtime/include/sandbox_set_as_running_sys.h @@ -23,29 +23,22 @@ sandbox_set_as_running_sys(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_RUNNING_USER: { + case SANDBOX_RUNNING_USER: assert(sandbox == current_sandbox_get()); assert(runtime_worker_threads_deadline[worker_thread_idx] == sandbox->absolute_deadline); break; - } - case SANDBOX_RUNNABLE: { + case SANDBOX_RUNNABLE: assert(sandbox); break; - } - default: { + default: panic("Sandbox %lu | Illegal transition from %s to Running Sys\n", sandbox->id, sandbox_state_stringify(last_state)); } - } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); sandbox->last_state_duration = now - sandbox->timestamp_of.last_state_change; - if (last_state == SANDBOX_RUNNING_USER) { - sandbox->remaining_exec = (sandbox->remaining_exec > sandbox->last_state_duration) - ? sandbox->remaining_exec - sandbox->last_state_duration - : 0; - } + if(last_state == SANDBOX_RUNNING_USER) sandbox->last_running_state_duration += sandbox->last_state_duration; sandbox->duration_of_state[last_state] += sandbox->last_state_duration; sandbox->timestamp_of.last_state_change = now; sandbox_state_history_append(&sandbox->state_history, SANDBOX_RUNNING_SYS); @@ -64,6 +57,4 @@ sandbox_syscall(struct sandbox *sandbox) assert(sandbox->state == SANDBOX_RUNNING_USER); sandbox_set_as_running_sys(sandbox, SANDBOX_RUNNING_USER); - - sandbox_process_scheduler_updates(sandbox); } diff --git a/runtime/include/sandbox_set_as_running_user.h b/runtime/include/sandbox_set_as_running_user.h index 801968d4b..5068afac7 100644 --- a/runtime/include/sandbox_set_as_running_user.h +++ b/runtime/include/sandbox_set_as_running_user.h @@ -19,29 +19,25 @@ sandbox_set_as_running_user(struct sandbox *sandbox, sandbox_state_t last_state) uint64_t now = __getcycles(); switch (last_state) { - case SANDBOX_RUNNING_SYS: { + case SANDBOX_RUNNING_SYS: assert(sandbox == current_sandbox_get()); assert(runtime_worker_threads_deadline[worker_thread_idx] == sandbox->absolute_deadline); break; - } - case SANDBOX_PREEMPTED: { + + case SANDBOX_PREEMPTED: break; - } - default: { + + default: panic("Sandbox %lu | Illegal transition from %s to Running\n", sandbox->id, sandbox_state_stringify(last_state)); - } + } /* State Change Bookkeeping */ assert(now > sandbox->timestamp_of.last_state_change); sandbox->last_state_duration = now - sandbox->timestamp_of.last_state_change; - if (last_state == SANDBOX_RUNNING_SYS) { - sandbox->remaining_exec = (sandbox->remaining_exec > sandbox->last_state_duration) - ? sandbox->remaining_exec - sandbox->last_state_duration - : 0; - } + if(last_state == SANDBOX_RUNNING_SYS) sandbox->last_running_state_duration += sandbox->last_state_duration; sandbox->duration_of_state[last_state] += sandbox->last_state_duration; sandbox->timestamp_of.last_state_change = now; sandbox_state_history_append(&sandbox->state_history, SANDBOX_RUNNING_USER); @@ -52,8 +48,7 @@ sandbox_set_as_running_user(struct sandbox *sandbox, sandbox_state_t last_state) sandbox_state_transition_from_hook(sandbox, last_state); sandbox_state_transition_to_hook(sandbox, SANDBOX_RUNNING_USER); - if (last_state == SANDBOX_RUNNING_SYS) - sandbox_process_scheduler_updates(sandbox); // TODO: is this code preemptable? Ok to be? + assert(sandbox->memory->abi.size > 0); barrier(); sandbox->state = SANDBOX_RUNNING_USER; diff --git a/runtime/include/sandbox_types.h b/runtime/include/sandbox_types.h index 49cfb800a..bebdd6023 100644 --- a/runtime/include/sandbox_types.h +++ b/runtime/include/sandbox_types.h @@ -15,6 +15,11 @@ #include "wasm_stack.h" #include "wasm_types.h" +// #include "wasm_globals.h" +// #include "wasi.h" +// #include "listener_thread.h" +// #include "ck_ring.h" + /********************* * Structs and Types * ********************/ @@ -30,6 +35,7 @@ struct sandbox_timestamps { #endif }; +struct sandbox_metadata; struct sandbox { /* used by ps_list's default name-based MACROS for the scheduling runqueue */ /* Keep as first member of sandbox struct to ensure ps_list maintains alignment */ @@ -39,6 +45,14 @@ struct sandbox { sandbox_state_t state; struct sandbox_state_history state_history; uint16_t response_code; + + size_t pq_idx_in_runqueue; + size_t pq_idx_in_tenant_queue; + int owned_worker_idx; + int original_owner_worker_idx; + int global_queue_type; + uint8_t num_of_overshoots; + struct sandbox_metadata *sandbox_meta; /* Accounting Info */ @@ -57,13 +71,20 @@ struct sandbox { struct wasm_memory *memory; struct vec_wasm_global_t globals; + // uint64_t sizes[1000000]; + // uint64_t sizesize; + /* Scheduling and Temporal State */ struct sandbox_timestamps timestamp_of; uint64_t duration_of_state[SANDBOX_STATE_COUNT]; uint64_t last_state_duration; + uint64_t last_running_state_duration; uint64_t remaining_exec; uint64_t absolute_deadline; + bool exceeded_estimation; + bool writeback_preemption_in_progress; + bool writeback_overshoot_in_progress; uint64_t admissions_estimate; /* estimated execution time (cycles) * runtime_admissions_granularity / relative deadline (cycles) */ uint64_t total_time; /* Total time from Request to Response */ @@ -72,5 +93,29 @@ struct sandbox { /* System Interface State */ int32_t return_value; wasi_context_t *wasi_context; - } PAGE_ALIGNED; + +struct sandbox_metadata { + struct sandbox *sandbox_shadow; + struct tenant *tenant; + struct route *route; + struct priority_queue *tenant_queue; + uint64_t id; + uint64_t allocation_timestamp; + uint64_t absolute_deadline; + uint64_t remaining_exec; + uint64_t total_be_exec_cycles; + uint64_t extra_slack; /* cycles */ + size_t pq_idx_in_tenant_queue; + int owned_worker_idx; + sandbox_state_t state; + bool exceeded_estimation; + bool terminated; + int global_queue_type; + int worker_id_virt; + uint16_t error_code; + + struct job_node *trs_job_node; + struct demand_node *demand_node; + struct demand_node *local_dbf_demand_node; +}; // PAGE_ALIGNED; diff --git a/runtime/include/scheduler.h b/runtime/include/scheduler.h index 927be1ed1..f54abd568 100644 --- a/runtime/include/scheduler.h +++ b/runtime/include/scheduler.h @@ -9,11 +9,13 @@ #include "global_request_scheduler_deque.h" #include "global_request_scheduler_minheap.h" #include "global_request_scheduler_mtds.h" +#include "global_request_scheduler_mtdbf.h" #include "local_cleanup_queue.h" #include "local_runqueue.h" #include "local_runqueue_list.h" #include "local_runqueue_minheap.h" #include "local_runqueue_mtds.h" +#include "local_runqueue_mtdbf.h" #include "panic.h" #include "sandbox_functions.h" #include "sandbox_set_as_interrupted.h" @@ -22,6 +24,7 @@ #include "sandbox_set_as_running_sys.h" #include "sandbox_set_as_running_user.h" #include "sandbox_types.h" +#include "sandbox_set_as_error.h" #include "scheduler_options.h" @@ -66,7 +69,64 @@ static inline struct sandbox * scheduler_mtdbf_get_next() { - return NULL; + /* Get the deadline of the sandbox at the head of the local queue */ + struct sandbox *local = local_runqueue_get_next(); + uint64_t local_deadline = local == NULL ? UINT64_MAX : local->absolute_deadline; + + uint64_t local_rem = local == NULL ? 0 : local->remaining_exec; + struct sandbox *global = NULL; + uint64_t now = __getcycles(); + + struct sandbox_metadata global_metadata = global_request_scheduler_peek_metadata(); + + /* Try to pull and allocate from the global queue if earlier + * This will be placed at the head of the local runqueue */ + if(USING_EARLIEST_START_FIRST) { + if (global_metadata.absolute_deadline - global_metadata.remaining_exec >= local_deadline - local_rem) goto done; + } else { + if (global_metadata.absolute_deadline >= local_deadline) goto done; + } + + if (global_request_scheduler_remove_if_earlier(&global, local_deadline) == 0) { + assert(global != NULL); + // assert(global->absolute_deadline < local_deadline); + if (sandbox_validate_self_lifetime(global) == 0) { + if (global->state == SANDBOX_INITIALIZED) { + sandbox_prepare_execution_environment(global); + sandbox_set_as_runnable(global, SANDBOX_INITIALIZED); + + struct comm_with_worker *cfw = &comm_from_workers[worker_thread_idx]; + assert(cfw); + + struct message new_message = { + .sandbox = global, + .sandbox_id = global->id, + .sandbox_meta = global->sandbox_meta, + .state = global->state, + .sender_worker_idx = worker_thread_idx, + .exceeded_estimation = global->exceeded_estimation, + .message_type = MESSAGE_CFW_PULLED_NEW_SANDBOX, + .timestamp = now + }; + + if (!ck_ring_enqueue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + panic("Ring The buffer was full and the enqueue operation has failed.!"); + } + } else { + assert(global->state == SANDBOX_PREEMPTED); + // debuglog("Resuming writeback\n"); + local_runqueue_add(global); + // global->owned_worker_idx = worker_thread_idx; + } + + assert(global->state == SANDBOX_RUNNABLE || global->state == SANDBOX_PREEMPTED); + // printf("Worker %i accepted a sandbox #%lu!\n", worker_thread_idx, global->id); + } + } + +done: + /* Return what is at the head of the local runqueue or NULL if empty */ + return local_runqueue_get_next(); } static inline struct sandbox * @@ -204,7 +264,7 @@ scheduler_initialize() { switch (scheduler) { case SCHEDULER_MTDBF: - /* TODO: loading */ + global_request_scheduler_mtdbf_initialize(); break; case SCHEDULER_MTDS: global_request_scheduler_mtds_initialize(); @@ -226,7 +286,7 @@ scheduler_runqueue_initialize() { switch (scheduler) { case SCHEDULER_MTDBF: - // local_runqueue_mtdbf_initialize(); + local_runqueue_mtdbf_initialize(); break; case SCHEDULER_MTDS: local_runqueue_mtds_initialize(); @@ -284,12 +344,20 @@ scheduler_log_sandbox_switch(struct sandbox *current_sandbox, struct sandbox *ne static inline void scheduler_preemptive_switch_to(ucontext_t *interrupted_context, struct sandbox *next) { + /* Switch to base context */ + if (next == NULL) { + arch_context_restore_fast(&interrupted_context->uc_mcontext, &worker_thread_base_context); + current_sandbox_set(NULL); + return; + } + /* Switch to next sandbox */ switch (next->ctxt.variant) { case ARCH_CONTEXT_VARIANT_FAST: { assert(next->state == SANDBOX_RUNNABLE); arch_context_restore_fast(&interrupted_context->uc_mcontext, &next->ctxt); current_sandbox_set(next); +assert(sledge_abi__current_wasm_module_instance.abi.memory.id == next->id); sandbox_set_as_running_sys(next, SANDBOX_RUNNABLE); break; } @@ -297,6 +365,7 @@ scheduler_preemptive_switch_to(ucontext_t *interrupted_context, struct sandbox * assert(next->state == SANDBOX_PREEMPTED); arch_context_restore_slow(&interrupted_context->uc_mcontext, &next->ctxt); current_sandbox_set(next); +assert(sledge_abi__current_wasm_module_instance.abi.memory.id == next->id); sandbox_set_as_running_user(next, SANDBOX_PREEMPTED); break; } @@ -307,6 +376,53 @@ scheduler_preemptive_switch_to(ucontext_t *interrupted_context, struct sandbox * } } +static inline int +scheduler_check_messages_from_listener() +{ + int rc = 0; + + assert(comm_to_workers); + + struct message new_message = { 0 }; + struct comm_with_worker *ctw = &comm_to_workers[worker_thread_idx]; + assert(ctw); + assert(ctw->worker_idx == worker_thread_idx); + assert(ck_ring_size(&ctw->worker_ring) < LISTENER_THREAD_RING_SIZE); + + while (ck_ring_dequeue_spsc_message(&ctw->worker_ring, ctw->worker_ring_buffer, &new_message)) { + assert(new_message.message_type == MESSAGE_CTW_SHED_CURRENT_JOB); + /* Check if the sandbox is still alive (not freed yet) */ + if (sandbox_refs[new_message.sandbox_id % RUNTIME_MAX_ALIVE_SANDBOXES]) { + struct sandbox *sandbox_to_kill = new_message.sandbox; + assert(sandbox_to_kill); + assert(sandbox_to_kill->id == new_message.sandbox_id); + + if (sandbox_to_kill->pq_idx_in_runqueue == 0 || sandbox_to_kill->owned_worker_idx != worker_thread_idx) { + /* Make sure the sandbox is in a non-terminal or asleep state (aka: still in the runqueue) */ + new_message.sandbox = NULL; + new_message.sandbox_id = 0; + continue; + } + + struct sandbox_metadata *sandbox_meta = sandbox_to_kill->sandbox_meta; + assert(sandbox_meta); + assert(sandbox_meta->sandbox_shadow == sandbox_to_kill); + assert(sandbox_meta->id == sandbox_to_kill->id); + assert(sandbox_meta->error_code > 0); + + // printf("Worker#%d shedding sandbox #%lu\n", worker_thread_idx, sandbox_to_kill->id); + assert(sandbox_to_kill->response_code == 0); + sandbox_to_kill->response_code = sandbox_meta->error_code; + sandbox_exit_error(sandbox_to_kill); + local_cleanup_queue_add(sandbox_to_kill); + } + new_message.sandbox = NULL; + new_message.sandbox_id = 0; + } + + return rc; +} + /** * Call either at preemptions or blockings to update the scheduler-specific * properties for the given tenant. @@ -316,15 +432,16 @@ scheduler_process_policy_specific_updates_on_interrupts(struct sandbox *interrup { switch (scheduler) { case SCHEDULER_FIFO: - return; case SCHEDULER_EDF: case SCHEDULER_SJF: + sandbox_process_scheduler_updates(interrupted_sandbox); return; case SCHEDULER_MTDS: + sandbox_process_scheduler_updates(interrupted_sandbox); local_timeout_queue_process_promotions(); return; case SCHEDULER_MTDBF: - // scheduler_check_messages_from_listener(); + scheduler_check_messages_from_listener(); if (interrupted_sandbox->state != SANDBOX_ERROR) { sandbox_process_scheduler_updates(interrupted_sandbox); } @@ -343,17 +460,25 @@ scheduler_preemptive_sched(ucontext_t *interrupted_context) { assert(interrupted_context != NULL); - /* Process epoll to make sure that all runnable jobs are considered for execution */ - struct sandbox *interrupted_sandbox = current_sandbox_get(); assert(interrupted_sandbox != NULL); assert(interrupted_sandbox->state == SANDBOX_INTERRUPTED); - // printf ("Worker #%d interrupted sandbox #%lu\n", worker_thread_idx, interrupted_sandbox->id); + scheduler_process_policy_specific_updates_on_interrupts(interrupted_sandbox); struct sandbox *next = scheduler_get_next(); + + /* Assumption: the current sandbox is still there, even if the worker had to shed it from its runqueue above */ + assert(interrupted_sandbox != NULL); + + if (interrupted_sandbox->state == SANDBOX_ERROR) goto done; + if(!(interrupted_sandbox->state == SANDBOX_INTERRUPTED)) { + printf("sand state: %u\n", interrupted_sandbox->state); + } + assert(interrupted_sandbox->state == SANDBOX_INTERRUPTED); + /* Assumption: the current sandbox is on the runqueue, so the scheduler should always return something */ - assert(next != NULL); + // assert(next != NULL); // Cannot assert, since the head of the global queue may have expired and cleaned before this /* If current equals next, no switch is necessary, so resume execution */ if (interrupted_sandbox == next) { @@ -369,11 +494,48 @@ scheduler_preemptive_sched(ucontext_t *interrupted_context) scheduler_log_sandbox_switch(interrupted_sandbox, next); sandbox_preempt(interrupted_sandbox); - // Write back global at idx 0 - wasm_globals_set_i64(&interrupted_sandbox->globals, 0, sledge_abi__current_wasm_module_instance.abi.wasmg_0, - true); - + // Update global at idx 0 + int rc = wasm_globals_set_i64(&interrupted_sandbox->globals, 0, + sledge_abi__current_wasm_module_instance.abi.wasmg_0, true); + assert(rc == 0); + arch_context_save_slow(&interrupted_sandbox->ctxt, &interrupted_context->uc_mcontext); + +#ifdef TRAFFIC_CONTROL + if (USING_WRITEBACK_FOR_PREEMPTION || USING_WRITEBACK_FOR_OVERSHOOT) { + struct message new_message = { + .sandbox = interrupted_sandbox, + .sandbox_id = interrupted_sandbox->id, + .sandbox_meta = interrupted_sandbox->sandbox_meta, + .state = interrupted_sandbox->state, + .sender_worker_idx = worker_thread_idx, + .exceeded_estimation = interrupted_sandbox->exceeded_estimation, + .timestamp = interrupted_sandbox->timestamp_of.last_state_change, + .remaining_exec = interrupted_sandbox->remaining_exec + }; + + if (interrupted_sandbox->writeback_overshoot_in_progress) { + assert(USING_WRITEBACK_FOR_OVERSHOOT); + assert(interrupted_sandbox->remaining_exec == 0); + new_message.message_type = MESSAGE_CFW_WRITEBACK_OVERSHOOT; + new_message.adjustment = runtime_quantum; + } + else if (interrupted_sandbox->writeback_preemption_in_progress) { + assert(USING_WRITEBACK_FOR_PREEMPTION); + assert(USING_LOCAL_RUNQUEUE == false); + new_message.message_type = MESSAGE_CFW_WRITEBACK_PREEMPTION; + new_message.adjustment = 0; + } else panic("No writeback is in progress. Cannot be here!"); + + struct comm_with_worker *cfw = &comm_from_workers[worker_thread_idx]; + if (!ck_ring_enqueue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + panic("Ring The buffer was full and the enqueue operation has failed.!"); + } + } +#endif + + /* CAUTION! Worker MUST NOT access interrupted sandbox after this point! */ +done: scheduler_preemptive_switch_to(interrupted_context, next); } @@ -394,12 +556,14 @@ scheduler_cooperative_switch_to(struct arch_context *current_context, struct san case SANDBOX_RUNNABLE: { assert(next_context->variant == ARCH_CONTEXT_VARIANT_FAST); current_sandbox_set(next_sandbox); +assert(sledge_abi__current_wasm_module_instance.abi.memory.id == next_sandbox->id); sandbox_set_as_running_sys(next_sandbox, SANDBOX_RUNNABLE); break; } case SANDBOX_PREEMPTED: { assert(next_context->variant == ARCH_CONTEXT_VARIANT_SLOW); current_sandbox_set(next_sandbox); +assert(sledge_abi__current_wasm_module_instance.abi.memory.id == next_sandbox->id); /* arch_context_switch triggers a SIGUSR1, which transitions next_sandbox to running_user */ break; } @@ -424,6 +588,7 @@ scheduler_switch_to_base_context(struct arch_context *current_context) static inline void scheduler_idle_loop() { + int spin = 0, max_spin = 0; while (true) { /* Assumption: only called by the "base context" */ assert(current_sandbox_get() == NULL); @@ -435,6 +600,13 @@ scheduler_idle_loop() struct sandbox *next_sandbox = scheduler_get_next(); if (next_sandbox != NULL) { scheduler_cooperative_switch_to(&worker_thread_base_context, next_sandbox); + spin++; + if (spin > max_spin) { + max_spin = spin; + // printf("Worker #%d max useless spins #%d!\n", worker_thread_idx, max_spin); + } + } else { + spin = 0; } /* Clear the cleanup queue */ @@ -479,6 +651,7 @@ scheduler_cooperative_sched(bool add_to_cleanup_queue) /* If our sandbox slept and immediately woke up, we can just return */ if (next_sandbox == exiting_sandbox) { + assert(0); // Never happens, sandboxes don't sleep anymore sandbox_set_as_running_sys(next_sandbox, SANDBOX_RUNNABLE); current_sandbox_set(next_sandbox); return; @@ -487,6 +660,7 @@ scheduler_cooperative_sched(bool add_to_cleanup_queue) scheduler_log_sandbox_switch(exiting_sandbox, next_sandbox); // Write back global at idx 0 + assert(sledge_abi__current_wasm_module_instance.abi.wasmg_0 == 0); wasm_globals_set_i64(&exiting_sandbox->globals, 0, sledge_abi__current_wasm_module_instance.abi.wasmg_0, true); if (add_to_cleanup_queue) local_cleanup_queue_add(exiting_sandbox); @@ -503,8 +677,11 @@ scheduler_cooperative_sched(bool add_to_cleanup_queue) static inline bool scheduler_worker_would_preempt(int worker_idx) { - assert(scheduler == SCHEDULER_EDF); + // assert(scheduler == SCHEDULER_EDF); uint64_t local_deadline = runtime_worker_threads_deadline[worker_idx]; uint64_t global_deadline = global_request_scheduler_peek(); - return global_deadline < local_deadline; + + /* Only send a worker SIGARLM if it has a sandbox to execute (MTDBF) + or it needs to check the global queue for a new higher priority job */ + return local_deadline < UINT64_MAX || global_deadline < local_deadline; } diff --git a/runtime/include/scheduler_mtdbf.h b/runtime/include/scheduler_mtdbf.h new file mode 100644 index 000000000..e69de29bb diff --git a/runtime/include/sledge_abi_symbols.h b/runtime/include/sledge_abi_symbols.h index 1bd6f1e53..c63eb8583 100644 --- a/runtime/include/sledge_abi_symbols.h +++ b/runtime/include/sledge_abi_symbols.h @@ -9,7 +9,7 @@ #include "wasm_types.h" struct sledge_abi_symbols { - void *handle; + void *handle; //////////////// TODO: Maybe make this local below? sledge_abi__init_globals_fn_t initialize_globals; sledge_abi__init_mem_fn_t initialize_memory; sledge_abi__init_tbl_fn_t initialize_tables; diff --git a/runtime/include/tenant.h b/runtime/include/tenant.h index 615bcead3..5d43bee69 100644 --- a/runtime/include/tenant.h +++ b/runtime/include/tenant.h @@ -13,7 +13,8 @@ enum MULTI_TENANCY_CLASS }; struct tenant_timeout { - uint64_t timeout; + uint64_t timeout; + struct tenant *tenant; struct perworker_tenant_sandbox_queue *pwt; }; @@ -32,6 +33,21 @@ struct tenant_global_request_queue { _Atomic volatile enum MULTI_TENANCY_CLASS mt_class; }; +struct job_node { + struct ps_list list; + uint64_t exec; + uint64_t timestamp; + struct sandbox_metadata *sandbox_meta; +}; + +struct tenant_reservation_server { + uint64_t max_budget_guaranteed; + uint64_t budget_guaranteed; + uint64_t budget_best; + struct ps_list_head admitted_jobs_list; + struct ps_list_head admitted_BE_jobs_list; +}; + struct tenant { enum epoll_tag tag; /* Tag must be first member */ char *name; @@ -40,13 +56,19 @@ struct tenant { struct module_database module_db; struct map scratch_storage; - /* Deferrable Server Attributes */ - uint64_t replenishment_period; /* cycles, not changing after init */ - uint64_t max_budget; /* cycles, not changing after init */ - _Atomic volatile int64_t remaining_budget; /* cycles left till next replenishment, can be negative */ + /* Multi-Tenancy Attributes */ + uint64_t max_relative_deadline; + uint64_t replenishment_period; /* cycles, not changing after init */ + uint64_t max_budget; /* cycles, not changing after init */ + _Atomic volatile int64_t remaining_budget; /* cycles left till next replenishment, can be negative */ + uint8_t reservation_percentile; /* percentile of the overall reservation utilisation */ struct perworker_tenant_sandbox_queue *pwt_sandboxes; struct tenant_global_request_queue *tgrq_requests; + struct priority_queue *local_sandbox_metas, *global_sandbox_metas; + struct tenant_reservation_server trs; + uint32_t num_of_overshooted_sandboxes; + uint8_t max_overshoot_of_same_sandbox; }; diff --git a/runtime/include/tenant_config.h b/runtime/include/tenant_config.h index 15d9f4477..fb708a9d8 100644 --- a/runtime/include/tenant_config.h +++ b/runtime/include/tenant_config.h @@ -14,6 +14,7 @@ enum tenant_config_member tenant_config_member_port, tenant_config_member_replenishment_period_us, tenant_config_member_max_budget_us, + tenant_config_reservation_percentile, tenant_config_member_routes, tenant_config_member_len }; @@ -23,8 +24,10 @@ struct tenant_config { uint16_t port; uint32_t replenishment_period_us; uint32_t max_budget_us; + uint8_t reservation_percentile; struct route_config *routes; size_t routes_len; + uint32_t max_relative_deadline_us; }; static inline void @@ -34,6 +37,7 @@ tenant_config_deinit(struct tenant_config *config) config->name = NULL; config->replenishment_period_us = 0; config->max_budget_us = 0; + config->reservation_percentile = 0; for (int i = 0; i < config->routes_len; i++) { route_config_deinit(&config->routes[i]); } free(config->routes); config->routes = NULL; @@ -48,9 +52,12 @@ tenant_config_print(struct tenant_config *config) if (scheduler == SCHEDULER_MTDS) { printf("[Tenant] Replenishment Period (us): %u\n", config->replenishment_period_us); printf("[Tenant] Max Budget (us): %u\n", config->max_budget_us); + } else if (scheduler == SCHEDULER_MTDBF) { + printf("[Tenant] Reservation (%%): %u\n", config->reservation_percentile); } printf("[Tenant] Routes Size: %zu\n", config->routes_len); for (int i = 0; i < config->routes_len; i++) { route_config_print(&config->routes[i]); } + printf("\n"); } static inline int @@ -93,6 +100,17 @@ tenant_config_validate(struct tenant_config *config, bool *did_set) (uint32_t)RUNTIME_RELATIVE_DEADLINE_US_MAX, config->max_budget_us); return -1; } + } else if (scheduler == SCHEDULER_MTDBF) { + if (did_set[tenant_config_reservation_percentile] == false) { + fprintf(stderr, "reservation-percentile field is required\n"); + return -1; + } + + if (config->replenishment_period_us > 100) { + fprintf(stderr, "Reservation-percentile must be between 0 and 100, was %u\n", + config->reservation_percentile); + return -1; + } } if (config->routes_len == 0) { diff --git a/runtime/include/tenant_config_parse.h b/runtime/include/tenant_config_parse.h index e7cee19e4..a3e3f9266 100644 --- a/runtime/include/tenant_config_parse.h +++ b/runtime/include/tenant_config_parse.h @@ -9,8 +9,9 @@ #include "route_config_parse.h" #include "tenant_config.h" -static const char *tenant_config_json_keys[tenant_config_member_len] = {"name", "port", "replenishment-period-us", - "max-budget-us", "routes"}; +static const char *tenant_config_json_keys[tenant_config_member_len] = { + "name", "port", "replenishment-period-us", "max-budget-us", "reservation-percentile", "routes" +}; static inline int tenant_config_set_key_once(bool *did_set, enum tenant_config_member member) @@ -79,6 +80,14 @@ tenant_config_parse(struct tenant_config *config, const char *json_buf, jsmntok_ tenant_config_json_keys[tenant_config_member_max_budget_us], &config->max_budget_us); if (rc < 0) return -1; + } else if (strcmp(key, tenant_config_json_keys[tenant_config_reservation_percentile]) == 0) { + if (!has_valid_type(tokens[i], key, JSMN_PRIMITIVE, json_buf)) return -1; + if (tenant_config_set_key_once(did_set, tenant_config_reservation_percentile) == -1) return -1; + + int rc = parse_uint8_t(tokens[i], json_buf, + tenant_config_json_keys[tenant_config_reservation_percentile], + &config->reservation_percentile); + if (rc < 0) return -1; } else if (strcmp(key, tenant_config_json_keys[tenant_config_member_routes]) == 0) { if (!has_valid_type(tokens[i], key, JSMN_ARRAY, json_buf)) return -1; if (tenant_config_set_key_once(did_set, tenant_config_member_routes) == -1) return -1; @@ -92,6 +101,9 @@ tenant_config_parse(struct tenant_config *config, const char *json_buf, jsmntok_ i++; i = route_config_parse(&(config->routes)[route_idx], json_buf, tokens, i, tokens_size); if (i == -1) return -1; + if (config->routes[route_idx].relative_deadline_us > config->max_relative_deadline_us) { + config->max_relative_deadline_us = config->routes[route_idx].relative_deadline_us; + } } } else { diff --git a/runtime/include/tenant_functions.h b/runtime/include/tenant_functions.h index ddd2a7e15..4861b5840 100644 --- a/runtime/include/tenant_functions.h +++ b/runtime/include/tenant_functions.h @@ -12,17 +12,37 @@ #include "scheduler_options.h" #include "tenant.h" #include "tenant_config.h" +#include "priority_queue.h" +#include "sandbox_functions.h" +#include "dbf.h" + +#define REPLENISHMENT_PERIOD (runtime_max_deadline) + +int tenant_listen(struct tenant *tenant); +int listener_thread_register_tenant(struct tenant *tenant); +void tenant_preprocess(struct http_session *session); int tenant_database_add(struct tenant *tenant); struct tenant *tenant_database_find_by_name(char *name); struct tenant *tenant_database_find_by_socket_descriptor(int socket_descriptor); struct tenant *tenant_database_find_by_port(uint16_t port); struct tenant *tenant_database_find_by_ptr(void *ptr); +void tenant_database_print_reservations(); +void tenant_database_init_reservations(); +void tenant_database_replenish_all(); +struct tenant *tenant_database_find_tenant_most_oversupply(struct tenant *tenant_to_exclude, uint64_t time_of_oversupply, bool weak_shed, struct sandbox_metadata **sandbox_meta_to_remove); -typedef void (*tenant_database_foreach_cb_t)(struct tenant *, void *, void *); -void tenant_database_foreach(tenant_database_foreach_cb_t, void *, void *); +typedef void (*tenant_database_foreach_cb_t)(struct tenant *, void *); +void tenant_database_foreach(tenant_database_foreach_cb_t, void *); + +static inline uint64_t +sandbox_meta_get_priority(void *element) +{ + struct sandbox_metadata *sandbox_meta = (struct sandbox_metadata *)element; + return sandbox_meta->absolute_deadline; +} -static inline int +static inline void tenant_policy_specific_init(struct tenant *tenant, struct tenant_config *config) { switch (scheduler) { @@ -31,21 +51,20 @@ tenant_policy_specific_init(struct tenant *tenant, struct tenant_config *config) case SCHEDULER_EDF: case SCHEDULER_SJF: break; - case SCHEDULER_MTDS: + case SCHEDULER_MTDS: { /* Deferable Server Initialization */ tenant->replenishment_period = (uint64_t)config->replenishment_period_us * runtime_processor_speed_MHz; tenant->max_budget = (uint64_t)config->max_budget_us * runtime_processor_speed_MHz; tenant->remaining_budget = tenant->max_budget; - tenant->pwt_sandboxes = (struct perworker_tenant_sandbox_queue *)malloc( - runtime_worker_threads_count * sizeof(struct perworker_tenant_sandbox_queue)); - if (!tenant->pwt_sandboxes) { - fprintf(stderr, "Failed to allocate tenant_sandboxes array: %s\n", strerror(errno)); - return -1; - }; + config->replenishment_period_us = 0; + config->max_budget_us = 0; - memset(tenant->pwt_sandboxes, 0, - runtime_worker_threads_count * sizeof(struct perworker_tenant_sandbox_queue)); + tenant->pwt_sandboxes = (struct perworker_tenant_sandbox_queue *) + calloc(runtime_worker_threads_count, sizeof(struct perworker_tenant_sandbox_queue)); + if (!tenant->pwt_sandboxes) { + panic("Failed to allocate tenant_sandboxes array: %s\n", strerror(errno)); + } for (int i = 0; i < runtime_worker_threads_count; i++) { tenant->pwt_sandboxes[i].sandboxes = priority_queue_initialize(RUNTIME_TENANT_QUEUE_SIZE, false, @@ -58,20 +77,34 @@ tenant_policy_specific_init(struct tenant *tenant, struct tenant_config *config) } /* Initialize the tenant's global request queue */ - tenant->tgrq_requests = malloc(sizeof(struct tenant_global_request_queue)); + tenant->tgrq_requests = calloc(1, sizeof(struct tenant_global_request_queue)); + if (!tenant->tgrq_requests) { + panic("Failed to allocate tenant global request queue: %s\n", strerror(errno)); + } + tenant->tgrq_requests->sandbox_requests = priority_queue_initialize(RUNTIME_TENANT_QUEUE_SIZE, false, sandbox_get_priority); tenant->tgrq_requests->tenant = tenant; - tenant->tgrq_requests->mt_class = (tenant->replenishment_period == 0) ? MT_DEFAULT : MT_GUARANTEED; + tenant->tgrq_requests->mt_class = (tenant_is_paid(tenant)) ? MT_GUARANTEED : MT_DEFAULT; tenant->tgrq_requests->tenant_timeout.tenant = tenant; tenant->tgrq_requests->tenant_timeout.pwt = NULL; break; - + } case SCHEDULER_MTDBF: + tenant->reservation_percentile = config->reservation_percentile; + config->reservation_percentile = 0; + + ps_list_head_init(&tenant->trs.admitted_jobs_list); + ps_list_head_init(&tenant->trs.admitted_BE_jobs_list); + + tenant->local_sandbox_metas = + priority_queue_initialize_new(RUNTIME_RUNQUEUE_SIZE, false, sandbox_meta_get_priority, NULL, + local_sandbox_meta_update_pq_idx_in_tenant_queue); + tenant->global_sandbox_metas = + priority_queue_initialize_new(RUNTIME_RUNQUEUE_SIZE, false, sandbox_meta_get_priority, NULL, + local_sandbox_meta_update_pq_idx_in_tenant_queue); break; } - - return 0; } static inline struct tenant * @@ -81,8 +114,9 @@ tenant_alloc(struct tenant_config *config) if (existing_tenant != NULL) panic("Tenant %s is already initialized\n", existing_tenant->name); existing_tenant = tenant_database_find_by_port(config->port); - if (existing_tenant != NULL) + if (existing_tenant != NULL) { panic("Tenant %s is already configured with port %u\n", existing_tenant->name, config->port); + } struct tenant *tenant = (struct tenant *)calloc(1, sizeof(struct tenant)); @@ -91,12 +125,14 @@ tenant_alloc(struct tenant_config *config) tenant->name = config->name; config->name = NULL; + tenant->max_relative_deadline = (uint64_t)config->max_relative_deadline_us * runtime_processor_speed_MHz; + tcp_server_init(&tenant->tcp_server, config->port); http_router_init(&tenant->router, config->routes_len); module_database_init(&tenant->module_db); map_init(&tenant->scratch_storage); - /* Deferrable Server init */ + /* Scheduling Policy specific tenant init */ tenant_policy_specific_init(tenant, config); for (int i = 0; i < config->routes_len; i++) { @@ -176,12 +212,145 @@ get_next_timeout_of_tenant(uint64_t replenishment_period) + ((now - runtime_boot_timestamp) / replenishment_period + 1) * replenishment_period; } +#ifdef TRAFFIC_CONTROL -/** - * Start the tenant as a server listening at tenant->port - * @param tenant - * @returns 0 on success, -1 on error - */ -int tenant_listen(struct tenant *tenant); -int listener_thread_register_tenant(struct tenant *tenant); -void tenant_preprocess(struct http_session *session); +static void +tenant_print_jobs(struct tenant *tenant) +{ + struct tenant_reservation_server *trs = &tenant->trs; + struct job_node *head = NULL; + + int i = 0; + printf("\nTenant Guaranteed Budget: %lu/%lu\n", trs->budget_guaranteed, trs->max_budget_guaranteed); + ps_list_foreach_d(&trs->admitted_jobs_list, head) + { + printf("GR-Job #%d: Arrival:%lu\t Exec:%lu\n", i++, head->timestamp, head->exec); + } + + i = 0; + printf("\nTenant Best Effort Budget: %lu/%lu\n", trs->budget_best, UINT64_MAX); + ps_list_foreach_d(&trs->admitted_BE_jobs_list, head) + { + printf("BE-Job #%d: Arrival:%lu\t Exec:%lu\n", i++, head->timestamp, head->exec); + } +} + +static void +tenant_replenish(struct tenant *tenant, uint64_t now) +{ + struct tenant_reservation_server *trs = &tenant->trs; + struct job_node *head = ps_list_head_first_d(&trs->admitted_jobs_list, struct job_node); + + while (!ps_list_is_head_d(&trs->admitted_jobs_list, head)) { + assert(now > head->timestamp); + if (now - head->timestamp < REPLENISHMENT_PERIOD) break; + + struct job_node *tmp_next = ps_list_next_d(head); + + trs->budget_guaranteed += head->exec; + + if (head->sandbox_meta) { + assert(head->sandbox_meta->trs_job_node); + head->sandbox_meta->trs_job_node = NULL; + } + + ps_list_rem_d(head); + free(head); + + head = tmp_next; + } + + assert(trs->budget_guaranteed <= trs->max_budget_guaranteed); + + head = ps_list_head_first_d(&trs->admitted_BE_jobs_list, struct job_node); + + while (!ps_list_is_head_d(&trs->admitted_BE_jobs_list, head)) { + assert(now >= head->timestamp); + if (now - head->timestamp < REPLENISHMENT_PERIOD) break; + + struct job_node *tmp_next = ps_list_next_d(head); + + trs->budget_best += head->exec; + + ps_list_rem_d(head); + free(head); + + head = tmp_next; + } +} + +static inline bool +tenant_can_admit_guaranteed(struct tenant *tenant, uint64_t now, uint64_t adjustment) +{ + tenant_replenish(tenant, now); + return tenant->trs.budget_guaranteed >= adjustment; +} + +static bool +tenant_try_add_job_as_guaranteed(struct tenant *tenant, uint64_t arrival_time, uint64_t adjustment, struct sandbox_metadata *sandbox_meta) +{ + assert(adjustment > 0); + + struct tenant_reservation_server *trs = &tenant->trs; + if (trs->budget_guaranteed < adjustment) return false; + + assert(sandbox_meta->trs_job_node == NULL); + assert(sandbox_meta); + assert(sandbox_meta->terminated == false); + + struct job_node *new_node = (struct job_node *)malloc(sizeof(struct job_node)); + ps_list_init_d(new_node); + new_node->exec = adjustment; + new_node->timestamp = arrival_time; + new_node->sandbox_meta = sandbox_meta; + + assert(ps_list_singleton_d(new_node)); + struct job_node *tail = ps_list_head_last_d(&trs->admitted_jobs_list, struct job_node); + ps_list_add_d(tail, new_node); + sandbox_meta->trs_job_node = new_node; + + assert(trs->budget_guaranteed >= adjustment); + trs->budget_guaranteed -= adjustment; + return true; +} + +static void +tenant_force_add_job_as_best(struct tenant *tenant, uint64_t arrival_time, uint64_t adjustment) +{ + assert(adjustment > 0); + + struct tenant_reservation_server *trs = &tenant->trs; + struct job_node *new_node = (struct job_node *)malloc(sizeof(struct job_node)); + ps_list_init_d(new_node); + new_node->exec = adjustment; + new_node->timestamp = arrival_time; + + assert(ps_list_singleton_d(new_node)); + struct job_node *tail = ps_list_head_last_d(&trs->admitted_BE_jobs_list, struct job_node); + ps_list_add_d(tail, new_node); + + assert(trs->budget_best > adjustment); + trs->budget_best -= adjustment; +} + +static void +tenant_reduce_guaranteed_job_demand(struct tenant *tenant, uint64_t adjustment, struct sandbox_metadata *sandbox_meta) +{ + assert(sandbox_meta); + // assert(sandbox_meta->terminated == false); // TODO WHY FIRES??? + assert(sandbox_meta->global_queue_type == 1); + assert(sandbox_meta->trs_job_node); + + struct tenant_reservation_server *trs = &tenant->trs; + struct job_node *node = sandbox_meta->trs_job_node; + assert(node->sandbox_meta == sandbox_meta); + + assert(node->exec >= adjustment); + node->exec -= adjustment; + trs->budget_guaranteed += adjustment; + + sandbox_meta->trs_job_node->sandbox_meta = NULL; + sandbox_meta->trs_job_node = NULL; +} + +#endif \ No newline at end of file diff --git a/runtime/include/traffic_control.h b/runtime/include/traffic_control.h new file mode 100644 index 000000000..f5fbca4eb --- /dev/null +++ b/runtime/include/traffic_control.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#define TRAFFIC_CONTROL +// #define LOG_TRAFFIC_CONTROL + +typedef struct tenant tenant; // TODO: Why get circular dependency here? +typedef struct sandbox_metadata sandbox_metadata; +typedef enum dbf_update_mode dbf_update_mode_t; + +void traffic_control_initialize(void); +void traffic_control_log_decision(const int admissions_case_num, const bool admitted); +uint64_t traffic_control_decide(struct sandbox_metadata *sandbox_meta, uint64_t start_time, uint64_t estimated_execution, int *denial_code, int *worker_id_v); +uint64_t traffic_control_shed_work(struct tenant *tenant_to_exclude, uint64_t time_of_oversupply, int *worker_id_virt_just_shed, bool weak_shed); diff --git a/runtime/include/wasm_memory.h b/runtime/include/wasm_memory.h index 51247e8e0..b0eb0fc27 100644 --- a/runtime/include/wasm_memory.h +++ b/runtime/include/wasm_memory.h @@ -137,9 +137,10 @@ wasm_memory_reinit(struct wasm_memory *wasm_memory, uint64_t initial) static INLINE int32_t wasm_memory_expand(struct wasm_memory *wasm_memory, uint64_t size_to_expand) { + assert(wasm_memory); uint64_t target_size = wasm_memory->abi.size + size_to_expand; if (unlikely(target_size > wasm_memory->abi.max)) { - fprintf(stderr, "wasm_memory_expand - Out of Memory!. %lu out of %lu\n", wasm_memory->abi.size, + fprintf(stderr, "wasm_memory_expand - Out of Memory! target_size=%lu, size=%lu, max=%lu\n", target_size, wasm_memory->abi.size, wasm_memory->abi.max); return -1; } @@ -153,6 +154,7 @@ wasm_memory_expand(struct wasm_memory *wasm_memory, uint64_t size_to_expand) int rc = mprotect(wasm_memory->abi.buffer, target_size, PROT_READ | PROT_WRITE); if (rc != 0) { perror("wasm_memory_expand mprotect"); + assert(0); return -1; } @@ -169,6 +171,9 @@ wasm_memory_get_size(struct wasm_memory *wasm_memory) return wasm_memory->abi.size; } +/** + * @brief Copy the segments into the linear memory + */ static INLINE void wasm_memory_initialize_region(struct wasm_memory *wasm_memory, uint32_t offset, uint32_t region_size, uint8_t region[]) { @@ -180,7 +185,7 @@ wasm_memory_initialize_region(struct wasm_memory *wasm_memory, uint32_t offset, * instructions. These functions are intended to be used by the runtime to interacts with linear memories. */ /** - * Translates WASM offsets into runtime VM pointers + * Translates WASM offsets into runtime Virtual Memory pointers * @param offset an offset into the WebAssembly linear memory * @param bounds_check the size of the thing we are pointing to * @return void pointer to something in WebAssembly linear memory diff --git a/runtime/include/wasm_stack.h b/runtime/include/wasm_stack.h index a5374b709..882d59e88 100644 --- a/runtime/include/wasm_stack.h +++ b/runtime/include/wasm_stack.h @@ -125,6 +125,6 @@ wasm_stack_reinit(struct wasm_stack *wasm_stack) assert(wasm_stack->low == wasm_stack->buffer + /* guard page */ PAGE_SIZE); assert(wasm_stack->high == wasm_stack->low + wasm_stack->capacity); - explicit_bzero(wasm_stack->low, wasm_stack->capacity); + // explicit_bzero(wasm_stack->low, wasm_stack->capacity); ps_list_init_d(wasm_stack); } diff --git a/runtime/include/worker_thread.h b/runtime/include/worker_thread.h index c006f3812..c19b78278 100644 --- a/runtime/include/worker_thread.h +++ b/runtime/include/worker_thread.h @@ -6,5 +6,6 @@ extern thread_local struct arch_context worker_thread_base_context; extern thread_local int worker_thread_idx; +extern thread_local void *worker_dbf; void *worker_thread_main(void *return_code); diff --git a/runtime/src/current_sandbox.c b/runtime/src/current_sandbox.c index 3427e0c77..027563198 100644 --- a/runtime/src/current_sandbox.c +++ b/runtime/src/current_sandbox.c @@ -68,6 +68,22 @@ current_sandbox_exit() assert(0); } +/** + * @brief Exit from the executing sandbox during an interrup. + * + * Should be called within the signal handler (preemptive scheduler) + * This places the current sandbox on the cleanup queue. + */ +void interrupted_sandbox_exit(void) +{ + struct sandbox *exiting_sandbox = current_sandbox_get(); + assert(exiting_sandbox != NULL); + assert(exiting_sandbox->state == SANDBOX_INTERRUPTED); + + sandbox_exit_error(exiting_sandbox); + local_cleanup_queue_add(exiting_sandbox); +} + void current_sandbox_wasm_trap_handler(int trapno) { @@ -99,7 +115,10 @@ current_sandbox_wasm_trap_handler(int trapno) break; } - debuglog("%s", error_message); + // debuglog("%s - Tenant: %s, Route: %s", error_message, sandbox->tenant->name, sandbox->route->route); + debuglog("%s - T: %s, id: %lu, exceeded: %u, rem_exec: %lu, premp: %u, state: %u, abi->size: %lu", error_message, sandbox->tenant->name, sandbox->id, + sandbox->exceeded_estimation, sandbox->remaining_exec, sandbox->writeback_preemption_in_progress, sandbox->state, + sandbox->memory->abi.size); current_sandbox_exit(); assert(0); } @@ -112,8 +131,8 @@ current_sandbox_init() assert(sandbox != NULL); assert(sandbox->state == SANDBOX_RUNNING_SYS); - int rc = 0; - char *error_message = NULL; + // int rc = 0; + // char *error_message = NULL; /* Initialize sandbox memory */ struct module *current_module = sandbox_get_module(sandbox); @@ -142,10 +161,10 @@ current_sandbox_init() return sandbox; -err: - debuglog("%s", error_message); - current_sandbox_exit(); - return NULL; +// err: +// debuglog("%s", error_message); +// current_sandbox_exit(); +// return NULL; } extern noreturn void @@ -157,8 +176,8 @@ current_sandbox_fini() char *error_message = ""; sandbox_syscall(sandbox); - sandbox->timestamp_of.completion = __getcycles(); - sandbox->total_time = sandbox->timestamp_of.completion - sandbox->timestamp_of.allocation; + // sandbox->timestamp_of.completion = __getcycles(); + // sandbox->total_time = sandbox->timestamp_of.completion - sandbox->timestamp_of.allocation; assert(sandbox->state == SANDBOX_RUNNING_SYS); @@ -169,6 +188,7 @@ current_sandbox_fini() current_sandbox_exit(); assert(0); err: + assert(0); debuglog("%s", error_message); assert(sandbox->state == SANDBOX_RUNNING_SYS); @@ -195,3 +215,26 @@ current_sandbox_start(void) if (sandbox->module->type == APP_MODULE) current_sandbox_fini(); } + +int +sandbox_validate_self_lifetime(struct sandbox *sandbox) +{ + if (sandbox->response_code != 0) goto err; + + const uint64_t now = __getcycles(); + if (sandbox->absolute_deadline >= now + (!sandbox->exceeded_estimation ? sandbox->remaining_exec : 0)) return 0; + + // dbf_try_update_demand(worker_dbf, sandbox->timestamp_of.dispatched, + // sandbox->route->relative_deadline, sandbox->absolute_deadline, sandbox->remaining_exec, + // DBF_DELETE_EXISTING_DEMAND, NULL, NULL); + + assert(sandbox->response_code == 0); + sandbox->response_code = 4081; + +err: + sandbox_exit_error(sandbox); + // sandbox_free(sandbox); + // sandbox_free_linear_memory(sandbox); + local_cleanup_queue_add(sandbox); + return -1; +} diff --git a/runtime/src/dbf_array.c.bak b/runtime/src/dbf_array.c.bak new file mode 100644 index 000000000..5eafdfd88 --- /dev/null +++ b/runtime/src/dbf_array.c.bak @@ -0,0 +1,335 @@ +#include +#include +#include "tenant.h" +#include "runtime.h" +#include "arch/getcycles.h" +#include "math.h" +#include "message.h" +#include "panic.h" +#include "dbf.h" + +struct tenant; + +struct dbf_array { + struct tenant *tenant; + int worker_idx; + // uint32_t idx_oversupply; + uint64_t max_relative_deadline; + uint64_t base_supply; /* supply amount for time 1 */ + uint64_t time_of_oversupply; + uint64_t max_absolute_deadline; + + uint32_t capacity; + uint64_t demands[]; +}; + +static inline int +dbf_array_get_worker_idx(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + return dbf->worker_idx; +} + +/*static inline uint64_t +dbf_array_get_max_relative_dl(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + return dbf->max_relative_deadline; +}*/ + +static inline uint64_t +dbf_array_get_time_of_oversupply(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + return dbf->time_of_oversupply; +} + +static void +dbf_array_print(void *dbf_raw, uint64_t start_time) +{ + assert(dbf_raw != NULL); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + + printf("DBF INFO:\n\ + \t WorkerIDX: \t%d\n\ + \t Capacity: \t%u\n\ + \t Max Rel DL: \t%lu\n\ + \t Max Abs DL (ms): \t%lu\n\ + \t Basic Supply: \t%lu\n\n", + dbf->worker_idx, dbf->capacity, dbf->max_relative_deadline, dbf->max_absolute_deadline/runtime_quantum, dbf->base_supply); + + for (int i = 0; i < dbf->capacity; i++) { + if (dbf->demands[i] > 0) printf("demands[%d] = %lu\n", i, dbf->demands[i]); + } +} + +// static void * +// dbf_array_grow(void *dbf_raw, uint64_t new_max_relative_deadline) +// { +// assert(dbf_raw != NULL); +// struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + +// uint32_t new_capacity = new_max_relative_deadline / runtime_quantum /* * 2 */; // NOT adding 1 for final leftovers + +// struct dbf_array *new_dbf = realloc(dbf, sizeof(struct dbf_array) + sizeof(uint64_t) * new_capacity); +// if (new_dbf == NULL) panic("Failed to grow dbf\n"); + +// memset(new_dbf->demands, 0, new_capacity * sizeof(uint64_t)); + +// new_dbf->capacity = new_capacity; +// new_dbf->max_relative_deadline = new_max_relative_deadline; + +// return new_dbf; +// } + +/* +static bool +dbf_array_check_supply_quick(struct dbf_array *dbf_raw, uint64_t start_time, uint64_t abs_deadline, uint64_t adjustment) +{ + assert(dbf_raw != NULL); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + // assert(start_time < abs_deadline); + if (start_time >= abs_deadline) return true; + + const uint32_t live_deadline_len = ceil((abs_deadline - start_time) / (double)runtime_quantum); + const uint32_t abs_deadline_idx = (abs_deadline / runtime_quantum) % dbf->capacity; + const uint64_t max_supply_at_deadline = live_deadline_len * dbf->base_supply; + + return (dbf->demands[abs_deadline_idx] + adjustment <= max_supply_at_deadline); +} +*/ + +static bool +dbf_array_try_update_demand(void *dbf_raw, uint64_t start_time, uint64_t route_relative_deadline, + uint64_t abs_deadline, uint64_t adjustment, dbf_update_mode_t dbf_update_mode, + void *new_message_raw, struct sandbox_metadata *sandbox_meta) +{ + assert(dbf_raw != NULL); + assert(start_time < abs_deadline); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + struct message *new_message = (struct message *) new_message_raw; + + if (abs_deadline > dbf->max_absolute_deadline) dbf->max_absolute_deadline = abs_deadline; + + if (adjustment == 0) goto done; + + // const uint32_t max_relative_deadline_len = dbf->max_relative_deadline / runtime_quantum; + const uint32_t live_deadline_len = round((abs_deadline - start_time) / (double)runtime_quantum); + // const uint32_t live_deadline_len = (abs_deadline - start_time) / runtime_quantum; + // const uint32_t live_deadline_len = abs_deadline/runtime_quantum - start_time/runtime_quantum; + const uint32_t abs_deadline_idx = (abs_deadline / runtime_quantum) % dbf->capacity; + // const uint32_t start_time_idx = (start_time / runtime_quantum) % dbf->capacity; + + // if (start_time_idx == abs_deadline_idx) goto done; + + // assert(live_deadline_len <= max_relative_deadline_len); + assert(live_deadline_len <= dbf->capacity); + + bool demand_is_below_supply = true; + + for (uint32_t i = abs_deadline_idx, iter = 0; i < abs_deadline_idx + dbf->capacity /*iter< (start_time_idx-abs_deadline_idx+dbf->capacity)%dbf->capacity*/; i++, iter++) { + uint32_t circular_i = i % dbf->capacity; + + const uint64_t max_supply_at_time_i = (live_deadline_len + iter) * dbf->base_supply; + const uint64_t prev_demand = dbf->demands[circular_i]; + + switch (dbf_update_mode) { + case DBF_CHECK_AND_ADD_DEMAND: + dbf->demands[circular_i] += adjustment; + + if (dbf->demands[circular_i] > max_supply_at_time_i) { + /* Undo DBF adding if over supply detected */ + for (uint32_t j = abs_deadline_idx; j <= i; j++) { + dbf->demands[j % dbf->capacity] -= adjustment; + } + dbf->time_of_oversupply = iter; + goto err_demand_over_supply; + } + break; + /*case DBF_CHECK_EXISTING_SANDBOX_EXTRA_DEMAND: + if (dbf->demands[circular_i] + adjustment > max_supply_at_time_i) { + dbf->time_of_oversupply = iter; + goto err_demand_over_supply; + } + break;*/ + case DBF_FORCE_ADD_NEW_SANDBOX_DEMAND: + /* [Work Conservation Scenario] Only applicable for tenant and global dbf! */ + assert(dbf->worker_idx < 0); + + dbf->demands[circular_i] += adjustment; + assert(prev_demand < dbf->demands[circular_i]); + + if (demand_is_below_supply && dbf->demands[circular_i] > max_supply_at_time_i) { + dbf->time_of_oversupply = iter; + demand_is_below_supply = false; + } + break; + case DBF_REDUCE_EXISTING_DEMAND: + dbf->demands[circular_i] -= adjustment; + if (prev_demand < dbf->demands[circular_i]) { + printf("DBF_REDUCE_EXISTING_DEMAND\n"); + printf("Worker ID: %d\n", dbf->worker_idx); + // printf("Tenant Reservation: %u\n", new_message->reserv); + printf("Sandbox ID: %lu\n", new_message->sandbox_id); + // printf("Sandbox Response Code: %u\n", new_message->sandbox_response_code); + printf("Basic supply: %lu\n", dbf->base_supply); + printf("Cap=%u\n", dbf->capacity); + printf("Abs_dest_idx=%u\n", abs_deadline_idx); + printf("live_deadline_len=%u\n", live_deadline_len); + printf("i=%u, cir_i = %u, iter = %u\n", i, circular_i, iter); + printf("max_supply_at_time_i = %lu\n\n", max_supply_at_time_i); + printf("Prev_demand[%u]=%lu\n\n", circular_i, prev_demand); + printf("demand[%u]=%lu\n\n", circular_i, dbf->demands[circular_i]); + // printf("sandbox_state=%u, if_case=%d\n", new_message->state, new_message->if_case); + printf("exceeded_estimation=%d\n", new_message->exceeded_estimation); + printf("Adjustment=%lu\n", adjustment); + // printf("last_exec_duration=%lu, prev_rem_exec=%ld, rem_exec=%ld\n", + // new_message->last_exec_dur, new_message->prev_rem_exec, + // new_message->remaining_execution); + + dbf_print(dbf, start_time); + panic("Interger Underflow -> Tried reducing demand, but it actually went over supply!"); + } + break; + } + } + +done: + return demand_is_below_supply; +err_demand_over_supply: + demand_is_below_supply = false; + goto done; +} + +static uint64_t +dbf_array_get_demand_overgone_its_supply_at(void *dbf_raw, uint64_t start_time, uint64_t abs_deadline, uint64_t time_of_oversupply) +{ + assert(dbf_raw != NULL); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + + time_of_oversupply = abs_deadline + time_of_oversupply*runtime_quantum; + + if (time_of_oversupply > dbf->max_absolute_deadline) { + printf("abs: %lu, time_of_oversupply: %lu, dbf_abs: %lu\n", abs_deadline, time_of_oversupply, dbf->max_absolute_deadline); + time_of_oversupply = dbf->max_absolute_deadline; + } + + assert(start_time < time_of_oversupply); + + // const uint32_t live_deadline_len = (time_of_oversupply - start_time) / runtime_quantum; + // const uint32_t live_deadline_len = time_of_oversupply/runtime_quantum - start_time/runtime_quantum; + const uint32_t live_deadline_len = round((time_of_oversupply - start_time) / (double)runtime_quantum); + const uint32_t abs_deadline_idx = (time_of_oversupply / runtime_quantum) % dbf->capacity; + + uint64_t demand_overgone = 0; + uint32_t circular_i = (time_of_oversupply/runtime_quantum) % dbf->capacity; + + const uint64_t max_supply_at_time_i = live_deadline_len * dbf->base_supply; + const uint64_t curr_demand_at_time_i = dbf->demands[circular_i]; + + if (curr_demand_at_time_i > max_supply_at_time_i) { + demand_overgone = curr_demand_at_time_i - max_supply_at_time_i; + } + + return demand_overgone; +} + +/* +static uint64_t +dbf_array_get_demand_overgone_its_supply_at(void *dbf_raw, uint64_t start_time, uint64_t abs_deadline, uint64_t time_of_oversupply) +{ + assert(dbf_raw != NULL); + assert(start_time < abs_deadline); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + + const uint32_t live_deadline_len = ceil((abs_deadline - start_time) / (double)runtime_quantum); + const uint32_t abs_deadline_idx = (abs_deadline / runtime_quantum) % dbf->capacity; + + uint64_t demand_overgone = 0; + uint32_t circular_i = (abs_deadline_idx + time_of_oversupply) % dbf->capacity; + + const uint64_t max_supply_at_time_i = (live_deadline_len + time_of_oversupply) * dbf->base_supply; + const uint64_t curr_demand_at_time_i = dbf->demands[circular_i]; + + if (curr_demand_at_time_i > max_supply_at_time_i) { + demand_overgone = curr_demand_at_time_i - max_supply_at_time_i; + } + + return demand_overgone; +} + +static uint64_t +dbf_array_get_demand_overgone_its_supply_at__BAK(void *dbf_raw, uint64_t start_time, uint64_t abs_deadline) +{ + assert(dbf_raw != NULL); + assert(start_time < abs_deadline); + struct dbf_array *dbf = (struct dbf_array *)dbf_raw; + + const uint32_t live_deadline_len = ceil((abs_deadline - start_time) / (double)runtime_quantum); + const uint32_t absolute_arrival_idx = start_time / runtime_quantum % dbf->capacity; + + uint64_t demand_overgone = 0; + + const uint32_t abs_deadline_idx = (abs_deadline / runtime_quantum) % dbf->capacity; + + // assert(live_deadline_len<=route_relative_deadline_len); + + for (uint32_t i = abs_deadline_idx, iter = 0; i < abs_deadline_idx + live_deadline_len; i++, iter++) { + uint32_t circular_i = i % dbf->capacity; + + const uint64_t max_supply_at_time_i = (live_deadline_len + iter) * dbf->base_supply; + const uint64_t curr_demand_at_time_i = dbf->demands[circular_i]; + + if (curr_demand_at_time_i > max_supply_at_time_i) { + if (curr_demand_at_time_i - max_supply_at_time_i > demand_overgone) { + demand_overgone = curr_demand_at_time_i - max_supply_at_time_i; + } + } + } + + return demand_overgone; +} +*/ +static void +dbf_array_free(void *dbf) +{ + assert(dbf != NULL); + + free(dbf); +} + + +void * +dbf_array_initialize(uint32_t num_of_workers, uint8_t reservation_percentile, int worker_idx, struct tenant *tenant) +{ + struct dbf_config config = { + .get_worker_idx_fn = dbf_array_get_worker_idx, + // .get_max_relative_dl_fn = dbf_array_get_max_relative_dl, + // .get_idx_oversuplly_fn = dbf_array_get_idx_oversuplly, + .get_time_of_oversupply_fn = dbf_array_get_time_of_oversupply, + .print_fn = dbf_array_print, + // .print_supply_fn = dbf_array_print_suply, + // .grow_fn = dbf_array_grow, + .try_update_demand_fn = dbf_array_try_update_demand, + .get_demand_overgone_its_supply_at_fn = dbf_array_get_demand_overgone_its_supply_at, + .free_fn = dbf_array_free + }; + + dbf_plug_functions(&config); + + assert(runtime_max_deadline > 0); + + uint32_t capacity = runtime_max_deadline / runtime_quantum /* * 2 */; // NOT adding 1 for final leftovers + struct dbf_array *dbf = (struct dbf_array *)calloc(1, sizeof(struct dbf_array) + sizeof(uint64_t) * capacity); + + dbf->capacity = capacity; + dbf->max_relative_deadline = runtime_max_deadline; + dbf->worker_idx = worker_idx; + // uint32_t cpu_factor = (num_of_workers == 1) ? 1 : num_of_workers * RUNTIME_MAX_CPU_UTIL_PERCENTILE / 100; + dbf->base_supply = runtime_quantum * num_of_workers * reservation_percentile * RUNTIME_MAX_CPU_UTIL_PERCENTILE / 10000; + + return dbf; +} diff --git a/runtime/src/dbf_generic.c b/runtime/src/dbf_generic.c new file mode 100644 index 000000000..4223ea498 --- /dev/null +++ b/runtime/src/dbf_generic.c @@ -0,0 +1,80 @@ +#include +#include +#include "dbf.h" + +static struct dbf_config dbf_conf; +// void *global_dbf_temp; + +int +dbf_get_worker_idx(void *dbf) +{ + assert(dbf_conf.get_worker_idx_fn != NULL); + return dbf_conf.get_worker_idx_fn(dbf); +} + +// uint64_t +// dbf_get_max_relative_dl(void *dbf) +// { +// assert(dbf_conf.get_max_relative_dl_fn != NULL); +// return dbf_conf.get_max_relative_dl_fn(dbf); +// } + +uint64_t +dbf_get_time_of_oversupply(void *dbf) +{ + assert(dbf_conf.get_time_of_oversupply_fn != NULL); + return dbf_conf.get_time_of_oversupply_fn(dbf); +} + +void +dbf_print(void *dbf, uint64_t start_time) +{ + assert(dbf_conf.print_fn != NULL); + return dbf_conf.print_fn(dbf, start_time); +} + +// void * +// dbf_grow(void *dbf, uint64_t new_max_relative_deadline) +// { +// assert(dbf_conf.grow_fn != NULL); +// return dbf_conf.grow_fn(dbf, new_max_relative_deadline); +// } + +bool +dbf_try_update_demand(void *dbf, uint64_t start_time, uint64_t route_relative_deadline, uint64_t abs_deadline, + uint64_t adjustment, dbf_update_mode_t dbf_update_mode, void *new_message, struct sandbox_metadata *sandbox_meta) +{ + assert(dbf_conf.try_update_demand_fn != NULL); + return dbf_conf.try_update_demand_fn(dbf, start_time, route_relative_deadline, abs_deadline, adjustment, + dbf_update_mode, new_message, sandbox_meta); +} + +uint64_t +dbf_get_demand_overgone_its_supply_at(void *dbf, uint64_t start_time, uint64_t abs_deadline, uint64_t time_of_oversupply) +{ + assert(dbf_conf.get_demand_overgone_its_supply_at_fn != NULL); + return dbf_conf.get_demand_overgone_its_supply_at_fn(dbf, start_time, abs_deadline, time_of_oversupply); +} + +void +dbf_free(void *dbf) +{ + assert(dbf_conf.free_fn != NULL); + return dbf_conf.free_fn(dbf); +} + +void +dbf_plug_functions(struct dbf_config *config) +{ + memcpy(&dbf_conf, config, sizeof(struct dbf_config)); +} + +void +*dbf_initialize(uint32_t num_of_workers, uint8_t reservation_percentile, int worker_idx, struct tenant *tenant) +{ +#ifdef DBF_USE_LINKEDLIST + return dbf_list_initialize(num_of_workers, reservation_percentile, worker_idx, tenant); +#else + return dbf_array_initialize(num_of_workers, reservation_percentile, worker_idx, tenant); +#endif +} diff --git a/runtime/src/dbf_list.c b/runtime/src/dbf_list.c new file mode 100644 index 000000000..f424d1680 --- /dev/null +++ b/runtime/src/dbf_list.c @@ -0,0 +1,199 @@ +#include +#include "dbf.h" +#include "sandbox_types.h" + +struct dbf_list { + struct tenant *tenant; + int worker_idx; + uint64_t max_relative_deadline; + double base_supply; /* supply amount for time 1 */ + uint64_t time_of_oversupply; + uint64_t demand_total; + + struct ps_list_head demands_list; +}; + +static inline int +dbf_list_get_worker_idx(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + return dbf->worker_idx; +} + +/*static inline uint64_t +dbf_list_get_max_relative_dl(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + return dbf->max_relative_deadline; +}*/ + +static inline uint64_t +dbf_list_get_time_of_oversupply(void * dbf_raw) +{ + assert(dbf_raw); + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + return dbf->time_of_oversupply; +} + +static void +dbf_list_print(void *dbf_raw, uint64_t start_time) +{ + assert(dbf_raw != NULL); + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + + printf("DBF INFO LL:\n\ + \t WorkerIDX: \t%d\n\ + \t Basic Supply: \t%lf\n\n", dbf->worker_idx, dbf->base_supply); + + struct demand_node *node = NULL; + uint64_t demand_sum = 0; + + ps_list_foreach_d(&dbf->demands_list, node) + { + const uint32_t live_deadline_len = node->abs_deadline - start_time; + const uint64_t max_supply_at_time_i = live_deadline_len * dbf->base_supply; + demand_sum += node->demand; + uint64_t over = 0; + if (demand_sum >= max_supply_at_time_i) over = demand_sum - max_supply_at_time_i; + printf("demand_at[%lu] = %lu, t=%s, demand_sum=%lu/supply=%lu, demand_over=%lu\n", node->abs_deadline, node->demand, node->tenant->name, demand_sum, max_supply_at_time_i, over); + } +} + +bool +dbf_list_try_add_new_demand(void *dbf_raw, uint64_t start_time, uint64_t abs_deadline, uint64_t adjustment, struct sandbox_metadata *sm) +{ + assert(dbf_raw != NULL); + assert(start_time < abs_deadline); + assert(sm); + assert(sm->demand_node == NULL); + assert(adjustment > 0); + // if (adjustment == 0) return false; + + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + struct demand_node *node = NULL; + uint64_t past_deadline_demand = 0; + uint64_t demand_sum = 0; + + ps_list_foreach_d(&dbf->demands_list, node) + { + if (node->abs_deadline <= start_time) past_deadline_demand = demand_sum; + else if (node->abs_deadline >= abs_deadline) break; + demand_sum += node->demand; + } + + struct demand_node *node_spot = node; + assert(abs_deadline != node->abs_deadline); + assert(abs_deadline == sm->absolute_deadline); + + demand_sum += adjustment; + const uint64_t live_deadline_len = abs_deadline - start_time; + const uint64_t max_supply_at_time_i = live_deadline_len * dbf->base_supply; // + past_deadline_demand; + if (demand_sum > max_supply_at_time_i) { + dbf->time_of_oversupply = abs_deadline; + goto err; + } + + while(!ps_list_is_head_d(&dbf->demands_list, node)) { + struct demand_node *tmp_next = ps_list_next_d(node); + const uint64_t live_deadline_len = node->abs_deadline - start_time; + const uint64_t max_supply_at_time_i = live_deadline_len * dbf->base_supply; // + past_deadline_demand; + demand_sum += node->demand; + if (demand_sum > max_supply_at_time_i) { + dbf->time_of_oversupply = node->abs_deadline; + goto err; + } + node = tmp_next; + } + + struct demand_node *new_node = (struct demand_node*) malloc(sizeof(struct demand_node)); + ps_list_init_d(new_node); + new_node->abs_deadline = abs_deadline; + new_node->demand = adjustment; + new_node->tenant = sm->tenant; + // new_node->sandbox_meta = sm; + sm->demand_node = new_node; + assert(ps_list_singleton_d(new_node)); + ps_list_append_d(node_spot, new_node); + dbf->demand_total = demand_sum + adjustment; + return true; +err: + return false; +} + +void +dbf_list_force_add_extra_slack(void *dbf_raw, struct sandbox_metadata *sm, uint64_t adjustment) +{ + assert(dbf_raw != NULL); + assert(sm); + assert(sm->demand_node); + assert(adjustment > 0); + + struct demand_node *node = sm->demand_node; + assert(node->abs_deadline == sm->absolute_deadline); + assert(node->demand >= adjustment); + node->demand += adjustment; + + struct dbf_list *dbf = (struct dbf_list *)dbf_raw; + dbf->demand_total += adjustment; +} + +void +dbf_list_reduce_demand(struct sandbox_metadata *sm, uint64_t adjustment, bool delete_node) +{ + assert(sm); + assert(sm->demand_node); + assert(delete_node || adjustment > 0); + + struct demand_node *node = sm->demand_node; + assert(node->abs_deadline == sm->absolute_deadline); + assert(node->demand >= adjustment); + node->demand -= adjustment; + + // assert(dbf->demand_total >= adjustment); + // dbf->demand_total -= adjustment; + + if (delete_node) { + assert(node->demand == 0); + /* Clean up empty and repetitive nodes */ + ps_list_rem_d(node); + free(node); + node = NULL; + } +} + +static void +dbf_list_free(void *dbf) +{ + assert(dbf != NULL); + + free(dbf); +} + +void * +dbf_list_initialize(uint32_t num_of_workers, uint8_t reservation_percentile, int worker_idx, struct tenant *tenant) +{ + struct dbf_config config = { + // .try_update_demand_fn = dbf_list_try_add_new_demand, + .get_worker_idx_fn = dbf_list_get_worker_idx, + .get_time_of_oversupply_fn = dbf_list_get_time_of_oversupply, + .print_fn = dbf_list_print, + .free_fn = dbf_list_free + }; + + dbf_plug_functions(&config); + + assert(runtime_max_deadline > 0); + + struct dbf_list *dbf = (struct dbf_list *)calloc(1, sizeof(struct dbf_list)); + ps_list_head_init(&dbf->demands_list); + + dbf->max_relative_deadline = runtime_max_deadline; + dbf->worker_idx = worker_idx; + // uint32_t cpu_factor = (num_of_workers == 1) ? 1 : num_of_workers * RUNTIME_MAX_CPU_UTIL_PERCENTILE / 100; + dbf->base_supply = /*runtime_quantum * */1.0*num_of_workers * reservation_percentile * RUNTIME_MAX_CPU_UTIL_PERCENTILE / 10000; + dbf->tenant = tenant; + + return dbf; +} diff --git a/runtime/src/global_request_scheduler.c b/runtime/src/global_request_scheduler.c index 31dab21b4..28e62e9d6 100644 --- a/runtime/src/global_request_scheduler.c +++ b/runtime/src/global_request_scheduler.c @@ -3,6 +3,8 @@ #include "global_request_scheduler.h" #include "panic.h" +static struct sandbox_metadata global_highest_priority_metadata; + /* Default uninitialized implementations of the polymorphic interface */ noreturn static struct sandbox * uninitialized_add(struct sandbox *arg) @@ -87,3 +89,45 @@ global_request_scheduler_peek() { return global_request_scheduler.peek_fn(); } + +/** + * Peeks at the metadata of the highest priority sandbox + * @returns metadata of the highest priority sandbox + */ +struct sandbox_metadata +global_request_scheduler_peek_metadata() +{ + return global_highest_priority_metadata; +} + +/** + * Updates the metadata of the highest priority sandbox + * @param element the highest priority sandbox + */ +void +global_request_scheduler_update_highest_priority(const void *element) +{ + if (element == NULL) { + global_highest_priority_metadata.absolute_deadline = UINT64_MAX; + global_highest_priority_metadata.tenant = NULL; + global_highest_priority_metadata.route = NULL; + global_highest_priority_metadata.allocation_timestamp = 0; + global_highest_priority_metadata.remaining_exec = 0; + global_highest_priority_metadata.id = 0; + global_highest_priority_metadata.global_queue_type = 0; + global_highest_priority_metadata.exceeded_estimation = false; + global_highest_priority_metadata.state = SANDBOX_UNINITIALIZED; + return; + } + + const struct sandbox *sandbox = element; + global_highest_priority_metadata.absolute_deadline = sandbox->absolute_deadline; + global_highest_priority_metadata.tenant = sandbox->tenant; + global_highest_priority_metadata.route = sandbox->route; + global_highest_priority_metadata.allocation_timestamp = sandbox->timestamp_of.allocation; + global_highest_priority_metadata.remaining_exec = sandbox->remaining_exec; + // global_highest_priority_metadata.remaining_exec = sandbox->remaining_execution_original; + global_highest_priority_metadata.id = sandbox->id; + global_highest_priority_metadata.exceeded_estimation = sandbox->exceeded_estimation; + global_highest_priority_metadata.state = sandbox->state; +} diff --git a/runtime/src/global_request_scheduler_minheap.c b/runtime/src/global_request_scheduler_minheap.c index 5f0b894fc..547bb1570 100644 --- a/runtime/src/global_request_scheduler_minheap.c +++ b/runtime/src/global_request_scheduler_minheap.c @@ -61,23 +61,13 @@ global_request_scheduler_minheap_peek(void) return priority_queue_peek(global_request_scheduler_minheap); } -uint64_t -sandbox_get_priority_fn(void *element) -{ - struct sandbox *sandbox = (struct sandbox *)element; - if (scheduler == SCHEDULER_SJF) return sandbox->remaining_exec; - assert(scheduler == SCHEDULER_EDF); - return sandbox->absolute_deadline; -}; - - /** * Initializes the variant and registers against the polymorphic interface */ void global_request_scheduler_minheap_initialize() { - global_request_scheduler_minheap = priority_queue_initialize(4096, true, sandbox_get_priority_fn); + global_request_scheduler_minheap = priority_queue_initialize(4096, true, sandbox_get_priority); struct global_request_scheduler_config config = {.add_fn = global_request_scheduler_minheap_add, .remove_fn = global_request_scheduler_minheap_remove, diff --git a/runtime/src/global_request_scheduler_mtdbf.c b/runtime/src/global_request_scheduler_mtdbf.c new file mode 100644 index 000000000..0905a8bb8 --- /dev/null +++ b/runtime/src/global_request_scheduler_mtdbf.c @@ -0,0 +1,204 @@ +#include +#include + +#include "global_request_scheduler.h" +#include "listener_thread.h" +#include "panic.h" +#include "priority_queue.h" +#include "runtime.h" +#include "tenant_functions.h" +#include "sandbox_set_as_error.h" +#include "dbf.h" +#include "local_cleanup_queue.h" + +struct priority_queue *global_request_scheduler_mtdbf; + +lock_t global_lock; +// int max_global_runqueue_len = 0; ////////// + +/** + * Pushes a sandbox request to the global runqueue + * @param sandbox + * @returns pointer to request if added. NULL otherwise + */ +static struct sandbox * +global_request_scheduler_mtdbf_add(struct sandbox *sandbox) +{ + assert(sandbox); + assert(global_request_scheduler_mtdbf); + assert(listener_thread_is_running()); + + lock_node_t node = {}; + lock_lock(&global_lock, &node); + + int rc = priority_queue_enqueue_nolock(global_request_scheduler_mtdbf, sandbox); + if (rc != 0) { + assert(sandbox->response_code == 0); + sandbox->response_code = 4293; + sandbox = NULL; // TODO: FIX ME + goto done; + } + + sandbox->owned_worker_idx = -1; + + // if(priority_queue_length_nolock(global_request_scheduler_mtdbf) > max_global_runqueue_len) { + // max_global_runqueue_len = priority_queue_length_nolock(global_request_scheduler_mtdbf); + // printf("Global MAX Queue Length: %u\n", max_global_runqueue_len); + // } + // printf("GlobalLen: %d, Tenant: %s, Tenant-G: %d, Tenant-L: %d\n\n", priority_queue_length_nolock(global_request_scheduler_mtdbf), sandbox->tenant->name, + // priority_queue_length_nolock(sandbox->tenant->global_sandbox_metas), priority_queue_length_nolock(sandbox->tenant->local_sandbox_metas)); + +done: + lock_unlock(&global_lock, &node); + return sandbox; +} + +/** + * @param pointer to the pointer that we want to set to the address of the removed sandbox request + * @returns 0 if successful, -ENOENT if empty + */ +int +global_request_scheduler_mtdbf_remove(struct sandbox **removed_sandbox) +{ + /* This function won't be used with the MTDS scheduler. Keeping merely for the polymorhism. */ + return -1; +} + +/** + * @param removed_sandbox pointer to set to removed sandbox request + * @param target_deadline the deadline that the request must be earlier than to dequeue + * @returns 0 if successful, -ENOENT if empty or if request isn't earlier than target_deadline + */ +int +global_request_scheduler_mtdbf_remove_if_earlier(struct sandbox **removed_sandbox, uint64_t target_deadline) +{ + int rc = -ENOENT; + + const uint64_t now = __getcycles(); + struct sandbox *local = local_runqueue_get_next(); + + uint64_t local_rem = local == NULL ? 0 : local->remaining_exec; + + lock_node_t node = {}; + lock_lock(&global_lock, &node); + + struct sandbox_metadata global_metadata = global_request_scheduler_peek_metadata(); + uint64_t global_deadline = global_metadata.absolute_deadline; + + if(USING_EARLIEST_START_FIRST) { + if (global_deadline - global_metadata.remaining_exec >= target_deadline - local_rem) goto err_enoent; + } else { + if (global_deadline >= target_deadline) goto err_enoent; + } + // if (global_deadline == UINT64_MAX) goto err_enoent; + + /* Spot the sandbox to remove */ + struct sandbox *top_sandbox = NULL; + rc = priority_queue_top_nolock(global_request_scheduler_mtdbf, (void **)&top_sandbox); + assert(top_sandbox); + assert(top_sandbox->absolute_deadline == global_deadline); + assert(top_sandbox->remaining_exec == global_metadata.remaining_exec); + assert(top_sandbox->state == SANDBOX_INITIALIZED || top_sandbox->state == SANDBOX_PREEMPTED); + assert(top_sandbox->response_code == 0); + + if (top_sandbox->sandbox_meta->terminated) { + assert(top_sandbox->sandbox_meta->error_code > 0); + top_sandbox->response_code = top_sandbox->sandbox_meta->error_code; + } else if (global_deadline < now + (!top_sandbox->exceeded_estimation ? top_sandbox->remaining_exec : 0)) { + top_sandbox->response_code = top_sandbox->state == SANDBOX_INITIALIZED ? 4080 : 4082; + } else if (USING_LOCAL_RUNQUEUE) { + struct tenant *tenant = top_sandbox->tenant; + struct route *route = top_sandbox->route; + + // assert(dbf_get_worker_idx(worker_dbf) == worker_thread_idx); + // if (!dbf_try_update_demand(worker_dbf, now, route->relative_deadline, + // global_deadline, top_sandbox->remaining_exec, DBF_CHECK_AND_ADD_DEMAND, NULL, NULL)) { + // goto err_enoent; + // } + } + else if(local) { + assert(USING_WRITEBACK_FOR_PREEMPTION); + assert(local->state == SANDBOX_INTERRUPTED); + assert(local->writeback_preemption_in_progress == false); + assert(local->owned_worker_idx >= 0); + assert(local->pq_idx_in_runqueue >= 1); + local->writeback_preemption_in_progress = true; + local_runqueue_delete(local); + // local->response_code = 5000; + // interrupted_sandbox_exit(); + } + + top_sandbox->timestamp_of.dispatched = now; // remove the same op from scheduler validate and set_as_runable + top_sandbox->owned_worker_idx = -2; + // printf("Worker %i accepted a sandbox #%lu!\n", worker_thread_idx, top_sandbox->id); + + rc = priority_queue_dequeue_nolock(global_request_scheduler_mtdbf, (void **)removed_sandbox); + assert(rc == 0); + assert(*removed_sandbox == top_sandbox); + + assert(top_sandbox->state == SANDBOX_INITIALIZED || top_sandbox->state == SANDBOX_PREEMPTED); + + lock_unlock(&global_lock, &node); + +done: + return rc; +err_enoent: + lock_unlock(&global_lock, &node); + rc = -ENOENT; + goto done; +} + +/** + * @param removed_sandbox pointer to set to removed sandbox request + * @param target_deadline the deadline that the request must be earlier than to dequeue + * @param mt_class the multi-tenancy class of the global request to compare the target deadline against + * @returns 0 if successful, -ENOENT if empty or if request isn't earlier than target_deadline + */ +int +global_request_scheduler_mtdbf_remove_with_mt_class(struct sandbox **removed_sandbox, uint64_t target_deadline, + enum MULTI_TENANCY_CLASS target_mt_class) +{ + /* This function won't be used with the MTDBF scheduler. Keeping merely for the polymorhism. */ + return -1; +} + +/** + * Peek at the priority of the highest priority task without having to take the lock + * Because this is a min-heap PQ, the highest priority is the lowest 64-bit integer + * This is used to store an absolute deadline + * @returns value of highest priority value in queue or ULONG_MAX if empty + */ +static uint64_t +global_request_scheduler_mtdbf_peek(void) +{ + return priority_queue_peek(global_request_scheduler_mtdbf); +} + + +/** + * Initializes the variant and registers against the polymorphic interface + */ +void +global_request_scheduler_mtdbf_initialize() +{ + global_request_scheduler_mtdbf = priority_queue_initialize_new(RUNTIME_RUNQUEUE_SIZE, false, USING_EARLIEST_START_FIRST ? sandbox_get_priority_global : sandbox_get_priority, + global_request_scheduler_update_highest_priority, + sandbox_update_pq_idx_in_runqueue); + + lock_init(&global_lock); + + struct global_request_scheduler_config config = { + .add_fn = global_request_scheduler_mtdbf_add, + .remove_fn = global_request_scheduler_mtdbf_remove, + .remove_if_earlier_fn = global_request_scheduler_mtdbf_remove_if_earlier, + .peek_fn = global_request_scheduler_mtdbf_peek + }; + + global_request_scheduler_initialize(&config); +} + +void +global_request_scheduler_mtdbf_free() +{ + priority_queue_free(global_request_scheduler_mtdbf); +} diff --git a/runtime/src/libc/wasi_impl_serverless.c b/runtime/src/libc/wasi_impl_serverless.c index c7c62349d..98da351aa 100644 --- a/runtime/src/libc/wasi_impl_serverless.c +++ b/runtime/src/libc/wasi_impl_serverless.c @@ -1040,6 +1040,7 @@ wasi_snapshot_preview1_backing_poll_oneoff(wasi_context_t *context, const __wasi noreturn void wasi_snapshot_preview1_backing_proc_exit(wasi_context_t *context, __wasi_exitcode_t exitcode) { + // panic("This path should not be reachable\n"); current_sandbox_fini(); assert(0); } diff --git a/runtime/src/listener_thread.c b/runtime/src/listener_thread.c index 4af880260..73e8015c8 100644 --- a/runtime/src/listener_thread.c +++ b/runtime/src/listener_thread.c @@ -1,6 +1,8 @@ #include #include +#include "admissions_control.h" +#include "traffic_control.h" #include "arch/getcycles.h" #include "execution_regression.h" #include "global_request_scheduler.h" @@ -15,6 +17,13 @@ #include "tenant.h" #include "tenant_functions.h" +#include "sandbox_perf_log.h" +#include "http_session_perf_log.h" +#include "ck_ring.h" +#include "priority_queue.h" +#include "global_request_scheduler_mtdbf.h" +#include "sandbox_set_as_error.h" + static void listener_thread_unregister_http_session(struct http_session *http); static void panic_on_epoll_error(struct epoll_event *evt); @@ -35,6 +44,11 @@ int listener_thread_epoll_file_descriptor; pthread_t listener_thread_id; +struct comm_with_worker *comm_from_workers, *comm_to_workers; +extern lock_t global_lock; + +static struct sandbox_metadata *global_sandbox_meta = NULL; + /** * Initializes the listener thread, pinned to core 0, and starts to listen for requests */ @@ -42,6 +56,12 @@ void listener_thread_initialize(void) { printf("Starting listener thread\n"); + + comm_from_workers = calloc(runtime_worker_threads_count, sizeof(struct comm_with_worker)); + comm_to_workers = calloc(runtime_worker_threads_count, sizeof(struct comm_with_worker)); + comm_with_workers_init(comm_from_workers); + comm_with_workers_init(comm_to_workers); + cpu_set_t cs; CPU_ZERO(&cs); @@ -55,14 +75,14 @@ listener_thread_initialize(void) assert(ret == 0); ret = pthread_setaffinity_np(listener_thread_id, sizeof(cpu_set_t), &cs); assert(ret == 0); - ret = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cs); + if (geteuid() != 0) ret = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cs); assert(ret == 0); printf("\tListener core thread: %lx\n", listener_thread_id); } /** - * @brief Registers a serverless tenant on the listener thread's epoll descriptor + * @brief Registers a serverless http session on the listener thread's epoll descriptor **/ void listener_thread_register_http_session(struct http_session *http) @@ -99,7 +119,7 @@ listener_thread_register_http_session(struct http_session *http) } /** - * @brief Registers a serverless tenant on the listener thread's epoll descriptor + * @brief Registers a serverless http session on the listener thread's epoll descriptor **/ static void listener_thread_unregister_http_session(struct http_session *http) @@ -153,6 +173,402 @@ listener_thread_register_metrics_server() return rc; } +static void +check_messages_from_workers() +{ +#ifdef TRAFFIC_CONTROL + assert(comm_from_workers); + assert(comm_to_workers); + + for (int worker_idx = 0; worker_idx < runtime_worker_threads_count; worker_idx++) { + struct message new_message = { 0 }; + struct comm_with_worker *cfw = &comm_from_workers[worker_idx]; + struct comm_with_worker *ctw = &comm_to_workers[worker_idx]; + assert(cfw); + assert(ctw); + assert(cfw->worker_idx == worker_idx); + assert(ctw->worker_idx == worker_idx); + + const uint64_t now = __getcycles(); + + while (ck_ring_dequeue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + assert(new_message.sender_worker_idx == worker_idx); + assert(new_message.sandbox_meta); + + struct sandbox_metadata *sandbox_meta = new_message.sandbox_meta; + assert(new_message.sandbox_id == sandbox_meta->id); + + struct tenant *tenant = sandbox_meta->tenant; + struct route *route = sandbox_meta->route; + const uint64_t absolute_deadline = sandbox_meta->absolute_deadline; + const uint64_t allocation_timestamp = sandbox_meta->allocation_timestamp; + + assert(tenant); + assert(route); + assert(absolute_deadline > 0); + assert(allocation_timestamp > 0); + + sandbox_meta->exceeded_estimation = new_message.exceeded_estimation; + sandbox_meta->state = new_message.state; + sandbox_meta->owned_worker_idx = new_message.sender_worker_idx; + + switch (new_message.message_type) + { + case MESSAGE_CFW_PULLED_NEW_SANDBOX: { + assert(sandbox_meta->state == SANDBOX_RUNNABLE); + + if (sandbox_meta->terminated) continue; + + if (sandbox_meta->pq_idx_in_tenant_queue) { + assert(sandbox_meta->global_queue_type == 2); + assert(sandbox_meta->tenant_queue == tenant->global_sandbox_metas); + priority_queue_delete_by_idx_nolock(tenant->global_sandbox_metas, + sandbox_meta,sandbox_meta->pq_idx_in_tenant_queue); + if(unlikely(priority_queue_enqueue_nolock(tenant->local_sandbox_metas, sandbox_meta))){ + panic("Failed to add sandbox_meta to tenant metadata queue"); + } + sandbox_meta->tenant_queue = tenant->local_sandbox_metas; + } + break; + } + case MESSAGE_CFW_DELETE_SANDBOX: { + assert(sandbox_meta->state == SANDBOX_RETURNED || sandbox_meta->state == SANDBOX_ERROR); + // assert(new_message.adjustment > 0); + assert(sandbox_meta->terminated || sandbox_meta->remaining_exec > 0); + if (!sandbox_meta->terminated){ + assert(sandbox_meta->worker_id_virt >= 0); + // assert(sandbox_meta->remaining_exec == new_message.adjustment); + void *global_dbf = global_virt_worker_dbfs[sandbox_meta->worker_id_virt]; + + dbf_list_reduce_demand(sandbox_meta, sandbox_meta->remaining_exec + sandbox_meta->extra_slack, true); + sandbox_meta->demand_node = NULL; + // sandbox_meta->extra_slack = 0; + + // sandbox_meta->remaining_exec -= new_message.adjustment; + assert(sandbox_meta->remaining_exec == new_message.remaining_exec); + } + // assert(sandbox_meta->remaining_exec == 0); + + if (sandbox_meta->trs_job_node) tenant_reduce_guaranteed_job_demand(tenant, sandbox_meta->remaining_exec, sandbox_meta); + + // if (sandbox_meta->global_queue_type == 2 && sandbox_meta->state == SANDBOX_RETURNED) sandbox_meta->total_be_exec_cycles += new_message.adjustment; + if (sandbox_meta->total_be_exec_cycles > 0) tenant_force_add_job_as_best(tenant, now, sandbox_meta->total_be_exec_cycles); + + sandbox_meta->terminated = true; + break; + } + case MESSAGE_CFW_REDUCE_DEMAND: { + assert(new_message.adjustment > 0); + if (sandbox_meta->global_queue_type == 2) { + sandbox_meta->total_be_exec_cycles += new_message.adjustment; + // tenant_force_add_job_as_best(tenant, now, sandbox_meta->total_be_exec_cycles); + } + + if (sandbox_meta->terminated) break; + + assert(sandbox_meta->demand_node); + assert(sandbox_meta->worker_id_virt >= 0); + void *global_dbf = global_virt_worker_dbfs[sandbox_meta->worker_id_virt]; + dbf_list_reduce_demand(sandbox_meta, new_message.adjustment, false); + + sandbox_meta->remaining_exec -= new_message.adjustment; + assert(sandbox_meta->remaining_exec == new_message.remaining_exec); + + if (sandbox_meta->remaining_exec == 0 && sandbox_meta->extra_slack < runtime_quantum) { + dbf_list_reduce_demand(sandbox_meta, sandbox_meta->extra_slack, true); + sandbox_meta->extra_slack = 0; + sandbox_meta->demand_node = NULL; + } + break; + } + case MESSAGE_CFW_EXTRA_DEMAND_REQUEST: { + assert(USING_TRY_LOCAL_EXTRA); + assert(new_message.exceeded_estimation); + assert(new_message.adjustment == runtime_quantum); + + if (sandbox_meta->terminated) break; + + assert(sandbox_meta->remaining_exec == 0); + if (absolute_deadline <= now) { + assert(sandbox_meta->error_code == 0); + if (sandbox_meta->extra_slack > 0) { + assert(sandbox_meta->demand_node); + dbf_list_reduce_demand(sandbox_meta, sandbox_meta->extra_slack, true); + sandbox_meta->demand_node = NULL; + // sandbox_meta->extra_slack = 0; + } + assert(sandbox_meta->demand_node == NULL); + sandbox_meta->error_code = 4081; + sandbox_meta->terminated = true; + break; + } + + if (sandbox_meta->global_queue_type == 1) { + assert(sandbox_meta->trs_job_node); + assert(sandbox_meta->trs_job_node->sandbox_meta); + sandbox_meta->trs_job_node->sandbox_meta = NULL; + sandbox_meta->trs_job_node = NULL; + } + + int return_code = 0; + int worker_id_v = -1; + uint64_t work_admitted = 0; + + if (sandbox_meta->extra_slack >= runtime_quantum) { + bool tenant_can_admit = tenant_try_add_job_as_guaranteed(tenant, now, runtime_quantum, sandbox_meta); + return_code = tenant_can_admit ? 1 : 2; + + worker_id_v = sandbox_meta->worker_id_virt; + work_admitted = 1; + + sandbox_meta->extra_slack -= runtime_quantum; + } else { + assert(sandbox_meta->demand_node == NULL); + assert(sandbox_meta->extra_slack == 0); + work_admitted = traffic_control_decide(sandbox_meta, now, runtime_quantum, &return_code, &worker_id_v); + } + + if (work_admitted == 0) { + // debuglog("No global supply left"); + assert(return_code == 4295 || return_code == 4296); + assert(sandbox_meta->demand_node == NULL); + assert(sandbox_meta->extra_slack == 0); + assert(sandbox_meta->error_code == 0); + sandbox_meta->error_code = return_code; + sandbox_meta->terminated = true; + break; + } + + assert(worker_id_v >= 0); + sandbox_meta->remaining_exec = runtime_quantum; + sandbox_meta->worker_id_virt = worker_id_v; + + // TODO: Fix the BE budget calculation for when promote/demote happens + if (sandbox_meta->global_queue_type == 2 && return_code == 1) { + assert(sandbox_meta->pq_idx_in_tenant_queue >= 1); + priority_queue_delete_by_idx_nolock(tenant->local_sandbox_metas, + sandbox_meta,sandbox_meta->pq_idx_in_tenant_queue); + sandbox_meta->tenant_queue = NULL; + // printf("promote!\n"); + } else if (sandbox_meta->global_queue_type == 1 && return_code == 2) { + assert(sandbox_meta->pq_idx_in_tenant_queue == 0); + if(unlikely(priority_queue_enqueue_nolock(tenant->local_sandbox_metas, sandbox_meta))){ + panic("Failed to add sandbox_meta to tenant metadata queue"); + } + sandbox_meta->tenant_queue = tenant->local_sandbox_metas; + // printf("demote!\n"); + } + sandbox_meta->global_queue_type = return_code; + break; + } + case MESSAGE_CFW_WRITEBACK_PREEMPTION: { + assert(USING_WRITEBACK_FOR_PREEMPTION); + assert(USING_LOCAL_RUNQUEUE == false); + assert (sandbox_meta->state == SANDBOX_PREEMPTED); + + struct sandbox *preempted_sandbox = new_message.sandbox; + assert(preempted_sandbox); + assert(preempted_sandbox == sandbox_meta->sandbox_shadow); + assert(preempted_sandbox->sandbox_meta == sandbox_meta); + assert(preempted_sandbox->id == new_message.sandbox_id); + assert(preempted_sandbox->state == SANDBOX_PREEMPTED); + assert(preempted_sandbox->writeback_preemption_in_progress); + assert(preempted_sandbox->absolute_deadline == absolute_deadline); + assert(preempted_sandbox->response_code == 0); + assert(preempted_sandbox->remaining_exec > 0); + + if (sandbox_meta->terminated) { + assert(sandbox_meta->error_code > 0); + assert(preempted_sandbox->response_code == 0); + // preempted_sandbox->response_code = sandbox_meta->error_code; + // break; + // printf("terminated - %s\n", tenant->name); + } else if (absolute_deadline < now + (!preempted_sandbox->exceeded_estimation ? preempted_sandbox->remaining_exec : 0)) { + // printf("missed - %s\n", tenant->name); + /* // if (absolute_deadline < now + preempted_sandbox->remaining_execution_original) { + assert(sandbox_meta->terminated == false); + assert(sandbox_meta->remaining_exec == preempted_sandbox->remaining_exec); + + assert(sandbox_meta->worker_id_virt >= 0); + void *global_dbf = global_virt_worker_dbfs[sandbox_meta->worker_id_virt]; + dbf_try_update_demand(global_dbf, allocation_timestamp, + route->relative_deadline, + absolute_deadline, sandbox_meta->remaining_exec, + DBF_DELETE_EXISTING_DEMAND, NULL, NULL); + + sandbox_meta->remaining_exec -= new_message.adjustment; + assert(sandbox_meta->remaining_exec == new_message.remaining_exec); + + if (sandbox_meta->trs_job_node) { + assert(sandbox_meta->global_queue_type == 1); + tenant_update_job_node(tenant, sandbox_meta->remaining_exec, TRS_REDUCE_EXISTING_DEMAND, sandbox_meta); + } + + if (sandbox_meta->global_queue_type == 2) { + assert(tenant->trs.best_effort_cycles >= sandbox_meta->remaining_exec); + tenant->trs.best_effort_cycles -= sandbox_meta->remaining_exec; + } + + sandbox_meta->terminated = true; + assert(preempted_sandbox->response_code == 0); + preempted_sandbox->response_code = 4082; + break; */ + assert(sandbox_meta->error_code == 0); + if (sandbox_meta->remaining_exec + sandbox_meta->extra_slack > 0) { + assert(sandbox_meta->demand_node); + dbf_list_reduce_demand(sandbox_meta, sandbox_meta->remaining_exec + sandbox_meta->extra_slack, true); + sandbox_meta->demand_node = NULL; + // sandbox_meta->remaining_exec = 0; + // sandbox_meta->extra_slack = 0; + } + assert(sandbox_meta->demand_node == NULL); + sandbox_meta->error_code = 4082; + sandbox_meta->terminated = true; + } + + assert(sandbox_meta->terminated || sandbox_meta->remaining_exec == preempted_sandbox->remaining_exec); + + if (unlikely(global_request_scheduler_add(preempted_sandbox) == NULL)) { + // TODO: REDUCE DBF, for now just panic! + panic("Failed to add the preempted_sandbox to global queue\n"); + } + preempted_sandbox->writeback_preemption_in_progress = false; + + break; + } + case MESSAGE_CFW_WRITEBACK_OVERSHOOT: { + assert(USING_WRITEBACK_FOR_OVERSHOOT); + assert (sandbox_meta->state == SANDBOX_PREEMPTED); + + struct sandbox *preempted_sandbox = new_message.sandbox; + assert(preempted_sandbox); + assert(preempted_sandbox == sandbox_meta->sandbox_shadow); + assert(preempted_sandbox->sandbox_meta == sandbox_meta); + assert(preempted_sandbox->id == new_message.sandbox_id); + assert(preempted_sandbox->sandbox_meta == sandbox_meta); + assert(preempted_sandbox->state == SANDBOX_PREEMPTED); + assert(preempted_sandbox->writeback_overshoot_in_progress); + assert(preempted_sandbox->absolute_deadline == absolute_deadline); + assert(preempted_sandbox->response_code == 0); + assert(preempted_sandbox->remaining_exec == 0); + assert(new_message.remaining_exec == 0); + assert(sandbox_meta->remaining_exec == 0); + assert(new_message.adjustment == runtime_quantum); + + if (sandbox_meta->terminated) { + assert(sandbox_meta->error_code > 0); + preempted_sandbox->response_code = sandbox_meta->error_code; + break; + } + + if (absolute_deadline <= now) { + sandbox_meta->terminated = true; + preempted_sandbox->response_code = 4082; + break; + } + + if (sandbox_meta->global_queue_type == 1) { + assert(sandbox_meta->trs_job_node); + assert(sandbox_meta->trs_job_node->sandbox_meta); + sandbox_meta->trs_job_node->sandbox_meta = NULL; + sandbox_meta->trs_job_node = NULL; + } + + int return_code = 0; + int worker_id_v = -1; + uint64_t work_admitted = 0; + + work_admitted = traffic_control_decide(sandbox_meta, now, runtime_quantum, + &return_code, &worker_id_v); + + if (work_admitted == 0) { + // debuglog("No global supply left"); + assert(return_code == 4290 || return_code == 4291); + preempted_sandbox->response_code = return_code + 5; + sandbox_meta->terminated = true; + break; + } + + assert(worker_id_v >= 0); + sandbox_meta->remaining_exec = runtime_quantum; + sandbox_meta->worker_id_virt = worker_id_v; + if (sandbox_meta->global_queue_type == 2 && return_code == 1) { + assert(sandbox_meta->pq_idx_in_tenant_queue >= 1); + priority_queue_delete_by_idx_nolock(tenant->local_sandbox_metas, + sandbox_meta,sandbox_meta->pq_idx_in_tenant_queue); + } else if (sandbox_meta->global_queue_type == 1 && return_code == 2) { + assert(sandbox_meta->pq_idx_in_tenant_queue == 0); + if(unlikely(priority_queue_enqueue_nolock(tenant->local_sandbox_metas, sandbox_meta))){ + panic("Failed to add sandbox_meta to tenant metadata queue"); + } + } + sandbox_meta->global_queue_type = return_code; + + preempted_sandbox->remaining_exec = runtime_quantum; + preempted_sandbox->writeback_overshoot_in_progress = false; + + if (unlikely(global_request_scheduler_add(preempted_sandbox) == NULL)){ + // TODO: REDUCE DBF, for now just panic! + panic("Failed to add the preempted_sandbox to global queue\n"); + } + break; + } + default: + panic("Unknown message type received by the listener!"); + break; + } // end switch 1 + + if (sandbox_meta->terminated == false) continue; + + assert(sandbox_meta->demand_node == NULL); + + if (sandbox_meta->pq_idx_in_tenant_queue) { + assert(sandbox_meta->global_queue_type == 2); + assert(sandbox_meta->tenant_queue); + priority_queue_delete_by_idx_nolock(sandbox_meta->tenant_queue, + sandbox_meta,sandbox_meta->pq_idx_in_tenant_queue); + sandbox_meta->tenant_queue = NULL; + } + + switch (new_message.message_type) { + case MESSAGE_CFW_EXTRA_DEMAND_REQUEST: + if (sandbox_refs[new_message.sandbox_id % RUNTIME_MAX_ALIVE_SANDBOXES]){ + new_message.message_type = MESSAGE_CTW_SHED_CURRENT_JOB; + if (!ck_ring_enqueue_spsc_message(&ctw->worker_ring, ctw->worker_ring_buffer, &new_message)) { + panic("Ring buffer was full and enqueue has failed!") + } + pthread_kill(runtime_worker_threads[new_message.sender_worker_idx], SIGALRM); + } else { + // printf("already dead\n"); + } + break; + case MESSAGE_CFW_REDUCE_DEMAND: + break; + case MESSAGE_CFW_DELETE_SANDBOX: + assert (sandbox_meta->state == SANDBOX_RETURNED || sandbox_meta->state == SANDBOX_ERROR); + free(sandbox_meta); + break; + case MESSAGE_CFW_WRITEBACK_PREEMPTION: + case MESSAGE_CFW_WRITEBACK_OVERSHOOT: + // assert(preempted_sandbox); + // assert(preempted_sandbox->id == sandbox_meta->id); + // assert(preempted_sandbox->state == SANDBOX_PREEMPTED); + + // sandbox_set_as_error(preempted_sandbox, SANDBOX_PREEMPTED); + // sandbox_free(preempted_sandbox); + // free(sandbox_meta); + break; + default: + panic ("Unknown message type!"); + break; + } // end switch 2 + // memset(&new_message, 0, sizeof(new_message)); + } // end while + } // end for + +#endif +} + static void panic_on_epoll_error(struct epoll_event *evt) { @@ -239,56 +655,201 @@ static void on_client_request_received(struct http_session *session) { assert(session->state == HTTP_SESSION_RECEIVED_REQUEST); - session->request_downloaded_timestamp = __getcycles(); - struct route *route = session->route; - uint64_t estimated_execution = route->execution_histogram.estimated_execution; - uint64_t work_admitted = 1; + const uint64_t now = __getcycles(); + session->request_downloaded_timestamp = now; + + struct tenant *tenant = session->tenant; + struct route *route = session->route; + http_route_total_increment_request(&session->route->metrics); + + // uint64_t estimated_execution = route->execution_histogram.estimated_execution; // By defaulat this is half of deadline + // uint64_t work_admitted = 1; + + // struct route *route = http_router_match_route(&tenant->router, session->http_request.full_url); + // if (route == NULL) { + // debuglog("Route: %s did not match any routes\n", session->http_request.full_url); + // session->state = HTTP_SESSION_EXECUTION_COMPLETE; + // http_session_set_response_header(session, 404); + // on_client_response_header_sending(session); + // return; + // } + + // session->route = route; + // http_route_total_increment_request(&session->route->metrics); + +#if defined TRAFFIC_CONTROL + /* + * Admin control. + * If client sends a request to the route "/main", server prints all the DBF data. + * If client sends a request to the route "/terminator", server does cleanup and terminates. + */ + if (tenant->tcp_server.port == 55555) { + if (strcmp(session->http_request.full_url, "/terminator") == 0) { + printf("Terminating SLEdge now!\n"); + tenant_database_print_reservations(); + printf("\nGLOBAL DBF DEMANDS:\n"); + const int N_VIRT_WORKERS_DBF = USING_AGGREGATED_GLOBAL_DBF ? 1 : runtime_worker_threads_count; + for (int i = 0; i < N_VIRT_WORKERS_DBF; i++) + { + printf("GL Worker #%d\n", i); + dbf_print(global_virt_worker_dbfs[i], now); + } + + // dbf_print(global_dbf, now); + // printf("\nGLOBAL GUAR DBF DEMANDS:\n"); + printf("\nWorker #0 DBF DEMANDS:\n"); + dbf_print(global_worker_dbf, now); + + session->state = HTTP_SESSION_EXECUTION_COMPLETE; + http_session_set_response_header(session, 500); + on_client_response_header_sending(session); + runtime_cleanup(); + exit(0); + } + + if (strcmp(session->http_request.full_url, "/admin") == 0) { + printf("Hello from Admin!\n"); + tenant_database_print_reservations(); + printf("\nGLOBAL DBF DEMANDS:\n"); + const int N_VIRT_WORKERS_DBF = USING_AGGREGATED_GLOBAL_DBF ? 1 : runtime_worker_threads_count; + for (int i = 0; i < N_VIRT_WORKERS_DBF; i++) + { + printf("GL Worker #%d\n", i); + dbf_print(global_virt_worker_dbfs[i], now); + } + + // dbf_print(global_dbf, now); + // printf("\nGLOBAL GUAR DBF DEMANDS:\n"); + printf("\nWorker #0 DBF DEMANDS:\n"); + dbf_print(global_worker_dbf, now); + + session->state = HTTP_SESSION_EXECUTION_COMPLETE; + http_session_set_response_header(session, 500); + on_client_response_header_sending(session); + return; + } + } +#endif + + // const uint64_t sandbox_alloc_timestamp = __getcycles(); + const uint64_t absolute_deadline = now + route->relative_deadline; + uint64_t estimated_execution = route->execution_histogram.estimated_execution; // TODO: By default half of deadline + uint64_t work_admitted = 1; + int return_code = 0; + int worker_id_v = -1; #ifdef EXECUTION_REGRESSION estimated_execution = get_regression_prediction(session); #endif -#ifdef ADMISSIONS_CONTROL - /* - * Perform admissions control. - * If 0, workload was rejected, so close with 429 "Too Many Requests" and continue - */ - uint64_t admissions_estimate = admissions_control_calculate_estimate(estimated_execution, +/* + * Perform admissions control. + * If 0, workload was rejected, so close with 429 "Too Many Requests" and continue + */ +#if defined ADMISSIONS_CONTROL + const uint64_t admissions_estimate = admissions_control_calculate_estimate(estimated_execution, route->relative_deadline); work_admitted = admissions_control_decide(admissions_estimate); +#elif defined TRAFFIC_CONTROL + if (global_sandbox_meta == NULL) global_sandbox_meta = malloc(sizeof(struct sandbox_metadata)); + + assert(global_sandbox_meta); + global_sandbox_meta->tenant = tenant; + global_sandbox_meta->route = route; + global_sandbox_meta->tenant_queue = NULL; + global_sandbox_meta->sandbox_shadow = NULL; + global_sandbox_meta->global_queue_type = 0; + global_sandbox_meta->pq_idx_in_tenant_queue = 0; + global_sandbox_meta->error_code = 0; + global_sandbox_meta->exceeded_estimation = false; + global_sandbox_meta->terminated = false; + global_sandbox_meta->demand_node = NULL; + global_sandbox_meta->trs_job_node = NULL; + global_sandbox_meta->extra_slack = 0; + global_sandbox_meta->total_be_exec_cycles = 0; + global_sandbox_meta->owned_worker_idx = -2; + + global_sandbox_meta->allocation_timestamp = now; + global_sandbox_meta->absolute_deadline = absolute_deadline; + global_sandbox_meta->remaining_exec = estimated_execution; + + work_admitted = traffic_control_decide(global_sandbox_meta, now, estimated_execution, + &return_code, &worker_id_v); + assert(work_admitted == 0 || worker_id_v >= 0); + assert(work_admitted == 0 || return_code == 1 || return_code == 2); +#endif + if (work_admitted == 0) { + assert(worker_id_v < 0); session->state = HTTP_SESSION_EXECUTION_COMPLETE; http_session_set_response_header(session, 429); on_client_response_header_sending(session); + sandbox_perf_log_print_denied_entry(tenant, route, return_code); return; } -#endif /* Allocate a Sandbox */ session->state = HTTP_SESSION_EXECUTING; - struct sandbox *sandbox = sandbox_alloc(route->module, session, route, session->tenant, work_admitted); + struct sandbox *sandbox = sandbox_alloc(route->module, session, work_admitted, now); if (unlikely(sandbox == NULL)) { + // TODO: REDUCE DEMAND!!! debuglog("Failed to allocate sandbox\n"); session->state = HTTP_SESSION_EXECUTION_COMPLETE; http_session_set_response_header(session, 500); on_client_response_header_sending(session); + sandbox_perf_log_print_denied_entry(tenant, route, 5000); return; } sandbox->remaining_exec = estimated_execution; + +#if defined TRAFFIC_CONTROL + sandbox->global_queue_type = return_code; + sandbox->sandbox_meta = global_sandbox_meta; + + if(extra_execution_slack_p > 0) { + const uint64_t hack = estimated_execution*extra_execution_slack_p/100; + dbf_list_force_add_extra_slack(global_virt_worker_dbfs[worker_id_v], global_sandbox_meta, hack); + global_sandbox_meta->extra_slack = hack; + } + + global_sandbox_meta->sandbox_shadow = sandbox; + global_sandbox_meta->id = sandbox->id; + global_sandbox_meta->state = sandbox->state; + + global_sandbox_meta->worker_id_virt = worker_id_v; + global_sandbox_meta->global_queue_type = return_code; + + if (global_sandbox_meta->global_queue_type == 2) { + if(unlikely(priority_queue_enqueue_nolock(tenant->global_sandbox_metas, global_sandbox_meta))){ + panic("Failed to add sandbox_meta to tenant metadata queue"); + } + global_sandbox_meta->tenant_queue = tenant->global_sandbox_metas; + } +#endif /* If the global request scheduler is full, return a 429 to the client */ if (unlikely(global_request_scheduler_add(sandbox) == NULL)) { - // debuglog("Failed to add sandbox to global queue\n"); + // debuglog("Failed to add a %s sandbox to global queue\n", sandbox->tenant->name); + /////////////////////////////////// TODO ??? sandbox->response_code = 4290; - sandbox->state = SANDBOX_ERROR; - sandbox_perf_log_print_entry(sandbox); - sandbox->http = NULL; + // sandbox->state = SANDBOX_ERROR; + // sandbox_perf_log_print_entry(sandbox); + // sandbox->http = NULL; + + sandbox->timestamp_of.dispatched = now; + // TODO: REDUCE DEMAND!!! + sandbox_set_as_error(sandbox, SANDBOX_INITIALIZED); + free(sandbox->sandbox_meta); sandbox_free(sandbox); - session->state = HTTP_SESSION_EXECUTION_COMPLETE; - http_session_set_response_header(session, 429); - on_client_response_header_sending(session); + return; + // session->state = HTTP_SESSION_EXECUTION_COMPLETE; + // http_session_set_response_header(session, 429); + // on_client_response_header_sending(session); + // sandbox_perf_log_print_denied_entry(tenant, route, 999); } + + global_sandbox_meta = NULL; } static void @@ -437,20 +998,30 @@ listener_thread_main(void *dummy) listener_thread_register_metrics_server(); /* Set my priority */ - // runtime_set_pthread_prio(pthread_self(), 2); + // runtime_set_pthread_prio(pthread_self(), 2); // TODO: what to do with this? pthread_setschedprio(pthread_self(), -20); +#ifdef TRAFFIC_CONTROL + const int epoll_timeout = 0; +#else + const int epoll_timeout = -1; +#endif + while (true) { - /* Block indefinitely on the epoll file descriptor, waiting on up to a max number of events */ +#ifdef TRAFFIC_CONTROL + tenant_database_replenish_all(); + check_messages_from_workers(); +#endif + /* If -1, Block indefinitely on the epoll file descriptor, waiting on up to a max number of events */ int descriptor_count = epoll_wait(listener_thread_epoll_file_descriptor, epoll_events, - RUNTIME_MAX_EPOLL_EVENTS, -1); + RUNTIME_MAX_EPOLL_EVENTS, epoll_timeout); + + if (descriptor_count == 0) continue; if (descriptor_count < 0) { if (errno == EINTR) continue; panic("epoll_wait: %s", strerror(errno)); } - - /* Assumption: Because epoll_wait is set to not timeout, we should always have descriptors here */ assert(descriptor_count > 0); for (int i = 0; i < descriptor_count; i++) { @@ -460,6 +1031,8 @@ listener_thread_main(void *dummy) switch (tag) { case EPOLL_TAG_TENANT_SERVER_SOCKET: + // tenant_database_replenish_all(); + // check_messages_from_workers(); on_tenant_socket_epoll_event(&epoll_events[i]); break; case EPOLL_TAG_HTTP_SESSION_CLIENT_SOCKET: diff --git a/runtime/src/local_cleanup_queue.c b/runtime/src/local_cleanup_queue.c index 1587c5b01..0240a7fe5 100644 --- a/runtime/src/local_cleanup_queue.c +++ b/runtime/src/local_cleanup_queue.c @@ -5,7 +5,7 @@ /* Must be the same alignment as sandbox structs because of how the ps_list macros work */ thread_local static struct ps_list_head local_cleanup_queue PAGE_ALIGNED; - +thread_local size_t local_cleanup_queue_size = 0; void local_cleanup_queue_initialize() @@ -29,6 +29,7 @@ local_cleanup_queue_add(struct sandbox *sandbox) assert(sandbox); assert(ps_list_singleton_d(sandbox)); ps_list_head_append_d(&local_cleanup_queue, sandbox); + local_cleanup_queue_size++; assert(!local_cleanup_queue_is_empty()); } @@ -42,10 +43,13 @@ local_cleanup_queue_free() { struct sandbox *sandbox_iterator = NULL; struct sandbox *buffer = NULL; + // if (local_cleanup_queue_size > 4) debuglog("Cleanup Queue Size: %lu", local_cleanup_queue_size); ps_list_foreach_del_d(&local_cleanup_queue, sandbox_iterator, buffer) { + assert(local_cleanup_queue_size > 0); ps_list_rem_d(sandbox_iterator); sandbox_free(sandbox_iterator); + local_cleanup_queue_size--; } } diff --git a/runtime/src/local_runqueue_minheap.c b/runtime/src/local_runqueue_minheap.c index 7d4c31266..f9d561a5f 100644 --- a/runtime/src/local_runqueue_minheap.c +++ b/runtime/src/local_runqueue_minheap.c @@ -14,6 +14,8 @@ thread_local static struct priority_queue *local_runqueue_minheap; +thread_local static int max_local_runqueue_len = 0; ////////// + /** * Checks if the run queue is empty * @returns true if empty. false otherwise @@ -40,6 +42,11 @@ local_runqueue_minheap_add(struct sandbox *sandbox) return_code = priority_queue_enqueue_nolock(local_runqueue_minheap, sandbox); if (unlikely(return_code == -ENOSPC)) panic("Thread Runqueue is full!\n"); } + + if(priority_queue_length_nolock(local_runqueue_minheap) > max_local_runqueue_len) { + max_local_runqueue_len = priority_queue_length_nolock(local_runqueue_minheap); + debuglog("Local MAX Queue Length: %u", max_local_runqueue_len); + } } /** diff --git a/runtime/src/local_runqueue_mtdbf.c b/runtime/src/local_runqueue_mtdbf.c new file mode 100644 index 000000000..733ab8e14 --- /dev/null +++ b/runtime/src/local_runqueue_mtdbf.c @@ -0,0 +1,124 @@ +#include +#include + +#include "arch/context.h" +#include "current_sandbox.h" +#include "debuglog.h" +#include "global_request_scheduler.h" +#include "local_runqueue.h" +#include "local_runqueue_mtdbf.h" +#include "panic.h" +#include "priority_queue.h" +#include "sandbox_functions.h" +#include "runtime.h" +#include "dbf.h" + +thread_local struct priority_queue *local_runqueue_mtdbf; +// thread_local struct priority_queue *local_default_queue; + +thread_local static int max_local_runqueue_len = 0; ////////// + +/** + * Checks if the run queue is empty + * @returns true if empty. false otherwise + */ +bool +local_runqueue_mtdbf_is_empty() +{ + return priority_queue_length_nolock(local_runqueue_mtdbf) == 0; +} + +/** + * Adds a sandbox to the run queue + * @param sandbox + * @returns pointer to sandbox added + */ +void +local_runqueue_mtdbf_add(struct sandbox *sandbox) +{ + assert(sandbox != NULL); + + int rc = priority_queue_enqueue_nolock(local_runqueue_mtdbf, sandbox); + if (unlikely(rc == -ENOSPC)) { + struct priority_queue *temp = priority_queue_grow_nolock(local_runqueue_mtdbf); + if (unlikely(temp == NULL)) panic("Failed to grow local runqueue\n"); + local_runqueue_mtdbf = temp; + rc = priority_queue_enqueue_nolock(local_runqueue_mtdbf, sandbox); + if (unlikely(rc == -ENOSPC)) panic("Thread Runqueue is full!\n"); + } + + // if (sandbox->global_queue_type == 2) { + // rc = priority_queue_enqueue_nolock(local_default_queue, sandbox); + // assert(rc == 0); + // } + + sandbox->owned_worker_idx = worker_thread_idx; + + if(priority_queue_length_nolock(local_runqueue_mtdbf) > max_local_runqueue_len) { + max_local_runqueue_len = priority_queue_length_nolock(local_runqueue_mtdbf); + debuglog("Local MAX Queue Length: %u", max_local_runqueue_len); + } +} + +/** + * Deletes a sandbox from the runqueue + * @param sandbox to delete + */ +static void +local_runqueue_mtdbf_delete(struct sandbox *sandbox) +{ + assert(sandbox != NULL); + + priority_queue_delete_by_idx_nolock(local_runqueue_mtdbf, sandbox, sandbox->pq_idx_in_runqueue); + sandbox->owned_worker_idx = -2; + // if (sandbox->pq_idx_in_default_queue >= 1) { + // assert(sandbox->global_queue_type == 2 ); + // priority_queue_delete_by_idx_nolock(local_default_queue, sandbox, sandbox->pq_idx_in_default_queue); + // } +} + +/** + * This function determines the next sandbox to run. + * This is the head of the runqueue + * + * Execute the sandbox at the head of the thread local runqueue + * @return the sandbox to execute or NULL if none are available + */ +struct sandbox * +local_runqueue_mtdbf_get_next() +{ + /* Get the deadline of the sandbox at the head of the local request queue */ + struct sandbox *next = NULL; + int rc = priority_queue_top_nolock(local_runqueue_mtdbf, (void **)&next); + + if (rc == -ENOENT) return NULL; + + return next; +} + +// static inline void +// sandbox_update_pq_idx_in_default_queue(void *element, size_t idx) +// { +// assert(element); +// struct sandbox *sandbox = (struct sandbox *)element; +// sandbox->pq_idx_in_default_queue = idx; +// } + +/** + * Registers the PS variant with the polymorphic interface + */ +void +local_runqueue_mtdbf_initialize() +{ + /* Initialize local state */ + local_runqueue_mtdbf = priority_queue_initialize_new(RUNTIME_RUNQUEUE_SIZE, false, sandbox_get_priority_global, NULL, + sandbox_update_pq_idx_in_runqueue); + + /* Register Function Pointers for Abstract Scheduling API */ + struct local_runqueue_config config = { .add_fn = local_runqueue_mtdbf_add, + .is_empty_fn = local_runqueue_mtdbf_is_empty, + .delete_fn = local_runqueue_mtdbf_delete, + .get_next_fn = local_runqueue_mtdbf_get_next }; + + local_runqueue_initialize(&config); +} diff --git a/runtime/src/main.c b/runtime/src/main.c index ada0cc9ed..336dc5b65 100644 --- a/runtime/src/main.c +++ b/runtime/src/main.c @@ -31,7 +31,7 @@ /* Conditionally used by debuglog when NDEBUG is not set */ int32_t debuglog_file_descriptor = -1; -uint32_t runtime_first_worker_processor = 1; +uint32_t runtime_first_worker_processor = 2; uint32_t runtime_processor_speed_MHz = 0; uint32_t runtime_total_online_processors = 0; uint32_t runtime_worker_threads_count = 0; @@ -41,8 +41,11 @@ enum RUNTIME_SIGALRM_HANDLER runtime_sigalrm_handler = RUNTIME_SIGALRM_HANDLER_B bool runtime_preemption_enabled = true; bool runtime_worker_spinloop_pause_enabled = false; uint32_t runtime_quantum_us = 1000; /* 1ms */ +uint64_t runtime_quantum; /* cycles */ uint64_t runtime_boot_timestamp; +uint64_t runtime_max_deadline = 0L; pid_t runtime_pid = 0; +uint16_t extra_execution_slack_p = 0; /* percentile */ /** * Returns instructions on use of CLI if used incorrectly @@ -69,7 +72,7 @@ runtime_allocate_available_cores() /* If more than two cores are available, leave core 0 free to run OS tasks */ if (runtime_total_online_processors > 2) { - runtime_first_worker_processor = 2; + // runtime_first_worker_processor = 2; max_possible_workers = runtime_total_online_processors - 2; } else if (runtime_total_online_processors == 2) { runtime_first_worker_processor = 1; @@ -105,8 +108,12 @@ runtime_allocate_available_cores() static inline void runtime_get_processor_speed_MHz(void) { + // runtime_processor_speed_MHz = 2600; // nworkers=1 + // // runtime_processor_speed_MHz = 2893; // nworkers > 4 + // return; ////////////////////////// temp + char *proc_mhz_raw = getenv("SLEDGE_PROC_MHZ"); - FILE *cmd = NULL; + // FILE *cmd = NULL; if (proc_mhz_raw != NULL) { /* The case with manual override for the CPU freq */ @@ -121,7 +128,7 @@ runtime_get_processor_speed_MHz(void) awk '{ total += $4; count++ } END { print total/count }'", runtime_first_worker_processor + 1, runtime_first_worker_processor + runtime_worker_threads_count); - cmd = popen(command, "r"); + FILE *cmd = popen(command, "r"); if (unlikely(cmd == NULL)) goto err; char buff[16]; @@ -140,6 +147,7 @@ runtime_get_processor_speed_MHz(void) pretty_print_key_value("Worker CPU Freq", "%u MHz\n", runtime_processor_speed_MHz); done: + // pclose(cmd); return; err: goto done; @@ -223,7 +231,7 @@ runtime_configure() if (strcmp(sigalrm_policy, "BROADCAST") == 0) { runtime_sigalrm_handler = RUNTIME_SIGALRM_HANDLER_BROADCAST; } else if (strcmp(sigalrm_policy, "TRIAGED") == 0) { - if (unlikely(scheduler != SCHEDULER_EDF)) panic("triaged sigalrm handlers are only valid with EDF\n"); + // if (unlikely(scheduler != SCHEDULER_EDF)) panic("triaged sigalrm handlers are only valid with EDF\n"); runtime_sigalrm_handler = RUNTIME_SIGALRM_HANDLER_TRIAGED; } else { panic("Invalid sigalrm policy: %s. Must be {BROADCAST|TRIAGED}\n", sigalrm_policy); @@ -245,7 +253,17 @@ runtime_configure() panic("SLEDGE_QUANTUM_US must be less than 999999 ms, saw %ld\n", quantum); runtime_quantum_us = (uint32_t)quantum; } - pretty_print_key_value("Quantum", "%u us\n", runtime_quantum_us); + // runtime_quantum = runtime_quantum_us * runtime_processor_speed_MHz; + // pretty_print_key_value("Quantum", "%u us = %lu cycles\n", runtime_quantum_us, runtime_quantum); + + /* Extra execution slack percentile */ + char *extra_slack_raw = getenv("EXTRA_EXEC_PERCENTILE"); + if (extra_slack_raw != NULL) { + int extra_slack = atoi(extra_slack_raw); + if (unlikely(extra_slack < 0 || extra_slack > 50)) panic("EXTRA_EXEC_PERCENTILE must be between [0-50], saw %d\n", extra_slack); + extra_execution_slack_p = (uint16_t)extra_slack; + } + pretty_print_key_value("Extra Exec Slack", "%u%%\n", extra_execution_slack_p); sandbox_perf_log_init(); http_session_perf_log_init(); @@ -391,6 +409,12 @@ log_compiletime_config() #else pretty_print_key_disabled("Log Local Runqueue"); #endif + +if (USING_EARLIEST_START_FIRST) { + pretty_print_key_enabled("USING_EARLIEST_START_FIRST"); +} else { + pretty_print_key_disabled("USING_EARLIEST_START_FIRST"); +} } void @@ -491,6 +515,7 @@ main(int argc, char **argv) printf("Runtime Environment:\n"); runtime_set_resource_limits_to_max(); + runtime_set_policy_and_prio(); runtime_allocate_available_cores(); runtime_configure(); runtime_initialize(); @@ -500,6 +525,11 @@ main(int argc, char **argv) runtime_start_runtime_worker_threads(); runtime_get_processor_speed_MHz(); runtime_configure_worker_spinloop_pause(); + + runtime_quantum = runtime_quantum_us * runtime_processor_speed_MHz; + pretty_print_key_value("Quantum", "%u us = %lu cycles\n", runtime_quantum_us, runtime_quantum); + + // traffic_control_initialize(); software_interrupt_arm_timer(); #ifdef LOG_TENANT_LOADING @@ -524,11 +554,16 @@ main(int argc, char **argv) exit(-1); } + if (runtime_max_deadline < tenant->max_relative_deadline) runtime_max_deadline = tenant->max_relative_deadline; + /* Start listening for requests */ rc = tenant_listen(tenant); if (rc < 0) exit(-1); } - +#ifdef TRAFFIC_CONTROL + traffic_control_initialize(); + tenant_database_init_reservations(); +#endif runtime_boot_timestamp = __getcycles(); for (int tenant_idx = 0; tenant_idx < tenant_config_vec_len; tenant_idx++) { diff --git a/runtime/src/module.c b/runtime/src/module.c index 577e3050c..cab18ac4a 100644 --- a/runtime/src/module.c +++ b/runtime/src/module.c @@ -44,8 +44,9 @@ module_init(struct module *module, char *path) rc = sledge_abi_symbols_init(&module->abi, path); if (rc != 0) goto err; - module->pools = calloc((module->type == APP_MODULE ? runtime_worker_threads_count : 1), - sizeof(struct module_pool)); + const int n = module->type == APP_MODULE ? runtime_worker_threads_count : 1; + // module->pools = calloc(n, sizeof(struct module_pool)); + module->pools = calloc(1, sizeof(struct module_pool)); module->path = path; diff --git a/runtime/src/runtime.c b/runtime/src/runtime.c index 4acc18c8d..2a2134ac5 100644 --- a/runtime/src/runtime.c +++ b/runtime/src/runtime.c @@ -10,10 +10,13 @@ #include #include "admissions_control.h" +#include "traffic_control.h" #include "arch/context.h" #include "debuglog.h" #include "global_request_scheduler_deque.h" #include "global_request_scheduler_minheap.h" +#include "global_request_scheduler_mtds.h" +#include "global_request_scheduler_mtdbf.h" #include "http_parser_settings.h" #include "listener_thread.h" #include "module.h" @@ -32,6 +35,9 @@ int *runtime_worker_threads_argument; /* The active deadline of the sandbox running on each worker thread */ uint64_t *runtime_worker_threads_deadline; +/* Tracks alive sandboxes */ +bool sandbox_refs[RUNTIME_MAX_ALIVE_SANDBOXES] = { false }; + /****************************************** * Shared Process / Listener Thread Logic * *****************************************/ @@ -197,3 +203,35 @@ runtime_set_prio(unsigned int nice) return; } + +void +runtime_set_policy_and_prio() +{ + if (geteuid() != 0) { + printf("Won't set the priority for sledgert. Run with sudo again.\n"); + return; + } + + // int which = PRIO_PROCESS; // You can also use PRIO_PGRP or PRIO_USER + // int nice_value = -20; // Adjust the nice value as needed + + // if (setpriority(which, getpid(), nice_value) == -1) { + // perror("setpriority"); + // } + + const int FIFO_PRIO = 1; //sched_get_priority_max(SCHED_FIFO); + struct sched_param sp; + + // Set the scheduling policy to SCHED_FIFO + sp.sched_priority = FIFO_PRIO; + + int rc = sched_setscheduler(getpid(), SCHED_FIFO, &sp); + if (rc != 0) { + panic("sched_setscheduler error. Return code: %d", rc); + } + + if (sched_getparam(0, &sp) < 0) { perror("getparam: "); } + assert(sp.sched_priority == FIFO_PRIO); + + printf("Set sched for sledgert to FIFO. Prio=%d\n", FIFO_PRIO); +} \ No newline at end of file diff --git a/runtime/src/sandbox.c b/runtime/src/sandbox.c index 6c9cbe12c..8150c459c 100644 --- a/runtime/src/sandbox.c +++ b/runtime/src/sandbox.c @@ -2,6 +2,7 @@ #include #include +#include "sandbox_types.h" #include "current_sandbox.h" #include "debuglog.h" #include "panic.h" @@ -38,6 +39,10 @@ sandbox_allocate_linear_memory(struct sandbox *sandbox) sandbox->memory = module_allocate_linear_memory(sandbox->module); if (unlikely(sandbox->memory == NULL)) return -1; + // sandbox->sizes[sandbox->sizesize] = sandbox->memory->abi.size; + // sandbox->sizesize++; + sandbox->memory->abi.id = sandbox->id; + return 0; } @@ -77,9 +82,22 @@ sandbox_free_stack(struct sandbox *sandbox) { assert(sandbox); - return module_free_stack(sandbox->module, sandbox->stack); + return module_free_stack(sandbox->module, sandbox->stack, sandbox->original_owner_worker_idx); } +// /** +// * Free Linear Memory, leaving stack in place +// * @param sandbox +// */ +// static inline void +// sandbox_free_linear_memory(struct sandbox *sandbox) +// { +// assert(sandbox != NULL); +// assert(sandbox->memory != NULL); +// module_free_linear_memory(sandbox->module, (struct wasm_memory *)sandbox->memory); +// sandbox->memory = NULL; +// } + /** * Allocates HTTP buffers and performs our approximation of "WebAssembly instantiation" * @param sandbox @@ -129,15 +147,15 @@ sandbox_prepare_execution_environment(struct sandbox *sandbox) err_memory_allocation_failed: err_globals_allocation_failed: err_http_allocation_failed: - sandbox_set_as_error(sandbox, SANDBOX_ALLOCATED); + sandbox_set_as_error(sandbox, SANDBOX_INITIALIZED); + sandbox_free(sandbox); perror(error_message); rc = -1; goto done; } void -sandbox_init(struct sandbox *sandbox, struct module *module, struct http_session *session, struct route *route, - struct tenant *tenant, uint64_t admissions_estimate) +sandbox_init(struct sandbox *sandbox, struct module *module, struct http_session *session, uint64_t admissions_estimate) { /* Sets the ID to the value before the increment */ sandbox->id = sandbox_total_postfix_increment(); @@ -150,12 +168,19 @@ sandbox_init(struct sandbox *sandbox, struct module *module, struct http_session /* Allocate HTTP session structure */ assert(session); sandbox->http = session; - sandbox->tenant = tenant; - sandbox->route = route; + sandbox->tenant = session->tenant; + sandbox->route = session->route; sandbox->absolute_deadline = sandbox->timestamp_of.allocation + sandbox->route->relative_deadline; sandbox->payload_size = session->http_request.body_length; + sandbox->exceeded_estimation = false; + sandbox->writeback_preemption_in_progress = false; + sandbox->writeback_overshoot_in_progress = false; + sandbox->response_code = 0; + sandbox->owned_worker_idx = -2; + sandbox->original_owner_worker_idx = -2; + /* * Admissions Control State * Assumption: an estimate of 0 should have been interpreted as a rejection @@ -176,8 +201,7 @@ sandbox_init(struct sandbox *sandbox, struct module *module, struct http_session * @return the new sandbox request */ struct sandbox * -sandbox_alloc(struct module *module, struct http_session *session, struct route *route, struct tenant *tenant, - uint64_t admissions_estimate) +sandbox_alloc(struct module *module, struct http_session *session, uint64_t admissions_estimate, uint64_t sandbox_alloc_timestamp) { size_t alignment = (size_t)PAGE_SIZE; size_t size_to_alloc = (size_t)round_up_to_page(sizeof(struct sandbox)); @@ -190,13 +214,35 @@ sandbox_alloc(struct module *module, struct http_session *session, struct route if (unlikely(sandbox == NULL)) return NULL; memset(sandbox, 0, size_to_alloc); + sandbox->timestamp_of.allocation = sandbox_alloc_timestamp; sandbox_set_as_allocated(sandbox); - sandbox_init(sandbox, module, session, route, tenant, admissions_estimate); + sandbox_init(sandbox, module, session, admissions_estimate); + sandbox_refs[sandbox->id % RUNTIME_MAX_ALIVE_SANDBOXES] = true; return sandbox; } +struct sandbox_metadata *sandbox_meta_alloc(struct sandbox *sandbox) +{ + struct sandbox_metadata *sandbox_meta = malloc(sizeof(struct sandbox_metadata)); + + sandbox_meta->sandbox_shadow = sandbox; + sandbox_meta->tenant = sandbox->tenant; + sandbox_meta->route = sandbox->route; + sandbox_meta->id = sandbox->id; + sandbox_meta->state = sandbox->state; + sandbox_meta->allocation_timestamp = sandbox->timestamp_of.allocation; + sandbox_meta->absolute_deadline = sandbox->absolute_deadline; + sandbox_meta->remaining_exec = sandbox->remaining_exec; + sandbox_meta->exceeded_estimation = sandbox->exceeded_estimation; + sandbox_meta->owned_worker_idx = worker_thread_idx; + sandbox_meta->terminated = false; + sandbox_meta->pq_idx_in_tenant_queue = 0; + + return sandbox_meta; +} + void sandbox_deinit(struct sandbox *sandbox) { @@ -210,8 +256,9 @@ sandbox_deinit(struct sandbox *sandbox) module_release(sandbox->module); /* Linear Memory and Guard Page should already have been munmaped and set to NULL */ - assert(sandbox->memory == NULL); + // assert(sandbox->memory == NULL); + if (likely(sandbox->memory != NULL)) sandbox_free_linear_memory(sandbox); if (likely(sandbox->stack != NULL)) sandbox_free_stack(sandbox); if (likely(sandbox->globals.buffer != NULL)) sandbox_free_globals(sandbox); if (likely(sandbox->wasi_context != NULL)) wasi_context_destroy(sandbox->wasi_context); @@ -227,7 +274,9 @@ sandbox_free(struct sandbox *sandbox) assert(sandbox != NULL); assert(sandbox != current_sandbox_get()); assert(sandbox->state == SANDBOX_ERROR || sandbox->state == SANDBOX_COMPLETE); + assert(!listener_thread_is_running() || sandbox->memory == NULL); + sandbox_refs[sandbox->id % RUNTIME_MAX_ALIVE_SANDBOXES] = false; sandbox_deinit(sandbox); free(sandbox); } diff --git a/runtime/src/scheduler.c b/runtime/src/scheduler.c index e6c67b135..92d963249 100644 --- a/runtime/src/scheduler.c +++ b/runtime/src/scheduler.c @@ -1,3 +1,172 @@ #include "scheduler.h" enum SCHEDULER scheduler = SCHEDULER_EDF; + +void +sandbox_process_scheduler_updates(struct sandbox *sandbox) +{ + if (scheduler == SCHEDULER_MTDS && tenant_is_paid(sandbox->tenant)) { + atomic_fetch_sub(&sandbox->tenant->remaining_budget, sandbox->last_running_state_duration); + sandbox->last_running_state_duration = 0; + return; + } + +#ifdef TRAFFIC_CONTROL + assert(sandbox->sandbox_meta); + assert(sandbox == sandbox->sandbox_meta->sandbox_shadow); + assert(sandbox->id == sandbox->sandbox_meta->id); + + struct comm_with_worker *cfw = &comm_from_workers[worker_thread_idx]; + assert(cfw); + + const uint64_t now = __getcycles(); + + struct message new_message = { + .sandbox = sandbox, + .sandbox_id = sandbox->id, + .sandbox_meta = sandbox->sandbox_meta, + .state = sandbox->state, + .sender_worker_idx = worker_thread_idx, + .exceeded_estimation = sandbox->exceeded_estimation, + .total_running_duration = 0, + .timestamp = now + }; + + if (sandbox->state == SANDBOX_RETURNED || sandbox->state == SANDBOX_ERROR) { + uint64_t adjustment = sandbox->last_running_state_duration; + if (sandbox->remaining_exec < adjustment) adjustment = sandbox->remaining_exec; + // const uint64_t adjustment = sandbox->remaining_exec; + + if (USING_LOCAL_RUNQUEUE && adjustment > 0 && sandbox->response_code == 0) { + // dbf_try_update_demand(worker_dbf, sandbox->timestamp_of.dispatched, + // sandbox->route->relative_deadline, sandbox->absolute_deadline, sandbox->remaining_exec, + // DBF_DELETE_EXISTING_DEMAND, NULL, NULL); + } + + // sandbox->remaining_exec = 0; + + new_message.message_type = MESSAGE_CFW_DELETE_SANDBOX; + new_message.adjustment = adjustment; + // new_message.remaining_exec = 0; + new_message.remaining_exec = sandbox->remaining_exec; + new_message.total_running_duration = sandbox->duration_of_state[SANDBOX_RUNNING_USER] + sandbox->duration_of_state[SANDBOX_RUNNING_SYS]; + + if (!ck_ring_enqueue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + panic("Ring The buffer was full and the enqueue operation has failed.!"); + } + + return; + } + + /* Unless the sandbox is in the terminal state (handled above), then the only state it can be is INTERRUPTED */ + assert(sandbox->state == SANDBOX_INTERRUPTED); + assert(sandbox == current_sandbox_get()); + assert(sandbox->response_code == 0); + assert(sandbox->remaining_exec > 0); + assert(!sandbox->exceeded_estimation || sandbox->remaining_exec == runtime_quantum); + + if (sandbox->sandbox_meta->terminated) { + assert(sandbox->sandbox_meta->error_code > 0); + // dbf_try_update_demand(worker_dbf, sandbox->timestamp_of.dispatched, + // sandbox->route->relative_deadline, sandbox->absolute_deadline, sandbox->remaining_exec, + // DBF_DELETE_EXISTING_DEMAND, NULL, NULL); + sandbox->response_code = sandbox->sandbox_meta->error_code; + interrupted_sandbox_exit(); + return; + } + + if (sandbox->absolute_deadline < now + (!sandbox->exceeded_estimation ? sandbox->remaining_exec : 0)) { + // dbf_try_update_demand(worker_dbf, sandbox->timestamp_of.dispatched, + // sandbox->route->relative_deadline, sandbox->absolute_deadline, sandbox->remaining_exec, + // DBF_DELETE_EXISTING_DEMAND, NULL, NULL); + sandbox->response_code = 4081; + interrupted_sandbox_exit(); + return; + } + + dbf_update_mode_t dbf_reduce_mode = DBF_REDUCE_EXISTING_DEMAND; + uint64_t adjustment = sandbox->last_running_state_duration; + if (sandbox->remaining_exec < sandbox->last_running_state_duration || sandbox->exceeded_estimation) { + /* To avoid less than quantum updates manually set the adjustment to quantum */ + adjustment = sandbox->remaining_exec; + dbf_reduce_mode = DBF_DELETE_EXISTING_DEMAND; + } + + sandbox->last_running_state_duration = 0; + sandbox->remaining_exec -= adjustment; + + new_message.adjustment = adjustment; + new_message.message_type = MESSAGE_CFW_REDUCE_DEMAND; + new_message.remaining_exec = sandbox->remaining_exec; + + if (USING_LOCAL_RUNQUEUE /* && !sandbox->exceeded_estimation */) { + // dbf_try_update_demand(worker_dbf, sandbox->timestamp_of.dispatched, + // sandbox->route->relative_deadline, sandbox->absolute_deadline, adjustment, + // dbf_reduce_mode, NULL, NULL); + } + + if (!ck_ring_enqueue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + panic("Ring The buffer was full and the enqueue operation has failed.!") + } + + if (sandbox->remaining_exec == 0) { + /* OVERSHOOT case! */ + // printf("Went over estimation - sandbox_id=%lu of %s!\n", sandbox->id, sandbox->tenant->name); + if (sandbox->exceeded_estimation == false) sandbox->tenant->num_of_overshooted_sandboxes++; + sandbox->exceeded_estimation = true; + sandbox->num_of_overshoots++; + if (sandbox->num_of_overshoots > sandbox->tenant->max_overshoot_of_same_sandbox) { + sandbox->tenant->max_overshoot_of_same_sandbox = sandbox->num_of_overshoots; + } + + const uint64_t extra_demand = runtime_quantum; + + if (USING_LOCAL_RUNQUEUE && USING_TRY_LOCAL_EXTRA + /*&& dbf_try_update_demand(worker_dbf, now, sandbox->route->relative_deadline, + sandbox->absolute_deadline, extra_demand, DBF_CHECK_AND_ADD_DEMAND, &new_message, NULL)*/ + || (!USING_LOCAL_RUNQUEUE && USING_TRY_LOCAL_EXTRA)) { + /* Worker DBF has supply left */ + // printf("Worker %d granted extra for sandbox %lu!\n", worker_thread_idx, sandbox->id); + + sandbox->remaining_exec = extra_demand; + + new_message.adjustment = extra_demand; + new_message.exceeded_estimation = true; + new_message.message_type = MESSAGE_CFW_EXTRA_DEMAND_REQUEST; + new_message.remaining_exec = extra_demand; + + if (!ck_ring_enqueue_spsc_message(&cfw->worker_ring, cfw->worker_ring_buffer, &new_message)) { + panic("Ring The buffer was full and the enqueue operation has failed.!") + } + + return; + } else if (USING_WRITEBACK_FOR_OVERSHOOT) { + /* Write back */ + // printf("No supply left in worker #%d. So, writeback sandbox=%lu of %s\n", worker_thread_idx, sandbox->id, sandbox->tenant->name); + + sandbox->remaining_exec = 0; + sandbox->writeback_overshoot_in_progress= true; + local_runqueue_delete(sandbox); // TODO: This needs to go in preemp_sandbox state change! + return; + } else { + /* Kill work */ + // printf("No supply left in worker #%d. So, kill sandbox=%lu of %s\n", worker_thread_idx, sandbox->id, sandbox->tenant->name); + + assert(sandbox->response_code == 0); + sandbox->response_code = 4093; + interrupted_sandbox_exit(); + return; + } + } + +#else + + if (sandbox->remaining_exec > sandbox->last_running_state_duration) { + sandbox->remaining_exec -= sandbox->last_running_state_duration; + } else { + sandbox->remaining_exec = 0; + } + sandbox->last_running_state_duration = 0; + +#endif +} diff --git a/runtime/src/sledge_abi.c b/runtime/src/sledge_abi.c index 63a1fe8b5..095a954ab 100644 --- a/runtime/src/sledge_abi.c +++ b/runtime/src/sledge_abi.c @@ -43,14 +43,25 @@ check_bounds(uint32_t offset, uint32_t bounds_check) EXPORT int32_t sledge_abi__wasm_memory_expand(struct sledge_abi__wasm_memory *wasm_memory, uint32_t page_count) { + uint64_t oldsize = wasm_memory->size; struct sandbox *sandbox = current_sandbox_get(); +assert(sandbox->sandbox_meta); +if (!(sandbox->id == wasm_memory->id)) fprintf(stderr, "sand_id: %lu, wasm_id: %lu, terminated: %u, orig_idx: %d, owner_wrk; %d, wrk: %d\n", sandbox->id, wasm_memory->id, sandbox->sandbox_meta->terminated, sandbox->original_owner_worker_idx, sandbox->owned_worker_idx, worker_thread_idx); +assert(sandbox->id == wasm_memory->id); + +// if (!(sandbox->memory->abi.size == wasm_memory->size)) printf("sand_memsize: %lu, wasm_size: %lu, wasm_oldsize: %lu, targetsize: %lu\n", sandbox->memory->abi.size, wasm_memory->size, oldsize, page_count * WASM_PAGE_SIZE); +// assert(sandbox->memory->abi.size == wasm_memory->size); + +if (sandbox->state != SANDBOX_RUNNING_USER) panic ("state!!! %u\n", sandbox->state); + sandbox_syscall(sandbox); int32_t old_page_count = wasm_memory->size / WASM_PAGE_SIZE; int rc = wasm_memory_expand((struct wasm_memory *)wasm_memory, page_count * WASM_PAGE_SIZE); if (unlikely(rc == -1)) { old_page_count = -1; + assert(0); goto DONE; } @@ -58,6 +69,13 @@ sledge_abi__wasm_memory_expand(struct sledge_abi__wasm_memory *wasm_memory, uint * the original struct as well */ current_sandbox_memory_writeback(); + + + // if (!(sandbox->memory->abi.size == wasm_memory->size)) printf("sand_memsize: %lu, wasm_size: %lu, wasm_oldsize: %lu, targetsize: %lu\n", sandbox->memory->abi.size, wasm_memory->size, oldsize, page_count * WASM_PAGE_SIZE); + // assert(sandbox->memory->abi.size == wasm_memory->size); + // sandbox->sizes[sandbox->sizesize] = wasm_memory->size + page_count * WASM_PAGE_SIZE; + // sandbox->sizesize++; + #ifdef LOG_SANDBOX_MEMORY_PROFILE // Cache the runtime of the first N page allocations for (int i = 0; i < page_count; i++) { diff --git a/runtime/src/software_interrupt.c b/runtime/src/software_interrupt.c index 14c1ab1d9..4c4c206bf 100644 --- a/runtime/src/software_interrupt.c +++ b/runtime/src/software_interrupt.c @@ -179,6 +179,7 @@ software_interrupt_handle_signals(int signal_type, siginfo_t *signal_info, void atomic_fetch_sub(&handler_depth, 1); current_sandbox_trap(WASM_TRAP_OUT_OF_BOUNDS_LINEAR_MEMORY); } else { + assert(0); panic("Runtime SIGSEGV\n"); } diff --git a/runtime/src/tenant_database.c b/runtime/src/tenant_database.c index 2c236712d..56ac6cf56 100644 --- a/runtime/src/tenant_database.c +++ b/runtime/src/tenant_database.c @@ -3,6 +3,8 @@ #include "panic.h" #include "runtime.h" #include "tenant.h" +#include "panic.h" +#include "tenant_functions.h" /******************* * Tenant Database * @@ -35,7 +37,6 @@ tenant_database_add(struct tenant *tenant) goto done; } - /** * Given a name, find the associated tenant * @param name @@ -102,3 +103,138 @@ tenant_database_foreach(void (*cb)(struct tenant *, void *), void *arg) cb(tenant_database[i], arg); } } + +#ifdef TRAFFIC_CONTROL +void +tenant_database_init_reservations() +{ + printf("Runtime Max Deadline: %lu\n", runtime_max_deadline); + + for (size_t i = 0; i < tenant_database_count; i++) { + assert(tenant_database[i]); + struct tenant *t = tenant_database[i]; + if (t->tcp_server.port == 55555) continue; + + t->trs.max_budget_guaranteed = REPLENISHMENT_PERIOD * runtime_worker_threads_count * t->reservation_percentile / 100; + t->trs.budget_guaranteed = t->trs.max_budget_guaranteed; + t->trs.budget_best = UINT64_MAX; + + printf("Tenant %s, max_deadline: %lu, max_budget: %ld\n", t->name, t->max_relative_deadline, t->trs.max_budget_guaranteed); + } +} + +/** + * @brief Iterate through the tenant databse and print DBF info per tenant + */ +void +tenant_database_print_reservations() +{ + for (size_t i = 0; i < tenant_database_count; i++) { + assert(tenant_database[i]); + struct tenant *t = tenant_database[i]; + if (t->tcp_server.port == 55555) continue; + + printf("\nTENANT: %s INFO:\n", t->name); + printf("Global_meta_size: %d, Local_meta_size: %d\n", priority_queue_length_nolock(t->global_sandbox_metas), priority_queue_length_nolock(t->local_sandbox_metas)); + printf("Number of total overshoots: %u, MAX of overshoots from the same sandbox: %u \n", t->num_of_overshooted_sandboxes, t->max_overshoot_of_same_sandbox); + // printf("Best Effort demands: %lu\n", t->trs.best_effort_cycles); + // dbf_print(t->tenant_dbf, __getcycles()); + + tenant_print_jobs(t); + } +} + +/** + * Checks is an opaque pointer is a tenant by comparing against + */ +struct tenant * +tenant_database_find_tenant_most_oversupply(struct tenant *tenant_to_exclude, uint64_t time_of_oversupply, bool weak_shed, struct sandbox_metadata **sandbox_meta_to_remove) +{ + assert(sandbox_meta_to_remove != NULL); + struct tenant *tenant_to_punish = NULL; + uint64_t min_tenant_BE_budget = UINT64_MAX; + + for (size_t i = 0; i < tenant_database_count; i++) { + assert(tenant_database[i]); + // if (tenant_database[i] == tenant_to_exclude) continue; + struct tenant *tenant = tenant_database[i]; + assert(tenant); + if (tenant->tcp_server.port == 55555) continue; + if (priority_queue_length_nolock(tenant->global_sandbox_metas) + priority_queue_length_nolock(tenant->local_sandbox_metas) == 0) continue; + + struct sandbox_metadata *sandbox_meta = NULL; + int rc = priority_queue_top_nolock(tenant->global_sandbox_metas, (void **)&sandbox_meta); + + if (!sandbox_meta || sandbox_meta->absolute_deadline > time_of_oversupply) { + sandbox_meta = NULL; + rc = priority_queue_top_nolock(tenant->local_sandbox_metas, (void **)&sandbox_meta); + } + if (!sandbox_meta || sandbox_meta->absolute_deadline > time_of_oversupply) continue; + assert(rc == 0); + assert(sandbox_meta); + + if (tenant->trs.budget_best < min_tenant_BE_budget) { + min_tenant_BE_budget = tenant->trs.budget_best; + tenant_to_punish = tenant; + *sandbox_meta_to_remove = sandbox_meta; + } + } + +/* + if(weak_shed && tenant_to_punish == NULL) printf("Weak mode: No tenant to punish for %s\n", tenant_to_exclude->name); + if(!weak_shed && tenant_to_punish == NULL) printf("Strong mode: No tenant to punish for %s\n", tenant_to_exclude->name); + + if (weak_shed && tenant_to_punish) { + assert(tenant_to_punish->reservation_percentile==20); + printf("MODE weak=%u - pending tenant %s \n", weak_shed, tenant_to_exclude->name); + printf("Start (ms): %lu\n", start_time); + printf("AbsDL (ms): %lu\n", absolute_deadline); + printf("ToS (ms): %lu\n", time_of_oversupply); + printf("RelativeDL (ms): %lu\n", absolute_deadline/runtime_quantum - start_time/runtime_quantum); + + min_tenant_BE_budget = UINT64_MAX; + for (size_t i = 0; i < tenant_database_count; i++) { + assert(tenant_database[i]); + struct tenant *tenant = tenant_database[i]; + assert(tenant); + if (tenant->tcp_server.port == 55555) continue; + + uint64_t t_budget_BE = tenant->trs.budget_BE; + if (t_budget_BE < min_tenant_BE_budget) { + min_tenant_BE_budget = t_budget_BE; + tenant_to_punish = tenant; + } + + printf("Tenant: %s, rp=%u, min_tenant_BE_budget=%lu\n", tenant->name, + tenant->reservation_percentile, min_tenant_BE_budget); + tenant_print_jobs(tenant); + printf("Tenant Globl SIZE: %d\n", priority_queue_length_nolock(tenant->global_sandbox_metas)); + printf("Tenant Local SIZE: %d\n\n", priority_queue_length_nolock(tenant->local_sandbox_metas)); + } + + const int N_VIRT_WORKERS_DBF = USING_AGGREGATED_GLOBAL_DBF ? 1 : runtime_worker_threads_count; + for (int i = 0; i < N_VIRT_WORKERS_DBF; i++) { + printf("GL Worker #%d\n", i); + dbf_print(global_virt_worker_dbfs[i], start_time); + } + assert(0); + }*/ + assert((*sandbox_meta_to_remove)==NULL || (*sandbox_meta_to_remove)->tenant == tenant_to_punish); + return tenant_to_punish; +} + +void +tenant_database_replenish_all() +{ + const uint64_t now = __getcycles(); + + for (size_t i = 0; i < tenant_database_count; i++) { + assert(tenant_database[i]); + struct tenant *t = tenant_database[i]; + if (t->tcp_server.port == 55555) continue; + + tenant_replenish(t, now); + } +} + +#endif \ No newline at end of file diff --git a/runtime/src/traffic_control.c b/runtime/src/traffic_control.c new file mode 100644 index 000000000..6953f5f6e --- /dev/null +++ b/runtime/src/traffic_control.c @@ -0,0 +1,254 @@ +#include + +#include "traffic_control.h" +#include "debuglog.h" +#include "global_request_scheduler_mtdbf.h" +#include "tenant_functions.h" +#include "sandbox_set_as_error.h" +#include "dbf.h" + +#ifdef TRAFFIC_CONTROL +// void *global_dbf; +void **global_virt_worker_dbfs; +void *global_worker_dbf; // temp /////////// + +extern struct priority_queue *global_request_scheduler_mtdbf;//, *global_default; +extern lock_t global_lock; + +void +traffic_control_initialize() +{ + assert(runtime_max_deadline > 0); + + const int N_VIRT_WORKERS_DBF = USING_AGGREGATED_GLOBAL_DBF ? 1 : runtime_worker_threads_count; + global_virt_worker_dbfs = malloc(N_VIRT_WORKERS_DBF * sizeof(void*)); + for (int i = 0; i < N_VIRT_WORKERS_DBF; i++) { + global_virt_worker_dbfs[i] = dbf_initialize(runtime_worker_threads_count/N_VIRT_WORKERS_DBF, 100, -1, NULL); + } + +} + +void +traffic_control_log_decision(const int num, const bool admitted) +{ +#ifdef LOG_TRAFFIC_CONTROL + debuglog("Admission case #: %d, Admitted? %s\n", num, admitted ? "yes" : "no"); +#endif /* LOG_TRAFFIC_CONTROL */ +} +int ind = 0; +int +global_virt_worker_dbfs_try_update_demand(uint64_t start_time, uint64_t adjustment, uint64_t *time_oversupply_p, struct sandbox_metadata *sm) +{ + bool global_can_admit = false; + uint64_t time_oversupply = 0; + const uint64_t absolute_deadline = sm->absolute_deadline; + const int N_VIRT_WORKERS_DBF = USING_AGGREGATED_GLOBAL_DBF ? 1 : runtime_worker_threads_count; + + /* Hack the start time to make sure demand less than the quantum is also served */ + if((absolute_deadline - start_time) * N_VIRT_WORKERS_DBF < runtime_quantum) start_time = absolute_deadline - runtime_quantum; + + for (int i = ind; i < (N_VIRT_WORKERS_DBF) + ind; i++) { + assert(global_virt_worker_dbfs); + void *global_dbf = global_virt_worker_dbfs[i%N_VIRT_WORKERS_DBF]; + global_can_admit = dbf_list_try_add_new_demand(global_dbf, start_time, absolute_deadline, adjustment, sm); + if (global_can_admit) { + ind = (i+1)%N_VIRT_WORKERS_DBF; + return i%N_VIRT_WORKERS_DBF; + } + + if (time_oversupply < dbf_get_time_of_oversupply(global_dbf)) time_oversupply = dbf_get_time_of_oversupply(global_dbf); + } + + *time_oversupply_p = time_oversupply; + return -1; +} + +uint64_t +traffic_control_decide(struct sandbox_metadata *sandbox_meta, const uint64_t start_time, const uint64_t estimated_execution, int *ret_code, int *worker_id_virtual) +{ + /* Nominal non-zero value in case traffic control is disabled */ + uint64_t work_admitted = estimated_execution; + + int rc = 0; + int worker_id_v = -1; + + assert(sandbox_meta); + struct tenant *tenant = sandbox_meta->tenant; + const uint64_t absolute_deadline = sandbox_meta->absolute_deadline; + + uint64_t time_global_oversupply = 0; + worker_id_v = global_virt_worker_dbfs_try_update_demand(start_time, estimated_execution, &time_global_oversupply, sandbox_meta); + bool global_can_admit = worker_id_v >= 0; + + // bool tenant_can_admit = tenant_try_add_job(tenant, start_time, estimated_execution, TRS_CHECK_GUARANTEED, sandbox_meta); + bool tenant_can_admit = tenant_can_admit_guaranteed(tenant, start_time, estimated_execution); + + if (tenant_can_admit && global_can_admit) { + /* Case #1: Both the tenant and overall system is under utlized. So, just admit. */ + tenant_can_admit = tenant_try_add_job_as_guaranteed(tenant, start_time, estimated_execution, sandbox_meta); + assert(tenant_can_admit); + traffic_control_log_decision(1, true); + rc = 1; + } else if (!tenant_can_admit && global_can_admit) { + /* Case #2: Tenant is over utilized, but system is under utilized. So, admit for work-conservation. */ + if (USING_WORK_CONSERVATION == false) { + traffic_control_log_decision(2, false); + dbf_try_update_demand(global_virt_worker_dbfs[worker_id_v], start_time, + 0, absolute_deadline, estimated_execution, + DBF_DELETE_EXISTING_DEMAND, NULL, sandbox_meta); + goto any_work_not_admitted; + } + + traffic_control_log_decision(2, true); + rc = 2; + } else if (tenant_can_admit && !global_can_admit) { + /* Case #3: Tenant is under utilized, but system is over utilized. So, shed work and then admit. */ + assert(time_global_oversupply >= absolute_deadline); + + int worker_id_virt_just_shed; + while (!global_can_admit) { + assert(worker_id_v < 0); + + worker_id_virt_just_shed = -1; + uint64_t cleared_demand = traffic_control_shed_work(tenant, time_global_oversupply, &worker_id_virt_just_shed, false); + if (cleared_demand == 0) { + /* No "bad" tenant requests left in the global queue, so we have deny the guaranteed tenant job. */ + traffic_control_log_decision(3, false); + goto guaranteed_work_not_admitted; + } + + assert(worker_id_virt_just_shed >= 0); + void *global_dbf = global_virt_worker_dbfs[worker_id_virt_just_shed]; + global_can_admit = dbf_list_try_add_new_demand(global_dbf, start_time, absolute_deadline, estimated_execution, sandbox_meta); + time_global_oversupply = dbf_get_time_of_oversupply(global_dbf); + } + + worker_id_v = worker_id_virt_just_shed; + tenant_can_admit = tenant_try_add_job_as_guaranteed(tenant, start_time, estimated_execution, sandbox_meta); + assert(tenant_can_admit); + traffic_control_log_decision(3, true); + rc = 1; + } else if (!tenant_can_admit && !global_can_admit) { + /* Case #4: Do NOT admit. */ + + // printf("Case #4: Do NOT admit.\n"); + // traffic_control_log_decision(4, false); + // goto any_work_not_admitted; + + // assert(time_global_oversupply >= absolute_deadline); + + int worker_id_virt_just_shed; + while (!global_can_admit) { + assert(worker_id_v < 0); + + worker_id_virt_just_shed = -1; + + uint64_t cleared_demand = traffic_control_shed_work(tenant, time_global_oversupply, &worker_id_virt_just_shed, true); + if (cleared_demand == 0) { + /* No "bad" tenant requests left in the global queue, so we have deny this new job. */ + traffic_control_log_decision(4, false); + goto any_work_not_admitted; + } + + assert(worker_id_virt_just_shed >= 0); + void *global_dbf = global_virt_worker_dbfs[worker_id_virt_just_shed]; + global_can_admit = dbf_list_try_add_new_demand(global_dbf, start_time, absolute_deadline, estimated_execution, sandbox_meta); + time_global_oversupply = dbf_get_time_of_oversupply(global_dbf); + } +// printf("Case #4: Do admit %s.\n", tenant->name); + assert (global_can_admit); + worker_id_v = worker_id_virt_just_shed; + rc = 2; + } + +done: + *ret_code = rc; + *worker_id_virtual = worker_id_v; + return work_admitted; +any_work_not_admitted: + work_admitted = 0; + rc = sandbox_meta->exceeded_estimation ? 4295 : 4290; + goto done; +guaranteed_work_not_admitted: + work_admitted = 0; + rc = sandbox_meta->exceeded_estimation ? 4296: 4291; + goto done; +} + + +uint64_t traffic_control_shed_work(struct tenant *tenant_to_exclude, uint64_t time_of_oversupply, int *worker_id_virt_just_shed, bool weak_shed) +{ + uint64_t cleared_demand = 0; + *worker_id_virt_just_shed = -1; + struct sandbox_metadata *sandbox_meta = NULL; + + struct tenant *tenant_to_punish = tenant_database_find_tenant_most_oversupply(tenant_to_exclude, time_of_oversupply, weak_shed, &sandbox_meta); + if (tenant_to_punish == NULL) { + // printf("null\n"); + assert (sandbox_meta == NULL); + goto done; + } + if (tenant_to_punish == tenant_to_exclude) { + // printf("itself\n"); + // TODO: Should be able to kill from itself??? + goto done; + } + + assert(sandbox_meta); + assert(sandbox_meta->tenant == tenant_to_punish); + assert(sandbox_meta->absolute_deadline <= time_of_oversupply); + assert(sandbox_meta->terminated == false); + assert(sandbox_meta->error_code == 0); + + if (sandbox_meta->state == SANDBOX_INITIALIZED) { + assert(sandbox_meta->tenant_queue == tenant_to_punish->global_sandbox_metas); + sandbox_meta->error_code = 4090; + assert(sandbox_meta->owned_worker_idx == -2); + } else { + assert(sandbox_meta->tenant_queue == tenant_to_punish->local_sandbox_metas); + sandbox_meta->error_code = 4091; + + struct message new_message = { 0 }; + if (sandbox_meta->owned_worker_idx >= 0 && sandbox_refs[sandbox_meta->id % RUNTIME_MAX_ALIVE_SANDBOXES]) { + assert(comm_to_workers); + struct comm_with_worker *ctw = &comm_to_workers[sandbox_meta->owned_worker_idx]; + assert(ctw); + assert(ctw->worker_idx == sandbox_meta->owned_worker_idx); + assert(ck_ring_size(&ctw->worker_ring) < LISTENER_THREAD_RING_SIZE); + + new_message.sandbox_meta = sandbox_meta; + new_message.sandbox = sandbox_meta->sandbox_shadow; + new_message.sandbox_id = sandbox_meta->id; + new_message.message_type = MESSAGE_CTW_SHED_CURRENT_JOB; + + if (!ck_ring_enqueue_spsc_message(&ctw->worker_ring, ctw->worker_ring_buffer, &new_message)) { + panic("Ring buffer was full and the enqueue failed!") + } + pthread_kill(runtime_worker_threads[sandbox_meta->owned_worker_idx], SIGALRM); + } + } + + struct sandbox_metadata *sm_to_remove = NULL; + int rc = priority_queue_dequeue_nolock(sandbox_meta->tenant_queue, (void **)&sm_to_remove); + assert(rc == 0); + assert(sandbox_meta == sm_to_remove); + + assert(sandbox_meta->trs_job_node == NULL); + assert(sandbox_meta->remaining_exec > 0); + assert(sandbox_meta->global_queue_type == 2); + assert(sandbox_meta->worker_id_virt>=0); + + void *global_dbf = global_virt_worker_dbfs[sandbox_meta->worker_id_virt]; + dbf_list_reduce_demand(sandbox_meta, sandbox_meta->remaining_exec + sandbox_meta->extra_slack, true); + sandbox_meta->demand_node = NULL; + + cleared_demand = sandbox_meta->remaining_exec; + // sandbox_meta->remaining_exec = 0; + // sandbox_meta->extra_slack = 0; + *worker_id_virt_just_shed = sandbox_meta->worker_id_virt; + sandbox_meta->terminated = true; +done: + return cleared_demand; +} + +#endif /* TRAFFIC_CONTROL */ \ No newline at end of file diff --git a/runtime/src/worker_thread.c b/runtime/src/worker_thread.c index ae993ec4c..1435b1dc4 100644 --- a/runtime/src/worker_thread.c +++ b/runtime/src/worker_thread.c @@ -17,6 +17,8 @@ #include "scheduler.h" #include "tenant_functions.h" #include "worker_thread.h" +#include "priority_queue.h" +#include "dbf.h" /*************************** * Worker Thread State * @@ -30,6 +32,12 @@ thread_local int worker_thread_idx; /* Used to track tenants' timeouts */ thread_local struct priority_queue *worker_thread_timeout_queue; + +/* Used to track worker's dbf */ +thread_local void *worker_dbf; +thread_local struct sandbox_metadata *sandbox_meta; + + /*********************** * Worker Thread Logic * **********************/ @@ -60,6 +68,22 @@ worker_thread_main(void *argument) if (scheduler == SCHEDULER_MTDS) { worker_thread_timeout_queue = priority_queue_initialize(RUNTIME_MAX_TENANT_COUNT, false, tenant_timeout_get_priority); + } else if (scheduler == SCHEDULER_MTDBF) { +#ifdef TRAFFIC_CONTROL + /* Initialize worker's dbf data structure */ + /* To make sure global dbf reads out the max deadline in the system */ + sleep(1); + + // worker_dbf = dbf_initialize(1, 100, worker_thread_idx, NULL); + // worker_dbf = dbf_grow(worker_dbf, dbf_get_max_relative_dl(global_dbf)); + // worker_dbf = dbf_grow(worker_dbf, runtime_max_deadline); + // printf("WORKER "); + // dbf_print(worker_dbf); + sandbox_meta = malloc(sizeof(struct sandbox_metadata)); + sandbox_meta->tenant = NULL; + + // if (worker_thread_idx == 0) global_worker_dbf = worker_dbf; // TODO: temp for debugging +#endif } software_interrupt_unmask_signal(SIGFPE); diff --git a/tests/bash_libraries/generate_spec_json.sh b/tests/bash_libraries/generate_spec_json.sh index e80448c75..3f7fd4f88 100644 --- a/tests/bash_libraries/generate_spec_json.sh +++ b/tests/bash_libraries/generate_spec_json.sh @@ -87,7 +87,7 @@ generate_spec_json() { done done - if [ "$CLIENT_TERMINATE_SERVER" == true ]; then jq_admin_spec; fi + if [ "$ADMIN_ACCESS" == true ]; then jq_admin_spec; fi # Merges all of the multiple specs for a single module jq -s '. | sort_by(.name)' ./result_*.json > "./spec.json" diff --git a/tests/common/mtdbf_preemption.env.bak b/tests/common/mtdbf_preemption.env.bak new file mode 100644 index 000000000..af0c2613c --- /dev/null +++ b/tests/common/mtdbf_preemption.env.bak @@ -0,0 +1,4 @@ +SLEDGE_SCHEDULER=MTDBF +SLEDGE_DISABLE_PREEMPTION=false +SLEDGE_SANDBOX_PERF_LOG=perf.log +SLEDGE_SPINLOOP_PAUSE_ENABLED=false diff --git a/tests/mt-emil/.gitignore b/tests/mt-emil/.gitignore new file mode 100644 index 000000000..019d49180 --- /dev/null +++ b/tests/mt-emil/.gitignore @@ -0,0 +1 @@ +out.png diff --git a/tests/mt-emil/Makefile b/tests/mt-emil/Makefile new file mode 100644 index 000000000..9f67f9369 --- /dev/null +++ b/tests/mt-emil/Makefile @@ -0,0 +1,102 @@ +SLEDGE_BINARY_DIR=../../runtime/bin +HOST?=localhost # pass arguments to change this: make client-lpd HOST=10.10.1.4 +# HOST=arena0.andrew.cmu.edu +# HOST=c220g2-011017.wisc.cloudlab.us +PORT0=10000 +PORT1=15000 +PORT2=20000 +PORT3=25000 +PORT4=30000 +PORT5=35000 +PORT6=40000 +HEY_OPTS=-disable-compression -disable-keepalive -disable-redirects + +default: run + +clean: + rm -rf res/* + +run: + SLEDGE_SIGALRM_HANDLER=TRIAGED SLEDGE_SCHEDULER=MTDBF SLEDGE_SPINLOOP_PAUSE_ENABLED=true SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log SLEDGE_SANDBOX_PERF_LOG=perf.log LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} ${SLEDGE_BINARY_DIR}/sledgert spec.json + +debug: + SLEDGE_SCHEDULER=MTDBF SLEDGE_SPINLOOP_PAUSE_ENABLED=false SLEDGE_NWORKERS=18 LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} gdb ${SLEDGE_BINARY_DIR}/sledgert \ + --eval-command="handle SIGUSR1 noprint nostop" \ + --eval-command="handle SIGPIPE noprint nostop" \ + --eval-command="set pagination off" \ + --eval-command="set print pretty" \ + --eval-command="run spec.json" + +valgrind: + SLEDGE_DISABLE_PREEMPTION=true SLEDGE_NWORKERS=1 LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} valgrind --leak-check=full --max-stackframe=11150456 --run-libc-freeres=no --run-cxx-freeres=no ${SLEDGE_BINARY_DIR}/sledgert spec.json + + +client-cnn: + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-cnn/faces01.jpg" "${HOST}:${PORT0}/cnn" + +client-cifar10: + curl -H 'Expect: ' -H "Content-Type: image/bmp" --data-binary "@input-cifar10/airplane1.bmp" "${HOST}:${PORT1}/cifar10" + +client-gocr: + curl -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@input-gocr/5x8.pnm" "${HOST}:${PORT2}/gocr" + +client-lpd: +# curl -H 'Expect: ' -H "Content-Type: image/png" --data-binary "@input-lpd-png/Cars0.png" "${HOST}:${PORT3}/lpd" + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-lpd-jpg/Cars0.jpg" "${HOST}:${PORT3}/lpd" + +client-resize: + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-resize/picsum_512x512_01.jpg" "${HOST}:${PORT4}/resize" --output "out-resize.jpg" + +client-ekf: + curl -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@input-ekf/iter00.dat" "${HOST}:${PORT5}/ekf" --output "out-ekf-iter00.dat" + +client-fib-curl: + curl -i -H 'Expect: ' -H "Content-Type: text/plain" "${HOST}:${PORT6}/fib?30" + +########################################## Choose a random file to send with curl: ########################################## +client-cnn-random: + @dir="input-cnn"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT0}/cnn" + +client-cifar10-random: + @dir="input-cifar10"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/bmp" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT1}/cifar10" + +client-gocr-random: + @dir="input-gocr"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT2}/gocr" + +client-lpd-random: +# @dir="input-lpd-png"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ +# curl -s -H 'Expect: ' -H "Content-Type: image/png" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT3}/lpd" + @dir="input-lpd-jpg"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT3}/lpd" + +client-resize-random: + @dir="input-resize"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT4}/resize" --output "out-resize-$$random_file" + +client-ekf-random: + @dir="input-ekf"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT5}/ekf" --output "out-ekf-$$random_file" +############################################################################################################################# + +client-fib-once: + echo 30 | http ${HOST}:${PORT6}/fib +# http ${HOST}:${PORT6}/fib?30 + +client-fib-loadtest: + loadtest -n 10 -c 10 -P 30 "http://${HOST}:${PORT6}/fib" + +client-fib-hey: + hey ${HEY_OPTS} -z 10s -c 72 -t 0 -o csv -m POST -d "30\n" "http://${HOST}:${PORT6}/fib" + +client-fib-wrk: + wrk -t 1 -c 1 -d 5s -R 1 "http://${HOST}:${PORT6}/fib?30" + + +client-admin: + echo 5 | http ${HOST}:55555/admin + +client-terminator: + echo 5 | http ${HOST}:55555/terminator diff --git a/tests/mt-emil/gocr_generate_dataset.sh b/tests/mt-emil/gocr_generate_dataset.sh new file mode 100755 index 000000000..290394d5f --- /dev/null +++ b/tests/mt-emil/gocr_generate_dataset.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +VARYING=(72 108 144) + +for var in "${VARYING[@]}"; do + mkdir -p "$var"dpi + mkdir -p "$var"dpi-orig + for ((i=5; i<=15; i++)); do + shuf -n10 /usr/share/dict/american-english > "$var"dpi-orig/"$i"words.txt + pango-view --dpi="$var" --font=mono -qo "$var"dpi-orig/"$var"dpi_"$i"words.png "$var"dpi-orig/"$i"words.txt + pngtopnm "$var"dpi-orig/"$var"dpi_"$i"words.png > "$var"dpi/"$var"dpi_"$i"words.pnm + done +done \ No newline at end of file diff --git a/tests/mt-emil/input-cifar10/airplane1.bmp b/tests/mt-emil/input-cifar10/airplane1.bmp new file mode 100644 index 000000000..7577ad9e3 Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane1.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane10.bmp b/tests/mt-emil/input-cifar10/airplane10.bmp new file mode 100644 index 000000000..9d646685d Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane10.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane2.bmp b/tests/mt-emil/input-cifar10/airplane2.bmp new file mode 100644 index 000000000..62b8dc6a0 Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane2.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane3.bmp b/tests/mt-emil/input-cifar10/airplane3.bmp new file mode 100644 index 000000000..f0b993dba Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane3.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane4.bmp b/tests/mt-emil/input-cifar10/airplane4.bmp new file mode 100644 index 000000000..2b4d4fb5d Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane4.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane5.bmp b/tests/mt-emil/input-cifar10/airplane5.bmp new file mode 100644 index 000000000..a0dfde898 Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane5.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane6.bmp b/tests/mt-emil/input-cifar10/airplane6.bmp new file mode 100644 index 000000000..1706efbbd Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane6.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane7.bmp b/tests/mt-emil/input-cifar10/airplane7.bmp new file mode 100644 index 000000000..9bee13c6d Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane7.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane8.bmp b/tests/mt-emil/input-cifar10/airplane8.bmp new file mode 100644 index 000000000..06ea8835b Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane8.bmp differ diff --git a/tests/mt-emil/input-cifar10/airplane9.bmp b/tests/mt-emil/input-cifar10/airplane9.bmp new file mode 100644 index 000000000..ca68b4c0b Binary files /dev/null and b/tests/mt-emil/input-cifar10/airplane9.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile1.bmp b/tests/mt-emil/input-cifar10/automobile1.bmp new file mode 100644 index 000000000..56726b6a1 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile1.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile10.bmp b/tests/mt-emil/input-cifar10/automobile10.bmp new file mode 100644 index 000000000..e76502f3a Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile10.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile2.bmp b/tests/mt-emil/input-cifar10/automobile2.bmp new file mode 100644 index 000000000..71c2ac6ad Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile2.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile3.bmp b/tests/mt-emil/input-cifar10/automobile3.bmp new file mode 100644 index 000000000..cc439c824 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile3.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile4.bmp b/tests/mt-emil/input-cifar10/automobile4.bmp new file mode 100644 index 000000000..c2080a3ef Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile4.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile5.bmp b/tests/mt-emil/input-cifar10/automobile5.bmp new file mode 100644 index 000000000..3c05d7aa4 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile5.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile6.bmp b/tests/mt-emil/input-cifar10/automobile6.bmp new file mode 100644 index 000000000..db8dd57aa Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile6.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile7.bmp b/tests/mt-emil/input-cifar10/automobile7.bmp new file mode 100644 index 000000000..3099f9ae5 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile7.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile8.bmp b/tests/mt-emil/input-cifar10/automobile8.bmp new file mode 100644 index 000000000..5a7414d92 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile8.bmp differ diff --git a/tests/mt-emil/input-cifar10/automobile9.bmp b/tests/mt-emil/input-cifar10/automobile9.bmp new file mode 100644 index 000000000..d6c952894 Binary files /dev/null and b/tests/mt-emil/input-cifar10/automobile9.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird1.bmp b/tests/mt-emil/input-cifar10/bird1.bmp new file mode 100644 index 000000000..c1b5627ff Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird1.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird10.bmp b/tests/mt-emil/input-cifar10/bird10.bmp new file mode 100644 index 000000000..f49653d47 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird10.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird2.bmp b/tests/mt-emil/input-cifar10/bird2.bmp new file mode 100644 index 000000000..5007097ac Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird2.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird3.bmp b/tests/mt-emil/input-cifar10/bird3.bmp new file mode 100644 index 000000000..13a7855e7 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird3.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird4.bmp b/tests/mt-emil/input-cifar10/bird4.bmp new file mode 100644 index 000000000..2866f9be5 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird4.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird5.bmp b/tests/mt-emil/input-cifar10/bird5.bmp new file mode 100644 index 000000000..a6bf616ca Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird5.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird6.bmp b/tests/mt-emil/input-cifar10/bird6.bmp new file mode 100644 index 000000000..b4e86ff25 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird6.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird7.bmp b/tests/mt-emil/input-cifar10/bird7.bmp new file mode 100644 index 000000000..4d0553719 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird7.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird8.bmp b/tests/mt-emil/input-cifar10/bird8.bmp new file mode 100644 index 000000000..68f396ee4 Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird8.bmp differ diff --git a/tests/mt-emil/input-cifar10/bird9.bmp b/tests/mt-emil/input-cifar10/bird9.bmp new file mode 100644 index 000000000..591d8d6df Binary files /dev/null and b/tests/mt-emil/input-cifar10/bird9.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat1.bmp b/tests/mt-emil/input-cifar10/cat1.bmp new file mode 100644 index 000000000..65958dd1b Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat1.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat10.bmp b/tests/mt-emil/input-cifar10/cat10.bmp new file mode 100644 index 000000000..050faf74f Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat10.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat2.bmp b/tests/mt-emil/input-cifar10/cat2.bmp new file mode 100644 index 000000000..1e00637c8 Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat2.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat3.bmp b/tests/mt-emil/input-cifar10/cat3.bmp new file mode 100644 index 000000000..f360091ed Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat3.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat4.bmp b/tests/mt-emil/input-cifar10/cat4.bmp new file mode 100644 index 000000000..19fcb2049 Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat4.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat5.bmp b/tests/mt-emil/input-cifar10/cat5.bmp new file mode 100644 index 000000000..34878585b Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat5.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat6.bmp b/tests/mt-emil/input-cifar10/cat6.bmp new file mode 100644 index 000000000..4031dde19 Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat6.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat7.bmp b/tests/mt-emil/input-cifar10/cat7.bmp new file mode 100644 index 000000000..e395436c4 Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat7.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat8.bmp b/tests/mt-emil/input-cifar10/cat8.bmp new file mode 100644 index 000000000..7a499a5d5 Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat8.bmp differ diff --git a/tests/mt-emil/input-cifar10/cat9.bmp b/tests/mt-emil/input-cifar10/cat9.bmp new file mode 100644 index 000000000..49452dcef Binary files /dev/null and b/tests/mt-emil/input-cifar10/cat9.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer1.bmp b/tests/mt-emil/input-cifar10/deer1.bmp new file mode 100644 index 000000000..6f93450f3 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer1.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer10.bmp b/tests/mt-emil/input-cifar10/deer10.bmp new file mode 100644 index 000000000..c286bd0d1 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer10.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer2.bmp b/tests/mt-emil/input-cifar10/deer2.bmp new file mode 100644 index 000000000..c831aba05 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer2.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer3.bmp b/tests/mt-emil/input-cifar10/deer3.bmp new file mode 100644 index 000000000..9ea3ca4a0 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer3.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer4.bmp b/tests/mt-emil/input-cifar10/deer4.bmp new file mode 100644 index 000000000..213cc2ebc Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer4.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer5.bmp b/tests/mt-emil/input-cifar10/deer5.bmp new file mode 100644 index 000000000..dac7e1440 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer5.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer6.bmp b/tests/mt-emil/input-cifar10/deer6.bmp new file mode 100644 index 000000000..911af04f1 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer6.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer7.bmp b/tests/mt-emil/input-cifar10/deer7.bmp new file mode 100644 index 000000000..4ce7eeb0c Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer7.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer8.bmp b/tests/mt-emil/input-cifar10/deer8.bmp new file mode 100644 index 000000000..66db333ca Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer8.bmp differ diff --git a/tests/mt-emil/input-cifar10/deer9.bmp b/tests/mt-emil/input-cifar10/deer9.bmp new file mode 100644 index 000000000..8d9111c36 Binary files /dev/null and b/tests/mt-emil/input-cifar10/deer9.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog1.bmp b/tests/mt-emil/input-cifar10/dog1.bmp new file mode 100644 index 000000000..1c1f88543 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog1.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog10.bmp b/tests/mt-emil/input-cifar10/dog10.bmp new file mode 100644 index 000000000..3ca061bfa Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog10.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog2.bmp b/tests/mt-emil/input-cifar10/dog2.bmp new file mode 100644 index 000000000..d78701fa2 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog2.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog3.bmp b/tests/mt-emil/input-cifar10/dog3.bmp new file mode 100644 index 000000000..434d504f9 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog3.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog4.bmp b/tests/mt-emil/input-cifar10/dog4.bmp new file mode 100644 index 000000000..080a53aed Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog4.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog5.bmp b/tests/mt-emil/input-cifar10/dog5.bmp new file mode 100644 index 000000000..c687bceea Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog5.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog6.bmp b/tests/mt-emil/input-cifar10/dog6.bmp new file mode 100644 index 000000000..1e3ab4720 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog6.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog7.bmp b/tests/mt-emil/input-cifar10/dog7.bmp new file mode 100644 index 000000000..1ce4641df Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog7.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog8.bmp b/tests/mt-emil/input-cifar10/dog8.bmp new file mode 100644 index 000000000..a27ecc041 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog8.bmp differ diff --git a/tests/mt-emil/input-cifar10/dog9.bmp b/tests/mt-emil/input-cifar10/dog9.bmp new file mode 100644 index 000000000..37ad6dd63 Binary files /dev/null and b/tests/mt-emil/input-cifar10/dog9.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog1.bmp b/tests/mt-emil/input-cifar10/frog1.bmp new file mode 100644 index 000000000..6af040426 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog1.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog10.bmp b/tests/mt-emil/input-cifar10/frog10.bmp new file mode 100644 index 000000000..0b1daea22 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog10.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog2.bmp b/tests/mt-emil/input-cifar10/frog2.bmp new file mode 100644 index 000000000..162d1ad00 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog2.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog3.bmp b/tests/mt-emil/input-cifar10/frog3.bmp new file mode 100644 index 000000000..a26935d03 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog3.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog4.bmp b/tests/mt-emil/input-cifar10/frog4.bmp new file mode 100644 index 000000000..ece805e4f Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog4.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog5.bmp b/tests/mt-emil/input-cifar10/frog5.bmp new file mode 100644 index 000000000..629e56c1c Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog5.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog6.bmp b/tests/mt-emil/input-cifar10/frog6.bmp new file mode 100644 index 000000000..a06291682 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog6.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog7.bmp b/tests/mt-emil/input-cifar10/frog7.bmp new file mode 100644 index 000000000..35fce5fb4 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog7.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog8.bmp b/tests/mt-emil/input-cifar10/frog8.bmp new file mode 100644 index 000000000..b7e0df3df Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog8.bmp differ diff --git a/tests/mt-emil/input-cifar10/frog9.bmp b/tests/mt-emil/input-cifar10/frog9.bmp new file mode 100644 index 000000000..601920c51 Binary files /dev/null and b/tests/mt-emil/input-cifar10/frog9.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse1.bmp b/tests/mt-emil/input-cifar10/horse1.bmp new file mode 100644 index 000000000..14681af72 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse1.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse10.bmp b/tests/mt-emil/input-cifar10/horse10.bmp new file mode 100644 index 000000000..e04681267 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse10.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse2.bmp b/tests/mt-emil/input-cifar10/horse2.bmp new file mode 100644 index 000000000..506109338 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse2.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse3.bmp b/tests/mt-emil/input-cifar10/horse3.bmp new file mode 100644 index 000000000..3e9264031 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse3.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse4.bmp b/tests/mt-emil/input-cifar10/horse4.bmp new file mode 100644 index 000000000..b754ddf65 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse4.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse5.bmp b/tests/mt-emil/input-cifar10/horse5.bmp new file mode 100644 index 000000000..023557c3d Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse5.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse6.bmp b/tests/mt-emil/input-cifar10/horse6.bmp new file mode 100644 index 000000000..f56caefcb Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse6.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse7.bmp b/tests/mt-emil/input-cifar10/horse7.bmp new file mode 100644 index 000000000..a80f20a91 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse7.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse8.bmp b/tests/mt-emil/input-cifar10/horse8.bmp new file mode 100644 index 000000000..073e24b38 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse8.bmp differ diff --git a/tests/mt-emil/input-cifar10/horse9.bmp b/tests/mt-emil/input-cifar10/horse9.bmp new file mode 100644 index 000000000..c70a28253 Binary files /dev/null and b/tests/mt-emil/input-cifar10/horse9.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship1.bmp b/tests/mt-emil/input-cifar10/ship1.bmp new file mode 100644 index 000000000..918f222a6 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship1.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship10.bmp b/tests/mt-emil/input-cifar10/ship10.bmp new file mode 100644 index 000000000..ee4aefa94 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship10.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship2.bmp b/tests/mt-emil/input-cifar10/ship2.bmp new file mode 100644 index 000000000..be8e5b7c8 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship2.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship3.bmp b/tests/mt-emil/input-cifar10/ship3.bmp new file mode 100644 index 000000000..bf2fda8b4 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship3.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship4.bmp b/tests/mt-emil/input-cifar10/ship4.bmp new file mode 100644 index 000000000..830cdaba6 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship4.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship5.bmp b/tests/mt-emil/input-cifar10/ship5.bmp new file mode 100644 index 000000000..ad9207833 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship5.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship6.bmp b/tests/mt-emil/input-cifar10/ship6.bmp new file mode 100644 index 000000000..1c5018d7e Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship6.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship7.bmp b/tests/mt-emil/input-cifar10/ship7.bmp new file mode 100644 index 000000000..8737dfd4c Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship7.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship8.bmp b/tests/mt-emil/input-cifar10/ship8.bmp new file mode 100644 index 000000000..3a4b72bcc Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship8.bmp differ diff --git a/tests/mt-emil/input-cifar10/ship9.bmp b/tests/mt-emil/input-cifar10/ship9.bmp new file mode 100644 index 000000000..ac1cb7794 Binary files /dev/null and b/tests/mt-emil/input-cifar10/ship9.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck1.bmp b/tests/mt-emil/input-cifar10/truck1.bmp new file mode 100644 index 000000000..65358d702 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck1.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck10.bmp b/tests/mt-emil/input-cifar10/truck10.bmp new file mode 100644 index 000000000..af1cafde5 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck10.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck2.bmp b/tests/mt-emil/input-cifar10/truck2.bmp new file mode 100644 index 000000000..ad42b11b2 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck2.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck3.bmp b/tests/mt-emil/input-cifar10/truck3.bmp new file mode 100644 index 000000000..6b12f4683 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck3.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck4.bmp b/tests/mt-emil/input-cifar10/truck4.bmp new file mode 100644 index 000000000..0f80ce061 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck4.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck5.bmp b/tests/mt-emil/input-cifar10/truck5.bmp new file mode 100644 index 000000000..95f6b1d1a Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck5.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck6.bmp b/tests/mt-emil/input-cifar10/truck6.bmp new file mode 100644 index 000000000..7279a41bd Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck6.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck7.bmp b/tests/mt-emil/input-cifar10/truck7.bmp new file mode 100644 index 000000000..4a5ed2377 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck7.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck8.bmp b/tests/mt-emil/input-cifar10/truck8.bmp new file mode 100644 index 000000000..f1c3e5bc7 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck8.bmp differ diff --git a/tests/mt-emil/input-cifar10/truck9.bmp b/tests/mt-emil/input-cifar10/truck9.bmp new file mode 100644 index 000000000..20bf249c3 Binary files /dev/null and b/tests/mt-emil/input-cifar10/truck9.bmp differ diff --git a/tests/mt-emil/input-cnn/faces01.jpg b/tests/mt-emil/input-cnn/faces01.jpg new file mode 100644 index 000000000..a21de9c75 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces01.jpg differ diff --git a/tests/mt-emil/input-cnn/faces02.jpg b/tests/mt-emil/input-cnn/faces02.jpg new file mode 100644 index 000000000..bd827c2ed Binary files /dev/null and b/tests/mt-emil/input-cnn/faces02.jpg differ diff --git a/tests/mt-emil/input-cnn/faces03.jpg b/tests/mt-emil/input-cnn/faces03.jpg new file mode 100644 index 000000000..e329b5431 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces03.jpg differ diff --git a/tests/mt-emil/input-cnn/faces04.jpg b/tests/mt-emil/input-cnn/faces04.jpg new file mode 100644 index 000000000..42d150b09 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces04.jpg differ diff --git a/tests/mt-emil/input-cnn/faces05.jpg b/tests/mt-emil/input-cnn/faces05.jpg new file mode 100644 index 000000000..f61de8335 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces05.jpg differ diff --git a/tests/mt-emil/input-cnn/faces06.jpg b/tests/mt-emil/input-cnn/faces06.jpg new file mode 100644 index 000000000..76e7f9869 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces06.jpg differ diff --git a/tests/mt-emil/input-cnn/faces07.jpg b/tests/mt-emil/input-cnn/faces07.jpg new file mode 100644 index 000000000..32b321a01 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces07.jpg differ diff --git a/tests/mt-emil/input-cnn/faces08.jpg b/tests/mt-emil/input-cnn/faces08.jpg new file mode 100644 index 000000000..484d80e89 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces08.jpg differ diff --git a/tests/mt-emil/input-cnn/faces09.jpg b/tests/mt-emil/input-cnn/faces09.jpg new file mode 100644 index 000000000..6f535f59e Binary files /dev/null and b/tests/mt-emil/input-cnn/faces09.jpg differ diff --git a/tests/mt-emil/input-cnn/faces10.jpg b/tests/mt-emil/input-cnn/faces10.jpg new file mode 100644 index 000000000..9bd540b58 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces10.jpg differ diff --git a/tests/mt-emil/input-cnn/faces11.jpg b/tests/mt-emil/input-cnn/faces11.jpg new file mode 100644 index 000000000..0b52831d5 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces11.jpg differ diff --git a/tests/mt-emil/input-cnn/faces12.jpg b/tests/mt-emil/input-cnn/faces12.jpg new file mode 100644 index 000000000..c2f759177 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces12.jpg differ diff --git a/tests/mt-emil/input-cnn/faces13.jpg b/tests/mt-emil/input-cnn/faces13.jpg new file mode 100644 index 000000000..1dee6aafc Binary files /dev/null and b/tests/mt-emil/input-cnn/faces13.jpg differ diff --git a/tests/mt-emil/input-cnn/faces14.jpg b/tests/mt-emil/input-cnn/faces14.jpg new file mode 100644 index 000000000..4381a6db3 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces14.jpg differ diff --git a/tests/mt-emil/input-cnn/faces15.jpg b/tests/mt-emil/input-cnn/faces15.jpg new file mode 100644 index 000000000..5a7cb91e2 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces15.jpg differ diff --git a/tests/mt-emil/input-cnn/faces16.jpg b/tests/mt-emil/input-cnn/faces16.jpg new file mode 100644 index 000000000..1b861210a Binary files /dev/null and b/tests/mt-emil/input-cnn/faces16.jpg differ diff --git a/tests/mt-emil/input-cnn/faces17.jpg b/tests/mt-emil/input-cnn/faces17.jpg new file mode 100644 index 000000000..e84f9dad7 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces17.jpg differ diff --git a/tests/mt-emil/input-cnn/faces18.jpg b/tests/mt-emil/input-cnn/faces18.jpg new file mode 100644 index 000000000..7f15dd25a Binary files /dev/null and b/tests/mt-emil/input-cnn/faces18.jpg differ diff --git a/tests/mt-emil/input-cnn/faces19.jpg b/tests/mt-emil/input-cnn/faces19.jpg new file mode 100644 index 000000000..be9bf9104 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces19.jpg differ diff --git a/tests/mt-emil/input-cnn/faces20.jpg b/tests/mt-emil/input-cnn/faces20.jpg new file mode 100644 index 000000000..4e84815ac Binary files /dev/null and b/tests/mt-emil/input-cnn/faces20.jpg differ diff --git a/tests/mt-emil/input-cnn/faces21.jpg b/tests/mt-emil/input-cnn/faces21.jpg new file mode 100644 index 000000000..5aebdc5c7 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces21.jpg differ diff --git a/tests/mt-emil/input-cnn/faces22.jpg b/tests/mt-emil/input-cnn/faces22.jpg new file mode 100644 index 000000000..95a6200ec Binary files /dev/null and b/tests/mt-emil/input-cnn/faces22.jpg differ diff --git a/tests/mt-emil/input-cnn/faces23.jpg b/tests/mt-emil/input-cnn/faces23.jpg new file mode 100644 index 000000000..d7576765e Binary files /dev/null and b/tests/mt-emil/input-cnn/faces23.jpg differ diff --git a/tests/mt-emil/input-cnn/faces24.jpg b/tests/mt-emil/input-cnn/faces24.jpg new file mode 100644 index 000000000..e2cb4bdb5 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces24.jpg differ diff --git a/tests/mt-emil/input-cnn/faces25.jpg b/tests/mt-emil/input-cnn/faces25.jpg new file mode 100644 index 000000000..e29f1c6f4 Binary files /dev/null and b/tests/mt-emil/input-cnn/faces25.jpg differ diff --git a/tests/mt-emil/input-ekf/iter00.dat b/tests/mt-emil/input-ekf/iter00.dat new file mode 100644 index 000000000..9a960e1e9 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter00.dat differ diff --git a/tests/mt-emil/input-ekf/iter01.dat b/tests/mt-emil/input-ekf/iter01.dat new file mode 100644 index 000000000..1229f11ef Binary files /dev/null and b/tests/mt-emil/input-ekf/iter01.dat differ diff --git a/tests/mt-emil/input-ekf/iter02.dat b/tests/mt-emil/input-ekf/iter02.dat new file mode 100644 index 000000000..a98da81d6 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter02.dat differ diff --git a/tests/mt-emil/input-ekf/iter03.dat b/tests/mt-emil/input-ekf/iter03.dat new file mode 100644 index 000000000..cc0ab73b2 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter03.dat differ diff --git a/tests/mt-emil/input-ekf/iter04.dat b/tests/mt-emil/input-ekf/iter04.dat new file mode 100644 index 000000000..bd79bdbdf Binary files /dev/null and b/tests/mt-emil/input-ekf/iter04.dat differ diff --git a/tests/mt-emil/input-ekf/iter05.dat b/tests/mt-emil/input-ekf/iter05.dat new file mode 100644 index 000000000..d981ee71a Binary files /dev/null and b/tests/mt-emil/input-ekf/iter05.dat differ diff --git a/tests/mt-emil/input-ekf/iter06.dat b/tests/mt-emil/input-ekf/iter06.dat new file mode 100644 index 000000000..618631ada Binary files /dev/null and b/tests/mt-emil/input-ekf/iter06.dat differ diff --git a/tests/mt-emil/input-ekf/iter07.dat b/tests/mt-emil/input-ekf/iter07.dat new file mode 100644 index 000000000..edae0e535 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter07.dat differ diff --git a/tests/mt-emil/input-ekf/iter08.dat b/tests/mt-emil/input-ekf/iter08.dat new file mode 100644 index 000000000..53f29c8c3 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter08.dat differ diff --git a/tests/mt-emil/input-ekf/iter09.dat b/tests/mt-emil/input-ekf/iter09.dat new file mode 100644 index 000000000..cf61ef00e Binary files /dev/null and b/tests/mt-emil/input-ekf/iter09.dat differ diff --git a/tests/mt-emil/input-ekf/iter10.dat b/tests/mt-emil/input-ekf/iter10.dat new file mode 100644 index 000000000..fd9bd6730 Binary files /dev/null and b/tests/mt-emil/input-ekf/iter10.dat differ diff --git a/tests/mt-emil/input-gocr/108dpi_10words.png b/tests/mt-emil/input-gocr/108dpi_10words.png new file mode 100644 index 000000000..f9ff0cddc Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_10words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_11words.png b/tests/mt-emil/input-gocr/108dpi_11words.png new file mode 100644 index 000000000..56e1c37d2 Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_11words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_12words.png b/tests/mt-emil/input-gocr/108dpi_12words.png new file mode 100644 index 000000000..a543e1d8f Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_12words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_13words.png b/tests/mt-emil/input-gocr/108dpi_13words.png new file mode 100644 index 000000000..7ab71c70b Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_13words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_14words.png b/tests/mt-emil/input-gocr/108dpi_14words.png new file mode 100644 index 000000000..d6fe91e5e Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_14words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_15words.png b/tests/mt-emil/input-gocr/108dpi_15words.png new file mode 100644 index 000000000..0aca2d326 Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_15words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_5words.png b/tests/mt-emil/input-gocr/108dpi_5words.png new file mode 100644 index 000000000..025fb55fc Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_5words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_6words.png b/tests/mt-emil/input-gocr/108dpi_6words.png new file mode 100644 index 000000000..6d3e2fc8a Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_6words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_7words.png b/tests/mt-emil/input-gocr/108dpi_7words.png new file mode 100644 index 000000000..dc5af39df Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_7words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_8words.png b/tests/mt-emil/input-gocr/108dpi_8words.png new file mode 100644 index 000000000..3f393b5f6 Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_8words.png differ diff --git a/tests/mt-emil/input-gocr/108dpi_9words.png b/tests/mt-emil/input-gocr/108dpi_9words.png new file mode 100644 index 000000000..55a0f1f3a Binary files /dev/null and b/tests/mt-emil/input-gocr/108dpi_9words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_10words.png b/tests/mt-emil/input-gocr/144dpi_10words.png new file mode 100644 index 000000000..1f0f2067f Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_10words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_11words.png b/tests/mt-emil/input-gocr/144dpi_11words.png new file mode 100644 index 000000000..b4c93280f Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_11words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_12words.png b/tests/mt-emil/input-gocr/144dpi_12words.png new file mode 100644 index 000000000..2d9a2ab33 Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_12words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_13words.png b/tests/mt-emil/input-gocr/144dpi_13words.png new file mode 100644 index 000000000..6622c0f9a Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_13words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_14words.png b/tests/mt-emil/input-gocr/144dpi_14words.png new file mode 100644 index 000000000..738fc7a1c Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_14words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_15words.png b/tests/mt-emil/input-gocr/144dpi_15words.png new file mode 100644 index 000000000..b912a1e31 Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_15words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_5words.png b/tests/mt-emil/input-gocr/144dpi_5words.png new file mode 100644 index 000000000..2f889adcc Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_5words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_6words.png b/tests/mt-emil/input-gocr/144dpi_6words.png new file mode 100644 index 000000000..bd065df6a Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_6words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_7words.png b/tests/mt-emil/input-gocr/144dpi_7words.png new file mode 100644 index 000000000..6e3fd3a25 Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_7words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_8words.png b/tests/mt-emil/input-gocr/144dpi_8words.png new file mode 100644 index 000000000..a036984d9 Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_8words.png differ diff --git a/tests/mt-emil/input-gocr/144dpi_9words.png b/tests/mt-emil/input-gocr/144dpi_9words.png new file mode 100644 index 000000000..da7de3a89 Binary files /dev/null and b/tests/mt-emil/input-gocr/144dpi_9words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_10words.png b/tests/mt-emil/input-gocr/72dpi_10words.png new file mode 100644 index 000000000..8d671b6b1 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_10words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_11words.png b/tests/mt-emil/input-gocr/72dpi_11words.png new file mode 100644 index 000000000..43b2cadf3 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_11words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_12words.png b/tests/mt-emil/input-gocr/72dpi_12words.png new file mode 100644 index 000000000..925eb9c33 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_12words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_13words.png b/tests/mt-emil/input-gocr/72dpi_13words.png new file mode 100644 index 000000000..dd0dd4b3b Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_13words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_14words.png b/tests/mt-emil/input-gocr/72dpi_14words.png new file mode 100644 index 000000000..7ae151d21 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_14words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_15words.png b/tests/mt-emil/input-gocr/72dpi_15words.png new file mode 100644 index 000000000..2b051decb Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_15words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_5words.png b/tests/mt-emil/input-gocr/72dpi_5words.png new file mode 100644 index 000000000..4045530b7 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_5words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_6words.png b/tests/mt-emil/input-gocr/72dpi_6words.png new file mode 100644 index 000000000..94af5888a Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_6words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_7words.png b/tests/mt-emil/input-gocr/72dpi_7words.png new file mode 100644 index 000000000..3cd14fcdc Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_7words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_8words.png b/tests/mt-emil/input-gocr/72dpi_8words.png new file mode 100644 index 000000000..9fc974ed3 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_8words.png differ diff --git a/tests/mt-emil/input-gocr/72dpi_9words.png b/tests/mt-emil/input-gocr/72dpi_9words.png new file mode 100644 index 000000000..e96c30c71 Binary files /dev/null and b/tests/mt-emil/input-gocr/72dpi_9words.png differ diff --git a/tests/mt-emil/input-gocr/mono_10_108dpi.png b/tests/mt-emil/input-gocr/mono_10_108dpi.png new file mode 100644 index 000000000..d911ce990 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_10_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_10_144dpi.png b/tests/mt-emil/input-gocr/mono_10_144dpi.png new file mode 100644 index 000000000..2efd4be4d Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_10_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_10_72dpi.png b/tests/mt-emil/input-gocr/mono_10_72dpi.png new file mode 100644 index 000000000..4b40da5f6 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_10_72dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_20_108dpi.png b/tests/mt-emil/input-gocr/mono_20_108dpi.png new file mode 100644 index 000000000..9121715c9 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_20_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_20_144dpi.png b/tests/mt-emil/input-gocr/mono_20_144dpi.png new file mode 100644 index 000000000..957021e33 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_20_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_20_72dpi.png b/tests/mt-emil/input-gocr/mono_20_72dpi.png new file mode 100644 index 000000000..ff51726ae Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_20_72dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_30_108dpi.png b/tests/mt-emil/input-gocr/mono_30_108dpi.png new file mode 100644 index 000000000..d87d312ac Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_30_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_30_144dpi.png b/tests/mt-emil/input-gocr/mono_30_144dpi.png new file mode 100644 index 000000000..87436f1e5 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_30_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/mono_30_72dpi.png b/tests/mt-emil/input-gocr/mono_30_72dpi.png new file mode 100644 index 000000000..4a4ecbb40 Binary files /dev/null and b/tests/mt-emil/input-gocr/mono_30_72dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_10_108dpi.png b/tests/mt-emil/input-gocr/roboto_10_108dpi.png new file mode 100644 index 000000000..a6831eb9f Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_10_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_10_144dpi.png b/tests/mt-emil/input-gocr/roboto_10_144dpi.png new file mode 100644 index 000000000..f68b873e1 Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_10_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_10_72dpi.png b/tests/mt-emil/input-gocr/roboto_10_72dpi.png new file mode 100644 index 000000000..317bfaddd Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_10_72dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_20_108dpi.png b/tests/mt-emil/input-gocr/roboto_20_108dpi.png new file mode 100644 index 000000000..48626456d Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_20_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_20_144dpi.png b/tests/mt-emil/input-gocr/roboto_20_144dpi.png new file mode 100644 index 000000000..8d4a9f599 Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_20_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_20_72dpi.png b/tests/mt-emil/input-gocr/roboto_20_72dpi.png new file mode 100644 index 000000000..2569c3651 Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_20_72dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_30_108dpi.png b/tests/mt-emil/input-gocr/roboto_30_108dpi.png new file mode 100644 index 000000000..ae31ba09d Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_30_108dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_30_144dpi.png b/tests/mt-emil/input-gocr/roboto_30_144dpi.png new file mode 100644 index 000000000..cd1bdb9fc Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_30_144dpi.png differ diff --git a/tests/mt-emil/input-gocr/roboto_30_72dpi.png b/tests/mt-emil/input-gocr/roboto_30_72dpi.png new file mode 100644 index 000000000..ecad389fe Binary files /dev/null and b/tests/mt-emil/input-gocr/roboto_30_72dpi.png differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars0.bmp b/tests/mt-emil/input-lpd-bmp/Cars0.bmp new file mode 100644 index 000000000..bd107d857 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars0.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars1.bmp b/tests/mt-emil/input-lpd-bmp/Cars1.bmp new file mode 100644 index 000000000..4ef5331a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars1.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars10.bmp b/tests/mt-emil/input-lpd-bmp/Cars10.bmp new file mode 100644 index 000000000..56ab1f2b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars10.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars100.bmp b/tests/mt-emil/input-lpd-bmp/Cars100.bmp new file mode 100644 index 000000000..c50129ae5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars100.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars101.bmp b/tests/mt-emil/input-lpd-bmp/Cars101.bmp new file mode 100644 index 000000000..e392290e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars101.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars102.bmp b/tests/mt-emil/input-lpd-bmp/Cars102.bmp new file mode 100644 index 000000000..ae3654e98 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars102.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars103.bmp b/tests/mt-emil/input-lpd-bmp/Cars103.bmp new file mode 100644 index 000000000..f14a2b2a9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars103.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars104.bmp b/tests/mt-emil/input-lpd-bmp/Cars104.bmp new file mode 100644 index 000000000..bc46d0f12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars104.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars105.bmp b/tests/mt-emil/input-lpd-bmp/Cars105.bmp new file mode 100644 index 000000000..a167c30eb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars105.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars106.bmp b/tests/mt-emil/input-lpd-bmp/Cars106.bmp new file mode 100644 index 000000000..cc8739ccb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars106.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars107.bmp b/tests/mt-emil/input-lpd-bmp/Cars107.bmp new file mode 100644 index 000000000..06d8a102a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars107.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars108.bmp b/tests/mt-emil/input-lpd-bmp/Cars108.bmp new file mode 100644 index 000000000..56aa10c70 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars108.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars109.bmp b/tests/mt-emil/input-lpd-bmp/Cars109.bmp new file mode 100644 index 000000000..b6f8e60c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars109.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars11.bmp b/tests/mt-emil/input-lpd-bmp/Cars11.bmp new file mode 100644 index 000000000..23d8126cd Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars11.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars110.bmp b/tests/mt-emil/input-lpd-bmp/Cars110.bmp new file mode 100644 index 000000000..f65d56141 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars110.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars111.bmp b/tests/mt-emil/input-lpd-bmp/Cars111.bmp new file mode 100644 index 000000000..bd9bed236 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars111.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars112.bmp b/tests/mt-emil/input-lpd-bmp/Cars112.bmp new file mode 100644 index 000000000..7d599ce66 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars112.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars113.bmp b/tests/mt-emil/input-lpd-bmp/Cars113.bmp new file mode 100644 index 000000000..caaf09a0a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars113.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars114.bmp b/tests/mt-emil/input-lpd-bmp/Cars114.bmp new file mode 100644 index 000000000..59afbd34b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars114.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars115.bmp b/tests/mt-emil/input-lpd-bmp/Cars115.bmp new file mode 100644 index 000000000..6450fbb43 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars115.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars116.bmp b/tests/mt-emil/input-lpd-bmp/Cars116.bmp new file mode 100644 index 000000000..815fa4b5b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars116.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars117.bmp b/tests/mt-emil/input-lpd-bmp/Cars117.bmp new file mode 100644 index 000000000..a319db299 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars117.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars118.bmp b/tests/mt-emil/input-lpd-bmp/Cars118.bmp new file mode 100644 index 000000000..ff18dcda0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars118.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars119.bmp b/tests/mt-emil/input-lpd-bmp/Cars119.bmp new file mode 100644 index 000000000..cdfc8c654 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars119.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars12.bmp b/tests/mt-emil/input-lpd-bmp/Cars12.bmp new file mode 100644 index 000000000..b841bebc2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars12.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars120.bmp b/tests/mt-emil/input-lpd-bmp/Cars120.bmp new file mode 100644 index 000000000..c57706bfc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars120.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars121.bmp b/tests/mt-emil/input-lpd-bmp/Cars121.bmp new file mode 100644 index 000000000..ad1795b82 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars121.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars122.bmp b/tests/mt-emil/input-lpd-bmp/Cars122.bmp new file mode 100644 index 000000000..ba490ffee Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars122.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars123.bmp b/tests/mt-emil/input-lpd-bmp/Cars123.bmp new file mode 100644 index 000000000..d95c08523 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars123.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars124.bmp b/tests/mt-emil/input-lpd-bmp/Cars124.bmp new file mode 100644 index 000000000..a84017bc4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars124.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars125.bmp b/tests/mt-emil/input-lpd-bmp/Cars125.bmp new file mode 100644 index 000000000..e7ceb1780 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars125.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars126.bmp b/tests/mt-emil/input-lpd-bmp/Cars126.bmp new file mode 100644 index 000000000..3ef39574b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars126.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars127.bmp b/tests/mt-emil/input-lpd-bmp/Cars127.bmp new file mode 100644 index 000000000..3bce0596f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars127.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars128.bmp b/tests/mt-emil/input-lpd-bmp/Cars128.bmp new file mode 100644 index 000000000..7565c920b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars128.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars129.bmp b/tests/mt-emil/input-lpd-bmp/Cars129.bmp new file mode 100644 index 000000000..4a12cbdbb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars129.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars13.bmp b/tests/mt-emil/input-lpd-bmp/Cars13.bmp new file mode 100644 index 000000000..9f7b7a373 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars13.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars130.bmp b/tests/mt-emil/input-lpd-bmp/Cars130.bmp new file mode 100644 index 000000000..238f7a846 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars130.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars131.bmp b/tests/mt-emil/input-lpd-bmp/Cars131.bmp new file mode 100644 index 000000000..59afbd34b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars131.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars132.bmp b/tests/mt-emil/input-lpd-bmp/Cars132.bmp new file mode 100644 index 000000000..d665d41ea Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars132.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars133.bmp b/tests/mt-emil/input-lpd-bmp/Cars133.bmp new file mode 100644 index 000000000..49df7af9b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars133.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars134.bmp b/tests/mt-emil/input-lpd-bmp/Cars134.bmp new file mode 100644 index 000000000..b61a23a00 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars134.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars135.bmp b/tests/mt-emil/input-lpd-bmp/Cars135.bmp new file mode 100644 index 000000000..226b331e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars135.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars136.bmp b/tests/mt-emil/input-lpd-bmp/Cars136.bmp new file mode 100644 index 000000000..6426093d6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars136.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars137.bmp b/tests/mt-emil/input-lpd-bmp/Cars137.bmp new file mode 100644 index 000000000..74e55f80b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars137.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars138.bmp b/tests/mt-emil/input-lpd-bmp/Cars138.bmp new file mode 100644 index 000000000..4a45aa6bf Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars138.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars139.bmp b/tests/mt-emil/input-lpd-bmp/Cars139.bmp new file mode 100644 index 000000000..7308eedf9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars139.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars14.bmp b/tests/mt-emil/input-lpd-bmp/Cars14.bmp new file mode 100644 index 000000000..61b8517f0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars14.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars140.bmp b/tests/mt-emil/input-lpd-bmp/Cars140.bmp new file mode 100644 index 000000000..4c70949ea Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars140.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars141.bmp b/tests/mt-emil/input-lpd-bmp/Cars141.bmp new file mode 100644 index 000000000..32ab7d18b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars141.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars142.bmp b/tests/mt-emil/input-lpd-bmp/Cars142.bmp new file mode 100644 index 000000000..4fba87993 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars142.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars143.bmp b/tests/mt-emil/input-lpd-bmp/Cars143.bmp new file mode 100644 index 000000000..ea7b62aff Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars143.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars144.bmp b/tests/mt-emil/input-lpd-bmp/Cars144.bmp new file mode 100644 index 000000000..c5040cc7d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars144.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars145.bmp b/tests/mt-emil/input-lpd-bmp/Cars145.bmp new file mode 100644 index 000000000..4c70949ea Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars145.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars146.bmp b/tests/mt-emil/input-lpd-bmp/Cars146.bmp new file mode 100644 index 000000000..6daf44c61 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars146.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars147.bmp b/tests/mt-emil/input-lpd-bmp/Cars147.bmp new file mode 100644 index 000000000..bd107d857 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars147.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars148.bmp b/tests/mt-emil/input-lpd-bmp/Cars148.bmp new file mode 100644 index 000000000..ecce8d240 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars148.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars149.bmp b/tests/mt-emil/input-lpd-bmp/Cars149.bmp new file mode 100644 index 000000000..0de30e6e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars149.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars15.bmp b/tests/mt-emil/input-lpd-bmp/Cars15.bmp new file mode 100644 index 000000000..573f97988 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars15.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars150.bmp b/tests/mt-emil/input-lpd-bmp/Cars150.bmp new file mode 100644 index 000000000..d290c04ff Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars150.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars151.bmp b/tests/mt-emil/input-lpd-bmp/Cars151.bmp new file mode 100644 index 000000000..2c8e6bea3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars151.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars152.bmp b/tests/mt-emil/input-lpd-bmp/Cars152.bmp new file mode 100644 index 000000000..7e045baf9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars152.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars153.bmp b/tests/mt-emil/input-lpd-bmp/Cars153.bmp new file mode 100644 index 000000000..06d8a102a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars153.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars154.bmp b/tests/mt-emil/input-lpd-bmp/Cars154.bmp new file mode 100644 index 000000000..49b99053c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars154.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars155.bmp b/tests/mt-emil/input-lpd-bmp/Cars155.bmp new file mode 100644 index 000000000..1bb721211 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars155.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars156.bmp b/tests/mt-emil/input-lpd-bmp/Cars156.bmp new file mode 100644 index 000000000..24a5a6168 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars156.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars157.bmp b/tests/mt-emil/input-lpd-bmp/Cars157.bmp new file mode 100644 index 000000000..49b289700 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars157.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars158.bmp b/tests/mt-emil/input-lpd-bmp/Cars158.bmp new file mode 100644 index 000000000..4e2abd97a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars158.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars159.bmp b/tests/mt-emil/input-lpd-bmp/Cars159.bmp new file mode 100644 index 000000000..24d028fa7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars159.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars16.bmp b/tests/mt-emil/input-lpd-bmp/Cars16.bmp new file mode 100644 index 000000000..5ed9d0e94 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars16.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars160.bmp b/tests/mt-emil/input-lpd-bmp/Cars160.bmp new file mode 100644 index 000000000..39eff3172 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars160.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars161.bmp b/tests/mt-emil/input-lpd-bmp/Cars161.bmp new file mode 100644 index 000000000..6450fbb43 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars161.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars162.bmp b/tests/mt-emil/input-lpd-bmp/Cars162.bmp new file mode 100644 index 000000000..beb6236cb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars162.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars163.bmp b/tests/mt-emil/input-lpd-bmp/Cars163.bmp new file mode 100644 index 000000000..17b08514a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars163.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars164.bmp b/tests/mt-emil/input-lpd-bmp/Cars164.bmp new file mode 100644 index 000000000..ab67746fd Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars164.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars165.bmp b/tests/mt-emil/input-lpd-bmp/Cars165.bmp new file mode 100644 index 000000000..519380e4f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars165.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars166.bmp b/tests/mt-emil/input-lpd-bmp/Cars166.bmp new file mode 100644 index 000000000..c170f7fd3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars166.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars167.bmp b/tests/mt-emil/input-lpd-bmp/Cars167.bmp new file mode 100644 index 000000000..0334161c1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars167.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars168.bmp b/tests/mt-emil/input-lpd-bmp/Cars168.bmp new file mode 100644 index 000000000..231068fc0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars168.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars169.bmp b/tests/mt-emil/input-lpd-bmp/Cars169.bmp new file mode 100644 index 000000000..24a5a6168 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars169.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars17.bmp b/tests/mt-emil/input-lpd-bmp/Cars17.bmp new file mode 100644 index 000000000..bbc77c7c7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars17.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars170.bmp b/tests/mt-emil/input-lpd-bmp/Cars170.bmp new file mode 100644 index 000000000..1b35decf4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars170.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars171.bmp b/tests/mt-emil/input-lpd-bmp/Cars171.bmp new file mode 100644 index 000000000..9f7b7a373 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars171.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars172.bmp b/tests/mt-emil/input-lpd-bmp/Cars172.bmp new file mode 100644 index 000000000..6e52d0caa Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars172.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars173.bmp b/tests/mt-emil/input-lpd-bmp/Cars173.bmp new file mode 100644 index 000000000..20f6ea1a7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars173.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars174.bmp b/tests/mt-emil/input-lpd-bmp/Cars174.bmp new file mode 100644 index 000000000..e656c7909 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars174.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars175.bmp b/tests/mt-emil/input-lpd-bmp/Cars175.bmp new file mode 100644 index 000000000..aa2456f3c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars175.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars176.bmp b/tests/mt-emil/input-lpd-bmp/Cars176.bmp new file mode 100644 index 000000000..b08267bb2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars176.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars177.bmp b/tests/mt-emil/input-lpd-bmp/Cars177.bmp new file mode 100644 index 000000000..16a086461 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars177.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars178.bmp b/tests/mt-emil/input-lpd-bmp/Cars178.bmp new file mode 100644 index 000000000..986e77a67 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars178.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars179.bmp b/tests/mt-emil/input-lpd-bmp/Cars179.bmp new file mode 100644 index 000000000..be8cd21e2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars179.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars18.bmp b/tests/mt-emil/input-lpd-bmp/Cars18.bmp new file mode 100644 index 000000000..6450fbb43 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars18.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars180.bmp b/tests/mt-emil/input-lpd-bmp/Cars180.bmp new file mode 100644 index 000000000..caaf09a0a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars180.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars181.bmp b/tests/mt-emil/input-lpd-bmp/Cars181.bmp new file mode 100644 index 000000000..50560d552 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars181.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars182.bmp b/tests/mt-emil/input-lpd-bmp/Cars182.bmp new file mode 100644 index 000000000..f47501419 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars182.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars183.bmp b/tests/mt-emil/input-lpd-bmp/Cars183.bmp new file mode 100644 index 000000000..8283d977e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars183.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars184.bmp b/tests/mt-emil/input-lpd-bmp/Cars184.bmp new file mode 100644 index 000000000..1d87ef7da Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars184.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars185.bmp b/tests/mt-emil/input-lpd-bmp/Cars185.bmp new file mode 100644 index 000000000..be6b839c2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars185.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars186.bmp b/tests/mt-emil/input-lpd-bmp/Cars186.bmp new file mode 100644 index 000000000..8470a9292 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars186.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars187.bmp b/tests/mt-emil/input-lpd-bmp/Cars187.bmp new file mode 100644 index 000000000..61b8517f0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars187.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars188.bmp b/tests/mt-emil/input-lpd-bmp/Cars188.bmp new file mode 100644 index 000000000..b3c933ade Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars188.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars189.bmp b/tests/mt-emil/input-lpd-bmp/Cars189.bmp new file mode 100644 index 000000000..4c70949ea Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars189.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars19.bmp b/tests/mt-emil/input-lpd-bmp/Cars19.bmp new file mode 100644 index 000000000..bf9d2e335 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars19.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars190.bmp b/tests/mt-emil/input-lpd-bmp/Cars190.bmp new file mode 100644 index 000000000..774a26e6b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars190.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars191.bmp b/tests/mt-emil/input-lpd-bmp/Cars191.bmp new file mode 100644 index 000000000..d1f4e7d92 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars191.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars192.bmp b/tests/mt-emil/input-lpd-bmp/Cars192.bmp new file mode 100644 index 000000000..253f0dd4a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars192.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars193.bmp b/tests/mt-emil/input-lpd-bmp/Cars193.bmp new file mode 100644 index 000000000..fd8f2b4d4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars193.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars194.bmp b/tests/mt-emil/input-lpd-bmp/Cars194.bmp new file mode 100644 index 000000000..fe132cc46 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars194.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars195.bmp b/tests/mt-emil/input-lpd-bmp/Cars195.bmp new file mode 100644 index 000000000..a4e5d72c4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars195.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars196.bmp b/tests/mt-emil/input-lpd-bmp/Cars196.bmp new file mode 100644 index 000000000..aad8a14f0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars196.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars197.bmp b/tests/mt-emil/input-lpd-bmp/Cars197.bmp new file mode 100644 index 000000000..17b08514a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars197.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars198.bmp b/tests/mt-emil/input-lpd-bmp/Cars198.bmp new file mode 100644 index 000000000..56aa10c70 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars198.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars199.bmp b/tests/mt-emil/input-lpd-bmp/Cars199.bmp new file mode 100644 index 000000000..44d31711f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars199.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars2.bmp b/tests/mt-emil/input-lpd-bmp/Cars2.bmp new file mode 100644 index 000000000..60ee5c64b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars2.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars20.bmp b/tests/mt-emil/input-lpd-bmp/Cars20.bmp new file mode 100644 index 000000000..f27cbcf85 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars20.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars200.bmp b/tests/mt-emil/input-lpd-bmp/Cars200.bmp new file mode 100644 index 000000000..d1f4e7d92 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars200.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars201.bmp b/tests/mt-emil/input-lpd-bmp/Cars201.bmp new file mode 100644 index 000000000..17b08514a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars201.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars202.bmp b/tests/mt-emil/input-lpd-bmp/Cars202.bmp new file mode 100644 index 000000000..0e998c8da Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars202.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars203.bmp b/tests/mt-emil/input-lpd-bmp/Cars203.bmp new file mode 100644 index 000000000..b6f8e60c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars203.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars204.bmp b/tests/mt-emil/input-lpd-bmp/Cars204.bmp new file mode 100644 index 000000000..e275c5940 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars204.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars205.bmp b/tests/mt-emil/input-lpd-bmp/Cars205.bmp new file mode 100644 index 000000000..ebaf47712 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars205.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars206.bmp b/tests/mt-emil/input-lpd-bmp/Cars206.bmp new file mode 100644 index 000000000..a7cdf23e4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars206.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars207.bmp b/tests/mt-emil/input-lpd-bmp/Cars207.bmp new file mode 100644 index 000000000..156be8ba0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars207.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars208.bmp b/tests/mt-emil/input-lpd-bmp/Cars208.bmp new file mode 100644 index 000000000..c5ae6093a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars208.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars209.bmp b/tests/mt-emil/input-lpd-bmp/Cars209.bmp new file mode 100644 index 000000000..c9ad1d446 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars209.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars21.bmp b/tests/mt-emil/input-lpd-bmp/Cars21.bmp new file mode 100644 index 000000000..d2b4f533d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars21.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars210.bmp b/tests/mt-emil/input-lpd-bmp/Cars210.bmp new file mode 100644 index 000000000..44d31711f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars210.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars211.bmp b/tests/mt-emil/input-lpd-bmp/Cars211.bmp new file mode 100644 index 000000000..8d6b7529a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars211.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars212.bmp b/tests/mt-emil/input-lpd-bmp/Cars212.bmp new file mode 100644 index 000000000..940674014 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars212.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars213.bmp b/tests/mt-emil/input-lpd-bmp/Cars213.bmp new file mode 100644 index 000000000..d76fa771d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars213.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars214.bmp b/tests/mt-emil/input-lpd-bmp/Cars214.bmp new file mode 100644 index 000000000..ee51e7e44 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars214.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars215.bmp b/tests/mt-emil/input-lpd-bmp/Cars215.bmp new file mode 100644 index 000000000..b34322566 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars215.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars216.bmp b/tests/mt-emil/input-lpd-bmp/Cars216.bmp new file mode 100644 index 000000000..4a12cbdbb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars216.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars217.bmp b/tests/mt-emil/input-lpd-bmp/Cars217.bmp new file mode 100644 index 000000000..bf9d2e335 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars217.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars218.bmp b/tests/mt-emil/input-lpd-bmp/Cars218.bmp new file mode 100644 index 000000000..540c7160f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars218.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars219.bmp b/tests/mt-emil/input-lpd-bmp/Cars219.bmp new file mode 100644 index 000000000..bc131edda Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars219.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars22.bmp b/tests/mt-emil/input-lpd-bmp/Cars22.bmp new file mode 100644 index 000000000..c3d01547b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars22.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars220.bmp b/tests/mt-emil/input-lpd-bmp/Cars220.bmp new file mode 100644 index 000000000..4f955c4e4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars220.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars221.bmp b/tests/mt-emil/input-lpd-bmp/Cars221.bmp new file mode 100644 index 000000000..0525f5d4c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars221.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars222.bmp b/tests/mt-emil/input-lpd-bmp/Cars222.bmp new file mode 100644 index 000000000..8470a9292 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars222.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars223.bmp b/tests/mt-emil/input-lpd-bmp/Cars223.bmp new file mode 100644 index 000000000..4b229b192 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars223.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars224.bmp b/tests/mt-emil/input-lpd-bmp/Cars224.bmp new file mode 100644 index 000000000..0960afc04 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars224.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars225.bmp b/tests/mt-emil/input-lpd-bmp/Cars225.bmp new file mode 100644 index 000000000..ff18dcda0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars225.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars226.bmp b/tests/mt-emil/input-lpd-bmp/Cars226.bmp new file mode 100644 index 000000000..539e4804a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars226.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars227.bmp b/tests/mt-emil/input-lpd-bmp/Cars227.bmp new file mode 100644 index 000000000..4c8c76135 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars227.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars228.bmp b/tests/mt-emil/input-lpd-bmp/Cars228.bmp new file mode 100644 index 000000000..4b68bce85 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars228.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars229.bmp b/tests/mt-emil/input-lpd-bmp/Cars229.bmp new file mode 100644 index 000000000..186e60166 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars229.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars23.bmp b/tests/mt-emil/input-lpd-bmp/Cars23.bmp new file mode 100644 index 000000000..608314a12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars23.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars230.bmp b/tests/mt-emil/input-lpd-bmp/Cars230.bmp new file mode 100644 index 000000000..17b08514a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars230.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars231.bmp b/tests/mt-emil/input-lpd-bmp/Cars231.bmp new file mode 100644 index 000000000..889efe658 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars231.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars232.bmp b/tests/mt-emil/input-lpd-bmp/Cars232.bmp new file mode 100644 index 000000000..03aacb296 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars232.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars233.bmp b/tests/mt-emil/input-lpd-bmp/Cars233.bmp new file mode 100644 index 000000000..f8a613448 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars233.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars234.bmp b/tests/mt-emil/input-lpd-bmp/Cars234.bmp new file mode 100644 index 000000000..e940ee43c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars234.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars235.bmp b/tests/mt-emil/input-lpd-bmp/Cars235.bmp new file mode 100644 index 000000000..966266993 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars235.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars236.bmp b/tests/mt-emil/input-lpd-bmp/Cars236.bmp new file mode 100644 index 000000000..e92f08941 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars236.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars237.bmp b/tests/mt-emil/input-lpd-bmp/Cars237.bmp new file mode 100644 index 000000000..2e45f0590 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars237.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars238.bmp b/tests/mt-emil/input-lpd-bmp/Cars238.bmp new file mode 100644 index 000000000..56dbb1d2d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars238.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars239.bmp b/tests/mt-emil/input-lpd-bmp/Cars239.bmp new file mode 100644 index 000000000..0334161c1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars239.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars24.bmp b/tests/mt-emil/input-lpd-bmp/Cars24.bmp new file mode 100644 index 000000000..e392290e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars24.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars240.bmp b/tests/mt-emil/input-lpd-bmp/Cars240.bmp new file mode 100644 index 000000000..59ee52ca0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars240.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars241.bmp b/tests/mt-emil/input-lpd-bmp/Cars241.bmp new file mode 100644 index 000000000..b29672925 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars241.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars242.bmp b/tests/mt-emil/input-lpd-bmp/Cars242.bmp new file mode 100644 index 000000000..60ee5c64b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars242.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars243.bmp b/tests/mt-emil/input-lpd-bmp/Cars243.bmp new file mode 100644 index 000000000..77c10f1d0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars243.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars244.bmp b/tests/mt-emil/input-lpd-bmp/Cars244.bmp new file mode 100644 index 000000000..3cc275781 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars244.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars245.bmp b/tests/mt-emil/input-lpd-bmp/Cars245.bmp new file mode 100644 index 000000000..238f7a846 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars245.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars246.bmp b/tests/mt-emil/input-lpd-bmp/Cars246.bmp new file mode 100644 index 000000000..fc5d6d562 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars246.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars247.bmp b/tests/mt-emil/input-lpd-bmp/Cars247.bmp new file mode 100644 index 000000000..56ab1f2b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars247.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars248.bmp b/tests/mt-emil/input-lpd-bmp/Cars248.bmp new file mode 100644 index 000000000..c6637ec9e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars248.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars249.bmp b/tests/mt-emil/input-lpd-bmp/Cars249.bmp new file mode 100644 index 000000000..a81604ac5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars249.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars25.bmp b/tests/mt-emil/input-lpd-bmp/Cars25.bmp new file mode 100644 index 000000000..7bf61a740 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars25.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars250.bmp b/tests/mt-emil/input-lpd-bmp/Cars250.bmp new file mode 100644 index 000000000..4ef5331a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars250.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars251.bmp b/tests/mt-emil/input-lpd-bmp/Cars251.bmp new file mode 100644 index 000000000..5d9d26208 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars251.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars252.bmp b/tests/mt-emil/input-lpd-bmp/Cars252.bmp new file mode 100644 index 000000000..c56b6e536 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars252.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars253.bmp b/tests/mt-emil/input-lpd-bmp/Cars253.bmp new file mode 100644 index 000000000..51cbb3815 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars253.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars254.bmp b/tests/mt-emil/input-lpd-bmp/Cars254.bmp new file mode 100644 index 000000000..147910bce Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars254.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars255.bmp b/tests/mt-emil/input-lpd-bmp/Cars255.bmp new file mode 100644 index 000000000..d7dad64ab Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars255.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars256.bmp b/tests/mt-emil/input-lpd-bmp/Cars256.bmp new file mode 100644 index 000000000..429d45744 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars256.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars257.bmp b/tests/mt-emil/input-lpd-bmp/Cars257.bmp new file mode 100644 index 000000000..f81605d1d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars257.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars258.bmp b/tests/mt-emil/input-lpd-bmp/Cars258.bmp new file mode 100644 index 000000000..c08eab71e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars258.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars259.bmp b/tests/mt-emil/input-lpd-bmp/Cars259.bmp new file mode 100644 index 000000000..bd9bed236 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars259.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars26.bmp b/tests/mt-emil/input-lpd-bmp/Cars26.bmp new file mode 100644 index 000000000..226b331e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars26.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars260.bmp b/tests/mt-emil/input-lpd-bmp/Cars260.bmp new file mode 100644 index 000000000..ad73496e5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars260.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars261.bmp b/tests/mt-emil/input-lpd-bmp/Cars261.bmp new file mode 100644 index 000000000..4da04812b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars261.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars262.bmp b/tests/mt-emil/input-lpd-bmp/Cars262.bmp new file mode 100644 index 000000000..77bd99a28 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars262.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars263.bmp b/tests/mt-emil/input-lpd-bmp/Cars263.bmp new file mode 100644 index 000000000..f4df5c158 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars263.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars264.bmp b/tests/mt-emil/input-lpd-bmp/Cars264.bmp new file mode 100644 index 000000000..43511d62c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars264.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars265.bmp b/tests/mt-emil/input-lpd-bmp/Cars265.bmp new file mode 100644 index 000000000..5c21173bf Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars265.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars266.bmp b/tests/mt-emil/input-lpd-bmp/Cars266.bmp new file mode 100644 index 000000000..b34322566 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars266.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars267.bmp b/tests/mt-emil/input-lpd-bmp/Cars267.bmp new file mode 100644 index 000000000..4f938d717 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars267.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars268.bmp b/tests/mt-emil/input-lpd-bmp/Cars268.bmp new file mode 100644 index 000000000..95ff840f2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars268.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars269.bmp b/tests/mt-emil/input-lpd-bmp/Cars269.bmp new file mode 100644 index 000000000..4b3576413 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars269.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars27.bmp b/tests/mt-emil/input-lpd-bmp/Cars27.bmp new file mode 100644 index 000000000..25cef283a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars27.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars270.bmp b/tests/mt-emil/input-lpd-bmp/Cars270.bmp new file mode 100644 index 000000000..0e50ace2f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars270.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars271.bmp b/tests/mt-emil/input-lpd-bmp/Cars271.bmp new file mode 100644 index 000000000..86d5e0cd3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars271.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars272.bmp b/tests/mt-emil/input-lpd-bmp/Cars272.bmp new file mode 100644 index 000000000..9685b96eb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars272.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars273.bmp b/tests/mt-emil/input-lpd-bmp/Cars273.bmp new file mode 100644 index 000000000..8283d977e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars273.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars274.bmp b/tests/mt-emil/input-lpd-bmp/Cars274.bmp new file mode 100644 index 000000000..ba490ffee Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars274.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars275.bmp b/tests/mt-emil/input-lpd-bmp/Cars275.bmp new file mode 100644 index 000000000..cb0195285 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars275.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars276.bmp b/tests/mt-emil/input-lpd-bmp/Cars276.bmp new file mode 100644 index 000000000..b6f8e60c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars276.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars277.bmp b/tests/mt-emil/input-lpd-bmp/Cars277.bmp new file mode 100644 index 000000000..2656c5f7f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars277.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars278.bmp b/tests/mt-emil/input-lpd-bmp/Cars278.bmp new file mode 100644 index 000000000..a3526864e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars278.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars279.bmp b/tests/mt-emil/input-lpd-bmp/Cars279.bmp new file mode 100644 index 000000000..74bc79c2f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars279.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars28.bmp b/tests/mt-emil/input-lpd-bmp/Cars28.bmp new file mode 100644 index 000000000..af09e0c40 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars28.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars280.bmp b/tests/mt-emil/input-lpd-bmp/Cars280.bmp new file mode 100644 index 000000000..989cce4c5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars280.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars281.bmp b/tests/mt-emil/input-lpd-bmp/Cars281.bmp new file mode 100644 index 000000000..fa07e0a9b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars281.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars282.bmp b/tests/mt-emil/input-lpd-bmp/Cars282.bmp new file mode 100644 index 000000000..ae3654e98 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars282.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars283.bmp b/tests/mt-emil/input-lpd-bmp/Cars283.bmp new file mode 100644 index 000000000..f20ce08c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars283.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars284.bmp b/tests/mt-emil/input-lpd-bmp/Cars284.bmp new file mode 100644 index 000000000..49b99053c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars284.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars285.bmp b/tests/mt-emil/input-lpd-bmp/Cars285.bmp new file mode 100644 index 000000000..238f7a846 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars285.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars286.bmp b/tests/mt-emil/input-lpd-bmp/Cars286.bmp new file mode 100644 index 000000000..ae0a635c6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars286.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars287.bmp b/tests/mt-emil/input-lpd-bmp/Cars287.bmp new file mode 100644 index 000000000..24d028fa7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars287.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars288.bmp b/tests/mt-emil/input-lpd-bmp/Cars288.bmp new file mode 100644 index 000000000..cb0195285 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars288.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars289.bmp b/tests/mt-emil/input-lpd-bmp/Cars289.bmp new file mode 100644 index 000000000..30e2b5151 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars289.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars29.bmp b/tests/mt-emil/input-lpd-bmp/Cars29.bmp new file mode 100644 index 000000000..608314a12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars29.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars290.bmp b/tests/mt-emil/input-lpd-bmp/Cars290.bmp new file mode 100644 index 000000000..36e534f45 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars290.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars291.bmp b/tests/mt-emil/input-lpd-bmp/Cars291.bmp new file mode 100644 index 000000000..2c2f11bce Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars291.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars292.bmp b/tests/mt-emil/input-lpd-bmp/Cars292.bmp new file mode 100644 index 000000000..d8afd9282 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars292.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars293.bmp b/tests/mt-emil/input-lpd-bmp/Cars293.bmp new file mode 100644 index 000000000..889efe658 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars293.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars294.bmp b/tests/mt-emil/input-lpd-bmp/Cars294.bmp new file mode 100644 index 000000000..b55720667 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars294.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars295.bmp b/tests/mt-emil/input-lpd-bmp/Cars295.bmp new file mode 100644 index 000000000..2767df0a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars295.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars296.bmp b/tests/mt-emil/input-lpd-bmp/Cars296.bmp new file mode 100644 index 000000000..058096fca Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars296.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars297.bmp b/tests/mt-emil/input-lpd-bmp/Cars297.bmp new file mode 100644 index 000000000..e940ee43c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars297.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars298.bmp b/tests/mt-emil/input-lpd-bmp/Cars298.bmp new file mode 100644 index 000000000..520ae4252 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars298.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars299.bmp b/tests/mt-emil/input-lpd-bmp/Cars299.bmp new file mode 100644 index 000000000..993a3b973 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars299.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars3.bmp b/tests/mt-emil/input-lpd-bmp/Cars3.bmp new file mode 100644 index 000000000..25cef283a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars3.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars30.bmp b/tests/mt-emil/input-lpd-bmp/Cars30.bmp new file mode 100644 index 000000000..a167c30eb Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars30.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars300.bmp b/tests/mt-emil/input-lpd-bmp/Cars300.bmp new file mode 100644 index 000000000..226b331e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars300.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars301.bmp b/tests/mt-emil/input-lpd-bmp/Cars301.bmp new file mode 100644 index 000000000..3d5c46fe5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars301.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars302.bmp b/tests/mt-emil/input-lpd-bmp/Cars302.bmp new file mode 100644 index 000000000..0a764a3bc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars302.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars303.bmp b/tests/mt-emil/input-lpd-bmp/Cars303.bmp new file mode 100644 index 000000000..774a26e6b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars303.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars304.bmp b/tests/mt-emil/input-lpd-bmp/Cars304.bmp new file mode 100644 index 000000000..99f614bac Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars304.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars305.bmp b/tests/mt-emil/input-lpd-bmp/Cars305.bmp new file mode 100644 index 000000000..d9664432c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars305.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars306.bmp b/tests/mt-emil/input-lpd-bmp/Cars306.bmp new file mode 100644 index 000000000..628081ffa Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars306.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars307.bmp b/tests/mt-emil/input-lpd-bmp/Cars307.bmp new file mode 100644 index 000000000..4ccd85e5f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars307.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars308.bmp b/tests/mt-emil/input-lpd-bmp/Cars308.bmp new file mode 100644 index 000000000..d95c08523 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars308.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars309.bmp b/tests/mt-emil/input-lpd-bmp/Cars309.bmp new file mode 100644 index 000000000..f79fb7c3a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars309.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars31.bmp b/tests/mt-emil/input-lpd-bmp/Cars31.bmp new file mode 100644 index 000000000..429d45744 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars31.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars310.bmp b/tests/mt-emil/input-lpd-bmp/Cars310.bmp new file mode 100644 index 000000000..dafe176e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars310.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars311.bmp b/tests/mt-emil/input-lpd-bmp/Cars311.bmp new file mode 100644 index 000000000..9dda52954 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars311.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars312.bmp b/tests/mt-emil/input-lpd-bmp/Cars312.bmp new file mode 100644 index 000000000..4c9bd7226 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars312.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars313.bmp b/tests/mt-emil/input-lpd-bmp/Cars313.bmp new file mode 100644 index 000000000..b24244110 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars313.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars314.bmp b/tests/mt-emil/input-lpd-bmp/Cars314.bmp new file mode 100644 index 000000000..194d192a5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars314.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars315.bmp b/tests/mt-emil/input-lpd-bmp/Cars315.bmp new file mode 100644 index 000000000..6b64c4f7c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars315.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars316.bmp b/tests/mt-emil/input-lpd-bmp/Cars316.bmp new file mode 100644 index 000000000..8b2deaa20 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars316.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars317.bmp b/tests/mt-emil/input-lpd-bmp/Cars317.bmp new file mode 100644 index 000000000..e392290e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars317.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars318.bmp b/tests/mt-emil/input-lpd-bmp/Cars318.bmp new file mode 100644 index 000000000..61b8517f0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars318.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars319.bmp b/tests/mt-emil/input-lpd-bmp/Cars319.bmp new file mode 100644 index 000000000..0fe9cb553 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars319.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars32.bmp b/tests/mt-emil/input-lpd-bmp/Cars32.bmp new file mode 100644 index 000000000..ba490ffee Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars32.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars320.bmp b/tests/mt-emil/input-lpd-bmp/Cars320.bmp new file mode 100644 index 000000000..49b99053c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars320.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars321.bmp b/tests/mt-emil/input-lpd-bmp/Cars321.bmp new file mode 100644 index 000000000..f3f31697e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars321.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars322.bmp b/tests/mt-emil/input-lpd-bmp/Cars322.bmp new file mode 100644 index 000000000..9d386959d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars322.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars323.bmp b/tests/mt-emil/input-lpd-bmp/Cars323.bmp new file mode 100644 index 000000000..20bf27296 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars323.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars324.bmp b/tests/mt-emil/input-lpd-bmp/Cars324.bmp new file mode 100644 index 000000000..f47501419 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars324.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars325.bmp b/tests/mt-emil/input-lpd-bmp/Cars325.bmp new file mode 100644 index 000000000..34eeda0ad Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars325.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars326.bmp b/tests/mt-emil/input-lpd-bmp/Cars326.bmp new file mode 100644 index 000000000..d290c04ff Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars326.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars327.bmp b/tests/mt-emil/input-lpd-bmp/Cars327.bmp new file mode 100644 index 000000000..4ef5331a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars327.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars328.bmp b/tests/mt-emil/input-lpd-bmp/Cars328.bmp new file mode 100644 index 000000000..e940ee43c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars328.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars329.bmp b/tests/mt-emil/input-lpd-bmp/Cars329.bmp new file mode 100644 index 000000000..ee0deeb9d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars329.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars33.bmp b/tests/mt-emil/input-lpd-bmp/Cars33.bmp new file mode 100644 index 000000000..7565c920b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars33.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars330.bmp b/tests/mt-emil/input-lpd-bmp/Cars330.bmp new file mode 100644 index 000000000..f40ec0fcf Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars330.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars331.bmp b/tests/mt-emil/input-lpd-bmp/Cars331.bmp new file mode 100644 index 000000000..de55d283e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars331.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars332.bmp b/tests/mt-emil/input-lpd-bmp/Cars332.bmp new file mode 100644 index 000000000..25cef283a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars332.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars333.bmp b/tests/mt-emil/input-lpd-bmp/Cars333.bmp new file mode 100644 index 000000000..d7dad64ab Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars333.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars334.bmp b/tests/mt-emil/input-lpd-bmp/Cars334.bmp new file mode 100644 index 000000000..0478dc5af Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars334.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars335.bmp b/tests/mt-emil/input-lpd-bmp/Cars335.bmp new file mode 100644 index 000000000..ebaf47712 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars335.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars336.bmp b/tests/mt-emil/input-lpd-bmp/Cars336.bmp new file mode 100644 index 000000000..d290c04ff Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars336.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars337.bmp b/tests/mt-emil/input-lpd-bmp/Cars337.bmp new file mode 100644 index 000000000..f3f7cd038 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars337.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars338.bmp b/tests/mt-emil/input-lpd-bmp/Cars338.bmp new file mode 100644 index 000000000..854800c3c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars338.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars339.bmp b/tests/mt-emil/input-lpd-bmp/Cars339.bmp new file mode 100644 index 000000000..39eff3172 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars339.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars34.bmp b/tests/mt-emil/input-lpd-bmp/Cars34.bmp new file mode 100644 index 000000000..24d028fa7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars34.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars340.bmp b/tests/mt-emil/input-lpd-bmp/Cars340.bmp new file mode 100644 index 000000000..692a22f54 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars340.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars341.bmp b/tests/mt-emil/input-lpd-bmp/Cars341.bmp new file mode 100644 index 000000000..fc5d6d562 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars341.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars342.bmp b/tests/mt-emil/input-lpd-bmp/Cars342.bmp new file mode 100644 index 000000000..ba490ffee Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars342.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars343.bmp b/tests/mt-emil/input-lpd-bmp/Cars343.bmp new file mode 100644 index 000000000..e63fef0a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars343.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars344.bmp b/tests/mt-emil/input-lpd-bmp/Cars344.bmp new file mode 100644 index 000000000..68cadf998 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars344.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars345.bmp b/tests/mt-emil/input-lpd-bmp/Cars345.bmp new file mode 100644 index 000000000..178785975 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars345.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars346.bmp b/tests/mt-emil/input-lpd-bmp/Cars346.bmp new file mode 100644 index 000000000..d1f4e7d92 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars346.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars347.bmp b/tests/mt-emil/input-lpd-bmp/Cars347.bmp new file mode 100644 index 000000000..4db81265c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars347.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars348.bmp b/tests/mt-emil/input-lpd-bmp/Cars348.bmp new file mode 100644 index 000000000..f79fb7c3a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars348.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars349.bmp b/tests/mt-emil/input-lpd-bmp/Cars349.bmp new file mode 100644 index 000000000..a25cf7d23 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars349.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars35.bmp b/tests/mt-emil/input-lpd-bmp/Cars35.bmp new file mode 100644 index 000000000..d8afd9282 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars35.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars350.bmp b/tests/mt-emil/input-lpd-bmp/Cars350.bmp new file mode 100644 index 000000000..c96fac7a8 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars350.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars351.bmp b/tests/mt-emil/input-lpd-bmp/Cars351.bmp new file mode 100644 index 000000000..142ee6d04 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars351.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars352.bmp b/tests/mt-emil/input-lpd-bmp/Cars352.bmp new file mode 100644 index 000000000..70c3a919d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars352.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars353.bmp b/tests/mt-emil/input-lpd-bmp/Cars353.bmp new file mode 100644 index 000000000..d1f4e7d92 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars353.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars354.bmp b/tests/mt-emil/input-lpd-bmp/Cars354.bmp new file mode 100644 index 000000000..5785d8b7e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars354.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars355.bmp b/tests/mt-emil/input-lpd-bmp/Cars355.bmp new file mode 100644 index 000000000..637e51f6f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars355.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars356.bmp b/tests/mt-emil/input-lpd-bmp/Cars356.bmp new file mode 100644 index 000000000..f34224cf5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars356.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars357.bmp b/tests/mt-emil/input-lpd-bmp/Cars357.bmp new file mode 100644 index 000000000..d8afd9282 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars357.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars358.bmp b/tests/mt-emil/input-lpd-bmp/Cars358.bmp new file mode 100644 index 000000000..afd7b2663 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars358.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars359.bmp b/tests/mt-emil/input-lpd-bmp/Cars359.bmp new file mode 100644 index 000000000..d5a37730b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars359.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars36.bmp b/tests/mt-emil/input-lpd-bmp/Cars36.bmp new file mode 100644 index 000000000..ae0a635c6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars36.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars360.bmp b/tests/mt-emil/input-lpd-bmp/Cars360.bmp new file mode 100644 index 000000000..be12e65b6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars360.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars361.bmp b/tests/mt-emil/input-lpd-bmp/Cars361.bmp new file mode 100644 index 000000000..caaf09a0a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars361.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars362.bmp b/tests/mt-emil/input-lpd-bmp/Cars362.bmp new file mode 100644 index 000000000..bb57c37fd Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars362.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars363.bmp b/tests/mt-emil/input-lpd-bmp/Cars363.bmp new file mode 100644 index 000000000..77c6a373a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars363.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars364.bmp b/tests/mt-emil/input-lpd-bmp/Cars364.bmp new file mode 100644 index 000000000..2c8e6bea3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars364.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars365.bmp b/tests/mt-emil/input-lpd-bmp/Cars365.bmp new file mode 100644 index 000000000..d62552516 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars365.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars366.bmp b/tests/mt-emil/input-lpd-bmp/Cars366.bmp new file mode 100644 index 000000000..06d8a102a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars366.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars367.bmp b/tests/mt-emil/input-lpd-bmp/Cars367.bmp new file mode 100644 index 000000000..68cadf998 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars367.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars368.bmp b/tests/mt-emil/input-lpd-bmp/Cars368.bmp new file mode 100644 index 000000000..03aacb296 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars368.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars369.bmp b/tests/mt-emil/input-lpd-bmp/Cars369.bmp new file mode 100644 index 000000000..0334161c1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars369.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars37.bmp b/tests/mt-emil/input-lpd-bmp/Cars37.bmp new file mode 100644 index 000000000..12f755d06 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars37.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars370.bmp b/tests/mt-emil/input-lpd-bmp/Cars370.bmp new file mode 100644 index 000000000..4c70949ea Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars370.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars371.bmp b/tests/mt-emil/input-lpd-bmp/Cars371.bmp new file mode 100644 index 000000000..68304644e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars371.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars372.bmp b/tests/mt-emil/input-lpd-bmp/Cars372.bmp new file mode 100644 index 000000000..0c061cf15 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars372.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars373.bmp b/tests/mt-emil/input-lpd-bmp/Cars373.bmp new file mode 100644 index 000000000..82c81f50d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars373.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars374.bmp b/tests/mt-emil/input-lpd-bmp/Cars374.bmp new file mode 100644 index 000000000..a988e9de1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars374.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars375.bmp b/tests/mt-emil/input-lpd-bmp/Cars375.bmp new file mode 100644 index 000000000..2ade19949 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars375.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars376.bmp b/tests/mt-emil/input-lpd-bmp/Cars376.bmp new file mode 100644 index 000000000..c57706bfc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars376.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars377.bmp b/tests/mt-emil/input-lpd-bmp/Cars377.bmp new file mode 100644 index 000000000..7bf61a740 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars377.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars378.bmp b/tests/mt-emil/input-lpd-bmp/Cars378.bmp new file mode 100644 index 000000000..d9528e874 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars378.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars379.bmp b/tests/mt-emil/input-lpd-bmp/Cars379.bmp new file mode 100644 index 000000000..c3e5704b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars379.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars38.bmp b/tests/mt-emil/input-lpd-bmp/Cars38.bmp new file mode 100644 index 000000000..9f9fc3f37 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars38.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars380.bmp b/tests/mt-emil/input-lpd-bmp/Cars380.bmp new file mode 100644 index 000000000..f980c4ee3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars380.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars381.bmp b/tests/mt-emil/input-lpd-bmp/Cars381.bmp new file mode 100644 index 000000000..c82339aae Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars381.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars382.bmp b/tests/mt-emil/input-lpd-bmp/Cars382.bmp new file mode 100644 index 000000000..60f924b83 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars382.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars383.bmp b/tests/mt-emil/input-lpd-bmp/Cars383.bmp new file mode 100644 index 000000000..6b13cf47e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars383.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars384.bmp b/tests/mt-emil/input-lpd-bmp/Cars384.bmp new file mode 100644 index 000000000..ca19f6ed9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars384.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars385.bmp b/tests/mt-emil/input-lpd-bmp/Cars385.bmp new file mode 100644 index 000000000..b08267bb2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars385.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars386.bmp b/tests/mt-emil/input-lpd-bmp/Cars386.bmp new file mode 100644 index 000000000..e9f5c4655 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars386.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars387.bmp b/tests/mt-emil/input-lpd-bmp/Cars387.bmp new file mode 100644 index 000000000..6c293af37 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars387.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars388.bmp b/tests/mt-emil/input-lpd-bmp/Cars388.bmp new file mode 100644 index 000000000..8b3c9a15e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars388.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars389.bmp b/tests/mt-emil/input-lpd-bmp/Cars389.bmp new file mode 100644 index 000000000..e9f5c4655 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars389.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars39.bmp b/tests/mt-emil/input-lpd-bmp/Cars39.bmp new file mode 100644 index 000000000..207a05bb0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars39.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars390.bmp b/tests/mt-emil/input-lpd-bmp/Cars390.bmp new file mode 100644 index 000000000..bed694d8f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars390.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars391.bmp b/tests/mt-emil/input-lpd-bmp/Cars391.bmp new file mode 100644 index 000000000..2f0d86d78 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars391.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars392.bmp b/tests/mt-emil/input-lpd-bmp/Cars392.bmp new file mode 100644 index 000000000..a8b10b294 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars392.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars393.bmp b/tests/mt-emil/input-lpd-bmp/Cars393.bmp new file mode 100644 index 000000000..5c21173bf Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars393.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars394.bmp b/tests/mt-emil/input-lpd-bmp/Cars394.bmp new file mode 100644 index 000000000..87b943681 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars394.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars395.bmp b/tests/mt-emil/input-lpd-bmp/Cars395.bmp new file mode 100644 index 000000000..77bd99a28 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars395.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars396.bmp b/tests/mt-emil/input-lpd-bmp/Cars396.bmp new file mode 100644 index 000000000..f466ff12b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars396.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars397.bmp b/tests/mt-emil/input-lpd-bmp/Cars397.bmp new file mode 100644 index 000000000..608314a12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars397.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars398.bmp b/tests/mt-emil/input-lpd-bmp/Cars398.bmp new file mode 100644 index 000000000..74bc79c2f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars398.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars399.bmp b/tests/mt-emil/input-lpd-bmp/Cars399.bmp new file mode 100644 index 000000000..7565c920b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars399.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars4.bmp b/tests/mt-emil/input-lpd-bmp/Cars4.bmp new file mode 100644 index 000000000..4c9bd7226 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars4.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars40.bmp b/tests/mt-emil/input-lpd-bmp/Cars40.bmp new file mode 100644 index 000000000..226b331e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars40.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars400.bmp b/tests/mt-emil/input-lpd-bmp/Cars400.bmp new file mode 100644 index 000000000..fd8f2b4d4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars400.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars401.bmp b/tests/mt-emil/input-lpd-bmp/Cars401.bmp new file mode 100644 index 000000000..d95c08523 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars401.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars402.bmp b/tests/mt-emil/input-lpd-bmp/Cars402.bmp new file mode 100644 index 000000000..d9664432c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars402.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars403.bmp b/tests/mt-emil/input-lpd-bmp/Cars403.bmp new file mode 100644 index 000000000..d85285b9d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars403.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars404.bmp b/tests/mt-emil/input-lpd-bmp/Cars404.bmp new file mode 100644 index 000000000..348b92b29 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars404.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars405.bmp b/tests/mt-emil/input-lpd-bmp/Cars405.bmp new file mode 100644 index 000000000..2a7f86f2c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars405.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars406.bmp b/tests/mt-emil/input-lpd-bmp/Cars406.bmp new file mode 100644 index 000000000..49df7af9b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars406.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars407.bmp b/tests/mt-emil/input-lpd-bmp/Cars407.bmp new file mode 100644 index 000000000..2eb3231b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars407.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars408.bmp b/tests/mt-emil/input-lpd-bmp/Cars408.bmp new file mode 100644 index 000000000..4a012fc11 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars408.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars409.bmp b/tests/mt-emil/input-lpd-bmp/Cars409.bmp new file mode 100644 index 000000000..a27700544 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars409.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars41.bmp b/tests/mt-emil/input-lpd-bmp/Cars41.bmp new file mode 100644 index 000000000..1b6a5697e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars41.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars410.bmp b/tests/mt-emil/input-lpd-bmp/Cars410.bmp new file mode 100644 index 000000000..19b7419fc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars410.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars411.bmp b/tests/mt-emil/input-lpd-bmp/Cars411.bmp new file mode 100644 index 000000000..3e670add9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars411.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars412.bmp b/tests/mt-emil/input-lpd-bmp/Cars412.bmp new file mode 100644 index 000000000..17b08514a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars412.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars413.bmp b/tests/mt-emil/input-lpd-bmp/Cars413.bmp new file mode 100644 index 000000000..d4ab50ed2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars413.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars414.bmp b/tests/mt-emil/input-lpd-bmp/Cars414.bmp new file mode 100644 index 000000000..d45094b5e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars414.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars415.bmp b/tests/mt-emil/input-lpd-bmp/Cars415.bmp new file mode 100644 index 000000000..e18d0066c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars415.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars416.bmp b/tests/mt-emil/input-lpd-bmp/Cars416.bmp new file mode 100644 index 000000000..a0e18d86a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars416.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars417.bmp b/tests/mt-emil/input-lpd-bmp/Cars417.bmp new file mode 100644 index 000000000..e0a23e3a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars417.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars418.bmp b/tests/mt-emil/input-lpd-bmp/Cars418.bmp new file mode 100644 index 000000000..7565c920b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars418.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars419.bmp b/tests/mt-emil/input-lpd-bmp/Cars419.bmp new file mode 100644 index 000000000..c3e5704b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars419.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars42.bmp b/tests/mt-emil/input-lpd-bmp/Cars42.bmp new file mode 100644 index 000000000..7bf61a740 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars42.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars420.bmp b/tests/mt-emil/input-lpd-bmp/Cars420.bmp new file mode 100644 index 000000000..e63fef0a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars420.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars421.bmp b/tests/mt-emil/input-lpd-bmp/Cars421.bmp new file mode 100644 index 000000000..3777c80fe Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars421.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars422.bmp b/tests/mt-emil/input-lpd-bmp/Cars422.bmp new file mode 100644 index 000000000..d99746ef4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars422.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars423.bmp b/tests/mt-emil/input-lpd-bmp/Cars423.bmp new file mode 100644 index 000000000..83a24d19d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars423.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars424.bmp b/tests/mt-emil/input-lpd-bmp/Cars424.bmp new file mode 100644 index 000000000..bc131edda Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars424.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars425.bmp b/tests/mt-emil/input-lpd-bmp/Cars425.bmp new file mode 100644 index 000000000..3d5c46fe5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars425.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars426.bmp b/tests/mt-emil/input-lpd-bmp/Cars426.bmp new file mode 100644 index 000000000..60f924b83 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars426.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars427.bmp b/tests/mt-emil/input-lpd-bmp/Cars427.bmp new file mode 100644 index 000000000..a64883f4b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars427.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars428.bmp b/tests/mt-emil/input-lpd-bmp/Cars428.bmp new file mode 100644 index 000000000..25cef283a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars428.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars429.bmp b/tests/mt-emil/input-lpd-bmp/Cars429.bmp new file mode 100644 index 000000000..4039ba40f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars429.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars43.bmp b/tests/mt-emil/input-lpd-bmp/Cars43.bmp new file mode 100644 index 000000000..06d8a102a Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars43.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars430.bmp b/tests/mt-emil/input-lpd-bmp/Cars430.bmp new file mode 100644 index 000000000..dce210332 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars430.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars431.bmp b/tests/mt-emil/input-lpd-bmp/Cars431.bmp new file mode 100644 index 000000000..77e378278 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars431.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars432.bmp b/tests/mt-emil/input-lpd-bmp/Cars432.bmp new file mode 100644 index 000000000..7e045baf9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars432.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars44.bmp b/tests/mt-emil/input-lpd-bmp/Cars44.bmp new file mode 100644 index 000000000..f4a737b19 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars44.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars45.bmp b/tests/mt-emil/input-lpd-bmp/Cars45.bmp new file mode 100644 index 000000000..0d169895e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars45.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars46.bmp b/tests/mt-emil/input-lpd-bmp/Cars46.bmp new file mode 100644 index 000000000..c3e5704b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars46.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars47.bmp b/tests/mt-emil/input-lpd-bmp/Cars47.bmp new file mode 100644 index 000000000..bed694d8f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars47.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars48.bmp b/tests/mt-emil/input-lpd-bmp/Cars48.bmp new file mode 100644 index 000000000..61b8517f0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars48.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars49.bmp b/tests/mt-emil/input-lpd-bmp/Cars49.bmp new file mode 100644 index 000000000..c738dcca6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars49.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars5.bmp b/tests/mt-emil/input-lpd-bmp/Cars5.bmp new file mode 100644 index 000000000..cb7a84c19 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars5.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars50.bmp b/tests/mt-emil/input-lpd-bmp/Cars50.bmp new file mode 100644 index 000000000..4c9bd7226 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars50.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars51.bmp b/tests/mt-emil/input-lpd-bmp/Cars51.bmp new file mode 100644 index 000000000..86d5e0cd3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars51.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars52.bmp b/tests/mt-emil/input-lpd-bmp/Cars52.bmp new file mode 100644 index 000000000..207a05bb0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars52.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars53.bmp b/tests/mt-emil/input-lpd-bmp/Cars53.bmp new file mode 100644 index 000000000..43301750b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars53.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars54.bmp b/tests/mt-emil/input-lpd-bmp/Cars54.bmp new file mode 100644 index 000000000..b660e2473 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars54.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars55.bmp b/tests/mt-emil/input-lpd-bmp/Cars55.bmp new file mode 100644 index 000000000..608314a12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars55.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars56.bmp b/tests/mt-emil/input-lpd-bmp/Cars56.bmp new file mode 100644 index 000000000..77e378278 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars56.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars57.bmp b/tests/mt-emil/input-lpd-bmp/Cars57.bmp new file mode 100644 index 000000000..2f0d86d78 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars57.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars58.bmp b/tests/mt-emil/input-lpd-bmp/Cars58.bmp new file mode 100644 index 000000000..fa07e0a9b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars58.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars59.bmp b/tests/mt-emil/input-lpd-bmp/Cars59.bmp new file mode 100644 index 000000000..ad44aafd0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars59.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars6.bmp b/tests/mt-emil/input-lpd-bmp/Cars6.bmp new file mode 100644 index 000000000..5fdbb1849 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars6.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars60.bmp b/tests/mt-emil/input-lpd-bmp/Cars60.bmp new file mode 100644 index 000000000..09590a66b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars60.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars61.bmp b/tests/mt-emil/input-lpd-bmp/Cars61.bmp new file mode 100644 index 000000000..74bc79c2f Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars61.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars62.bmp b/tests/mt-emil/input-lpd-bmp/Cars62.bmp new file mode 100644 index 000000000..3b4bbeefc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars62.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars63.bmp b/tests/mt-emil/input-lpd-bmp/Cars63.bmp new file mode 100644 index 000000000..e6c890bfe Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars63.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars64.bmp b/tests/mt-emil/input-lpd-bmp/Cars64.bmp new file mode 100644 index 000000000..9bef36909 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars64.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars65.bmp b/tests/mt-emil/input-lpd-bmp/Cars65.bmp new file mode 100644 index 000000000..61d0b13d4 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars65.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars66.bmp b/tests/mt-emil/input-lpd-bmp/Cars66.bmp new file mode 100644 index 000000000..608314a12 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars66.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars67.bmp b/tests/mt-emil/input-lpd-bmp/Cars67.bmp new file mode 100644 index 000000000..955fa7abf Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars67.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars68.bmp b/tests/mt-emil/input-lpd-bmp/Cars68.bmp new file mode 100644 index 000000000..9f7b7a373 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars68.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars69.bmp b/tests/mt-emil/input-lpd-bmp/Cars69.bmp new file mode 100644 index 000000000..0bbff1a43 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars69.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars7.bmp b/tests/mt-emil/input-lpd-bmp/Cars7.bmp new file mode 100644 index 000000000..6dae77760 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars7.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars70.bmp b/tests/mt-emil/input-lpd-bmp/Cars70.bmp new file mode 100644 index 000000000..8bb303112 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars70.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars71.bmp b/tests/mt-emil/input-lpd-bmp/Cars71.bmp new file mode 100644 index 000000000..f50093032 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars71.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars72.bmp b/tests/mt-emil/input-lpd-bmp/Cars72.bmp new file mode 100644 index 000000000..24d028fa7 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars72.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars73.bmp b/tests/mt-emil/input-lpd-bmp/Cars73.bmp new file mode 100644 index 000000000..20bf27296 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars73.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars74.bmp b/tests/mt-emil/input-lpd-bmp/Cars74.bmp new file mode 100644 index 000000000..b6f8e60c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars74.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars75.bmp b/tests/mt-emil/input-lpd-bmp/Cars75.bmp new file mode 100644 index 000000000..2ff320733 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars75.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars76.bmp b/tests/mt-emil/input-lpd-bmp/Cars76.bmp new file mode 100644 index 000000000..8ea9c6716 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars76.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars77.bmp b/tests/mt-emil/input-lpd-bmp/Cars77.bmp new file mode 100644 index 000000000..ea355fd74 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars77.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars78.bmp b/tests/mt-emil/input-lpd-bmp/Cars78.bmp new file mode 100644 index 000000000..774a26e6b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars78.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars79.bmp b/tests/mt-emil/input-lpd-bmp/Cars79.bmp new file mode 100644 index 000000000..dafe176e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars79.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars8.bmp b/tests/mt-emil/input-lpd-bmp/Cars8.bmp new file mode 100644 index 000000000..3d5c46fe5 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars8.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars80.bmp b/tests/mt-emil/input-lpd-bmp/Cars80.bmp new file mode 100644 index 000000000..e0a23e3a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars80.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars81.bmp b/tests/mt-emil/input-lpd-bmp/Cars81.bmp new file mode 100644 index 000000000..2aad33e68 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars81.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars82.bmp b/tests/mt-emil/input-lpd-bmp/Cars82.bmp new file mode 100644 index 000000000..f8a613448 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars82.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars83.bmp b/tests/mt-emil/input-lpd-bmp/Cars83.bmp new file mode 100644 index 000000000..dfef693d3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars83.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars84.bmp b/tests/mt-emil/input-lpd-bmp/Cars84.bmp new file mode 100644 index 000000000..e392290e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars84.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars85.bmp b/tests/mt-emil/input-lpd-bmp/Cars85.bmp new file mode 100644 index 000000000..0860cd24e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars85.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars86.bmp b/tests/mt-emil/input-lpd-bmp/Cars86.bmp new file mode 100644 index 000000000..bdfa41674 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars86.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars87.bmp b/tests/mt-emil/input-lpd-bmp/Cars87.bmp new file mode 100644 index 000000000..b03c6d1ad Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars87.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars88.bmp b/tests/mt-emil/input-lpd-bmp/Cars88.bmp new file mode 100644 index 000000000..fc79700b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars88.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars89.bmp b/tests/mt-emil/input-lpd-bmp/Cars89.bmp new file mode 100644 index 000000000..a5116a2bc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars89.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars9.bmp b/tests/mt-emil/input-lpd-bmp/Cars9.bmp new file mode 100644 index 000000000..56aa10c70 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars9.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars90.bmp b/tests/mt-emil/input-lpd-bmp/Cars90.bmp new file mode 100644 index 000000000..870a45f4e Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars90.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars91.bmp b/tests/mt-emil/input-lpd-bmp/Cars91.bmp new file mode 100644 index 000000000..c738dcca6 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars91.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars92.bmp b/tests/mt-emil/input-lpd-bmp/Cars92.bmp new file mode 100644 index 000000000..56dbb1d2d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars92.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars93.bmp b/tests/mt-emil/input-lpd-bmp/Cars93.bmp new file mode 100644 index 000000000..ee16821fc Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars93.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars94.bmp b/tests/mt-emil/input-lpd-bmp/Cars94.bmp new file mode 100644 index 000000000..b24244110 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars94.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars95.bmp b/tests/mt-emil/input-lpd-bmp/Cars95.bmp new file mode 100644 index 000000000..56dbb1d2d Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars95.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars96.bmp b/tests/mt-emil/input-lpd-bmp/Cars96.bmp new file mode 100644 index 000000000..4ef5331a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars96.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars97.bmp b/tests/mt-emil/input-lpd-bmp/Cars97.bmp new file mode 100644 index 000000000..3ef39574b Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars97.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars98.bmp b/tests/mt-emil/input-lpd-bmp/Cars98.bmp new file mode 100644 index 000000000..ef4f90519 Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars98.bmp differ diff --git a/tests/mt-emil/input-lpd-bmp/Cars99.bmp b/tests/mt-emil/input-lpd-bmp/Cars99.bmp new file mode 100644 index 000000000..49b99053c Binary files /dev/null and b/tests/mt-emil/input-lpd-bmp/Cars99.bmp differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars0.jpg b/tests/mt-emil/input-lpd-jpg/Cars0.jpg new file mode 100644 index 000000000..34a752fda Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars0.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars1.jpg b/tests/mt-emil/input-lpd-jpg/Cars1.jpg new file mode 100644 index 000000000..28dfd55e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars1.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars10.jpg b/tests/mt-emil/input-lpd-jpg/Cars10.jpg new file mode 100644 index 000000000..a40dfed74 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars10.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars100.jpg b/tests/mt-emil/input-lpd-jpg/Cars100.jpg new file mode 100644 index 000000000..cfe13fb25 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars100.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars101.jpg b/tests/mt-emil/input-lpd-jpg/Cars101.jpg new file mode 100644 index 000000000..083985ff9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars101.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars102.jpg b/tests/mt-emil/input-lpd-jpg/Cars102.jpg new file mode 100644 index 000000000..f1afd4084 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars102.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars103.jpg b/tests/mt-emil/input-lpd-jpg/Cars103.jpg new file mode 100644 index 000000000..8caf8075c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars103.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars104.jpg b/tests/mt-emil/input-lpd-jpg/Cars104.jpg new file mode 100644 index 000000000..78d6d05ab Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars104.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars105.jpg b/tests/mt-emil/input-lpd-jpg/Cars105.jpg new file mode 100644 index 000000000..88cc11133 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars105.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars106.jpg b/tests/mt-emil/input-lpd-jpg/Cars106.jpg new file mode 100644 index 000000000..795f59227 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars106.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars107.jpg b/tests/mt-emil/input-lpd-jpg/Cars107.jpg new file mode 100644 index 000000000..3baa17cb4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars107.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars108.jpg b/tests/mt-emil/input-lpd-jpg/Cars108.jpg new file mode 100644 index 000000000..d4aa04608 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars108.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars109.jpg b/tests/mt-emil/input-lpd-jpg/Cars109.jpg new file mode 100644 index 000000000..b24ca3030 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars109.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars11.jpg b/tests/mt-emil/input-lpd-jpg/Cars11.jpg new file mode 100644 index 000000000..7a45a1714 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars11.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars110.jpg b/tests/mt-emil/input-lpd-jpg/Cars110.jpg new file mode 100644 index 000000000..0a3638c43 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars110.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars111.jpg b/tests/mt-emil/input-lpd-jpg/Cars111.jpg new file mode 100644 index 000000000..cad0e73ba Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars111.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars112.jpg b/tests/mt-emil/input-lpd-jpg/Cars112.jpg new file mode 100644 index 000000000..2f6f03015 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars112.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars113.jpg b/tests/mt-emil/input-lpd-jpg/Cars113.jpg new file mode 100644 index 000000000..3a9a405fe Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars113.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars114.jpg b/tests/mt-emil/input-lpd-jpg/Cars114.jpg new file mode 100644 index 000000000..eb0680520 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars114.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars115.jpg b/tests/mt-emil/input-lpd-jpg/Cars115.jpg new file mode 100644 index 000000000..27d7442c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars115.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars116.jpg b/tests/mt-emil/input-lpd-jpg/Cars116.jpg new file mode 100644 index 000000000..1eba43128 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars116.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars117.jpg b/tests/mt-emil/input-lpd-jpg/Cars117.jpg new file mode 100644 index 000000000..edec6661a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars117.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars118.jpg b/tests/mt-emil/input-lpd-jpg/Cars118.jpg new file mode 100644 index 000000000..7388c85f4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars118.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars119.jpg b/tests/mt-emil/input-lpd-jpg/Cars119.jpg new file mode 100644 index 000000000..e79d1a1ac Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars119.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars12.jpg b/tests/mt-emil/input-lpd-jpg/Cars12.jpg new file mode 100644 index 000000000..e533e9c98 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars12.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars120.jpg b/tests/mt-emil/input-lpd-jpg/Cars120.jpg new file mode 100644 index 000000000..51bf5ecd6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars120.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars121.jpg b/tests/mt-emil/input-lpd-jpg/Cars121.jpg new file mode 100644 index 000000000..c8fb7cfca Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars121.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars122.jpg b/tests/mt-emil/input-lpd-jpg/Cars122.jpg new file mode 100644 index 000000000..c0c980af5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars122.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars123.jpg b/tests/mt-emil/input-lpd-jpg/Cars123.jpg new file mode 100644 index 000000000..f1df44239 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars123.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars124.jpg b/tests/mt-emil/input-lpd-jpg/Cars124.jpg new file mode 100644 index 000000000..dfd9117d3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars124.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars125.jpg b/tests/mt-emil/input-lpd-jpg/Cars125.jpg new file mode 100644 index 000000000..fceb05e20 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars125.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars126.jpg b/tests/mt-emil/input-lpd-jpg/Cars126.jpg new file mode 100644 index 000000000..f020986cd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars126.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars127.jpg b/tests/mt-emil/input-lpd-jpg/Cars127.jpg new file mode 100644 index 000000000..1f59fbb2a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars127.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars128.jpg b/tests/mt-emil/input-lpd-jpg/Cars128.jpg new file mode 100644 index 000000000..3f8d88aac Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars128.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars129.jpg b/tests/mt-emil/input-lpd-jpg/Cars129.jpg new file mode 100644 index 000000000..67273d14d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars129.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars13.jpg b/tests/mt-emil/input-lpd-jpg/Cars13.jpg new file mode 100644 index 000000000..2cb3de910 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars13.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars130.jpg b/tests/mt-emil/input-lpd-jpg/Cars130.jpg new file mode 100644 index 000000000..07e9b5f81 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars130.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars131.jpg b/tests/mt-emil/input-lpd-jpg/Cars131.jpg new file mode 100644 index 000000000..eb0680520 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars131.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars132.jpg b/tests/mt-emil/input-lpd-jpg/Cars132.jpg new file mode 100644 index 000000000..e66b9fd10 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars132.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars133.jpg b/tests/mt-emil/input-lpd-jpg/Cars133.jpg new file mode 100644 index 000000000..77c10cbcc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars133.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars134.jpg b/tests/mt-emil/input-lpd-jpg/Cars134.jpg new file mode 100644 index 000000000..11aeb62bd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars134.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars135.jpg b/tests/mt-emil/input-lpd-jpg/Cars135.jpg new file mode 100644 index 000000000..366c4cce7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars135.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars136.jpg b/tests/mt-emil/input-lpd-jpg/Cars136.jpg new file mode 100644 index 000000000..a2e46b87b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars136.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars137.jpg b/tests/mt-emil/input-lpd-jpg/Cars137.jpg new file mode 100644 index 000000000..fd516c831 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars137.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars138.jpg b/tests/mt-emil/input-lpd-jpg/Cars138.jpg new file mode 100644 index 000000000..84b0bef3a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars138.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars139.jpg b/tests/mt-emil/input-lpd-jpg/Cars139.jpg new file mode 100644 index 000000000..d007d66a7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars139.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars14.jpg b/tests/mt-emil/input-lpd-jpg/Cars14.jpg new file mode 100644 index 000000000..d40d183a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars14.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars140.jpg b/tests/mt-emil/input-lpd-jpg/Cars140.jpg new file mode 100644 index 000000000..b30178e35 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars140.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars141.jpg b/tests/mt-emil/input-lpd-jpg/Cars141.jpg new file mode 100644 index 000000000..df7d3661c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars141.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars142.jpg b/tests/mt-emil/input-lpd-jpg/Cars142.jpg new file mode 100644 index 000000000..9bcd7ee1d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars142.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars143.jpg b/tests/mt-emil/input-lpd-jpg/Cars143.jpg new file mode 100644 index 000000000..075c8cc33 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars143.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars144.jpg b/tests/mt-emil/input-lpd-jpg/Cars144.jpg new file mode 100644 index 000000000..fe879cb46 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars144.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars145.jpg b/tests/mt-emil/input-lpd-jpg/Cars145.jpg new file mode 100644 index 000000000..b30178e35 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars145.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars146.jpg b/tests/mt-emil/input-lpd-jpg/Cars146.jpg new file mode 100644 index 000000000..2234a60ae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars146.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars147.jpg b/tests/mt-emil/input-lpd-jpg/Cars147.jpg new file mode 100644 index 000000000..34a752fda Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars147.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars148.jpg b/tests/mt-emil/input-lpd-jpg/Cars148.jpg new file mode 100644 index 000000000..e25e3da65 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars148.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars149.jpg b/tests/mt-emil/input-lpd-jpg/Cars149.jpg new file mode 100644 index 000000000..7c835bfbc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars149.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars15.jpg b/tests/mt-emil/input-lpd-jpg/Cars15.jpg new file mode 100644 index 000000000..49c1781ca Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars15.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars150.jpg b/tests/mt-emil/input-lpd-jpg/Cars150.jpg new file mode 100644 index 000000000..77bb9ba0a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars150.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars151.jpg b/tests/mt-emil/input-lpd-jpg/Cars151.jpg new file mode 100644 index 000000000..db501e6a5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars151.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars152.jpg b/tests/mt-emil/input-lpd-jpg/Cars152.jpg new file mode 100644 index 000000000..db5bcb5a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars152.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars153.jpg b/tests/mt-emil/input-lpd-jpg/Cars153.jpg new file mode 100644 index 000000000..3baa17cb4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars153.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars154.jpg b/tests/mt-emil/input-lpd-jpg/Cars154.jpg new file mode 100644 index 000000000..6098316a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars154.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars155.jpg b/tests/mt-emil/input-lpd-jpg/Cars155.jpg new file mode 100644 index 000000000..016b77e11 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars155.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars156.jpg b/tests/mt-emil/input-lpd-jpg/Cars156.jpg new file mode 100644 index 000000000..8892fffd8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars156.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars157.jpg b/tests/mt-emil/input-lpd-jpg/Cars157.jpg new file mode 100644 index 000000000..1195c7b30 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars157.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars158.jpg b/tests/mt-emil/input-lpd-jpg/Cars158.jpg new file mode 100644 index 000000000..4796bfae9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars158.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars159.jpg b/tests/mt-emil/input-lpd-jpg/Cars159.jpg new file mode 100644 index 000000000..0e599a14e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars159.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars16.jpg b/tests/mt-emil/input-lpd-jpg/Cars16.jpg new file mode 100644 index 000000000..6c49c0523 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars16.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars160.jpg b/tests/mt-emil/input-lpd-jpg/Cars160.jpg new file mode 100644 index 000000000..5cc925a4a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars160.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars161.jpg b/tests/mt-emil/input-lpd-jpg/Cars161.jpg new file mode 100644 index 000000000..27d7442c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars161.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars162.jpg b/tests/mt-emil/input-lpd-jpg/Cars162.jpg new file mode 100644 index 000000000..bf2790755 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars162.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars163.jpg b/tests/mt-emil/input-lpd-jpg/Cars163.jpg new file mode 100644 index 000000000..a43e9feae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars163.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars164.jpg b/tests/mt-emil/input-lpd-jpg/Cars164.jpg new file mode 100644 index 000000000..c8707ae4f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars164.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars165.jpg b/tests/mt-emil/input-lpd-jpg/Cars165.jpg new file mode 100644 index 000000000..cd1f3716f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars165.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars166.jpg b/tests/mt-emil/input-lpd-jpg/Cars166.jpg new file mode 100644 index 000000000..41949cf6e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars166.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars167.jpg b/tests/mt-emil/input-lpd-jpg/Cars167.jpg new file mode 100644 index 000000000..06cad7d47 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars167.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars168.jpg b/tests/mt-emil/input-lpd-jpg/Cars168.jpg new file mode 100644 index 000000000..6a9106839 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars168.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars169.jpg b/tests/mt-emil/input-lpd-jpg/Cars169.jpg new file mode 100644 index 000000000..8892fffd8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars169.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars17.jpg b/tests/mt-emil/input-lpd-jpg/Cars17.jpg new file mode 100644 index 000000000..1f85d6a3e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars17.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars170.jpg b/tests/mt-emil/input-lpd-jpg/Cars170.jpg new file mode 100644 index 000000000..6f3102906 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars170.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars171.jpg b/tests/mt-emil/input-lpd-jpg/Cars171.jpg new file mode 100644 index 000000000..2cb3de910 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars171.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars172.jpg b/tests/mt-emil/input-lpd-jpg/Cars172.jpg new file mode 100644 index 000000000..9a4c45fff Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars172.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars173.jpg b/tests/mt-emil/input-lpd-jpg/Cars173.jpg new file mode 100644 index 000000000..722c33474 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars173.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars174.jpg b/tests/mt-emil/input-lpd-jpg/Cars174.jpg new file mode 100644 index 000000000..3361afced Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars174.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars175.jpg b/tests/mt-emil/input-lpd-jpg/Cars175.jpg new file mode 100644 index 000000000..2bd236d7b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars175.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars176.jpg b/tests/mt-emil/input-lpd-jpg/Cars176.jpg new file mode 100644 index 000000000..19338ee0d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars176.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars177.jpg b/tests/mt-emil/input-lpd-jpg/Cars177.jpg new file mode 100644 index 000000000..b6e22aaab Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars177.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars178.jpg b/tests/mt-emil/input-lpd-jpg/Cars178.jpg new file mode 100644 index 000000000..8e6f2b7ad Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars178.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars179.jpg b/tests/mt-emil/input-lpd-jpg/Cars179.jpg new file mode 100644 index 000000000..05920ff59 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars179.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars18.jpg b/tests/mt-emil/input-lpd-jpg/Cars18.jpg new file mode 100644 index 000000000..27d7442c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars18.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars180.jpg b/tests/mt-emil/input-lpd-jpg/Cars180.jpg new file mode 100644 index 000000000..3a9a405fe Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars180.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars181.jpg b/tests/mt-emil/input-lpd-jpg/Cars181.jpg new file mode 100644 index 000000000..4a94094e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars181.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars182.jpg b/tests/mt-emil/input-lpd-jpg/Cars182.jpg new file mode 100644 index 000000000..782a4e7af Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars182.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars183.jpg b/tests/mt-emil/input-lpd-jpg/Cars183.jpg new file mode 100644 index 000000000..70d01388e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars183.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars184.jpg b/tests/mt-emil/input-lpd-jpg/Cars184.jpg new file mode 100644 index 000000000..420502889 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars184.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars185.jpg b/tests/mt-emil/input-lpd-jpg/Cars185.jpg new file mode 100644 index 000000000..8fd78ce36 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars185.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars186.jpg b/tests/mt-emil/input-lpd-jpg/Cars186.jpg new file mode 100644 index 000000000..90da5392e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars186.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars187.jpg b/tests/mt-emil/input-lpd-jpg/Cars187.jpg new file mode 100644 index 000000000..d40d183a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars187.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars188.jpg b/tests/mt-emil/input-lpd-jpg/Cars188.jpg new file mode 100644 index 000000000..067d8f047 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars188.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars189.jpg b/tests/mt-emil/input-lpd-jpg/Cars189.jpg new file mode 100644 index 000000000..b30178e35 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars189.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars19.jpg b/tests/mt-emil/input-lpd-jpg/Cars19.jpg new file mode 100644 index 000000000..864fcfebe Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars19.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars190.jpg b/tests/mt-emil/input-lpd-jpg/Cars190.jpg new file mode 100644 index 000000000..3ff11624a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars190.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars191.jpg b/tests/mt-emil/input-lpd-jpg/Cars191.jpg new file mode 100644 index 000000000..37fefdffc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars191.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars192.jpg b/tests/mt-emil/input-lpd-jpg/Cars192.jpg new file mode 100644 index 000000000..8f69feabc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars192.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars193.jpg b/tests/mt-emil/input-lpd-jpg/Cars193.jpg new file mode 100644 index 000000000..1721365c6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars193.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars194.jpg b/tests/mt-emil/input-lpd-jpg/Cars194.jpg new file mode 100644 index 000000000..d61c1b815 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars194.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars195.jpg b/tests/mt-emil/input-lpd-jpg/Cars195.jpg new file mode 100644 index 000000000..791cecaeb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars195.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars196.jpg b/tests/mt-emil/input-lpd-jpg/Cars196.jpg new file mode 100644 index 000000000..4295df544 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars196.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars197.jpg b/tests/mt-emil/input-lpd-jpg/Cars197.jpg new file mode 100644 index 000000000..a43e9feae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars197.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars198.jpg b/tests/mt-emil/input-lpd-jpg/Cars198.jpg new file mode 100644 index 000000000..d4aa04608 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars198.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars199.jpg b/tests/mt-emil/input-lpd-jpg/Cars199.jpg new file mode 100644 index 000000000..fcb8f956c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars199.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars2.jpg b/tests/mt-emil/input-lpd-jpg/Cars2.jpg new file mode 100644 index 000000000..4b01466a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars2.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars20.jpg b/tests/mt-emil/input-lpd-jpg/Cars20.jpg new file mode 100644 index 000000000..429386e97 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars20.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars200.jpg b/tests/mt-emil/input-lpd-jpg/Cars200.jpg new file mode 100644 index 000000000..37fefdffc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars200.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars201.jpg b/tests/mt-emil/input-lpd-jpg/Cars201.jpg new file mode 100644 index 000000000..a43e9feae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars201.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars202.jpg b/tests/mt-emil/input-lpd-jpg/Cars202.jpg new file mode 100644 index 000000000..8671e0201 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars202.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars203.jpg b/tests/mt-emil/input-lpd-jpg/Cars203.jpg new file mode 100644 index 000000000..b24ca3030 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars203.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars204.jpg b/tests/mt-emil/input-lpd-jpg/Cars204.jpg new file mode 100644 index 000000000..d6b90a0c7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars204.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars205.jpg b/tests/mt-emil/input-lpd-jpg/Cars205.jpg new file mode 100644 index 000000000..566ce64e8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars205.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars206.jpg b/tests/mt-emil/input-lpd-jpg/Cars206.jpg new file mode 100644 index 000000000..413d54c2e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars206.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars207.jpg b/tests/mt-emil/input-lpd-jpg/Cars207.jpg new file mode 100644 index 000000000..bd7e901b3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars207.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars208.jpg b/tests/mt-emil/input-lpd-jpg/Cars208.jpg new file mode 100644 index 000000000..c13336ccc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars208.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars209.jpg b/tests/mt-emil/input-lpd-jpg/Cars209.jpg new file mode 100644 index 000000000..8557e51cf Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars209.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars21.jpg b/tests/mt-emil/input-lpd-jpg/Cars21.jpg new file mode 100644 index 000000000..d86db899b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars21.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars210.jpg b/tests/mt-emil/input-lpd-jpg/Cars210.jpg new file mode 100644 index 000000000..fcb8f956c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars210.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars211.jpg b/tests/mt-emil/input-lpd-jpg/Cars211.jpg new file mode 100644 index 000000000..b594e331b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars211.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars212.jpg b/tests/mt-emil/input-lpd-jpg/Cars212.jpg new file mode 100644 index 000000000..b9c4f4911 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars212.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars213.jpg b/tests/mt-emil/input-lpd-jpg/Cars213.jpg new file mode 100644 index 000000000..7226a79a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars213.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars214.jpg b/tests/mt-emil/input-lpd-jpg/Cars214.jpg new file mode 100644 index 000000000..6de833e62 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars214.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars215.jpg b/tests/mt-emil/input-lpd-jpg/Cars215.jpg new file mode 100644 index 000000000..1fa7a3b13 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars215.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars216.jpg b/tests/mt-emil/input-lpd-jpg/Cars216.jpg new file mode 100644 index 000000000..67273d14d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars216.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars217.jpg b/tests/mt-emil/input-lpd-jpg/Cars217.jpg new file mode 100644 index 000000000..864fcfebe Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars217.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars218.jpg b/tests/mt-emil/input-lpd-jpg/Cars218.jpg new file mode 100644 index 000000000..6a06184c6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars218.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars219.jpg b/tests/mt-emil/input-lpd-jpg/Cars219.jpg new file mode 100644 index 000000000..f12a6f30b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars219.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars22.jpg b/tests/mt-emil/input-lpd-jpg/Cars22.jpg new file mode 100644 index 000000000..646038f01 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars22.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars220.jpg b/tests/mt-emil/input-lpd-jpg/Cars220.jpg new file mode 100644 index 000000000..03f392c13 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars220.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars221.jpg b/tests/mt-emil/input-lpd-jpg/Cars221.jpg new file mode 100644 index 000000000..6145a8a1d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars221.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars222.jpg b/tests/mt-emil/input-lpd-jpg/Cars222.jpg new file mode 100644 index 000000000..90da5392e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars222.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars223.jpg b/tests/mt-emil/input-lpd-jpg/Cars223.jpg new file mode 100644 index 000000000..d9f5262fc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars223.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars224.jpg b/tests/mt-emil/input-lpd-jpg/Cars224.jpg new file mode 100644 index 000000000..2c34c810d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars224.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars225.jpg b/tests/mt-emil/input-lpd-jpg/Cars225.jpg new file mode 100644 index 000000000..7388c85f4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars225.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars226.jpg b/tests/mt-emil/input-lpd-jpg/Cars226.jpg new file mode 100644 index 000000000..8225be56d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars226.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars227.jpg b/tests/mt-emil/input-lpd-jpg/Cars227.jpg new file mode 100644 index 000000000..241c99d45 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars227.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars228.jpg b/tests/mt-emil/input-lpd-jpg/Cars228.jpg new file mode 100644 index 000000000..c45221cde Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars228.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars229.jpg b/tests/mt-emil/input-lpd-jpg/Cars229.jpg new file mode 100644 index 000000000..b55d38435 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars229.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars23.jpg b/tests/mt-emil/input-lpd-jpg/Cars23.jpg new file mode 100644 index 000000000..6ef037431 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars23.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars230.jpg b/tests/mt-emil/input-lpd-jpg/Cars230.jpg new file mode 100644 index 000000000..a43e9feae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars230.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars231.jpg b/tests/mt-emil/input-lpd-jpg/Cars231.jpg new file mode 100644 index 000000000..963b05cc5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars231.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars232.jpg b/tests/mt-emil/input-lpd-jpg/Cars232.jpg new file mode 100644 index 000000000..ccec00b44 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars232.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars233.jpg b/tests/mt-emil/input-lpd-jpg/Cars233.jpg new file mode 100644 index 000000000..b11948614 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars233.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars234.jpg b/tests/mt-emil/input-lpd-jpg/Cars234.jpg new file mode 100644 index 000000000..d249c9b3a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars234.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars235.jpg b/tests/mt-emil/input-lpd-jpg/Cars235.jpg new file mode 100644 index 000000000..57726fa39 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars235.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars236.jpg b/tests/mt-emil/input-lpd-jpg/Cars236.jpg new file mode 100644 index 000000000..e02761a5a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars236.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars237.jpg b/tests/mt-emil/input-lpd-jpg/Cars237.jpg new file mode 100644 index 000000000..89d2badaf Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars237.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars238.jpg b/tests/mt-emil/input-lpd-jpg/Cars238.jpg new file mode 100644 index 000000000..4f52070f8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars238.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars239.jpg b/tests/mt-emil/input-lpd-jpg/Cars239.jpg new file mode 100644 index 000000000..06cad7d47 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars239.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars24.jpg b/tests/mt-emil/input-lpd-jpg/Cars24.jpg new file mode 100644 index 000000000..083985ff9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars24.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars240.jpg b/tests/mt-emil/input-lpd-jpg/Cars240.jpg new file mode 100644 index 000000000..41d9bd676 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars240.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars241.jpg b/tests/mt-emil/input-lpd-jpg/Cars241.jpg new file mode 100644 index 000000000..8a8148a58 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars241.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars242.jpg b/tests/mt-emil/input-lpd-jpg/Cars242.jpg new file mode 100644 index 000000000..4b01466a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars242.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars243.jpg b/tests/mt-emil/input-lpd-jpg/Cars243.jpg new file mode 100644 index 000000000..a0120cb73 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars243.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars244.jpg b/tests/mt-emil/input-lpd-jpg/Cars244.jpg new file mode 100644 index 000000000..95b9c76c5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars244.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars245.jpg b/tests/mt-emil/input-lpd-jpg/Cars245.jpg new file mode 100644 index 000000000..07e9b5f81 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars245.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars246.jpg b/tests/mt-emil/input-lpd-jpg/Cars246.jpg new file mode 100644 index 000000000..b29adf8ec Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars246.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars247.jpg b/tests/mt-emil/input-lpd-jpg/Cars247.jpg new file mode 100644 index 000000000..a40dfed74 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars247.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars248.jpg b/tests/mt-emil/input-lpd-jpg/Cars248.jpg new file mode 100644 index 000000000..912cbebeb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars248.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars249.jpg b/tests/mt-emil/input-lpd-jpg/Cars249.jpg new file mode 100644 index 000000000..d1c1a4182 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars249.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars25.jpg b/tests/mt-emil/input-lpd-jpg/Cars25.jpg new file mode 100644 index 000000000..bac9cafb9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars25.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars250.jpg b/tests/mt-emil/input-lpd-jpg/Cars250.jpg new file mode 100644 index 000000000..28dfd55e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars250.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars251.jpg b/tests/mt-emil/input-lpd-jpg/Cars251.jpg new file mode 100644 index 000000000..37a404eb0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars251.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars252.jpg b/tests/mt-emil/input-lpd-jpg/Cars252.jpg new file mode 100644 index 000000000..3fc1e75e8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars252.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars253.jpg b/tests/mt-emil/input-lpd-jpg/Cars253.jpg new file mode 100644 index 000000000..9abdb2b51 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars253.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars254.jpg b/tests/mt-emil/input-lpd-jpg/Cars254.jpg new file mode 100644 index 000000000..827e99246 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars254.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars255.jpg b/tests/mt-emil/input-lpd-jpg/Cars255.jpg new file mode 100644 index 000000000..bb73e4d2b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars255.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars256.jpg b/tests/mt-emil/input-lpd-jpg/Cars256.jpg new file mode 100644 index 000000000..bc70083bd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars256.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars257.jpg b/tests/mt-emil/input-lpd-jpg/Cars257.jpg new file mode 100644 index 000000000..5e1981c23 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars257.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars258.jpg b/tests/mt-emil/input-lpd-jpg/Cars258.jpg new file mode 100644 index 000000000..0082c0b95 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars258.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars259.jpg b/tests/mt-emil/input-lpd-jpg/Cars259.jpg new file mode 100644 index 000000000..cad0e73ba Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars259.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars26.jpg b/tests/mt-emil/input-lpd-jpg/Cars26.jpg new file mode 100644 index 000000000..366c4cce7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars26.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars260.jpg b/tests/mt-emil/input-lpd-jpg/Cars260.jpg new file mode 100644 index 000000000..9425b0c98 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars260.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars261.jpg b/tests/mt-emil/input-lpd-jpg/Cars261.jpg new file mode 100644 index 000000000..a77cd6f9b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars261.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars262.jpg b/tests/mt-emil/input-lpd-jpg/Cars262.jpg new file mode 100644 index 000000000..c2f17c996 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars262.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars263.jpg b/tests/mt-emil/input-lpd-jpg/Cars263.jpg new file mode 100644 index 000000000..f59726a42 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars263.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars264.jpg b/tests/mt-emil/input-lpd-jpg/Cars264.jpg new file mode 100644 index 000000000..1e73413d5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars264.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars265.jpg b/tests/mt-emil/input-lpd-jpg/Cars265.jpg new file mode 100644 index 000000000..1ccea0982 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars265.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars266.jpg b/tests/mt-emil/input-lpd-jpg/Cars266.jpg new file mode 100644 index 000000000..1fa7a3b13 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars266.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars267.jpg b/tests/mt-emil/input-lpd-jpg/Cars267.jpg new file mode 100644 index 000000000..fc6ba6b15 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars267.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars268.jpg b/tests/mt-emil/input-lpd-jpg/Cars268.jpg new file mode 100644 index 000000000..2f0ca28a9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars268.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars269.jpg b/tests/mt-emil/input-lpd-jpg/Cars269.jpg new file mode 100644 index 000000000..f0a315bd9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars269.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars27.jpg b/tests/mt-emil/input-lpd-jpg/Cars27.jpg new file mode 100644 index 000000000..6662e546c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars27.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars270.jpg b/tests/mt-emil/input-lpd-jpg/Cars270.jpg new file mode 100644 index 000000000..6d0af8148 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars270.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars271.jpg b/tests/mt-emil/input-lpd-jpg/Cars271.jpg new file mode 100644 index 000000000..a26922a24 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars271.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars272.jpg b/tests/mt-emil/input-lpd-jpg/Cars272.jpg new file mode 100644 index 000000000..5a0843f17 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars272.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars273.jpg b/tests/mt-emil/input-lpd-jpg/Cars273.jpg new file mode 100644 index 000000000..70d01388e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars273.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars274.jpg b/tests/mt-emil/input-lpd-jpg/Cars274.jpg new file mode 100644 index 000000000..c0c980af5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars274.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars275.jpg b/tests/mt-emil/input-lpd-jpg/Cars275.jpg new file mode 100644 index 000000000..8e063acee Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars275.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars276.jpg b/tests/mt-emil/input-lpd-jpg/Cars276.jpg new file mode 100644 index 000000000..b24ca3030 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars276.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars277.jpg b/tests/mt-emil/input-lpd-jpg/Cars277.jpg new file mode 100644 index 000000000..88d738cc2 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars277.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars278.jpg b/tests/mt-emil/input-lpd-jpg/Cars278.jpg new file mode 100644 index 000000000..95775d712 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars278.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars279.jpg b/tests/mt-emil/input-lpd-jpg/Cars279.jpg new file mode 100644 index 000000000..bfba5aa6d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars279.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars28.jpg b/tests/mt-emil/input-lpd-jpg/Cars28.jpg new file mode 100644 index 000000000..8155da2df Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars28.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars280.jpg b/tests/mt-emil/input-lpd-jpg/Cars280.jpg new file mode 100644 index 000000000..341e19141 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars280.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars281.jpg b/tests/mt-emil/input-lpd-jpg/Cars281.jpg new file mode 100644 index 000000000..1203c7b0c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars281.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars282.jpg b/tests/mt-emil/input-lpd-jpg/Cars282.jpg new file mode 100644 index 000000000..f1afd4084 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars282.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars283.jpg b/tests/mt-emil/input-lpd-jpg/Cars283.jpg new file mode 100644 index 000000000..fb740ab56 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars283.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars284.jpg b/tests/mt-emil/input-lpd-jpg/Cars284.jpg new file mode 100644 index 000000000..6098316a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars284.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars285.jpg b/tests/mt-emil/input-lpd-jpg/Cars285.jpg new file mode 100644 index 000000000..07e9b5f81 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars285.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars286.jpg b/tests/mt-emil/input-lpd-jpg/Cars286.jpg new file mode 100644 index 000000000..bc7f386cc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars286.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars287.jpg b/tests/mt-emil/input-lpd-jpg/Cars287.jpg new file mode 100644 index 000000000..0e599a14e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars287.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars288.jpg b/tests/mt-emil/input-lpd-jpg/Cars288.jpg new file mode 100644 index 000000000..8e063acee Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars288.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars289.jpg b/tests/mt-emil/input-lpd-jpg/Cars289.jpg new file mode 100644 index 000000000..c732f6678 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars289.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars29.jpg b/tests/mt-emil/input-lpd-jpg/Cars29.jpg new file mode 100644 index 000000000..6ef037431 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars29.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars290.jpg b/tests/mt-emil/input-lpd-jpg/Cars290.jpg new file mode 100644 index 000000000..f9c75de9d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars290.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars291.jpg b/tests/mt-emil/input-lpd-jpg/Cars291.jpg new file mode 100644 index 000000000..b9c747304 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars291.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars292.jpg b/tests/mt-emil/input-lpd-jpg/Cars292.jpg new file mode 100644 index 000000000..10457cf4a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars292.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars293.jpg b/tests/mt-emil/input-lpd-jpg/Cars293.jpg new file mode 100644 index 000000000..963b05cc5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars293.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars294.jpg b/tests/mt-emil/input-lpd-jpg/Cars294.jpg new file mode 100644 index 000000000..a80d39ebd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars294.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars295.jpg b/tests/mt-emil/input-lpd-jpg/Cars295.jpg new file mode 100644 index 000000000..b9c120226 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars295.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars296.jpg b/tests/mt-emil/input-lpd-jpg/Cars296.jpg new file mode 100644 index 000000000..6e58540f7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars296.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars297.jpg b/tests/mt-emil/input-lpd-jpg/Cars297.jpg new file mode 100644 index 000000000..d249c9b3a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars297.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars298.jpg b/tests/mt-emil/input-lpd-jpg/Cars298.jpg new file mode 100644 index 000000000..bf9af7166 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars298.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars299.jpg b/tests/mt-emil/input-lpd-jpg/Cars299.jpg new file mode 100644 index 000000000..087f2d7b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars299.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars3.jpg b/tests/mt-emil/input-lpd-jpg/Cars3.jpg new file mode 100644 index 000000000..6662e546c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars3.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars30.jpg b/tests/mt-emil/input-lpd-jpg/Cars30.jpg new file mode 100644 index 000000000..88cc11133 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars30.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars300.jpg b/tests/mt-emil/input-lpd-jpg/Cars300.jpg new file mode 100644 index 000000000..366c4cce7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars300.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars301.jpg b/tests/mt-emil/input-lpd-jpg/Cars301.jpg new file mode 100644 index 000000000..be165f754 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars301.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars302.jpg b/tests/mt-emil/input-lpd-jpg/Cars302.jpg new file mode 100644 index 000000000..88c1e1c4d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars302.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars303.jpg b/tests/mt-emil/input-lpd-jpg/Cars303.jpg new file mode 100644 index 000000000..3ff11624a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars303.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars304.jpg b/tests/mt-emil/input-lpd-jpg/Cars304.jpg new file mode 100644 index 000000000..2458dc279 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars304.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars305.jpg b/tests/mt-emil/input-lpd-jpg/Cars305.jpg new file mode 100644 index 000000000..e95728b1d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars305.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars306.jpg b/tests/mt-emil/input-lpd-jpg/Cars306.jpg new file mode 100644 index 000000000..6d149ef66 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars306.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars307.jpg b/tests/mt-emil/input-lpd-jpg/Cars307.jpg new file mode 100644 index 000000000..340140f7e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars307.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars308.jpg b/tests/mt-emil/input-lpd-jpg/Cars308.jpg new file mode 100644 index 000000000..f1df44239 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars308.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars309.jpg b/tests/mt-emil/input-lpd-jpg/Cars309.jpg new file mode 100644 index 000000000..2877328f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars309.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars31.jpg b/tests/mt-emil/input-lpd-jpg/Cars31.jpg new file mode 100644 index 000000000..bc70083bd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars31.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars310.jpg b/tests/mt-emil/input-lpd-jpg/Cars310.jpg new file mode 100644 index 000000000..57e6c5b11 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars310.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars311.jpg b/tests/mt-emil/input-lpd-jpg/Cars311.jpg new file mode 100644 index 000000000..8e3f07ee9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars311.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars312.jpg b/tests/mt-emil/input-lpd-jpg/Cars312.jpg new file mode 100644 index 000000000..93a85dd8f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars312.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars313.jpg b/tests/mt-emil/input-lpd-jpg/Cars313.jpg new file mode 100644 index 000000000..2527f360e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars313.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars314.jpg b/tests/mt-emil/input-lpd-jpg/Cars314.jpg new file mode 100644 index 000000000..343232f1a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars314.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars315.jpg b/tests/mt-emil/input-lpd-jpg/Cars315.jpg new file mode 100644 index 000000000..5fe3827d9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars315.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars316.jpg b/tests/mt-emil/input-lpd-jpg/Cars316.jpg new file mode 100644 index 000000000..b352fe54e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars316.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars317.jpg b/tests/mt-emil/input-lpd-jpg/Cars317.jpg new file mode 100644 index 000000000..083985ff9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars317.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars318.jpg b/tests/mt-emil/input-lpd-jpg/Cars318.jpg new file mode 100644 index 000000000..d40d183a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars318.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars319.jpg b/tests/mt-emil/input-lpd-jpg/Cars319.jpg new file mode 100644 index 000000000..c70589034 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars319.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars32.jpg b/tests/mt-emil/input-lpd-jpg/Cars32.jpg new file mode 100644 index 000000000..c0c980af5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars32.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars320.jpg b/tests/mt-emil/input-lpd-jpg/Cars320.jpg new file mode 100644 index 000000000..6098316a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars320.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars321.jpg b/tests/mt-emil/input-lpd-jpg/Cars321.jpg new file mode 100644 index 000000000..a8e5b75fa Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars321.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars322.jpg b/tests/mt-emil/input-lpd-jpg/Cars322.jpg new file mode 100644 index 000000000..36784b5df Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars322.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars323.jpg b/tests/mt-emil/input-lpd-jpg/Cars323.jpg new file mode 100644 index 000000000..fc61134e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars323.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars324.jpg b/tests/mt-emil/input-lpd-jpg/Cars324.jpg new file mode 100644 index 000000000..782a4e7af Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars324.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars325.jpg b/tests/mt-emil/input-lpd-jpg/Cars325.jpg new file mode 100644 index 000000000..66ed319ec Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars325.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars326.jpg b/tests/mt-emil/input-lpd-jpg/Cars326.jpg new file mode 100644 index 000000000..77bb9ba0a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars326.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars327.jpg b/tests/mt-emil/input-lpd-jpg/Cars327.jpg new file mode 100644 index 000000000..28dfd55e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars327.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars328.jpg b/tests/mt-emil/input-lpd-jpg/Cars328.jpg new file mode 100644 index 000000000..d249c9b3a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars328.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars329.jpg b/tests/mt-emil/input-lpd-jpg/Cars329.jpg new file mode 100644 index 000000000..bfd13eb91 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars329.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars33.jpg b/tests/mt-emil/input-lpd-jpg/Cars33.jpg new file mode 100644 index 000000000..3f8d88aac Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars33.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars330.jpg b/tests/mt-emil/input-lpd-jpg/Cars330.jpg new file mode 100644 index 000000000..3d345485d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars330.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars331.jpg b/tests/mt-emil/input-lpd-jpg/Cars331.jpg new file mode 100644 index 000000000..7aa618d89 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars331.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars332.jpg b/tests/mt-emil/input-lpd-jpg/Cars332.jpg new file mode 100644 index 000000000..6662e546c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars332.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars333.jpg b/tests/mt-emil/input-lpd-jpg/Cars333.jpg new file mode 100644 index 000000000..bb73e4d2b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars333.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars334.jpg b/tests/mt-emil/input-lpd-jpg/Cars334.jpg new file mode 100644 index 000000000..a8e9fabad Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars334.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars335.jpg b/tests/mt-emil/input-lpd-jpg/Cars335.jpg new file mode 100644 index 000000000..566ce64e8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars335.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars336.jpg b/tests/mt-emil/input-lpd-jpg/Cars336.jpg new file mode 100644 index 000000000..77bb9ba0a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars336.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars337.jpg b/tests/mt-emil/input-lpd-jpg/Cars337.jpg new file mode 100644 index 000000000..a09a6e863 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars337.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars338.jpg b/tests/mt-emil/input-lpd-jpg/Cars338.jpg new file mode 100644 index 000000000..87dbc0e6a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars338.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars339.jpg b/tests/mt-emil/input-lpd-jpg/Cars339.jpg new file mode 100644 index 000000000..5cc925a4a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars339.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars34.jpg b/tests/mt-emil/input-lpd-jpg/Cars34.jpg new file mode 100644 index 000000000..0e599a14e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars34.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars340.jpg b/tests/mt-emil/input-lpd-jpg/Cars340.jpg new file mode 100644 index 000000000..6f049244b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars340.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars341.jpg b/tests/mt-emil/input-lpd-jpg/Cars341.jpg new file mode 100644 index 000000000..b29adf8ec Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars341.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars342.jpg b/tests/mt-emil/input-lpd-jpg/Cars342.jpg new file mode 100644 index 000000000..c0c980af5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars342.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars343.jpg b/tests/mt-emil/input-lpd-jpg/Cars343.jpg new file mode 100644 index 000000000..65b85e6b0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars343.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars344.jpg b/tests/mt-emil/input-lpd-jpg/Cars344.jpg new file mode 100644 index 000000000..502d7721e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars344.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars345.jpg b/tests/mt-emil/input-lpd-jpg/Cars345.jpg new file mode 100644 index 000000000..922b1b915 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars345.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars346.jpg b/tests/mt-emil/input-lpd-jpg/Cars346.jpg new file mode 100644 index 000000000..37fefdffc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars346.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars347.jpg b/tests/mt-emil/input-lpd-jpg/Cars347.jpg new file mode 100644 index 000000000..1858276a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars347.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars348.jpg b/tests/mt-emil/input-lpd-jpg/Cars348.jpg new file mode 100644 index 000000000..2877328f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars348.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars349.jpg b/tests/mt-emil/input-lpd-jpg/Cars349.jpg new file mode 100644 index 000000000..511f02c27 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars349.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars35.jpg b/tests/mt-emil/input-lpd-jpg/Cars35.jpg new file mode 100644 index 000000000..10457cf4a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars35.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars350.jpg b/tests/mt-emil/input-lpd-jpg/Cars350.jpg new file mode 100644 index 000000000..b7d1cf9b0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars350.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars351.jpg b/tests/mt-emil/input-lpd-jpg/Cars351.jpg new file mode 100644 index 000000000..77e1cc3f4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars351.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars352.jpg b/tests/mt-emil/input-lpd-jpg/Cars352.jpg new file mode 100644 index 000000000..d0b5e91d8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars352.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars353.jpg b/tests/mt-emil/input-lpd-jpg/Cars353.jpg new file mode 100644 index 000000000..37fefdffc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars353.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars354.jpg b/tests/mt-emil/input-lpd-jpg/Cars354.jpg new file mode 100644 index 000000000..f4023b63a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars354.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars355.jpg b/tests/mt-emil/input-lpd-jpg/Cars355.jpg new file mode 100644 index 000000000..896e7ca36 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars355.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars356.jpg b/tests/mt-emil/input-lpd-jpg/Cars356.jpg new file mode 100644 index 000000000..28041b1b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars356.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars357.jpg b/tests/mt-emil/input-lpd-jpg/Cars357.jpg new file mode 100644 index 000000000..10457cf4a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars357.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars358.jpg b/tests/mt-emil/input-lpd-jpg/Cars358.jpg new file mode 100644 index 000000000..009e635fd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars358.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars359.jpg b/tests/mt-emil/input-lpd-jpg/Cars359.jpg new file mode 100644 index 000000000..11b0bf39e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars359.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars36.jpg b/tests/mt-emil/input-lpd-jpg/Cars36.jpg new file mode 100644 index 000000000..bc7f386cc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars36.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars360.jpg b/tests/mt-emil/input-lpd-jpg/Cars360.jpg new file mode 100644 index 000000000..f0442f425 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars360.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars361.jpg b/tests/mt-emil/input-lpd-jpg/Cars361.jpg new file mode 100644 index 000000000..3a9a405fe Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars361.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars362.jpg b/tests/mt-emil/input-lpd-jpg/Cars362.jpg new file mode 100644 index 000000000..111523c51 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars362.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars363.jpg b/tests/mt-emil/input-lpd-jpg/Cars363.jpg new file mode 100644 index 000000000..6efc82448 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars363.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars364.jpg b/tests/mt-emil/input-lpd-jpg/Cars364.jpg new file mode 100644 index 000000000..db501e6a5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars364.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars365.jpg b/tests/mt-emil/input-lpd-jpg/Cars365.jpg new file mode 100644 index 000000000..08e03fe48 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars365.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars366.jpg b/tests/mt-emil/input-lpd-jpg/Cars366.jpg new file mode 100644 index 000000000..3baa17cb4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars366.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars367.jpg b/tests/mt-emil/input-lpd-jpg/Cars367.jpg new file mode 100644 index 000000000..502d7721e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars367.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars368.jpg b/tests/mt-emil/input-lpd-jpg/Cars368.jpg new file mode 100644 index 000000000..ccec00b44 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars368.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars369.jpg b/tests/mt-emil/input-lpd-jpg/Cars369.jpg new file mode 100644 index 000000000..06cad7d47 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars369.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars37.jpg b/tests/mt-emil/input-lpd-jpg/Cars37.jpg new file mode 100644 index 000000000..585bcb4c1 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars37.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars370.jpg b/tests/mt-emil/input-lpd-jpg/Cars370.jpg new file mode 100644 index 000000000..b30178e35 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars370.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars371.jpg b/tests/mt-emil/input-lpd-jpg/Cars371.jpg new file mode 100644 index 000000000..3055114c3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars371.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars372.jpg b/tests/mt-emil/input-lpd-jpg/Cars372.jpg new file mode 100644 index 000000000..8bf950aba Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars372.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars373.jpg b/tests/mt-emil/input-lpd-jpg/Cars373.jpg new file mode 100644 index 000000000..45dcde32c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars373.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars374.jpg b/tests/mt-emil/input-lpd-jpg/Cars374.jpg new file mode 100644 index 000000000..78829d13b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars374.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars375.jpg b/tests/mt-emil/input-lpd-jpg/Cars375.jpg new file mode 100644 index 000000000..601746389 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars375.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars376.jpg b/tests/mt-emil/input-lpd-jpg/Cars376.jpg new file mode 100644 index 000000000..51bf5ecd6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars376.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars377.jpg b/tests/mt-emil/input-lpd-jpg/Cars377.jpg new file mode 100644 index 000000000..bac9cafb9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars377.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars378.jpg b/tests/mt-emil/input-lpd-jpg/Cars378.jpg new file mode 100644 index 000000000..2876fd61e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars378.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars379.jpg b/tests/mt-emil/input-lpd-jpg/Cars379.jpg new file mode 100644 index 000000000..256c127fb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars379.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars38.jpg b/tests/mt-emil/input-lpd-jpg/Cars38.jpg new file mode 100644 index 000000000..4b7cd5d69 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars38.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars380.jpg b/tests/mt-emil/input-lpd-jpg/Cars380.jpg new file mode 100644 index 000000000..14164b7be Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars380.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars381.jpg b/tests/mt-emil/input-lpd-jpg/Cars381.jpg new file mode 100644 index 000000000..2abe23cdf Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars381.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars382.jpg b/tests/mt-emil/input-lpd-jpg/Cars382.jpg new file mode 100644 index 000000000..aed8c0ef3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars382.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars383.jpg b/tests/mt-emil/input-lpd-jpg/Cars383.jpg new file mode 100644 index 000000000..583bf8941 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars383.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars384.jpg b/tests/mt-emil/input-lpd-jpg/Cars384.jpg new file mode 100644 index 000000000..781ab9ae1 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars384.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars385.jpg b/tests/mt-emil/input-lpd-jpg/Cars385.jpg new file mode 100644 index 000000000..19338ee0d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars385.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars386.jpg b/tests/mt-emil/input-lpd-jpg/Cars386.jpg new file mode 100644 index 000000000..f3b906fc8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars386.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars387.jpg b/tests/mt-emil/input-lpd-jpg/Cars387.jpg new file mode 100644 index 000000000..86f03cc01 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars387.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars388.jpg b/tests/mt-emil/input-lpd-jpg/Cars388.jpg new file mode 100644 index 000000000..5cc77d301 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars388.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars389.jpg b/tests/mt-emil/input-lpd-jpg/Cars389.jpg new file mode 100644 index 000000000..f3b906fc8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars389.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars39.jpg b/tests/mt-emil/input-lpd-jpg/Cars39.jpg new file mode 100644 index 000000000..300422a54 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars39.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars390.jpg b/tests/mt-emil/input-lpd-jpg/Cars390.jpg new file mode 100644 index 000000000..d08ed199e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars390.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars391.jpg b/tests/mt-emil/input-lpd-jpg/Cars391.jpg new file mode 100644 index 000000000..76543268c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars391.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars392.jpg b/tests/mt-emil/input-lpd-jpg/Cars392.jpg new file mode 100644 index 000000000..7737450c7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars392.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars393.jpg b/tests/mt-emil/input-lpd-jpg/Cars393.jpg new file mode 100644 index 000000000..1ccea0982 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars393.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars394.jpg b/tests/mt-emil/input-lpd-jpg/Cars394.jpg new file mode 100644 index 000000000..7b7894903 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars394.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars395.jpg b/tests/mt-emil/input-lpd-jpg/Cars395.jpg new file mode 100644 index 000000000..c2f17c996 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars395.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars396.jpg b/tests/mt-emil/input-lpd-jpg/Cars396.jpg new file mode 100644 index 000000000..71bbe3019 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars396.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars397.jpg b/tests/mt-emil/input-lpd-jpg/Cars397.jpg new file mode 100644 index 000000000..6ef037431 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars397.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars398.jpg b/tests/mt-emil/input-lpd-jpg/Cars398.jpg new file mode 100644 index 000000000..bfba5aa6d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars398.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars399.jpg b/tests/mt-emil/input-lpd-jpg/Cars399.jpg new file mode 100644 index 000000000..3f8d88aac Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars399.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars4.jpg b/tests/mt-emil/input-lpd-jpg/Cars4.jpg new file mode 100644 index 000000000..93a85dd8f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars4.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars40.jpg b/tests/mt-emil/input-lpd-jpg/Cars40.jpg new file mode 100644 index 000000000..366c4cce7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars40.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars400.jpg b/tests/mt-emil/input-lpd-jpg/Cars400.jpg new file mode 100644 index 000000000..1721365c6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars400.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars401.jpg b/tests/mt-emil/input-lpd-jpg/Cars401.jpg new file mode 100644 index 000000000..f1df44239 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars401.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars402.jpg b/tests/mt-emil/input-lpd-jpg/Cars402.jpg new file mode 100644 index 000000000..e95728b1d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars402.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars403.jpg b/tests/mt-emil/input-lpd-jpg/Cars403.jpg new file mode 100644 index 000000000..a8669a415 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars403.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars404.jpg b/tests/mt-emil/input-lpd-jpg/Cars404.jpg new file mode 100644 index 000000000..1b91ab12b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars404.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars405.jpg b/tests/mt-emil/input-lpd-jpg/Cars405.jpg new file mode 100644 index 000000000..39fb86844 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars405.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars406.jpg b/tests/mt-emil/input-lpd-jpg/Cars406.jpg new file mode 100644 index 000000000..77c10cbcc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars406.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars407.jpg b/tests/mt-emil/input-lpd-jpg/Cars407.jpg new file mode 100644 index 000000000..1e82e3924 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars407.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars408.jpg b/tests/mt-emil/input-lpd-jpg/Cars408.jpg new file mode 100644 index 000000000..7d2bfb187 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars408.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars409.jpg b/tests/mt-emil/input-lpd-jpg/Cars409.jpg new file mode 100644 index 000000000..05c2ae515 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars409.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars41.jpg b/tests/mt-emil/input-lpd-jpg/Cars41.jpg new file mode 100644 index 000000000..fbe2d6859 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars41.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars410.jpg b/tests/mt-emil/input-lpd-jpg/Cars410.jpg new file mode 100644 index 000000000..2e78a511f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars410.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars411.jpg b/tests/mt-emil/input-lpd-jpg/Cars411.jpg new file mode 100644 index 000000000..bab5db87b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars411.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars412.jpg b/tests/mt-emil/input-lpd-jpg/Cars412.jpg new file mode 100644 index 000000000..a43e9feae Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars412.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars413.jpg b/tests/mt-emil/input-lpd-jpg/Cars413.jpg new file mode 100644 index 000000000..2515f9b9d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars413.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars414.jpg b/tests/mt-emil/input-lpd-jpg/Cars414.jpg new file mode 100644 index 000000000..e5a8e202a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars414.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars415.jpg b/tests/mt-emil/input-lpd-jpg/Cars415.jpg new file mode 100644 index 000000000..f59e4cc7c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars415.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars416.jpg b/tests/mt-emil/input-lpd-jpg/Cars416.jpg new file mode 100644 index 000000000..c687da452 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars416.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars417.jpg b/tests/mt-emil/input-lpd-jpg/Cars417.jpg new file mode 100644 index 000000000..9520adccd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars417.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars418.jpg b/tests/mt-emil/input-lpd-jpg/Cars418.jpg new file mode 100644 index 000000000..3f8d88aac Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars418.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars419.jpg b/tests/mt-emil/input-lpd-jpg/Cars419.jpg new file mode 100644 index 000000000..256c127fb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars419.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars42.jpg b/tests/mt-emil/input-lpd-jpg/Cars42.jpg new file mode 100644 index 000000000..bac9cafb9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars42.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars420.jpg b/tests/mt-emil/input-lpd-jpg/Cars420.jpg new file mode 100644 index 000000000..65b85e6b0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars420.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars421.jpg b/tests/mt-emil/input-lpd-jpg/Cars421.jpg new file mode 100644 index 000000000..517714412 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars421.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars422.jpg b/tests/mt-emil/input-lpd-jpg/Cars422.jpg new file mode 100644 index 000000000..26f204d51 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars422.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars423.jpg b/tests/mt-emil/input-lpd-jpg/Cars423.jpg new file mode 100644 index 000000000..021159e99 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars423.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars424.jpg b/tests/mt-emil/input-lpd-jpg/Cars424.jpg new file mode 100644 index 000000000..f12a6f30b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars424.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars425.jpg b/tests/mt-emil/input-lpd-jpg/Cars425.jpg new file mode 100644 index 000000000..be165f754 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars425.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars426.jpg b/tests/mt-emil/input-lpd-jpg/Cars426.jpg new file mode 100644 index 000000000..aed8c0ef3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars426.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars427.jpg b/tests/mt-emil/input-lpd-jpg/Cars427.jpg new file mode 100644 index 000000000..08ca81292 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars427.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars428.jpg b/tests/mt-emil/input-lpd-jpg/Cars428.jpg new file mode 100644 index 000000000..6662e546c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars428.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars429.jpg b/tests/mt-emil/input-lpd-jpg/Cars429.jpg new file mode 100644 index 000000000..92a5e004e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars429.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars43.jpg b/tests/mt-emil/input-lpd-jpg/Cars43.jpg new file mode 100644 index 000000000..3baa17cb4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars43.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars430.jpg b/tests/mt-emil/input-lpd-jpg/Cars430.jpg new file mode 100644 index 000000000..a85b90eec Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars430.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars431.jpg b/tests/mt-emil/input-lpd-jpg/Cars431.jpg new file mode 100644 index 000000000..5eb9c90bc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars431.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars432.jpg b/tests/mt-emil/input-lpd-jpg/Cars432.jpg new file mode 100644 index 000000000..db5bcb5a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars432.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars44.jpg b/tests/mt-emil/input-lpd-jpg/Cars44.jpg new file mode 100644 index 000000000..5c40423cd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars44.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars45.jpg b/tests/mt-emil/input-lpd-jpg/Cars45.jpg new file mode 100644 index 000000000..f35b8a400 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars45.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars46.jpg b/tests/mt-emil/input-lpd-jpg/Cars46.jpg new file mode 100644 index 000000000..256c127fb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars46.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars47.jpg b/tests/mt-emil/input-lpd-jpg/Cars47.jpg new file mode 100644 index 000000000..d08ed199e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars47.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars48.jpg b/tests/mt-emil/input-lpd-jpg/Cars48.jpg new file mode 100644 index 000000000..d40d183a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars48.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars49.jpg b/tests/mt-emil/input-lpd-jpg/Cars49.jpg new file mode 100644 index 000000000..744f226fd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars49.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars5.jpg b/tests/mt-emil/input-lpd-jpg/Cars5.jpg new file mode 100644 index 000000000..6fe2ab735 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars5.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars50.jpg b/tests/mt-emil/input-lpd-jpg/Cars50.jpg new file mode 100644 index 000000000..93a85dd8f Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars50.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars51.jpg b/tests/mt-emil/input-lpd-jpg/Cars51.jpg new file mode 100644 index 000000000..a26922a24 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars51.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars52.jpg b/tests/mt-emil/input-lpd-jpg/Cars52.jpg new file mode 100644 index 000000000..300422a54 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars52.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars53.jpg b/tests/mt-emil/input-lpd-jpg/Cars53.jpg new file mode 100644 index 000000000..98ebf64b3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars53.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars54.jpg b/tests/mt-emil/input-lpd-jpg/Cars54.jpg new file mode 100644 index 000000000..3212975e0 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars54.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars55.jpg b/tests/mt-emil/input-lpd-jpg/Cars55.jpg new file mode 100644 index 000000000..6ef037431 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars55.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars56.jpg b/tests/mt-emil/input-lpd-jpg/Cars56.jpg new file mode 100644 index 000000000..5eb9c90bc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars56.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars57.jpg b/tests/mt-emil/input-lpd-jpg/Cars57.jpg new file mode 100644 index 000000000..76543268c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars57.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars58.jpg b/tests/mt-emil/input-lpd-jpg/Cars58.jpg new file mode 100644 index 000000000..1203c7b0c Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars58.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars59.jpg b/tests/mt-emil/input-lpd-jpg/Cars59.jpg new file mode 100644 index 000000000..5235736eb Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars59.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars6.jpg b/tests/mt-emil/input-lpd-jpg/Cars6.jpg new file mode 100644 index 000000000..cd9b4263a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars6.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars60.jpg b/tests/mt-emil/input-lpd-jpg/Cars60.jpg new file mode 100644 index 000000000..97cdc952a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars60.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars61.jpg b/tests/mt-emil/input-lpd-jpg/Cars61.jpg new file mode 100644 index 000000000..bfba5aa6d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars61.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars62.jpg b/tests/mt-emil/input-lpd-jpg/Cars62.jpg new file mode 100644 index 000000000..90955f47d Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars62.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars63.jpg b/tests/mt-emil/input-lpd-jpg/Cars63.jpg new file mode 100644 index 000000000..2f2102f4b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars63.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars64.jpg b/tests/mt-emil/input-lpd-jpg/Cars64.jpg new file mode 100644 index 000000000..9557ac035 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars64.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars65.jpg b/tests/mt-emil/input-lpd-jpg/Cars65.jpg new file mode 100644 index 000000000..731533089 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars65.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars66.jpg b/tests/mt-emil/input-lpd-jpg/Cars66.jpg new file mode 100644 index 000000000..6ef037431 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars66.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars67.jpg b/tests/mt-emil/input-lpd-jpg/Cars67.jpg new file mode 100644 index 000000000..f53520ae4 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars67.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars68.jpg b/tests/mt-emil/input-lpd-jpg/Cars68.jpg new file mode 100644 index 000000000..2cb3de910 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars68.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars69.jpg b/tests/mt-emil/input-lpd-jpg/Cars69.jpg new file mode 100644 index 000000000..25de22828 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars69.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars7.jpg b/tests/mt-emil/input-lpd-jpg/Cars7.jpg new file mode 100644 index 000000000..e38e47157 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars7.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars70.jpg b/tests/mt-emil/input-lpd-jpg/Cars70.jpg new file mode 100644 index 000000000..0a3031b41 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars70.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars71.jpg b/tests/mt-emil/input-lpd-jpg/Cars71.jpg new file mode 100644 index 000000000..49263454e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars71.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars72.jpg b/tests/mt-emil/input-lpd-jpg/Cars72.jpg new file mode 100644 index 000000000..0e599a14e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars72.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars73.jpg b/tests/mt-emil/input-lpd-jpg/Cars73.jpg new file mode 100644 index 000000000..fc61134e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars73.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars74.jpg b/tests/mt-emil/input-lpd-jpg/Cars74.jpg new file mode 100644 index 000000000..b24ca3030 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars74.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars75.jpg b/tests/mt-emil/input-lpd-jpg/Cars75.jpg new file mode 100644 index 000000000..3abb643a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars75.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars76.jpg b/tests/mt-emil/input-lpd-jpg/Cars76.jpg new file mode 100644 index 000000000..46c7a20d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars76.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars77.jpg b/tests/mt-emil/input-lpd-jpg/Cars77.jpg new file mode 100644 index 000000000..45044ae3e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars77.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars78.jpg b/tests/mt-emil/input-lpd-jpg/Cars78.jpg new file mode 100644 index 000000000..3ff11624a Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars78.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars79.jpg b/tests/mt-emil/input-lpd-jpg/Cars79.jpg new file mode 100644 index 000000000..57e6c5b11 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars79.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars8.jpg b/tests/mt-emil/input-lpd-jpg/Cars8.jpg new file mode 100644 index 000000000..be165f754 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars8.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars80.jpg b/tests/mt-emil/input-lpd-jpg/Cars80.jpg new file mode 100644 index 000000000..9520adccd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars80.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars81.jpg b/tests/mt-emil/input-lpd-jpg/Cars81.jpg new file mode 100644 index 000000000..4e13a21e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars81.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars82.jpg b/tests/mt-emil/input-lpd-jpg/Cars82.jpg new file mode 100644 index 000000000..b11948614 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars82.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars83.jpg b/tests/mt-emil/input-lpd-jpg/Cars83.jpg new file mode 100644 index 000000000..914b352c2 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars83.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars84.jpg b/tests/mt-emil/input-lpd-jpg/Cars84.jpg new file mode 100644 index 000000000..083985ff9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars84.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars85.jpg b/tests/mt-emil/input-lpd-jpg/Cars85.jpg new file mode 100644 index 000000000..22d31ad90 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars85.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars86.jpg b/tests/mt-emil/input-lpd-jpg/Cars86.jpg new file mode 100644 index 000000000..8dd927362 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars86.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars87.jpg b/tests/mt-emil/input-lpd-jpg/Cars87.jpg new file mode 100644 index 000000000..845b093e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars87.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars88.jpg b/tests/mt-emil/input-lpd-jpg/Cars88.jpg new file mode 100644 index 000000000..7a64dfb1b Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars88.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars89.jpg b/tests/mt-emil/input-lpd-jpg/Cars89.jpg new file mode 100644 index 000000000..e6d751ff5 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars89.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars9.jpg b/tests/mt-emil/input-lpd-jpg/Cars9.jpg new file mode 100644 index 000000000..d4aa04608 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars9.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars90.jpg b/tests/mt-emil/input-lpd-jpg/Cars90.jpg new file mode 100644 index 000000000..d66bbb1fc Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars90.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars91.jpg b/tests/mt-emil/input-lpd-jpg/Cars91.jpg new file mode 100644 index 000000000..744f226fd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars91.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars92.jpg b/tests/mt-emil/input-lpd-jpg/Cars92.jpg new file mode 100644 index 000000000..4f52070f8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars92.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars93.jpg b/tests/mt-emil/input-lpd-jpg/Cars93.jpg new file mode 100644 index 000000000..e940e0c04 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars93.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars94.jpg b/tests/mt-emil/input-lpd-jpg/Cars94.jpg new file mode 100644 index 000000000..2527f360e Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars94.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars95.jpg b/tests/mt-emil/input-lpd-jpg/Cars95.jpg new file mode 100644 index 000000000..4f52070f8 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars95.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars96.jpg b/tests/mt-emil/input-lpd-jpg/Cars96.jpg new file mode 100644 index 000000000..28dfd55e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars96.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars97.jpg b/tests/mt-emil/input-lpd-jpg/Cars97.jpg new file mode 100644 index 000000000..f020986cd Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars97.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars98.jpg b/tests/mt-emil/input-lpd-jpg/Cars98.jpg new file mode 100644 index 000000000..6988640c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars98.jpg differ diff --git a/tests/mt-emil/input-lpd-jpg/Cars99.jpg b/tests/mt-emil/input-lpd-jpg/Cars99.jpg new file mode 100644 index 000000000..6098316a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-jpg/Cars99.jpg differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars0.png b/tests/mt-emil/input-lpd-png-orig/Cars0.png new file mode 100644 index 000000000..c16b03b60 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars0.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars1.png b/tests/mt-emil/input-lpd-png-orig/Cars1.png new file mode 100644 index 000000000..121a16263 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars1.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars10.png b/tests/mt-emil/input-lpd-png-orig/Cars10.png new file mode 100644 index 000000000..8e4e4fb33 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars10.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars100.png b/tests/mt-emil/input-lpd-png-orig/Cars100.png new file mode 100644 index 000000000..026c5cd4c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars100.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars101.png b/tests/mt-emil/input-lpd-png-orig/Cars101.png new file mode 100644 index 000000000..b8cd3bc6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars101.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars102.png b/tests/mt-emil/input-lpd-png-orig/Cars102.png new file mode 100644 index 000000000..ad0631a9d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars102.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars103.png b/tests/mt-emil/input-lpd-png-orig/Cars103.png new file mode 100644 index 000000000..8ef7b93e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars103.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars104.png b/tests/mt-emil/input-lpd-png-orig/Cars104.png new file mode 100644 index 000000000..e11798025 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars104.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars105.png b/tests/mt-emil/input-lpd-png-orig/Cars105.png new file mode 100644 index 000000000..196808946 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars105.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars106.png b/tests/mt-emil/input-lpd-png-orig/Cars106.png new file mode 100644 index 000000000..c79015641 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars106.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars107.png b/tests/mt-emil/input-lpd-png-orig/Cars107.png new file mode 100644 index 000000000..6aa56ae21 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars107.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars108.png b/tests/mt-emil/input-lpd-png-orig/Cars108.png new file mode 100644 index 000000000..224ad42b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars108.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars109.png b/tests/mt-emil/input-lpd-png-orig/Cars109.png new file mode 100644 index 000000000..7cd7ec30a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars109.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars11.png b/tests/mt-emil/input-lpd-png-orig/Cars11.png new file mode 100644 index 000000000..d11448e2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars11.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars110.png b/tests/mt-emil/input-lpd-png-orig/Cars110.png new file mode 100644 index 000000000..1b6810b8b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars110.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars111.png b/tests/mt-emil/input-lpd-png-orig/Cars111.png new file mode 100644 index 000000000..1f57585ad Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars111.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars112.png b/tests/mt-emil/input-lpd-png-orig/Cars112.png new file mode 100644 index 000000000..954a83523 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars112.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars113.png b/tests/mt-emil/input-lpd-png-orig/Cars113.png new file mode 100644 index 000000000..cd977d994 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars113.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars114.png b/tests/mt-emil/input-lpd-png-orig/Cars114.png new file mode 100644 index 000000000..0b33be2b4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars114.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars115.png b/tests/mt-emil/input-lpd-png-orig/Cars115.png new file mode 100644 index 000000000..bab3bf77f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars115.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars116.png b/tests/mt-emil/input-lpd-png-orig/Cars116.png new file mode 100644 index 000000000..bdef96958 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars116.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars117.png b/tests/mt-emil/input-lpd-png-orig/Cars117.png new file mode 100644 index 000000000..d725b6d2b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars117.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars118.png b/tests/mt-emil/input-lpd-png-orig/Cars118.png new file mode 100644 index 000000000..0f7affaee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars118.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars119.png b/tests/mt-emil/input-lpd-png-orig/Cars119.png new file mode 100644 index 000000000..54eca9fb3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars119.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars12.png b/tests/mt-emil/input-lpd-png-orig/Cars12.png new file mode 100644 index 000000000..e27c8cc76 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars12.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars120.png b/tests/mt-emil/input-lpd-png-orig/Cars120.png new file mode 100644 index 000000000..9579ebdcd Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars120.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars121.png b/tests/mt-emil/input-lpd-png-orig/Cars121.png new file mode 100644 index 000000000..8fca65b9a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars121.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars122.png b/tests/mt-emil/input-lpd-png-orig/Cars122.png new file mode 100644 index 000000000..e9c107e87 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars122.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars123.png b/tests/mt-emil/input-lpd-png-orig/Cars123.png new file mode 100644 index 000000000..8f4aca4fc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars123.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars124.png b/tests/mt-emil/input-lpd-png-orig/Cars124.png new file mode 100644 index 000000000..d92db5dca Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars124.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars125.png b/tests/mt-emil/input-lpd-png-orig/Cars125.png new file mode 100644 index 000000000..49b223314 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars125.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars126.png b/tests/mt-emil/input-lpd-png-orig/Cars126.png new file mode 100644 index 000000000..6454da4ac Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars126.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars127.png b/tests/mt-emil/input-lpd-png-orig/Cars127.png new file mode 100644 index 000000000..5901e6903 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars127.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars128.png b/tests/mt-emil/input-lpd-png-orig/Cars128.png new file mode 100644 index 000000000..64e462b2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars128.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars129.png b/tests/mt-emil/input-lpd-png-orig/Cars129.png new file mode 100644 index 000000000..3ead78a9d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars129.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars13.png b/tests/mt-emil/input-lpd-png-orig/Cars13.png new file mode 100644 index 000000000..b63a8a4f1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars13.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars130.png b/tests/mt-emil/input-lpd-png-orig/Cars130.png new file mode 100644 index 000000000..f34b5b24d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars130.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars131.png b/tests/mt-emil/input-lpd-png-orig/Cars131.png new file mode 100644 index 000000000..0b33be2b4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars131.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars132.png b/tests/mt-emil/input-lpd-png-orig/Cars132.png new file mode 100644 index 000000000..c3b88df84 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars132.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars133.png b/tests/mt-emil/input-lpd-png-orig/Cars133.png new file mode 100644 index 000000000..320a328b8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars133.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars134.png b/tests/mt-emil/input-lpd-png-orig/Cars134.png new file mode 100644 index 000000000..5460a9608 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars134.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars135.png b/tests/mt-emil/input-lpd-png-orig/Cars135.png new file mode 100644 index 000000000..875f6681a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars135.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars136.png b/tests/mt-emil/input-lpd-png-orig/Cars136.png new file mode 100644 index 000000000..eaa943197 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars136.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars137.png b/tests/mt-emil/input-lpd-png-orig/Cars137.png new file mode 100644 index 000000000..ab56be169 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars137.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars138.png b/tests/mt-emil/input-lpd-png-orig/Cars138.png new file mode 100644 index 000000000..28369131b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars138.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars139.png b/tests/mt-emil/input-lpd-png-orig/Cars139.png new file mode 100644 index 000000000..b0d77b783 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars139.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars14.png b/tests/mt-emil/input-lpd-png-orig/Cars14.png new file mode 100644 index 000000000..9d7b0e88a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars14.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars140.png b/tests/mt-emil/input-lpd-png-orig/Cars140.png new file mode 100644 index 000000000..b5d91a7d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars140.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars141.png b/tests/mt-emil/input-lpd-png-orig/Cars141.png new file mode 100644 index 000000000..c0977a8e4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars141.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars142.png b/tests/mt-emil/input-lpd-png-orig/Cars142.png new file mode 100644 index 000000000..6d44e320c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars142.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars143.png b/tests/mt-emil/input-lpd-png-orig/Cars143.png new file mode 100644 index 000000000..63429ac95 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars143.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars144.png b/tests/mt-emil/input-lpd-png-orig/Cars144.png new file mode 100644 index 000000000..905520d29 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars144.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars145.png b/tests/mt-emil/input-lpd-png-orig/Cars145.png new file mode 100644 index 000000000..b5d91a7d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars145.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars146.png b/tests/mt-emil/input-lpd-png-orig/Cars146.png new file mode 100644 index 000000000..933cc1a0d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars146.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars147.png b/tests/mt-emil/input-lpd-png-orig/Cars147.png new file mode 100644 index 000000000..c16b03b60 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars147.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars148.png b/tests/mt-emil/input-lpd-png-orig/Cars148.png new file mode 100644 index 000000000..7274e8d86 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars148.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars149.png b/tests/mt-emil/input-lpd-png-orig/Cars149.png new file mode 100644 index 000000000..49f3a62cb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars149.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars15.png b/tests/mt-emil/input-lpd-png-orig/Cars15.png new file mode 100644 index 000000000..12fc7634f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars15.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars150.png b/tests/mt-emil/input-lpd-png-orig/Cars150.png new file mode 100644 index 000000000..0a2aca17a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars150.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars151.png b/tests/mt-emil/input-lpd-png-orig/Cars151.png new file mode 100644 index 000000000..a9d541a35 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars151.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars152.png b/tests/mt-emil/input-lpd-png-orig/Cars152.png new file mode 100644 index 000000000..3f919dd3c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars152.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars153.png b/tests/mt-emil/input-lpd-png-orig/Cars153.png new file mode 100644 index 000000000..6aa56ae21 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars153.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars154.png b/tests/mt-emil/input-lpd-png-orig/Cars154.png new file mode 100644 index 000000000..057f07120 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars154.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars155.png b/tests/mt-emil/input-lpd-png-orig/Cars155.png new file mode 100644 index 000000000..7fc983ee8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars155.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars156.png b/tests/mt-emil/input-lpd-png-orig/Cars156.png new file mode 100644 index 000000000..0eb23d6c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars156.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars157.png b/tests/mt-emil/input-lpd-png-orig/Cars157.png new file mode 100644 index 000000000..fd9ba0210 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars157.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars158.png b/tests/mt-emil/input-lpd-png-orig/Cars158.png new file mode 100644 index 000000000..a5b113f56 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars158.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars159.png b/tests/mt-emil/input-lpd-png-orig/Cars159.png new file mode 100644 index 000000000..49967c2b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars159.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars16.png b/tests/mt-emil/input-lpd-png-orig/Cars16.png new file mode 100644 index 000000000..f2ff86d1c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars16.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars160.png b/tests/mt-emil/input-lpd-png-orig/Cars160.png new file mode 100644 index 000000000..9ecc5b08e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars160.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars161.png b/tests/mt-emil/input-lpd-png-orig/Cars161.png new file mode 100644 index 000000000..bab3bf77f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars161.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars162.png b/tests/mt-emil/input-lpd-png-orig/Cars162.png new file mode 100644 index 000000000..c60984be9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars162.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars163.png b/tests/mt-emil/input-lpd-png-orig/Cars163.png new file mode 100644 index 000000000..fdefa34aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars163.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars164.png b/tests/mt-emil/input-lpd-png-orig/Cars164.png new file mode 100644 index 000000000..450360aed Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars164.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars165.png b/tests/mt-emil/input-lpd-png-orig/Cars165.png new file mode 100644 index 000000000..048c75032 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars165.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars166.png b/tests/mt-emil/input-lpd-png-orig/Cars166.png new file mode 100644 index 000000000..947f1191c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars166.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars167.png b/tests/mt-emil/input-lpd-png-orig/Cars167.png new file mode 100644 index 000000000..6a023adea Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars167.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars168.png b/tests/mt-emil/input-lpd-png-orig/Cars168.png new file mode 100644 index 000000000..851b6926b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars168.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars169.png b/tests/mt-emil/input-lpd-png-orig/Cars169.png new file mode 100644 index 000000000..0eb23d6c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars169.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars17.png b/tests/mt-emil/input-lpd-png-orig/Cars17.png new file mode 100644 index 000000000..5fb0f74e1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars17.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars170.png b/tests/mt-emil/input-lpd-png-orig/Cars170.png new file mode 100644 index 000000000..e42c705fb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars170.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars171.png b/tests/mt-emil/input-lpd-png-orig/Cars171.png new file mode 100644 index 000000000..b63a8a4f1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars171.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars172.png b/tests/mt-emil/input-lpd-png-orig/Cars172.png new file mode 100644 index 000000000..4a5562e7d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars172.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars173.png b/tests/mt-emil/input-lpd-png-orig/Cars173.png new file mode 100644 index 000000000..58948f087 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars173.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars174.png b/tests/mt-emil/input-lpd-png-orig/Cars174.png new file mode 100644 index 000000000..bc2202a23 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars174.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars175.png b/tests/mt-emil/input-lpd-png-orig/Cars175.png new file mode 100644 index 000000000..254b0dac5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars175.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars176.png b/tests/mt-emil/input-lpd-png-orig/Cars176.png new file mode 100644 index 000000000..ff4d49888 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars176.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars177.png b/tests/mt-emil/input-lpd-png-orig/Cars177.png new file mode 100644 index 000000000..adf3a8d79 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars177.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars178.png b/tests/mt-emil/input-lpd-png-orig/Cars178.png new file mode 100644 index 000000000..6bc30beae Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars178.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars179.png b/tests/mt-emil/input-lpd-png-orig/Cars179.png new file mode 100644 index 000000000..f98bc1795 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars179.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars18.png b/tests/mt-emil/input-lpd-png-orig/Cars18.png new file mode 100644 index 000000000..bab3bf77f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars18.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars180.png b/tests/mt-emil/input-lpd-png-orig/Cars180.png new file mode 100644 index 000000000..cd977d994 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars180.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars181.png b/tests/mt-emil/input-lpd-png-orig/Cars181.png new file mode 100644 index 000000000..21c870ad6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars181.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars182.png b/tests/mt-emil/input-lpd-png-orig/Cars182.png new file mode 100644 index 000000000..643412a16 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars182.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars183.png b/tests/mt-emil/input-lpd-png-orig/Cars183.png new file mode 100644 index 000000000..ee00e9809 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars183.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars184.png b/tests/mt-emil/input-lpd-png-orig/Cars184.png new file mode 100644 index 000000000..e8858953d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars184.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars185.png b/tests/mt-emil/input-lpd-png-orig/Cars185.png new file mode 100644 index 000000000..64f5cb2ec Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars185.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars186.png b/tests/mt-emil/input-lpd-png-orig/Cars186.png new file mode 100644 index 000000000..2ae0a31ec Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars186.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars187.png b/tests/mt-emil/input-lpd-png-orig/Cars187.png new file mode 100644 index 000000000..9d7b0e88a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars187.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars188.png b/tests/mt-emil/input-lpd-png-orig/Cars188.png new file mode 100644 index 000000000..f802b661f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars188.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars189.png b/tests/mt-emil/input-lpd-png-orig/Cars189.png new file mode 100644 index 000000000..b5d91a7d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars189.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars19.png b/tests/mt-emil/input-lpd-png-orig/Cars19.png new file mode 100644 index 000000000..038998920 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars19.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars190.png b/tests/mt-emil/input-lpd-png-orig/Cars190.png new file mode 100644 index 000000000..8e4717297 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars190.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars191.png b/tests/mt-emil/input-lpd-png-orig/Cars191.png new file mode 100644 index 000000000..5f3784fbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars191.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars192.png b/tests/mt-emil/input-lpd-png-orig/Cars192.png new file mode 100644 index 000000000..deab3d35a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars192.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars193.png b/tests/mt-emil/input-lpd-png-orig/Cars193.png new file mode 100644 index 000000000..83bd5972c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars193.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars194.png b/tests/mt-emil/input-lpd-png-orig/Cars194.png new file mode 100644 index 000000000..734ca62ac Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars194.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars195.png b/tests/mt-emil/input-lpd-png-orig/Cars195.png new file mode 100644 index 000000000..4937f69ef Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars195.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars196.png b/tests/mt-emil/input-lpd-png-orig/Cars196.png new file mode 100644 index 000000000..a975810c7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars196.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars197.png b/tests/mt-emil/input-lpd-png-orig/Cars197.png new file mode 100644 index 000000000..fdefa34aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars197.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars198.png b/tests/mt-emil/input-lpd-png-orig/Cars198.png new file mode 100644 index 000000000..224ad42b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars198.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars199.png b/tests/mt-emil/input-lpd-png-orig/Cars199.png new file mode 100644 index 000000000..1061b780a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars199.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars2.png b/tests/mt-emil/input-lpd-png-orig/Cars2.png new file mode 100644 index 000000000..c64c179c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars2.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars20.png b/tests/mt-emil/input-lpd-png-orig/Cars20.png new file mode 100644 index 000000000..e85490aae Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars20.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars200.png b/tests/mt-emil/input-lpd-png-orig/Cars200.png new file mode 100644 index 000000000..5f3784fbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars200.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars201.png b/tests/mt-emil/input-lpd-png-orig/Cars201.png new file mode 100644 index 000000000..fdefa34aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars201.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars202.png b/tests/mt-emil/input-lpd-png-orig/Cars202.png new file mode 100644 index 000000000..25afa4eab Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars202.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars203.png b/tests/mt-emil/input-lpd-png-orig/Cars203.png new file mode 100644 index 000000000..7cd7ec30a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars203.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars204.png b/tests/mt-emil/input-lpd-png-orig/Cars204.png new file mode 100644 index 000000000..5b19ce46f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars204.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars205.png b/tests/mt-emil/input-lpd-png-orig/Cars205.png new file mode 100644 index 000000000..3b6d72eee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars205.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars206.png b/tests/mt-emil/input-lpd-png-orig/Cars206.png new file mode 100644 index 000000000..45f87a404 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars206.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars207.png b/tests/mt-emil/input-lpd-png-orig/Cars207.png new file mode 100644 index 000000000..558222aa2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars207.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars208.png b/tests/mt-emil/input-lpd-png-orig/Cars208.png new file mode 100644 index 000000000..4a2f2d344 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars208.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars209.png b/tests/mt-emil/input-lpd-png-orig/Cars209.png new file mode 100644 index 000000000..49bd81e1a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars209.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars21.png b/tests/mt-emil/input-lpd-png-orig/Cars21.png new file mode 100644 index 000000000..79b4e5969 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars21.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars210.png b/tests/mt-emil/input-lpd-png-orig/Cars210.png new file mode 100644 index 000000000..1061b780a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars210.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars211.png b/tests/mt-emil/input-lpd-png-orig/Cars211.png new file mode 100644 index 000000000..1ce7124a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars211.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars212.png b/tests/mt-emil/input-lpd-png-orig/Cars212.png new file mode 100644 index 000000000..5e0e180af Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars212.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars213.png b/tests/mt-emil/input-lpd-png-orig/Cars213.png new file mode 100644 index 000000000..7ab230198 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars213.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars214.png b/tests/mt-emil/input-lpd-png-orig/Cars214.png new file mode 100644 index 000000000..c41cb4de9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars214.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars215.png b/tests/mt-emil/input-lpd-png-orig/Cars215.png new file mode 100644 index 000000000..26e2abe83 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars215.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars216.png b/tests/mt-emil/input-lpd-png-orig/Cars216.png new file mode 100644 index 000000000..3ead78a9d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars216.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars217.png b/tests/mt-emil/input-lpd-png-orig/Cars217.png new file mode 100644 index 000000000..038998920 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars217.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars218.png b/tests/mt-emil/input-lpd-png-orig/Cars218.png new file mode 100644 index 000000000..f7ce01fcd Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars218.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars219.png b/tests/mt-emil/input-lpd-png-orig/Cars219.png new file mode 100644 index 000000000..5f3ff662f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars219.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars22.png b/tests/mt-emil/input-lpd-png-orig/Cars22.png new file mode 100644 index 000000000..7cd4eb965 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars22.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars220.png b/tests/mt-emil/input-lpd-png-orig/Cars220.png new file mode 100644 index 000000000..caba61cf9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars220.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars221.png b/tests/mt-emil/input-lpd-png-orig/Cars221.png new file mode 100644 index 000000000..fc8158b2d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars221.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars222.png b/tests/mt-emil/input-lpd-png-orig/Cars222.png new file mode 100644 index 000000000..2ae0a31ec Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars222.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars223.png b/tests/mt-emil/input-lpd-png-orig/Cars223.png new file mode 100644 index 000000000..8be9fd88a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars223.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars224.png b/tests/mt-emil/input-lpd-png-orig/Cars224.png new file mode 100644 index 000000000..fc618c916 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars224.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars225.png b/tests/mt-emil/input-lpd-png-orig/Cars225.png new file mode 100644 index 000000000..aabb69755 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars225.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars226.png b/tests/mt-emil/input-lpd-png-orig/Cars226.png new file mode 100644 index 000000000..0fff24583 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars226.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars227.png b/tests/mt-emil/input-lpd-png-orig/Cars227.png new file mode 100644 index 000000000..09b11f7f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars227.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars228.png b/tests/mt-emil/input-lpd-png-orig/Cars228.png new file mode 100644 index 000000000..5914aca6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars228.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars229.png b/tests/mt-emil/input-lpd-png-orig/Cars229.png new file mode 100644 index 000000000..82d6b0bf4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars229.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars23.png b/tests/mt-emil/input-lpd-png-orig/Cars23.png new file mode 100644 index 000000000..ce8ec252b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars23.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars230.png b/tests/mt-emil/input-lpd-png-orig/Cars230.png new file mode 100644 index 000000000..fdefa34aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars230.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars231.png b/tests/mt-emil/input-lpd-png-orig/Cars231.png new file mode 100644 index 000000000..094a4cce6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars231.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars232.png b/tests/mt-emil/input-lpd-png-orig/Cars232.png new file mode 100644 index 000000000..23a93b3be Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars232.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars233.png b/tests/mt-emil/input-lpd-png-orig/Cars233.png new file mode 100644 index 000000000..4add34221 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars233.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars234.png b/tests/mt-emil/input-lpd-png-orig/Cars234.png new file mode 100644 index 000000000..1b2afebc8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars234.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars235.png b/tests/mt-emil/input-lpd-png-orig/Cars235.png new file mode 100644 index 000000000..47d05ca70 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars235.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars236.png b/tests/mt-emil/input-lpd-png-orig/Cars236.png new file mode 100644 index 000000000..c32407394 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars236.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars237.png b/tests/mt-emil/input-lpd-png-orig/Cars237.png new file mode 100644 index 000000000..a41ddb1c3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars237.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars238.png b/tests/mt-emil/input-lpd-png-orig/Cars238.png new file mode 100644 index 000000000..cb4c424c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars238.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars239.png b/tests/mt-emil/input-lpd-png-orig/Cars239.png new file mode 100644 index 000000000..6a023adea Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars239.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars24.png b/tests/mt-emil/input-lpd-png-orig/Cars24.png new file mode 100644 index 000000000..b8cd3bc6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars24.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars240.png b/tests/mt-emil/input-lpd-png-orig/Cars240.png new file mode 100644 index 000000000..c4cb7a956 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars240.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars241.png b/tests/mt-emil/input-lpd-png-orig/Cars241.png new file mode 100644 index 000000000..9df260878 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars241.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars242.png b/tests/mt-emil/input-lpd-png-orig/Cars242.png new file mode 100644 index 000000000..c64c179c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars242.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars243.png b/tests/mt-emil/input-lpd-png-orig/Cars243.png new file mode 100644 index 000000000..bd0e5db8b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars243.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars244.png b/tests/mt-emil/input-lpd-png-orig/Cars244.png new file mode 100644 index 000000000..92f3b2d96 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars244.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars245.png b/tests/mt-emil/input-lpd-png-orig/Cars245.png new file mode 100644 index 000000000..f34b5b24d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars245.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars246.png b/tests/mt-emil/input-lpd-png-orig/Cars246.png new file mode 100644 index 000000000..5be674d3d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars246.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars247.png b/tests/mt-emil/input-lpd-png-orig/Cars247.png new file mode 100644 index 000000000..8e4e4fb33 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars247.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars248.png b/tests/mt-emil/input-lpd-png-orig/Cars248.png new file mode 100644 index 000000000..3f844588e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars248.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars249.png b/tests/mt-emil/input-lpd-png-orig/Cars249.png new file mode 100644 index 000000000..df4351e00 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars249.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars25.png b/tests/mt-emil/input-lpd-png-orig/Cars25.png new file mode 100644 index 000000000..90600140d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars25.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars250.png b/tests/mt-emil/input-lpd-png-orig/Cars250.png new file mode 100644 index 000000000..121a16263 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars250.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars251.png b/tests/mt-emil/input-lpd-png-orig/Cars251.png new file mode 100644 index 000000000..4b53b6fbd Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars251.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars252.png b/tests/mt-emil/input-lpd-png-orig/Cars252.png new file mode 100644 index 000000000..c8dc941e6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars252.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars253.png b/tests/mt-emil/input-lpd-png-orig/Cars253.png new file mode 100644 index 000000000..b45850421 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars253.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars254.png b/tests/mt-emil/input-lpd-png-orig/Cars254.png new file mode 100644 index 000000000..4bd5c1db2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars254.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars255.png b/tests/mt-emil/input-lpd-png-orig/Cars255.png new file mode 100644 index 000000000..b9d6b12f8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars255.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars256.png b/tests/mt-emil/input-lpd-png-orig/Cars256.png new file mode 100644 index 000000000..b91d76853 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars256.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars257.png b/tests/mt-emil/input-lpd-png-orig/Cars257.png new file mode 100644 index 000000000..7fe9b25e1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars257.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars258.png b/tests/mt-emil/input-lpd-png-orig/Cars258.png new file mode 100644 index 000000000..8e4bf0d39 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars258.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars259.png b/tests/mt-emil/input-lpd-png-orig/Cars259.png new file mode 100644 index 000000000..1f57585ad Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars259.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars26.png b/tests/mt-emil/input-lpd-png-orig/Cars26.png new file mode 100644 index 000000000..875f6681a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars26.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars260.png b/tests/mt-emil/input-lpd-png-orig/Cars260.png new file mode 100644 index 000000000..2429f3dfc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars260.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars261.png b/tests/mt-emil/input-lpd-png-orig/Cars261.png new file mode 100644 index 000000000..4c6ec1f4d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars261.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars262.png b/tests/mt-emil/input-lpd-png-orig/Cars262.png new file mode 100644 index 000000000..a3119ebbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars262.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars263.png b/tests/mt-emil/input-lpd-png-orig/Cars263.png new file mode 100644 index 000000000..c8789067d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars263.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars264.png b/tests/mt-emil/input-lpd-png-orig/Cars264.png new file mode 100644 index 000000000..44b64a780 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars264.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars265.png b/tests/mt-emil/input-lpd-png-orig/Cars265.png new file mode 100644 index 000000000..4f1063279 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars265.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars266.png b/tests/mt-emil/input-lpd-png-orig/Cars266.png new file mode 100644 index 000000000..26e2abe83 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars266.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars267.png b/tests/mt-emil/input-lpd-png-orig/Cars267.png new file mode 100644 index 000000000..c12d2dfb8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars267.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars268.png b/tests/mt-emil/input-lpd-png-orig/Cars268.png new file mode 100644 index 000000000..fc4225b88 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars268.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars269.png b/tests/mt-emil/input-lpd-png-orig/Cars269.png new file mode 100644 index 000000000..d0e72858e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars269.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars27.png b/tests/mt-emil/input-lpd-png-orig/Cars27.png new file mode 100644 index 000000000..01d48cacb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars27.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars270.png b/tests/mt-emil/input-lpd-png-orig/Cars270.png new file mode 100644 index 000000000..947270dd9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars270.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars271.png b/tests/mt-emil/input-lpd-png-orig/Cars271.png new file mode 100644 index 000000000..bc83e81a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars271.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars272.png b/tests/mt-emil/input-lpd-png-orig/Cars272.png new file mode 100644 index 000000000..6c20528d8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars272.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars273.png b/tests/mt-emil/input-lpd-png-orig/Cars273.png new file mode 100644 index 000000000..ee00e9809 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars273.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars274.png b/tests/mt-emil/input-lpd-png-orig/Cars274.png new file mode 100644 index 000000000..e9c107e87 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars274.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars275.png b/tests/mt-emil/input-lpd-png-orig/Cars275.png new file mode 100644 index 000000000..46e606fee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars275.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars276.png b/tests/mt-emil/input-lpd-png-orig/Cars276.png new file mode 100644 index 000000000..7cd7ec30a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars276.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars277.png b/tests/mt-emil/input-lpd-png-orig/Cars277.png new file mode 100644 index 000000000..fa0a255ba Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars277.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars278.png b/tests/mt-emil/input-lpd-png-orig/Cars278.png new file mode 100644 index 000000000..e0d495b33 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars278.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars279.png b/tests/mt-emil/input-lpd-png-orig/Cars279.png new file mode 100644 index 000000000..0b35cb8c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars279.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars28.png b/tests/mt-emil/input-lpd-png-orig/Cars28.png new file mode 100644 index 000000000..e4306315f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars28.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars280.png b/tests/mt-emil/input-lpd-png-orig/Cars280.png new file mode 100644 index 000000000..6a164e892 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars280.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars281.png b/tests/mt-emil/input-lpd-png-orig/Cars281.png new file mode 100644 index 000000000..7312e7425 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars281.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars282.png b/tests/mt-emil/input-lpd-png-orig/Cars282.png new file mode 100644 index 000000000..ad0631a9d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars282.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars283.png b/tests/mt-emil/input-lpd-png-orig/Cars283.png new file mode 100644 index 000000000..1f4b60da0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars283.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars284.png b/tests/mt-emil/input-lpd-png-orig/Cars284.png new file mode 100644 index 000000000..057f07120 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars284.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars285.png b/tests/mt-emil/input-lpd-png-orig/Cars285.png new file mode 100644 index 000000000..f34b5b24d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars285.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars286.png b/tests/mt-emil/input-lpd-png-orig/Cars286.png new file mode 100644 index 000000000..d9ec352cb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars286.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars287.png b/tests/mt-emil/input-lpd-png-orig/Cars287.png new file mode 100644 index 000000000..49967c2b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars287.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars288.png b/tests/mt-emil/input-lpd-png-orig/Cars288.png new file mode 100644 index 000000000..46e606fee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars288.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars289.png b/tests/mt-emil/input-lpd-png-orig/Cars289.png new file mode 100644 index 000000000..bd56db833 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars289.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars29.png b/tests/mt-emil/input-lpd-png-orig/Cars29.png new file mode 100644 index 000000000..ce8ec252b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars29.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars290.png b/tests/mt-emil/input-lpd-png-orig/Cars290.png new file mode 100644 index 000000000..c433ea7dc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars290.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars291.png b/tests/mt-emil/input-lpd-png-orig/Cars291.png new file mode 100644 index 000000000..6fa3f4dc1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars291.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars292.png b/tests/mt-emil/input-lpd-png-orig/Cars292.png new file mode 100644 index 000000000..8de52fcf6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars292.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars293.png b/tests/mt-emil/input-lpd-png-orig/Cars293.png new file mode 100644 index 000000000..094a4cce6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars293.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars294.png b/tests/mt-emil/input-lpd-png-orig/Cars294.png new file mode 100644 index 000000000..c8e3590b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars294.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars295.png b/tests/mt-emil/input-lpd-png-orig/Cars295.png new file mode 100644 index 000000000..9360a6248 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars295.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars296.png b/tests/mt-emil/input-lpd-png-orig/Cars296.png new file mode 100644 index 000000000..862b897a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars296.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars297.png b/tests/mt-emil/input-lpd-png-orig/Cars297.png new file mode 100644 index 000000000..1b2afebc8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars297.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars298.png b/tests/mt-emil/input-lpd-png-orig/Cars298.png new file mode 100644 index 000000000..5f342482e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars298.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars299.png b/tests/mt-emil/input-lpd-png-orig/Cars299.png new file mode 100644 index 000000000..984b64c79 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars299.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars3.png b/tests/mt-emil/input-lpd-png-orig/Cars3.png new file mode 100644 index 000000000..01d48cacb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars3.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars30.png b/tests/mt-emil/input-lpd-png-orig/Cars30.png new file mode 100644 index 000000000..196808946 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars30.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars300.png b/tests/mt-emil/input-lpd-png-orig/Cars300.png new file mode 100644 index 000000000..875f6681a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars300.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars301.png b/tests/mt-emil/input-lpd-png-orig/Cars301.png new file mode 100644 index 000000000..7c4d4bc9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars301.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars302.png b/tests/mt-emil/input-lpd-png-orig/Cars302.png new file mode 100644 index 000000000..dc0f578b8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars302.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars303.png b/tests/mt-emil/input-lpd-png-orig/Cars303.png new file mode 100644 index 000000000..8e4717297 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars303.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars304.png b/tests/mt-emil/input-lpd-png-orig/Cars304.png new file mode 100644 index 000000000..4fed7e428 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars304.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars305.png b/tests/mt-emil/input-lpd-png-orig/Cars305.png new file mode 100644 index 000000000..02c002940 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars305.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars306.png b/tests/mt-emil/input-lpd-png-orig/Cars306.png new file mode 100644 index 000000000..5a39c9fbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars306.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars307.png b/tests/mt-emil/input-lpd-png-orig/Cars307.png new file mode 100644 index 000000000..fca839126 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars307.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars308.png b/tests/mt-emil/input-lpd-png-orig/Cars308.png new file mode 100644 index 000000000..8f4aca4fc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars308.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars309.png b/tests/mt-emil/input-lpd-png-orig/Cars309.png new file mode 100644 index 000000000..9868d9801 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars309.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars31.png b/tests/mt-emil/input-lpd-png-orig/Cars31.png new file mode 100644 index 000000000..b91d76853 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars31.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars310.png b/tests/mt-emil/input-lpd-png-orig/Cars310.png new file mode 100644 index 000000000..17e3afc68 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars310.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars311.png b/tests/mt-emil/input-lpd-png-orig/Cars311.png new file mode 100644 index 000000000..38faea1a4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars311.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars312.png b/tests/mt-emil/input-lpd-png-orig/Cars312.png new file mode 100644 index 000000000..0ca1fdd22 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars312.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars313.png b/tests/mt-emil/input-lpd-png-orig/Cars313.png new file mode 100644 index 000000000..bded39920 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars313.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars314.png b/tests/mt-emil/input-lpd-png-orig/Cars314.png new file mode 100644 index 000000000..365f86293 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars314.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars315.png b/tests/mt-emil/input-lpd-png-orig/Cars315.png new file mode 100644 index 000000000..fddef306e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars315.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars316.png b/tests/mt-emil/input-lpd-png-orig/Cars316.png new file mode 100644 index 000000000..f73b3742d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars316.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars317.png b/tests/mt-emil/input-lpd-png-orig/Cars317.png new file mode 100644 index 000000000..b8cd3bc6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars317.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars318.png b/tests/mt-emil/input-lpd-png-orig/Cars318.png new file mode 100644 index 000000000..9d7b0e88a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars318.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars319.png b/tests/mt-emil/input-lpd-png-orig/Cars319.png new file mode 100644 index 000000000..d2f2d48ee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars319.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars32.png b/tests/mt-emil/input-lpd-png-orig/Cars32.png new file mode 100644 index 000000000..e9c107e87 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars32.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars320.png b/tests/mt-emil/input-lpd-png-orig/Cars320.png new file mode 100644 index 000000000..057f07120 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars320.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars321.png b/tests/mt-emil/input-lpd-png-orig/Cars321.png new file mode 100644 index 000000000..65ced9431 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars321.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars322.png b/tests/mt-emil/input-lpd-png-orig/Cars322.png new file mode 100644 index 000000000..f3a75501d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars322.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars323.png b/tests/mt-emil/input-lpd-png-orig/Cars323.png new file mode 100644 index 000000000..c121f93b3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars323.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars324.png b/tests/mt-emil/input-lpd-png-orig/Cars324.png new file mode 100644 index 000000000..643412a16 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars324.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars325.png b/tests/mt-emil/input-lpd-png-orig/Cars325.png new file mode 100644 index 000000000..673d4c6aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars325.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars326.png b/tests/mt-emil/input-lpd-png-orig/Cars326.png new file mode 100644 index 000000000..0a2aca17a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars326.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars327.png b/tests/mt-emil/input-lpd-png-orig/Cars327.png new file mode 100644 index 000000000..121a16263 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars327.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars328.png b/tests/mt-emil/input-lpd-png-orig/Cars328.png new file mode 100644 index 000000000..1b2afebc8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars328.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars329.png b/tests/mt-emil/input-lpd-png-orig/Cars329.png new file mode 100644 index 000000000..11bf91fd1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars329.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars33.png b/tests/mt-emil/input-lpd-png-orig/Cars33.png new file mode 100644 index 000000000..64e462b2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars33.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars330.png b/tests/mt-emil/input-lpd-png-orig/Cars330.png new file mode 100644 index 000000000..7c3e11a18 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars330.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars331.png b/tests/mt-emil/input-lpd-png-orig/Cars331.png new file mode 100644 index 000000000..2a08a4355 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars331.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars332.png b/tests/mt-emil/input-lpd-png-orig/Cars332.png new file mode 100644 index 000000000..01d48cacb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars332.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars333.png b/tests/mt-emil/input-lpd-png-orig/Cars333.png new file mode 100644 index 000000000..b9d6b12f8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars333.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars334.png b/tests/mt-emil/input-lpd-png-orig/Cars334.png new file mode 100644 index 000000000..da3e0718c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars334.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars335.png b/tests/mt-emil/input-lpd-png-orig/Cars335.png new file mode 100644 index 000000000..3b6d72eee Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars335.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars336.png b/tests/mt-emil/input-lpd-png-orig/Cars336.png new file mode 100644 index 000000000..0a2aca17a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars336.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars337.png b/tests/mt-emil/input-lpd-png-orig/Cars337.png new file mode 100644 index 000000000..cd67b4ffe Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars337.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars338.png b/tests/mt-emil/input-lpd-png-orig/Cars338.png new file mode 100644 index 000000000..b80bb51ab Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars338.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars339.png b/tests/mt-emil/input-lpd-png-orig/Cars339.png new file mode 100644 index 000000000..9ecc5b08e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars339.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars34.png b/tests/mt-emil/input-lpd-png-orig/Cars34.png new file mode 100644 index 000000000..49967c2b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars34.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars340.png b/tests/mt-emil/input-lpd-png-orig/Cars340.png new file mode 100644 index 000000000..67371b2a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars340.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars341.png b/tests/mt-emil/input-lpd-png-orig/Cars341.png new file mode 100644 index 000000000..5be674d3d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars341.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars342.png b/tests/mt-emil/input-lpd-png-orig/Cars342.png new file mode 100644 index 000000000..e9c107e87 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars342.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars343.png b/tests/mt-emil/input-lpd-png-orig/Cars343.png new file mode 100644 index 000000000..31c77b0ea Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars343.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars344.png b/tests/mt-emil/input-lpd-png-orig/Cars344.png new file mode 100644 index 000000000..e49866384 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars344.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars345.png b/tests/mt-emil/input-lpd-png-orig/Cars345.png new file mode 100644 index 000000000..db0d70cb8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars345.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars346.png b/tests/mt-emil/input-lpd-png-orig/Cars346.png new file mode 100644 index 000000000..5f3784fbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars346.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars347.png b/tests/mt-emil/input-lpd-png-orig/Cars347.png new file mode 100644 index 000000000..841c86a3b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars347.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars348.png b/tests/mt-emil/input-lpd-png-orig/Cars348.png new file mode 100644 index 000000000..9868d9801 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars348.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars349.png b/tests/mt-emil/input-lpd-png-orig/Cars349.png new file mode 100644 index 000000000..8f36a6293 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars349.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars35.png b/tests/mt-emil/input-lpd-png-orig/Cars35.png new file mode 100644 index 000000000..8de52fcf6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars35.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars350.png b/tests/mt-emil/input-lpd-png-orig/Cars350.png new file mode 100644 index 000000000..b3fb1a848 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars350.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars351.png b/tests/mt-emil/input-lpd-png-orig/Cars351.png new file mode 100644 index 000000000..d7b46b9f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars351.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars352.png b/tests/mt-emil/input-lpd-png-orig/Cars352.png new file mode 100644 index 000000000..4460a7417 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars352.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars353.png b/tests/mt-emil/input-lpd-png-orig/Cars353.png new file mode 100644 index 000000000..5f3784fbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars353.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars354.png b/tests/mt-emil/input-lpd-png-orig/Cars354.png new file mode 100644 index 000000000..8fcef5bda Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars354.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars355.png b/tests/mt-emil/input-lpd-png-orig/Cars355.png new file mode 100644 index 000000000..41f5f254d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars355.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars356.png b/tests/mt-emil/input-lpd-png-orig/Cars356.png new file mode 100644 index 000000000..ec75afba4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars356.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars357.png b/tests/mt-emil/input-lpd-png-orig/Cars357.png new file mode 100644 index 000000000..8de52fcf6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars357.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars358.png b/tests/mt-emil/input-lpd-png-orig/Cars358.png new file mode 100644 index 000000000..af4713899 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars358.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars359.png b/tests/mt-emil/input-lpd-png-orig/Cars359.png new file mode 100644 index 000000000..2a91c1414 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars359.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars36.png b/tests/mt-emil/input-lpd-png-orig/Cars36.png new file mode 100644 index 000000000..900f9f719 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars36.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars360.png b/tests/mt-emil/input-lpd-png-orig/Cars360.png new file mode 100644 index 000000000..eb17b3c06 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars360.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars361.png b/tests/mt-emil/input-lpd-png-orig/Cars361.png new file mode 100644 index 000000000..cd977d994 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars361.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars362.png b/tests/mt-emil/input-lpd-png-orig/Cars362.png new file mode 100644 index 000000000..ed3caaa55 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars362.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars363.png b/tests/mt-emil/input-lpd-png-orig/Cars363.png new file mode 100644 index 000000000..8f2a2e6a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars363.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars364.png b/tests/mt-emil/input-lpd-png-orig/Cars364.png new file mode 100644 index 000000000..a9d541a35 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars364.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars365.png b/tests/mt-emil/input-lpd-png-orig/Cars365.png new file mode 100644 index 000000000..2c3d3fd79 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars365.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars366.png b/tests/mt-emil/input-lpd-png-orig/Cars366.png new file mode 100644 index 000000000..6aa56ae21 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars366.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars367.png b/tests/mt-emil/input-lpd-png-orig/Cars367.png new file mode 100644 index 000000000..e49866384 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars367.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars368.png b/tests/mt-emil/input-lpd-png-orig/Cars368.png new file mode 100644 index 000000000..23a93b3be Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars368.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars369.png b/tests/mt-emil/input-lpd-png-orig/Cars369.png new file mode 100644 index 000000000..6a023adea Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars369.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars37.png b/tests/mt-emil/input-lpd-png-orig/Cars37.png new file mode 100644 index 000000000..7314af5e7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars37.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars370.png b/tests/mt-emil/input-lpd-png-orig/Cars370.png new file mode 100644 index 000000000..b5d91a7d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars370.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars371.png b/tests/mt-emil/input-lpd-png-orig/Cars371.png new file mode 100644 index 000000000..874cbda00 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars371.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars372.png b/tests/mt-emil/input-lpd-png-orig/Cars372.png new file mode 100644 index 000000000..c4e758b8d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars372.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars373.png b/tests/mt-emil/input-lpd-png-orig/Cars373.png new file mode 100644 index 000000000..44b9d4a60 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars373.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars374.png b/tests/mt-emil/input-lpd-png-orig/Cars374.png new file mode 100644 index 000000000..c741ff67a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars374.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars375.png b/tests/mt-emil/input-lpd-png-orig/Cars375.png new file mode 100644 index 000000000..5a6677d40 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars375.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars376.png b/tests/mt-emil/input-lpd-png-orig/Cars376.png new file mode 100644 index 000000000..9579ebdcd Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars376.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars377.png b/tests/mt-emil/input-lpd-png-orig/Cars377.png new file mode 100644 index 000000000..90600140d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars377.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars378.png b/tests/mt-emil/input-lpd-png-orig/Cars378.png new file mode 100644 index 000000000..d921ef0b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars378.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars379.png b/tests/mt-emil/input-lpd-png-orig/Cars379.png new file mode 100644 index 000000000..43f4af776 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars379.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars38.png b/tests/mt-emil/input-lpd-png-orig/Cars38.png new file mode 100644 index 000000000..5fc2e1f2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars38.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars380.png b/tests/mt-emil/input-lpd-png-orig/Cars380.png new file mode 100644 index 000000000..5b74458ba Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars380.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars381.png b/tests/mt-emil/input-lpd-png-orig/Cars381.png new file mode 100644 index 000000000..16f145e60 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars381.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars382.png b/tests/mt-emil/input-lpd-png-orig/Cars382.png new file mode 100644 index 000000000..0714d74a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars382.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars383.png b/tests/mt-emil/input-lpd-png-orig/Cars383.png new file mode 100644 index 000000000..63c78b1f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars383.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars384.png b/tests/mt-emil/input-lpd-png-orig/Cars384.png new file mode 100644 index 000000000..9e1b165cc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars384.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars385.png b/tests/mt-emil/input-lpd-png-orig/Cars385.png new file mode 100644 index 000000000..ff4d49888 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars385.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars386.png b/tests/mt-emil/input-lpd-png-orig/Cars386.png new file mode 100644 index 000000000..ce352c932 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars386.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars387.png b/tests/mt-emil/input-lpd-png-orig/Cars387.png new file mode 100644 index 000000000..66c8ca093 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars387.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars388.png b/tests/mt-emil/input-lpd-png-orig/Cars388.png new file mode 100644 index 000000000..ec2c9ea3d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars388.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars389.png b/tests/mt-emil/input-lpd-png-orig/Cars389.png new file mode 100644 index 000000000..ce352c932 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars389.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars39.png b/tests/mt-emil/input-lpd-png-orig/Cars39.png new file mode 100644 index 000000000..13d3d3c6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars39.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars390.png b/tests/mt-emil/input-lpd-png-orig/Cars390.png new file mode 100644 index 000000000..fc01038b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars390.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars391.png b/tests/mt-emil/input-lpd-png-orig/Cars391.png new file mode 100644 index 000000000..a0d65573b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars391.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars392.png b/tests/mt-emil/input-lpd-png-orig/Cars392.png new file mode 100644 index 000000000..b81d9859d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars392.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars393.png b/tests/mt-emil/input-lpd-png-orig/Cars393.png new file mode 100644 index 000000000..4f1063279 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars393.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars394.png b/tests/mt-emil/input-lpd-png-orig/Cars394.png new file mode 100644 index 000000000..c6d659866 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars394.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars395.png b/tests/mt-emil/input-lpd-png-orig/Cars395.png new file mode 100644 index 000000000..a3119ebbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars395.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars396.png b/tests/mt-emil/input-lpd-png-orig/Cars396.png new file mode 100644 index 000000000..9563298e0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars396.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars397.png b/tests/mt-emil/input-lpd-png-orig/Cars397.png new file mode 100644 index 000000000..ce8ec252b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars397.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars398.png b/tests/mt-emil/input-lpd-png-orig/Cars398.png new file mode 100644 index 000000000..0b35cb8c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars398.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars399.png b/tests/mt-emil/input-lpd-png-orig/Cars399.png new file mode 100644 index 000000000..64e462b2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars399.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars4.png b/tests/mt-emil/input-lpd-png-orig/Cars4.png new file mode 100644 index 000000000..0ca1fdd22 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars4.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars40.png b/tests/mt-emil/input-lpd-png-orig/Cars40.png new file mode 100644 index 000000000..875f6681a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars40.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars400.png b/tests/mt-emil/input-lpd-png-orig/Cars400.png new file mode 100644 index 000000000..83bd5972c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars400.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars401.png b/tests/mt-emil/input-lpd-png-orig/Cars401.png new file mode 100644 index 000000000..8f4aca4fc Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars401.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars402.png b/tests/mt-emil/input-lpd-png-orig/Cars402.png new file mode 100644 index 000000000..02c002940 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars402.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars403.png b/tests/mt-emil/input-lpd-png-orig/Cars403.png new file mode 100644 index 000000000..14ad49198 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars403.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars404.png b/tests/mt-emil/input-lpd-png-orig/Cars404.png new file mode 100644 index 000000000..d1b604384 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars404.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars405.png b/tests/mt-emil/input-lpd-png-orig/Cars405.png new file mode 100644 index 000000000..322fc2de5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars405.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars406.png b/tests/mt-emil/input-lpd-png-orig/Cars406.png new file mode 100644 index 000000000..320a328b8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars406.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars407.png b/tests/mt-emil/input-lpd-png-orig/Cars407.png new file mode 100644 index 000000000..7c5cc1d9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars407.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars408.png b/tests/mt-emil/input-lpd-png-orig/Cars408.png new file mode 100644 index 000000000..9e89fc00a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars408.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars409.png b/tests/mt-emil/input-lpd-png-orig/Cars409.png new file mode 100644 index 000000000..c53e40e6f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars409.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars41.png b/tests/mt-emil/input-lpd-png-orig/Cars41.png new file mode 100644 index 000000000..e0b9b7901 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars41.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars410.png b/tests/mt-emil/input-lpd-png-orig/Cars410.png new file mode 100644 index 000000000..6ba08044f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars410.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars411.png b/tests/mt-emil/input-lpd-png-orig/Cars411.png new file mode 100644 index 000000000..14c81c9e1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars411.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars412.png b/tests/mt-emil/input-lpd-png-orig/Cars412.png new file mode 100644 index 000000000..fdefa34aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars412.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars413.png b/tests/mt-emil/input-lpd-png-orig/Cars413.png new file mode 100644 index 000000000..0ac3b128e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars413.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars414.png b/tests/mt-emil/input-lpd-png-orig/Cars414.png new file mode 100644 index 000000000..ea157a97b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars414.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars415.png b/tests/mt-emil/input-lpd-png-orig/Cars415.png new file mode 100644 index 000000000..7df46ede9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars415.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars416.png b/tests/mt-emil/input-lpd-png-orig/Cars416.png new file mode 100644 index 000000000..7e5da1995 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars416.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars417.png b/tests/mt-emil/input-lpd-png-orig/Cars417.png new file mode 100644 index 000000000..680195419 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars417.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars418.png b/tests/mt-emil/input-lpd-png-orig/Cars418.png new file mode 100644 index 000000000..64e462b2a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars418.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars419.png b/tests/mt-emil/input-lpd-png-orig/Cars419.png new file mode 100644 index 000000000..43f4af776 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars419.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars42.png b/tests/mt-emil/input-lpd-png-orig/Cars42.png new file mode 100644 index 000000000..90600140d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars42.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars420.png b/tests/mt-emil/input-lpd-png-orig/Cars420.png new file mode 100644 index 000000000..31c77b0ea Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars420.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars421.png b/tests/mt-emil/input-lpd-png-orig/Cars421.png new file mode 100644 index 000000000..b755dff36 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars421.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars422.png b/tests/mt-emil/input-lpd-png-orig/Cars422.png new file mode 100644 index 000000000..3e94ea43b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars422.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars423.png b/tests/mt-emil/input-lpd-png-orig/Cars423.png new file mode 100644 index 000000000..86bdb388e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars423.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars424.png b/tests/mt-emil/input-lpd-png-orig/Cars424.png new file mode 100644 index 000000000..5f3ff662f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars424.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars425.png b/tests/mt-emil/input-lpd-png-orig/Cars425.png new file mode 100644 index 000000000..7c4d4bc9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars425.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars426.png b/tests/mt-emil/input-lpd-png-orig/Cars426.png new file mode 100644 index 000000000..0714d74a3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars426.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars427.png b/tests/mt-emil/input-lpd-png-orig/Cars427.png new file mode 100644 index 000000000..072a6dc83 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars427.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars428.png b/tests/mt-emil/input-lpd-png-orig/Cars428.png new file mode 100644 index 000000000..01d48cacb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars428.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars429.png b/tests/mt-emil/input-lpd-png-orig/Cars429.png new file mode 100644 index 000000000..2f9f4d3a0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars429.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars43.png b/tests/mt-emil/input-lpd-png-orig/Cars43.png new file mode 100644 index 000000000..6aa56ae21 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars43.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars430.png b/tests/mt-emil/input-lpd-png-orig/Cars430.png new file mode 100644 index 000000000..ae874dd4c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars430.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars431.png b/tests/mt-emil/input-lpd-png-orig/Cars431.png new file mode 100644 index 000000000..fcad99275 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars431.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars432.png b/tests/mt-emil/input-lpd-png-orig/Cars432.png new file mode 100644 index 000000000..3f919dd3c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars432.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars44.png b/tests/mt-emil/input-lpd-png-orig/Cars44.png new file mode 100644 index 000000000..07e62141d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars44.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars45.png b/tests/mt-emil/input-lpd-png-orig/Cars45.png new file mode 100644 index 000000000..afb4e30b4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars45.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars46.png b/tests/mt-emil/input-lpd-png-orig/Cars46.png new file mode 100644 index 000000000..43f4af776 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars46.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars47.png b/tests/mt-emil/input-lpd-png-orig/Cars47.png new file mode 100644 index 000000000..fc01038b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars47.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars48.png b/tests/mt-emil/input-lpd-png-orig/Cars48.png new file mode 100644 index 000000000..9d7b0e88a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars48.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars49.png b/tests/mt-emil/input-lpd-png-orig/Cars49.png new file mode 100644 index 000000000..befc2240e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars49.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars5.png b/tests/mt-emil/input-lpd-png-orig/Cars5.png new file mode 100644 index 000000000..1dc5a4bbe Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars5.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars50.png b/tests/mt-emil/input-lpd-png-orig/Cars50.png new file mode 100644 index 000000000..0ca1fdd22 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars50.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars51.png b/tests/mt-emil/input-lpd-png-orig/Cars51.png new file mode 100644 index 000000000..bc83e81a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars51.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars52.png b/tests/mt-emil/input-lpd-png-orig/Cars52.png new file mode 100644 index 000000000..13d3d3c6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars52.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars53.png b/tests/mt-emil/input-lpd-png-orig/Cars53.png new file mode 100644 index 000000000..367c89fb3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars53.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars54.png b/tests/mt-emil/input-lpd-png-orig/Cars54.png new file mode 100644 index 000000000..9d2a70b12 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars54.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars55.png b/tests/mt-emil/input-lpd-png-orig/Cars55.png new file mode 100644 index 000000000..ce8ec252b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars55.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars56.png b/tests/mt-emil/input-lpd-png-orig/Cars56.png new file mode 100644 index 000000000..fcad99275 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars56.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars57.png b/tests/mt-emil/input-lpd-png-orig/Cars57.png new file mode 100644 index 000000000..a0d65573b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars57.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars58.png b/tests/mt-emil/input-lpd-png-orig/Cars58.png new file mode 100644 index 000000000..7312e7425 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars58.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars59.png b/tests/mt-emil/input-lpd-png-orig/Cars59.png new file mode 100644 index 000000000..18d379879 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars59.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars6.png b/tests/mt-emil/input-lpd-png-orig/Cars6.png new file mode 100644 index 000000000..714d6f098 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars6.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars60.png b/tests/mt-emil/input-lpd-png-orig/Cars60.png new file mode 100644 index 000000000..86fb17c73 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars60.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars61.png b/tests/mt-emil/input-lpd-png-orig/Cars61.png new file mode 100644 index 000000000..0b35cb8c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars61.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars62.png b/tests/mt-emil/input-lpd-png-orig/Cars62.png new file mode 100644 index 000000000..579395c6f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars62.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars63.png b/tests/mt-emil/input-lpd-png-orig/Cars63.png new file mode 100644 index 000000000..44f9f32b8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars63.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars64.png b/tests/mt-emil/input-lpd-png-orig/Cars64.png new file mode 100644 index 000000000..c56cf296a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars64.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars65.png b/tests/mt-emil/input-lpd-png-orig/Cars65.png new file mode 100644 index 000000000..b14d82fa4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars65.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars66.png b/tests/mt-emil/input-lpd-png-orig/Cars66.png new file mode 100644 index 000000000..ce8ec252b Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars66.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars67.png b/tests/mt-emil/input-lpd-png-orig/Cars67.png new file mode 100644 index 000000000..e9a29d306 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars67.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars68.png b/tests/mt-emil/input-lpd-png-orig/Cars68.png new file mode 100644 index 000000000..b63a8a4f1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars68.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars69.png b/tests/mt-emil/input-lpd-png-orig/Cars69.png new file mode 100644 index 000000000..8d63e59fa Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars69.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars7.png b/tests/mt-emil/input-lpd-png-orig/Cars7.png new file mode 100644 index 000000000..7873572ef Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars7.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars70.png b/tests/mt-emil/input-lpd-png-orig/Cars70.png new file mode 100644 index 000000000..678010b85 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars70.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars71.png b/tests/mt-emil/input-lpd-png-orig/Cars71.png new file mode 100644 index 000000000..a993a12e5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars71.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars72.png b/tests/mt-emil/input-lpd-png-orig/Cars72.png new file mode 100644 index 000000000..49967c2b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars72.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars73.png b/tests/mt-emil/input-lpd-png-orig/Cars73.png new file mode 100644 index 000000000..c121f93b3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars73.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars74.png b/tests/mt-emil/input-lpd-png-orig/Cars74.png new file mode 100644 index 000000000..7cd7ec30a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars74.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars75.png b/tests/mt-emil/input-lpd-png-orig/Cars75.png new file mode 100644 index 000000000..02a32b02f Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars75.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars76.png b/tests/mt-emil/input-lpd-png-orig/Cars76.png new file mode 100644 index 000000000..498ec913a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars76.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars77.png b/tests/mt-emil/input-lpd-png-orig/Cars77.png new file mode 100644 index 000000000..327bf9eb0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars77.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars78.png b/tests/mt-emil/input-lpd-png-orig/Cars78.png new file mode 100644 index 000000000..8e4717297 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars78.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars79.png b/tests/mt-emil/input-lpd-png-orig/Cars79.png new file mode 100644 index 000000000..17e3afc68 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars79.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars8.png b/tests/mt-emil/input-lpd-png-orig/Cars8.png new file mode 100644 index 000000000..7c4d4bc9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars8.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars80.png b/tests/mt-emil/input-lpd-png-orig/Cars80.png new file mode 100644 index 000000000..680195419 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars80.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars81.png b/tests/mt-emil/input-lpd-png-orig/Cars81.png new file mode 100644 index 000000000..ccea58bdb Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars81.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars82.png b/tests/mt-emil/input-lpd-png-orig/Cars82.png new file mode 100644 index 000000000..4add34221 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars82.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars83.png b/tests/mt-emil/input-lpd-png-orig/Cars83.png new file mode 100644 index 000000000..756e2230a Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars83.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars84.png b/tests/mt-emil/input-lpd-png-orig/Cars84.png new file mode 100644 index 000000000..b8cd3bc6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars84.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars85.png b/tests/mt-emil/input-lpd-png-orig/Cars85.png new file mode 100644 index 000000000..70c0bde41 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars85.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars86.png b/tests/mt-emil/input-lpd-png-orig/Cars86.png new file mode 100644 index 000000000..2ea8f4128 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars86.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars87.png b/tests/mt-emil/input-lpd-png-orig/Cars87.png new file mode 100644 index 000000000..c84cbec96 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars87.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars88.png b/tests/mt-emil/input-lpd-png-orig/Cars88.png new file mode 100644 index 000000000..05f5f9f90 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars88.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars89.png b/tests/mt-emil/input-lpd-png-orig/Cars89.png new file mode 100644 index 000000000..f1141d2a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars89.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars9.png b/tests/mt-emil/input-lpd-png-orig/Cars9.png new file mode 100644 index 000000000..224ad42b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars9.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars90.png b/tests/mt-emil/input-lpd-png-orig/Cars90.png new file mode 100644 index 000000000..df24e1366 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars90.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars91.png b/tests/mt-emil/input-lpd-png-orig/Cars91.png new file mode 100644 index 000000000..befc2240e Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars91.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars92.png b/tests/mt-emil/input-lpd-png-orig/Cars92.png new file mode 100644 index 000000000..6207ded14 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars92.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars93.png b/tests/mt-emil/input-lpd-png-orig/Cars93.png new file mode 100644 index 000000000..43247af26 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars93.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars94.png b/tests/mt-emil/input-lpd-png-orig/Cars94.png new file mode 100644 index 000000000..bded39920 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars94.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars95.png b/tests/mt-emil/input-lpd-png-orig/Cars95.png new file mode 100644 index 000000000..6207ded14 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars95.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars96.png b/tests/mt-emil/input-lpd-png-orig/Cars96.png new file mode 100644 index 000000000..121a16263 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars96.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars97.png b/tests/mt-emil/input-lpd-png-orig/Cars97.png new file mode 100644 index 000000000..6454da4ac Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars97.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars98.png b/tests/mt-emil/input-lpd-png-orig/Cars98.png new file mode 100644 index 000000000..8c6a226a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars98.png differ diff --git a/tests/mt-emil/input-lpd-png-orig/Cars99.png b/tests/mt-emil/input-lpd-png-orig/Cars99.png new file mode 100644 index 000000000..057f07120 Binary files /dev/null and b/tests/mt-emil/input-lpd-png-orig/Cars99.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars0.png b/tests/mt-emil/input-lpd-png/Cars0.png new file mode 100644 index 000000000..0a4083bc4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars0.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars1.png b/tests/mt-emil/input-lpd-png/Cars1.png new file mode 100644 index 000000000..e8bdf820b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars1.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars10.png b/tests/mt-emil/input-lpd-png/Cars10.png new file mode 100644 index 000000000..c2ba2d87b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars10.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars100.png b/tests/mt-emil/input-lpd-png/Cars100.png new file mode 100644 index 000000000..8318c045a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars100.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars101.png b/tests/mt-emil/input-lpd-png/Cars101.png new file mode 100644 index 000000000..b3f06b932 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars101.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars102.png b/tests/mt-emil/input-lpd-png/Cars102.png new file mode 100644 index 000000000..670b6284e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars102.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars103.png b/tests/mt-emil/input-lpd-png/Cars103.png new file mode 100644 index 000000000..cdb58bb6b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars103.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars104.png b/tests/mt-emil/input-lpd-png/Cars104.png new file mode 100644 index 000000000..4ebd1a03d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars104.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars105.png b/tests/mt-emil/input-lpd-png/Cars105.png new file mode 100644 index 000000000..b11d1cefb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars105.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars106.png b/tests/mt-emil/input-lpd-png/Cars106.png new file mode 100644 index 000000000..38f205590 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars106.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars107.png b/tests/mt-emil/input-lpd-png/Cars107.png new file mode 100644 index 000000000..9414e94b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars107.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars108.png b/tests/mt-emil/input-lpd-png/Cars108.png new file mode 100644 index 000000000..6789bdd91 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars108.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars109.png b/tests/mt-emil/input-lpd-png/Cars109.png new file mode 100644 index 000000000..09621ebb0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars109.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars11.png b/tests/mt-emil/input-lpd-png/Cars11.png new file mode 100644 index 000000000..c212755c3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars11.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars110.png b/tests/mt-emil/input-lpd-png/Cars110.png new file mode 100644 index 000000000..904d00af1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars110.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars111.png b/tests/mt-emil/input-lpd-png/Cars111.png new file mode 100644 index 000000000..0cdc4bd8a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars111.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars112.png b/tests/mt-emil/input-lpd-png/Cars112.png new file mode 100644 index 000000000..4f21096a4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars112.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars113.png b/tests/mt-emil/input-lpd-png/Cars113.png new file mode 100644 index 000000000..2fd64cb1a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars113.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars114.png b/tests/mt-emil/input-lpd-png/Cars114.png new file mode 100644 index 000000000..3063e79ac Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars114.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars115.png b/tests/mt-emil/input-lpd-png/Cars115.png new file mode 100644 index 000000000..64f630276 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars115.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars116.png b/tests/mt-emil/input-lpd-png/Cars116.png new file mode 100644 index 000000000..19eeed2b9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars116.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars117.png b/tests/mt-emil/input-lpd-png/Cars117.png new file mode 100644 index 000000000..7eed8e8a7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars117.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars118.png b/tests/mt-emil/input-lpd-png/Cars118.png new file mode 100644 index 000000000..e171a4cf7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars118.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars119.png b/tests/mt-emil/input-lpd-png/Cars119.png new file mode 100644 index 000000000..987727235 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars119.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars12.png b/tests/mt-emil/input-lpd-png/Cars12.png new file mode 100644 index 000000000..2afc996ee Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars12.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars120.png b/tests/mt-emil/input-lpd-png/Cars120.png new file mode 100644 index 000000000..b86a1898a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars120.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars121.png b/tests/mt-emil/input-lpd-png/Cars121.png new file mode 100644 index 000000000..1f8eb11d8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars121.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars122.png b/tests/mt-emil/input-lpd-png/Cars122.png new file mode 100644 index 000000000..b2a4fe4c5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars122.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars123.png b/tests/mt-emil/input-lpd-png/Cars123.png new file mode 100644 index 000000000..bbebee85b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars123.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars124.png b/tests/mt-emil/input-lpd-png/Cars124.png new file mode 100644 index 000000000..a64b09d17 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars124.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars125.png b/tests/mt-emil/input-lpd-png/Cars125.png new file mode 100644 index 000000000..bd815ec6a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars125.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars126.png b/tests/mt-emil/input-lpd-png/Cars126.png new file mode 100644 index 000000000..ef9d57a57 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars126.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars127.png b/tests/mt-emil/input-lpd-png/Cars127.png new file mode 100644 index 000000000..4b0ed52ab Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars127.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars128.png b/tests/mt-emil/input-lpd-png/Cars128.png new file mode 100644 index 000000000..2d26ff799 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars128.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars129.png b/tests/mt-emil/input-lpd-png/Cars129.png new file mode 100644 index 000000000..bad115ecf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars129.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars13.png b/tests/mt-emil/input-lpd-png/Cars13.png new file mode 100644 index 000000000..b8ad65baf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars13.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars130.png b/tests/mt-emil/input-lpd-png/Cars130.png new file mode 100644 index 000000000..753dbc9f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars130.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars131.png b/tests/mt-emil/input-lpd-png/Cars131.png new file mode 100644 index 000000000..2c3d71afb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars131.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars132.png b/tests/mt-emil/input-lpd-png/Cars132.png new file mode 100644 index 000000000..abbc62751 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars132.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars133.png b/tests/mt-emil/input-lpd-png/Cars133.png new file mode 100644 index 000000000..7264948aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars133.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars134.png b/tests/mt-emil/input-lpd-png/Cars134.png new file mode 100644 index 000000000..90451d498 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars134.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars135.png b/tests/mt-emil/input-lpd-png/Cars135.png new file mode 100644 index 000000000..f065a13c8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars135.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars136.png b/tests/mt-emil/input-lpd-png/Cars136.png new file mode 100644 index 000000000..d79116117 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars136.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars137.png b/tests/mt-emil/input-lpd-png/Cars137.png new file mode 100644 index 000000000..a0ef91dfe Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars137.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars138.png b/tests/mt-emil/input-lpd-png/Cars138.png new file mode 100644 index 000000000..495cad93d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars138.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars139.png b/tests/mt-emil/input-lpd-png/Cars139.png new file mode 100644 index 000000000..a525e02e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars139.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars14.png b/tests/mt-emil/input-lpd-png/Cars14.png new file mode 100644 index 000000000..ba15b1946 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars14.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars140.png b/tests/mt-emil/input-lpd-png/Cars140.png new file mode 100644 index 000000000..89361cbbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars140.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars141.png b/tests/mt-emil/input-lpd-png/Cars141.png new file mode 100644 index 000000000..5aaa4f37e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars141.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars142.png b/tests/mt-emil/input-lpd-png/Cars142.png new file mode 100644 index 000000000..b6fa9a0db Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars142.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars143.png b/tests/mt-emil/input-lpd-png/Cars143.png new file mode 100644 index 000000000..75df8e459 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars143.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars144.png b/tests/mt-emil/input-lpd-png/Cars144.png new file mode 100644 index 000000000..c09dc07cc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars144.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars145.png b/tests/mt-emil/input-lpd-png/Cars145.png new file mode 100644 index 000000000..89361cbbf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars145.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars146.png b/tests/mt-emil/input-lpd-png/Cars146.png new file mode 100644 index 000000000..818819cd4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars146.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars147.png b/tests/mt-emil/input-lpd-png/Cars147.png new file mode 100644 index 000000000..95fca2016 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars147.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars148.png b/tests/mt-emil/input-lpd-png/Cars148.png new file mode 100644 index 000000000..cde111f9f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars148.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars149.png b/tests/mt-emil/input-lpd-png/Cars149.png new file mode 100644 index 000000000..9e39e5486 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars149.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars15.png b/tests/mt-emil/input-lpd-png/Cars15.png new file mode 100644 index 000000000..d26b65140 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars15.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars150.png b/tests/mt-emil/input-lpd-png/Cars150.png new file mode 100644 index 000000000..eaeef0129 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars150.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars151.png b/tests/mt-emil/input-lpd-png/Cars151.png new file mode 100644 index 000000000..5a798e814 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars151.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars152.png b/tests/mt-emil/input-lpd-png/Cars152.png new file mode 100644 index 000000000..5146c7bfa Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars152.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars153.png b/tests/mt-emil/input-lpd-png/Cars153.png new file mode 100644 index 000000000..f97e47478 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars153.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars154.png b/tests/mt-emil/input-lpd-png/Cars154.png new file mode 100644 index 000000000..a09e6432e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars154.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars155.png b/tests/mt-emil/input-lpd-png/Cars155.png new file mode 100644 index 000000000..187efd82c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars155.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars156.png b/tests/mt-emil/input-lpd-png/Cars156.png new file mode 100644 index 000000000..192a9ec9f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars156.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars157.png b/tests/mt-emil/input-lpd-png/Cars157.png new file mode 100644 index 000000000..c1ed3beab Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars157.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars158.png b/tests/mt-emil/input-lpd-png/Cars158.png new file mode 100644 index 000000000..4e8ca6a9d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars158.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars159.png b/tests/mt-emil/input-lpd-png/Cars159.png new file mode 100644 index 000000000..67eeeb3aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars159.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars16.png b/tests/mt-emil/input-lpd-png/Cars16.png new file mode 100644 index 000000000..467da90f3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars16.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars160.png b/tests/mt-emil/input-lpd-png/Cars160.png new file mode 100644 index 000000000..affecbe00 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars160.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars161.png b/tests/mt-emil/input-lpd-png/Cars161.png new file mode 100644 index 000000000..018da7d0a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars161.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars162.png b/tests/mt-emil/input-lpd-png/Cars162.png new file mode 100644 index 000000000..6e48a0c5c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars162.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars163.png b/tests/mt-emil/input-lpd-png/Cars163.png new file mode 100644 index 000000000..615d20cb6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars163.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars164.png b/tests/mt-emil/input-lpd-png/Cars164.png new file mode 100644 index 000000000..e5f1d0470 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars164.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars165.png b/tests/mt-emil/input-lpd-png/Cars165.png new file mode 100644 index 000000000..06f692d12 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars165.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars166.png b/tests/mt-emil/input-lpd-png/Cars166.png new file mode 100644 index 000000000..5abb0553b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars166.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars167.png b/tests/mt-emil/input-lpd-png/Cars167.png new file mode 100644 index 000000000..433dac4d7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars167.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars168.png b/tests/mt-emil/input-lpd-png/Cars168.png new file mode 100644 index 000000000..1425cfea2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars168.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars169.png b/tests/mt-emil/input-lpd-png/Cars169.png new file mode 100644 index 000000000..386fc2937 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars169.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars17.png b/tests/mt-emil/input-lpd-png/Cars17.png new file mode 100644 index 000000000..8a28a735f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars17.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars170.png b/tests/mt-emil/input-lpd-png/Cars170.png new file mode 100644 index 000000000..b8aa09459 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars170.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars171.png b/tests/mt-emil/input-lpd-png/Cars171.png new file mode 100644 index 000000000..9f14d7701 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars171.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars172.png b/tests/mt-emil/input-lpd-png/Cars172.png new file mode 100644 index 000000000..f6d663eb1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars172.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars173.png b/tests/mt-emil/input-lpd-png/Cars173.png new file mode 100644 index 000000000..cc1b48cb1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars173.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars174.png b/tests/mt-emil/input-lpd-png/Cars174.png new file mode 100644 index 000000000..98ea75762 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars174.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars175.png b/tests/mt-emil/input-lpd-png/Cars175.png new file mode 100644 index 000000000..9403647d6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars175.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars176.png b/tests/mt-emil/input-lpd-png/Cars176.png new file mode 100644 index 000000000..45c89593a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars176.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars177.png b/tests/mt-emil/input-lpd-png/Cars177.png new file mode 100644 index 000000000..5c03f3432 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars177.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars178.png b/tests/mt-emil/input-lpd-png/Cars178.png new file mode 100644 index 000000000..e4d774c04 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars178.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars179.png b/tests/mt-emil/input-lpd-png/Cars179.png new file mode 100644 index 000000000..ee890b084 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars179.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars18.png b/tests/mt-emil/input-lpd-png/Cars18.png new file mode 100644 index 000000000..78f06a286 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars18.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars180.png b/tests/mt-emil/input-lpd-png/Cars180.png new file mode 100644 index 000000000..9a4365338 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars180.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars181.png b/tests/mt-emil/input-lpd-png/Cars181.png new file mode 100644 index 000000000..6eab3af19 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars181.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars182.png b/tests/mt-emil/input-lpd-png/Cars182.png new file mode 100644 index 000000000..15a662c41 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars182.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars183.png b/tests/mt-emil/input-lpd-png/Cars183.png new file mode 100644 index 000000000..a4f6956be Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars183.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars184.png b/tests/mt-emil/input-lpd-png/Cars184.png new file mode 100644 index 000000000..83cba95a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars184.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars185.png b/tests/mt-emil/input-lpd-png/Cars185.png new file mode 100644 index 000000000..03ab33c33 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars185.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars186.png b/tests/mt-emil/input-lpd-png/Cars186.png new file mode 100644 index 000000000..c402f1cec Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars186.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars187.png b/tests/mt-emil/input-lpd-png/Cars187.png new file mode 100644 index 000000000..b3647f039 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars187.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars188.png b/tests/mt-emil/input-lpd-png/Cars188.png new file mode 100644 index 000000000..1eaaef207 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars188.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars189.png b/tests/mt-emil/input-lpd-png/Cars189.png new file mode 100644 index 000000000..fc2b4694d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars189.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars19.png b/tests/mt-emil/input-lpd-png/Cars19.png new file mode 100644 index 000000000..a8d0949a9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars19.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars190.png b/tests/mt-emil/input-lpd-png/Cars190.png new file mode 100644 index 000000000..fd0f46992 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars190.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars191.png b/tests/mt-emil/input-lpd-png/Cars191.png new file mode 100644 index 000000000..847b48462 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars191.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars192.png b/tests/mt-emil/input-lpd-png/Cars192.png new file mode 100644 index 000000000..e17208c33 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars192.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars193.png b/tests/mt-emil/input-lpd-png/Cars193.png new file mode 100644 index 000000000..b88bc6301 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars193.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars194.png b/tests/mt-emil/input-lpd-png/Cars194.png new file mode 100644 index 000000000..df6b0d9df Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars194.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars195.png b/tests/mt-emil/input-lpd-png/Cars195.png new file mode 100644 index 000000000..88c1e5fff Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars195.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars196.png b/tests/mt-emil/input-lpd-png/Cars196.png new file mode 100644 index 000000000..7de00cff0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars196.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars197.png b/tests/mt-emil/input-lpd-png/Cars197.png new file mode 100644 index 000000000..daa85dad6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars197.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars198.png b/tests/mt-emil/input-lpd-png/Cars198.png new file mode 100644 index 000000000..bad1db454 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars198.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars199.png b/tests/mt-emil/input-lpd-png/Cars199.png new file mode 100644 index 000000000..a7df1cff3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars199.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars2.png b/tests/mt-emil/input-lpd-png/Cars2.png new file mode 100644 index 000000000..1c2dcdb00 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars2.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars20.png b/tests/mt-emil/input-lpd-png/Cars20.png new file mode 100644 index 000000000..ae4b17e04 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars20.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars200.png b/tests/mt-emil/input-lpd-png/Cars200.png new file mode 100644 index 000000000..26833457f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars200.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars201.png b/tests/mt-emil/input-lpd-png/Cars201.png new file mode 100644 index 000000000..daa85dad6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars201.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars202.png b/tests/mt-emil/input-lpd-png/Cars202.png new file mode 100644 index 000000000..a649c8a14 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars202.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars203.png b/tests/mt-emil/input-lpd-png/Cars203.png new file mode 100644 index 000000000..3a97f0597 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars203.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars204.png b/tests/mt-emil/input-lpd-png/Cars204.png new file mode 100644 index 000000000..754778598 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars204.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars205.png b/tests/mt-emil/input-lpd-png/Cars205.png new file mode 100644 index 000000000..036154102 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars205.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars206.png b/tests/mt-emil/input-lpd-png/Cars206.png new file mode 100644 index 000000000..d6f7977d1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars206.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars207.png b/tests/mt-emil/input-lpd-png/Cars207.png new file mode 100644 index 000000000..115540701 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars207.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars208.png b/tests/mt-emil/input-lpd-png/Cars208.png new file mode 100644 index 000000000..064ee8d79 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars208.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars209.png b/tests/mt-emil/input-lpd-png/Cars209.png new file mode 100644 index 000000000..53d078827 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars209.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars21.png b/tests/mt-emil/input-lpd-png/Cars21.png new file mode 100644 index 000000000..88011ac8e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars21.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars210.png b/tests/mt-emil/input-lpd-png/Cars210.png new file mode 100644 index 000000000..86717f7c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars210.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars211.png b/tests/mt-emil/input-lpd-png/Cars211.png new file mode 100644 index 000000000..f173d1b76 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars211.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars212.png b/tests/mt-emil/input-lpd-png/Cars212.png new file mode 100644 index 000000000..77cffed5d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars212.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars213.png b/tests/mt-emil/input-lpd-png/Cars213.png new file mode 100644 index 000000000..9c31e7de9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars213.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars214.png b/tests/mt-emil/input-lpd-png/Cars214.png new file mode 100644 index 000000000..2e3ee8ff9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars214.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars215.png b/tests/mt-emil/input-lpd-png/Cars215.png new file mode 100644 index 000000000..589567dfe Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars215.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars216.png b/tests/mt-emil/input-lpd-png/Cars216.png new file mode 100644 index 000000000..131189328 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars216.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars217.png b/tests/mt-emil/input-lpd-png/Cars217.png new file mode 100644 index 000000000..c6f8ed7d6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars217.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars218.png b/tests/mt-emil/input-lpd-png/Cars218.png new file mode 100644 index 000000000..ad9b58141 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars218.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars219.png b/tests/mt-emil/input-lpd-png/Cars219.png new file mode 100644 index 000000000..2316806b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars219.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars22.png b/tests/mt-emil/input-lpd-png/Cars22.png new file mode 100644 index 000000000..7de4c0a5d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars22.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars220.png b/tests/mt-emil/input-lpd-png/Cars220.png new file mode 100644 index 000000000..a756f6651 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars220.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars221.png b/tests/mt-emil/input-lpd-png/Cars221.png new file mode 100644 index 000000000..92ac5eff6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars221.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars222.png b/tests/mt-emil/input-lpd-png/Cars222.png new file mode 100644 index 000000000..3305c3b95 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars222.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars223.png b/tests/mt-emil/input-lpd-png/Cars223.png new file mode 100644 index 000000000..6ee6964d8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars223.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars224.png b/tests/mt-emil/input-lpd-png/Cars224.png new file mode 100644 index 000000000..5f2dc4641 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars224.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars225.png b/tests/mt-emil/input-lpd-png/Cars225.png new file mode 100644 index 000000000..2d826c171 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars225.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars226.png b/tests/mt-emil/input-lpd-png/Cars226.png new file mode 100644 index 000000000..623a7906d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars226.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars227.png b/tests/mt-emil/input-lpd-png/Cars227.png new file mode 100644 index 000000000..c553d85d3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars227.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars228.png b/tests/mt-emil/input-lpd-png/Cars228.png new file mode 100644 index 000000000..8d7ff2606 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars228.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars229.png b/tests/mt-emil/input-lpd-png/Cars229.png new file mode 100644 index 000000000..c9b09cfa6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars229.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars23.png b/tests/mt-emil/input-lpd-png/Cars23.png new file mode 100644 index 000000000..15d8fcd3e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars23.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars230.png b/tests/mt-emil/input-lpd-png/Cars230.png new file mode 100644 index 000000000..fc6294e01 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars230.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars231.png b/tests/mt-emil/input-lpd-png/Cars231.png new file mode 100644 index 000000000..1169d8a79 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars231.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars232.png b/tests/mt-emil/input-lpd-png/Cars232.png new file mode 100644 index 000000000..fefc1b751 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars232.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars233.png b/tests/mt-emil/input-lpd-png/Cars233.png new file mode 100644 index 000000000..9f59ae4cc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars233.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars234.png b/tests/mt-emil/input-lpd-png/Cars234.png new file mode 100644 index 000000000..2041cce06 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars234.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars235.png b/tests/mt-emil/input-lpd-png/Cars235.png new file mode 100644 index 000000000..79284b768 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars235.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars236.png b/tests/mt-emil/input-lpd-png/Cars236.png new file mode 100644 index 000000000..82e3d1a75 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars236.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars237.png b/tests/mt-emil/input-lpd-png/Cars237.png new file mode 100644 index 000000000..a36ce3f3e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars237.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars238.png b/tests/mt-emil/input-lpd-png/Cars238.png new file mode 100644 index 000000000..51460372c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars238.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars239.png b/tests/mt-emil/input-lpd-png/Cars239.png new file mode 100644 index 000000000..674932bab Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars239.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars24.png b/tests/mt-emil/input-lpd-png/Cars24.png new file mode 100644 index 000000000..400c62eb3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars24.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars240.png b/tests/mt-emil/input-lpd-png/Cars240.png new file mode 100644 index 000000000..fc8b9078f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars240.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars241.png b/tests/mt-emil/input-lpd-png/Cars241.png new file mode 100644 index 000000000..ea3613c94 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars241.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars242.png b/tests/mt-emil/input-lpd-png/Cars242.png new file mode 100644 index 000000000..eee554eb1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars242.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars243.png b/tests/mt-emil/input-lpd-png/Cars243.png new file mode 100644 index 000000000..021322fdb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars243.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars244.png b/tests/mt-emil/input-lpd-png/Cars244.png new file mode 100644 index 000000000..7894e8194 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars244.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars245.png b/tests/mt-emil/input-lpd-png/Cars245.png new file mode 100644 index 000000000..2774e68b6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars245.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars246.png b/tests/mt-emil/input-lpd-png/Cars246.png new file mode 100644 index 000000000..3fe66f2af Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars246.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars247.png b/tests/mt-emil/input-lpd-png/Cars247.png new file mode 100644 index 000000000..e7d09c5a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars247.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars248.png b/tests/mt-emil/input-lpd-png/Cars248.png new file mode 100644 index 000000000..8b4546991 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars248.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars249.png b/tests/mt-emil/input-lpd-png/Cars249.png new file mode 100644 index 000000000..30f069b49 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars249.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars25.png b/tests/mt-emil/input-lpd-png/Cars25.png new file mode 100644 index 000000000..1da75906e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars25.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars250.png b/tests/mt-emil/input-lpd-png/Cars250.png new file mode 100644 index 000000000..d248e3966 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars250.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars251.png b/tests/mt-emil/input-lpd-png/Cars251.png new file mode 100644 index 000000000..75ea78e31 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars251.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars252.png b/tests/mt-emil/input-lpd-png/Cars252.png new file mode 100644 index 000000000..34732ba6d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars252.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars253.png b/tests/mt-emil/input-lpd-png/Cars253.png new file mode 100644 index 000000000..8187e299a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars253.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars254.png b/tests/mt-emil/input-lpd-png/Cars254.png new file mode 100644 index 000000000..b7a0b929c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars254.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars255.png b/tests/mt-emil/input-lpd-png/Cars255.png new file mode 100644 index 000000000..286b5069b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars255.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars256.png b/tests/mt-emil/input-lpd-png/Cars256.png new file mode 100644 index 000000000..591da21a1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars256.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars257.png b/tests/mt-emil/input-lpd-png/Cars257.png new file mode 100644 index 000000000..96604d473 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars257.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars258.png b/tests/mt-emil/input-lpd-png/Cars258.png new file mode 100644 index 000000000..b02a73c03 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars258.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars259.png b/tests/mt-emil/input-lpd-png/Cars259.png new file mode 100644 index 000000000..6c32e36ef Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars259.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars26.png b/tests/mt-emil/input-lpd-png/Cars26.png new file mode 100644 index 000000000..a9e8f3d27 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars26.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars260.png b/tests/mt-emil/input-lpd-png/Cars260.png new file mode 100644 index 000000000..77851b7f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars260.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars261.png b/tests/mt-emil/input-lpd-png/Cars261.png new file mode 100644 index 000000000..7da6f84f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars261.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars262.png b/tests/mt-emil/input-lpd-png/Cars262.png new file mode 100644 index 000000000..be4126e59 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars262.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars263.png b/tests/mt-emil/input-lpd-png/Cars263.png new file mode 100644 index 000000000..5d27c71ec Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars263.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars264.png b/tests/mt-emil/input-lpd-png/Cars264.png new file mode 100644 index 000000000..67ddfd469 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars264.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars265.png b/tests/mt-emil/input-lpd-png/Cars265.png new file mode 100644 index 000000000..a4ff57de5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars265.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars266.png b/tests/mt-emil/input-lpd-png/Cars266.png new file mode 100644 index 000000000..71946d875 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars266.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars267.png b/tests/mt-emil/input-lpd-png/Cars267.png new file mode 100644 index 000000000..2d5b53f82 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars267.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars268.png b/tests/mt-emil/input-lpd-png/Cars268.png new file mode 100644 index 000000000..4a9aeb39c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars268.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars269.png b/tests/mt-emil/input-lpd-png/Cars269.png new file mode 100644 index 000000000..fc545b1a6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars269.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars27.png b/tests/mt-emil/input-lpd-png/Cars27.png new file mode 100644 index 000000000..f1a629b0f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars27.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars270.png b/tests/mt-emil/input-lpd-png/Cars270.png new file mode 100644 index 000000000..32f8cce8e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars270.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars271.png b/tests/mt-emil/input-lpd-png/Cars271.png new file mode 100644 index 000000000..a681b6704 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars271.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars272.png b/tests/mt-emil/input-lpd-png/Cars272.png new file mode 100644 index 000000000..91953f7c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars272.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars273.png b/tests/mt-emil/input-lpd-png/Cars273.png new file mode 100644 index 000000000..dcbd6fa12 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars273.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars274.png b/tests/mt-emil/input-lpd-png/Cars274.png new file mode 100644 index 000000000..586db505e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars274.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars275.png b/tests/mt-emil/input-lpd-png/Cars275.png new file mode 100644 index 000000000..e2e060e16 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars275.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars276.png b/tests/mt-emil/input-lpd-png/Cars276.png new file mode 100644 index 000000000..fd59d1580 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars276.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars277.png b/tests/mt-emil/input-lpd-png/Cars277.png new file mode 100644 index 000000000..52c24e1ff Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars277.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars278.png b/tests/mt-emil/input-lpd-png/Cars278.png new file mode 100644 index 000000000..d0256ee46 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars278.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars279.png b/tests/mt-emil/input-lpd-png/Cars279.png new file mode 100644 index 000000000..33a7b7b3b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars279.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars28.png b/tests/mt-emil/input-lpd-png/Cars28.png new file mode 100644 index 000000000..90ab891bd Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars28.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars280.png b/tests/mt-emil/input-lpd-png/Cars280.png new file mode 100644 index 000000000..951685574 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars280.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars281.png b/tests/mt-emil/input-lpd-png/Cars281.png new file mode 100644 index 000000000..abbfe6d7d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars281.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars282.png b/tests/mt-emil/input-lpd-png/Cars282.png new file mode 100644 index 000000000..eed3677ed Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars282.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars283.png b/tests/mt-emil/input-lpd-png/Cars283.png new file mode 100644 index 000000000..84a71c066 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars283.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars284.png b/tests/mt-emil/input-lpd-png/Cars284.png new file mode 100644 index 000000000..f7bb2d666 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars284.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars285.png b/tests/mt-emil/input-lpd-png/Cars285.png new file mode 100644 index 000000000..752e31d9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars285.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars286.png b/tests/mt-emil/input-lpd-png/Cars286.png new file mode 100644 index 000000000..80331361f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars286.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars287.png b/tests/mt-emil/input-lpd-png/Cars287.png new file mode 100644 index 000000000..f0b47cbb5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars287.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars288.png b/tests/mt-emil/input-lpd-png/Cars288.png new file mode 100644 index 000000000..e2e060e16 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars288.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars289.png b/tests/mt-emil/input-lpd-png/Cars289.png new file mode 100644 index 000000000..2e1ea06cf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars289.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars29.png b/tests/mt-emil/input-lpd-png/Cars29.png new file mode 100644 index 000000000..6419afe20 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars29.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars290.png b/tests/mt-emil/input-lpd-png/Cars290.png new file mode 100644 index 000000000..202ca6df6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars290.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars291.png b/tests/mt-emil/input-lpd-png/Cars291.png new file mode 100644 index 000000000..2be636393 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars291.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars292.png b/tests/mt-emil/input-lpd-png/Cars292.png new file mode 100644 index 000000000..b0fe3d6de Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars292.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars293.png b/tests/mt-emil/input-lpd-png/Cars293.png new file mode 100644 index 000000000..57d190037 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars293.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars294.png b/tests/mt-emil/input-lpd-png/Cars294.png new file mode 100644 index 000000000..e2c134afc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars294.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars295.png b/tests/mt-emil/input-lpd-png/Cars295.png new file mode 100644 index 000000000..ecc1aeef2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars295.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars296.png b/tests/mt-emil/input-lpd-png/Cars296.png new file mode 100644 index 000000000..5adbc081c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars296.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars297.png b/tests/mt-emil/input-lpd-png/Cars297.png new file mode 100644 index 000000000..9a593a27b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars297.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars298.png b/tests/mt-emil/input-lpd-png/Cars298.png new file mode 100644 index 000000000..80197f3a7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars298.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars299.png b/tests/mt-emil/input-lpd-png/Cars299.png new file mode 100644 index 000000000..4e6fba948 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars299.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars3.png b/tests/mt-emil/input-lpd-png/Cars3.png new file mode 100644 index 000000000..09b1a8957 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars3.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars30.png b/tests/mt-emil/input-lpd-png/Cars30.png new file mode 100644 index 000000000..952cb6580 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars30.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars300.png b/tests/mt-emil/input-lpd-png/Cars300.png new file mode 100644 index 000000000..31c26851f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars300.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars301.png b/tests/mt-emil/input-lpd-png/Cars301.png new file mode 100644 index 000000000..eb584122c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars301.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars302.png b/tests/mt-emil/input-lpd-png/Cars302.png new file mode 100644 index 000000000..aab678a0a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars302.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars303.png b/tests/mt-emil/input-lpd-png/Cars303.png new file mode 100644 index 000000000..8f40d10bd Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars303.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars304.png b/tests/mt-emil/input-lpd-png/Cars304.png new file mode 100644 index 000000000..3496556b5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars304.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars305.png b/tests/mt-emil/input-lpd-png/Cars305.png new file mode 100644 index 000000000..17be3af96 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars305.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars306.png b/tests/mt-emil/input-lpd-png/Cars306.png new file mode 100644 index 000000000..961d60015 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars306.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars307.png b/tests/mt-emil/input-lpd-png/Cars307.png new file mode 100644 index 000000000..ad9b51f08 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars307.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars308.png b/tests/mt-emil/input-lpd-png/Cars308.png new file mode 100644 index 000000000..8c519b164 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars308.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars309.png b/tests/mt-emil/input-lpd-png/Cars309.png new file mode 100644 index 000000000..f856fca43 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars309.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars31.png b/tests/mt-emil/input-lpd-png/Cars31.png new file mode 100644 index 000000000..10e865a22 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars31.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars310.png b/tests/mt-emil/input-lpd-png/Cars310.png new file mode 100644 index 000000000..c794424ab Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars310.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars311.png b/tests/mt-emil/input-lpd-png/Cars311.png new file mode 100644 index 000000000..7df4db8ea Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars311.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars312.png b/tests/mt-emil/input-lpd-png/Cars312.png new file mode 100644 index 000000000..bcc82c14f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars312.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars313.png b/tests/mt-emil/input-lpd-png/Cars313.png new file mode 100644 index 000000000..411d94b99 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars313.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars314.png b/tests/mt-emil/input-lpd-png/Cars314.png new file mode 100644 index 000000000..eb9fcfe38 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars314.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars315.png b/tests/mt-emil/input-lpd-png/Cars315.png new file mode 100644 index 000000000..4d387927c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars315.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars316.png b/tests/mt-emil/input-lpd-png/Cars316.png new file mode 100644 index 000000000..2e0eada0e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars316.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars317.png b/tests/mt-emil/input-lpd-png/Cars317.png new file mode 100644 index 000000000..cf732f030 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars317.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars318.png b/tests/mt-emil/input-lpd-png/Cars318.png new file mode 100644 index 000000000..37e421c28 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars318.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars319.png b/tests/mt-emil/input-lpd-png/Cars319.png new file mode 100644 index 000000000..855bf899b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars319.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars32.png b/tests/mt-emil/input-lpd-png/Cars32.png new file mode 100644 index 000000000..734191aa9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars32.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars320.png b/tests/mt-emil/input-lpd-png/Cars320.png new file mode 100644 index 000000000..17961283d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars320.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars321.png b/tests/mt-emil/input-lpd-png/Cars321.png new file mode 100644 index 000000000..185492602 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars321.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars322.png b/tests/mt-emil/input-lpd-png/Cars322.png new file mode 100644 index 000000000..9d101c63f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars322.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars323.png b/tests/mt-emil/input-lpd-png/Cars323.png new file mode 100644 index 000000000..b47bac6a7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars323.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars324.png b/tests/mt-emil/input-lpd-png/Cars324.png new file mode 100644 index 000000000..4d3ad5405 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars324.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars325.png b/tests/mt-emil/input-lpd-png/Cars325.png new file mode 100644 index 000000000..43c74da0a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars325.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars326.png b/tests/mt-emil/input-lpd-png/Cars326.png new file mode 100644 index 000000000..53ea604a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars326.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars327.png b/tests/mt-emil/input-lpd-png/Cars327.png new file mode 100644 index 000000000..e80190f1b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars327.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars328.png b/tests/mt-emil/input-lpd-png/Cars328.png new file mode 100644 index 000000000..5ace2d2f7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars328.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars329.png b/tests/mt-emil/input-lpd-png/Cars329.png new file mode 100644 index 000000000..7416a551e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars329.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars33.png b/tests/mt-emil/input-lpd-png/Cars33.png new file mode 100644 index 000000000..62df1aadb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars33.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars330.png b/tests/mt-emil/input-lpd-png/Cars330.png new file mode 100644 index 000000000..a99c3d527 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars330.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars331.png b/tests/mt-emil/input-lpd-png/Cars331.png new file mode 100644 index 000000000..bdaf154e4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars331.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars332.png b/tests/mt-emil/input-lpd-png/Cars332.png new file mode 100644 index 000000000..84dfda0ab Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars332.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars333.png b/tests/mt-emil/input-lpd-png/Cars333.png new file mode 100644 index 000000000..39f5ed329 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars333.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars334.png b/tests/mt-emil/input-lpd-png/Cars334.png new file mode 100644 index 000000000..3f1d24511 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars334.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars335.png b/tests/mt-emil/input-lpd-png/Cars335.png new file mode 100644 index 000000000..1471e9b34 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars335.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars336.png b/tests/mt-emil/input-lpd-png/Cars336.png new file mode 100644 index 000000000..6b3c910bb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars336.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars337.png b/tests/mt-emil/input-lpd-png/Cars337.png new file mode 100644 index 000000000..96dce800b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars337.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars338.png b/tests/mt-emil/input-lpd-png/Cars338.png new file mode 100644 index 000000000..40473bf78 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars338.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars339.png b/tests/mt-emil/input-lpd-png/Cars339.png new file mode 100644 index 000000000..93d13047b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars339.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars34.png b/tests/mt-emil/input-lpd-png/Cars34.png new file mode 100644 index 000000000..2a0000ef6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars34.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars340.png b/tests/mt-emil/input-lpd-png/Cars340.png new file mode 100644 index 000000000..f3787e69f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars340.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars341.png b/tests/mt-emil/input-lpd-png/Cars341.png new file mode 100644 index 000000000..0b56df8ee Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars341.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars342.png b/tests/mt-emil/input-lpd-png/Cars342.png new file mode 100644 index 000000000..ebd04fad1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars342.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars343.png b/tests/mt-emil/input-lpd-png/Cars343.png new file mode 100644 index 000000000..40a3beba9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars343.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars344.png b/tests/mt-emil/input-lpd-png/Cars344.png new file mode 100644 index 000000000..5e437c3df Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars344.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars345.png b/tests/mt-emil/input-lpd-png/Cars345.png new file mode 100644 index 000000000..6070b5872 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars345.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars346.png b/tests/mt-emil/input-lpd-png/Cars346.png new file mode 100644 index 000000000..f1b749d1d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars346.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars347.png b/tests/mt-emil/input-lpd-png/Cars347.png new file mode 100644 index 000000000..c2e273fc7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars347.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars348.png b/tests/mt-emil/input-lpd-png/Cars348.png new file mode 100644 index 000000000..da99f2b13 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars348.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars349.png b/tests/mt-emil/input-lpd-png/Cars349.png new file mode 100644 index 000000000..b82dea52f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars349.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars35.png b/tests/mt-emil/input-lpd-png/Cars35.png new file mode 100644 index 000000000..647b40dfc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars35.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars350.png b/tests/mt-emil/input-lpd-png/Cars350.png new file mode 100644 index 000000000..4813027cd Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars350.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars351.png b/tests/mt-emil/input-lpd-png/Cars351.png new file mode 100644 index 000000000..f3d75f71b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars351.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars352.png b/tests/mt-emil/input-lpd-png/Cars352.png new file mode 100644 index 000000000..609558db3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars352.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars353.png b/tests/mt-emil/input-lpd-png/Cars353.png new file mode 100644 index 000000000..f1b749d1d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars353.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars354.png b/tests/mt-emil/input-lpd-png/Cars354.png new file mode 100644 index 000000000..d1136247f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars354.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars355.png b/tests/mt-emil/input-lpd-png/Cars355.png new file mode 100644 index 000000000..458f74634 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars355.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars356.png b/tests/mt-emil/input-lpd-png/Cars356.png new file mode 100644 index 000000000..62ad33669 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars356.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars357.png b/tests/mt-emil/input-lpd-png/Cars357.png new file mode 100644 index 000000000..647b40dfc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars357.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars358.png b/tests/mt-emil/input-lpd-png/Cars358.png new file mode 100644 index 000000000..579c78122 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars358.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars359.png b/tests/mt-emil/input-lpd-png/Cars359.png new file mode 100644 index 000000000..dc2a7e6b7 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars359.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars36.png b/tests/mt-emil/input-lpd-png/Cars36.png new file mode 100644 index 000000000..b159e84c5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars36.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars360.png b/tests/mt-emil/input-lpd-png/Cars360.png new file mode 100644 index 000000000..f883fcd25 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars360.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars361.png b/tests/mt-emil/input-lpd-png/Cars361.png new file mode 100644 index 000000000..4b7601296 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars361.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars362.png b/tests/mt-emil/input-lpd-png/Cars362.png new file mode 100644 index 000000000..7afb98fc5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars362.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars363.png b/tests/mt-emil/input-lpd-png/Cars363.png new file mode 100644 index 000000000..bbde93303 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars363.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars364.png b/tests/mt-emil/input-lpd-png/Cars364.png new file mode 100644 index 000000000..005c80445 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars364.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars365.png b/tests/mt-emil/input-lpd-png/Cars365.png new file mode 100644 index 000000000..b54d88c68 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars365.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars366.png b/tests/mt-emil/input-lpd-png/Cars366.png new file mode 100644 index 000000000..67458cfdf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars366.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars367.png b/tests/mt-emil/input-lpd-png/Cars367.png new file mode 100644 index 000000000..9068c859c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars367.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars368.png b/tests/mt-emil/input-lpd-png/Cars368.png new file mode 100644 index 000000000..c8fd2519e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars368.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars369.png b/tests/mt-emil/input-lpd-png/Cars369.png new file mode 100644 index 000000000..3ca600690 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars369.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars37.png b/tests/mt-emil/input-lpd-png/Cars37.png new file mode 100644 index 000000000..2aad001fe Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars37.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars370.png b/tests/mt-emil/input-lpd-png/Cars370.png new file mode 100644 index 000000000..e68f86264 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars370.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars371.png b/tests/mt-emil/input-lpd-png/Cars371.png new file mode 100644 index 000000000..9177d4aed Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars371.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars372.png b/tests/mt-emil/input-lpd-png/Cars372.png new file mode 100644 index 000000000..2c2f1b1b5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars372.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars373.png b/tests/mt-emil/input-lpd-png/Cars373.png new file mode 100644 index 000000000..2a2c157ef Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars373.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars374.png b/tests/mt-emil/input-lpd-png/Cars374.png new file mode 100644 index 000000000..1634e4a3d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars374.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars375.png b/tests/mt-emil/input-lpd-png/Cars375.png new file mode 100644 index 000000000..717ede07e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars375.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars376.png b/tests/mt-emil/input-lpd-png/Cars376.png new file mode 100644 index 000000000..c04fb4d5e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars376.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars377.png b/tests/mt-emil/input-lpd-png/Cars377.png new file mode 100644 index 000000000..9750d4552 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars377.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars378.png b/tests/mt-emil/input-lpd-png/Cars378.png new file mode 100644 index 000000000..461f74579 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars378.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars379.png b/tests/mt-emil/input-lpd-png/Cars379.png new file mode 100644 index 000000000..c57372bc6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars379.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars38.png b/tests/mt-emil/input-lpd-png/Cars38.png new file mode 100644 index 000000000..eb5ebeac4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars38.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars380.png b/tests/mt-emil/input-lpd-png/Cars380.png new file mode 100644 index 000000000..7a4e20d98 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars380.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars381.png b/tests/mt-emil/input-lpd-png/Cars381.png new file mode 100644 index 000000000..1042ce1e1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars381.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars382.png b/tests/mt-emil/input-lpd-png/Cars382.png new file mode 100644 index 000000000..45ed8bf0f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars382.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars383.png b/tests/mt-emil/input-lpd-png/Cars383.png new file mode 100644 index 000000000..c1bf37752 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars383.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars384.png b/tests/mt-emil/input-lpd-png/Cars384.png new file mode 100644 index 000000000..25a704160 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars384.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars385.png b/tests/mt-emil/input-lpd-png/Cars385.png new file mode 100644 index 000000000..21d31aae6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars385.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars386.png b/tests/mt-emil/input-lpd-png/Cars386.png new file mode 100644 index 000000000..429d1cb0a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars386.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars387.png b/tests/mt-emil/input-lpd-png/Cars387.png new file mode 100644 index 000000000..14614d5e9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars387.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars388.png b/tests/mt-emil/input-lpd-png/Cars388.png new file mode 100644 index 000000000..0bb9e2de2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars388.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars389.png b/tests/mt-emil/input-lpd-png/Cars389.png new file mode 100644 index 000000000..637eeb95a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars389.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars39.png b/tests/mt-emil/input-lpd-png/Cars39.png new file mode 100644 index 000000000..2ff72390f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars39.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars390.png b/tests/mt-emil/input-lpd-png/Cars390.png new file mode 100644 index 000000000..5ce2b1093 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars390.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars391.png b/tests/mt-emil/input-lpd-png/Cars391.png new file mode 100644 index 000000000..c3b084efb Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars391.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars392.png b/tests/mt-emil/input-lpd-png/Cars392.png new file mode 100644 index 000000000..7bbf1e36f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars392.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars393.png b/tests/mt-emil/input-lpd-png/Cars393.png new file mode 100644 index 000000000..1e3a8fb67 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars393.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars394.png b/tests/mt-emil/input-lpd-png/Cars394.png new file mode 100644 index 000000000..ec03f9580 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars394.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars395.png b/tests/mt-emil/input-lpd-png/Cars395.png new file mode 100644 index 000000000..4b544e3ee Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars395.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars396.png b/tests/mt-emil/input-lpd-png/Cars396.png new file mode 100644 index 000000000..8f7aea1e3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars396.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars397.png b/tests/mt-emil/input-lpd-png/Cars397.png new file mode 100644 index 000000000..b4aa1b132 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars397.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars398.png b/tests/mt-emil/input-lpd-png/Cars398.png new file mode 100644 index 000000000..b5125a4a2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars398.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars399.png b/tests/mt-emil/input-lpd-png/Cars399.png new file mode 100644 index 000000000..125846f84 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars399.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars4.png b/tests/mt-emil/input-lpd-png/Cars4.png new file mode 100644 index 000000000..c0e551a9a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars4.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars40.png b/tests/mt-emil/input-lpd-png/Cars40.png new file mode 100644 index 000000000..ea2ac1a03 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars40.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars400.png b/tests/mt-emil/input-lpd-png/Cars400.png new file mode 100644 index 000000000..ae30ec7b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars400.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars401.png b/tests/mt-emil/input-lpd-png/Cars401.png new file mode 100644 index 000000000..25ede5b7d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars401.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars402.png b/tests/mt-emil/input-lpd-png/Cars402.png new file mode 100644 index 000000000..3874aaf6b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars402.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars403.png b/tests/mt-emil/input-lpd-png/Cars403.png new file mode 100644 index 000000000..eb22ed97b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars403.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars404.png b/tests/mt-emil/input-lpd-png/Cars404.png new file mode 100644 index 000000000..5e077e002 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars404.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars405.png b/tests/mt-emil/input-lpd-png/Cars405.png new file mode 100644 index 000000000..f8c1964b2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars405.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars406.png b/tests/mt-emil/input-lpd-png/Cars406.png new file mode 100644 index 000000000..3205b3e86 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars406.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars407.png b/tests/mt-emil/input-lpd-png/Cars407.png new file mode 100644 index 000000000..4de68aae2 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars407.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars408.png b/tests/mt-emil/input-lpd-png/Cars408.png new file mode 100644 index 000000000..f9e3f9c2d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars408.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars409.png b/tests/mt-emil/input-lpd-png/Cars409.png new file mode 100644 index 000000000..94b514724 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars409.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars41.png b/tests/mt-emil/input-lpd-png/Cars41.png new file mode 100644 index 000000000..31483687a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars41.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars410.png b/tests/mt-emil/input-lpd-png/Cars410.png new file mode 100644 index 000000000..474c60882 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars410.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars411.png b/tests/mt-emil/input-lpd-png/Cars411.png new file mode 100644 index 000000000..410035660 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars411.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars412.png b/tests/mt-emil/input-lpd-png/Cars412.png new file mode 100644 index 000000000..f4c35c12d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars412.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars413.png b/tests/mt-emil/input-lpd-png/Cars413.png new file mode 100644 index 000000000..45290ffce Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars413.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars414.png b/tests/mt-emil/input-lpd-png/Cars414.png new file mode 100644 index 000000000..8a42657b1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars414.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars415.png b/tests/mt-emil/input-lpd-png/Cars415.png new file mode 100644 index 000000000..e73e06ef4 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars415.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars416.png b/tests/mt-emil/input-lpd-png/Cars416.png new file mode 100644 index 000000000..1564b9c66 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars416.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars417.png b/tests/mt-emil/input-lpd-png/Cars417.png new file mode 100644 index 000000000..fba4d4d1b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars417.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars418.png b/tests/mt-emil/input-lpd-png/Cars418.png new file mode 100644 index 000000000..29703a866 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars418.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars419.png b/tests/mt-emil/input-lpd-png/Cars419.png new file mode 100644 index 000000000..1d000a9c9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars419.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars42.png b/tests/mt-emil/input-lpd-png/Cars42.png new file mode 100644 index 000000000..6eba60595 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars42.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars420.png b/tests/mt-emil/input-lpd-png/Cars420.png new file mode 100644 index 000000000..1ec608a52 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars420.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars421.png b/tests/mt-emil/input-lpd-png/Cars421.png new file mode 100644 index 000000000..1869bb344 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars421.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars422.png b/tests/mt-emil/input-lpd-png/Cars422.png new file mode 100644 index 000000000..47f102e5a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars422.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars423.png b/tests/mt-emil/input-lpd-png/Cars423.png new file mode 100644 index 000000000..68252658d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars423.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars424.png b/tests/mt-emil/input-lpd-png/Cars424.png new file mode 100644 index 000000000..218cb36f5 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars424.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars425.png b/tests/mt-emil/input-lpd-png/Cars425.png new file mode 100644 index 000000000..b3e2d3b3f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars425.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars426.png b/tests/mt-emil/input-lpd-png/Cars426.png new file mode 100644 index 000000000..48a6dc508 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars426.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars427.png b/tests/mt-emil/input-lpd-png/Cars427.png new file mode 100644 index 000000000..3f3025cce Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars427.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars428.png b/tests/mt-emil/input-lpd-png/Cars428.png new file mode 100644 index 000000000..e977cbac1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars428.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars429.png b/tests/mt-emil/input-lpd-png/Cars429.png new file mode 100644 index 000000000..0a0f22a4e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars429.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars43.png b/tests/mt-emil/input-lpd-png/Cars43.png new file mode 100644 index 000000000..c72946ea8 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars43.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars430.png b/tests/mt-emil/input-lpd-png/Cars430.png new file mode 100644 index 000000000..b40abd4a9 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars430.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars431.png b/tests/mt-emil/input-lpd-png/Cars431.png new file mode 100644 index 000000000..528dbad53 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars431.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars432.png b/tests/mt-emil/input-lpd-png/Cars432.png new file mode 100644 index 000000000..a80cd53ea Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars432.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars44.png b/tests/mt-emil/input-lpd-png/Cars44.png new file mode 100644 index 000000000..bb8782ece Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars44.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars45.png b/tests/mt-emil/input-lpd-png/Cars45.png new file mode 100644 index 000000000..0488a7267 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars45.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars46.png b/tests/mt-emil/input-lpd-png/Cars46.png new file mode 100644 index 000000000..45c54d546 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars46.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars47.png b/tests/mt-emil/input-lpd-png/Cars47.png new file mode 100644 index 000000000..91679626d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars47.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars48.png b/tests/mt-emil/input-lpd-png/Cars48.png new file mode 100644 index 000000000..7933cb917 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars48.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars49.png b/tests/mt-emil/input-lpd-png/Cars49.png new file mode 100644 index 000000000..ccc489b3f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars49.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars5.png b/tests/mt-emil/input-lpd-png/Cars5.png new file mode 100644 index 000000000..6588dae19 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars5.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars50.png b/tests/mt-emil/input-lpd-png/Cars50.png new file mode 100644 index 000000000..efe4aa565 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars50.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars51.png b/tests/mt-emil/input-lpd-png/Cars51.png new file mode 100644 index 000000000..4f5842004 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars51.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars52.png b/tests/mt-emil/input-lpd-png/Cars52.png new file mode 100644 index 000000000..11f9510be Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars52.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars53.png b/tests/mt-emil/input-lpd-png/Cars53.png new file mode 100644 index 000000000..63c2240cf Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars53.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars54.png b/tests/mt-emil/input-lpd-png/Cars54.png new file mode 100644 index 000000000..8a9ff2669 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars54.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars55.png b/tests/mt-emil/input-lpd-png/Cars55.png new file mode 100644 index 000000000..4b023f231 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars55.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars56.png b/tests/mt-emil/input-lpd-png/Cars56.png new file mode 100644 index 000000000..5a5d90ac0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars56.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars57.png b/tests/mt-emil/input-lpd-png/Cars57.png new file mode 100644 index 000000000..b521458ac Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars57.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars58.png b/tests/mt-emil/input-lpd-png/Cars58.png new file mode 100644 index 000000000..12c6e141c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars58.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars59.png b/tests/mt-emil/input-lpd-png/Cars59.png new file mode 100644 index 000000000..b969fb0cc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars59.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars6.png b/tests/mt-emil/input-lpd-png/Cars6.png new file mode 100644 index 000000000..c8cae0a95 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars6.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars60.png b/tests/mt-emil/input-lpd-png/Cars60.png new file mode 100644 index 000000000..096e445fe Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars60.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars61.png b/tests/mt-emil/input-lpd-png/Cars61.png new file mode 100644 index 000000000..e5fe6ef8f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars61.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars62.png b/tests/mt-emil/input-lpd-png/Cars62.png new file mode 100644 index 000000000..89a49424f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars62.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars63.png b/tests/mt-emil/input-lpd-png/Cars63.png new file mode 100644 index 000000000..5d6e25c6e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars63.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars64.png b/tests/mt-emil/input-lpd-png/Cars64.png new file mode 100644 index 000000000..21e9b962b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars64.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars65.png b/tests/mt-emil/input-lpd-png/Cars65.png new file mode 100644 index 000000000..83feea87c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars65.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars66.png b/tests/mt-emil/input-lpd-png/Cars66.png new file mode 100644 index 000000000..4b023f231 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars66.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars67.png b/tests/mt-emil/input-lpd-png/Cars67.png new file mode 100644 index 000000000..00ebff129 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars67.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars68.png b/tests/mt-emil/input-lpd-png/Cars68.png new file mode 100644 index 000000000..6e27eb4ef Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars68.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars69.png b/tests/mt-emil/input-lpd-png/Cars69.png new file mode 100644 index 000000000..fc682d5da Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars69.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars7.png b/tests/mt-emil/input-lpd-png/Cars7.png new file mode 100644 index 000000000..2164f987b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars7.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars70.png b/tests/mt-emil/input-lpd-png/Cars70.png new file mode 100644 index 000000000..b8d1c284e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars70.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars71.png b/tests/mt-emil/input-lpd-png/Cars71.png new file mode 100644 index 000000000..9604fbc5a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars71.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars72.png b/tests/mt-emil/input-lpd-png/Cars72.png new file mode 100644 index 000000000..8a9c30a9c Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars72.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars73.png b/tests/mt-emil/input-lpd-png/Cars73.png new file mode 100644 index 000000000..9dda9150e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars73.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars74.png b/tests/mt-emil/input-lpd-png/Cars74.png new file mode 100644 index 000000000..54c87919d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars74.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars75.png b/tests/mt-emil/input-lpd-png/Cars75.png new file mode 100644 index 000000000..e7ceadb5d Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars75.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars76.png b/tests/mt-emil/input-lpd-png/Cars76.png new file mode 100644 index 000000000..e02dbbd73 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars76.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars77.png b/tests/mt-emil/input-lpd-png/Cars77.png new file mode 100644 index 000000000..01839255f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars77.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars78.png b/tests/mt-emil/input-lpd-png/Cars78.png new file mode 100644 index 000000000..9104ab74f Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars78.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars79.png b/tests/mt-emil/input-lpd-png/Cars79.png new file mode 100644 index 000000000..195c73594 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars79.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars8.png b/tests/mt-emil/input-lpd-png/Cars8.png new file mode 100644 index 000000000..fc73c7900 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars8.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars80.png b/tests/mt-emil/input-lpd-png/Cars80.png new file mode 100644 index 000000000..052d34d9b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars80.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars81.png b/tests/mt-emil/input-lpd-png/Cars81.png new file mode 100644 index 000000000..2ddd8566b Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars81.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars82.png b/tests/mt-emil/input-lpd-png/Cars82.png new file mode 100644 index 000000000..433fa08f6 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars82.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars83.png b/tests/mt-emil/input-lpd-png/Cars83.png new file mode 100644 index 000000000..cc2d5603e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars83.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars84.png b/tests/mt-emil/input-lpd-png/Cars84.png new file mode 100644 index 000000000..e8452e8aa Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars84.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars85.png b/tests/mt-emil/input-lpd-png/Cars85.png new file mode 100644 index 000000000..054ad5ac1 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars85.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars86.png b/tests/mt-emil/input-lpd-png/Cars86.png new file mode 100644 index 000000000..adb067863 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars86.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars87.png b/tests/mt-emil/input-lpd-png/Cars87.png new file mode 100644 index 000000000..db3b18e67 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars87.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars88.png b/tests/mt-emil/input-lpd-png/Cars88.png new file mode 100644 index 000000000..2cbab44fd Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars88.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars89.png b/tests/mt-emil/input-lpd-png/Cars89.png new file mode 100644 index 000000000..9c67ecc85 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars89.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars9.png b/tests/mt-emil/input-lpd-png/Cars9.png new file mode 100644 index 000000000..52c0161c0 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars9.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars90.png b/tests/mt-emil/input-lpd-png/Cars90.png new file mode 100644 index 000000000..b6e5a385a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars90.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars91.png b/tests/mt-emil/input-lpd-png/Cars91.png new file mode 100644 index 000000000..e17524a25 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars91.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars92.png b/tests/mt-emil/input-lpd-png/Cars92.png new file mode 100644 index 000000000..918aceb7e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars92.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars93.png b/tests/mt-emil/input-lpd-png/Cars93.png new file mode 100644 index 000000000..26bcaf00a Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars93.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars94.png b/tests/mt-emil/input-lpd-png/Cars94.png new file mode 100644 index 000000000..f087be2ba Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars94.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars95.png b/tests/mt-emil/input-lpd-png/Cars95.png new file mode 100644 index 000000000..918aceb7e Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars95.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars96.png b/tests/mt-emil/input-lpd-png/Cars96.png new file mode 100644 index 000000000..2454297fa Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars96.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars97.png b/tests/mt-emil/input-lpd-png/Cars97.png new file mode 100644 index 000000000..12f8536f3 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars97.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars98.png b/tests/mt-emil/input-lpd-png/Cars98.png new file mode 100644 index 000000000..512d95507 Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars98.png differ diff --git a/tests/mt-emil/input-lpd-png/Cars99.png b/tests/mt-emil/input-lpd-png/Cars99.png new file mode 100644 index 000000000..ccc98fadc Binary files /dev/null and b/tests/mt-emil/input-lpd-png/Cars99.png differ diff --git a/tests/mt-emil/input-lpd-ref/Cars0.csv b/tests/mt-emil/input-lpd-ref/Cars0.csv new file mode 100644 index 000000000..9355a0bd3 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars0.csv @@ -0,0 +1 @@ +226,125,193,48 diff --git a/tests/mt-emil/input-lpd-ref/Cars1.csv b/tests/mt-emil/input-lpd-ref/Cars1.csv new file mode 100644 index 000000000..45024d294 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars1.csv @@ -0,0 +1 @@ +134,128,128,32 diff --git a/tests/mt-emil/input-lpd-ref/Cars106.csv b/tests/mt-emil/input-lpd-ref/Cars106.csv new file mode 100644 index 000000000..f9095e9e1 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars106.csv @@ -0,0 +1,4 @@ +138,79,39,13 +245,79,25,15 +169,202,23,29 +225,194,54,23 diff --git a/tests/mt-emil/input-lpd-ref/Cars143.csv b/tests/mt-emil/input-lpd-ref/Cars143.csv new file mode 100644 index 000000000..a406621dd --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars143.csv @@ -0,0 +1,2 @@ +93,196,37,11 +316,195,33,10 diff --git a/tests/mt-emil/input-lpd-ref/Cars146.csv b/tests/mt-emil/input-lpd-ref/Cars146.csv new file mode 100644 index 000000000..364b8f442 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars146.csv @@ -0,0 +1,4 @@ +143,263,27,8 +254,238,26,9 +54,189,24,7 +111,194,18,10 diff --git a/tests/mt-emil/input-lpd-ref/Cars2.csv b/tests/mt-emil/input-lpd-ref/Cars2.csv new file mode 100644 index 000000000..431053741 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars2.csv @@ -0,0 +1 @@ +229,176,41,17 diff --git a/tests/mt-emil/input-lpd-ref/Cars249.csv b/tests/mt-emil/input-lpd-ref/Cars249.csv new file mode 100644 index 000000000..3bf838b84 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars249.csv @@ -0,0 +1,4 @@ +118,91,31,8 +238,60,31,19 +133,195,28,8 +300,208,54,18 diff --git a/tests/mt-emil/input-lpd-ref/Cars277.csv b/tests/mt-emil/input-lpd-ref/Cars277.csv new file mode 100644 index 000000000..3fe52bc6e --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars277.csv @@ -0,0 +1,4 @@ +48,218,24,7 +134,217,19,7 +290,220,18,9 +373,212,15,5 diff --git a/tests/mt-emil/input-lpd-ref/Cars295.csv b/tests/mt-emil/input-lpd-ref/Cars295.csv new file mode 100644 index 000000000..9af9f80a4 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars295.csv @@ -0,0 +1,2 @@ +52,170,21,12 +237,143,34,19 diff --git a/tests/mt-emil/input-lpd-ref/Cars3.csv b/tests/mt-emil/input-lpd-ref/Cars3.csv new file mode 100644 index 000000000..eab4b4498 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars3.csv @@ -0,0 +1 @@ +142,128,119,29 diff --git a/tests/mt-emil/input-lpd-ref/Cars316.csv b/tests/mt-emil/input-lpd-ref/Cars316.csv new file mode 100644 index 000000000..1de9852e0 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars316.csv @@ -0,0 +1,2 @@ +377,405,99,34 +379,192,76,28 diff --git a/tests/mt-emil/input-lpd-ref/Cars330.csv b/tests/mt-emil/input-lpd-ref/Cars330.csv new file mode 100644 index 000000000..c7113992f --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars330.csv @@ -0,0 +1,4 @@ +29,192,28,11 +168,202,30,12 +313,180,20,11 +385,172,14,9 diff --git a/tests/mt-emil/input-lpd-ref/Cars4.csv b/tests/mt-emil/input-lpd-ref/Cars4.csv new file mode 100644 index 000000000..a83513fef --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars4.csv @@ -0,0 +1 @@ +156,82,347,171 diff --git a/tests/mt-emil/input-lpd-ref/Cars71.csv b/tests/mt-emil/input-lpd-ref/Cars71.csv new file mode 100644 index 000000000..ce031f3f9 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars71.csv @@ -0,0 +1,2 @@ +254,144,30,8 +86,150,39,11 diff --git a/tests/mt-emil/input-lpd-ref/Cars87.csv b/tests/mt-emil/input-lpd-ref/Cars87.csv new file mode 100644 index 000000000..27696bc58 --- /dev/null +++ b/tests/mt-emil/input-lpd-ref/Cars87.csv @@ -0,0 +1,2 @@ +3,205,42,15 +345,168,20,9 diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_01.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_01.jpg new file mode 100644 index 000000000..735cfeb87 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_01.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_02.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_02.jpg new file mode 100644 index 000000000..4c4820cdd Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_02.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_03.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_03.jpg new file mode 100644 index 000000000..b73da6a4e Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_03.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_04.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_04.jpg new file mode 100644 index 000000000..d0f2fbf52 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_04.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_05.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_05.jpg new file mode 100644 index 000000000..68522c836 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_05.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_06.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_06.jpg new file mode 100644 index 000000000..2b4ba6419 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_06.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_07.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_07.jpg new file mode 100644 index 000000000..6a59d1e5d Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_07.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_08.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_08.jpg new file mode 100644 index 000000000..43026bb02 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_08.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_09.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_09.jpg new file mode 100644 index 000000000..c159af643 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_09.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/picsum_1920x1080_10.jpg b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_10.jpg new file mode 100644 index 000000000..95bd9b57c Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/picsum_1920x1080_10.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/random_1024x1024.jpg b/tests/mt-emil/input-resize-FHD/random_1024x1024.jpg new file mode 100644 index 000000000..2b7edeb5a Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/random_1024x1024.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/random_1024x512.jpg b/tests/mt-emil/input-resize-FHD/random_1024x512.jpg new file mode 100644 index 000000000..7c60cdd7b Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/random_1024x512.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/random_512x1024.jpg b/tests/mt-emil/input-resize-FHD/random_512x1024.jpg new file mode 100644 index 000000000..c6dbfc56d Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/random_512x1024.jpg differ diff --git a/tests/mt-emil/input-resize-FHD/random_512x512.jpg b/tests/mt-emil/input-resize-FHD/random_512x512.jpg new file mode 100644 index 000000000..2890dbcf1 Binary files /dev/null and b/tests/mt-emil/input-resize-FHD/random_512x512.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_01.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_01.jpg new file mode 100644 index 000000000..7edfd2d4b Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_01.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_02.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_02.jpg new file mode 100644 index 000000000..5013f37e4 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_02.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_03.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_03.jpg new file mode 100644 index 000000000..eccba4118 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_03.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_04.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_04.jpg new file mode 100644 index 000000000..edfa0427d Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_04.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_05.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_05.jpg new file mode 100644 index 000000000..52d0103d9 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_05.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_06.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_06.jpg new file mode 100644 index 000000000..12fe9f530 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_06.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_07.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_07.jpg new file mode 100644 index 000000000..ee39776b3 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_07.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_08.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_08.jpg new file mode 100644 index 000000000..fc01d7152 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_08.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_09.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_09.jpg new file mode 100644 index 000000000..04ae24ec9 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_09.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1024x1024_10.jpg b/tests/mt-emil/input-resize/picsum_1024x1024_10.jpg new file mode 100644 index 000000000..8a634347d Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1024x1024_10.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_01.jpg b/tests/mt-emil/input-resize/picsum_1280x720_01.jpg new file mode 100644 index 000000000..cd7f22997 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_01.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_02.jpg b/tests/mt-emil/input-resize/picsum_1280x720_02.jpg new file mode 100644 index 000000000..f7405f1b5 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_02.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_03.jpg b/tests/mt-emil/input-resize/picsum_1280x720_03.jpg new file mode 100644 index 000000000..8fded7f2b Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_03.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_04.jpg b/tests/mt-emil/input-resize/picsum_1280x720_04.jpg new file mode 100644 index 000000000..4e373bec7 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_04.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_05.jpg b/tests/mt-emil/input-resize/picsum_1280x720_05.jpg new file mode 100644 index 000000000..1c9945519 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_05.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_06.jpg b/tests/mt-emil/input-resize/picsum_1280x720_06.jpg new file mode 100644 index 000000000..bec0ecf23 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_06.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_07.jpg b/tests/mt-emil/input-resize/picsum_1280x720_07.jpg new file mode 100644 index 000000000..318cd2980 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_07.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_08.jpg b/tests/mt-emil/input-resize/picsum_1280x720_08.jpg new file mode 100644 index 000000000..1b65b42d7 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_08.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_09.jpg b/tests/mt-emil/input-resize/picsum_1280x720_09.jpg new file mode 100644 index 000000000..073484c86 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_09.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_1280x720_10.jpg b/tests/mt-emil/input-resize/picsum_1280x720_10.jpg new file mode 100644 index 000000000..9c88288d6 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_1280x720_10.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_01.jpg b/tests/mt-emil/input-resize/picsum_512x1024_01.jpg new file mode 100644 index 000000000..e81ced476 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_01.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_02.jpg b/tests/mt-emil/input-resize/picsum_512x1024_02.jpg new file mode 100644 index 000000000..212aef172 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_02.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_03.jpg b/tests/mt-emil/input-resize/picsum_512x1024_03.jpg new file mode 100644 index 000000000..8fc820ae1 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_03.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_04.jpg b/tests/mt-emil/input-resize/picsum_512x1024_04.jpg new file mode 100644 index 000000000..d74d05f3f Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_04.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_05.jpg b/tests/mt-emil/input-resize/picsum_512x1024_05.jpg new file mode 100644 index 000000000..7d985f312 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_05.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_06.jpg b/tests/mt-emil/input-resize/picsum_512x1024_06.jpg new file mode 100644 index 000000000..de5d4b611 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_06.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_07.jpg b/tests/mt-emil/input-resize/picsum_512x1024_07.jpg new file mode 100644 index 000000000..057cf84cb Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_07.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_08.jpg b/tests/mt-emil/input-resize/picsum_512x1024_08.jpg new file mode 100644 index 000000000..fe3dab197 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_08.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_09.jpg b/tests/mt-emil/input-resize/picsum_512x1024_09.jpg new file mode 100644 index 000000000..85e432d68 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_09.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x1024_10.jpg b/tests/mt-emil/input-resize/picsum_512x1024_10.jpg new file mode 100644 index 000000000..441f901e4 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x1024_10.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_01.jpg b/tests/mt-emil/input-resize/picsum_512x512_01.jpg new file mode 100644 index 000000000..aaa3c16e6 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_01.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_02.jpg b/tests/mt-emil/input-resize/picsum_512x512_02.jpg new file mode 100644 index 000000000..1192402c8 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_02.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_03.jpg b/tests/mt-emil/input-resize/picsum_512x512_03.jpg new file mode 100644 index 000000000..9272cfc63 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_03.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_04.jpg b/tests/mt-emil/input-resize/picsum_512x512_04.jpg new file mode 100644 index 000000000..35621f9be Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_04.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_05.jpg b/tests/mt-emil/input-resize/picsum_512x512_05.jpg new file mode 100644 index 000000000..910d5fc20 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_05.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_06.jpg b/tests/mt-emil/input-resize/picsum_512x512_06.jpg new file mode 100644 index 000000000..a5fbaa3a5 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_06.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_07.jpg b/tests/mt-emil/input-resize/picsum_512x512_07.jpg new file mode 100644 index 000000000..6c6f4eefb Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_07.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_08.jpg b/tests/mt-emil/input-resize/picsum_512x512_08.jpg new file mode 100644 index 000000000..3b8cf1e60 Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_08.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_09.jpg b/tests/mt-emil/input-resize/picsum_512x512_09.jpg new file mode 100644 index 000000000..184a9853c Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_09.jpg differ diff --git a/tests/mt-emil/input-resize/picsum_512x512_10.jpg b/tests/mt-emil/input-resize/picsum_512x512_10.jpg new file mode 100644 index 000000000..b8e0cdbbd Binary files /dev/null and b/tests/mt-emil/input-resize/picsum_512x512_10.jpg differ diff --git a/tests/mt-emil/latency.gnuplot b/tests/mt-emil/latency.gnuplot new file mode 100644 index 000000000..016f4e214 --- /dev/null +++ b/tests/mt-emil/latency.gnuplot @@ -0,0 +1,79 @@ +reset + +set term jpeg size 1000,500 +set output "latency.jpg" + +#set xlabel "Reservation Utilization %" +#set ylabel "Latency (us)" + +set key left top + +set xrange [-5:] +set yrange [0:] + +set style histogram columnstacked +set key horizontal + +set macros +# Placement of the a,b,c,d labels in the graphs +POS = "at graph 0.05,1.03 font ',10'" + +# x- and ytics for each row resp. column +NOXTICS = "unset xlabel" +# XTICS = "set xlabel 'Load %'" +XTICS = "set xlabel 'All Requests/sec'" +NOYTICS = "unset ylabel" +YTICS = "set ylabel 'Latency (us)'" + +# Margins for each row resp. column +TMARGIN = "set tmargin at screen 0.90; set bmargin at screen 0.55" +BMARGIN = "set tmargin at screen 0.55; set bmargin at screen 0.20" +LMARGIN = "set lmargin at screen 0.15; set rmargin at screen 0.55" +RMARGIN = "set lmargin at screen 0.55; set rmargin at screen 0.95" + +# plot \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:7 title 'Tenant '.t_id.' p99' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:6 title 'Tenant '.t_id.' p90' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:5 title 'Tenant '.t_id.' p50' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:4 title 'Tenant '.t_id.' mean' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:3 title 'Tenant '.t_id.' min' w lp + +### Start multiplot (2x2 layout) +set multiplot layout 2,2 rowsfirst +# --- GRAPH a +set label 1 'p99' @POS +@NOXTICS; @YTICS +#@TMARGIN; @LMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:7 title t_id w lp +# --- GRAPH b +set label 1 'p90' @POS +@NOXTICS; @NOYTICS +#@TMARGIN; @RMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:6 notitle w lp +# --- GRAPH c +set label 1 'p50' @POS +@XTICS; @YTICS +#@BMARGIN; @LMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:5 notitle w lp +# --- GRAPH d +set label 1 'mean' @POS +@XTICS; @NOYTICS +#@BMARGIN; @RMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:4 notitle w lp +unset multiplot +### End multiplot + +# plot \ +# 'latency_A.dat' using 1:7 title 'A p99' lt 1 lc 1 w lp, \ +# 'latency_A.dat' using 1:6 title 'A p90' lt 2 lc 1 w lp, \ +# 'latency_A.dat' using 1:5 title 'A p50' lt 3 lc 1 w lp, \ +# 'latency_A.dat' using 1:4 title 'A mean' lt 4 lc 1 w lp, \ +# 'latency_A.dat' using 1:3 title 'A min' lt 5 lc 1 w lp,\ +# 'latency_B.dat' using 1:7 title 'B p99' lt 1 lc 2 w lp, \ +# 'latency_B.dat' using 1:6 title 'B p90' lt 2 lc 2 w lp, \ +# 'latency_B.dat' using 1:5 title 'B p50' lt 3 lc 2 w lp, \ +# 'latency_B.dat' using 1:4 title 'B mean' lt 4 lc 2 w lp, \ +# 'latency_B.dat' using 1:3 title 'B min' lt 5 lc 2 w lp + +# 'latency_A.dat' using 1:8 title 'A p100' linetype 0 linecolor 1 with linespoints, \ +# 'latency_B.dat' using 1:8 title 'B p100' linetype 0 linecolor 2 with linespoints, \ diff --git a/tests/mt-emil/run.sh b/tests/mt-emil/run.sh new file mode 100755 index 000000000..ecef4a759 --- /dev/null +++ b/tests/mt-emil/run.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=MTDBF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SPINLOOP_PAUSE_ENABLED=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=18 +export SLEDGE_PROC_MHZ=2660 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r ADMIN_ACCESS=false +declare -r CLIENT_TERMINATE_SERVER=false +declare -r DURATION_sec=60 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +declare -ar TENANT_IDS=("cnn" "cifar10" "gocr" "lpd" "resize" "ekf") # "bw") +declare -ar INIT_PORTS=(10000 15000 20000 25000 30000 35000) # 35000 ) +declare -ar ROUTES=("cnn" "cifar10" "gocr" "lpd" "resize" "ekf") # "fib10 fib30 fib36" ) +# declare -ar MTDS_REPL_PERIODS_us=(0 0 0 0 0) +# declare -ar MTDS_MAX_BUDGETS_us=(0 0 0 0 0) +declare -ar MTDBF_RESERVATIONS_p=(10 20 25 10 30 0) + +declare -r NONE="0" #DO NOT CHANGE +declare -r GET_JPEG_RESOLUTION="get_jpeg_resolution.wasm.so" +# Per route configs: +declare -ar WASM_PATHS=("$CNN" "$CIFAR10" "$GOCR" "$LPD" "$RESIZE" "$EKF") # "$FIBONACCI $FIBONACCI $FIBONACCI" ) +declare -ar RESP_CONTENT_TYPES=("text/plain" "text/plain" "text/plain" "text/plain" "image/jpeg" "application/octet-stream") # "text/plain text/plain text/plain" ) +declare -ar EXPECTED_EXEC_TIMES_us=("600000" "4000" "8900" "16700" "62000" "30") # "20 3900 69400" ) # cloudlab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "500" "5000") # "50000 5000 5000" ) # percentage + +# This is needed if you want loadtest to time out for requests that miss their deadlines (timeout = deadline): +declare -gr LOADTEST_REQUEST_TIMEOUT=false + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D" "-D" "-D") +declare -ar ARG_OPTS_LT=("-B" "-B" "-B" "-B" "-B" "-B") # "-P -P -P") +declare -ar ARGS=("input-cnn" "input-cifar10" "input-gocr" "input-lpd-jpg" "input-resize" "input-ekf") # "10 30 36" ) +# declare -ar ARGS=("input-cnn/faces01.jpg" "input-cifar10/airplane1.bmp" "input-gocr/5x8.pnm" "input-lpd-jpg/Cars0.jpg" "input-resize/picsum_512x512_01.jpg" "input-ekf/iter00.dat") # "10 30 36" ) + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=(10 20 25 10 30 2) # "3 100 100" "10") + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +declare -ar VARYING=(0) # no variation, single experiment +# declare -ar VARYING=(10 20 30 40 50 60 70 80 90 100 110 120) + +# Add the word "nuclio" to the end of the client execution command to run for Nuclio mode (stick to the same port and use keep-alive) +[[ "${!#}" = "nuclio" || "${!#}" = "Nuclio" ]] && NUCLIO_MODE_ENABLED=true + +run_init +generate_spec_json +framework_init "$@" + +# Lab server 2100 MHz run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 5400 +# gocr: 11800 +# lpd: 20700 +# resize: 54000 +# ekf: 20 + +# Cloudlab server 2660 MHz run user metrics: +# fib(30): 3885 +# fib(36): 69400 +# cifar10: 4250 4000 +# gocr: 9150 8900 +# lpd: 17800 16700 +# resize: 65000 62000 +# ekf: 20 + +# Emil PC (WSL) run user metrics: +# fib(30): 3000 +# fib(36): 53000 +# cifar10: ? +# resize_small: ? \ No newline at end of file diff --git a/tests/mt-emil/run_ekf.sh b/tests/mt-emil/run_ekf.sh new file mode 100755 index 000000000..31258f72d --- /dev/null +++ b/tests/mt-emil/run_ekf.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=MTDBF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=8 +export SLEDGE_PROC_MHZ=2100 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r CLIENT_TERMINATE_SERVER=false +declare -r DURATION_sec=30 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +declare -ar TENANT_IDS=("ekf") +declare -ar INIT_PORTS=(40000) +declare -ar ROUTES=("ekf") +declare -ar MTDS_REPL_PERIODS_us=(0) +declare -ar MTDS_MAX_BUDGETS_us=(0) +declare -ar MTDBF_RESERVATIONS_p=(0) + +# Per route configs: +declare -ar WASM_PATHS=("$EKF") +declare -ar RESP_CONTENT_TYPES=("application/octet-stream") +declare -ar EXPECTED_EXEC_TIMES_us=("10") # lab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("1000") # percentage + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +# declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D -D") +declare -ar ARG_OPTS_LT=("-B") +declare -ar ARGS=("input-ekf") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=("4.4") + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +# declare -ar VARYING=(0) # no variation, single experiment +declare -ar VARYING=(0) + +run_init +generate_spec_json +framework_init "$@" + +# Lab server run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 5400 +# gocr: 11800 +# lpd: 20700 +# resize: 54000 +# ekf: 20 + +# Emil PC (WSL) run user metrics: +# fib(30): 3000 +# fib(36): 53000 +# cifar10: ? +# resize_small: ? \ No newline at end of file diff --git a/tests/mt-emil/run_fib.sh b/tests/mt-emil/run_fib.sh new file mode 100755 index 000000000..eb3411029 --- /dev/null +++ b/tests/mt-emil/run_fib.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=MTDBF +export SLEDGE_DISABLE_PREEMPTION=false +# export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=18 +export SLEDGE_PROC_MHZ=2660 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +# declare -r CLIENT_TERMINATE_SERVER=true +declare -r DURATION_sec=30 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +declare -ar TENANT_IDS=("fib1" "fib2") +declare -ar INIT_PORTS=(40000 50000) +declare -ar ROUTES=("fib" "fib") +declare -ar MTDS_REPL_PERIODS_us=(0 0) +declare -ar MTDS_MAX_BUDGETS_us=(0 0) +declare -ar MTDBF_RESERVATIONS_p=(50 50) + +# Per route configs: +declare -ar WASM_PATHS=("$FIBONACCI" "$FIBONACCI") +declare -ar RESP_CONTENT_TYPES=("text/plain" "text/plain") +declare -ar EXPECTED_EXEC_TIMES_us=("5000" "5000") # cloudlab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500") # percentage + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +declare -ar ARG_OPTS_HEY=("-d" "-d") +declare -ar ARG_OPTS_LT=("-P" "-P") +declare -ar ARGS=("30" "30") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=("?" "100") # 4.4 for lab server + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +# declare -ar VARYING=(0) # no variation, single experiment +declare -ar VARYING=(10 20 30 40 50 60 70 80 90 100) + +run_init "$@" +generate_spec_json +framework_init "$@" + +# Lab server 2100 MHz run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 5400 +# gocr: 11800 +# lpd: 20700 +# resize: 54000 +# ekf: 20 + +# Cloudlab server 2660 MHz run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 4250 +# gocr: 9150 +# lpd: 17800 +# resize: 65000 +# ekf: 20 + +# Emil PC (WSL) run user metrics: +# fib(30): 3000 +# fib(36): 53000 +# cifar10: ? +# resize_small: ? \ No newline at end of file diff --git a/tests/mt-emil/run_lpd.sh b/tests/mt-emil/run_lpd.sh new file mode 100755 index 000000000..d7b526093 --- /dev/null +++ b/tests/mt-emil/run_lpd.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=MTDBF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=8 +# export SLEDGE_PROC_MHZ=2100 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r CLIENT_TERMINATE_SERVER=true +declare -r DURATION_sec=30 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +declare -ar TENANT_IDS=("sod") +declare -ar INIT_PORTS=(25000) +declare -ar ROUTES=("lpd") +declare -ar MTDS_REPL_PERIODS_us=(0) +declare -ar MTDS_MAX_BUDGETS_us=(0) +declare -ar MTDBF_RESERVATIONS_p=(0) + +# Per route configs: +declare -ar WASM_PATHS=("$LPD") +declare -ar RESP_CONTENT_TYPES=("text/plain") +declare -ar EXPECTED_EXEC_TIMES_us=("16700") +declare -ar DEADLINE_TO_EXEC_RATIOs=("500") # percentage + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +# declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D -D") +declare -ar ARG_OPTS_LT=("-B") +declare -ar ARGS=("input-lpd-jpg") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=("100") + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +# declare -ar VARYING=(0) # no variation, single experiment +declare -ar VARYING=(0) + +run_init +generate_spec_json +framework_init "$@" diff --git a/tests/mt-emil/spec.json b/tests/mt-emil/spec.json new file mode 100644 index 000000000..71533563d --- /dev/null +++ b/tests/mt-emil/spec.json @@ -0,0 +1,44 @@ +[ + { + "name": "Admin", + "port": 55555, + "replenishment-period-us": 0, + "max-budget-us": 0, + "reservation-percentile": 0, + "routes": [ + { + "route": "/admin", + "path": "fibonacci.wasm.so", + "admissions-percentile": 50, + "expected-execution-us": 1000, + "relative-deadline-us": 10000, + "http-resp-content-type": "text/plain" + }, + { + "route": "/terminator", + "path": "fibonacci.wasm.so", + "admissions-percentile": 50, + "expected-execution-us": 1000, + "relative-deadline-us": 10000, + "http-resp-content-type": "text/plain" + } + ] + }, + { + "name": "cifar10-000", + "port": 15000, + "replenishment-period-us": 0, + "max-budget-us": 0, + "reservation-percentile": 20, + "routes": [ + { + "route": "/cifar10", + "path": "cifar10.wasm.so", + "admissions-percentile": 60, + "expected-execution-us": 4000, + "relative-deadline-us": 20000, + "http-resp-content-type": "text/plain" + } + ] + } +] diff --git a/tests/mt-emil/success.gnuplot b/tests/mt-emil/success.gnuplot new file mode 100644 index 000000000..fa85d8733 --- /dev/null +++ b/tests/mt-emil/success.gnuplot @@ -0,0 +1,17 @@ +reset + +set term jpeg +set output "success.jpg" + +#set xlabel "Reservation Utilization %" +#set xlabel "Load %" +set xlabel "Requests/sec" +set ylabel "Deadline success rate %" + +set xrange [-5:] +set yrange [0:110] + +plot for [t_id in tenant_ids] 'success_'.t_id.'.dat' using 1:2 title t_id w lp + +#plot 'success_A.dat' using 1:2 title 'Tenant A success rate' linetype 1 linecolor 1 with linespoints,\ +# 'success_B.dat' using 1:2 title 'Tenant B success rate' lt 2 lc 2 w lp diff --git a/tests/mt-emil/template.json b/tests/mt-emil/template.json new file mode 100644 index 000000000..9f021dbda --- /dev/null +++ b/tests/mt-emil/template.json @@ -0,0 +1,14 @@ +{ + "name": "tenant", + "port": 0, + "reservation-percentile": 0, + "routes": [ + { + "route": "/route", + "path": "fibonacci.wasm.so", + "admissions-percentile": 60, + "relative-deadline-us": 1, + "http-resp-content-type": "text/plain" + } + ] +} diff --git a/tests/mt-emil/throughput.gnuplot b/tests/mt-emil/throughput.gnuplot new file mode 100644 index 000000000..fdb345dcd --- /dev/null +++ b/tests/mt-emil/throughput.gnuplot @@ -0,0 +1,17 @@ +reset + +set term jpeg +set output "throughput.jpg" + +#set xlabel "Reservation Utilization %" +#set xlabel "Load %" +set xlabel "All Requests/sec" +set ylabel "Successful Requests/sec" + +set xrange [0:] +set yrange [0:] + +plot for [t_id in tenant_ids] 'throughput_'.t_id.'.dat' using 1:2 title t_id w lp + +#plot 'throughput_A.dat' using 1:2 title 'Tenant A Throughput' linetype 1 linecolor 1 with linespoints,\ +# 'throughput_B.dat' using 1:2 title 'Tenant B Throughput' linetype 2 linecolor 2 with linespoints diff --git a/tests/mt-juan/.gitignore b/tests/mt-juan/.gitignore new file mode 100644 index 000000000..9031e6fc9 --- /dev/null +++ b/tests/mt-juan/.gitignore @@ -0,0 +1,2 @@ +out.png +input* \ No newline at end of file diff --git a/tests/mt-juan/Makefile b/tests/mt-juan/Makefile new file mode 100644 index 000000000..226024b56 --- /dev/null +++ b/tests/mt-juan/Makefile @@ -0,0 +1,102 @@ +SLEDGE_BINARY_DIR=../../runtime/bin +HOST?=localhost # pass arguments to change this: make client-lpd HOST=10.10.1.4 +# HOST=arena0.andrew.cmu.edu +# HOST=c220g2-011017.wisc.cloudlab.us +PORT0=10000 +PORT1=15000 +PORT2=20000 +PORT3=25000 +PORT4=30000 +PORT5=35000 +PORT6=40000 +HEY_OPTS=-disable-compression -disable-keepalive -disable-redirects + +default: run + +clean: + rm -rf res/* + +run: + SLEDGE_SIGALRM_HANDLER=TRIAGED SLEDGE_SCHEDULER=MTDBF SLEDGE_SPINLOOP_PAUSE_ENABLED=true SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log SLEDGE_SANDBOX_PERF_LOG=perf.log LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} ${SLEDGE_BINARY_DIR}/sledgert spec.json + +debug: + SLEDGE_SCHEDULER=MTDBF SLEDGE_SPINLOOP_PAUSE_ENABLED=false SLEDGE_NWORKERS=18 LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} gdb ${SLEDGE_BINARY_DIR}/sledgert \ + --eval-command="handle SIGUSR1 noprint nostop" \ + --eval-command="handle SIGPIPE noprint nostop" \ + --eval-command="set pagination off" \ + --eval-command="set print pretty" \ + --eval-command="run spec.json" + +valgrind: + SLEDGE_DISABLE_PREEMPTION=true SLEDGE_NWORKERS=1 LD_LIBRARY_PATH=${SLEDGE_BINARY_DIR} valgrind --leak-check=full --max-stackframe=11150456 --run-libc-freeres=no --run-cxx-freeres=no ${SLEDGE_BINARY_DIR}/sledgert spec.json + + +client-cnn: + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-cnn/faces01.jpg" "${HOST}:${PORT0}/cnn" + +client-cifar10: + curl -H 'Expect: ' -H "Content-Type: image/bmp" --data-binary "@input-cifar10/airplane1.bmp" "${HOST}:${PORT1}/cifar10" + +client-gocr: + curl -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@input-gocr/5x8.pnm" "${HOST}:${PORT2}/gocr" + +client-lpd: +# curl -H 'Expect: ' -H "Content-Type: image/png" --data-binary "@input-lpd-png/Cars0.png" "${HOST}:${PORT3}/lpd" + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-lpd-jpg/Cars0.jpg" "${HOST}:${PORT3}/lpd" + +client-resize: + curl -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@input-resize/1_64x128.jpg" "${HOST}:${PORT4}/resize" --output "out-resize.jpg" + +client-ekf: + curl -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@input-ekf/iter00.dat" "${HOST}:${PORT5}/ekf" --output "out-ekf-iter00.dat" + +client-fib-curl: + curl -i -H 'Expect: ' -H "Content-Type: text/plain" "${HOST}:${PORT6}/fib?30" + +########################################## Choose a random file to send with curl: ########################################## +client-cnn-random: + @dir="input-cnn"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT0}/cnn" + +client-cifar10-random: + @dir="input-cifar10"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/bmp" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT1}/cifar10" + +client-gocr-random: + @dir="input-gocr"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT2}/gocr" + +client-lpd-random: +# @dir="input-lpd-png"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ +# curl -s -H 'Expect: ' -H "Content-Type: image/png" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT3}/lpd" + @dir="input-lpd-jpg"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT3}/lpd" + +client-resize-random: + @dir="input-resize"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: image/jpeg" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT4}/resize" --output "out-resize-$$random_file" + +client-ekf-random: + @dir="input-ekf"; random_file="$$(ls $$dir | shuf -n 1)"; echo "Random file: $$random_file"; \ + curl -s -H 'Expect: ' -H "Content-Type: application/octet-stream" --data-binary "@$$dir/$$random_file" "${HOST}:${PORT5}/ekf" --output "out-ekf-$$random_file" +############################################################################################################################# + +client-fib-once: + echo 30 | http ${HOST}:${PORT6}/fib +# http ${HOST}:${PORT6}/fib?30 + +client-fib-loadtest: + loadtest -n 10 -c 10 -P 30 "http://${HOST}:${PORT6}/fib" + +client-fib-hey: + hey ${HEY_OPTS} -z 10s -c 72 -t 0 -o csv -m POST -d "30\n" "http://${HOST}:${PORT6}/fib" + +client-fib-wrk: + wrk -t 1 -c 1 -d 5s -R 1 "http://${HOST}:${PORT6}/fib?30" + + +client-admin: + echo 5 | http ${HOST}:55555/admin + +client-terminator: + echo 5 | http ${HOST}:55555/terminator diff --git a/tests/mt-juan/gocr_generate_dataset.sh b/tests/mt-juan/gocr_generate_dataset.sh new file mode 100755 index 000000000..290394d5f --- /dev/null +++ b/tests/mt-juan/gocr_generate_dataset.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +VARYING=(72 108 144) + +for var in "${VARYING[@]}"; do + mkdir -p "$var"dpi + mkdir -p "$var"dpi-orig + for ((i=5; i<=15; i++)); do + shuf -n10 /usr/share/dict/american-english > "$var"dpi-orig/"$i"words.txt + pango-view --dpi="$var" --font=mono -qo "$var"dpi-orig/"$var"dpi_"$i"words.png "$var"dpi-orig/"$i"words.txt + pngtopnm "$var"dpi-orig/"$var"dpi_"$i"words.png > "$var"dpi/"$var"dpi_"$i"words.pnm + done +done \ No newline at end of file diff --git a/tests/mt-juan/latency.gnuplot b/tests/mt-juan/latency.gnuplot new file mode 100644 index 000000000..016f4e214 --- /dev/null +++ b/tests/mt-juan/latency.gnuplot @@ -0,0 +1,79 @@ +reset + +set term jpeg size 1000,500 +set output "latency.jpg" + +#set xlabel "Reservation Utilization %" +#set ylabel "Latency (us)" + +set key left top + +set xrange [-5:] +set yrange [0:] + +set style histogram columnstacked +set key horizontal + +set macros +# Placement of the a,b,c,d labels in the graphs +POS = "at graph 0.05,1.03 font ',10'" + +# x- and ytics for each row resp. column +NOXTICS = "unset xlabel" +# XTICS = "set xlabel 'Load %'" +XTICS = "set xlabel 'All Requests/sec'" +NOYTICS = "unset ylabel" +YTICS = "set ylabel 'Latency (us)'" + +# Margins for each row resp. column +TMARGIN = "set tmargin at screen 0.90; set bmargin at screen 0.55" +BMARGIN = "set tmargin at screen 0.55; set bmargin at screen 0.20" +LMARGIN = "set lmargin at screen 0.15; set rmargin at screen 0.55" +RMARGIN = "set lmargin at screen 0.55; set rmargin at screen 0.95" + +# plot \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:7 title 'Tenant '.t_id.' p99' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:6 title 'Tenant '.t_id.' p90' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:5 title 'Tenant '.t_id.' p50' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:4 title 'Tenant '.t_id.' mean' w lp, \ +# for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:3 title 'Tenant '.t_id.' min' w lp + +### Start multiplot (2x2 layout) +set multiplot layout 2,2 rowsfirst +# --- GRAPH a +set label 1 'p99' @POS +@NOXTICS; @YTICS +#@TMARGIN; @LMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:7 title t_id w lp +# --- GRAPH b +set label 1 'p90' @POS +@NOXTICS; @NOYTICS +#@TMARGIN; @RMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:6 notitle w lp +# --- GRAPH c +set label 1 'p50' @POS +@XTICS; @YTICS +#@BMARGIN; @LMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:5 notitle w lp +# --- GRAPH d +set label 1 'mean' @POS +@XTICS; @NOYTICS +#@BMARGIN; @RMARGIN +plot for [t_id in tenant_ids] 'latency_'.t_id.'.dat' using 1:4 notitle w lp +unset multiplot +### End multiplot + +# plot \ +# 'latency_A.dat' using 1:7 title 'A p99' lt 1 lc 1 w lp, \ +# 'latency_A.dat' using 1:6 title 'A p90' lt 2 lc 1 w lp, \ +# 'latency_A.dat' using 1:5 title 'A p50' lt 3 lc 1 w lp, \ +# 'latency_A.dat' using 1:4 title 'A mean' lt 4 lc 1 w lp, \ +# 'latency_A.dat' using 1:3 title 'A min' lt 5 lc 1 w lp,\ +# 'latency_B.dat' using 1:7 title 'B p99' lt 1 lc 2 w lp, \ +# 'latency_B.dat' using 1:6 title 'B p90' lt 2 lc 2 w lp, \ +# 'latency_B.dat' using 1:5 title 'B p50' lt 3 lc 2 w lp, \ +# 'latency_B.dat' using 1:4 title 'B mean' lt 4 lc 2 w lp, \ +# 'latency_B.dat' using 1:3 title 'B min' lt 5 lc 2 w lp + +# 'latency_A.dat' using 1:8 title 'A p100' linetype 0 linecolor 1 with linespoints, \ +# 'latency_B.dat' using 1:8 title 'B p100' linetype 0 linecolor 2 with linespoints, \ diff --git a/tests/mt-juan/run.sh b/tests/mt-juan/run.sh new file mode 100755 index 000000000..8c897064a --- /dev/null +++ b/tests/mt-juan/run.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=SJF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SPINLOOP_PAUSE_ENABLED=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=18 +export SLEDGE_PROC_MHZ=2660 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r ADMIN_ACCESS=false +declare -r CLIENT_TERMINATE_SERVER=false +declare -r DURATION_sec=60 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +declare -ar TENANT_IDS=("cifar10" "gocr" "lpd" "resize" "ekf") +declare -ar INIT_PORTS=(15000 20000 25000 30000 35000) +declare -ar ROUTES=("cifar10" "gocr" "lpd" "resize" "ekf") + + +declare -r NONE="0" #DO NOT CHANGE +declare -r GET_JPEG_RESOLUTION="get_jpeg_resolution.wasm.so" + +# Per route configs: +declare -ar WASM_PATHS=("$CIFAR10" "$GOCR" "$LPD" "$RESIZE" "$EKF") +declare -ar WASM_PATHS_PREPROCESSING=("$NONE" "$GET_JPEG_RESOLUTION" "$GET_JPEG_RESOLUTION" "$GET_JPEG_RESOLUTION" "$NONE") # "$NONE $NONE $NONE" $GET_JPEG_RESOLUTION +declare -ar RESP_CONTENT_TYPES=("text/plain" "text/plain" "text/plain" "image/jpeg" "application/octet-stream") +declare -ar EXPECTED_EXEC_TIMES_us=("4000" "8900" "16700" "62000" "30") # cloudlab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "5000") # percentage + +# Regressions Model input: +declare -ar MODEL_BIASES=("1500") +declare -ar MODEL_SCALES=("3400") +declare -ar MODEL_NUM_OF_PARAMS=("2") +declare -ar MODEL_BETA1S=("5476") +declare -ar MODEL_BETA2S=("8379") + +# This is needed if you want loadtest to time out for requests that miss their deadlines (timeout = deadline): +declare -gr LOADTEST_REQUEST_TIMEOUT=false + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D" "-D") +declare -ar ARG_OPTS_LT=("-B" "-B" "-B" "-B" "-B") # "-P -P -P") +declare -ar ARGS=("input-cifar10" "input-gocr" "input-lpd-jpg" "input-resize" "input-ekf") # "10 30 36" "input-cnn") +# declare -ar ARGS=("input-cifar10/airplane1.bmp" "input-gocr/5x8.pnm" "input-lpd-jpg/Cars0.jpg" "input-resize/picsum_512x512_01.jpg" "input-ekf/iter00.dat") # "10 30 36" "input-cnn/faces01.jpg") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=(30 30 10 30 2) + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +declare -ar VARYING=(0) # no variation, single experiment +# declare -ar VARYING=(10 20 30 40 50 60 70 80 90 100 110 120) + +# Add the word "nuclio" to the end of the client execution command to run for Nuclio mode (stick to the same port and use keep-alive) +[[ "${!#}" = "nuclio" || "${!#}" = "Nuclio" ]] && NUCLIO_MODE_ENABLED=true + +run_init +generate_spec_json +framework_init "$@" \ No newline at end of file diff --git a/tests/mt-juan/run_big.sh b/tests/mt-juan/run_big.sh new file mode 100755 index 000000000..fb018e33f --- /dev/null +++ b/tests/mt-juan/run_big.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=EDF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SPINLOOP_PAUSE_ENABLED=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=1 +export SLEDGE_PROC_MHZ=2660 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r CLIENT_TERMINATE_SERVER=false +declare -r DURATION_sec=30 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +# declare -ar TENANT_IDS=("cifar10" "gocr" "lpd" "resize" "ekf") # "bw" "cnn") +# declare -ar INIT_PORTS=(15000 20000 25000 30000 35000) # 35000 10000) +# declare -ar ROUTES=("cifar10" "gocr" "lpd" "resize" "ekf") # "fib10 fib30 fib36" "cnn") +declare -ar TENANT_IDS=("resize" ) # "bw" "cnn") +declare -ar INIT_PORTS=( 30000 35000) # 35000 10000) +declare -ar ROUTES=( "resize" "ekf") # "fib10 fib30 fib36" "cnn") +declare -ar MTDS_REPL_PERIODS_us=(0 0 0 0 0) +declare -ar MTDS_MAX_BUDGETS_us=(0 0 0 0 0) +declare -ar MTDBF_RESERVATIONS_p=(20 30 10 30 0) + +# Per route configs: +# declare -ar WASM_PATHS=("$CIFAR10" "$GOCR" "$LPD" "$RESIZE" "$EKF") # "$FIBONACCI $FIBONACCI $FIBONACCI" "$CNN") +# declare -ar RESP_CONTENT_TYPES=("text/plain" "text/plain" "text/plain" "image/jpeg" "application/octet-stream") # "text/plain text/plain text/plain" "text/plain") +# declare -ar EXPECTED_EXEC_TIMES_us=("4000" "8900" "16700" "62000" "30") # "20 3900 69400" "600000") # cloudlab server +# declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "5000") # "50000 5000 5000" "500") # percentage +declare -ar WASM_PATHS=("$RESIZE" "$EKF") # "$FIBONACCI $FIBONACCI $FIBONACCI" "$CNN") +declare -ar RESP_CONTENT_TYPES=("image/jpeg" "application/octet-stream") # "text/plain text/plain text/plain" "text/plain") +declare -ar EXPECTED_EXEC_TIMES_us=( "88578" "30") # "20 3900 69400" "600000") # cloudlab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "5000") # "50000 5000 5000" "500") # percentage + +# This is needed if you want loadtest to time out for requests that miss their deadlines (timeout = deadline): +declare -gr LOADTEST_REQUEST_TIMEOUT=false + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D" "-D") +declare -ar ARG_OPTS_LT=("-b" "-B" "-B" "-B" "-B") # "-P -P -P") +# declare -ar ARGS=("input-cifar10" "input-gocr" "input-lpd-jpg" "input-resize" "input-ekf") # "10 30 36" "input-cnn") +declare -ar ARGS=("input-resize-two/113_1024x1024.jpg" "input-ekf") # "10 30 36" "input-cnn") +# declare -ar ARGS=("input-cifar10/airplane1.bmp" "input-gocr/5x8.pnm" "input-lpd-jpg/Cars0.jpg" "input-resize/picsum_512x512_01.jpg" "input-ekf/iter00.dat") # "10 30 36" "input-cnn/faces01.jpg") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=(? 30 10 30 2) # "3 100 100" "10") # 4.4 for lab server + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +# declare -ar VARYING=(0) # no variation, single experiment +declare -ar VARYING=(10 15 20 25 30 35 40 45 50 55 60 65 70) + +# Add the word "nuclio" to the end of the client execution command to run for Nuclio mode (stick to the same port and use keep-alive) +[[ "${!#}" = "nuclio" || "${!#}" = "Nuclio" ]] && NUCLIO_MODE_ENABLED=true + +run_init +generate_spec_json +framework_init "$@" + +# Lab server 2100 MHz run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 5400 +# gocr: 11800 +# lpd: 20700 +# resize: 54000 +# ekf: 20 + +# Cloudlab server 2660 MHz run user metrics: +# fib(30): 3885 +# fib(36): 69400 +# cifar10: 4250 4000 +# gocr: 9150 8900 +# lpd: 17800 16700 +# resize: 65000 62000 +# ekf: 20 + +# Emil PC (WSL) run user metrics: +# fib(30): 3000 +# fib(36): 53000 +# cifar10: ? +# resize_small: ? \ No newline at end of file diff --git a/tests/mt-juan/run_small.sh b/tests/mt-juan/run_small.sh new file mode 100755 index 000000000..95ad67e99 --- /dev/null +++ b/tests/mt-juan/run_small.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +# shellcheck disable=SC1091,SC2034,SC2155 +source ../bash_libraries/multi_tenancy_base.sh || exit 1 + +# Configure SERVER parameters: (this is to skip the .env config file) +export SLEDGE_SCHEDULER=EDF +export SLEDGE_DISABLE_PREEMPTION=false +export SLEDGE_SPINLOOP_PAUSE_ENABLED=false +export SLEDGE_SANDBOX_PERF_LOG=perf.log +# export SLEDGE_HTTP_SESSION_PERF_LOG=http_perf.log +export SLEDGE_NWORKERS=1 +export SLEDGE_PROC_MHZ=2660 +export EXTRA_EXEC_PERCENTILE=10 + +# To reduce post processing time, provide local-only meaningful metrics: +# Comment it in order to use ALL the metrics! +declare -a SANDBOX_METRICS=(total running_sys running_user) + +# The global configs for the scripts +declare -r CLIENT_TERMINATE_SERVER=false +declare -r DURATION_sec=30 +declare -r ESTIMATIONS_PERCENTILE=60 +declare -r NWORKERS=${SLEDGE_NWORKERS:-1} + +# Tenant configs: +# declare -ar TENANT_IDS=("cifar10" "gocr" "lpd" "resize" "ekf") # "bw" "cnn") +# declare -ar INIT_PORTS=(15000 20000 25000 30000 35000) # 35000 10000) +# declare -ar ROUTES=("cifar10" "gocr" "lpd" "resize" "ekf") # "fib10 fib30 fib36" "cnn") +declare -ar TENANT_IDS=("resize" ) # "bw" "cnn") +declare -ar INIT_PORTS=( 30000 35000) # 35000 10000) +declare -ar ROUTES=( "resize" "ekf") # "fib10 fib30 fib36" "cnn") +declare -ar MTDS_REPL_PERIODS_us=(0 0 0 0 0) +declare -ar MTDS_MAX_BUDGETS_us=(0 0 0 0 0) +declare -ar MTDBF_RESERVATIONS_p=(20 30 10 30 0) + +# Per route configs: +# declare -ar WASM_PATHS=("$CIFAR10" "$GOCR" "$LPD" "$RESIZE" "$EKF") # "$FIBONACCI $FIBONACCI $FIBONACCI" "$CNN") +# declare -ar RESP_CONTENT_TYPES=("text/plain" "text/plain" "text/plain" "image/jpeg" "application/octet-stream") # "text/plain text/plain text/plain" "text/plain") +# declare -ar EXPECTED_EXEC_TIMES_us=("4000" "8900" "16700" "62000" "30") # "20 3900 69400" "600000") # cloudlab server +# declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "5000") # "50000 5000 5000" "500") # percentage +declare -ar WASM_PATHS=("$RESIZE" "$EKF") # "$FIBONACCI $FIBONACCI $FIBONACCI" "$CNN") +declare -ar RESP_CONTENT_TYPES=("image/jpeg" "application/octet-stream") # "text/plain text/plain text/plain" "text/plain") +declare -ar EXPECTED_EXEC_TIMES_us=( "319" "30") # "20 3900 69400" "600000") # cloudlab server +declare -ar DEADLINE_TO_EXEC_RATIOs=("500" "500" "500" "500" "5000") # "50000 5000 5000" "500") # percentage + +# This is needed if you want loadtest to time out for requests that miss their deadlines (timeout = deadline): +declare -gr LOADTEST_REQUEST_TIMEOUT=false + +# For HEY -d is text, -D is file input. For LoadTest -P is text, -b is file input. +# ALso, LoadTest now supports -B for random file in the folder. HEY supports a single file. +declare -ar ARG_OPTS_HEY=("-D" "-D" "-D" "-D" "-D") +declare -ar ARG_OPTS_LT=("-b" "-B" "-B" "-B" "-B") # "-P -P -P") +# declare -ar ARGS=("input-cifar10" "input-gocr" "input-lpd-jpg" "input-resize" "input-ekf") # "10 30 36" "input-cnn") +declare -ar ARGS=("input-resize-two/536_64x64.jpg" "input-ekf") # "10 30 36" "input-cnn") +# declare -ar ARGS=("input-cifar10/airplane1.bmp" "input-gocr/5x8.pnm" "input-lpd-jpg/Cars0.jpg" "input-resize/picsum_512x512_01.jpg" "input-ekf/iter00.dat") # "10 30 36" "input-cnn/faces01.jpg") + +# This is needed if you want loadtest to log the randomly chosen filenames +declare -gr LOADTEST_LOG_RANDOM=false + +# 100=FULL load, 50=HALF load ... +declare -ar LOADS=(? 30 10 30 2) # "3 100 100" "10") # 4.4 for lab server + +# When trying varying values, you must set ONE value from the above params to ? (question mark) +# For example, for varying the loads, try: LOADS=("50 ?" "100") +# declare -ar VARYING=(0) # no variation, single experiment +declare -ar VARYING=(10 15 20 25 30 35 40 45 50 55 60 65 70) + +# Add the word "nuclio" to the end of the client execution command to run for Nuclio mode (stick to the same port and use keep-alive) +[[ "${!#}" = "nuclio" || "${!#}" = "Nuclio" ]] && NUCLIO_MODE_ENABLED=true + +run_init +generate_spec_json +framework_init "$@" + +# Lab server 2100 MHz run user metrics: +# fib(30): 5500 +# fib(36): 98000 +# cifar10: 5400 +# gocr: 11800 +# lpd: 20700 +# resize: 54000 +# ekf: 20 + +# Cloudlab server 2660 MHz run user metrics: +# fib(30): 3885 +# fib(36): 69400 +# cifar10: 4250 4000 +# gocr: 9150 8900 +# lpd: 17800 16700 +# resize: 65000 62000 +# ekf: 20 + +# Emil PC (WSL) run user metrics: +# fib(30): 3000 +# fib(36): 53000 +# cifar10: ? +# resize_small: ? \ No newline at end of file diff --git a/tests/mt-juan/spec.json b/tests/mt-juan/spec.json new file mode 100644 index 000000000..ef77f95af --- /dev/null +++ b/tests/mt-juan/spec.json @@ -0,0 +1,62 @@ +[ + { + "name": "Admin", + "port": 55555, + "replenishment-period-us": 0, + "max-budget-us": 0, + "reservation-percentile": 0, + "routes": [ + { + "route": "/admin", + "path": "fibonacci.wasm.so", + "path_premodule": "get_jpeg_resolution.wasm.so", + "model-bias": 0, + "model-scale": 0, + "model-num-of-param": 0, + "model-beta1": 0, + "model-beta2": 0, + "admissions-percentile": 60, + "expected-execution-us": 1000, + "relative-deadline-us": 5000, + "http-resp-content-type": "text/plain" + }, + { + "route": "/terminator", + "path": "fibonacci.wasm.so", + "path_premodule": "get_jpeg_resolution.wasm.so", + "model-bias": 0, + "model-scale": 0, + "model-num-of-param": 0, + "model-beta1": 0, + "model-beta2": 0, + "admissions-percentile": 60, + "expected-execution-us": 1000, + "relative-deadline-us": 5000, + "http-resp-content-type": "text/plain" + } + ] + }, + { + "name": "resize-000", + "port": 30000, + "replenishment-period-us": 0, + "max-budget-us": 0, + "reservation-percentile": 20, + "routes": [ + { + "route": "/resize", + "path": "resize_image.wasm.so", + "path_premodule": "get_jpeg_resolution.wasm.so", + "model-bias": 1500, + "model-scale": 3400, + "model-num-of-param": 2, + "model-beta1": 5476, + "model-beta2": 8379, + "admissions-percentile": 60, + "expected-execution-us": 62000, + "relative-deadline-us": 310000, + "http-resp-content-type": "image/jpeg" + } + ] + } +] diff --git a/tests/mt-juan/success.gnuplot b/tests/mt-juan/success.gnuplot new file mode 100644 index 000000000..fa85d8733 --- /dev/null +++ b/tests/mt-juan/success.gnuplot @@ -0,0 +1,17 @@ +reset + +set term jpeg +set output "success.jpg" + +#set xlabel "Reservation Utilization %" +#set xlabel "Load %" +set xlabel "Requests/sec" +set ylabel "Deadline success rate %" + +set xrange [-5:] +set yrange [0:110] + +plot for [t_id in tenant_ids] 'success_'.t_id.'.dat' using 1:2 title t_id w lp + +#plot 'success_A.dat' using 1:2 title 'Tenant A success rate' linetype 1 linecolor 1 with linespoints,\ +# 'success_B.dat' using 1:2 title 'Tenant B success rate' lt 2 lc 2 w lp diff --git a/tests/mt-juan/template.json b/tests/mt-juan/template.json new file mode 100644 index 000000000..dfaab10a8 --- /dev/null +++ b/tests/mt-juan/template.json @@ -0,0 +1,13 @@ +{ + "name": "tenant", + "port": 0, + "routes": [ + { + "route": "/route", + "path": "fibonacci.wasm.so", + "admissions-percentile": 60, + "relative-deadline-us": 1, + "http-resp-content-type": "text/plain" + } + ] +} diff --git a/tests/mt-juan/template.json.bak b/tests/mt-juan/template.json.bak new file mode 100644 index 000000000..b99cb5f6c --- /dev/null +++ b/tests/mt-juan/template.json.bak @@ -0,0 +1,21 @@ +{ + "name": "tenant", + "port": 0, + "replenishment-period-us": 0, + "max-budget-us": 0, + "routes": [ + { + "route": "/route", + "path": "fibonacci.wasm.so", + "path_premodule": "get_jpeg_resolution.wasm.so", + "model-bias": 0, + "model-scale": 0, + "model-num-of-param": 0, + "model-beta1": 0, + "model-beta2": 0, + "admissions-percentile": 60, + "relative-deadline-us": 5000, + "http-resp-content-type": "text/plain" + } + ] +} diff --git a/tests/mt-juan/throughput.gnuplot b/tests/mt-juan/throughput.gnuplot new file mode 100644 index 000000000..fdb345dcd --- /dev/null +++ b/tests/mt-juan/throughput.gnuplot @@ -0,0 +1,17 @@ +reset + +set term jpeg +set output "throughput.jpg" + +#set xlabel "Reservation Utilization %" +#set xlabel "Load %" +set xlabel "All Requests/sec" +set ylabel "Successful Requests/sec" + +set xrange [0:] +set yrange [0:] + +plot for [t_id in tenant_ids] 'throughput_'.t_id.'.dat' using 1:2 title t_id w lp + +#plot 'throughput_A.dat' using 1:2 title 'Tenant A Throughput' linetype 1 linecolor 1 with linespoints,\ +# 'throughput_B.dat' using 1:2 title 'Tenant B Throughput' linetype 2 linecolor 2 with linespoints