diff --git a/cutils.c b/cutils.c index a9efdcbd6..5ad14eba8 100644 --- a/cutils.c +++ b/cutils.c @@ -35,6 +35,9 @@ #include #include // _beginthread #endif +#if defined(__APPLE__) +#include +#endif #include "cutils.h" @@ -1201,6 +1204,109 @@ int64_t js__gettimeofday_us(void) { return ((int64_t)tv.tv_sec * 1000000) + tv.tv_usec; } +#if defined(_WIN32) +int js_exepath(char *buffer, size_t *size_ptr) { + int utf8_len, utf16_buffer_len, utf16_len; + WCHAR* utf16_buffer; + + if (buffer == NULL || size_ptr == NULL || *size_ptr == 0) + return -1; + + if (*size_ptr > 32768) { + /* Windows paths can never be longer than this. */ + utf16_buffer_len = 32768; + } else { + utf16_buffer_len = (int)*size_ptr; + } + + utf16_buffer = malloc(sizeof(WCHAR) * utf16_buffer_len); + if (!utf16_buffer) + return -1; + + /* Get the path as UTF-16. */ + utf16_len = GetModuleFileNameW(NULL, utf16_buffer, utf16_buffer_len); + if (utf16_len <= 0) + goto error; + + /* Convert to UTF-8 */ + utf8_len = WideCharToMultiByte(CP_UTF8, + 0, + utf16_buffer, + -1, + buffer, + (int)*size_ptr, + NULL, + NULL); + if (utf8_len == 0) + goto error; + + free(utf16_buffer); + + /* utf8_len *does* include the terminating null at this point, but the + * returned size shouldn't. */ + *size_ptr = utf8_len - 1; + return 0; + +error: + free(utf16_buffer); + return -1; +} +#elif defined(__APPLE__) +int js_exepath(char *buffer, size_t *size) { + /* realpath(exepath) may be > PATH_MAX so double it to be on the safe side. */ + char abspath[PATH_MAX * 2 + 1]; + char exepath[PATH_MAX + 1]; + uint32_t exepath_size; + size_t abspath_size; + + if (buffer == NULL || size == NULL || *size == 0) + return -1; + + exepath_size = sizeof(exepath); + if (_NSGetExecutablePath(exepath, &exepath_size)) + return -1; + + if (realpath(exepath, abspath) != abspath) + return -1; + + abspath_size = strlen(abspath); + if (abspath_size == 0) + return -1; + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; +} +#elif defined(__linux__) +int js_exepath(char *buffer, size_t *size) { + ssize_t n; + + if (buffer == NULL || size == NULL || *size == 0) + return -1; + + n = *size - 1; + if (n > 0) + n = readlink("/proc/self/exe", buffer, n); + + if (n == -1) + return n; + + buffer[n] = '\0'; + *size = n; + + return 0; +} +#else +int js_exepath(char* buffer, size_t* size_ptr) { + return -1; +} +#endif + /*--- Cross-platform threading APIs. ----*/ #if JS_HAVE_THREADS diff --git a/cutils.h b/cutils.h index 512d3463e..f2eb44402 100644 --- a/cutils.h +++ b/cutils.h @@ -54,6 +54,10 @@ extern "C" { #include #include #endif +#if !defined(_WIN32) +#include +#include +#endif #if defined(_MSC_VER) && !defined(__clang__) # define likely(x) (x) @@ -118,6 +122,14 @@ extern "C" { #endif #endif +#if defined(PATH_MAX) +# define JS__PATH_MAX PATH_MAX +#elif defined(_WIN32) +# define JS__PATH_MAX 32767 +#else +# define JS__PATH_MAX 8192 +#endif + void js__pstrcpy(char *buf, int buf_size, const char *str); char *js__pstrcat(char *buf, int buf_size, const char *s); int js__strstart(const char *str, const char *val, const char **ptr); @@ -581,6 +593,8 @@ static inline size_t js__malloc_usable_size(const void *ptr) #endif } +int js_exepath(char* buffer, size_t* size); + /* Cross-platform threading APIs. */ #if defined(EMSCRIPTEN) || defined(__wasi__) diff --git a/docs/docs/stdlib.md b/docs/docs/stdlib.md index 74dc98439..161240e40 100644 --- a/docs/docs/stdlib.md +++ b/docs/docs/stdlib.md @@ -143,6 +143,10 @@ pathname of `path` and `err` the error code. Return `[str, err]` where `str` is the current working directory and `err` the error code. +### `exePath()` + +Returns the full path of the current executable or `undefined` if not available / supported. + ### `chdir(path)` Change the current directory. Return 0 if OK or `-errno`. diff --git a/gen/standalone.c b/gen/standalone.c index e6f951e7d..73555339a 100644 --- a/gen/standalone.c +++ b/gen/standalone.c @@ -2,10 +2,10 @@ #include -const uint32_t qjsc_standalone_size = 2466; +const uint32_t qjsc_standalone_size = 2511; -const uint8_t qjsc_standalone[2466] = { - 0x14, 0x4d, 0x01, 0x1a, 0x73, 0x74, 0x61, 0x6e, +const uint8_t qjsc_standalone[2511] = { + 0x14, 0x4e, 0x01, 0x1a, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x2e, 0x6a, 0x73, 0x01, 0x0e, 0x71, 0x6a, 0x73, 0x3a, 0x73, 0x74, 0x64, 0x01, 0x0c, 0x71, 0x6a, 0x73, 0x3a, @@ -64,255 +64,260 @@ const uint8_t qjsc_standalone[2466] = { 0x6e, 0x6c, 0x79, 0x01, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x01, 0x0a, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x01, 0x0a, 0x61, 0x72, 0x67, 0x76, - 0x30, 0x01, 0x0c, 0x62, 0x69, 0x6e, 0x61, 0x72, - 0x79, 0x01, 0x36, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, - 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x01, 0x0c, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x01, 0x10, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x01, 0x08, 0x53, 0x69, 0x7a, 0x65, 0x01, 0x0a, - 0x4d, 0x61, 0x67, 0x69, 0x63, 0x01, 0x12, 0x4d, - 0x61, 0x67, 0x69, 0x63, 0x53, 0x69, 0x7a, 0x65, - 0x01, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, - 0x7a, 0x65, 0x01, 0x12, 0x73, 0x65, 0x74, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x01, 0x08, 0x6f, - 0x70, 0x65, 0x6e, 0x01, 0x10, 0x4f, 0x5f, 0x57, - 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x01, 0x0e, 0x4f, - 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x01, 0x0e, - 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x01, - 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x20, 0x01, 0x14, 0x62, 0x79, 0x74, 0x65, - 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x01, 0x0a, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x01, 0x3c, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, - 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x01, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x01, 0x02, 0x72, 0x01, 0x0e, - 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x01, - 0x0a, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x01, 0x0c, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x01, 0x04, - 0x72, 0x62, 0x01, 0x08, 0x73, 0x65, 0x65, 0x6b, - 0x01, 0x10, 0x53, 0x45, 0x45, 0x4b, 0x5f, 0x45, - 0x4e, 0x44, 0x01, 0x18, 0x73, 0x65, 0x65, 0x6b, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, - 0x01, 0x08, 0x72, 0x65, 0x61, 0x64, 0x01, 0x40, - 0x63, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, - 0x64, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, - 0x2c, 0x20, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x20, - 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x01, 0x12, 0x67, 0x65, 0x74, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x01, 0x10, 0x53, 0x45, 0x45, - 0x4b, 0x5f, 0x53, 0x45, 0x54, 0x01, 0x0a, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x01, 0x14, 0x72, 0x65, - 0x61, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x01, 0x16, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x01, 0x10, 0x71, - 0x75, 0x69, 0x63, 0x6b, 0x6a, 0x73, 0x32, 0x0d, - 0xc2, 0x03, 0x03, 0xc4, 0x03, 0xc6, 0x03, 0xc8, - 0x03, 0x02, 0x00, 0x0b, 0xca, 0x03, 0x00, 0x0c, - 0xcc, 0x03, 0x00, 0x03, 0x00, 0xfe, 0x01, 0x00, - 0x01, 0xfe, 0x01, 0x01, 0x02, 0xfe, 0x01, 0x02, - 0x00, 0x0c, 0x20, 0x02, 0x01, 0xa2, 0x01, 0x00, - 0x00, 0x00, 0x02, 0x0d, 0x04, 0x58, 0x00, 0xce, - 0x03, 0x00, 0x0d, 0xd0, 0x03, 0x01, 0x0d, 0xd2, - 0x03, 0x02, 0x0d, 0xd4, 0x03, 0x00, 0x0d, 0xd6, - 0x03, 0x01, 0x0d, 0xd8, 0x03, 0x02, 0x0d, 0xda, - 0x03, 0x03, 0x0d, 0xdc, 0x03, 0x04, 0x0d, 0xde, - 0x03, 0x05, 0x0d, 0xe0, 0x03, 0x06, 0x01, 0xe2, - 0x03, 0x07, 0x01, 0xca, 0x03, 0x08, 0x01, 0xcc, - 0x03, 0x09, 0x01, 0x0c, 0x43, 0x02, 0x01, 0xe0, - 0x03, 0x01, 0x00, 0x01, 0x05, 0x00, 0x01, 0x1e, - 0x01, 0xe4, 0x03, 0x00, 0x01, 0x00, 0x0c, 0x42, - 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, - 0x00, 0x0a, 0x01, 0xe6, 0x03, 0x00, 0x01, 0x00, - 0xd3, 0x43, 0xf4, 0x00, 0x00, 0x00, 0xb6, 0x25, - 0x01, 0x00, 0x39, 0xa7, 0x00, 0x00, 0x00, 0x11, - 0xd3, 0x43, 0x5e, 0x00, 0x00, 0x00, 0xc2, 0x24, + 0x74, 0x65, 0x01, 0x0e, 0x65, 0x78, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x01, 0x0a, 0x61, 0x72, 0x67, + 0x76, 0x30, 0x01, 0x0c, 0x62, 0x69, 0x6e, 0x61, + 0x72, 0x79, 0x01, 0x36, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, + 0x65, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x01, + 0x0c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x01, + 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x01, 0x08, 0x53, 0x69, 0x7a, 0x65, 0x01, + 0x0a, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x01, 0x12, + 0x4d, 0x61, 0x67, 0x69, 0x63, 0x53, 0x69, 0x7a, + 0x65, 0x01, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x69, 0x7a, 0x65, 0x01, 0x12, 0x73, 0x65, 0x74, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x01, 0x08, + 0x6f, 0x70, 0x65, 0x6e, 0x01, 0x10, 0x4f, 0x5f, + 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x01, 0x0e, + 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x01, + 0x0e, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, + 0x01, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x20, 0x01, 0x14, 0x62, 0x79, 0x74, + 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x01, + 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x01, 0x3c, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x01, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x01, 0x02, 0x72, 0x01, + 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, + 0x01, 0x0a, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x01, + 0x0c, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x01, + 0x04, 0x72, 0x62, 0x01, 0x08, 0x73, 0x65, 0x65, + 0x6b, 0x01, 0x10, 0x53, 0x45, 0x45, 0x4b, 0x5f, + 0x45, 0x4e, 0x44, 0x01, 0x18, 0x73, 0x65, 0x65, + 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x20, 0x01, 0x08, 0x72, 0x65, 0x61, 0x64, 0x01, + 0x40, 0x63, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, + 0x79, 0x2c, 0x20, 0x6d, 0x61, 0x67, 0x69, 0x63, + 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x01, 0x12, 0x67, 0x65, 0x74, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x01, 0x10, 0x53, 0x45, + 0x45, 0x4b, 0x5f, 0x53, 0x45, 0x54, 0x01, 0x0a, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x01, 0x14, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x01, 0x16, 0x65, 0x76, 0x61, 0x6c, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x01, 0x10, + 0x71, 0x75, 0x69, 0x63, 0x6b, 0x6a, 0x73, 0x32, + 0x0d, 0xc2, 0x03, 0x03, 0xc4, 0x03, 0xc6, 0x03, + 0xc8, 0x03, 0x02, 0x00, 0x0b, 0xca, 0x03, 0x00, + 0x0c, 0xcc, 0x03, 0x00, 0x03, 0x00, 0xfe, 0x01, + 0x00, 0x01, 0xfe, 0x01, 0x01, 0x02, 0xfe, 0x01, + 0x02, 0x00, 0x0c, 0x20, 0x02, 0x01, 0xa2, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x0d, 0x04, 0x58, 0x00, + 0xce, 0x03, 0x00, 0x0d, 0xd0, 0x03, 0x01, 0x0d, + 0xd2, 0x03, 0x02, 0x0d, 0xd4, 0x03, 0x00, 0x0d, + 0xd6, 0x03, 0x01, 0x0d, 0xd8, 0x03, 0x02, 0x0d, + 0xda, 0x03, 0x03, 0x0d, 0xdc, 0x03, 0x04, 0x0d, + 0xde, 0x03, 0x05, 0x0d, 0xe0, 0x03, 0x06, 0x01, + 0xe2, 0x03, 0x07, 0x01, 0xca, 0x03, 0x08, 0x01, + 0xcc, 0x03, 0x09, 0x01, 0x0c, 0x43, 0x02, 0x01, + 0xe0, 0x03, 0x01, 0x00, 0x01, 0x05, 0x00, 0x01, + 0x1e, 0x01, 0xe4, 0x03, 0x00, 0x01, 0x00, 0x0c, + 0x42, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x03, + 0x00, 0x00, 0x0a, 0x01, 0xe6, 0x03, 0x00, 0x01, + 0x00, 0xd3, 0x43, 0xf4, 0x00, 0x00, 0x00, 0xb6, + 0x25, 0x01, 0x00, 0x39, 0xa7, 0x00, 0x00, 0x00, + 0x11, 0xd3, 0x43, 0x5e, 0x00, 0x00, 0x00, 0xc2, + 0x24, 0x01, 0x00, 0x43, 0xf5, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, + 0x28, 0x0c, 0x43, 0x02, 0x01, 0xe2, 0x03, 0x01, + 0x00, 0x01, 0x03, 0x00, 0x01, 0x21, 0x01, 0xec, + 0x03, 0x00, 0x01, 0x00, 0x0c, 0x42, 0x02, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x0e, + 0x01, 0xe6, 0x03, 0x00, 0x01, 0x00, 0x39, 0x98, + 0x00, 0x00, 0x00, 0x43, 0xf7, 0x00, 0x00, 0x00, + 0xd3, 0x25, 0x01, 0x00, 0x39, 0x95, 0x00, 0x00, + 0x00, 0x43, 0x7b, 0x00, 0x00, 0x00, 0xd3, 0x24, 0x01, 0x00, 0x43, 0xf5, 0x00, 0x00, 0x00, 0xc1, - 0x00, 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x28, - 0x0c, 0x43, 0x02, 0x01, 0xe2, 0x03, 0x01, 0x00, - 0x01, 0x03, 0x00, 0x01, 0x21, 0x01, 0xec, 0x03, - 0x00, 0x01, 0x00, 0x0c, 0x42, 0x02, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x0e, 0x01, - 0xe6, 0x03, 0x00, 0x01, 0x00, 0x39, 0x98, 0x00, - 0x00, 0x00, 0x43, 0xf7, 0x00, 0x00, 0x00, 0xd3, - 0x25, 0x01, 0x00, 0x39, 0x95, 0x00, 0x00, 0x00, - 0x43, 0x7b, 0x00, 0x00, 0x00, 0xd3, 0x24, 0x01, - 0x00, 0x43, 0xf5, 0x00, 0x00, 0x00, 0xc1, 0x00, - 0x24, 0x01, 0x00, 0x43, 0x5c, 0x00, 0x00, 0x00, - 0xc2, 0x25, 0x01, 0x00, 0x0c, 0x43, 0x02, 0x01, - 0xca, 0x03, 0x03, 0x0a, 0x03, 0x07, 0x08, 0x00, - 0x86, 0x04, 0x0d, 0xf0, 0x03, 0x00, 0x01, 0x00, - 0xf2, 0x03, 0x00, 0x01, 0x00, 0xf4, 0x03, 0x00, - 0x01, 0x00, 0xf6, 0x03, 0x01, 0x00, 0x30, 0xf8, - 0x03, 0x01, 0x01, 0x30, 0xfa, 0x03, 0x01, 0x02, - 0x30, 0xfc, 0x03, 0x01, 0x03, 0x30, 0xfe, 0x03, - 0x01, 0x04, 0x30, 0x80, 0x04, 0x01, 0x05, 0x30, - 0x82, 0x04, 0x01, 0x06, 0x30, 0x84, 0x04, 0x01, - 0x07, 0x30, 0x86, 0x04, 0x01, 0x08, 0x30, 0x88, - 0x04, 0x01, 0x09, 0x30, 0xce, 0x03, 0x00, 0x0c, - 0xd2, 0x03, 0x02, 0x0c, 0xd8, 0x03, 0x05, 0x0c, - 0xda, 0x03, 0x06, 0x0c, 0xdc, 0x03, 0x07, 0x0c, - 0xde, 0x03, 0x08, 0x0c, 0xe0, 0x03, 0x09, 0x00, - 0xd0, 0x03, 0x01, 0x0c, 0x62, 0x09, 0x00, 0x62, - 0x08, 0x00, 0x62, 0x07, 0x00, 0x62, 0x06, 0x00, - 0x62, 0x05, 0x00, 0x62, 0x04, 0x00, 0x62, 0x03, - 0x00, 0x62, 0x02, 0x00, 0x62, 0x01, 0x00, 0x62, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x43, 0x05, 0x01, - 0x00, 0x00, 0xd3, 0x24, 0x01, 0x00, 0xcb, 0x63, - 0x00, 0x00, 0x97, 0xec, 0x19, 0x39, 0x96, 0x00, - 0x00, 0x00, 0x11, 0x04, 0x06, 0x01, 0x00, 0x00, - 0x43, 0x5d, 0x00, 0x00, 0x00, 0xd3, 0x24, 0x01, - 0x00, 0x21, 0x01, 0x00, 0x30, 0x66, 0x00, 0x00, - 0x43, 0x07, 0x01, 0x00, 0x00, 0x63, 0x00, 0x00, - 0x0b, 0x0a, 0x4d, 0x08, 0x01, 0x00, 0x00, 0x0a, - 0x4d, 0x09, 0x01, 0x00, 0x00, 0x24, 0x02, 0x00, - 0xcc, 0x39, 0xa7, 0x00, 0x00, 0x00, 0x11, 0x66, - 0x01, 0x00, 0x43, 0x0a, 0x01, 0x00, 0x00, 0x63, - 0x01, 0x00, 0x66, 0x02, 0x00, 0x66, 0x03, 0x00, - 0xa5, 0x66, 0x04, 0x00, 0xa5, 0x24, 0x02, 0x00, - 0x21, 0x01, 0x00, 0xcd, 0xd5, 0x11, 0xb1, 0xec, - 0x0c, 0x0e, 0x39, 0x8d, 0x00, 0x00, 0x00, 0x42, - 0x0b, 0x01, 0x00, 0x00, 0xce, 0x66, 0x00, 0x00, - 0x43, 0x05, 0x01, 0x00, 0x00, 0x63, 0x03, 0x00, - 0x0b, 0x0a, 0x4d, 0x0c, 0x01, 0x00, 0x00, 0x24, - 0x02, 0x00, 0xc4, 0x04, 0x63, 0x04, 0x00, 0x97, - 0xec, 0x1b, 0x39, 0x96, 0x00, 0x00, 0x00, 0x11, - 0x04, 0x0d, 0x01, 0x00, 0x00, 0x43, 0x5d, 0x00, - 0x00, 0x00, 0x63, 0x03, 0x00, 0x24, 0x01, 0x00, - 0x21, 0x01, 0x00, 0x30, 0x63, 0x04, 0x00, 0xeb, - 0xc4, 0x05, 0x63, 0x04, 0x00, 0x42, 0x0e, 0x01, - 0x00, 0x00, 0x43, 0x0f, 0x01, 0x00, 0x00, 0x63, + 0x00, 0x24, 0x01, 0x00, 0x43, 0x5c, 0x00, 0x00, + 0x00, 0xc2, 0x25, 0x01, 0x00, 0x0c, 0x43, 0x02, + 0x01, 0xca, 0x03, 0x03, 0x0a, 0x03, 0x07, 0x08, + 0x00, 0x96, 0x04, 0x0d, 0xf0, 0x03, 0x00, 0x01, + 0x00, 0xf2, 0x03, 0x00, 0x01, 0x00, 0xf4, 0x03, + 0x00, 0x01, 0x00, 0xf6, 0x03, 0x01, 0x00, 0x30, + 0xf8, 0x03, 0x01, 0x01, 0x30, 0xfa, 0x03, 0x01, + 0x02, 0x30, 0xfc, 0x03, 0x01, 0x03, 0x30, 0xfe, + 0x03, 0x01, 0x04, 0x30, 0x80, 0x04, 0x01, 0x05, + 0x30, 0x82, 0x04, 0x01, 0x06, 0x30, 0x84, 0x04, + 0x01, 0x07, 0x30, 0x86, 0x04, 0x01, 0x08, 0x30, + 0x88, 0x04, 0x01, 0x09, 0x30, 0xce, 0x03, 0x00, + 0x0c, 0xd2, 0x03, 0x02, 0x0c, 0xd8, 0x03, 0x05, + 0x0c, 0xda, 0x03, 0x06, 0x0c, 0xdc, 0x03, 0x07, + 0x0c, 0xd0, 0x03, 0x01, 0x0c, 0xde, 0x03, 0x08, + 0x0c, 0xe0, 0x03, 0x09, 0x00, 0x62, 0x09, 0x00, + 0x62, 0x08, 0x00, 0x62, 0x07, 0x00, 0x62, 0x06, + 0x00, 0x62, 0x05, 0x00, 0x62, 0x04, 0x00, 0x62, + 0x03, 0x00, 0x62, 0x02, 0x00, 0x62, 0x01, 0x00, + 0x62, 0x00, 0x00, 0x66, 0x00, 0x00, 0x43, 0x05, + 0x01, 0x00, 0x00, 0xd3, 0x24, 0x01, 0x00, 0xcb, + 0x63, 0x00, 0x00, 0x97, 0xec, 0x19, 0x39, 0x96, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x06, 0x01, 0x00, + 0x00, 0x43, 0x5d, 0x00, 0x00, 0x00, 0xd3, 0x24, + 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, 0x66, 0x00, + 0x00, 0x43, 0x07, 0x01, 0x00, 0x00, 0x63, 0x00, + 0x00, 0x0b, 0x0a, 0x4d, 0x08, 0x01, 0x00, 0x00, + 0x0a, 0x4d, 0x09, 0x01, 0x00, 0x00, 0x24, 0x02, + 0x00, 0xcc, 0x39, 0xa7, 0x00, 0x00, 0x00, 0x11, + 0x66, 0x01, 0x00, 0x43, 0x0a, 0x01, 0x00, 0x00, + 0x63, 0x01, 0x00, 0x66, 0x02, 0x00, 0x66, 0x03, + 0x00, 0xa5, 0x66, 0x04, 0x00, 0xa5, 0x24, 0x02, + 0x00, 0x21, 0x01, 0x00, 0xcd, 0xd5, 0x11, 0xb1, + 0xec, 0x1c, 0x0e, 0x66, 0x05, 0x00, 0x43, 0x0b, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x11, 0xb1, + 0xec, 0x0c, 0x0e, 0x39, 0x8d, 0x00, 0x00, 0x00, + 0x42, 0x0c, 0x01, 0x00, 0x00, 0xce, 0x66, 0x00, + 0x00, 0x43, 0x05, 0x01, 0x00, 0x00, 0x63, 0x03, + 0x00, 0x0b, 0x0a, 0x4d, 0x0d, 0x01, 0x00, 0x00, + 0x24, 0x02, 0x00, 0xc4, 0x04, 0x63, 0x04, 0x00, + 0x97, 0xec, 0x1b, 0x39, 0x96, 0x00, 0x00, 0x00, + 0x11, 0x04, 0x0e, 0x01, 0x00, 0x00, 0x43, 0x5d, + 0x00, 0x00, 0x00, 0x63, 0x03, 0x00, 0x24, 0x01, + 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, 0x04, 0x00, + 0xeb, 0xc4, 0x05, 0x63, 0x04, 0x00, 0x42, 0x0f, + 0x01, 0x00, 0x00, 0x43, 0x10, 0x01, 0x00, 0x00, + 0x63, 0x05, 0x00, 0x63, 0x02, 0x00, 0xeb, 0x9e, + 0x66, 0x06, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, + 0x9e, 0x24, 0x01, 0x00, 0xc4, 0x06, 0x39, 0xa7, + 0x00, 0x00, 0x00, 0x11, 0x63, 0x06, 0x00, 0x21, + 0x01, 0x00, 0xc4, 0x07, 0x63, 0x07, 0x00, 0x43, + 0x43, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x63, + 0x05, 0x00, 0x24, 0x02, 0x00, 0x0e, 0x63, 0x07, + 0x00, 0x43, 0x43, 0x00, 0x00, 0x00, 0x5f, 0x07, + 0x00, 0x66, 0x06, 0x00, 0x42, 0x12, 0x01, 0x00, + 0x00, 0xf1, 0x63, 0x05, 0x00, 0x63, 0x02, 0x00, + 0xeb, 0x9e, 0x24, 0x02, 0x00, 0x0e, 0x39, 0xb1, + 0x00, 0x00, 0x00, 0x11, 0x63, 0x06, 0x00, 0x63, 0x05, 0x00, 0x63, 0x02, 0x00, 0xeb, 0x9e, 0x66, - 0x05, 0x00, 0x42, 0x10, 0x01, 0x00, 0x00, 0x9e, - 0x24, 0x01, 0x00, 0xc4, 0x06, 0x39, 0xa7, 0x00, - 0x00, 0x00, 0x11, 0x63, 0x06, 0x00, 0x21, 0x01, - 0x00, 0xc4, 0x07, 0x63, 0x07, 0x00, 0x43, 0x43, - 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x63, 0x05, - 0x00, 0x24, 0x02, 0x00, 0x0e, 0x63, 0x07, 0x00, - 0x43, 0x43, 0x00, 0x00, 0x00, 0x5f, 0x06, 0x00, - 0x66, 0x05, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, - 0xf1, 0x63, 0x05, 0x00, 0x63, 0x02, 0x00, 0xeb, - 0x9e, 0x24, 0x02, 0x00, 0x0e, 0x39, 0xb1, 0x00, - 0x00, 0x00, 0x11, 0x63, 0x06, 0x00, 0x63, 0x05, - 0x00, 0x63, 0x02, 0x00, 0xeb, 0x9e, 0x66, 0x05, - 0x00, 0x42, 0x12, 0x01, 0x00, 0x00, 0x9e, 0x66, - 0x05, 0x00, 0x42, 0x13, 0x01, 0x00, 0x00, 0x21, - 0x03, 0x00, 0xc4, 0x08, 0x63, 0x08, 0x00, 0x43, - 0x14, 0x01, 0x00, 0x00, 0xb6, 0x63, 0x05, 0x00, - 0x0a, 0x24, 0x03, 0x00, 0x0e, 0x66, 0x07, 0x00, - 0x43, 0x15, 0x01, 0x00, 0x00, 0xd4, 0x66, 0x07, - 0x00, 0x42, 0x16, 0x01, 0x00, 0x00, 0x66, 0x07, - 0x00, 0x42, 0x17, 0x01, 0x00, 0x00, 0xa5, 0x66, - 0x07, 0x00, 0x42, 0x18, 0x01, 0x00, 0x00, 0xa5, - 0xbf, 0xed, 0x01, 0x24, 0x03, 0x00, 0xc4, 0x09, - 0x63, 0x09, 0x00, 0xb6, 0xa7, 0xec, 0x19, 0x39, - 0x96, 0x00, 0x00, 0x00, 0x11, 0x04, 0x19, 0x01, - 0x00, 0x00, 0x43, 0x5d, 0x00, 0x00, 0x00, 0xd4, - 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, 0x66, - 0x07, 0x00, 0x43, 0x0a, 0x01, 0x00, 0x00, 0x63, - 0x09, 0x00, 0x63, 0x06, 0x00, 0xb6, 0x63, 0x06, - 0x00, 0x42, 0x1a, 0x01, 0x00, 0x00, 0x24, 0x04, - 0x00, 0xb6, 0xa7, 0xec, 0x1f, 0x66, 0x07, 0x00, - 0x43, 0x1b, 0x01, 0x00, 0x00, 0x63, 0x09, 0x00, - 0x24, 0x01, 0x00, 0x0e, 0x39, 0x96, 0x00, 0x00, - 0x00, 0x11, 0x04, 0x1c, 0x01, 0x00, 0x00, 0x21, - 0x01, 0x00, 0x30, 0x66, 0x07, 0x00, 0x43, 0x1b, - 0x01, 0x00, 0x00, 0x63, 0x09, 0x00, 0x24, 0x01, - 0x00, 0x29, 0x0c, 0x43, 0x02, 0x01, 0xcc, 0x03, - 0x00, 0x09, 0x00, 0x07, 0x06, 0x00, 0xa4, 0x04, - 0x09, 0xba, 0x04, 0x01, 0x00, 0x30, 0xfe, 0x03, - 0x01, 0x01, 0x30, 0xbc, 0x04, 0x01, 0x02, 0x20, - 0xbe, 0x04, 0x01, 0x03, 0x30, 0xc0, 0x04, 0x01, - 0x04, 0x30, 0x86, 0x04, 0x01, 0x05, 0x30, 0xc2, - 0x04, 0x01, 0x06, 0x30, 0xfa, 0x03, 0x01, 0x07, - 0x30, 0xf8, 0x03, 0x01, 0x08, 0x30, 0xce, 0x03, - 0x00, 0x0c, 0xde, 0x03, 0x08, 0x0c, 0xe2, 0x03, - 0x0a, 0x00, 0xd2, 0x03, 0x02, 0x0c, 0xd4, 0x03, - 0x03, 0x0c, 0xd6, 0x03, 0x04, 0x0c, 0x62, 0x08, - 0x00, 0x62, 0x07, 0x00, 0x62, 0x06, 0x00, 0x62, - 0x05, 0x00, 0x62, 0x04, 0x00, 0x62, 0x03, 0x00, - 0x62, 0x02, 0x00, 0x62, 0x01, 0x00, 0x62, 0x00, - 0x00, 0x39, 0x8d, 0x00, 0x00, 0x00, 0x42, 0x0b, - 0x01, 0x00, 0x00, 0xcb, 0x66, 0x00, 0x00, 0x43, - 0x15, 0x01, 0x00, 0x00, 0x63, 0x00, 0x00, 0x04, - 0x22, 0x01, 0x00, 0x00, 0x24, 0x02, 0x00, 0xcc, - 0x63, 0x01, 0x00, 0x97, 0xec, 0x1b, 0x39, 0x96, - 0x00, 0x00, 0x00, 0x11, 0x04, 0x0d, 0x01, 0x00, - 0x00, 0x43, 0x5d, 0x00, 0x00, 0x00, 0x63, 0x00, - 0x00, 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, - 0x63, 0x01, 0x00, 0x43, 0x23, 0x01, 0x00, 0x00, - 0x66, 0x01, 0x00, 0x42, 0x10, 0x01, 0x00, 0x00, - 0x8d, 0x66, 0x00, 0x00, 0x42, 0x24, 0x01, 0x00, - 0x00, 0x24, 0x02, 0x00, 0xcd, 0x63, 0x02, 0x00, - 0xb6, 0xa7, 0xec, 0x1c, 0x39, 0x96, 0x00, 0x00, - 0x00, 0x11, 0x04, 0x25, 0x01, 0x00, 0x00, 0x43, - 0x5d, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x8d, - 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, 0x39, - 0xa7, 0x00, 0x00, 0x00, 0x11, 0x66, 0x01, 0x00, - 0x42, 0x10, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, - 0xce, 0x63, 0x01, 0x00, 0x43, 0x26, 0x01, 0x00, - 0x00, 0x63, 0x03, 0x00, 0x42, 0x0e, 0x01, 0x00, - 0x00, 0xb6, 0x66, 0x01, 0x00, 0x42, 0x10, 0x01, - 0x00, 0x00, 0x24, 0x03, 0x00, 0x0e, 0x39, 0xa7, - 0x00, 0x00, 0x00, 0x11, 0x63, 0x03, 0x00, 0x42, - 0x0e, 0x01, 0x00, 0x00, 0xb6, 0x66, 0x01, 0x00, - 0x42, 0x12, 0x01, 0x00, 0x00, 0x21, 0x03, 0x00, - 0xc4, 0x04, 0xe1, 0x63, 0x04, 0x00, 0xf1, 0x66, - 0x01, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, 0xb0, - 0xec, 0x1c, 0x63, 0x01, 0x00, 0x43, 0x1b, 0x01, - 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, 0x39, 0x96, - 0x00, 0x00, 0x00, 0x11, 0x04, 0x27, 0x01, 0x00, - 0x00, 0x21, 0x01, 0x00, 0x30, 0x39, 0xb1, 0x00, - 0x00, 0x00, 0x11, 0x63, 0x03, 0x00, 0x42, 0x0e, - 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x42, 0x12, - 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x42, 0x13, - 0x01, 0x00, 0x00, 0x21, 0x03, 0x00, 0xc4, 0x05, - 0x63, 0x05, 0x00, 0x43, 0x28, 0x01, 0x00, 0x00, - 0xb6, 0x0a, 0x24, 0x02, 0x00, 0xc4, 0x06, 0x39, - 0xa7, 0x00, 0x00, 0x00, 0x11, 0x63, 0x06, 0x00, - 0x66, 0x01, 0x00, 0x42, 0x10, 0x01, 0x00, 0x00, - 0x9f, 0x21, 0x01, 0x00, 0xc4, 0x07, 0x63, 0x01, - 0x00, 0x43, 0x23, 0x01, 0x00, 0x00, 0x63, 0x06, - 0x00, 0x66, 0x00, 0x00, 0x42, 0x29, 0x01, 0x00, - 0x00, 0x24, 0x02, 0x00, 0x11, 0x64, 0x02, 0x00, - 0x0e, 0x63, 0x02, 0x00, 0xb6, 0xa7, 0xec, 0x28, - 0x63, 0x01, 0x00, 0x43, 0x1b, 0x01, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x0e, 0x39, 0x96, 0x00, 0x00, - 0x00, 0x11, 0x04, 0x25, 0x01, 0x00, 0x00, 0x43, - 0x5d, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x8d, - 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, - 0x01, 0x00, 0x43, 0x26, 0x01, 0x00, 0x00, 0x63, - 0x07, 0x00, 0x42, 0x0e, 0x01, 0x00, 0x00, 0xb6, - 0x63, 0x07, 0x00, 0xeb, 0x24, 0x03, 0x00, 0x0e, - 0x63, 0x01, 0x00, 0x43, 0x2a, 0x01, 0x00, 0x00, - 0x24, 0x00, 0x00, 0xec, 0x1c, 0x63, 0x01, 0x00, - 0x43, 0x1b, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x06, 0x00, 0x42, 0x13, 0x01, 0x00, 0x00, 0x9e, + 0x66, 0x06, 0x00, 0x42, 0x14, 0x01, 0x00, 0x00, + 0x21, 0x03, 0x00, 0xc4, 0x08, 0x63, 0x08, 0x00, + 0x43, 0x15, 0x01, 0x00, 0x00, 0xb6, 0x63, 0x05, + 0x00, 0x0a, 0x24, 0x03, 0x00, 0x0e, 0x66, 0x05, + 0x00, 0x43, 0x16, 0x01, 0x00, 0x00, 0xd4, 0x66, + 0x05, 0x00, 0x42, 0x17, 0x01, 0x00, 0x00, 0x66, + 0x05, 0x00, 0x42, 0x18, 0x01, 0x00, 0x00, 0xa5, + 0x66, 0x05, 0x00, 0x42, 0x19, 0x01, 0x00, 0x00, + 0xa5, 0xbf, 0xed, 0x01, 0x24, 0x03, 0x00, 0xc4, + 0x09, 0x63, 0x09, 0x00, 0xb6, 0xa7, 0xec, 0x19, + 0x39, 0x96, 0x00, 0x00, 0x00, 0x11, 0x04, 0x1a, + 0x01, 0x00, 0x00, 0x43, 0x5d, 0x00, 0x00, 0x00, + 0xd4, 0x24, 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, + 0x66, 0x05, 0x00, 0x43, 0x0a, 0x01, 0x00, 0x00, + 0x63, 0x09, 0x00, 0x63, 0x06, 0x00, 0xb6, 0x63, + 0x06, 0x00, 0x42, 0x1b, 0x01, 0x00, 0x00, 0x24, + 0x04, 0x00, 0xb6, 0xa7, 0xec, 0x1f, 0x66, 0x05, + 0x00, 0x43, 0x1c, 0x01, 0x00, 0x00, 0x63, 0x09, + 0x00, 0x24, 0x01, 0x00, 0x0e, 0x39, 0x96, 0x00, + 0x00, 0x00, 0x11, 0x04, 0x1d, 0x01, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x66, 0x05, 0x00, 0x43, + 0x1c, 0x01, 0x00, 0x00, 0x63, 0x09, 0x00, 0x24, + 0x01, 0x00, 0x29, 0x0c, 0x43, 0x02, 0x01, 0xcc, + 0x03, 0x00, 0x09, 0x00, 0x07, 0x07, 0x00, 0xb4, + 0x04, 0x09, 0xbc, 0x04, 0x01, 0x00, 0x30, 0xfe, + 0x03, 0x01, 0x01, 0x30, 0xbe, 0x04, 0x01, 0x02, + 0x20, 0xc0, 0x04, 0x01, 0x03, 0x30, 0xc2, 0x04, + 0x01, 0x04, 0x30, 0x86, 0x04, 0x01, 0x05, 0x30, + 0xc4, 0x04, 0x01, 0x06, 0x30, 0xfa, 0x03, 0x01, + 0x07, 0x30, 0xf8, 0x03, 0x01, 0x08, 0x30, 0xd0, + 0x03, 0x01, 0x0c, 0xce, 0x03, 0x00, 0x0c, 0xde, + 0x03, 0x08, 0x0c, 0xe2, 0x03, 0x0a, 0x00, 0xd2, + 0x03, 0x02, 0x0c, 0xd4, 0x03, 0x03, 0x0c, 0xd6, + 0x03, 0x04, 0x0c, 0x62, 0x08, 0x00, 0x62, 0x07, + 0x00, 0x62, 0x06, 0x00, 0x62, 0x05, 0x00, 0x62, + 0x04, 0x00, 0x62, 0x03, 0x00, 0x62, 0x02, 0x00, + 0x62, 0x01, 0x00, 0x62, 0x00, 0x00, 0x66, 0x00, + 0x00, 0x43, 0x0b, 0x01, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x11, 0xb1, 0xec, 0x0c, 0x0e, 0x39, 0x8d, + 0x00, 0x00, 0x00, 0x42, 0x0c, 0x01, 0x00, 0x00, + 0xcb, 0x66, 0x01, 0x00, 0x43, 0x16, 0x01, 0x00, + 0x00, 0x63, 0x00, 0x00, 0x04, 0x23, 0x01, 0x00, + 0x00, 0x24, 0x02, 0x00, 0xcc, 0x63, 0x01, 0x00, + 0x97, 0xec, 0x1b, 0x39, 0x96, 0x00, 0x00, 0x00, + 0x11, 0x04, 0x0e, 0x01, 0x00, 0x00, 0x43, 0x5d, + 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x24, 0x01, + 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, 0x01, 0x00, + 0x43, 0x24, 0x01, 0x00, 0x00, 0x66, 0x02, 0x00, + 0x42, 0x11, 0x01, 0x00, 0x00, 0x8d, 0x66, 0x01, + 0x00, 0x42, 0x25, 0x01, 0x00, 0x00, 0x24, 0x02, + 0x00, 0xcd, 0x63, 0x02, 0x00, 0xb6, 0xa7, 0xec, + 0x1c, 0x39, 0x96, 0x00, 0x00, 0x00, 0x11, 0x04, + 0x26, 0x01, 0x00, 0x00, 0x43, 0x5d, 0x00, 0x00, + 0x00, 0x63, 0x02, 0x00, 0x8d, 0x24, 0x01, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x39, 0xa7, 0x00, 0x00, + 0x00, 0x11, 0x66, 0x02, 0x00, 0x42, 0x11, 0x01, + 0x00, 0x00, 0x21, 0x01, 0x00, 0xce, 0x63, 0x01, + 0x00, 0x43, 0x27, 0x01, 0x00, 0x00, 0x63, 0x03, + 0x00, 0x42, 0x0f, 0x01, 0x00, 0x00, 0xb6, 0x66, + 0x02, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, 0x24, + 0x03, 0x00, 0x0e, 0x39, 0xa7, 0x00, 0x00, 0x00, + 0x11, 0x63, 0x03, 0x00, 0x42, 0x0f, 0x01, 0x00, + 0x00, 0xb6, 0x66, 0x02, 0x00, 0x42, 0x13, 0x01, + 0x00, 0x00, 0x21, 0x03, 0x00, 0xc4, 0x04, 0xe2, + 0x63, 0x04, 0x00, 0xf1, 0x66, 0x02, 0x00, 0x42, + 0x12, 0x01, 0x00, 0x00, 0xb0, 0xec, 0x1c, 0x63, + 0x01, 0x00, 0x43, 0x1c, 0x01, 0x00, 0x00, 0x24, + 0x00, 0x00, 0x0e, 0x39, 0x96, 0x00, 0x00, 0x00, + 0x11, 0x04, 0x28, 0x01, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x30, 0x39, 0xb1, 0x00, 0x00, 0x00, 0x11, + 0x63, 0x03, 0x00, 0x42, 0x0f, 0x01, 0x00, 0x00, + 0x66, 0x02, 0x00, 0x42, 0x13, 0x01, 0x00, 0x00, + 0x66, 0x02, 0x00, 0x42, 0x14, 0x01, 0x00, 0x00, + 0x21, 0x03, 0x00, 0xc4, 0x05, 0x63, 0x05, 0x00, + 0x43, 0x29, 0x01, 0x00, 0x00, 0xb6, 0x0a, 0x24, + 0x02, 0x00, 0xc4, 0x06, 0x39, 0xa7, 0x00, 0x00, + 0x00, 0x11, 0x63, 0x06, 0x00, 0x66, 0x02, 0x00, + 0x42, 0x11, 0x01, 0x00, 0x00, 0x9f, 0x21, 0x01, + 0x00, 0xc4, 0x07, 0x63, 0x01, 0x00, 0x43, 0x24, + 0x01, 0x00, 0x00, 0x63, 0x06, 0x00, 0x66, 0x01, + 0x00, 0x42, 0x2a, 0x01, 0x00, 0x00, 0x24, 0x02, + 0x00, 0x11, 0x64, 0x02, 0x00, 0x0e, 0x63, 0x02, + 0x00, 0xb6, 0xa7, 0xec, 0x28, 0x63, 0x01, 0x00, + 0x43, 0x1c, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, 0x39, 0x96, 0x00, 0x00, 0x00, 0x11, 0x04, - 0x2b, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, - 0x63, 0x01, 0x00, 0x43, 0x1b, 0x01, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x0e, 0x66, 0x03, 0x00, 0x43, - 0x26, 0x01, 0x00, 0x00, 0x63, 0x07, 0x00, 0x42, - 0x0e, 0x01, 0x00, 0x00, 0xb6, 0x63, 0x07, 0x00, - 0xeb, 0x66, 0x04, 0x00, 0x66, 0x05, 0x00, 0xa5, - 0x24, 0x04, 0x00, 0xc4, 0x08, 0x66, 0x00, 0x00, - 0x43, 0x07, 0x01, 0x00, 0x00, 0x63, 0x08, 0x00, - 0x0b, 0x0a, 0x4d, 0x2c, 0x01, 0x00, 0x00, 0x25, - 0x02, 0x00, 0x08, 0xec, 0x16, 0xc1, 0x00, 0x60, - 0x09, 0x00, 0xc1, 0x01, 0x60, 0x0a, 0x00, 0xc1, - 0x02, 0x60, 0x0b, 0x00, 0xc1, 0x03, 0x60, 0x0c, - 0x00, 0x29, 0xb7, 0xb6, 0xa0, 0xe6, 0xb7, 0xb9, - 0xa0, 0x60, 0x04, 0x00, 0xb7, 0xb6, 0xa0, 0x60, - 0x05, 0x00, 0xb7, 0xb9, 0xa0, 0x60, 0x06, 0x00, - 0xb7, 0xba, 0xa0, 0x60, 0x07, 0x00, 0x0b, 0x04, - 0x2d, 0x01, 0x00, 0x00, 0x4d, 0x11, 0x01, 0x00, - 0x00, 0xbe, 0x08, 0x4d, 0x12, 0x01, 0x00, 0x00, - 0xba, 0x4d, 0x13, 0x01, 0x00, 0x00, 0xbe, 0x0c, - 0x4d, 0x10, 0x01, 0x00, 0x00, 0x60, 0x08, 0x00, - 0x06, 0x2f, + 0x26, 0x01, 0x00, 0x00, 0x43, 0x5d, 0x00, 0x00, + 0x00, 0x63, 0x02, 0x00, 0x8d, 0x24, 0x01, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x63, 0x01, 0x00, 0x43, + 0x27, 0x01, 0x00, 0x00, 0x63, 0x07, 0x00, 0x42, + 0x0f, 0x01, 0x00, 0x00, 0xb6, 0x63, 0x07, 0x00, + 0xeb, 0x24, 0x03, 0x00, 0x0e, 0x63, 0x01, 0x00, + 0x43, 0x2b, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, + 0xec, 0x1c, 0x63, 0x01, 0x00, 0x43, 0x1c, 0x01, + 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, 0x39, 0x96, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x2c, 0x01, 0x00, + 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, 0x01, 0x00, + 0x43, 0x1c, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x0e, 0x66, 0x04, 0x00, 0x43, 0x27, 0x01, 0x00, + 0x00, 0x63, 0x07, 0x00, 0x42, 0x0f, 0x01, 0x00, + 0x00, 0xb6, 0x63, 0x07, 0x00, 0xeb, 0x66, 0x05, + 0x00, 0x66, 0x06, 0x00, 0xa5, 0x24, 0x04, 0x00, + 0xc4, 0x08, 0x66, 0x01, 0x00, 0x43, 0x07, 0x01, + 0x00, 0x00, 0x63, 0x08, 0x00, 0x0b, 0x0a, 0x4d, + 0x2d, 0x01, 0x00, 0x00, 0x25, 0x02, 0x00, 0x08, + 0xec, 0x16, 0xc1, 0x00, 0x60, 0x09, 0x00, 0xc1, + 0x01, 0x60, 0x0a, 0x00, 0xc1, 0x02, 0x60, 0x0b, + 0x00, 0xc1, 0x03, 0x60, 0x0c, 0x00, 0x29, 0xb7, + 0xb6, 0xa0, 0xe6, 0xb7, 0xb9, 0xa0, 0x60, 0x04, + 0x00, 0xb7, 0xb6, 0xa0, 0x60, 0x05, 0x00, 0xb7, + 0xb9, 0xa0, 0x60, 0x06, 0x00, 0xb7, 0xba, 0xa0, + 0x60, 0x07, 0x00, 0x0b, 0x04, 0x2e, 0x01, 0x00, + 0x00, 0x4d, 0x12, 0x01, 0x00, 0x00, 0xbe, 0x08, + 0x4d, 0x13, 0x01, 0x00, 0x00, 0xba, 0x4d, 0x14, + 0x01, 0x00, 0x00, 0xbe, 0x0c, 0x4d, 0x11, 0x01, + 0x00, 0x00, 0x60, 0x08, 0x00, 0x06, 0x2f, }; diff --git a/qjs.c b/qjs.c index 42c9ee8f4..4aed6837e 100644 --- a/qjs.c +++ b/qjs.c @@ -403,6 +403,8 @@ int main(int argc, char **argv) struct trace_malloc_data trace_data = { NULL }; int r = 0; int optind = 1; + char exebuf[JS__PATH_MAX]; + size_t exebuf_size = sizeof(exebuf); char *compile_file = NULL; char *exe = NULL; char *expr = NULL; @@ -425,7 +427,9 @@ int main(int argc, char **argv) qjs__argc = argc; qjs__argv = argv; - if (is_standalone(argv[0])) { + /* check if this is a standalone executable */ + + if (!js_exepath(exebuf, &exebuf_size) && is_standalone(exebuf)) { standalone = 1; goto start; } @@ -663,7 +667,7 @@ int main(int argc, char **argv) JSValue args[3]; args[0] = JS_NewString(ctx, compile_file); args[1] = JS_NewString(ctx, out); - args[2] = JS_NewString(ctx, exe != NULL ? exe : argv[0]); + args[2] = exe != NULL ? JS_NewString(ctx, exe) : JS_UNDEFINED; ret = JS_Call(ctx, func, JS_UNDEFINED, 3, (JSValueConst *)args); JS_FreeValue(ctx, func); JS_FreeValue(ctx, args[0]); diff --git a/quickjs-libc.c b/quickjs-libc.c index 3b9979eaa..6082b7465 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include "quickjs.h" #include #include #include @@ -2237,6 +2238,16 @@ static JSValue js_os_cputime(JSContext *ctx, JSValueConst this_val, } #endif +static JSValue js_os_exepath(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + char buf[JS__PATH_MAX]; + size_t len = sizeof(buf); + if (js_exepath(buf, &len)) + return JS_UNDEFINED; + return JS_NewStringLen(ctx, buf, len); +} + static JSValue js_os_now(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { @@ -4023,6 +4034,7 @@ static const JSCFunctionListEntry js_os_funcs[] = { OS_FLAG(SIGTTOU), JS_CFUNC_DEF("cputime", 0, js_os_cputime ), #endif + JS_CFUNC_DEF("exePath", 0, js_os_exepath ), JS_CFUNC_DEF("now", 0, js_os_now ), JS_CFUNC_MAGIC_DEF("setTimeout", 2, js_os_setTimeout, 0 ), JS_CFUNC_MAGIC_DEF("setInterval", 2, js_os_setTimeout, 1 ), diff --git a/standalone.js b/standalone.js index 912e524db..59dac9585 100644 --- a/standalone.js +++ b/standalone.js @@ -48,7 +48,7 @@ export function compileStandalone(inFile, outFile, targetExe) { const bytecode = new Uint8Array(bjson.write(code, JS_WRITE_OBJ_BYTECODE | JS_WRITE_OBJ_REFERENCE | JS_WRITE_OBJ_STRIP_SOURCE)); // Step 2: copy the bytecode to the end of the executable and add a marker. - const exeFileName = targetExe ?? globalThis.argv0; + const exeFileName = targetExe ?? os.exePath() ?? globalThis.argv0; const exe = std.loadFile(exeFileName, { binary: true }); if (!exe) { @@ -80,7 +80,7 @@ export function compileStandalone(inFile, outFile, targetExe) { } export function runStandalone() { - const file = globalThis.argv0; + const file = os.exePath() ?? globalThis.argv0; const exe = std.open(file, 'rb'); if (!exe) {