diff --git a/CHANGELOG.md b/CHANGELOG.md index daa51dc77c..5c22c3d71b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ https://github.com/nwnxee/unified/compare/build8193.37.13...HEAD - Events: Added events `NWNX_ON_DECREMENT_REMAINING_FEAT_USES_{BEFORE|AFTER}` which fire when the remaining uses of a feat are decremented ##### New Plugins -- N/A +- Schema: Implements [AJV](https://ajv.js.org/) to allow validation of custom json metaschema, schema and instances. ##### New NWScript Functions - Player: GetOpenStore() diff --git a/Plugins/Schema/CMakeLists.txt b/Plugins/Schema/CMakeLists.txt new file mode 100644 index 0000000000..50b8fa145a --- /dev/null +++ b/Plugins/Schema/CMakeLists.txt @@ -0,0 +1,20 @@ +add_plugin(Schema + "Schema.cpp" + "external/ajv/dist/ajv_bundle_data.h" + "external/quickjs/src/quickjs.c" + "external/quickjs/src/quickjs-libc.c" + "external/quickjs/src/cutils.c" + "external/quickjs/src/libregexp.c" + "external/quickjs/src/libunicode.c" + "external/quickjs/src/dtoa.c" +) + +target_include_directories(Schema PRIVATE + "external/quickjs/src" + "external/ajv/dist" +) + +target_compile_definitions(Schema PRIVATE + _GNU_SOURCE + CONFIG_VERSION="2026" +) diff --git a/Plugins/Schema/NWScript/nwnx_schema.nss b/Plugins/Schema/NWScript/nwnx_schema.nss new file mode 100644 index 0000000000..756e7b058e --- /dev/null +++ b/Plugins/Schema/NWScript/nwnx_schema.nss @@ -0,0 +1,106 @@ +const string NWNX_Schema = "NWNX_Schema"; + +/// @anchor schema_output_verbosity +/// @name Schema Output Verbosity Levels +/// @{ +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_SILENT = 0; +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL = 1; +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_DEBUG = 2; +/// @} + +/// @brief Checks if a schema id is registered and ready to use for +/// instance validation. +/// @param sSchemaId The schema id to check. This should be the value of +/// the `$id` property in the schema and must a valid uri. +/// @return TRUE if the schema id exists and is ready for validation. +int NWNX_Schema_GetIsRegistered(string sSchemaId); + +/// @brief Removes a schema from the cache. +/// @param sSchemaId The schema id to remove. +/// @return TRUE if the schema was successfully removed, FALSE if the +/// schema was not removed or could not be found. +int NWNX_Schema_RemoveSchema(string sSchemaId); + +/// @brief Completely resets the schema engine's cache. +/// @return TRUE if the cache was successfully cleared. +int NWNX_Schema_ClearCache(); + +/// @brief Register a metaschema. +/// @param jSchema The metaschema to register. +/// @return A json object containing validation results. +json NWNX_Schema_RegisterMetaSchema(json jSchema); + +/// @brief Validates jSchema against its metaschema. +/// @param jSchema Schema to validate. +/// @param bReplaceExisting If TRUE, replaces any existing schema with the same $id. +/// @return A json object containing validation results. +/// @note jSchema must contain the $schema key defining the uri of its metaschema and +/// must contain the $id key defining a valid schema identification uri. +json NWNX_Schema_ValidateSchema(json jSchema, int bReplaceExisting = FALSE); + +/// @brief Validates a data instance against a schema. +/// @param jInstance Instance to validate. +/// @param jSchema Schema to validate instance against. +/// @param nVerbosity Verbosity level for output, use @ref schema_output_verbosity "Schema Output Verbosity Levels". +/// @return A json object containing validation results. +json NWNX_Schema_ValidateInstance(json jInstance, json jSchema, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL); + +/// @brief Validates a data instance against a schema id. +/// @param jInstance Instance to validate. +/// @param sSchemaId Schema id. +/// @param nVerbosity Verbosity level for output, use @ref schema_output_verbosity "Schema Output Verbosity Levels". +/// @return A json object containing validation results. +json NWNX_Schema_ValidateInstanceByID(json jInstance, string sSchemaId, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL); + +int NWNX_Schema_GetIsRegistered(string sSchemaId) +{ + NWNXPushString(sSchemaId); + NWNXCall(NWNX_Schema, "IsRegistered"); + return NWNXPopInt(); +} + +int NWNX_Schema_RemoveSchema(string sSchemaId) +{ + NWNXPushString(sSchemaId); + NWNXCall(NWNX_Schema, "RemoveSchema"); + return NWNXPopInt(); +} + +int NWNX_Schema_ClearCache() +{ + NWNXCall(NWNX_Schema, "ClearCache"); + return NWNXPopInt(); +} + +json NWNX_Schema_RegisterMetaSchema(json jSchema) +{ + NWNXPushJson(jSchema); + NWNXCall(NWNX_Schema, "RegisterMetaSchema"); + return NWNXPopJson(); +} + +json NWNX_Schema_ValidateSchema(json jSchema, int bReplaceExisting = FALSE) +{ + NWNXPushInt(bReplaceExisting); + NWNXPushJson(jSchema); + NWNXCall(NWNX_Schema, "ValidateSchema"); + return NWNXPopJson(); +} + +json NWNX_Schema_ValidateInstance(json jInstance, json jSchema, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL) +{ + NWNXPushInt(nVerbosity); + NWNXPushJson(jSchema); + NWNXPushJson(jInstance); + NWNXCall(NWNX_Schema, "ValidateInstance"); + return NWNXPopJson(); +} + +json NWNX_Schema_ValidateInstanceByID(json jInstance, string sSchemaId, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL) +{ + NWNXPushInt(nVerbosity); + NWNXPushString(sSchemaId); + NWNXPushJson(jInstance); + NWNXCall(NWNX_Schema, "ValidateInstanceByID"); + return NWNXPopJson(); +} diff --git a/Plugins/Schema/README.md b/Plugins/Schema/README.md new file mode 100644 index 0000000000..d1b3f18de6 --- /dev/null +++ b/Plugins/Schema/README.md @@ -0,0 +1,334 @@ +@page schema Readme +@ingroup schema + +This plugin brings the power of [AJV](https://ajv.js.org/) and its schema management and validation capabilities to NWN. AJV is a javascript-based schema validation engine which can validate custom schema against [json-schema.org](https://json-schema.org)'s published metaschema, or user instances against their respective custom schema. This plugin uses a bit of a complicated approach to schema validation in that a javascript engine is instantiated to leverage the schema validation process. This method was selected because cpp-only validation engines were far behind javascript-based implementations, in some cases by years, and plagued with bugs and implementation issues. Additionlly, given that javascript/json is the language of the web, javascript-based validation engines are kept current with json methodologies and rules as they are published, whereas cpp-based engines lag far behind. + +- [Terminology](#terminology) + - [Document](#document) + - [Schema](#schema) + - [Metaschema] (#metaschema) + - [Instance](#instance) + - [Validation](#validation) +- [Setup](#setup) + - [NWNX](#nwnx) + - [NWScript](#nwscript) +- [Verbosity Levels](#verbosity-levels) +- [Common Functions](#common-functions) + - [Schema Validation](#schema-validation) + - [Instance Validation](#instance-validation) +- [Uncommon Functions](#uncommon-functions) +- [Examples](#examples) + - [Custom Metaschema Validation](#validating-a-custom-or-extended-metaschema) + - [Custom Schema Validation](#validating-a-custom-schema-against-a-metaschema) + - [Instance Validation](#validating-an-instance-against-a-custom-schema) + - [NWScript Snippet](#nwscript-snippets) +- [Updating AJV and QuickJS](#updating-ajv-and-quickjs) + +# Terminology +### Document +`document` is any json object, but usually refers to an `instance` or any other piece of json data being described or validated by a schema. + +### Schema +`schema` is a document used to describe the structure, constraints and annotations of json a document called the `instance`. The `schema` itself conforms to the structure and constraints defined in its [metaschema](#metaschema), usually published by json-schema.org and identified in the schema's `$schema` key. `schema`s must be a json object or boolean value. + +### Metaschema +`metaschema` is a document used to describe the structure, contstraints and annotations of a schema. + +### Instance +`instance` is a document that is being described by a schema and usually contains real, working data and values. + +### Validation +`validation` passes when the values and structure contained in the `instance` meet the structure and constraints imposed by its schema. This is also true when validating a schema document itself against its metaschema. + +# Setup +### NWNX +Ensure the `schema` plugin is not skipped in your nwserver's environmental file, or wherever you establish your nwnx plugin configuration: +`NWNX_SCHEMA_SKIP=FALSE` +### NWScript +Add `#include "nwnx_schema"` to your nwscript file and you've harnessed the power of schema validation. +# Verbosity Levels +Validation output verbosity can be controlled in specific circumstances. There are three levels of output verbosity available: +```c +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_SILENT = 0; +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL = 1; +const int NWNX_SCHEMA_OUTPUT_VERBOSITY_DEBUG = 2; +``` +These verbosities are only avaialable for instance validation; schem and metaschema validation will always return at maximum verbosity. Examples of output at various levels is demonstrated below. +# Common Functions +### Metaschema Validation +This plugin organically includes [json-schema.org's](https://json-schema.org) metaschema drafts [6](https://json-schema.org/draft-06), [7](https://json-schema.org/draft-07), [2019-09](https://json-schema.org/draft/2019-09) and [2020-12](https://json-schema.org/draft/2020-12). Generally, this will be enough to satisfy most use cases and these schema never need to be added. However, if a creator needs to extend a standard metaschema, or create one from scratch, it can be added with `NWNX_Schema_RegisterMetaSchema()`. This function will return the results of the schema validation. Custom or extended metaschema must contain both `$schema`, to identify the controlling metaschema, and `$id` to provide a unique identifier for the metaschema. +>**WARNING** Metaschema must be added through this function. Attempting to add metaschema through `NWNX_Schema_ValidateSChema()` may result in undefined behavior. +```c +/// @brief Register a metaschema. +/// @param jSchema The metaschema to register. +/// @return A json object containing validation results. +json NWNX_Schema_RegisterMetaSchema(json jSchema); +``` +### Schema Validation +Creators can add custom schema that, once loaded, will remain compiled and available for use throughout the server's session. The schema cache is volatile and will not survive a full nwnx reset/restart. Custom schema should be validated during the `OnModuleLoad` event if the schema is commonly used. One-off, or rarely used schema, do not need to be validated until they are used. + +The system can validate a custom schema against a metaschema, whether that metaschema is a published standard or a user-supplied metaschema. `NWNX_Schema_ValidateSchema()` is designed to validate and add a custom schema to the cache, not to add custom or extended metaschema. To add a custom or extended metaschema, see [Metaschema Validation](#metaschema-validation). +```c +/// @brief Validates jSchema against its metaschema. +/// @param jSchema Schema to validate. +/// @param bReplaceExisting If TRUE, replaces any existing schema with the same $id. +/// @return A json object containing validation results. +/// @note jSchema must contain the $schema key defining the uri of its metaschema and +/// must contain the $id key defining a valid schema identification uri. +json NWNX_Schema_ValidateSchema(json jSchema, int bReplaceExisting = FALSE); +``` +### Instance Validation +An instance can be validated by schema or by schema ID. Schema passed through `NWNX_Schema_ValidateInstance()` do not have be be pre-validated. If a schema is passed through this function that was not previously validated, the schema will be validated and cached if the schema contains a valid `$id` uri. Otherwise, it will be validated and, if valid, will be used to validate the passed instance. If the schema is invalid, the results of the schema validation will be returned. If the schema is valid, the results of the instance validation will be returned. + +>**WARNING** If a schema which contains an `$id` that is already registered to the cache, but is not the same schema that created the orginal registration, is passed, the cached schema will not be overwritten. However, the passed schema may still be used to validate the passed instance, if the schema is valid. To modify a schema that has already been cached, used `NWNX_Schema_ValidateSchema()` and set `bReplaceExisting` to `TRUE`. +```c +/// @brief Validates a data instance against a schema. +/// @param jInstance Instance to validate. +/// @param jSchema Schema to validate instance against. +/// @param nVerbosity Verbosity level for output, use @ref schema_output_verbosity "Schema Output Verbosity Levels". +/// @return A json object containing validation results. +json NWNX_Schema_ValidateInstance(json jInstance, json jSchema, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL); +``` +To validate an instance against a published metaschema or against a custom user schema which has already been validated and cached, the `$id` of the schema can be provided instead of the full schema. If the passed `$id` cannot be found in the schema cache, the validation will fail. +```c +/// @brief Validates a data instance against a schema id. +/// @param jInstance Instance to validate. +/// @param sSchemaId Schema id. +/// @param nVerbosity Verbosity level for output, use @ref schema_output_verbosity "Schema Output Verbosity Levels". +/// @return A json object containing validation results. +json NWNX_Schema_ValidateInstanceByID(json jInstance, string sSchemaId, int nVerbosity = NWNX_SCHEMA_OUTPUT_VERBOSITY_NORMAL); +``` +# Uncommon Functions +- ***These functions are available for troubleshooting or debugging, but are generally not needed in the course of normal operations*** + +Individual schema can be removed from the validated schema cache. +```c +/// @brief Remove a schema from the validation cache. +/// @param sSchemaID The $id of the schema to be removed. +void NWNX_Schema_RemoveSchema(string sKey); +``` +Clear the entire validated schema cache. +```c +/// @brief Clear the validated schema cache. +void NWNX_Schema_ClearCache(); +``` +Check is a schema has been registered. +```c +/// @brief Checks if a schema id is registered and ready to use for +/// instance validation. +/// @param sSchemaId The schema id to check. This should be the value of +/// the `$id` property in the schema and must a valid uri. +/// @return TRUE if the schema id exists and is ready for validation. +int NWNX_Schema_GetIsRegistered(string sSchemaId); +``` +# Examples + +### Validating a custom or extended metaschema +A custom metaschema can be validated against its controlling metaschema. In this case, 2020-12 draft is being extended to require the `title` property be defined. +```json +{ + "$id": "https://example.com/meta-extended", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "allOf": [ + { + "$ref": "https://json-schema.org/draft/2020-12/schema" + } + ], + "required": [ + "title" + ] +} +``` +To add this metaschema to the cache, use code similar to this in nwscript: +```c +json jMeta = JsonParse(r" + { + ""$id"": ""https://example.com/meta-extended"", + ""$schema"": ""https://json-schema.org/draft/2020-12/schema"", + ""allOf"": [ + { ""$ref"": ""https://json-schema.org/draft/2020-12/schema"" } + ], + ""required"": [""title""] + } +"); + +json result = NWNX_Schema_RegisterMetaSchema(jMeta); +``` +Once added, this metaschema can be used to validate custom schema. + +### Validating a custom schema against a metaschema +The following valid user-generated schema can be supplied to the validation engine to determine whether it is valid against the metaschema defined in its `$schema` key. The following schema is invalid against the metaschema described in the last example because it is missing the required `title` property. + +```json +{ + "$id": "https://example.com/invalid-person", + "$schema": "https://example.com/meta-extended", + "description": "Missing the required title field", + "type": "object" +} +``` +The returned result is a json object containing the boolean key `valid` and, if necessary, a key `errors` contains human-readable information for identifying the errors in the schema. In this case, the schema is invalid, so the result is: +```json +{ + "errors": [ + { + "data": { + "$id": "https://example.com/invalid-person", + "$schema": "https://example.com/meta-extended", + "description": "Missing the required title field", + "type": "object" + }, + "instancePath": "", + "keyword": "required", + "message": "must have required property 'title'", + "params": { + "missingProperty": "title" + }, + "parentSchema": { + "$id": "https://example.com/meta-extended", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "allOf": [ + { + "$ref": "https://json-schema.org/draft/2020-12/schema" + } + ], + "required": [ + "title" + ] + }, + "schema": [ + "title" + ], + "schemaPath": "#/required" + } + ], + "valid": false +} +``` +As you can see, the resulting `errors` component is quite involved. Error generated when validating metaschema or schema are always returned at the maximum verbosity level and cannot be returned at a lower level. This is designed to ensure these advanced fucntions can always provide the data necessary for debugging. +### Validating an instance against a custom schema +Below is a simple schema that can be used to validate an instance. +```json +{ + "$id": "https://example.com/person", + "description": "A person schema", + "properties": { + "age": { + "minimum": 0, + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +} +``` +This is an instance that validates successfully against the schema. +```json +{ + "age": 30, + "name": "John Doe" +} +``` +and results in the expected return: +```json +{"valid":true} +``` +This is an instance that fails validation against the schema. +```json +{ + "name": 123, + "age": -5 +} +``` +and provides the following error set: +```json +{ + "errors": [ + { + "errors": { + "age": "must be >= 0", + "name": "must be string" + }, + "instance": { + "age": -5, + "name": 123 + }, + "instancePath": "/" + } + ], + "valid": false +} +``` +If the user selected `NWNX_SCHEMA_OUTPUT_VERBOSITY_SILENT`, the following would have been returned: +```json +{ + "valid": false +} +``` +If the user selected `NWNX_SCHEMA_OUTPUT_VERBOSITY_DEBUG`, the following would have been returned: +```json +{ + "errors": [ + { + "data": -5, + "instancePath": "/age", + "keyword": "minimum", + "message": "must be >= 0", + "params": { + "comparison": ">=", + "limit": 0 + }, + "parentSchema": { + "minimum": 0, + "type": "integer" + }, + "schema": 0, + "schemaPath": "#/properties/age/minimum" + }, + { + "data": 123, + "instancePath": "/name", + "keyword": "type", + "message": "must be string", + "params": { + "type": "string" + }, + "parentSchema": { + "type": "string" + }, + "schema": "string", + "schemaPath": "#/properties/name/type" + } + ], + "valid": false +} +``` +The various verbosity levels are exceptionally useful during debugging complicated instances failing against complicated schema, such as debugging nui window instances. +# NWScript Snippets +A common implementation will be to return an `int` (`TRUE`/`FALSE`) instead of a validation results object. The following is a simple example of that implementation. This snippet assumes the `urn:nwn:player_character` custom schema from the [instance validation](#validating-an-instance-against-a-custom-schema) example above has been registered to the schema cache. +```c +if (!NWNXGetIsAvailable()) + return FALSE; + +json jInstance = JsonParse(r" +{ + ""age"": 30, + ""name"": ""John Doe"" +} +"); +json jResult = NWNX_Schema_ValidateInstanceByID(jInstance, "urn:nwn:player_character"); +return JsonObjectGet(jResult, "valid") == JSON_TRUE; +``` +# Updating AJV and QuickJS +Technology continuously improves and along with it, the software to support it. [AJV](https://ajv.js.org/) and [QuickJS](https://github.com/quickjs-ng/quickjs) are no different, with both products being updated within the last week. To make updating these support systems easier, there are update scripts in the schema plugin's `external` folder. + +> If using `Windows`, these update scripts must be run in `bash`. + +- `external/update-external.sh` OS-aware updating utility that will update required `AJV` and `QuickJS` files into their respective subfolders, and bundle the `AJV` files into the required javascript bundle file. +- `external/ajv/update-ajv.sh` OS-aware updating utility that will update only `AJV` files and bundle them into the required javascript bundle file. XXD is required on the local machine to successfully run this update script. +- `external/quickjs/update-quickjs.sh` OS-aware updating utility that will update only the `QuickJS` files. diff --git a/Plugins/Schema/Schema.cpp b/Plugins/Schema/Schema.cpp new file mode 100644 index 0000000000..f4a4458d8d --- /dev/null +++ b/Plugins/Schema/Schema.cpp @@ -0,0 +1,521 @@ +extern "C" { + #include "quickjs.h" + #include "quickjs-libc.h" +} + +#include "nwnx.hpp" +#include "ajv_bundle_data.h" + +static JSRuntime* global_rt = nullptr; +static JSContext* global_ctx = nullptr; + +namespace Schema { + +using json = nlohmann::json; +using ArgumentStack = NWNXLib::ArgumentStack; + +static JSContext* GetContext(); +static json JSValueToJSON(JSValue val); + +void SchemaUnload() __attribute__((destructor)); +void SchemaUnload() +{ + if (global_ctx) { + JS_FreeContext(global_ctx); + global_ctx = nullptr; + } + if (global_rt) { + JS_FreeRuntime(global_rt); + global_rt = nullptr; + } +} + +JSContext* GetContext() +{ + if (!global_ctx) { + global_rt = JS_NewRuntime(); + global_ctx = JS_NewContext(global_rt); + + js_std_init_handlers(global_rt); + js_std_add_helpers(global_ctx, 0, NULL); + + static constexpr const char js[] = R"( + globalThis.processErrors = function(errors, data, verbosity) { + if (verbosity <= 0) return undefined; + if (!errors || !Array.isArray(errors)) return []; + if (verbosity >= 2) return errors; + + const getNested = (obj, path) => { + if (!path || path === "/" || path === "") return obj; + return path.split('/').filter(Boolean).reduce((acc, part) => acc && acc[part], obj); + }; + + const results = []; + const applicators = ["anyOf", "allOf", "oneOf", "if", "then", "else"]; + const customPaths = new Set(errors.filter(e => e.keyword === "errorMessage").map(e => e.instancePath)); + + errors.forEach(err => { + const fullPath = err.instancePath || "/"; + const parts = fullPath.split('/').filter(Boolean); + let targetPath = fullPath; + let leafKey = "root"; + + if (parts.length > 0) { + const lastPart = parts[parts.length - 1]; + if (isNaN(lastPart)) { + leafKey = lastPart; + targetPath = "/" + parts.slice(0, -1).join("/"); + } + } + + let entry = results.find(r => r.instancePath === targetPath); + if (!entry) { + entry = { + instancePath: targetPath, + instance: getNested(data, targetPath), + errors: {} + }; + results.push(entry); + } + + if (!entry.errors[leafKey]) entry.errors[leafKey] = []; + if (!entry.errors[leafKey].includes(err.message)) { + entry.errors[leafKey].push(err.message); + } + }); + + results.forEach(entry => { + for (const key in entry.errors) { + if (entry.errors[key].length === 1) { + entry.errors[key] = entry.errors[key][0]; + } + } + }); + + return results; + }; + + globalThis.deepEqual = function(a, b) { + if (a === b) return true; + + if (a && b && typeof a === 'object' && typeof b === 'object') { + if (Array.isArray(a)) { + if (!Array.isArray(b)) return false; + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (!globalThis.deepEqual(a[i], b[i])) return false; + } + return true; + } + + if (Array.isArray(b)) return false; + + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) return false; + + for (const key of keys) { + if (!Object.prototype.hasOwnProperty.call(b, key)) return false; + if (!globalThis.deepEqual(a[key], b[key])) return false; + } + return true; + } + + return false; + }; + + globalThis.registerSchema = function(s, overwrite) { + const id = s.$id; + + if (!id) { + if (globalThis.ajv.validateSchema(s)) { + return { valid: true }; + } else { + return { valid: false, errors: globalThis.ajv.errors }; + } + } + + if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:[^\s]*$/.test(id)) { + return { valid: false, errors: [{ message: "Schema $id '" + id + "' is not a valid absolute URI." }] }; + } + + const existing = globalThis.ajv.getSchema(id); + if (existing) { + if (globalThis.deepEqual(s, existing.schema)) { + return { valid: true }; + } + + if (globalThis.ajv.validateSchema(s)) { + if (overwrite) { + globalThis.ajv.removeSchema(id); + globalThis.ajv.compile(s); + return { valid: true }; + } else { + return { valid: true }; + } + } else { + return { valid: false, errors: globalThis.ajv.errors }; + } + } + + if (globalThis.ajv.validateSchema(s)) { + globalThis.ajv.compile(s); + return { valid: true }; + } + return { valid: false, errors: globalThis.ajv.errors }; + }; + )"; + + JS_Eval(global_ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + JS_Eval(global_ctx, (const char*)ajv_runtime_min_js, ajv_runtime_min_js_len, "ajv.js", JS_EVAL_TYPE_GLOBAL); + + LOG_DEBUG("Schema validation initialized"); + } + + return global_ctx; +} + +json JSValueToJSON(JSValue val) +{ + JSContext *ctx = Schema::GetContext(); + JSValue jsonStrVal = JS_JSONStringify(ctx, val, JS_UNDEFINED, JS_UNDEFINED); + const char* cStr = JS_ToCString(ctx, jsonStrVal); + + json result = json::parse(cStr ? cStr : "{\"valid\": false, \"errors\": \"Engine Error\"}"); + + JS_FreeCString(ctx, cStr); + JS_FreeValue(ctx, jsonStrVal); + return result; +} + +NWNX_EXPORT ArgumentStack IsRegistered(ArgumentStack&& args) +{ + const auto schemaId = args.extract(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schemaID", JS_NewString(ctx, schemaId.c_str())); + JS_FreeValue(ctx, global); + + static constexpr const char js[] = "!!globalThis.ajv.getSchema(globalThis.schemaID)"; + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + int32_t isFound = JS_ToBool(ctx, resVal); + JS_FreeValue(ctx, resVal); + + LOG_DEBUG("IsRegistered(): schema [%s] %s", schemaId.c_str(), isFound ? "found" : "not found"); + return isFound; +} + +NWNX_EXPORT ArgumentStack RemoveSchema(ArgumentStack&& args) +{ + const auto schemaId = args.extract(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schemaID", JS_NewString(ctx, schemaId.c_str())); + JS_FreeValue(ctx, global); + + static constexpr const char js[] = R"( + (function() { + const id = globalThis.schemaID; + const exists = !!globalThis.ajv.getSchema(id); + if (exists) { + globalThis.ajv.removeSchema(id); + } + return exists; + })() + )"; + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + int32_t isFound = JS_ToBool(ctx, resVal); + JS_FreeValue(ctx, resVal); + + LOG_DEBUG("RemoveSchema(): schema [%s] %s", schemaId.c_str(), isFound ? "removed" : "not found"); + return isFound; +} + +NWNX_EXPORT ArgumentStack ClearCache(ArgumentStack&&) +{ + static constexpr const char js[] = R"( + (function() { + globalThis.ajv.removeSchema(); + return Object.keys(globalThis.ajv._schemas).length === 0; + })() + )"; + + JSContext *ctx = GetContext(); + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + int32_t isEmpty = JS_ToBool(ctx, resVal); + JS_FreeValue(ctx, resVal); + + JSContext *ctx_p; + while (JS_ExecutePendingJob(global_rt, &ctx_p) > 0); + + if (isEmpty) + { + LOG_DEBUG("ClearCache(): cached schemas cleared"); + } + else + { + LOG_DEBUG("ClearCache(): failed to clear cached schemas"); + } + + return isEmpty; +} + +NWNX_EXPORT ArgumentStack RegisterMetaSchema(ArgumentStack&& args) +{ + const auto schema = args.extract(); + std::string schemaDump = schema.m_shared->m_json.dump(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schema", JS_NewString(ctx, schemaDump.c_str())); + JS_FreeValue(ctx, global); + + static constexpr const char js[] = R"( + (function() { + try { + const s = JSON.parse(globalThis.schema); + if (!s.$id) { + return { valid: false, errors: [{ message: "Meta-schema must have an $id." }] }; + } + + globalThis.ajv.addMetaSchema(s); + return { valid: true }; + } catch(e) { + // If addMetaSchema fails (e.g. invalid schema), AJV throws + return { valid: false, errors: [{ message: e.message }] }; + } + })() + )"; + + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + json result = JSValueToJSON(resVal); + JS_FreeValue(ctx, resVal); + + if (result["valid"].get()) + { + LOG_DEBUG("RegisterMetaSchema(): Metaschema %s registered successfully", + schema.m_shared->m_json.value("$id", "UNKNOWN").c_str()); + } + else + { + LOG_DEBUG("RegisterMetaSchema(): Failed to register metaschema: %s", + result.contains("errors") ? result["errors"].dump().c_str() : "UNKNOWN_ERROR"); + } + + return { JsonEngineStructure(std::move(result), "") }; +} + +NWNX_EXPORT ArgumentStack ValidateSchema(ArgumentStack&& args) +{ + const auto schema = args.extract(); + const auto overwrite = args.extract(); + + std::string schemaDump = schema.m_shared->m_json.dump(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schema", JS_NewString(ctx, schemaDump.c_str())); + JS_SetPropertyStr(ctx, global, "overwrite", JS_NewBool(ctx, overwrite != 0)); + JS_FreeValue(ctx, global); + + static constexpr const char js[] = R"( + (function() { + try { + const s = JSON.parse(globalThis.schema); + const result = globalThis.registerSchema(s, globalThis.overwrite); + + if (result.valid) { + return { valid: true }; + } + + return { + valid: false, + errors: result.errors + }; + } catch(e) { + return { valid: false, errors: [{ message: e.message }] }; + } + })() + )"; + + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + json result = JSValueToJSON(resVal); + JS_FreeValue(ctx, resVal); + + if (result["valid"].get()) + { + LOG_DEBUG("ValidateSchema(): schema [%s] validated and registered successfully", + schema.m_shared->m_json.value("$id", "UNNAMED").c_str()); + } + else + { + LOG_DEBUG("ValidateSchema(): schema [%s] validation failed: %s", + schema.m_shared->m_json.value("$id", "UNNAMED").c_str(), + result.contains("errors") ? result["errors"].dump().c_str() : "SILENT"); + } + + return { JsonEngineStructure(std::move(result), "") }; +} + +NWNX_EXPORT ArgumentStack ValidateInstance(ArgumentStack&& args) +{ + const auto instance = args.extract(); + const auto schema = args.extract(); + const auto verbosity = args.extract(); + + std::string instanceDump = instance.m_shared->m_json.dump(); + std::string schemaDump = schema.m_shared->m_json.dump(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schema", JS_NewString(ctx, schemaDump.c_str())); + JS_SetPropertyStr(ctx, global, "instance", JS_NewString(ctx, instanceDump.c_str())); + JS_SetPropertyStr(ctx, global, "verbosity", JS_NewInt32(ctx, verbosity)); + JS_FreeValue(ctx, global); + + static constexpr const char js[] = R"( + (function() { + try { + const s = JSON.parse(globalThis.schema); + const d = JSON.parse(globalThis.instance); + const vLevel = (typeof globalThis.verbosity === 'number') ? globalThis.verbosity : 1; + + const result = globalThis.registerSchema(s, false); + + if (!result.valid) { + const fail = { valid: false }; + if (vLevel > 0) fail.errors = result.errors; + return fail; + } + + const v = s.$id ? globalThis.ajv.getSchema(s.$id) : globalThis.ajv.compile(s); + const valid = v(d); + const errs = v.errors; + + if (!s.$id) globalThis.ajv.removeSchema(s); + if (valid) return { valid: true }; + + const output = { valid: false }; + const processedErrors = globalThis.processErrors(errs, d, vLevel); + if (processedErrors !== undefined) output.errors = processedErrors; + return output; + } catch(e) { + const fail = { valid: false }; + + if ((globalThis.verbosity || 0) <= 0) return fail; + + // Level 1+: Descriptive functional error reporting + const isParseError = e.message.toLowerCase().includes("json") || + e.message.toLowerCase().includes("unexpected token"); + const errorType = isParseError ? "Input Error" : "Engine Fault"; + + fail.errors = "[" + errorType + "]: " + e.message; + + // Level 2: Include the JS stack trace for developer debugging + if (globalThis.verbosity >= 2 && e.stack) { + fail.errors["stack"] = e.stack; + } + + return fail; + } + })() + )"; + + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + json result = JSValueToJSON(resVal); + JS_FreeValue(ctx, resVal); + + std::string schemaId = schema.m_shared->m_json.value("$id", "UNNAMED"); + if (result["valid"].get()) + { + LOG_DEBUG("ValidateInstance(): validation successful for schema [%s]", schemaId.c_str()); + } + else + { + LOG_DEBUG("ValidateInstance(): validation failed for schema [%s]: %s", + schemaId.c_str(), + result.contains("errors") ? result["errors"].dump().c_str() : "SILENT"); + } + + return { JsonEngineStructure(std::move(result), "") }; +} + +NWNX_EXPORT ArgumentStack ValidateInstanceByID(ArgumentStack&& args) +{ + const auto instance = args.extract(); + const auto schemaId = args.extract(); + const auto verbosity = args.extract(); + + std::string instanceDump = instance.m_shared->m_json.dump(); + + JSContext *ctx = GetContext(); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "schemaID", JS_NewString(ctx, schemaId.c_str())); + JS_SetPropertyStr(ctx, global, "instance", JS_NewString(ctx, instanceDump.c_str())); + JS_SetPropertyStr(ctx, global, "verbosity", JS_NewInt32(ctx, verbosity)); + JS_FreeValue(ctx, global); + + const char* js = R"( + (function() { + try { + const s = globalThis.schemaID; + const i = JSON.parse(globalThis.instance); + const vLevel = (typeof globalThis.verbosity === 'number') ? globalThis.verbosity : 1; + + let v = globalThis.ajv.getSchema(s); + if (!v) { + const fail = { valid: false }; + if (vLevel > 0) { + fail.errors = "Schema ID '" + s + "' not found in registry."; + } + return fail; + } + + if (v(i)) return { valid: true }; + + const output = { valid: false }; + const processedErrors = globalThis.processErrors(v.errors, i, vLevel); + if (processedErrors !== undefined) output.errors = processedErrors; + return output; + } catch(e) { + const fail = { valid: false }; + + // Level 0: Silent + if ((globalThis.verbosity || 0) <= 0) return fail; + + // Level 1+: Descriptive functional error reporting + const isParseError = e.message.toLowerCase().includes("json") || + e.message.toLowerCase().includes("unexpected token"); + const errorType = isParseError ? "Input Error" : "Engine Fault"; + + fail.errors = "[" + errorType + "]: " + e.message; + + // Level 2: Debug stack trace + if (globalThis.verbosity >= 2 && e.stack) { + fail.errors["stack"] = e.stack; + } + + return fail; + } + })() + )"; + + JSValue resVal = JS_Eval(ctx, js, strlen(js), "", JS_EVAL_TYPE_GLOBAL); + json result = JSValueToJSON(resVal); + JS_FreeValue(ctx, resVal); + + if (result["valid"].get()) + { + LOG_DEBUG("ValidateInstanceByID(): validation successful for schema ID: %s", schemaId.c_str()); + } + else + { + LOG_DEBUG("ValidateInstanceByID(): validation failed for schema ID: %s. Errors: %s", + schemaId.c_str(), + result.contains("errors") ? result["errors"].dump().c_str() : "SILENT"); + } + + return { JsonEngineStructure(std::move(result), "") }; +} +} diff --git a/Plugins/Schema/external/ajv/LICENSE.md b/Plugins/Schema/external/ajv/LICENSE.md new file mode 100644 index 0000000000..7ab076b7f0 --- /dev/null +++ b/Plugins/Schema/external/ajv/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2021 Evgeny Poberezkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Plugins/Schema/external/ajv/dist/ajv_bundle_data.h b/Plugins/Schema/external/ajv/dist/ajv_bundle_data.h new file mode 100644 index 0000000000..6a6bf22a6f --- /dev/null +++ b/Plugins/Schema/external/ajv/dist/ajv_bundle_data.h @@ -0,0 +1,12431 @@ +unsigned char ajv_runtime_min_js[] = { + 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x5f, 0x63, + 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x61, 0x3d, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x67, 0x63, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x76, 0x63, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x62, 0x63, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x4f, + 0x66, 0x2c, 0x77, 0x63, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, + 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x3d, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x3d, 0x3e, 0x28, 0x29, 0x3d, 0x3e, 0x28, 0x65, 0x7c, 0x7c, 0x74, 0x28, + 0x28, 0x65, 0x3d, 0x7b, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, + 0x7b, 0x7d, 0x7d, 0x29, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x2c, 0x65, 0x29, 0x2c, 0x65, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x63, 0x3d, 0x28, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, + 0x28, 0x65, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, + 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x7c, 0x7c, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x63, + 0x28, 0x65, 0x29, 0x29, 0x21, 0x77, 0x63, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x26, 0x26, 0x6e, 0x21, 0x3d, 0x3d, 0x72, + 0x26, 0x26, 0x72, 0x61, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x7b, 0x67, 0x65, + 0x74, 0x3a, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x5b, 0x6e, 0x5d, 0x2c, 0x65, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x28, + 0x73, 0x3d, 0x67, 0x63, 0x28, 0x65, 0x2c, 0x6e, 0x29, 0x29, 0x7c, 0x7c, + 0x73, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, 0x74, 0x3d, 0x28, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x3d, 0x3e, 0x28, 0x72, 0x3d, 0x74, 0x21, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3f, 0x5f, 0x63, 0x28, 0x62, 0x63, 0x28, 0x74, 0x29, + 0x29, 0x3a, 0x7b, 0x7d, 0x2c, 0x45, 0x63, 0x28, 0x65, 0x7c, 0x7c, 0x21, + 0x74, 0x7c, 0x7c, 0x21, 0x74, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x3f, 0x72, 0x61, 0x28, 0x72, 0x2c, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x74, 0x2c, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, + 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3a, 0x72, 0x2c, 0x74, + 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x42, 0x65, 0x3d, 0x70, 0x28, + 0x43, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x43, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x43, 0x2e, 0x72, 0x65, 0x67, 0x65, + 0x78, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x43, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x73, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x3d, 0x43, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3d, 0x43, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x43, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x43, 0x2e, 0x73, 0x74, + 0x72, 0x43, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x3d, 0x43, 0x2e, 0x61, 0x64, + 0x64, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x72, 0x67, 0x3d, 0x43, 0x2e, 0x73, + 0x74, 0x72, 0x3d, 0x43, 0x2e, 0x5f, 0x3d, 0x43, 0x2e, 0x6e, 0x69, 0x6c, + 0x3d, 0x43, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x43, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x3d, 0x43, 0x2e, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, + 0x46, 0x49, 0x45, 0x52, 0x3d, 0x43, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, + 0x4f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, 0x74, 0x3d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x7b, 0x7d, 0x3b, 0x43, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, + 0x4f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x74, 0x3b, 0x43, 0x2e, + 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x46, 0x49, 0x45, 0x52, 0x3d, 0x2f, + 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x24, 0x5f, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, + 0x24, 0x5f, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x2f, 0x69, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x78, 0x65, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x67, 0x74, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, + 0x2c, 0x21, 0x43, 0x2e, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x46, 0x49, + 0x45, 0x52, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x65, 0x29, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x3d, 0x65, 0x7d, 0x74, 0x6f, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, + 0x7d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x7d, 0x67, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7b, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, + 0x72, 0x5d, 0x3a, 0x31, 0x7d, 0x7d, 0x7d, 0x3b, 0x43, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x3d, 0x78, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x65, + 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x73, 0x20, 0x67, 0x74, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x65, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, + 0x5b, 0x65, 0x5d, 0x3a, 0x65, 0x7d, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x7d, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x53, 0x74, 0x72, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x30, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x3d, + 0x3d, 0x22, 0x22, 0x7c, 0x7c, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x22, 0x22, + 0x27, 0x7d, 0x67, 0x65, 0x74, 0x20, 0x73, 0x74, 0x72, 0x28, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x74, 0x72, + 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x65, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x65, 0x3a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x74, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x72, 0x65, 0x64, + 0x75, 0x63, 0x65, 0x28, 0x28, 0x72, 0x2c, 0x73, 0x29, 0x3d, 0x3e, 0x60, + 0x24, 0x7b, 0x72, 0x7d, 0x24, 0x7b, 0x73, 0x7d, 0x60, 0x2c, 0x22, 0x22, + 0x29, 0x7d, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x28, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x26, 0x26, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3f, 0x65, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x28, 0x72, + 0x2c, 0x73, 0x29, 0x3d, 0x3e, 0x28, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x78, 0x65, 0x26, 0x26, 0x28, + 0x72, 0x5b, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x5d, 0x3d, 0x28, 0x72, 0x5b, + 0x73, 0x2e, 0x73, 0x74, 0x72, 0x5d, 0x7c, 0x7c, 0x30, 0x29, 0x2b, 0x31, + 0x29, 0x2c, 0x72, 0x29, 0x2c, 0x7b, 0x7d, 0x29, 0x7d, 0x7d, 0x3b, 0x43, + 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x63, 0x65, 0x3b, 0x43, 0x2e, + 0x6e, 0x69, 0x6c, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x28, 0x22, + 0x22, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x61, 0x28, 0x74, 0x2c, 0x2e, 0x2e, 0x2e, 0x65, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x72, 0x3d, 0x5b, 0x74, 0x5b, 0x30, 0x5d, 0x5d, 0x2c, + 0x73, 0x3d, 0x30, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x73, 0x3c, 0x65, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x29, 0x43, 0x72, 0x28, + 0x72, 0x2c, 0x65, 0x5b, 0x73, 0x5d, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x74, 0x5b, 0x2b, 0x2b, 0x73, 0x5d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, + 0x28, 0x72, 0x29, 0x7d, 0x43, 0x2e, 0x5f, 0x3d, 0x73, 0x61, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x41, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, + 0x28, 0x22, 0x2b, 0x22, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x28, 0x74, 0x2c, 0x2e, 0x2e, 0x2e, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x5b, 0x76, 0x74, 0x28, + 0x74, 0x5b, 0x30, 0x5d, 0x29, 0x5d, 0x2c, 0x73, 0x3d, 0x30, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x73, 0x3c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x29, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x41, + 0x72, 0x29, 0x2c, 0x43, 0x72, 0x28, 0x72, 0x2c, 0x65, 0x5b, 0x73, 0x5d, + 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x41, 0x72, 0x2c, + 0x76, 0x74, 0x28, 0x74, 0x5b, 0x2b, 0x2b, 0x73, 0x5d, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x63, 0x28, 0x72, 0x29, + 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x28, 0x72, 0x29, 0x7d, 0x43, + 0x2e, 0x73, 0x74, 0x72, 0x3d, 0x6e, 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x63, 0x65, 0x3f, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, + 0x3a, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x78, 0x65, 0x3f, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x65, 0x29, 0x3a, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x71, 0x63, + 0x28, 0x65, 0x29, 0x29, 0x7d, 0x43, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, + 0x64, 0x65, 0x41, 0x72, 0x67, 0x3d, 0x43, 0x72, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x63, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x65, 0x3c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x3b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x5b, 0x65, 0x5d, 0x3d, + 0x3d, 0x3d, 0x41, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, + 0x53, 0x63, 0x28, 0x74, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x2c, 0x74, 0x5b, + 0x65, 0x2b, 0x31, 0x5d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x74, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2d, 0x31, 0x2c, 0x33, 0x2c, + 0x72, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x7d, + 0x74, 0x5b, 0x65, 0x2b, 0x2b, 0x5d, 0x3d, 0x22, 0x2b, 0x22, 0x7d, 0x65, + 0x2b, 0x2b, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x53, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x22, 0x22, 0x27, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x3d, + 0x3d, 0x27, 0x22, 0x22, 0x27, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x78, 0x65, 0x7c, + 0x7c, 0x74, 0x5b, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x5d, 0x21, 0x3d, 0x3d, 0x27, 0x22, 0x27, 0x3f, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, + 0x21, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x60, + 0x24, 0x7b, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, + 0x2d, 0x31, 0x29, 0x7d, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x60, 0x3a, 0x65, + 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x27, 0x22, 0x27, 0x3f, 0x74, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x2d, 0x31, 0x29, 0x2b, + 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x26, 0x26, 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, + 0x27, 0x22, 0x27, 0x26, 0x26, 0x21, 0x28, 0x74, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x78, 0x65, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x22, 0x24, 0x7b, 0x74, 0x7d, + 0x24, 0x7b, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, + 0x7d, 0x60, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6a, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, + 0x72, 0x28, 0x29, 0x3f, 0x74, 0x3a, 0x74, 0x2e, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x53, 0x74, 0x72, 0x28, 0x29, 0x3f, 0x65, 0x3a, 0x6e, 0x61, 0x60, + 0x24, 0x7b, 0x74, 0x7d, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x7d, 0x43, 0x2e, + 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x3d, 0x6a, 0x63, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x63, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7c, 0x7c, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x7c, 0x7c, 0x74, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3f, 0x74, 0x3a, 0x76, 0x74, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, + 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x29, 0x3f, 0x74, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x3a, 0x74, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, + 0x63, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x28, 0x76, 0x74, 0x28, 0x74, 0x29, + 0x29, 0x7d, 0x43, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x3d, 0x4e, 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x76, 0x74, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x74, 0x29, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x75, 0x32, 0x30, 0x32, 0x38, + 0x2f, 0x67, 0x2c, 0x22, 0x5c, 0x5c, 0x75, 0x32, 0x30, 0x32, 0x38, 0x22, + 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, + 0x75, 0x32, 0x30, 0x32, 0x39, 0x2f, 0x67, 0x2c, 0x22, 0x5c, 0x5c, 0x75, + 0x32, 0x30, 0x32, 0x39, 0x22, 0x29, 0x7d, 0x43, 0x2e, 0x73, 0x61, 0x66, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x76, + 0x74, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, + 0x63, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x26, 0x26, 0x43, 0x2e, 0x49, 0x44, + 0x45, 0x4e, 0x54, 0x49, 0x46, 0x49, 0x45, 0x52, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x28, 0x74, 0x29, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x28, + 0x60, 0x2e, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x29, 0x3a, 0x73, 0x61, 0x60, + 0x5b, 0x24, 0x7b, 0x74, 0x7d, 0x5d, 0x60, 0x7d, 0x43, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x4f, 0x63, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x63, + 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x26, 0x26, 0x43, 0x2e, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x46, + 0x49, 0x45, 0x52, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, + 0x65, 0x28, 0x60, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x29, 0x3b, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x74, + 0x7d, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, + 0x63, 0x69, 0x74, 0x20, 0x24, 0x69, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x60, 0x29, 0x7d, 0x43, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x73, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x6b, 0x63, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x63, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, + 0x65, 0x28, 0x74, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x29, 0x29, 0x7d, 0x43, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, + 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x49, 0x63, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x56, 0x72, 0x3d, 0x70, 0x28, 0x72, 0x65, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x72, + 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x72, + 0x65, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x72, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x3d, 0x72, 0x65, 0x2e, 0x55, + 0x73, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x65, 0x3d, 0x42, 0x65, 0x28, 0x29, 0x2c, 0x44, 0x72, 0x3d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x73, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, + 0x6e, 0x3a, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x65, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x2c, 0x51, 0x74, 0x3b, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x5b, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x3d, 0x30, 0x5d, + 0x3d, 0x22, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x74, + 0x5b, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x3d, 0x31, 0x5d, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0x7d, 0x29, 0x28, 0x51, 0x74, 0x7c, 0x7c, 0x28, 0x72, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x3d, 0x51, 0x74, 0x3d, 0x7b, 0x7d, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, + 0x3d, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x22, 0x29, 0x2c, 0x6c, 0x65, 0x74, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6c, 0x65, + 0x74, 0x22, 0x29, 0x2c, 0x76, 0x61, 0x72, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x72, + 0x22, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x42, 0x74, 0x3d, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x73, 0x3a, 0x65, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, + 0x72, 0x7d, 0x3d, 0x7b, 0x7d, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, + 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x72, 0x7d, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, + 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x65, 0x3a, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7d, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x65, 0x77, 0x4e, + 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x29, 0x7d, 0x5f, 0x6e, 0x65, 0x77, + 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x65, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x24, 0x7b, 0x65, 0x7d, + 0x24, 0x7b, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2b, 0x2b, 0x7d, + 0x60, 0x7d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x73, 0x3b, + 0x69, 0x66, 0x28, 0x21, 0x28, 0x28, 0x73, 0x3d, 0x28, 0x72, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x72, 0x3d, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3a, 0x72, 0x2e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x73, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, + 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x26, + 0x26, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x65, 0x29, 0x7c, 0x7c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x73, 0x26, 0x26, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x65, + 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x6e, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x22, + 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x60, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x65, 0x5d, 0x3d, 0x7b, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, 0x65, 0x2c, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x3a, 0x30, 0x7d, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x2e, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x42, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x58, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, + 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x3d, 0x65, 0x7d, 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x65, 0x2c, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x3a, 0x72, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x73, 0x7d, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x28, 0x30, + 0x2c, 0x74, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x2e, 0x24, 0x7b, 0x6e, 0x65, + 0x77, 0x20, 0x74, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x72, 0x29, + 0x7d, 0x5b, 0x24, 0x7b, 0x73, 0x7d, 0x5d, 0x60, 0x7d, 0x7d, 0x3b, 0x72, + 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x58, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x52, 0x63, 0x3d, 0x28, 0x30, 0x2c, 0x74, 0x65, 0x2e, 0x5f, 0x29, 0x60, + 0x5c, 0x6e, 0x60, 0x2c, 0x7a, 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x42, 0x74, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x65, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3d, 0x7b, 0x2e, + 0x2e, 0x2e, 0x65, 0x2c, 0x5f, 0x6e, 0x3a, 0x65, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x3f, 0x52, 0x63, 0x3a, 0x74, 0x65, 0x2e, 0x6e, 0x69, 0x6c, + 0x7d, 0x7d, 0x67, 0x65, 0x74, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x7d, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x74, + 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x65, 0x77, + 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x66, 0x3d, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x72, 0x65, + 0x66, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, + 0x2c, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, 0x61, 0x7d, 0x3d, + 0x6e, 0x2c, 0x6f, 0x3d, 0x28, 0x73, 0x3d, 0x72, 0x2e, 0x6b, 0x65, 0x79, + 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x73, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x73, 0x3a, 0x72, + 0x2e, 0x72, 0x65, 0x66, 0x2c, 0x69, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x61, 0x5d, 0x3b, 0x69, + 0x66, 0x28, 0x69, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x3d, 0x69, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6f, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x61, 0x5d, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x4d, 0x61, 0x70, 0x3b, 0x69, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6f, + 0x2c, 0x6e, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x61, 0x5d, + 0x7c, 0x7c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x5b, 0x61, 0x5d, 0x3d, 0x5b, 0x5d, 0x29, 0x2c, 0x75, 0x3d, + 0x63, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x5b, 0x75, 0x5d, 0x3d, 0x72, 0x2e, 0x72, + 0x65, 0x66, 0x2c, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x72, 0x2c, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x3a, 0x61, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x75, 0x7d, 0x29, 0x2c, 0x6e, 0x7d, 0x67, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x65, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x73, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x72, 0x29, 0x7d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, + 0x66, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, 0x65, + 0x64, 0x75, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x72, + 0x2c, 0x73, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x73, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x43, 0x6f, + 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x22, 0x24, 0x7b, 0x73, 0x7d, 0x22, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, + 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x60, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x74, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x24, 0x7b, 0x73, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x60, 0x7d, 0x29, 0x7d, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x6e, 0x3d, 0x3e, + 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x60, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x2c, 0x72, + 0x2c, 0x73, 0x29, 0x7d, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x3d, + 0x7b, 0x7d, 0x2c, 0x6e, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, + 0x74, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x69, 0x3d, 0x65, 0x5b, 0x6f, 0x5d, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x69, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x73, 0x5b, 0x6f, 0x5d, 0x3d, + 0x73, 0x5b, 0x6f, 0x5d, 0x7c, 0x7c, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, + 0x70, 0x3b, 0x69, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x75, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x63, 0x2e, 0x68, 0x61, 0x73, + 0x28, 0x75, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, + 0x2e, 0x73, 0x65, 0x74, 0x28, 0x75, 0x2c, 0x51, 0x74, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x64, + 0x3d, 0x72, 0x28, 0x75, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x65, 0x73, 0x35, 0x3f, 0x72, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x3a, + 0x72, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x3b, 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x74, + 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x24, 0x7b, 0x6c, + 0x7d, 0x20, 0x24, 0x7b, 0x75, 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x64, + 0x7d, 0x3b, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x5f, 0x6e, 0x7d, 0x60, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x28, 0x64, 0x3d, 0x6e, 0x3f, 0x2e, 0x28, 0x75, 0x29, 0x29, + 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x74, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x61, 0x7d, 0x24, 0x7b, 0x64, 0x7d, 0x24, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x5f, 0x6e, 0x7d, 0x60, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x44, 0x72, 0x28, 0x75, 0x29, 0x3b, 0x63, 0x2e, 0x73, + 0x65, 0x74, 0x28, 0x75, 0x2c, 0x51, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x29, 0x7d, 0x29, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x7a, 0x72, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x3d, 0x70, 0x28, 0x4f, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x4f, 0x2e, 0x6f, 0x72, 0x3d, 0x4f, 0x2e, + 0x61, 0x6e, 0x64, 0x3d, 0x4f, 0x2e, 0x6e, 0x6f, 0x74, 0x3d, 0x4f, 0x2e, + 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3d, 0x4f, 0x2e, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x3d, 0x4f, 0x2e, 0x76, 0x61, + 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x3d, 0x4f, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x4f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x3d, 0x4f, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x4f, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x3d, 0x4f, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, + 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x4f, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x69, 0x66, 0x79, 0x3d, 0x4f, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x4f, 0x2e, 0x6e, 0x69, 0x6c, + 0x3d, 0x4f, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x3d, 0x4f, 0x2e, 0x73, 0x74, 0x72, 0x3d, 0x4f, 0x2e, 0x5f, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x3d, + 0x42, 0x65, 0x28, 0x29, 0x2c, 0x66, 0x65, 0x3d, 0x56, 0x72, 0x28, 0x29, + 0x2c, 0x4e, 0x65, 0x3d, 0x42, 0x65, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x5f, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x5f, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x73, + 0x74, 0x72, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, + 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x7d, + 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x4f, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x6e, 0x69, 0x6c, + 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x7d, 0x29, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, + 0x2c, 0x22, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x22, 0x2c, 0x7b, 0x65, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, + 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, + 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x7d, + 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x4f, 0x2c, 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, + 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x72, 0x65, 0x67, 0x65, + 0x78, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x65, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x72, 0x3d, + 0x56, 0x72, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x72, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x7d, + 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x4f, 0x2c, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, 0x22, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x2c, + 0x22, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x22, 0x2c, 0x7b, + 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, + 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x72, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x7d, + 0x7d, 0x29, 0x3b, 0x4f, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x3d, 0x7b, 0x47, 0x54, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, + 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x3e, 0x22, 0x29, 0x2c, + 0x47, 0x54, 0x45, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, + 0x6f, 0x64, 0x65, 0x28, 0x22, 0x3e, 0x3d, 0x22, 0x29, 0x2c, 0x4c, 0x54, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x22, 0x3c, 0x22, 0x29, 0x2c, 0x4c, 0x54, 0x45, 0x3a, 0x6e, 0x65, + 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x3c, + 0x3d, 0x22, 0x29, 0x2c, 0x45, 0x51, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, + 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x3d, 0x3d, 0x3d, 0x22, + 0x29, 0x2c, 0x4e, 0x45, 0x51, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, + 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x21, 0x3d, 0x3d, 0x22, 0x29, + 0x2c, 0x4e, 0x4f, 0x54, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, + 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x21, 0x22, 0x29, 0x2c, 0x4f, 0x52, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x22, 0x7c, 0x7c, 0x22, 0x29, 0x2c, 0x41, 0x4e, 0x44, 0x3a, 0x6e, + 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, + 0x26, 0x26, 0x22, 0x29, 0x2c, 0x41, 0x44, 0x44, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x2b, 0x22, + 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x50, 0x65, 0x3d, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x7b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x7d, 0x7d, 0x2c, 0x78, 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x50, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, + 0x4b, 0x69, 0x6e, 0x64, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x68, 0x73, 0x3d, 0x73, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x7b, 0x65, 0x73, 0x35, 0x3a, 0x65, 0x2c, 0x5f, 0x6e, 0x3a, 0x72, + 0x7d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x65, 0x3f, 0x66, + 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x61, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x4b, + 0x69, 0x6e, 0x64, 0x2c, 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x68, 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x22, 0x22, 0x3a, 0x60, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x68, 0x73, 0x7d, 0x60, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x60, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x24, 0x7b, 0x6e, 0x7d, + 0x3b, 0x60, 0x2b, 0x72, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x65, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x26, + 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x3d, 0x65, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, + 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, + 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x4f, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x7d, 0x2c, 0x65, + 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x73, 0x20, 0x50, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, + 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6c, 0x68, 0x73, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x68, 0x73, 0x3d, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x69, 0x64, 0x65, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, + 0x3d, 0x73, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x5f, + 0x6e, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x60, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x68, 0x73, 0x7d, + 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, + 0x73, 0x7d, 0x3b, 0x60, 0x2b, 0x65, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x68, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x26, 0x26, 0x21, + 0x65, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x68, 0x73, 0x2e, 0x73, + 0x74, 0x72, 0x5d, 0x26, 0x26, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x69, 0x64, 0x65, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x68, 0x73, 0x3d, 0x65, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x68, 0x73, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x7d, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x68, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x7b, + 0x7d, 0x3a, 0x7b, 0x2e, 0x2e, 0x2e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x68, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x7d, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x72, 0x28, 0x65, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x29, 0x7d, 0x7d, 0x2c, 0x4b, 0x72, + 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x73, 0x20, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, + 0x6e, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x65, 0x2c, 0x73, + 0x2c, 0x6e, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x3d, + 0x72, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x5f, 0x6e, + 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, + 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x68, 0x73, 0x7d, 0x20, + 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x7d, 0x3d, 0x20, + 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x68, 0x73, 0x7d, 0x3b, + 0x60, 0x2b, 0x65, 0x7d, 0x7d, 0x2c, 0x55, 0x72, 0x3d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x50, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, + 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, + 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x3d, 0x7b, 0x7d, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, + 0x5f, 0x6e, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x60, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x7d, 0x3a, 0x60, 0x2b, 0x65, 0x7d, 0x7d, 0x2c, 0x46, 0x72, + 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x73, 0x20, 0x50, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x7b, 0x7d, 0x7d, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x28, 0x7b, 0x5f, 0x6e, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x24, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3f, + 0x60, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x7d, 0x60, 0x3a, 0x22, 0x22, 0x7d, 0x3b, 0x60, 0x2b, 0x65, + 0x7d, 0x7d, 0x2c, 0x4c, 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x50, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, + 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x65, 0x7d, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x5f, 0x6e, 0x3a, 0x65, 0x7d, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x7d, 0x3b, 0x60, 0x2b, 0x65, 0x7d, 0x67, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x7d, 0x7d, 0x2c, 0x48, + 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x73, 0x20, 0x50, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x3d, 0x65, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x7b, 0x5f, 0x6e, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x60, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x7d, 0x3b, 0x60, 0x2b, 0x65, 0x7d, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x24, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x60, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x3d, 0x65, 0x74, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, + 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x4f, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x7d, 0x2c, + 0x62, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x73, 0x20, 0x50, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x5b, 0x5d, + 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x3d, 0x65, 0x7d, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x28, 0x72, + 0x2c, 0x73, 0x29, 0x3d, 0x3e, 0x72, 0x2b, 0x73, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x2c, 0x22, 0x22, 0x29, 0x7d, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x3a, 0x65, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x72, 0x3d, 0x65, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x72, 0x2d, 0x2d, 0x3b, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, + 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x73, 0x29, 0x3f, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x72, 0x2c, 0x31, 0x2c, 0x2e, 0x2e, 0x2e, 0x73, 0x29, 0x3a, 0x73, 0x3f, + 0x65, 0x5b, 0x72, 0x5d, 0x3d, 0x73, 0x3a, 0x65, 0x2e, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x72, 0x2c, 0x31, 0x29, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3e, 0x30, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x3a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x3a, 0x73, 0x7d, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x3d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x6e, 0x2d, 0x2d, 0x3b, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x73, 0x5b, 0x6e, 0x5d, + 0x3b, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7c, 0x7c, 0x28, + 0x54, 0x63, 0x28, 0x65, 0x2c, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x29, 0x2c, 0x73, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, + 0x2c, 0x31, 0x29, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x3f, 0x74, + 0x68, 0x69, 0x73, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x67, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x3d, 0x3e, 0x46, 0x65, 0x28, 0x65, 0x2c, + 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x2c, 0x7b, 0x7d, 0x29, + 0x7d, 0x7d, 0x2c, 0x53, 0x65, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x62, 0x74, 0x7b, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x7b, 0x22, 0x2b, 0x65, 0x2e, 0x5f, 0x6e, 0x2b, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x65, 0x29, 0x2b, 0x22, 0x7d, 0x22, 0x2b, 0x65, 0x2e, 0x5f, 0x6e, + 0x7d, 0x7d, 0x2c, 0x47, 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x62, 0x74, 0x7b, 0x7d, + 0x2c, 0x58, 0x65, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x65, 0x7b, 0x7d, 0x3b, 0x58, + 0x65, 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x65, 0x6c, 0x73, 0x65, + 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x3d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x74, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, + 0x20, 0x53, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x65, 0x7d, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x3d, 0x60, 0x69, 0x66, 0x28, 0x24, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, + 0x29, 0x60, 0x2b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x26, + 0x26, 0x28, 0x72, 0x2b, 0x3d, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x22, + 0x2b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x72, 0x7d, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x28, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x69, + 0x66, 0x28, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x72, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, + 0x3b, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, + 0x3d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x28, 0x73, 0x29, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x65, + 0x28, 0x73, 0x29, 0x3a, 0x73, 0x7d, 0x69, 0x66, 0x28, 0x72, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x31, + 0x3f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x74, 0x3f, 0x72, 0x3a, 0x72, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x68, 0x69, 0x73, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x28, 0x61, 0x61, 0x28, 0x65, 0x29, + 0x2c, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x74, 0x3f, 0x5b, 0x72, 0x5d, 0x3a, 0x72, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x65, 0x3d, + 0x3d, 0x3d, 0x21, 0x31, 0x7c, 0x7c, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, + 0x6c, 0x73, 0x65, 0x3d, 0x28, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x65, 0x6c, 0x73, 0x65, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x7c, 0x7c, 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x21, 0x21, 0x28, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7c, 0x7c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x65, 0x74, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x65, 0x3d, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x72, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x26, 0x26, 0x46, 0x65, 0x28, 0x65, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x29, 0x2c, 0x65, 0x7d, 0x7d, 0x3b, 0x4b, 0x65, + 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x69, 0x66, 0x22, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x55, 0x65, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x65, 0x7b, 0x7d, + 0x3b, 0x55, 0x65, 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x66, 0x6f, + 0x72, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4a, 0x72, 0x3d, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, + 0x55, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x65, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, + 0x66, 0x6f, 0x72, 0x28, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x29, 0x60, 0x2b, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x65, 0x29, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x65, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x46, 0x65, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, + 0x7d, 0x7d, 0x2c, 0x57, 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x55, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, + 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, + 0x4b, 0x69, 0x6e, 0x64, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x66, 0x72, 0x6f, 0x6d, 0x3d, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x74, 0x6f, 0x3d, 0x6e, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, + 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x65, 0x2e, 0x65, + 0x73, 0x35, 0x3f, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x2c, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x3a, 0x73, 0x2c, 0x66, 0x72, 0x6f, 0x6d, 0x3a, 0x6e, 0x2c, 0x74, + 0x6f, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x60, 0x66, 0x6f, 0x72, 0x28, 0x24, 0x7b, 0x72, + 0x7d, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x3d, 0x24, 0x7b, 0x6e, 0x7d, 0x3b, + 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x3c, 0x24, 0x7b, 0x61, 0x7d, 0x3b, 0x20, + 0x24, 0x7b, 0x73, 0x7d, 0x2b, 0x2b, 0x29, 0x60, 0x2b, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, + 0x7d, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x72, 0x72, 0x28, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x72, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x74, 0x6f, 0x29, 0x7d, 0x7d, 0x2c, 0x74, 0x72, 0x3d, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, + 0x20, 0x55, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, 0x29, + 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x3d, 0x72, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x73, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x3d, 0x6e, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x66, 0x6f, 0x72, + 0x28, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x4b, + 0x69, 0x6e, 0x64, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x7d, 0x29, + 0x60, 0x2b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x3d, 0x65, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x46, 0x65, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x7d, + 0x7d, 0x2c, 0x77, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x65, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x65, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x3d, 0x72, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3d, + 0x73, 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x24, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3f, 0x22, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x20, 0x22, 0x3a, 0x22, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x72, 0x67, 0x73, 0x7d, 0x29, 0x60, 0x2b, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, + 0x7d, 0x7d, 0x3b, 0x77, 0x74, 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x74, + 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x73, 0x20, 0x62, 0x74, 0x7b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2b, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7d, + 0x7d, 0x3b, 0x45, 0x74, 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x59, + 0x72, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x73, 0x20, 0x53, 0x65, 0x7b, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x22, + 0x74, 0x72, 0x79, 0x22, 0x2b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x74, + 0x63, 0x68, 0x26, 0x26, 0x28, 0x72, 0x2b, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, + 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x26, 0x26, 0x28, 0x72, 0x2b, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x29, 0x2c, + 0x72, 0x7d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, + 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, 0x2c, 0x28, 0x65, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x29, 0x3d, 0x3d, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x65, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x65, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, 0x2c, + 0x28, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, + 0x7c, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, + 0x7c, 0x72, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, + 0x2c, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x28, + 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, + 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x73, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x28, 0x6e, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x29, 0x3d, + 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x6e, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x6e, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x65, 0x3d, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x26, 0x26, 0x46, + 0x65, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x74, + 0x63, 0x68, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x26, 0x26, + 0x46, 0x65, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, + 0x2c, 0x65, 0x7d, 0x7d, 0x2c, 0x50, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x65, + 0x7d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x7d, 0x29, 0x60, 0x2b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x7d, 0x3b, 0x50, 0x74, + 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x63, 0x61, 0x74, 0x63, 0x68, + 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x53, 0x74, 0x3d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x53, + 0x65, 0x7b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x22, 0x2b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x7d, 0x3b, 0x53, 0x74, + 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x3d, 0x22, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, 0x72, 0x3d, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x3d, 0x7b, 0x7d, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x73, 0x3d, 0x5b, + 0x5d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3d, 0x7b, 0x2e, 0x2e, 0x2e, 0x72, + 0x2c, 0x5f, 0x6e, 0x3a, 0x72, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3f, + 0x60, 0x0a, 0x60, 0x3a, 0x22, 0x22, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x65, 0x78, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3d, 0x65, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x66, 0x65, 0x2e, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x65, 0x7d, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x3d, 0x5b, 0x6e, 0x65, 0x77, 0x20, 0x47, 0x72, 0x5d, 0x7d, 0x74, + 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x7d, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, + 0x78, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x65, 0x29, 0x7d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x78, 0x74, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x65, + 0x2c, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, + 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5d, 0x7c, 0x7c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x5b, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5d, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x29, 0x29, 0x2e, 0x61, 0x64, 0x64, + 0x28, 0x73, 0x29, 0x2c, 0x73, 0x7d, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x65, 0x78, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x67, + 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x66, 0x73, 0x28, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x65, 0x78, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x66, 0x73, 0x28, 0x65, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x29, 0x7d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x65, 0x78, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x7d, + 0x5f, 0x64, 0x65, 0x66, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x74, 0x6f, 0x4e, 0x61, + 0x6d, 0x65, 0x28, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, + 0x26, 0x6e, 0x26, 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x5b, 0x61, 0x2e, 0x73, + 0x74, 0x72, 0x5d, 0x3d, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, + 0x77, 0x20, 0x78, 0x72, 0x28, 0x65, 0x2c, 0x61, 0x2c, 0x73, 0x29, 0x29, + 0x2c, 0x61, 0x7d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x64, 0x65, 0x66, 0x28, 0x66, 0x65, 0x2e, + 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7d, 0x6c, 0x65, + 0x74, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x64, 0x65, + 0x66, 0x28, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, + 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, + 0x7d, 0x76, 0x61, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x64, 0x65, 0x66, 0x28, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, + 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x29, 0x7d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x65, + 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, + 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x65, 0x72, 0x28, 0x65, + 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x29, 0x7d, 0x61, 0x64, 0x64, 0x28, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, + 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x4b, 0x72, 0x28, 0x65, 0x2c, 0x4f, + 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x41, + 0x44, 0x44, 0x2c, 0x72, 0x29, 0x29, 0x7d, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x65, 0x28, 0x29, 0x3a, 0x65, + 0x21, 0x3d, 0x3d, 0x4d, 0x2e, 0x6e, 0x69, 0x6c, 0x26, 0x26, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, 0x65, + 0x28, 0x6e, 0x65, 0x77, 0x20, 0x48, 0x72, 0x28, 0x65, 0x29, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, + 0x2e, 0x2e, 0x2e, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, + 0x5b, 0x22, 0x7b, 0x22, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, + 0x74, 0x5b, 0x73, 0x2c, 0x6e, 0x5d, 0x6f, 0x66, 0x20, 0x65, 0x29, 0x72, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x26, 0x26, 0x72, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x2c, 0x72, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x29, 0x2c, 0x28, 0x73, 0x21, + 0x3d, 0x3d, 0x6e, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x65, 0x73, 0x35, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x2c, 0x28, 0x30, + 0x2c, 0x4d, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x72, + 0x67, 0x29, 0x28, 0x72, 0x2c, 0x6e, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x7d, 0x22, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, 0x43, + 0x6f, 0x64, 0x65, 0x28, 0x72, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x65, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, + 0x6e, 0x65, 0x77, 0x20, 0x4b, 0x65, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x72, + 0x26, 0x26, 0x73, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x28, 0x72, 0x29, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x2e, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x29, 0x2e, 0x65, 0x6e, 0x64, 0x49, + 0x66, 0x28, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x72, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x72, 0x29, 0x2e, 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x73, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x27, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x22, + 0x65, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x22, 0x74, 0x68, 0x65, 0x6e, + 0x22, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x49, 0x66, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x6c, 0x73, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x4b, 0x65, 0x28, + 0x65, 0x29, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x65, 0x6c, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, + 0x20, 0x58, 0x65, 0x29, 0x7d, 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, + 0x64, 0x65, 0x28, 0x4b, 0x65, 0x2c, 0x58, 0x65, 0x29, 0x7d, 0x5f, 0x66, + 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x2c, 0x72, 0x26, + 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, + 0x29, 0x2e, 0x65, 0x6e, 0x64, 0x46, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x4a, 0x72, + 0x28, 0x65, 0x29, 0x2c, 0x72, 0x29, 0x7d, 0x66, 0x6f, 0x72, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, 0x2c, + 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x65, 0x73, 0x35, 0x3f, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x3a, 0x66, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x74, 0x6f, 0x4e, 0x61, 0x6d, + 0x65, 0x28, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x65, + 0x77, 0x20, 0x57, 0x72, 0x28, 0x61, 0x2c, 0x6f, 0x2c, 0x72, 0x2c, 0x73, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x6e, 0x28, 0x6f, 0x29, 0x29, 0x7d, + 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, + 0x6e, 0x3d, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, + 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x65, 0x73, 0x35, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6f, + 0x3d, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x4d, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x72, 0x3a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, 0x5f, 0x61, 0x72, + 0x72, 0x22, 0x2c, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x28, 0x22, 0x5f, 0x69, 0x22, 0x2c, 0x30, 0x2c, 0x28, 0x30, + 0x2c, 0x4d, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x2c, 0x69, 0x3d, 0x3e, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x61, 0x2c, 0x28, 0x30, + 0x2c, 0x4d, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x5b, 0x24, + 0x7b, 0x69, 0x7d, 0x5d, 0x60, 0x29, 0x2c, 0x73, 0x28, 0x61, 0x29, 0x7d, + 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x74, + 0x72, 0x28, 0x22, 0x6f, 0x66, 0x22, 0x2c, 0x6e, 0x2c, 0x61, 0x2c, 0x72, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x73, 0x28, 0x61, 0x29, 0x29, 0x7d, + 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, + 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x65, 0x73, 0x35, 0x3f, 0x66, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x4b, 0x69, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x3a, 0x66, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, + 0x65, 0x2c, 0x28, 0x30, 0x2c, 0x4d, 0x2e, 0x5f, 0x29, 0x60, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x24, 0x7b, + 0x72, 0x7d, 0x29, 0x60, 0x2c, 0x73, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x65, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x72, 0x28, + 0x22, 0x69, 0x6e, 0x22, 0x2c, 0x6e, 0x2c, 0x61, 0x2c, 0x72, 0x29, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x73, 0x28, 0x61, 0x29, 0x29, 0x7d, 0x65, 0x6e, + 0x64, 0x46, 0x6f, 0x72, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x6e, 0x64, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x55, 0x65, 0x29, + 0x7d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, + 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, + 0x55, 0x72, 0x28, 0x65, 0x29, 0x29, 0x7d, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, + 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x72, 0x28, 0x65, 0x29, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x74, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x2c, 0x72, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x21, 0x3d, 0x3d, 0x31, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x43, + 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x27, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x45, 0x74, 0x29, 0x7d, 0x74, 0x72, + 0x79, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x21, 0x72, 0x26, 0x26, 0x21, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, + 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x22, 0x74, 0x72, + 0x79, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x22, + 0x63, 0x61, 0x74, 0x63, 0x68, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x27, 0x29, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x59, 0x72, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x2c, 0x72, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x65, 0x22, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, + 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x50, 0x74, 0x28, 0x61, 0x29, 0x2c, 0x72, 0x28, 0x61, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x26, 0x26, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x3d, 0x6e, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x74, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x29, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x50, 0x74, 0x2c, 0x53, 0x74, 0x29, 0x7d, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x65, + 0x61, 0x66, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x4c, + 0x72, 0x28, 0x65, 0x29, 0x29, 0x7d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2c, 0x65, 0x26, 0x26, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x2e, 0x65, + 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x72, 0x29, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x7d, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x73, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, + 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x72, 0x3b, 0x69, + 0x66, 0x28, 0x73, 0x3c, 0x30, 0x7c, 0x7c, 0x65, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x73, 0x21, 0x3d, 0x3d, 0x65, + 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, + 0x6e, 0x3a, 0x20, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x76, 0x73, 0x20, 0x24, 0x7b, + 0x65, 0x7d, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x60, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3d, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x28, 0x65, 0x2c, 0x72, 0x3d, 0x4d, 0x2e, 0x6e, 0x69, + 0x6c, 0x2c, 0x73, 0x2c, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x77, 0x74, + 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x29, 0x2c, 0x6e, 0x26, 0x26, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, + 0x2e, 0x65, 0x6e, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x28, 0x29, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x7d, 0x65, 0x6e, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x6f, 0x64, 0x65, 0x28, 0x77, 0x74, 0x29, 0x7d, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x28, 0x65, 0x3d, 0x31, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x65, 0x2d, 0x2d, 0x20, 0x3e, 0x30, 0x3b, 0x29, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x28, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, + 0x7d, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x7d, 0x5f, 0x65, + 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, + 0x65, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x7c, 0x7c, 0x72, 0x26, 0x26, + 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, + 0x20, 0x72, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x70, 0x6f, + 0x70, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x3b, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x22, 0x24, 0x7b, 0x72, 0x3f, 0x60, 0x24, 0x7b, 0x65, 0x2e, 0x6b, 0x69, + 0x6e, 0x64, 0x7d, 0x2f, 0x24, 0x7b, 0x72, 0x2e, 0x6b, 0x69, 0x6e, 0x64, + 0x7d, 0x60, 0x3a, 0x65, 0x2e, 0x6b, 0x69, 0x6e, 0x64, 0x7d, 0x22, 0x60, + 0x29, 0x7d, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x28, + 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x3b, + 0x69, 0x66, 0x28, 0x21, 0x28, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4b, 0x65, 0x29, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x27, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3a, 0x20, + 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x22, 0x69, 0x66, 0x22, 0x27, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x72, 0x2e, 0x65, 0x6c, + 0x73, 0x65, 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x67, 0x65, + 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x7d, 0x67, 0x65, 0x74, 0x20, + 0x5f, 0x63, 0x75, 0x72, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x5b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x5d, 0x7d, 0x73, 0x65, 0x74, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x3b, 0x72, 0x5b, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2d, 0x31, 0x5d, 0x3d, 0x65, 0x7d, 0x7d, 0x3b, 0x4f, 0x2e, 0x43, 0x6f, + 0x64, 0x65, 0x47, 0x65, 0x6e, 0x3d, 0x5a, 0x72, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x65, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x65, 0x29, 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x28, 0x74, + 0x5b, 0x72, 0x5d, 0x7c, 0x7c, 0x30, 0x29, 0x2b, 0x28, 0x65, 0x5b, 0x72, + 0x5d, 0x7c, 0x7c, 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x4f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x46, 0x65, 0x28, 0x74, 0x2c, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x3a, 0x74, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x74, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x28, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x28, 0x74, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x2e, 0x5f, + 0x43, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x28, 0x61, 0x2c, + 0x6f, 0x29, 0x3d, 0x3e, 0x28, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x26, 0x26, 0x28, 0x6f, 0x3d, 0x73, 0x28, 0x6f, 0x29, 0x29, 0x2c, 0x6f, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, + 0x4d, 0x2e, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x3f, 0x61, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x6f, 0x2e, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x29, 0x3a, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6f, + 0x29, 0x2c, 0x61, 0x29, 0x2c, 0x5b, 0x5d, 0x29, 0x29, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x61, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x72, 0x5b, 0x61, 0x2e, 0x73, 0x74, + 0x72, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x65, 0x5b, + 0x61, 0x2e, 0x73, 0x74, 0x72, 0x5d, 0x21, 0x3d, 0x3d, 0x31, 0x3f, 0x61, + 0x3a, 0x28, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x65, 0x5b, 0x61, + 0x2e, 0x73, 0x74, 0x72, 0x5d, 0x2c, 0x6f, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x61, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x5f, 0x43, 0x6f, + 0x64, 0x65, 0x26, 0x26, 0x61, 0x2e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x6f, 0x3d, 0x3e, 0x6f, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x26, 0x26, 0x65, 0x5b, 0x6f, 0x2e, 0x73, 0x74, + 0x72, 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x26, 0x26, 0x72, 0x5b, 0x6f, 0x2e, + 0x73, 0x74, 0x72, 0x5d, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x54, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, + 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x28, 0x74, 0x5b, 0x72, 0x5d, 0x7c, 0x7c, + 0x30, 0x29, 0x2d, 0x28, 0x65, 0x5b, 0x72, 0x5d, 0x7c, 0x7c, 0x30, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x61, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x7c, 0x7c, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x7c, 0x7c, 0x74, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3f, 0x21, 0x74, 0x3a, 0x28, 0x30, 0x2c, 0x4d, 0x2e, 0x5f, 0x29, 0x60, + 0x21, 0x24, 0x7b, 0x51, 0x72, 0x28, 0x74, 0x29, 0x7d, 0x60, 0x7d, 0x4f, + 0x2e, 0x6e, 0x6f, 0x74, 0x3d, 0x61, 0x61, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x4d, 0x63, 0x3d, 0x6f, 0x61, 0x28, 0x4f, 0x2e, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x41, 0x4e, 0x44, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x63, 0x28, 0x2e, + 0x2e, 0x2e, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x4d, 0x63, 0x29, + 0x7d, 0x4f, 0x2e, 0x61, 0x6e, 0x64, 0x3d, 0x41, 0x63, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x43, 0x63, 0x3d, 0x6f, 0x61, 0x28, 0x4f, 0x2e, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4f, 0x52, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x63, 0x28, + 0x2e, 0x2e, 0x2e, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x43, 0x63, + 0x29, 0x7d, 0x4f, 0x2e, 0x6f, 0x72, 0x3d, 0x44, 0x63, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x61, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x3d, 0x3e, 0x65, 0x3d, 0x3d, 0x3d, 0x4d, 0x2e, 0x6e, 0x69, 0x6c, 0x3f, + 0x72, 0x3a, 0x72, 0x3d, 0x3d, 0x3d, 0x4d, 0x2e, 0x6e, 0x69, 0x6c, 0x3f, + 0x65, 0x3a, 0x28, 0x30, 0x2c, 0x4d, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x51, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x20, + 0x24, 0x7b, 0x51, 0x72, 0x28, 0x72, 0x29, 0x7d, 0x60, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x72, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4d, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x3f, 0x74, 0x3a, 0x28, 0x30, 0x2c, 0x4d, 0x2e, 0x5f, + 0x29, 0x60, 0x28, 0x24, 0x7b, 0x74, 0x7d, 0x29, 0x60, 0x7d, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x49, 0x3d, 0x70, 0x28, 0x6b, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x6b, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x6b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x6b, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x3d, + 0x6b, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x6b, 0x2e, 0x75, 0x73, 0x65, + 0x46, 0x75, 0x6e, 0x63, 0x3d, 0x6b, 0x2e, 0x73, 0x65, 0x74, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3d, 0x6b, 0x2e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x73, + 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x6b, 0x2e, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3d, + 0x6b, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x3d, 0x6b, + 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x4a, 0x73, 0x6f, + 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x6b, 0x2e, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x6b, 0x2e, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x6b, 0x2e, + 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x6b, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x66, 0x4f, 0x72, 0x56, 0x61, 0x6c, 0x3d, 0x6b, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x6b, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x3d, 0x6b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x3d, 0x6b, 0x2e, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x6b, 0x2e, 0x74, 0x6f, 0x48, 0x61, + 0x73, 0x68, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x4b, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x7a, 0x63, 0x3d, 0x42, + 0x65, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x56, 0x63, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, + 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x29, 0x65, 0x5b, 0x72, 0x5d, 0x3d, + 0x21, 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, + 0x6b, 0x2e, 0x74, 0x6f, 0x48, 0x61, 0x73, 0x68, 0x3d, 0x56, 0x63, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x63, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x3f, 0x65, 0x3a, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x65, 0x29, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x3f, + 0x21, 0x30, 0x3a, 0x28, 0x75, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, + 0x21, 0x64, 0x61, 0x28, 0x65, 0x2c, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, 0x61, 0x6c, 0x6c, 0x29, 0x29, + 0x7d, 0x6b, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x78, 0x63, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x61, 0x28, + 0x74, 0x2c, 0x65, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x72, + 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x7c, 0x7c, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x6e, 0x3d, 0x73, 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, + 0x6e, 0x5b, 0x61, 0x5d, 0x7c, 0x7c, 0x6d, 0x61, 0x28, 0x74, 0x2c, 0x60, + 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x20, 0x22, 0x24, 0x7b, 0x61, 0x7d, 0x22, 0x60, + 0x29, 0x7d, 0x6b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x3d, 0x75, 0x61, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x61, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x29, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x72, 0x5d, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x7d, 0x6b, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x3d, + 0x64, 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4b, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x21, 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x69, 0x66, 0x28, 0x72, 0x21, + 0x3d, 0x3d, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x26, 0x26, 0x65, 0x2e, + 0x61, 0x6c, 0x6c, 0x5b, 0x72, 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x21, 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, + 0x7d, 0x6b, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, 0x65, 0x66, 0x3d, + 0x4b, 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x55, 0x63, 0x28, 0x7b, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x66, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x65, 0x7d, 0x2c, 0x72, 0x2c, 0x73, + 0x2c, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7c, 0x7c, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x4b, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x60, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x74, 0x7d, 0x24, 0x7b, 0x65, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, + 0x4b, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x29, 0x28, 0x73, 0x29, 0x7d, 0x60, 0x7d, 0x6b, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x4f, 0x72, 0x56, 0x61, 0x6c, + 0x3d, 0x55, 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x46, 0x63, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6c, 0x61, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x55, + 0x52, 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, + 0x74, 0x29, 0x29, 0x7d, 0x6b, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x46, + 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, + 0x63, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x58, 0x72, 0x28, 0x74, 0x29, + 0x29, 0x7d, 0x6b, 0x2e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x4c, 0x63, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x72, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x3f, 0x60, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x3a, 0x74, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x2f, 0x67, + 0x2c, 0x22, 0x7e, 0x30, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x2f, 0x2f, 0x67, 0x2c, 0x22, 0x7e, 0x31, + 0x22, 0x29, 0x7d, 0x6b, 0x2e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x4a, + 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x58, + 0x72, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, + 0x61, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, + 0x31, 0x2f, 0x67, 0x2c, 0x22, 0x2f, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x30, 0x2f, 0x67, 0x2c, 0x22, + 0x7e, 0x22, 0x29, 0x7d, 0x6b, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x6c, 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x48, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x28, 0x74, 0x29, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x29, 0x65, 0x28, 0x72, + 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x65, 0x28, 0x74, 0x29, 0x7d, + 0x6b, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x3d, 0x48, + 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x61, 0x28, 0x7b, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x3a, 0x74, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x4e, + 0x61, 0x6d, 0x65, 0x3a, 0x65, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x72, 0x2c, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x7d, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2c, 0x61, 0x2c, + 0x6f, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, + 0x3d, 0x6f, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x61, 0x3a, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x6f, 0x66, 0x20, 0x4b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x28, 0x61, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, + 0x4b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, 0x74, 0x28, 0x6e, 0x2c, 0x61, + 0x2c, 0x6f, 0x29, 0x3a, 0x65, 0x28, 0x6e, 0x2c, 0x61, 0x2c, 0x6f, 0x29, + 0x2c, 0x6f, 0x29, 0x3a, 0x61, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, + 0x28, 0x65, 0x28, 0x6e, 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x2c, 0x61, 0x29, + 0x3a, 0x72, 0x28, 0x61, 0x2c, 0x6f, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x3d, 0x3d, 0x3d, 0x4b, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x26, 0x26, 0x21, 0x28, 0x63, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x29, 0x3f, 0x73, 0x28, 0x6e, 0x2c, 0x63, 0x29, 0x3a, 0x63, 0x7d, 0x7d, + 0x6b, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x3d, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3a, + 0x69, 0x61, 0x28, 0x7b, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x21, + 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x60, 0x2c, 0x28, + 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x72, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x72, 0x2c, 0x28, 0x30, 0x2c, + 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x60, 0x29, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, + 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x24, 0x7b, 0x72, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x29, 0x60, 0x29, 0x29, 0x7d, + 0x29, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x4e, 0x61, 0x6d, + 0x65, 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3d, 0x3e, 0x74, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x65, 0x3d, 0x3d, 0x3d, + 0x21, 0x30, 0x3f, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x72, 0x2c, 0x21, 0x30, 0x29, 0x3a, 0x28, 0x74, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x72, 0x2c, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, + 0x60, 0x29, 0x2c, 0x65, 0x73, 0x28, 0x74, 0x2c, 0x72, 0x2c, 0x65, 0x29, + 0x29, 0x7d, 0x29, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3d, 0x3e, 0x74, + 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x21, 0x30, 0x3a, 0x7b, 0x2e, 0x2e, + 0x2e, 0x74, 0x2c, 0x2e, 0x2e, 0x2e, 0x65, 0x7d, 0x2c, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x66, 0x61, + 0x7d, 0x29, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x69, 0x61, 0x28, + 0x7b, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x72, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x26, 0x26, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x2c, 0x28, + 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x72, 0x2c, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x65, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x3f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x72, + 0x7d, 0x20, 0x3e, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x3f, 0x20, 0x24, + 0x7b, 0x72, 0x7d, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x29, + 0x29, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x4e, 0x61, 0x6d, + 0x65, 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3d, 0x3e, 0x74, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x72, 0x2c, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, + 0x3f, 0x21, 0x30, 0x3a, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x3e, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, + 0x3f, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x65, + 0x7d, 0x60, 0x29, 0x29, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3d, 0x3e, + 0x74, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x21, 0x30, 0x3a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, + 0x3a, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x76, 0x61, + 0x72, 0x28, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x65, 0x29, + 0x7d, 0x29, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x22, 0x2c, 0x21, 0x30, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, + 0x7b, 0x7d, 0x60, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, + 0x65, 0x73, 0x28, 0x74, 0x2c, 0x72, 0x2c, 0x65, 0x29, 0x2c, 0x72, 0x7d, + 0x6b, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, + 0x72, 0x6f, 0x70, 0x73, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x66, + 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x72, 0x29, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, 0x3d, 0x3e, 0x74, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x4b, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x24, 0x7b, 0x28, 0x30, + 0x2c, 0x4b, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x29, 0x28, 0x73, 0x29, 0x7d, 0x60, 0x2c, 0x21, 0x30, 0x29, + 0x29, 0x7d, 0x6b, 0x2e, 0x73, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x3d, 0x65, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x63, 0x61, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x47, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x65, 0x2c, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x63, 0x61, 0x5b, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5d, + 0x7c, 0x7c, 0x28, 0x63, 0x61, 0x5b, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x5d, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x7a, 0x63, 0x2e, 0x5f, 0x43, 0x6f, + 0x64, 0x65, 0x28, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x7d, + 0x29, 0x7d, 0x6b, 0x2e, 0x75, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x3d, + 0x47, 0x63, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x42, 0x72, 0x3b, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, + 0x5b, 0x74, 0x2e, 0x4e, 0x75, 0x6d, 0x3d, 0x30, 0x5d, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x22, 0x2c, 0x74, 0x5b, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x3d, + 0x31, 0x5d, 0x3d, 0x22, 0x53, 0x74, 0x72, 0x22, 0x7d, 0x29, 0x28, 0x42, + 0x72, 0x7c, 0x7c, 0x28, 0x6b, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x42, + 0x72, 0x3d, 0x7b, 0x7d, 0x29, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x4b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x65, 0x3d, 0x3d, 0x3d, + 0x42, 0x72, 0x2e, 0x4e, 0x75, 0x6d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3f, 0x73, 0x3f, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, + 0x29, 0x60, 0x22, 0x5b, 0x22, 0x20, 0x2b, 0x20, 0x24, 0x7b, 0x74, 0x7d, + 0x20, 0x2b, 0x20, 0x22, 0x5d, 0x22, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x4b, + 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x5b, 0x27, 0x22, 0x20, 0x2b, 0x20, 0x24, + 0x7b, 0x74, 0x7d, 0x20, 0x2b, 0x20, 0x22, 0x27, 0x5d, 0x22, 0x60, 0x3a, + 0x73, 0x3f, 0x28, 0x30, 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x2f, + 0x22, 0x20, 0x2b, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x3a, 0x28, 0x30, + 0x2c, 0x4b, 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x2f, 0x22, 0x20, 0x2b, 0x20, + 0x24, 0x7b, 0x74, 0x7d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x28, 0x2f, 0x7e, 0x2f, 0x67, 0x2c, 0x20, 0x22, 0x7e, 0x30, 0x22, 0x29, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5c, + 0x2f, 0x2f, 0x67, 0x2c, 0x20, 0x22, 0x7e, 0x31, 0x22, 0x29, 0x60, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x30, 0x2c, + 0x4b, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x29, 0x28, 0x74, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x29, 0x3a, 0x22, 0x2f, 0x22, 0x2b, 0x58, 0x72, 0x28, + 0x74, 0x29, 0x7d, 0x6b, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x4a, 0x63, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x28, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x60, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, + 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x2c, 0x72, 0x3d, 0x3d, 0x3d, 0x21, + 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x3b, 0x74, 0x2e, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, + 0x61, 0x72, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x7d, 0x6b, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x3d, 0x6d, 0x61, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x65, 0x3d, 0x70, 0x28, 0x74, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x74, 0x73, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x5a, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x57, 0x63, + 0x3d, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x29, 0x2c, 0x76, 0x61, 0x6c, 0x43, 0x78, 0x74, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, + 0x43, 0x78, 0x74, 0x22, 0x29, 0x2c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x29, 0x2c, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x2c, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, + 0x29, 0x2c, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x6e, + 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x72, + 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x2c, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, + 0x22, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x73, 0x22, 0x29, 0x2c, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x29, 0x2c, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x22, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x74, 0x68, 0x69, + 0x73, 0x22, 0x29, 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x73, 0x65, 0x6c, + 0x66, 0x22, 0x29, 0x2c, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x6e, 0x65, + 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x29, 0x2c, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x6e, + 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x22, 0x29, 0x2c, + 0x6a, 0x73, 0x6f, 0x6e, 0x4c, 0x65, 0x6e, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x5a, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6a, 0x73, 0x6f, 0x6e, + 0x4c, 0x65, 0x6e, 0x22, 0x29, 0x2c, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x74, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x28, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x22, + 0x29, 0x7d, 0x3b, 0x74, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x57, 0x63, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x74, 0x3d, 0x70, 0x28, 0x51, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x51, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x51, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3d, 0x51, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x51, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x3d, 0x51, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x51, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x24, 0x44, 0x61, 0x74, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x51, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x41, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x6e, 0x72, 0x3d, + 0x49, 0x28, 0x29, 0x2c, 0x58, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x3b, 0x51, + 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x7d, 0x29, + 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x22, 0x24, + 0x7b, 0x74, 0x7d, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, + 0x7d, 0x3b, 0x51, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x24, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x3d, 0x3e, 0x65, + 0x3f, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x22, + 0x24, 0x7b, 0x74, 0x7d, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x24, 0x7b, + 0x65, 0x7d, 0x20, 0x28, 0x24, 0x64, 0x61, 0x74, 0x61, 0x29, 0x60, 0x3a, + 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x22, 0x24, + 0x7b, 0x74, 0x7d, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x28, 0x24, 0x64, 0x61, 0x74, 0x61, 0x29, 0x60, 0x7d, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x63, 0x28, 0x74, 0x2c, + 0x65, 0x3d, 0x51, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x61, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x6f, 0x2c, 0x61, 0x6c, 0x6c, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x69, 0x7d, 0x3d, 0x6e, 0x2c, + 0x63, 0x3d, 0x79, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3b, + 0x73, 0x3f, 0x3f, 0x28, 0x6f, 0x7c, 0x7c, 0x69, 0x29, 0x3f, 0x70, 0x61, + 0x28, 0x61, 0x2c, 0x63, 0x29, 0x3a, 0x68, 0x61, 0x28, 0x6e, 0x2c, 0x28, + 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x5b, 0x24, 0x7b, 0x63, 0x7d, + 0x5d, 0x60, 0x29, 0x7d, 0x51, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x59, 0x63, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x63, 0x28, 0x74, 0x2c, 0x65, + 0x3d, 0x51, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x69, + 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x6e, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x3a, 0x61, 0x2c, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3a, 0x6f, 0x7d, 0x3d, 0x73, 0x2c, 0x69, 0x3d, 0x79, + 0x61, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x3b, 0x70, 0x61, 0x28, + 0x6e, 0x2c, 0x69, 0x29, 0x2c, 0x61, 0x7c, 0x7c, 0x6f, 0x7c, 0x7c, 0x68, + 0x61, 0x28, 0x73, 0x2c, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x29, 0x7d, 0x51, + 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x5a, 0x63, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x63, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x58, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x74, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x58, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x69, 0x66, 0x28, + 0x65, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x60, 0x2c, 0x65, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x58, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x29, 0x29, 0x7d, 0x51, 0x2e, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x51, 0x63, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x63, 0x28, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x74, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x65, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x65, 0x72, + 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x6e, 0x2c, 0x69, 0x74, + 0x3a, 0x61, 0x7d, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x61, 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x74, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x22, 0x65, 0x72, 0x72, 0x22, 0x29, 0x3b, 0x74, + 0x2e, 0x66, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x22, 0x69, + 0x22, 0x2c, 0x6e, 0x2c, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x69, 0x3d, 0x3e, + 0x7b, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x6f, 0x2c, 0x28, + 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x58, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x7d, 0x5b, 0x24, 0x7b, 0x69, 0x7d, 0x5d, 0x60, 0x29, 0x2c, + 0x74, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, + 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x60, 0x2c, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x29, 0x28, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x2c, 0x61, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x50, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x61, 0x74, 0x68, 0x60, 0x2c, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, + 0x74, 0x72, 0x29, 0x60, 0x24, 0x7b, 0x61, 0x2e, 0x65, 0x72, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, + 0x7b, 0x65, 0x7d, 0x60, 0x29, 0x2c, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x26, 0x26, 0x28, 0x74, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x41, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x60, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x60, 0x2c, + 0x73, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x51, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, 0x42, 0x63, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x65, 0x72, 0x72, 0x22, + 0x2c, 0x65, 0x29, 0x3b, 0x74, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x58, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x60, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x28, 0x30, 0x2c, 0x41, 0x2e, + 0x5f, 0x29, 0x60, 0x5b, 0x24, 0x7b, 0x72, 0x7d, 0x5d, 0x60, 0x29, 0x2c, + 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x58, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x7d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, + 0x72, 0x7d, 0x29, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x58, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x7d, 0x2b, 0x2b, 0x60, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x6e, 0x2e, 0x24, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x3f, 0x72, 0x2e, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x28, + 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x6e, 0x65, 0x77, 0x20, 0x24, + 0x7b, 0x74, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x28, 0x24, 0x7b, 0x65, 0x7d, + 0x29, 0x60, 0x29, 0x3a, 0x28, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x73, 0x7d, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x60, 0x2c, 0x65, + 0x29, 0x2c, 0x72, 0x2e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x21, + 0x31, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4c, 0x65, 0x3d, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x22, 0x29, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x61, 0x74, 0x68, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x22, 0x29, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x29, 0x2c, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, + 0x65, 0x77, 0x20, 0x41, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x29, 0x2c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x65, + 0x77, 0x20, 0x41, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x29, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x29, 0x2c, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, + 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x29, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x79, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2e, 0x69, 0x74, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3d, 0x3d, 0x3d, + 0x21, 0x31, 0x3f, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x7b, + 0x7d, 0x60, 0x3a, 0x58, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x63, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x7b, 0x7d, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, + 0x6e, 0x7d, 0x3d, 0x74, 0x2c, 0x61, 0x3d, 0x5b, 0x65, 0x75, 0x28, 0x6e, + 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x75, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x5d, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x28, 0x74, + 0x2c, 0x65, 0x2c, 0x61, 0x29, 0x2c, 0x73, 0x2e, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x75, 0x28, 0x7b, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x74, 0x7d, 0x2c, 0x7b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x65, + 0x3f, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x24, + 0x7b, 0x74, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x6e, 0x72, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x29, + 0x28, 0x65, 0x2c, 0x6e, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x53, + 0x74, 0x72, 0x29, 0x7d, 0x60, 0x3a, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x5b, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x2c, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x29, 0x28, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x2c, 0x72, 0x29, 0x5d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x75, 0x28, 0x7b, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x69, 0x74, 0x3a, 0x7b, + 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, + 0x68, 0x3a, 0x65, 0x7d, 0x7d, 0x2c, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x72, 0x2c, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x7d, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x73, 0x3f, 0x65, 0x3a, 0x28, + 0x30, 0x2c, 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x24, 0x7b, 0x65, + 0x7d, 0x2f, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x28, 0x30, 0x2c, + 0x41, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x24, + 0x7b, 0x28, 0x30, 0x2c, 0x6e, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x29, 0x28, 0x72, 0x2c, 0x6e, + 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x29, 0x7d, + 0x60, 0x29, 0x2c, 0x5b, 0x4c, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x2c, 0x6e, 0x5d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x28, 0x74, 0x2c, 0x7b, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x65, 0x2c, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x3a, 0x72, 0x7d, 0x2c, 0x73, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, + 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x61, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x6f, 0x2c, 0x69, 0x74, + 0x3a, 0x69, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x3a, + 0x63, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x3a, 0x75, 0x2c, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x6c, 0x7d, 0x3d, 0x69, 0x3b, + 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x4c, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x6e, 0x5d, 0x2c, 0x5b, 0x4c, + 0x65, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x65, 0x28, 0x74, 0x29, 0x3a, 0x65, + 0x7c, 0x7c, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x7d, + 0x60, 0x5d, 0x29, 0x2c, 0x63, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x26, 0x26, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, + 0x4c, 0x65, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x72, 0x28, 0x74, 0x29, + 0x3a, 0x72, 0x5d, 0x29, 0x2c, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x65, 0x26, 0x26, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, + 0x4c, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x6f, 0x5d, + 0x2c, 0x5b, 0x4c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x28, 0x30, 0x2c, 0x41, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x64, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x5d, + 0x2c, 0x5b, 0x58, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2c, 0x61, 0x5d, 0x29, 0x2c, 0x75, 0x26, 0x26, + 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x4c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x2c, + 0x75, 0x5d, 0x29, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, + 0x61, 0x3d, 0x70, 0x28, 0x72, 0x74, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x72, 0x74, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x72, 0x74, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x4f, 0x72, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x72, 0x74, 0x2e, + 0x74, 0x6f, 0x70, 0x42, 0x6f, 0x6f, 0x6c, 0x4f, 0x72, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x75, 0x3d, 0x74, + 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x75, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x61, + 0x75, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x6f, 0x75, 0x3d, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x69, + 0x73, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x7d, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x75, 0x28, 0x74, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x7d, 0x3d, + 0x74, 0x3b, 0x72, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x3f, 0x24, 0x61, 0x28, + 0x74, 0x2c, 0x21, 0x31, 0x29, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x26, 0x26, 0x72, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3d, 0x3d, + 0x3d, 0x21, 0x30, 0x3f, 0x65, 0x2e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x61, 0x75, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x6e, 0x75, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x73, 0x7d, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x60, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x65, 0x2e, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x21, 0x30, 0x29, 0x29, 0x7d, 0x72, 0x74, + 0x2e, 0x74, 0x6f, 0x70, 0x42, 0x6f, 0x6f, 0x6c, 0x4f, 0x72, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x69, 0x75, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x75, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, + 0x6e, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, + 0x7d, 0x3d, 0x74, 0x3b, 0x73, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x3f, 0x28, + 0x72, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x65, 0x2c, 0x21, 0x31, 0x29, 0x2c, + 0x24, 0x61, 0x28, 0x74, 0x29, 0x29, 0x3a, 0x72, 0x2e, 0x76, 0x61, 0x72, + 0x28, 0x65, 0x2c, 0x21, 0x30, 0x29, 0x7d, 0x72, 0x74, 0x2e, 0x62, 0x6f, + 0x6f, 0x6c, 0x4f, 0x72, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3d, 0x63, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2c, 0x6e, 0x3d, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x21, 0x31, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x21, 0x31, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x31, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x7d, 0x2c, + 0x69, 0x74, 0x3a, 0x74, 0x7d, 0x3b, 0x28, 0x30, 0x2c, 0x73, 0x75, 0x2e, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, + 0x28, 0x6e, 0x2c, 0x6f, 0x75, 0x2c, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x2c, 0x65, 0x29, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x73, 0x3d, 0x70, 0x28, 0x73, 0x74, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x73, 0x74, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x73, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x3d, + 0x73, 0x74, 0x2e, 0x69, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, + 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x75, 0x3d, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6c, 0x6c, + 0x22, 0x2c, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x5d, 0x2c, 0x64, 0x75, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x75, 0x75, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x26, 0x26, 0x64, 0x75, 0x2e, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x29, 0x7d, 0x73, 0x74, 0x2e, 0x69, 0x73, 0x4a, 0x53, 0x4f, 0x4e, + 0x54, 0x79, 0x70, 0x65, 0x3d, 0x6c, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x75, 0x28, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x74, 0x3d, 0x7b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x2c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, + 0x2c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, 0x2c, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, + 0x5d, 0x7d, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, 0x7d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x3a, 0x7b, 0x2e, 0x2e, 0x2e, 0x74, 0x2c, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x3a, 0x21, 0x30, 0x2c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x3a, 0x21, 0x30, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x21, 0x30, + 0x7d, 0x2c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x7b, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, 0x2c, 0x74, 0x2e, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2c, 0x74, 0x2e, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2c, 0x74, 0x2e, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5d, 0x2c, 0x70, 0x6f, 0x73, 0x74, + 0x3a, 0x7b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, 0x2c, + 0x61, 0x6c, 0x6c, 0x3a, 0x7b, 0x7d, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x7d, 0x73, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x3d, 0x66, 0x75, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x73, 0x3d, 0x70, 0x28, 0x4f, 0x65, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x4f, 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x4f, 0x65, 0x2e, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x55, 0x73, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3d, 0x4f, + 0x65, 0x2e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x55, 0x73, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x3d, 0x4f, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x6f, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, + 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x2c, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x65, 0x7d, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x73, 0x3d, 0x65, 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x72, 0x5d, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x26, 0x26, 0x73, 0x21, 0x3d, 0x3d, 0x21, + 0x30, 0x26, 0x26, 0x67, 0x61, 0x28, 0x74, 0x2c, 0x73, 0x29, 0x7d, 0x4f, + 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x3d, + 0x6d, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, + 0x6f, 0x6d, 0x65, 0x28, 0x72, 0x3d, 0x3e, 0x76, 0x61, 0x28, 0x74, 0x2c, + 0x72, 0x29, 0x29, 0x7d, 0x4f, 0x65, 0x2e, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x55, 0x73, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3d, 0x67, 0x61, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5d, 0x21, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x28, 0x28, 0x72, 0x3d, 0x65, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3d, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x72, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3a, 0x72, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x3d, 0x3e, 0x74, + 0x5b, 0x73, 0x5d, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x29, 0x7d, 0x4f, 0x65, 0x2e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x55, 0x73, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3d, 0x76, 0x61, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6a, 0x74, 0x3d, 0x70, 0x28, 0x42, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x42, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x30, 0x7d, 0x29, 0x3b, 0x42, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x42, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x3d, 0x42, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, + 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x42, 0x2e, 0x63, 0x6f, 0x65, + 0x72, 0x63, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x42, 0x2e, 0x67, 0x65, + 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x42, + 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x3d, 0x42, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x75, 0x3d, 0x72, 0x73, 0x28, 0x29, 0x2c, 0x68, 0x75, + 0x3d, 0x73, 0x73, 0x28, 0x29, 0x2c, 0x79, 0x75, 0x3d, 0x74, 0x74, 0x28, + 0x29, 0x2c, 0x6a, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x62, 0x61, 0x3d, 0x49, + 0x28, 0x29, 0x2c, 0x6e, 0x74, 0x3b, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x5b, 0x74, 0x2e, 0x43, + 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x30, 0x5d, 0x3d, 0x22, 0x43, + 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x74, 0x5b, 0x74, 0x2e, + 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x3d, 0x31, 0x5d, 0x3d, 0x22, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x22, 0x7d, 0x29, 0x28, 0x6e, 0x74, 0x7c, 0x7c, 0x28, + 0x42, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x6e, + 0x74, 0x3d, 0x7b, 0x7d, 0x29, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x75, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x65, 0x3d, 0x77, 0x61, 0x28, 0x74, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x28, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x29, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69, 0x63, 0x74, 0x73, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x69, 0x66, 0x28, 0x21, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x26, 0x26, 0x74, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x27, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x27, 0x29, 0x3b, 0x74, 0x2e, + 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x3d, 0x3d, 0x21, + 0x30, 0x26, 0x26, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x6e, + 0x75, 0x6c, 0x6c, 0x22, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x7d, 0x42, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x24, 0x75, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x28, 0x74, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x29, + 0x3f, 0x74, 0x3a, 0x74, 0x3f, 0x5b, 0x74, 0x5d, 0x3a, 0x5b, 0x5d, 0x3b, + 0x69, 0x66, 0x28, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x72, 0x79, 0x28, 0x70, + 0x75, 0x2e, 0x69, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, 0x65, + 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3b, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, + 0x65, 0x5b, 0x5d, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x2e, 0x6a, 0x6f, 0x69, + 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x29, 0x7d, 0x42, 0x2e, 0x67, 0x65, + 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x77, + 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, + 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x2c, 0x61, 0x3d, + 0x67, 0x75, 0x28, 0x65, 0x2c, 0x6e, 0x2e, 0x63, 0x6f, 0x65, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x2c, 0x6f, 0x3d, 0x65, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x26, 0x26, 0x21, 0x28, + 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, + 0x26, 0x26, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, + 0x3d, 0x31, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x68, 0x75, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x46, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x65, + 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x61, 0x73, 0x28, 0x65, 0x2c, 0x73, + 0x2c, 0x6e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x2c, 0x6e, 0x74, 0x2e, 0x57, 0x72, 0x6f, 0x6e, + 0x67, 0x29, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x69, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x7b, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x76, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x61, 0x29, 0x3a, 0x6f, 0x73, + 0x28, 0x74, 0x29, 0x7d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x7d, 0x42, 0x2e, 0x63, 0x6f, 0x65, 0x72, 0x63, 0x65, 0x41, + 0x6e, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3d, 0x5f, 0x75, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, + 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x5b, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0x2c, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x75, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3f, + 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x72, 0x3d, 0x3e, + 0x45, 0x61, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x72, 0x29, 0x7c, 0x7c, 0x65, + 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x26, 0x26, + 0x72, 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x29, + 0x3a, 0x5b, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x76, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, + 0x61, 0x3a, 0x6e, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x61, 0x7d, 0x3d, + 0x74, 0x2c, 0x6f, 0x3d, 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x28, 0x30, 0x2c, + 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x24, 0x7b, 0x6e, 0x7d, 0x60, 0x29, 0x2c, 0x69, 0x3d, 0x73, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x63, 0x6f, 0x65, 0x72, 0x63, 0x65, 0x64, 0x22, + 0x2c, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, 0x3b, 0x61, 0x2e, 0x63, + 0x6f, 0x65, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x3d, + 0x3d, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x26, 0x26, 0x73, 0x2e, + 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x27, 0x20, 0x26, 0x26, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x24, 0x7b, 0x6e, + 0x7d, 0x29, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x60, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x6e, 0x2c, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x6e, 0x7d, 0x5b, 0x30, 0x5d, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x6f, 0x2c, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, + 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x6e, + 0x7d, 0x60, 0x29, 0x2e, 0x69, 0x66, 0x28, 0x61, 0x73, 0x28, 0x65, 0x2c, + 0x6e, 0x2c, 0x61, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x73, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x6e, 0x29, + 0x29, 0x29, 0x2c, 0x73, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6a, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x21, 0x3d, 0x3d, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x20, 0x6f, + 0x66, 0x20, 0x72, 0x29, 0x28, 0x45, 0x61, 0x2e, 0x68, 0x61, 0x73, 0x28, + 0x75, 0x29, 0x7c, 0x7c, 0x75, 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x26, 0x26, 0x61, 0x2e, 0x63, 0x6f, 0x65, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x29, 0x26, 0x26, 0x63, 0x28, 0x75, 0x29, 0x3b, + 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x6f, 0x73, 0x28, + 0x74, 0x29, 0x2c, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, + 0x2c, 0x73, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x7b, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x6e, 0x2c, 0x69, 0x29, 0x2c, 0x62, 0x75, 0x28, 0x74, 0x2c, 0x69, 0x29, + 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x28, 0x75, 0x29, 0x7b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x28, + 0x75, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x3a, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, + 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, + 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x60, 0x29, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x28, 0x30, + 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x22, 0x20, 0x2b, 0x20, 0x24, + 0x7b, 0x6e, 0x7d, 0x60, 0x29, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, + 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x60, 0x29, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x28, 0x30, + 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x22, 0x60, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x73, 0x2e, 0x65, 0x6c, 0x73, + 0x65, 0x49, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x26, 0x26, + 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x2b, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x60, + 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x28, + 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x2b, 0x24, 0x7b, 0x6e, 0x7d, + 0x60, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x3a, + 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, + 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x24, + 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x6e, 0x7d, + 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x20, + 0x2b, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x26, 0x26, 0x20, 0x21, 0x28, 0x24, + 0x7b, 0x6e, 0x7d, 0x20, 0x25, 0x20, 0x31, 0x29, 0x29, 0x60, 0x29, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x28, 0x30, 0x2c, + 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x2b, 0x24, 0x7b, 0x6e, 0x7d, 0x60, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x61, 0x73, 0x65, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x3a, 0x73, 0x2e, + 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x24, + 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x7c, 0x7c, + 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x69, 0x2c, 0x21, 0x31, 0x29, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, + 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, + 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x31, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x69, 0x2c, 0x21, 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x3a, + 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x22, 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, + 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x60, 0x29, 0x2c, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x69, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x3a, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7c, + 0x7c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x69, 0x2c, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x5b, + 0x24, 0x7b, 0x6e, 0x7d, 0x5d, 0x60, 0x29, 0x7d, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x28, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x74, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3a, 0x72, 0x7d, 0x2c, 0x73, 0x29, 0x7b, 0x74, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, + 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x64, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x5b, 0x24, 0x7b, 0x72, 0x7d, 0x5d, 0x60, + 0x2c, 0x73, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, + 0x3d, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x73, 0x3d, 0x3d, 0x3d, 0x6e, + 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x3f, 0x6a, 0x2e, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x51, + 0x3a, 0x6a, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x2e, 0x4e, 0x45, 0x51, 0x2c, 0x61, 0x3b, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x28, 0x74, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x6e, 0x75, + 0x6c, 0x6c, 0x22, 0x3a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, + 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x24, + 0x7b, 0x6e, 0x7d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x60, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x3a, 0x61, 0x3d, + 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x24, 0x7b, + 0x65, 0x7d, 0x29, 0x60, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, + 0x61, 0x73, 0x65, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, + 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x65, 0x7d, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x20, 0x26, 0x26, 0x20, 0x21, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x24, 0x7b, 0x65, 0x7d, 0x29, 0x60, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x3a, 0x61, 0x3d, 0x6f, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, + 0x5f, 0x29, 0x60, 0x21, 0x28, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x25, 0x20, + 0x31, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, + 0x28, 0x24, 0x7b, 0x65, 0x7d, 0x29, 0x60, 0x29, 0x3b, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x3a, 0x61, 0x3d, 0x6f, 0x28, 0x29, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, + 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x65, + 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x60, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3d, 0x3d, 0x3d, + 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x3f, 0x61, + 0x3a, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x61, + 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x28, 0x69, 0x3d, 0x6a, 0x2e, 0x6e, 0x69, 0x6c, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x61, 0x6e, 0x64, + 0x29, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x60, 0x2c, 0x69, + 0x2c, 0x72, 0x3f, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x69, + 0x73, 0x46, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x28, 0x24, 0x7b, 0x65, 0x7d, + 0x29, 0x60, 0x3a, 0x6a, 0x2e, 0x6e, 0x69, 0x6c, 0x29, 0x7d, 0x7d, 0x42, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3d, 0x6e, 0x73, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x73, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x31, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x73, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x2c, 0x61, + 0x3d, 0x28, 0x30, 0x2c, 0x62, 0x61, 0x2e, 0x74, 0x6f, 0x48, 0x61, 0x73, + 0x68, 0x29, 0x28, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x61, 0x2e, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x26, 0x26, 0x61, 0x2e, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x28, 0x30, + 0x2c, 0x6a, 0x2e, 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x21, 0x3d, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x60, 0x3b, 0x6e, 0x3d, 0x61, 0x2e, 0x6e, + 0x75, 0x6c, 0x6c, 0x3f, 0x6f, 0x3a, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, + 0x29, 0x60, 0x21, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x7c, 0x7c, 0x20, 0x24, + 0x7b, 0x6f, 0x7d, 0x60, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x61, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x61, 0x2e, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2c, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x3d, 0x6a, 0x2e, 0x6e, + 0x69, 0x6c, 0x3b, 0x61, 0x2e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x26, + 0x26, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x29, 0x6e, 0x3d, 0x28, + 0x30, 0x2c, 0x6a, 0x2e, 0x61, 0x6e, 0x64, 0x29, 0x28, 0x6e, 0x2c, 0x6e, + 0x73, 0x28, 0x6f, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x42, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x3d, 0x61, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x77, 0x75, 0x3d, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x60, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x24, 0x7b, 0x74, 0x7d, + 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x3d, + 0x3e, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x28, 0x30, 0x2c, 0x6a, + 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x24, + 0x7b, 0x74, 0x7d, 0x7d, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x6a, 0x2e, 0x5f, + 0x29, 0x60, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x65, + 0x7d, 0x7d, 0x60, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x65, 0x3d, 0x45, 0x75, 0x28, 0x74, 0x29, 0x3b, 0x28, 0x30, 0x2c, 0x79, + 0x75, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x28, 0x65, 0x2c, 0x77, 0x75, 0x29, 0x7d, 0x42, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x3d, 0x6f, 0x73, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x45, 0x75, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x7d, 0x3d, + 0x74, 0x2c, 0x6e, 0x3d, 0x28, 0x30, 0x2c, 0x62, 0x61, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x4f, 0x72, 0x56, 0x61, 0x6c, + 0x29, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x65, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, + 0x65, 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x6e, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x7d, 0x2c, 0x69, 0x74, 0x3a, 0x74, 0x7d, + 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x53, 0x61, 0x3d, 0x70, + 0x28, 0x61, 0x72, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x61, 0x72, 0x2c, 0x22, 0x5f, 0x5f, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x61, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x61, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x50, 0x75, 0x3d, + 0x49, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x53, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x72, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x73, 0x7d, 0x3d, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x65, + 0x3d, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, + 0x26, 0x72, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6e, + 0x20, 0x69, 0x6e, 0x20, 0x72, 0x29, 0x50, 0x61, 0x28, 0x74, 0x2c, 0x6e, + 0x2c, 0x72, 0x5b, 0x6e, 0x5d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x65, 0x3d, 0x3d, 0x3d, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x26, 0x26, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, + 0x29, 0x26, 0x26, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, + 0x28, 0x28, 0x6e, 0x2c, 0x61, 0x29, 0x3d, 0x3e, 0x50, 0x61, 0x28, 0x74, + 0x2c, 0x61, 0x2c, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x29, 0x29, 0x7d, 0x61, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x3d, 0x53, 0x75, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x61, 0x28, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x6e, 0x2c, 0x64, 0x61, 0x74, + 0x61, 0x3a, 0x61, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x6f, 0x7d, 0x3d, + 0x74, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x69, 0x3d, 0x28, 0x30, 0x2c, 0x61, 0x74, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x61, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x29, 0x28, 0x65, 0x29, 0x7d, 0x60, 0x3b, 0x69, 0x66, 0x28, 0x6e, + 0x29, 0x7b, 0x28, 0x30, 0x2c, 0x50, 0x75, 0x2e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, + 0x28, 0x74, 0x2c, 0x60, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, + 0x28, 0x30, 0x2c, 0x61, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x60, 0x3b, 0x6f, 0x2e, 0x75, 0x73, 0x65, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x26, 0x26, 0x28, 0x63, 0x3d, 0x28, 0x30, 0x2c, + 0x61, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x63, 0x7d, 0x20, 0x7c, + 0x7c, 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x20, + 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x60, 0x29, 0x2c, 0x73, 0x2e, 0x69, + 0x66, 0x28, 0x63, 0x2c, 0x28, 0x30, 0x2c, 0x61, 0x74, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x28, 0x30, + 0x2c, 0x61, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x65, 0x3d, 0x70, 0x28, 0x78, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x78, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x3d, 0x78, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3d, 0x78, + 0x2e, 0x75, 0x73, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, + 0x78, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x78, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3d, 0x78, 0x2e, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3d, + 0x78, 0x2e, 0x6e, 0x6f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x78, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, + 0x78, 0x2e, 0x69, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3d, 0x78, 0x2e, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, + 0x70, 0x46, 0x75, 0x6e, 0x63, 0x3d, 0x78, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, + 0x70, 0x3d, 0x78, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x4d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x3d, 0x78, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x55, 0x3d, 0x45, + 0x28, 0x29, 0x2c, 0x69, 0x73, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x6b, 0x65, + 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x6a, 0x75, 0x3d, 0x49, 0x28, 0x29, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, + 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x69, + 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, + 0x75, 0x73, 0x28, 0x72, 0x2c, 0x73, 0x2c, 0x65, 0x2c, 0x6e, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, + 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, + 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x3a, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x7d, 0x2c, 0x21, 0x30, 0x29, 0x2c, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x7d, 0x29, 0x7d, + 0x78, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, + 0x3d, 0x71, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4e, 0x75, 0x28, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x74, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2c, 0x69, 0x74, 0x3a, 0x7b, 0x6f, 0x70, + 0x74, 0x73, 0x3a, 0x72, 0x7d, 0x7d, 0x2c, 0x73, 0x2c, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x6f, + 0x72, 0x29, 0x28, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x61, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x61, 0x6e, 0x64, 0x29, + 0x28, 0x75, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x61, 0x2c, 0x72, 0x2e, + 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x60, 0x29, + 0x29, 0x29, 0x7d, 0x78, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x3d, 0x4e, 0x75, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x75, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x65, + 0x7d, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x29, 0x7d, 0x78, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x3d, + 0x4f, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6a, 0x61, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x22, 0x2c, 0x7b, 0x72, 0x65, + 0x66, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, + 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x3a, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x60, 0x7d, 0x29, 0x7d, 0x78, 0x2e, + 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x46, 0x75, 0x6e, 0x63, 0x3d, + 0x6a, 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x6a, 0x61, 0x28, 0x74, 0x29, 0x7d, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x24, 0x7b, 0x65, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x72, 0x7d, + 0x29, 0x60, 0x7d, 0x78, 0x2e, 0x69, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x63, 0x73, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x75, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, + 0x3d, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, + 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, + 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x64, 0x60, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x3f, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x63, 0x73, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x60, 0x3a, 0x6e, 0x7d, 0x78, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x3d, 0x6b, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x28, 0x30, 0x2c, 0x55, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x24, 0x7b, 0x28, 0x30, + 0x2c, 0x55, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3f, 0x28, 0x30, 0x2c, 0x55, + 0x2e, 0x6f, 0x72, 0x29, 0x28, 0x6e, 0x2c, 0x28, 0x30, 0x2c, 0x55, 0x2e, + 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x63, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x29, 0x29, 0x3a, 0x6e, 0x7d, 0x78, 0x2e, 0x6e, 0x6f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x3d, 0x75, 0x73, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x71, 0x61, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x3f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x28, 0x74, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x28, 0x65, 0x3d, 0x3e, 0x65, 0x21, 0x3d, 0x3d, 0x22, 0x5f, + 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x5f, 0x22, 0x29, 0x3a, 0x5b, + 0x5d, 0x7d, 0x78, 0x2e, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3d, + 0x71, 0x61, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x49, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x71, 0x61, 0x28, 0x65, 0x29, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x28, 0x72, 0x3d, 0x3e, 0x21, 0x28, 0x30, 0x2c, 0x69, + 0x73, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x74, 0x2c, 0x65, + 0x5b, 0x72, 0x5d, 0x29, 0x29, 0x7d, 0x78, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3d, 0x49, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x52, 0x75, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x65, + 0x2c, 0x69, 0x74, 0x3a, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x74, + 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, + 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x6e, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x61, 0x7d, 0x2c, 0x69, 0x74, 0x3a, 0x6f, 0x7d, 0x2c, 0x69, 0x2c, + 0x63, 0x2c, 0x75, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x3d, 0x75, + 0x3f, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x74, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x73, + 0x7d, 0x24, 0x7b, 0x6e, 0x7d, 0x60, 0x3a, 0x65, 0x2c, 0x6c, 0x3d, 0x5b, + 0x5b, 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x2c, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x29, 0x28, 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x2c, 0x61, 0x29, 0x5d, 0x2c, 0x5b, 0x6b, 0x65, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, 0x6f, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x5d, 0x2c, 0x5b, 0x6b, + 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x2c, 0x6f, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x5d, 0x2c, 0x5b, 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, + 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x5d, 0x5d, 0x3b, 0x6f, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x66, 0x26, 0x26, 0x6c, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x5b, 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x73, 0x2c, 0x6b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x73, 0x5d, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x79, + 0x3d, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x64, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x72, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x6c, 0x29, 0x7d, 0x60, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x21, 0x3d, 0x3d, 0x55, 0x2e, 0x6e, + 0x69, 0x6c, 0x3f, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x69, 0x7d, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x63, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x79, 0x7d, 0x29, 0x60, 0x3a, 0x28, 0x30, + 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x28, 0x24, + 0x7b, 0x79, 0x7d, 0x29, 0x60, 0x7d, 0x78, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x3d, 0x52, 0x75, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x75, 0x3d, 0x28, + 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x6e, 0x65, 0x77, 0x20, 0x52, + 0x65, 0x67, 0x45, 0x78, 0x70, 0x60, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x75, 0x28, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x74, 0x2c, 0x69, 0x74, 0x3a, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x65, + 0x7d, 0x7d, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, + 0x65, 0x2e, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x3f, 0x22, 0x75, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x7b, + 0x72, 0x65, 0x67, 0x45, 0x78, 0x70, 0x3a, 0x6e, 0x7d, 0x3d, 0x65, 0x2e, + 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x61, 0x3d, 0x6e, 0x28, 0x72, 0x2c, 0x73, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x2c, 0x7b, 0x6b, 0x65, 0x79, + 0x3a, 0x61, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x29, 0x2c, 0x72, 0x65, 0x66, 0x3a, 0x61, 0x2c, 0x63, 0x6f, 0x64, 0x65, + 0x3a, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x6e, 0x65, 0x77, + 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x22, 0x3f, 0x54, 0x75, 0x3a, + 0x28, 0x30, 0x2c, 0x6a, 0x75, 0x2e, 0x75, 0x73, 0x65, 0x46, 0x75, 0x6e, + 0x63, 0x29, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7d, 0x28, 0x24, 0x7b, 0x72, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, 0x7d, 0x29, 0x7d, + 0x78, 0x2e, 0x75, 0x73, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x3d, 0x4d, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x75, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x73, 0x2c, 0x69, 0x74, + 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x2c, 0x61, 0x3d, 0x65, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x65, 0x2e, + 0x6c, 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, + 0x21, 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x69, 0x2c, 0x21, 0x31, 0x29, 0x29, 0x2c, 0x69, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x28, + 0x61, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x6f, 0x28, 0x28, 0x29, 0x3d, 0x3e, + 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x2c, 0x61, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, + 0x69, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x22, 0x2c, 0x28, + 0x30, 0x2c, 0x55, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x3b, 0x65, 0x2e, 0x66, + 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x22, 0x69, 0x22, 0x2c, + 0x30, 0x2c, 0x63, 0x2c, 0x75, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, + 0x72, 0x6f, 0x70, 0x3a, 0x75, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x69, 0x73, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x2e, 0x4e, 0x75, 0x6d, 0x7d, 0x2c, 0x61, 0x29, 0x2c, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x6e, 0x6f, 0x74, + 0x29, 0x28, 0x61, 0x29, 0x2c, 0x69, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x78, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x3d, 0x41, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x43, 0x75, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3a, 0x72, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, + 0x73, 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x72, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x61, 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x2e, 0x73, 0x6f, 0x6d, 0x65, + 0x28, 0x63, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x69, 0x73, 0x2e, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6e, 0x2c, 0x63, 0x29, 0x29, 0x26, 0x26, + 0x21, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x65, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x21, + 0x31, 0x29, 0x2c, 0x69, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, + 0x22, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x65, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x63, 0x2c, 0x75, + 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x3d, 0x74, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x75, 0x2c, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x2c, 0x69, 0x29, 0x3b, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x6f, 0x2c, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x7c, 0x7c, 0x20, 0x24, 0x7b, + 0x69, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x64, 0x2c, 0x69, 0x29, 0x7c, 0x7c, 0x65, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x55, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, + 0x6f, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x28, 0x6f, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x21, 0x30, 0x29, 0x29, + 0x7d, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x6e, 0x69, 0x6f, 0x6e, 0x3d, 0x43, 0x75, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6b, 0x61, 0x3d, 0x70, 0x28, 0x5f, 0x65, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x5f, + 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x5f, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x3d, 0x5f, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x5f, 0x65, + 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x5f, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x64, 0x65, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x48, 0x65, 0x3d, 0x6f, 0x65, + 0x28, 0x29, 0x2c, 0x44, 0x75, 0x3d, 0x75, 0x65, 0x28, 0x29, 0x2c, 0x7a, + 0x75, 0x3d, 0x74, 0x74, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x6e, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x61, 0x2c, 0x69, 0x74, 0x3a, 0x6f, + 0x7d, 0x3d, 0x74, 0x2c, 0x69, 0x3d, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6f, 0x2e, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x6e, 0x2c, 0x61, 0x2c, 0x6f, 0x29, 0x2c, 0x63, 0x3d, 0x4f, + 0x61, 0x28, 0x72, 0x2c, 0x73, 0x2c, 0x69, 0x29, 0x3b, 0x6f, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x21, 0x3d, 0x3d, 0x21, 0x31, 0x26, + 0x26, 0x6f, 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x69, + 0x2c, 0x21, 0x30, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x72, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x69, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, + 0x65, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x60, 0x24, 0x7b, + 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x7d, 0x60, 0x2c, 0x74, + 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, + 0x63, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x75, 0x29, 0x2c, 0x74, + 0x2e, 0x70, 0x61, 0x73, 0x73, 0x28, 0x75, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x21, 0x30, 0x29, 0x29, + 0x7d, 0x5f, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x4b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x56, 0x75, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x75, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3a, 0x61, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x6f, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x69, 0x2c, 0x69, 0x74, 0x3a, 0x63, 0x7d, 0x3d, 0x74, 0x3b, 0x55, + 0x75, 0x28, 0x63, 0x2c, 0x65, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x75, + 0x3d, 0x21, 0x69, 0x26, 0x26, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x3f, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x2e, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x63, 0x29, 0x3a, 0x65, 0x2e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2c, 0x64, 0x3d, 0x4f, 0x61, 0x28, + 0x73, 0x2c, 0x6e, 0x2c, 0x75, 0x29, 0x2c, 0x6c, 0x3d, 0x73, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, + 0x74, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x6c, 0x2c, 0x79, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x28, + 0x72, 0x3d, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x29, 0x21, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x72, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x72, 0x3a, 0x6c, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, + 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x6d, 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x26, 0x26, 0x4e, 0x61, + 0x28, 0x74, 0x29, 0x2c, 0x24, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x29, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x3d, 0x65, 0x2e, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x3f, 0x68, 0x28, 0x29, 0x3a, 0x66, 0x28, 0x29, 0x3b, + 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x26, + 0x26, 0x4e, 0x61, 0x28, 0x74, 0x29, 0x2c, 0x24, 0x28, 0x28, 0x29, 0x3d, + 0x3e, 0x4b, 0x75, 0x28, 0x74, 0x2c, 0x67, 0x29, 0x29, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x67, 0x3d, 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x22, 0x72, 0x75, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x73, 0x22, 0x2c, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x6d, 0x28, + 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x60, 0x29, 0x2c, 0x52, 0x3d, 0x3e, 0x73, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, 0x21, 0x31, 0x29, 0x2e, + 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x52, 0x7d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x63, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, + 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x67, 0x2c, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x52, 0x7d, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x60, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x73, 0x2e, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x28, 0x52, 0x29, 0x29, 0x29, 0x2c, 0x67, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x67, 0x3d, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x64, 0x7d, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x60, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x67, 0x2c, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x2c, 0x6d, 0x28, 0x65, 0x65, 0x2e, 0x6e, 0x69, 0x6c, + 0x29, 0x2c, 0x67, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x28, 0x67, 0x3d, 0x65, 0x2e, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x3f, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x61, 0x77, + 0x61, 0x69, 0x74, 0x20, 0x60, 0x3a, 0x65, 0x65, 0x2e, 0x6e, 0x69, 0x6c, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x52, 0x3d, 0x63, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x3f, 0x48, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x74, 0x68, 0x69, 0x73, 0x3a, 0x48, 0x65, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x71, + 0x3d, 0x21, 0x28, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, + 0x69, 0x6e, 0x20, 0x65, 0x26, 0x26, 0x21, 0x69, 0x7c, 0x7c, 0x65, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, + 0x3b, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, + 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x67, + 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x44, 0x75, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, + 0x65, 0x29, 0x28, 0x74, 0x2c, 0x64, 0x2c, 0x52, 0x2c, 0x71, 0x29, 0x7d, + 0x60, 0x2c, 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, + 0x67, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x24, 0x28, 0x67, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x52, 0x3b, 0x73, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x6e, 0x6f, + 0x74, 0x29, 0x28, 0x28, 0x52, 0x3d, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x52, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x52, 0x3a, + 0x6c, 0x29, 0x2c, 0x67, 0x29, 0x7d, 0x7d, 0x5f, 0x65, 0x2e, 0x66, 0x75, + 0x6e, 0x63, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x64, + 0x65, 0x3d, 0x78, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4e, 0x61, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, + 0x2c, 0x69, 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x65, 0x2e, 0x69, + 0x66, 0x28, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x72, 0x2c, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x7d, 0x5b, 0x24, 0x7b, 0x73, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x7d, 0x5d, 0x60, 0x29, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x75, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x72, 0x7d, 0x3d, 0x74, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, + 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x24, 0x7b, 0x65, + 0x7d, 0x29, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x48, 0x65, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x2c, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x48, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x3f, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, + 0x3a, 0x20, 0x24, 0x7b, 0x48, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x24, 0x7b, 0x65, 0x7d, 0x29, + 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x48, 0x65, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x2c, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x48, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x7a, + 0x75, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x29, 0x28, 0x74, 0x29, 0x7d, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x75, 0x28, 0x7b, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3a, 0x74, 0x7d, + 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x26, 0x26, 0x21, 0x74, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x73, 0x79, 0x6e, 0x63, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, + 0x61, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x60, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, + 0x22, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x60, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x72, + 0x7d, 0x3a, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x72, 0x2c, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x28, 0x30, 0x2c, 0x65, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x75, 0x28, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x21, 0x31, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x7c, 0x7c, 0x65, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x3d, + 0x3e, 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x3f, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x28, 0x74, 0x29, 0x3a, 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x74, 0x26, 0x26, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x21, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x29, 0x3a, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x73, 0x7c, + 0x7c, 0x72, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, + 0x3e, 0x22, 0x75, 0x22, 0x29, 0x7d, 0x5f, 0x65, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x3d, 0x46, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4c, 0x75, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x74, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x65, 0x2c, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x72, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x73, 0x7d, 0x2c, 0x6e, 0x2c, 0x61, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, + 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6e, 0x2e, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x29, 0x3f, 0x21, 0x6e, 0x2e, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x73, 0x28, 0x61, 0x29, 0x3a, 0x6e, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x21, 0x3d, 0x3d, 0x61, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x61, 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x6e, 0x2e, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3b, + 0x69, 0x66, 0x28, 0x6f, 0x3f, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x69, + 0x3d, 0x3e, 0x21, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, + 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x2c, 0x69, 0x29, 0x29, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x60, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x3a, + 0x20, 0x24, 0x7b, 0x6f, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, + 0x22, 0x29, 0x7d, 0x60, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x26, 0x26, 0x21, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x74, 0x5b, 0x61, + 0x5d, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x60, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x22, 0x24, 0x7b, 0x61, 0x7d, + 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x74, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x7d, 0x22, 0x3a, 0x20, 0x60, + 0x2b, 0x72, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x54, 0x65, 0x78, + 0x74, 0x28, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, + 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x22, 0x29, 0x72, 0x2e, 0x6c, 0x6f, 0x67, + 0x67, 0x65, 0x72, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x29, + 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x29, + 0x7d, 0x7d, 0x5f, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x3d, 0x4c, 0x75, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x52, + 0x61, 0x3d, 0x70, 0x28, 0x49, 0x65, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x49, 0x65, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x49, 0x65, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x49, + 0x65, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x49, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x67, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x49, 0x61, 0x3d, 0x49, + 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x48, 0x75, 0x28, 0x74, 0x2c, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x6e, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x61, 0x74, 0x68, 0x3a, 0x61, 0x2c, 0x74, 0x6f, 0x70, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, 0x6f, 0x7d, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x26, 0x26, 0x73, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x62, 0x6f, 0x74, 0x68, 0x20, + 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x20, 0x70, + 0x61, 0x73, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x65, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x3f, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x69, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, + 0x68, 0x3a, 0x28, 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, + 0x68, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x65, + 0x29, 0x7d, 0x60, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x60, 0x24, 0x7b, 0x74, 0x2e, 0x65, + 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x7d, 0x2f, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x7d, 0x3a, 0x7b, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x69, 0x5b, 0x72, 0x5d, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x28, 0x30, 0x2c, + 0x67, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x74, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x24, 0x7b, 0x28, + 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x65, 0x29, 0x7d, 0x24, 0x7b, 0x28, + 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, 0x60, 0x2c, 0x65, + 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x60, 0x24, 0x7b, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, 0x7b, 0x65, + 0x7d, 0x2f, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x49, 0x61, 0x2e, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x65, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x29, 0x28, 0x72, 0x29, 0x7d, 0x60, 0x7d, 0x7d, 0x69, 0x66, 0x28, 0x73, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x7c, 0x7c, 0x61, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x7c, 0x7c, 0x6f, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x72, 0x72, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x22, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x22, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x66, 0x22, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x27, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, + 0x74, 0x68, 0x3a, 0x6e, 0x2c, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, 0x6f, 0x2c, 0x65, 0x72, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x61, 0x7d, + 0x7d, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x27, 0x29, 0x7d, 0x49, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x48, 0x75, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x75, 0x28, 0x74, + 0x2c, 0x65, 0x2c, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, + 0x2c, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x61, + 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x3a, 0x6f, 0x7d, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x72, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x27, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x22, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2c, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x69, 0x7d, 0x3d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x72, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, + 0x3a, 0x75, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68, 0x41, + 0x72, 0x72, 0x3a, 0x64, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x6c, 0x7d, + 0x3d, 0x65, 0x2c, 0x79, 0x3d, 0x69, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x67, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x7d, + 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x72, 0x29, 0x7d, + 0x60, 0x2c, 0x21, 0x30, 0x29, 0x3b, 0x63, 0x28, 0x79, 0x29, 0x2c, 0x74, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x28, + 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x24, 0x7b, + 0x75, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x49, 0x61, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x29, 0x28, + 0x72, 0x2c, 0x73, 0x2c, 0x6c, 0x2e, 0x6a, 0x73, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x29, 0x7d, + 0x60, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x28, + 0x30, 0x2c, 0x67, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, + 0x60, 0x2c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x41, 0x72, 0x72, 0x3d, 0x5b, 0x2e, 0x2e, 0x2e, 0x64, 0x2c, 0x74, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5d, 0x7d, 0x69, 0x66, 0x28, 0x6e, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x75, 0x3d, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x67, 0x65, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x3f, 0x6e, 0x3a, 0x69, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x2c, 0x6e, 0x2c, 0x21, 0x30, 0x29, 0x3b, 0x63, + 0x28, 0x75, 0x29, 0x2c, 0x6f, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x29, 0x7d, 0x61, + 0x26, 0x26, 0x28, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x3d, 0x61, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x75, 0x29, 0x7b, 0x74, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x3d, 0x75, 0x2c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x3d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x2b, 0x31, 0x2c, 0x74, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x5b, 0x5d, 0x2c, 0x65, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, + 0x74, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x3d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x74, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x5b, 0x2e, + 0x2e, 0x2e, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x2c, 0x75, 0x5d, 0x7d, 0x7d, 0x49, 0x65, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x44, 0x61, 0x74, 0x61, 0x3d, 0x47, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x75, 0x28, 0x74, 0x2c, 0x7b, 0x6a, + 0x74, 0x64, 0x44, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x3a, 0x65, 0x2c, 0x6a, 0x74, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x73, 0x2c, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3a, 0x6e, 0x2c, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3a, 0x61, 0x7d, 0x29, 0x7b, 0x73, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3d, 0x73, 0x29, + 0x2c, 0x6e, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, + 0x26, 0x28, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x3d, 0x6e, 0x29, 0x2c, 0x61, 0x21, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x61, + 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, 0x61, 0x29, 0x2c, + 0x74, 0x2e, 0x6a, 0x74, 0x64, 0x44, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x65, 0x2c, 0x74, 0x2e, 0x6a, + 0x74, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x72, + 0x7d, 0x49, 0x65, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x3d, + 0x4a, 0x75, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x73, 0x3d, + 0x70, 0x28, 0x28, 0x47, 0x68, 0x2c, 0x54, 0x61, 0x29, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x54, 0x61, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x3d, 0x3d, 0x72, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x3b, 0x69, 0x66, + 0x28, 0x65, 0x26, 0x26, 0x72, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, + 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x21, 0x3d, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x2c, 0x6e, + 0x2c, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, + 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x65, 0x29, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x73, 0x21, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x6e, 0x3d, 0x73, 0x3b, 0x6e, 0x2d, 0x2d, 0x21, 0x3d, + 0x3d, 0x30, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x21, 0x74, 0x28, 0x65, 0x5b, + 0x6e, 0x5d, 0x2c, 0x72, 0x5b, 0x6e, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x21, 0x30, 0x7d, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x3d, 0x3d, 0x3d, 0x52, 0x65, + 0x67, 0x45, 0x78, 0x70, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x3d, 0x3d, 0x72, + 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x26, 0x26, 0x65, 0x2e, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x3d, 0x3d, 0x3d, 0x72, 0x2e, 0x66, 0x6c, 0x61, + 0x67, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x4f, 0x66, 0x21, 0x3d, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x28, + 0x29, 0x3d, 0x3d, 0x3d, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, + 0x66, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x74, 0x6f, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x21, 0x3d, 0x3d, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3d, 0x3d, 0x3d, 0x72, 0x2e, 0x74, 0x6f, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x61, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, + 0x73, 0x28, 0x65, 0x29, 0x2c, 0x73, 0x3d, 0x61, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2c, 0x73, 0x21, 0x3d, 0x3d, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x72, 0x29, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x21, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x3d, 0x73, 0x3b, 0x6e, + 0x2d, 0x2d, 0x21, 0x3d, 0x3d, 0x30, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x21, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x72, 0x2c, 0x61, 0x5b, 0x6e, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x3d, + 0x73, 0x3b, 0x6e, 0x2d, 0x2d, 0x21, 0x3d, 0x3d, 0x30, 0x3b, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x61, 0x5b, 0x6e, 0x5d, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x74, 0x28, 0x65, 0x5b, 0x6f, 0x5d, 0x2c, 0x72, 0x5b, + 0x6f, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x21, 0x3d, 0x3d, 0x65, 0x26, 0x26, + 0x72, 0x21, 0x3d, 0x3d, 0x72, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x41, 0x61, 0x3d, 0x70, 0x28, 0x28, 0x4a, 0x68, 0x2c, 0x4d, 0x61, + 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x52, 0x65, 0x3d, + 0x4d, 0x61, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, + 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x26, + 0x26, 0x28, 0x72, 0x3d, 0x65, 0x2c, 0x65, 0x3d, 0x7b, 0x7d, 0x29, 0x2c, + 0x72, 0x3d, 0x65, 0x2e, 0x63, 0x62, 0x7c, 0x7c, 0x72, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, + 0x3d, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3f, 0x72, 0x3a, 0x72, 0x2e, 0x70, 0x72, 0x65, 0x7c, 0x7c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x7d, 0x2c, 0x6e, + 0x3d, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x7c, 0x7c, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x7d, 0x3b, 0x6f, 0x72, + 0x28, 0x65, 0x2c, 0x73, 0x2c, 0x6e, 0x2c, 0x74, 0x2c, 0x22, 0x22, 0x2c, + 0x74, 0x29, 0x7d, 0x3b, 0x52, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x3d, 0x7b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x21, + 0x30, 0x2c, 0x6e, 0x6f, 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x69, 0x66, 0x3a, + 0x21, 0x30, 0x2c, 0x74, 0x68, 0x65, 0x6e, 0x3a, 0x21, 0x30, 0x2c, 0x65, + 0x6c, 0x73, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x3b, 0x52, 0x65, 0x2e, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x3d, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x61, + 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x21, 0x30, 0x2c, 0x61, 0x6e, 0x79, 0x4f, + 0x66, 0x3a, 0x21, 0x30, 0x2c, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x3a, 0x21, + 0x30, 0x7d, 0x3b, 0x52, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x4b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x3d, 0x7b, 0x24, 0x64, 0x65, + 0x66, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x21, 0x30, 0x7d, + 0x3b, 0x52, 0x65, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x4b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x3d, 0x7b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x21, 0x30, + 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x21, 0x30, 0x2c, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x3a, 0x21, + 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, + 0x21, 0x30, 0x2c, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3a, 0x21, 0x30, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3a, + 0x21, 0x30, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x21, 0x30, + 0x2c, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, + 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, + 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x21, + 0x30, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, + 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x69, 0x2c, 0x63, 0x2c, 0x75, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x73, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x73, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x26, 0x26, 0x21, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x29, 0x29, 0x7b, 0x65, 0x28, 0x73, + 0x2c, 0x6e, 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x69, 0x2c, 0x63, 0x2c, 0x75, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x73, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, + 0x73, 0x5b, 0x64, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6c, 0x29, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x65, + 0x2e, 0x61, 0x72, 0x72, 0x61, 0x79, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x73, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x79, + 0x3d, 0x30, 0x3b, 0x79, 0x3c, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x79, 0x2b, 0x2b, 0x29, 0x6f, 0x72, 0x28, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x2c, 0x6c, 0x5b, 0x79, 0x5d, 0x2c, 0x6e, 0x2b, 0x22, 0x2f, + 0x22, 0x2b, 0x64, 0x2b, 0x22, 0x2f, 0x22, 0x2b, 0x79, 0x2c, 0x61, 0x2c, + 0x6e, 0x2c, 0x64, 0x2c, 0x73, 0x2c, 0x79, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x73, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6c, 0x26, 0x26, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6c, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x29, 0x6f, 0x72, 0x28, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x6c, 0x5b, 0x68, 0x5d, 0x2c, 0x6e, 0x2b, + 0x22, 0x2f, 0x22, 0x2b, 0x64, 0x2b, 0x22, 0x2f, 0x22, 0x2b, 0x57, 0x75, + 0x28, 0x68, 0x29, 0x2c, 0x61, 0x2c, 0x6e, 0x2c, 0x64, 0x2c, 0x73, 0x2c, + 0x68, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x52, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x7c, 0x7c, 0x74, 0x2e, 0x61, 0x6c, 0x6c, 0x4b, 0x65, 0x79, 0x73, 0x26, + 0x26, 0x21, 0x28, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x65, 0x2e, 0x73, + 0x6b, 0x69, 0x70, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x29, + 0x29, 0x26, 0x26, 0x6f, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x6c, 0x2c, 0x6e, 0x2b, 0x22, 0x2f, 0x22, 0x2b, 0x64, 0x2c, 0x61, 0x2c, + 0x6e, 0x2c, 0x64, 0x2c, 0x73, 0x29, 0x7d, 0x72, 0x28, 0x73, 0x2c, 0x6e, + 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x69, 0x2c, 0x63, 0x2c, 0x75, 0x29, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x75, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x2f, + 0x67, 0x2c, 0x22, 0x7e, 0x30, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x2f, 0x2f, 0x67, 0x2c, 0x22, 0x7e, + 0x31, 0x22, 0x29, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, + 0x74, 0x3d, 0x70, 0x28, 0x73, 0x65, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x73, 0x65, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x73, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x66, 0x73, 0x3d, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x55, 0x72, 0x6c, 0x3d, 0x73, 0x65, 0x2e, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x3d, 0x73, 0x65, + 0x2e, 0x5f, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x3d, 0x73, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x3d, 0x73, 0x65, 0x2e, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x66, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x59, 0x75, 0x3d, 0x49, 0x28, 0x29, 0x2c, + 0x5a, 0x75, 0x3d, 0x64, 0x73, 0x28, 0x29, 0x2c, 0x51, 0x75, 0x3d, 0x41, + 0x61, 0x28, 0x29, 0x2c, 0x42, 0x75, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, + 0x65, 0x74, 0x28, 0x5b, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x2c, 0x22, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x22, 0x2c, 0x22, 0x6d, 0x61, 0x78, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x22, 0x6d, 0x69, 0x6e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x22, 0x6d, 0x61, 0x78, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x22, 0x6d, + 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x2c, 0x22, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x2c, 0x22, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, + 0x22, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x22, 0x2c, 0x22, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x22, 0x2c, 0x22, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x22, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x22, 0x2c, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x2c, 0x22, 0x65, + 0x6e, 0x75, 0x6d, 0x22, 0x2c, 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x22, + 0x5d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x58, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x3d, 0x21, 0x30, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x3f, 0x21, 0x30, 0x3a, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, + 0x21, 0x6c, 0x73, 0x28, 0x74, 0x29, 0x3a, 0x65, 0x3f, 0x43, 0x61, 0x28, + 0x74, 0x29, 0x3c, 0x3d, 0x65, 0x3a, 0x21, 0x31, 0x7d, 0x73, 0x65, 0x2e, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x3d, 0x58, 0x75, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x64, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x53, 0x65, 0x74, 0x28, 0x5b, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x2c, + 0x22, 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, + 0x65, 0x66, 0x22, 0x2c, 0x22, 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0x2c, 0x22, + 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x22, + 0x2c, 0x22, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x22, 0x5d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x73, 0x28, 0x74, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x64, 0x2e, 0x68, 0x61, 0x73, + 0x28, 0x65, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x5b, 0x65, 0x5d, 0x3b, + 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x72, 0x29, 0x26, 0x26, 0x72, 0x2e, 0x73, + 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x73, 0x29, 0x7c, 0x7c, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x26, 0x26, 0x6c, 0x73, 0x28, 0x72, 0x29, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x43, 0x61, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x65, 0x3d, 0x30, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x72, + 0x3d, 0x3d, 0x3d, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2f, 0x30, 0x3b, 0x69, 0x66, 0x28, + 0x65, 0x2b, 0x2b, 0x2c, 0x21, 0x42, 0x75, 0x2e, 0x68, 0x61, 0x73, 0x28, + 0x72, 0x29, 0x26, 0x26, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x59, 0x75, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x29, 0x28, 0x74, 0x5b, 0x72, 0x5d, + 0x2c, 0x73, 0x3d, 0x3e, 0x65, 0x2b, 0x3d, 0x43, 0x61, 0x28, 0x73, 0x29, + 0x29, 0x2c, 0x65, 0x3d, 0x3d, 0x3d, 0x31, 0x2f, 0x30, 0x29, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2f, 0x30, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x3d, 0x22, + 0x22, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x21, 0x3d, 0x3d, 0x21, 0x31, 0x26, + 0x26, 0x28, 0x65, 0x3d, 0x6f, 0x74, 0x28, 0x65, 0x29, 0x29, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x73, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7a, + 0x61, 0x28, 0x74, 0x2c, 0x73, 0x29, 0x7d, 0x73, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x44, 0x61, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x61, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x28, 0x65, 0x29, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, 0x23, + 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x23, 0x22, 0x7d, 0x73, 0x65, + 0x2e, 0x5f, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x3d, 0x7a, 0x61, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x64, 0x3d, + 0x2f, 0x23, 0x5c, 0x2f, 0x3f, 0x24, 0x2f, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x74, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3f, 0x74, 0x2e, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x74, 0x64, 0x2c, 0x22, 0x22, 0x29, + 0x3a, 0x22, 0x22, 0x7d, 0x73, 0x65, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x3d, 0x6f, 0x74, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x3d, 0x6f, 0x74, 0x28, 0x72, 0x29, 0x2c, 0x74, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x73, + 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x55, 0x72, 0x6c, + 0x3d, 0x72, 0x64, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x64, 0x3d, 0x2f, + 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5f, 0x5d, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x2e, 0x5f, 0x5d, 0x2a, 0x24, 0x2f, 0x69, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x64, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x7d, 0x3b, + 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, + 0x3a, 0x72, 0x2c, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x6e, 0x3d, 0x6f, 0x74, 0x28, 0x74, 0x5b, 0x72, + 0x5d, 0x7c, 0x7c, 0x65, 0x29, 0x2c, 0x61, 0x3d, 0x7b, 0x22, 0x22, 0x3a, + 0x6e, 0x7d, 0x2c, 0x6f, 0x3d, 0x44, 0x61, 0x28, 0x73, 0x2c, 0x6e, 0x2c, + 0x21, 0x31, 0x29, 0x2c, 0x69, 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x51, 0x75, 0x28, 0x74, 0x2c, 0x7b, 0x61, 0x6c, 0x6c, 0x4b, + 0x65, 0x79, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x28, 0x6c, 0x2c, 0x79, + 0x2c, 0x68, 0x2c, 0x66, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x66, + 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x6f, + 0x2b, 0x79, 0x2c, 0x24, 0x3d, 0x61, 0x5b, 0x66, 0x5d, 0x3b, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6c, 0x5b, 0x72, 0x5d, 0x3d, 0x3d, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x26, 0x26, 0x28, 0x24, 0x3d, + 0x67, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x6c, 0x5b, 0x72, 0x5d, 0x29, 0x29, 0x2c, 0x52, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x2e, 0x24, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x29, 0x2c, 0x52, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x2e, 0x24, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x29, 0x2c, + 0x61, 0x5b, 0x79, 0x5d, 0x3d, 0x24, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x71, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x56, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x3b, 0x69, 0x66, 0x28, + 0x71, 0x3d, 0x6f, 0x74, 0x28, 0x24, 0x3f, 0x56, 0x28, 0x24, 0x2c, 0x71, + 0x29, 0x3a, 0x71, 0x29, 0x2c, 0x63, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x71, + 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x64, 0x28, 0x71, 0x29, + 0x3b, 0x63, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x71, 0x29, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x53, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, + 0x73, 0x5b, 0x71, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x3d, 0x3d, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x26, 0x26, 0x28, 0x53, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x53, 0x5d, 0x29, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x3d, 0x3d, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x75, 0x28, 0x6c, 0x2c, + 0x53, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x71, 0x29, 0x3a, + 0x71, 0x21, 0x3d, 0x3d, 0x6f, 0x74, 0x28, 0x6d, 0x29, 0x26, 0x26, 0x28, + 0x71, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x23, 0x22, 0x3f, 0x28, + 0x75, 0x28, 0x6c, 0x2c, 0x69, 0x5b, 0x71, 0x5d, 0x2c, 0x71, 0x29, 0x2c, + 0x69, 0x5b, 0x71, 0x5d, 0x3d, 0x6c, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x71, 0x5d, 0x3d, 0x6d, 0x29, 0x2c, + 0x71, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, + 0x28, 0x71, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x71, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x64, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x28, 0x71, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x20, 0x22, 0x24, 0x7b, 0x71, 0x7d, 0x22, 0x60, 0x29, 0x3b, 0x67, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x60, + 0x23, 0x24, 0x7b, 0x71, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x7d, 0x29, 0x2c, + 0x69, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x28, 0x6c, 0x2c, 0x79, 0x2c, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x79, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x21, + 0x5a, 0x75, 0x28, 0x6c, 0x2c, 0x79, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x20, 0x64, 0x28, 0x68, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6c, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x60, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x22, 0x24, 0x7b, 0x6c, 0x7d, 0x22, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x60, 0x29, 0x7d, 0x7d, 0x73, 0x65, 0x2e, 0x67, + 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x73, + 0x3d, 0x6e, 0x64, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x47, 0x65, + 0x3d, 0x70, 0x28, 0x54, 0x65, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x54, 0x65, 0x2c, 0x22, 0x5f, + 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x54, + 0x65, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x54, 0x65, + 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, 0x3d, + 0x54, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x46, + 0x61, 0x3d, 0x5f, 0x61, 0x28, 0x29, 0x2c, 0x56, 0x61, 0x3d, 0x6a, 0x74, + 0x28, 0x29, 0x2c, 0x6d, 0x73, 0x3d, 0x73, 0x73, 0x28, 0x29, 0x2c, 0x69, + 0x72, 0x3d, 0x6a, 0x74, 0x28, 0x29, 0x2c, 0x61, 0x64, 0x3d, 0x53, 0x61, + 0x28, 0x29, 0x2c, 0x4f, 0x74, 0x3d, 0x6b, 0x61, 0x28, 0x29, 0x2c, 0x66, + 0x73, 0x3d, 0x52, 0x61, 0x28, 0x29, 0x2c, 0x62, 0x3d, 0x45, 0x28, 0x29, + 0x2c, 0x50, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x6f, 0x64, 0x3d, 0x71, + 0x74, 0x28, 0x29, 0x2c, 0x6a, 0x65, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x4e, + 0x74, 0x3d, 0x74, 0x74, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x47, 0x61, 0x28, 0x74, 0x29, 0x26, 0x26, 0x28, 0x4a, 0x61, 0x28, + 0x74, 0x29, 0x2c, 0x48, 0x61, 0x28, 0x74, 0x29, 0x29, 0x29, 0x7b, 0x64, + 0x64, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, + 0x4c, 0x61, 0x28, 0x74, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, + 0x46, 0x61, 0x2e, 0x74, 0x6f, 0x70, 0x42, 0x6f, 0x6f, 0x6c, 0x4f, 0x72, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x28, 0x74, 0x29, 0x29, 0x7d, 0x54, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x69, 0x64, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x61, 0x28, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x74, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x3a, 0x73, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x6e, 0x7d, 0x2c, 0x61, + 0x29, 0x7b, 0x6e, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x65, 0x73, 0x35, + 0x3f, 0x74, 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x28, 0x65, 0x2c, 0x28, 0x30, + 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x7d, 0x2c, + 0x20, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x76, 0x61, 0x6c, 0x43, 0x78, 0x74, 0x7d, 0x60, 0x2c, 0x73, 0x2e, + 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, + 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, + 0x5f, 0x29, 0x60, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x20, 0x24, 0x7b, 0x78, 0x61, 0x28, 0x72, 0x2c, + 0x6e, 0x29, 0x7d, 0x60, 0x29, 0x2c, 0x75, 0x64, 0x28, 0x74, 0x2c, 0x6e, + 0x29, 0x2c, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x29, 0x7d, + 0x29, 0x3a, 0x74, 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x28, 0x65, 0x2c, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x7d, + 0x2c, 0x20, 0x24, 0x7b, 0x63, 0x64, 0x28, 0x6e, 0x29, 0x7d, 0x60, 0x2c, + 0x73, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x28, 0x29, 0x3d, + 0x3e, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x78, 0x61, 0x28, 0x72, + 0x2c, 0x6e, 0x29, 0x29, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x29, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x64, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x24, 0x7b, 0x50, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x3d, 0x22, 0x22, + 0x2c, 0x20, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x7d, 0x2c, 0x20, + 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x7d, 0x3d, 0x24, 0x7b, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x7d, 0x24, 0x7b, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x52, 0x65, 0x66, 0x3f, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, + 0x29, 0x60, 0x2c, 0x20, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x7d, 0x3d, 0x7b, 0x7d, 0x60, 0x3a, + 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x7d, 0x3d, 0x7b, 0x7d, 0x60, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x64, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x74, 0x2e, 0x69, 0x66, 0x28, 0x50, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x43, + 0x78, 0x74, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x76, 0x61, + 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x2c, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x61, 0x6c, + 0x43, 0x78, 0x74, 0x7d, 0x2e, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x76, + 0x61, 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, + 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x43, + 0x78, 0x74, 0x7d, 0x2e, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x2c, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x76, 0x61, 0x6c, 0x43, 0x78, 0x74, 0x7d, 0x2e, 0x24, 0x7b, 0x50, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x72, + 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, 0x28, 0x30, 0x2c, 0x62, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x43, 0x78, 0x74, 0x7d, 0x2e, + 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x7d, 0x60, 0x29, 0x2c, + 0x65, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, + 0x26, 0x26, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x2c, 0x28, 0x30, 0x2c, + 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x43, 0x78, 0x74, 0x7d, + 0x2e, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x73, 0x7d, 0x60, 0x29, 0x7d, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x7b, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x2c, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, + 0x29, 0x60, 0x22, 0x22, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x72, + 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, 0x28, 0x30, + 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x2c, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, + 0x60, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, + 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x2c, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x26, 0x26, 0x74, 0x2e, 0x76, 0x61, + 0x72, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x73, 0x2c, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x7b, + 0x7d, 0x60, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x6f, 0x70, + 0x74, 0x73, 0x3a, 0x72, 0x2c, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x7d, 0x3d, + 0x74, 0x3b, 0x4c, 0x61, 0x28, 0x74, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, + 0x72, 0x2e, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x26, 0x26, + 0x65, 0x2e, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x26, 0x26, + 0x59, 0x61, 0x28, 0x74, 0x29, 0x2c, 0x68, 0x64, 0x28, 0x74, 0x29, 0x2c, + 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x73, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x30, 0x29, 0x2c, 0x72, 0x2e, 0x75, 0x6e, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x26, 0x26, 0x6c, + 0x64, 0x28, 0x74, 0x29, 0x2c, 0x57, 0x61, 0x28, 0x74, 0x29, 0x2c, 0x5f, + 0x64, 0x28, 0x74, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x72, 0x7d, 0x3d, + 0x74, 0x3b, 0x74, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x3d, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x28, 0x30, + 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x2e, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x60, 0x29, 0x2c, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x74, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x7d, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, + 0x6f, 0x70, 0x73, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x74, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x7d, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x60, 0x2c, + 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x75, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x74, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x7d, + 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x74, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x7d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x2c, 0x28, 0x30, + 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x60, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x26, 0x26, 0x74, 0x5b, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x49, 0x64, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x26, 0x26, 0x28, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x7c, 0x7c, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x29, 0x3f, 0x28, 0x30, + 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x2f, 0x2a, 0x23, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x3d, 0x24, 0x7b, 0x72, 0x7d, + 0x20, 0x2a, 0x2f, 0x60, 0x3a, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x64, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x47, 0x61, 0x28, 0x74, 0x29, + 0x26, 0x26, 0x28, 0x4a, 0x61, 0x28, 0x74, 0x29, 0x2c, 0x48, 0x61, 0x28, + 0x74, 0x29, 0x29, 0x29, 0x7b, 0x6d, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x28, 0x30, 0x2c, 0x46, + 0x61, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x4f, 0x72, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, + 0x61, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x2c, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x69, 0x66, 0x28, 0x65, + 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, 0x61, 0x6c, 0x6c, 0x5b, 0x72, + 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x61, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x21, 0x3d, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x6f, 0x70, 0x74, + 0x73, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x6e, 0x2e, 0x24, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x72, 0x2e, 0x24, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x59, 0x61, 0x28, 0x74, 0x29, + 0x2c, 0x79, 0x64, 0x28, 0x74, 0x29, 0x2c, 0x24, 0x64, 0x28, 0x74, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x73, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x28, 0x22, 0x5f, 0x65, 0x72, 0x72, 0x73, 0x22, 0x2c, 0x50, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x29, 0x3b, 0x57, 0x61, 0x28, 0x74, 0x2c, 0x61, 0x29, + 0x2c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x65, 0x2c, 0x28, 0x30, 0x2c, + 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x60, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x61, 0x28, + 0x74, 0x29, 0x7b, 0x28, 0x30, 0x2c, 0x6a, 0x65, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x29, 0x28, 0x74, 0x29, 0x2c, 0x70, 0x64, 0x28, 0x74, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x61, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6a, 0x74, 0x64, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x4b, 0x61, 0x28, 0x74, 0x2c, 0x5b, 0x5d, 0x2c, 0x21, + 0x31, 0x2c, 0x65, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x28, + 0x30, 0x2c, 0x56, 0x61, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x28, 0x74, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x2c, 0x73, 0x3d, 0x28, 0x30, 0x2c, + 0x56, 0x61, 0x2e, 0x63, 0x6f, 0x65, 0x72, 0x63, 0x65, 0x41, 0x6e, 0x64, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x29, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x3b, 0x4b, 0x61, 0x28, 0x74, + 0x2c, 0x72, 0x2c, 0x21, 0x73, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x64, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, + 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, + 0x74, 0x68, 0x3a, 0x72, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x73, 0x2c, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x65, 0x2e, + 0x24, 0x72, 0x65, 0x66, 0x26, 0x26, 0x73, 0x2e, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x52, 0x65, 0x66, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x6a, 0x65, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, 0x65, 0x66, 0x29, 0x28, 0x65, + 0x2c, 0x6e, 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x29, 0x26, 0x26, 0x6e, + 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, + 0x28, 0x60, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x20, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x61, + 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, 0x7b, 0x72, 0x7d, + 0x22, 0x60, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x6f, 0x70, 0x74, 0x73, + 0x3a, 0x72, 0x7d, 0x3d, 0x74, 0x3b, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x26, 0x26, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x26, 0x26, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x26, 0x26, 0x28, 0x30, 0x2c, + 0x6a, 0x65, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x72, 0x6f, 0x6f, 0x74, + 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, + 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, + 0x5d, 0x3b, 0x65, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x62, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x3d, 0x28, 0x30, 0x2c, 0x6f, 0x64, 0x2e, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x55, 0x72, 0x6c, 0x29, 0x28, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x2c, 0x74, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x2c, 0x65, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x24, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x24, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x26, 0x26, 0x21, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x45, 0x6e, 0x76, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x79, 0x6e, + 0x63, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x61, 0x28, 0x7b, + 0x67, 0x65, 0x6e, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x45, 0x6e, 0x76, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x61, 0x74, 0x68, 0x3a, 0x73, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, + 0x6e, 0x7d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x72, 0x2e, + 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x2e, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x3d, + 0x3d, 0x21, 0x30, 0x29, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x7d, + 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x28, + 0x24, 0x7b, 0x61, 0x7d, 0x29, 0x60, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x2e, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x3d, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x73, 0x74, + 0x72, 0x29, 0x60, 0x24, 0x7b, 0x73, 0x7d, 0x2f, 0x24, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x2c, 0x69, 0x3d, 0x74, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x72, 0x6f, + 0x6f, 0x74, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x65, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x7d, 0x29, 0x3b, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x73, 0x65, 0x6c, + 0x66, 0x7d, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x24, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x24, 0x7b, 0x61, 0x7d, 0x2c, 0x20, 0x24, + 0x7b, 0x6f, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x29, 0x60, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x64, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3a, 0x72, 0x2c, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x73, + 0x2c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x6e, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, + 0x61, 0x7d, 0x3d, 0x74, 0x3b, 0x72, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x3f, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x3d, + 0x3d, 0x3d, 0x20, 0x30, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x50, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x2c, 0x28, + 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x6e, 0x65, 0x77, 0x20, 0x24, + 0x7b, 0x6e, 0x7d, 0x28, 0x24, 0x7b, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, + 0x29, 0x60, 0x29, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x73, 0x7d, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x60, 0x2c, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x29, 0x2c, 0x61, 0x2e, 0x75, 0x6e, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x26, 0x26, 0x67, 0x64, + 0x28, 0x74, 0x29, 0x2c, 0x65, 0x2e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x60, 0x29, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, + 0x64, 0x28, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x74, 0x2c, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x65, 0x2c, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x3a, 0x72, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x73, + 0x7d, 0x29, 0x7b, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x26, 0x26, + 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, + 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x65, 0x7d, 0x2e, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x60, 0x2c, 0x72, 0x29, 0x2c, 0x73, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x26, 0x26, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x65, 0x7d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x2c, 0x73, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x61, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x61, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6f, 0x2c, + 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x69, 0x2c, + 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x63, 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x75, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x3a, + 0x64, 0x7d, 0x3d, 0x75, 0x3b, 0x69, 0x66, 0x28, 0x61, 0x2e, 0x24, 0x72, + 0x65, 0x66, 0x26, 0x26, 0x28, 0x63, 0x2e, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x52, 0x65, 0x66, 0x7c, 0x7c, 0x21, 0x28, 0x30, 0x2c, 0x6a, 0x65, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x61, 0x73, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, 0x65, 0x66, 0x29, 0x28, 0x61, + 0x2c, 0x64, 0x29, 0x29, 0x29, 0x7b, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x51, 0x61, 0x28, 0x74, 0x2c, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x64, 0x2e, 0x61, 0x6c, 0x6c, 0x2e, + 0x24, 0x72, 0x65, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7d, 0x63, 0x2e, 0x6a, 0x74, 0x64, 0x7c, 0x7c, 0x76, 0x64, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, + 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x2e, 0x72, 0x75, 0x6c, 0x65, + 0x73, 0x29, 0x6c, 0x28, 0x79, 0x29, 0x3b, 0x6c, 0x28, 0x64, 0x2e, 0x70, + 0x6f, 0x73, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x79, 0x29, 0x7b, 0x28, 0x30, 0x2c, + 0x6d, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x55, 0x73, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x29, 0x28, 0x61, 0x2c, 0x79, 0x29, 0x26, + 0x26, 0x28, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x3f, 0x28, 0x6e, 0x2e, + 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x69, 0x72, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x28, + 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x6f, 0x2c, 0x63, 0x2e, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x29, 0x29, 0x2c, 0x55, 0x61, 0x28, 0x74, 0x2c, 0x79, 0x29, 0x2c, 0x65, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x31, 0x26, + 0x26, 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x79, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x26, 0x26, 0x72, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x65, 0x6c, + 0x73, 0x65, 0x28, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x69, 0x72, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x28, 0x74, 0x29, 0x29, 0x2c, 0x6e, 0x2e, 0x65, 0x6e, + 0x64, 0x49, 0x66, 0x28, 0x29, 0x29, 0x3a, 0x55, 0x61, 0x28, 0x74, 0x2c, + 0x79, 0x29, 0x2c, 0x69, 0x7c, 0x7c, 0x6e, 0x2e, 0x69, 0x66, 0x28, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x50, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x73, 0x7c, 0x7c, + 0x30, 0x7d, 0x60, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, + 0x7b, 0x75, 0x73, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x3a, 0x6e, 0x7d, 0x7d, 0x3d, 0x74, 0x3b, 0x6e, 0x26, 0x26, 0x28, 0x30, + 0x2c, 0x61, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x29, 0x28, 0x74, 0x2c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x2c, 0x72, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x61, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x2e, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x29, 0x28, 0x30, 0x2c, 0x6d, 0x73, 0x2e, 0x73, 0x68, + 0x6f, 0x75, 0x6c, 0x64, 0x55, 0x73, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x29, + 0x28, 0x73, 0x2c, 0x61, 0x29, 0x26, 0x26, 0x51, 0x61, 0x28, 0x74, 0x2c, + 0x61, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x61, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x65, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x64, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x7c, 0x7c, 0x21, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x7c, 0x7c, 0x28, 0x62, 0x64, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x7c, 0x7c, 0x77, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x45, 0x64, + 0x28, 0x74, 0x2c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x62, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x21, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x74, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x65, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x65, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x72, 0x3d, 0x3e, 0x7b, 0x5a, 0x61, + 0x28, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x2c, 0x72, 0x29, 0x7c, 0x7c, 0x70, 0x73, 0x28, 0x74, 0x2c, 0x60, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x72, 0x7d, 0x22, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x22, 0x24, + 0x7b, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x7d, 0x22, + 0x60, 0x29, 0x7d, 0x29, 0x2c, 0x53, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, + 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3e, 0x31, 0x26, 0x26, 0x21, 0x28, 0x65, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x32, 0x26, 0x26, 0x65, + 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x22, 0x6e, + 0x75, 0x6c, 0x6c, 0x22, 0x29, 0x29, 0x26, 0x26, 0x70, 0x73, 0x28, 0x74, + 0x2c, 0x22, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, + 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x75, 0x6e, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x45, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x52, 0x55, + 0x4c, 0x45, 0x53, 0x2e, 0x61, 0x6c, 0x6c, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x72, 0x5b, 0x73, 0x5d, 0x3b, 0x69, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3d, 0x3d, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x28, 0x30, + 0x2c, 0x6d, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x55, 0x73, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x29, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2c, 0x6e, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x61, 0x7d, 0x3d, 0x6e, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x21, 0x61, 0x2e, 0x73, 0x6f, + 0x6d, 0x65, 0x28, 0x6f, 0x3d, 0x3e, 0x50, 0x64, 0x28, 0x65, 0x2c, 0x6f, + 0x29, 0x29, 0x26, 0x26, 0x70, 0x73, 0x28, 0x74, 0x2c, 0x60, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, + 0x24, 0x7b, 0x61, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, + 0x29, 0x7d, 0x22, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x7d, 0x22, 0x60, 0x29, + 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x50, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x73, 0x28, 0x65, 0x29, 0x7c, 0x7c, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x26, 0x26, 0x74, 0x2e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5a, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x28, 0x65, 0x29, 0x7c, 0x7c, 0x65, 0x3d, 0x3d, + 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x26, 0x26, + 0x74, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x64, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, + 0x5a, 0x61, 0x28, 0x65, 0x2c, 0x73, 0x29, 0x3f, 0x72, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x73, 0x29, 0x3a, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x28, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x29, 0x26, 0x26, 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x26, 0x26, 0x72, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x29, + 0x3b, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x3d, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x73, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x2b, 0x74, 0x2e, 0x65, + 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x3b, 0x65, 0x2b, 0x3d, 0x60, 0x20, 0x61, 0x74, 0x20, 0x22, 0x24, 0x7b, + 0x72, 0x7d, 0x22, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x29, 0x60, 0x2c, 0x28, 0x30, 0x2c, 0x6a, 0x65, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x74, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x63, 0x72, + 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4f, 0x74, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x55, 0x73, 0x61, 0x67, 0x65, 0x29, 0x28, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, + 0x3d, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, 0x65, 0x2e, + 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3d, 0x73, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x65, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5b, 0x73, 0x5d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x3d, 0x72, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x26, 0x26, 0x65, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x28, 0x30, 0x2c, 0x6a, 0x65, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x4f, 0x72, 0x56, 0x61, 0x6c, + 0x29, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2c, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x72, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, + 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x3d, + 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x2c, 0x42, 0x61, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x2c, 0x65, 0x29, 0x29, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x21, 0x28, 0x30, 0x2c, 0x4f, 0x74, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2c, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x2c, 0x72, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x6e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x24, 0x7b, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x28, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x29, 0x7d, 0x60, 0x29, 0x3b, 0x28, 0x22, 0x63, 0x6f, 0x64, + 0x65, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x3f, 0x72, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x72, 0x2e, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x26, + 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x5f, 0x65, 0x72, 0x72, 0x73, 0x22, + 0x2c, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x29, 0x29, 0x7d, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, + 0x65, 0x29, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7d, 0x66, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, + 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x69, + 0x66, 0x28, 0x65, 0x29, 0x2c, 0x73, 0x3f, 0x73, 0x28, 0x29, 0x3a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, + 0x72, 0x3f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, + 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x28, 0x29, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, + 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, 0x29, 0x3a, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3f, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x6e, 0x64, + 0x49, 0x66, 0x28, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x6e, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x7d, 0x70, 0x61, 0x73, + 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x28, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x65, 0x29, 0x2c, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x72, 0x29, 0x7d, 0x66, 0x61, + 0x69, 0x6c, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x69, + 0x66, 0x28, 0x21, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x69, 0x66, + 0x28, 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, + 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3f, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x6c, + 0x73, 0x65, 0x28, 0x29, 0x7d, 0x66, 0x61, 0x69, 0x6c, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x61, 0x69, + 0x6c, 0x28, 0x65, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x72, 0x7d, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x61, 0x69, + 0x6c, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x72, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x26, 0x26, 0x20, 0x28, 0x24, 0x7b, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x6f, 0x72, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x24, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x29, 0x2c, 0x65, 0x29, 0x7d, 0x29, 0x60, 0x29, 0x7d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x72, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x65, 0x2c, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x7d, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x73, 0x29, 0x7d, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x28, 0x65, 0x3f, 0x4e, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x4e, + 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x65, 0x66, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x72, + 0x29, 0x7d, 0x24, 0x64, 0x61, 0x74, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x29, 0x7b, 0x28, 0x30, 0x2c, 0x4e, 0x74, 0x2e, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x2e, + 0x24, 0x64, 0x61, 0x74, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7c, 0x7c, + 0x4e, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x24, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7d, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x72, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x27, 0x61, 0x64, 0x64, 0x20, 0x22, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x3b, 0x28, 0x30, 0x2c, 0x4e, + 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x65, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, + 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x7d, 0x6f, 0x6b, 0x28, + 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x6e, 0x2e, 0x69, 0x66, 0x28, 0x65, 0x29, 0x7d, 0x73, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x3f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x65, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3d, 0x65, 0x7d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x3d, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x67, 0x65, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x65, 0x2c, + 0x73, 0x29, 0x2c, 0x72, 0x28, 0x29, 0x7d, 0x29, 0x7d, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x65, 0x3d, 0x62, 0x2e, + 0x6e, 0x69, 0x6c, 0x2c, 0x72, 0x3d, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x6e, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x61, 0x2c, 0x64, + 0x65, 0x66, 0x3a, 0x6f, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x3b, 0x73, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x6f, 0x72, 0x29, + 0x28, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x60, 0x2c, 0x72, 0x29, 0x29, 0x2c, 0x65, 0x21, 0x3d, + 0x3d, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x26, 0x26, 0x73, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x65, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x28, + 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7c, 0x7c, 0x6f, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x65, 0x6c, 0x73, 0x65, + 0x49, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x65, 0x21, 0x3d, 0x3d, 0x62, 0x2e, + 0x6e, 0x69, 0x6c, 0x26, 0x26, 0x73, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x65, 0x2c, 0x21, 0x31, 0x29, 0x29, 0x2c, 0x73, 0x2e, 0x65, + 0x6c, 0x73, 0x65, 0x28, 0x29, 0x7d, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x73, 0x2c, 0x64, 0x65, 0x66, + 0x3a, 0x6e, 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x62, + 0x2e, 0x6f, 0x72, 0x29, 0x28, 0x6f, 0x28, 0x29, 0x2c, 0x69, 0x28, 0x29, + 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x72, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, + 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x29, + 0x3f, 0x73, 0x3a, 0x5b, 0x73, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x28, + 0x30, 0x2c, 0x69, 0x72, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, + 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x28, 0x63, 0x2c, 0x72, + 0x2c, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2c, 0x69, 0x72, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x29, 0x7d, 0x60, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, + 0x65, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x6e, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x21, 0x24, 0x7b, 0x63, 0x7d, + 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x29, 0x60, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x7d, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x28, 0x30, 0x2c, 0x66, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x2c, 0x65, + 0x29, 0x3b, 0x28, 0x30, 0x2c, 0x66, 0x73, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, + 0x61, 0x74, 0x61, 0x29, 0x28, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x69, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x66, 0x73, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x73, 0x2c, 0x65, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x7b, 0x2e, 0x2e, 0x2e, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, 0x2c, 0x2e, 0x2e, 0x2e, 0x73, + 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x64, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x2c, 0x6e, 0x7d, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x69, 0x74, 0x3a, + 0x73, 0x2c, 0x67, 0x65, 0x6e, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x3b, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x26, 0x26, 0x28, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x26, + 0x26, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x3d, 0x6a, 0x65, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x28, 0x6e, 0x2c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x73, 0x2c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x2c, 0x72, 0x29, + 0x29, 0x2c, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x21, 0x3d, 0x3d, + 0x21, 0x30, 0x26, 0x26, 0x65, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, + 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x6a, 0x65, 0x2e, 0x6d, 0x65, + 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x28, 0x6e, 0x2c, 0x65, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x2c, 0x72, 0x29, 0x29, 0x29, 0x7d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x69, + 0x74, 0x3a, 0x73, 0x2c, 0x67, 0x65, 0x6e, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, + 0x3d, 0x3d, 0x21, 0x30, 0x7c, 0x7c, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x69, 0x66, 0x28, 0x72, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x28, 0x65, 0x2c, + 0x62, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x2c, 0x21, 0x30, 0x7d, + 0x7d, 0x3b, 0x54, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x78, 0x74, 0x3d, 0x63, 0x72, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x61, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x63, 0x72, 0x28, 0x74, 0x2c, 0x72, 0x2c, 0x65, 0x29, 0x3b, + 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x3f, 0x72, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x2c, 0x73, 0x29, 0x3a, 0x6e, + 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, 0x26, 0x26, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3f, 0x28, 0x30, 0x2c, 0x4f, 0x74, + 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x3a, 0x22, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x3f, 0x28, + 0x30, 0x2c, 0x4f, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x4b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x6e, + 0x2c, 0x72, 0x29, 0x3a, 0x28, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x7c, 0x7c, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x29, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x4f, 0x74, 0x2e, 0x66, + 0x75, 0x6e, 0x63, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, + 0x64, 0x65, 0x29, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x6a, 0x64, 0x3d, 0x2f, 0x5e, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, + 0x5e, 0x7e, 0x5d, 0x7c, 0x7e, 0x30, 0x7c, 0x7e, 0x31, 0x29, 0x2a, 0x24, + 0x2f, 0x2c, 0x71, 0x64, 0x3d, 0x2f, 0x5e, 0x28, 0x5b, 0x30, 0x2d, 0x39, + 0x5d, 0x2b, 0x29, 0x28, 0x23, 0x7c, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, + 0x5e, 0x7e, 0x5d, 0x7c, 0x7e, 0x30, 0x7c, 0x7e, 0x31, 0x29, 0x2a, 0x29, + 0x3f, 0x24, 0x2f, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x42, 0x61, 0x28, 0x74, 0x2c, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x41, 0x72, 0x72, 0x3a, 0x73, 0x7d, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x6e, 0x2c, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x3d, + 0x3d, 0x3d, 0x22, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x5b, + 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x21, 0x6a, 0x64, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, + 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x60, 0x29, 0x3b, 0x6e, + 0x3d, 0x74, 0x2c, 0x61, 0x3d, 0x50, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x71, + 0x64, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x75, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2d, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x60, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x3d, 0x2b, 0x75, 0x5b, 0x31, + 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x75, 0x5b, 0x32, 0x5d, 0x2c, + 0x6e, 0x3d, 0x3d, 0x3d, 0x22, 0x23, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x64, 0x3e, 0x3d, 0x65, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x28, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x2c, 0x64, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x5b, 0x65, 0x2d, 0x64, 0x5d, 0x7d, 0x69, 0x66, + 0x28, 0x64, 0x3e, 0x65, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x28, 0x22, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x64, 0x29, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x61, 0x3d, 0x72, 0x5b, 0x65, 0x2d, 0x64, 0x5d, 0x2c, 0x21, 0x6e, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x6c, 0x65, + 0x74, 0x20, 0x6f, 0x3d, 0x61, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x28, 0x22, 0x2f, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x29, + 0x75, 0x26, 0x26, 0x28, 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x62, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x29, 0x28, 0x28, 0x30, 0x2c, 0x6a, 0x65, 0x2e, 0x75, 0x6e, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x29, 0x28, 0x75, 0x29, 0x29, 0x7d, 0x60, 0x2c, 0x6f, + 0x3d, 0x28, 0x30, 0x2c, 0x62, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, + 0x7d, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x60, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x75, 0x2c, 0x64, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x43, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x24, 0x7b, + 0x75, 0x7d, 0x20, 0x24, 0x7b, 0x64, 0x7d, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x20, 0x75, 0x70, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, + 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x7d, 0x7d, 0x54, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x42, 0x61, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6b, 0x74, 0x3d, 0x70, 0x28, 0x79, 0x73, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x79, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x73, 0x3d, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7b, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3d, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6a, 0x76, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x21, 0x30, 0x7d, 0x7d, 0x3b, 0x79, 0x73, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x68, 0x73, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x3d, 0x70, 0x28, 0x67, 0x73, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x67, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x73, + 0x3d, 0x71, 0x74, 0x28, 0x29, 0x2c, 0x5f, 0x73, 0x3d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, + 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x6e, 0x7c, 0x7c, 0x60, + 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x64, + 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x3d, + 0x28, 0x30, 0x2c, 0x24, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x55, 0x72, 0x6c, 0x29, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x24, + 0x73, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, + 0x64, 0x29, 0x28, 0x28, 0x30, 0x2c, 0x24, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x29, 0x28, 0x65, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x66, 0x29, 0x29, 0x7d, 0x7d, 0x3b, 0x67, 0x73, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x5f, 0x73, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x49, 0x74, 0x3d, 0x70, 0x28, 0x64, 0x65, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x64, 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x64, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x64, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x64, 0x65, 0x2e, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x52, 0x65, 0x66, 0x3d, 0x64, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3d, 0x64, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x45, 0x6e, 0x76, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6d, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4e, 0x64, + 0x3d, 0x6b, 0x74, 0x28, 0x29, 0x2c, 0x4a, 0x65, 0x3d, 0x6f, 0x65, 0x28, + 0x29, 0x2c, 0x70, 0x65, 0x3d, 0x71, 0x74, 0x28, 0x29, 0x2c, 0x58, 0x61, + 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x4f, 0x64, 0x3d, 0x47, 0x65, 0x28, 0x29, + 0x2c, 0x63, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x66, 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x73, 0x3d, 0x7b, 0x7d, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x73, + 0x3b, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x26, 0x26, 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x49, 0x64, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x49, 0x64, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x3d, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x7c, 0x7c, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x3d, 0x28, 0x72, 0x3d, 0x65, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x72, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x72, 0x3a, + 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, 0x28, 0x73, 0x3f, 0x2e, 0x5b, 0x65, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x7c, 0x7c, 0x22, + 0x24, 0x69, 0x64, 0x22, 0x5d, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x65, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, + 0x66, 0x73, 0x3d, 0x65, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, + 0x66, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x3d, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3d, 0x73, 0x3f, 0x2e, 0x24, + 0x61, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x65, 0x66, 0x73, 0x3d, 0x7b, 0x7d, 0x7d, 0x7d, 0x3b, 0x64, 0x65, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3d, 0x63, 0x74, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x73, + 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x65, 0x6f, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x28, 0x30, + 0x2c, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x2c, 0x74, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x62, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x29, 0x2c, 0x7b, 0x65, 0x73, 0x35, 0x3a, 0x73, + 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x7b, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x6f, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6d, + 0x65, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x7b, 0x65, 0x73, + 0x35, 0x3a, 0x73, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x6e, 0x2c, + 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3a, 0x61, 0x7d, 0x29, 0x2c, 0x69, 0x3b, 0x74, 0x2e, 0x24, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x26, 0x26, 0x28, 0x69, 0x3d, 0x6f, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x4e, + 0x64, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x3a, 0x28, 0x30, 0x2c, 0x6d, 0x65, 0x2e, 0x5f, 0x29, 0x60, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x61, 0x6a, 0x76, + 0x2f, 0x64, 0x69, 0x73, 0x74, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x60, 0x7d, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x63, 0x3d, 0x6f, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x63, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x75, 0x3d, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x6f, 0x2c, 0x61, 0x6c, 0x6c, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x4a, 0x65, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2c, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x4a, + 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3a, 0x4a, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x5b, 0x4a, 0x65, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x5d, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68, 0x41, 0x72, + 0x72, 0x3a, 0x5b, 0x6d, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x5d, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x30, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x2c, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, + 0x74, 0x2c, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x66, 0x3a, 0x6f, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x3d, + 0x3d, 0x21, 0x30, 0x3f, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x74, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x28, + 0x30, 0x2c, 0x6d, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x29, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x29, 0x7d, 0x3a, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x74, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x7d, 0x29, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x2c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x3a, 0x69, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3a, 0x74, 0x2c, 0x72, 0x6f, 0x6f, 0x74, + 0x49, 0x64, 0x3a, 0x72, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x3a, + 0x74, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x7c, 0x7c, 0x72, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x6d, + 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x74, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x7c, 0x7c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6a, 0x74, 0x64, + 0x3f, 0x22, 0x22, 0x3a, 0x22, 0x23, 0x22, 0x29, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x28, 0x30, 0x2c, 0x6d, 0x65, + 0x2e, 0x5f, 0x29, 0x60, 0x22, 0x22, 0x60, 0x2c, 0x6f, 0x70, 0x74, 0x73, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x2c, 0x64, 0x3b, + 0x74, 0x72, 0x79, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x61, + 0x64, 0x64, 0x28, 0x74, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x4f, 0x64, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x75, 0x29, + 0x2c, 0x6f, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x3d, 0x6f, 0x2e, 0x74, 0x6f, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x64, 0x3d, 0x60, 0x24, + 0x7b, 0x6f, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x66, 0x73, + 0x28, 0x4a, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x26, 0x26, 0x28, 0x64, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, 0x64, 0x2c, + 0x74, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x68, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x60, + 0x24, 0x7b, 0x4a, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x7d, 0x60, 0x2c, 0x60, 0x24, 0x7b, 0x4a, + 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x7d, 0x60, 0x2c, 0x64, 0x29, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x29, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x63, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x68, + 0x7d, 0x29, 0x2c, 0x68, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x68, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x68, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3d, 0x74, + 0x2c, 0x74, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x26, 0x26, 0x28, + 0x68, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3d, 0x21, 0x30, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x3d, + 0x3d, 0x21, 0x30, 0x26, 0x26, 0x28, 0x68, 0x2e, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x3d, 0x7b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x6c, 0x2c, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x6f, 0x2e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x7d, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3a, 0x66, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x6d, 0x7d, 0x3d, 0x75, 0x3b, 0x68, 0x2e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3d, 0x7b, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x3a, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x66, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3f, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x6d, 0x2c, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x3a, 0x66, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6d, + 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x6d, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2c, 0x68, 0x2e, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x26, 0x26, 0x28, 0x68, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3d, + 0x28, 0x30, 0x2c, 0x6d, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x79, 0x29, 0x28, 0x68, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x29, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x3d, 0x68, 0x2c, 0x74, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, + 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, + 0x64, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x6f, 0x67, 0x67, + 0x65, 0x72, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, + 0x22, 0x2c, 0x64, 0x29, 0x2c, 0x6c, 0x7d, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x64, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3d, 0x62, 0x73, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6b, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x3b, 0x72, 0x3d, 0x28, 0x30, 0x2c, 0x70, + 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x55, 0x72, 0x6c, + 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x74, + 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x72, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x61, 0x3d, 0x54, 0x64, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x61, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x28, 0x73, 0x3d, 0x74, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x73, 0x29, 0x3d, + 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x73, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x3a, 0x73, 0x5b, 0x72, 0x5d, 0x2c, 0x7b, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x69, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x6f, 0x26, 0x26, 0x28, 0x61, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x74, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x6f, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, + 0x64, 0x3a, 0x69, 0x2c, 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x74, 0x2c, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x3a, 0x65, 0x7d, 0x29, 0x29, 0x7d, 0x69, + 0x66, 0x28, 0x61, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x72, 0x65, + 0x66, 0x73, 0x5b, 0x72, 0x5d, 0x3d, 0x49, 0x64, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x29, 0x7d, 0x64, 0x65, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x52, 0x65, 0x66, 0x3d, + 0x6b, 0x64, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x49, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x52, 0x65, 0x66, 0x29, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x73, 0x29, 0x3f, + 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3f, 0x74, 0x3a, 0x62, 0x73, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x6f, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x69, 0x66, 0x28, 0x52, 0x64, 0x28, 0x65, 0x2c, 0x74, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x64, 0x65, 0x2e, + 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x65, 0x6f, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x64, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x3d, 0x65, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x26, 0x26, 0x74, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x3d, 0x3d, 0x3d, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x26, 0x26, + 0x74, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x3d, 0x3d, 0x3d, 0x65, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x28, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x65, 0x5d, 0x29, 0x3d, 0x3d, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3b, 0x29, 0x65, 0x3d, + 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7c, 0x7c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x75, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x72, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x28, 0x65, 0x29, 0x2c, 0x73, 0x3d, 0x28, 0x30, 0x2c, 0x70, 0x65, + 0x2e, 0x5f, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x2c, 0x72, 0x29, 0x2c, 0x6e, 0x3d, 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, + 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x29, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, + 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2c, 0x74, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x2c, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, + 0x30, 0x26, 0x26, 0x73, 0x3d, 0x3d, 0x3d, 0x6e, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x76, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x72, 0x2c, 0x74, 0x29, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x61, 0x3d, 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, 0x28, 0x73, + 0x29, 0x2c, 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, + 0x73, 0x5b, 0x61, 0x5d, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x5b, 0x61, 0x5d, 0x3b, 0x69, 0x66, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6f, 0x3d, 0x3d, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x69, 0x3d, 0x75, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x74, 0x2c, 0x6f, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x69, + 0x3f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x21, 0x3d, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x3a, 0x76, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x72, 0x2c, 0x69, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6f, 0x3f, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6f, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x7c, 0x7c, 0x62, 0x73, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6f, 0x29, 0x2c, 0x61, 0x3d, + 0x3d, 0x3d, 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, 0x28, 0x65, 0x29, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x69, 0x7d, 0x3d, 0x6f, 0x2c, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x49, 0x64, 0x3a, 0x63, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x75, 0x3d, 0x69, 0x5b, 0x63, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x26, 0x26, 0x28, 0x6e, 0x3d, + 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x55, 0x72, 0x6c, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x2c, 0x6e, 0x2c, 0x75, 0x29, 0x29, 0x2c, 0x6e, 0x65, + 0x77, 0x20, 0x63, 0x74, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x69, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, + 0x63, 0x2c, 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x74, 0x2c, 0x62, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x3a, 0x6e, 0x7d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x76, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x72, 0x2c, 0x6f, 0x29, 0x7d, 0x7d, 0x64, 0x65, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3d, 0x75, 0x72, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x64, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x5b, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x22, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x22, 0x65, 0x6e, 0x75, 0x6d, + 0x22, 0x2c, 0x22, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x69, 0x65, 0x73, 0x22, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x73, 0x28, 0x74, 0x2c, 0x7b, + 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x73, + 0x7d, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3b, 0x69, 0x66, 0x28, + 0x28, 0x28, 0x6e, 0x3d, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, + 0x6e, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x21, + 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x28, 0x22, 0x2f, 0x22, 0x29, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x72, 0x5b, + 0x28, 0x30, 0x2c, 0x58, 0x61, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x28, + 0x69, 0x29, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x63, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x72, 0x3d, 0x63, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x72, 0x5b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x49, 0x64, 0x5d, 0x3b, 0x21, 0x4d, 0x64, 0x2e, 0x68, 0x61, 0x73, + 0x28, 0x69, 0x29, 0x26, 0x26, 0x75, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x28, + 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x55, 0x72, 0x6c, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x2c, 0x65, 0x2c, 0x75, 0x29, 0x29, 0x7d, 0x6c, 0x65, 0x74, + 0x20, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x72, 0x21, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x26, 0x26, 0x72, 0x2e, 0x24, 0x72, 0x65, 0x66, 0x26, 0x26, 0x21, + 0x28, 0x30, 0x2c, 0x58, 0x61, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, + 0x65, 0x66, 0x29, 0x28, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x52, + 0x55, 0x4c, 0x45, 0x53, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x69, + 0x3d, 0x28, 0x30, 0x2c, 0x70, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x55, 0x72, 0x6c, 0x29, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x2c, 0x65, 0x2c, 0x72, 0x2e, 0x24, 0x72, 0x65, + 0x66, 0x29, 0x3b, 0x61, 0x3d, 0x75, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x73, 0x2c, 0x69, 0x29, 0x7d, 0x6c, + 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, + 0x6f, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x3b, 0x69, 0x66, 0x28, 0x61, 0x3d, 0x61, 0x7c, 0x7c, 0x6e, 0x65, 0x77, + 0x20, 0x63, 0x74, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x6f, + 0x2c, 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x73, 0x2c, 0x62, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x3a, 0x65, 0x7d, 0x29, 0x2c, 0x61, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x21, 0x3d, 0x3d, 0x61, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x6f, 0x3d, 0x70, 0x28, 0x28, 0x58, 0x68, 0x2c, 0x41, 0x64, 0x29, + 0x3d, 0x3e, 0x7b, 0x41, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x3d, 0x7b, 0x24, 0x69, 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x72, 0x61, 0x77, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x75, 0x73, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x6a, 0x76, 0x2d, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x6a, 0x76, 0x2f, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x72, + 0x65, 0x66, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6a, 0x73, 0x6f, + 0x6e, 0x23, 0x22, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x41, 0x6e, 0x79, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x29, + 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x3a, 0x5b, 0x22, 0x24, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5d, 0x2c, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x61, 0x6e, 0x79, 0x4f, + 0x66, 0x3a, 0x5b, 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2d, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x7d, 0x2c, + 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x7d, 0x5d, + 0x7d, 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x21, 0x31, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x73, + 0x3d, 0x70, 0x28, 0x28, 0x65, 0x79, 0x2c, 0x61, 0x6f, 0x29, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x43, 0x64, 0x3d, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x2f, 0x5e, 0x5b, 0x5c, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x38, 0x7d, + 0x2d, 0x5b, 0x5c, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, + 0x5b, 0x5c, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, + 0x5c, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x5c, + 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x24, 0x2f, 0x69, + 0x75, 0x29, 0x2c, 0x73, 0x6f, 0x3d, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x2f, 0x5e, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, + 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, + 0x64, 0x7b, 0x32, 0x7d, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5c, 0x64, + 0x7c, 0x5c, 0x64, 0x29, 0x5c, 0x2e, 0x29, 0x7b, 0x33, 0x7d, 0x28, 0x3f, + 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, + 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x7b, 0x32, 0x7d, + 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5c, 0x64, 0x7c, 0x5c, 0x64, 0x29, + 0x24, 0x2f, 0x75, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x77, 0x73, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x65, 0x3d, 0x22, 0x22, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x73, 0x3d, 0x30, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x73, 0x3d, 0x30, 0x3b, 0x73, 0x3c, 0x74, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x73, 0x2b, 0x2b, 0x29, + 0x69, 0x66, 0x28, 0x72, 0x3d, 0x74, 0x5b, 0x73, 0x5d, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x30, 0x29, 0x2c, + 0x72, 0x21, 0x3d, 0x3d, 0x34, 0x38, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, + 0x28, 0x72, 0x3e, 0x3d, 0x34, 0x38, 0x26, 0x26, 0x72, 0x3c, 0x3d, 0x35, + 0x37, 0x7c, 0x7c, 0x72, 0x3e, 0x3d, 0x36, 0x35, 0x26, 0x26, 0x72, 0x3c, + 0x3d, 0x37, 0x30, 0x7c, 0x7c, 0x72, 0x3e, 0x3d, 0x39, 0x37, 0x26, 0x26, + 0x72, 0x3c, 0x3d, 0x31, 0x30, 0x32, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x22, 0x3b, 0x65, 0x2b, 0x3d, 0x74, 0x5b, 0x73, 0x5d, + 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x73, + 0x2b, 0x3d, 0x31, 0x3b, 0x73, 0x3c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x73, 0x2b, 0x2b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x72, + 0x3d, 0x74, 0x5b, 0x73, 0x5d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x41, 0x74, 0x28, 0x30, 0x29, 0x2c, 0x21, 0x28, 0x72, 0x3e, + 0x3d, 0x34, 0x38, 0x26, 0x26, 0x72, 0x3c, 0x3d, 0x35, 0x37, 0x7c, 0x7c, + 0x72, 0x3e, 0x3d, 0x36, 0x35, 0x26, 0x26, 0x72, 0x3c, 0x3d, 0x37, 0x30, + 0x7c, 0x7c, 0x72, 0x3e, 0x3d, 0x39, 0x37, 0x26, 0x26, 0x72, 0x3c, 0x3d, + 0x31, 0x30, 0x32, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, + 0x22, 0x3b, 0x65, 0x2b, 0x3d, 0x74, 0x5b, 0x73, 0x5d, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x44, + 0x64, 0x3d, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x2f, 0x5b, 0x5e, 0x21, 0x22, 0x24, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x5c, 0x2d, 0x2e, 0x3b, 0x3d, 0x5f, + 0x60, 0x61, 0x2d, 0x7a, 0x7b, 0x7d, 0x7e, 0x5d, 0x2f, 0x75, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x6f, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x30, 0x2c, 0x21, 0x30, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x64, 0x28, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x73, 0x3d, 0x77, 0x73, 0x28, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, + 0x21, 0x3d, 0x3d, 0x22, 0x22, 0x29, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x73, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, + 0x21, 0x30, 0x2c, 0x21, 0x31, 0x3b, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3d, 0x30, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, + 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x30, + 0x2c, 0x72, 0x3d, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x21, 0x31, + 0x2c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x22, 0x22, 0x2c, + 0x7a, 0x6f, 0x6e, 0x65, 0x3a, 0x22, 0x22, 0x7d, 0x2c, 0x73, 0x3d, 0x5b, + 0x5d, 0x2c, 0x6e, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x21, 0x31, 0x2c, + 0x6f, 0x3d, 0x21, 0x31, 0x2c, 0x69, 0x3d, 0x7a, 0x64, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x30, 0x3b, 0x63, 0x3c, + 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x63, 0x2b, 0x2b, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x74, 0x5b, 0x63, 0x5d, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x75, 0x3d, 0x3d, 0x3d, 0x22, 0x5b, + 0x22, 0x7c, 0x7c, 0x75, 0x3d, 0x3d, 0x3d, 0x22, 0x5d, 0x22, 0x29, 0x29, + 0x69, 0x66, 0x28, 0x75, 0x3d, 0x3d, 0x3d, 0x22, 0x3a, 0x22, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x61, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x26, 0x26, 0x28, + 0x6f, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x21, 0x69, 0x28, 0x6e, 0x2c, 0x73, + 0x2c, 0x72, 0x29, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x69, 0x66, + 0x28, 0x2b, 0x2b, 0x65, 0x3e, 0x37, 0x29, 0x7b, 0x72, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3d, 0x21, 0x30, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x7d, 0x63, 0x3e, 0x30, 0x26, 0x26, 0x74, 0x5b, 0x63, 0x2d, 0x31, 0x5d, + 0x3d, 0x3d, 0x3d, 0x22, 0x3a, 0x22, 0x26, 0x26, 0x28, 0x61, 0x3d, 0x21, + 0x30, 0x29, 0x2c, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x3a, + 0x22, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x75, 0x3d, 0x3d, 0x3d, + 0x22, 0x25, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x28, 0x6e, + 0x2c, 0x73, 0x2c, 0x72, 0x29, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, + 0x69, 0x3d, 0x72, 0x6f, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x6e, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x75, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x28, + 0x69, 0x3d, 0x3d, 0x3d, 0x72, 0x6f, 0x3f, 0x72, 0x2e, 0x7a, 0x6f, 0x6e, + 0x65, 0x3d, 0x6e, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, + 0x3a, 0x6f, 0x3f, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x2e, + 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x29, 0x3a, 0x73, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x77, 0x73, 0x28, 0x6e, 0x29, 0x29, 0x29, + 0x2c, 0x72, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3d, 0x73, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x2c, 0x72, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x28, + 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x78, 0x64, 0x28, 0x74, 0x2c, 0x22, + 0x3a, 0x22, 0x29, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7b, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x74, 0x2c, 0x69, 0x73, 0x49, 0x50, + 0x56, 0x36, 0x3a, 0x21, 0x31, 0x7d, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x65, + 0x3d, 0x56, 0x64, 0x28, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7b, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x74, 0x2c, 0x69, 0x73, 0x49, 0x50, + 0x56, 0x36, 0x3a, 0x21, 0x31, 0x7d, 0x3b, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x65, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, + 0x73, 0x3d, 0x65, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x7a, 0x6f, 0x6e, + 0x65, 0x26, 0x26, 0x28, 0x72, 0x2b, 0x3d, 0x22, 0x25, 0x22, 0x2b, 0x65, + 0x2e, 0x7a, 0x6f, 0x6e, 0x65, 0x2c, 0x73, 0x2b, 0x3d, 0x22, 0x25, 0x32, + 0x35, 0x22, 0x2b, 0x65, 0x2e, 0x7a, 0x6f, 0x6e, 0x65, 0x29, 0x2c, 0x7b, + 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x72, 0x2c, 0x69, 0x73, 0x49, 0x50, 0x56, + 0x36, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, + 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x73, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x64, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x30, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x30, 0x3b, 0x73, 0x3c, + 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x73, 0x2b, 0x2b, + 0x29, 0x74, 0x5b, 0x73, 0x5d, 0x3d, 0x3d, 0x3d, 0x65, 0x26, 0x26, 0x72, + 0x2b, 0x2b, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x64, 0x28, + 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x2c, 0x72, + 0x3d, 0x5b, 0x5d, 0x2c, 0x73, 0x3d, 0x2d, 0x31, 0x2c, 0x6e, 0x3d, 0x30, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x6e, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x3d, + 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x3d, 0x3d, + 0x22, 0x2e, 0x22, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x69, 0x66, + 0x28, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x7b, 0x72, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x2f, 0x22, 0x29, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x6e, 0x3d, + 0x3d, 0x3d, 0x32, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x30, 0x5d, + 0x3d, 0x3d, 0x3d, 0x22, 0x2e, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, + 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2e, 0x22, 0x29, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x3d, + 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x7b, 0x65, 0x3d, 0x65, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, + 0x26, 0x26, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2e, + 0x22, 0x7c, 0x7c, 0x65, 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, + 0x22, 0x29, 0x29, 0x7b, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x2f, 0x22, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x33, + 0x26, 0x26, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x2e, 0x2e, 0x22, 0x29, + 0x7b, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x21, 0x3d, 0x3d, + 0x30, 0x26, 0x26, 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x72, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x2f, 0x22, 0x29, 0x3b, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x30, 0x5d, + 0x3d, 0x3d, 0x3d, 0x22, 0x2e, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, + 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2e, 0x22, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x65, 0x5b, 0x32, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, + 0x29, 0x7b, 0x65, 0x3d, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x33, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x7d, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x31, + 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x7b, 0x65, 0x3d, 0x65, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, + 0x2f, 0x22, 0x26, 0x26, 0x65, 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, + 0x2e, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x32, 0x5d, 0x3d, + 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, 0x7b, 0x65, 0x3d, 0x65, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, + 0x28, 0x65, 0x5b, 0x32, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2e, 0x22, 0x26, + 0x26, 0x65, 0x5b, 0x33, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x29, + 0x7b, 0x65, 0x3d, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x33, + 0x29, 0x2c, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x21, 0x3d, + 0x3d, 0x30, 0x26, 0x26, 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x7d, 0x7d, 0x69, 0x66, + 0x28, 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x66, 0x28, 0x22, 0x2f, 0x22, 0x2c, 0x31, 0x29, 0x29, 0x3d, 0x3d, 0x3d, + 0x2d, 0x31, 0x29, 0x7b, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, + 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, 0x2e, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x73, 0x29, 0x29, 0x2c, 0x65, 0x3d, + 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x73, 0x29, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x55, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x72, 0x3d, 0x65, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, + 0x66, 0x6f, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, + 0x26, 0x28, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, + 0x6f, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, + 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x68, 0x6f, 0x73, + 0x74, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x70, 0x61, 0x74, + 0x68, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x64, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x5b, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x65, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, + 0x6e, 0x66, 0x6f, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x22, 0x40, 0x22, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x72, 0x3d, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x28, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x73, 0x6f, 0x28, 0x72, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x73, 0x3d, 0x6e, 0x6f, 0x28, 0x72, 0x29, 0x3b, 0x73, 0x2e, 0x69, + 0x73, 0x49, 0x50, 0x56, 0x36, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x72, + 0x3d, 0x60, 0x5b, 0x24, 0x7b, 0x73, 0x2e, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x7d, 0x5d, 0x60, 0x3a, 0x72, 0x3d, + 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x7d, 0x65, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x2e, 0x70, 0x6f, 0x72, + 0x74, 0x3d, 0x3d, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7c, + 0x7c, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x2e, 0x70, 0x6f, + 0x72, 0x74, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x26, 0x26, 0x28, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x3a, 0x22, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, + 0x29, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x65, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x3a, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x61, 0x6f, 0x2e, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x7b, 0x6e, 0x6f, 0x6e, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3a, 0x44, + 0x64, 0x2c, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x46, 0x64, 0x2c, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x55, 0x64, 0x2c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x44, 0x6f, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, + 0x4b, 0x64, 0x2c, 0x69, 0x73, 0x49, 0x50, 0x76, 0x34, 0x3a, 0x73, 0x6f, + 0x2c, 0x69, 0x73, 0x55, 0x55, 0x49, 0x44, 0x3a, 0x43, 0x64, 0x2c, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x50, 0x76, 0x36, + 0x3a, 0x6e, 0x6f, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x54, 0x6f, 0x48, 0x65, 0x78, 0x53, 0x74, 0x72, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x3a, 0x77, 0x73, 0x7d, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6c, 0x6f, 0x3d, 0x70, 0x28, 0x28, 0x74, 0x79, 0x2c, + 0x75, 0x6f, 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x7b, 0x69, + 0x73, 0x55, 0x55, 0x49, 0x44, 0x3a, 0x4c, 0x64, 0x7d, 0x3d, 0x45, 0x73, + 0x28, 0x29, 0x2c, 0x48, 0x64, 0x3d, 0x2f, 0x28, 0x5b, 0x5c, 0x64, 0x61, + 0x2d, 0x7a, 0x5d, 0x5b, 0x5c, 0x64, 0x5c, 0x2d, 0x61, 0x2d, 0x7a, 0x5d, + 0x7b, 0x30, 0x2c, 0x33, 0x31, 0x7d, 0x29, 0x3a, 0x28, 0x28, 0x3f, 0x3a, + 0x5b, 0x5c, 0x77, 0x21, 0x24, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x5c, + 0x2d, 0x2e, 0x3a, 0x3b, 0x3d, 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x5c, 0x64, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2b, 0x29, 0x2f, 0x69, + 0x75, 0x2c, 0x47, 0x64, 0x3d, 0x5b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x22, + 0x2c, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x22, 0x2c, 0x22, 0x77, 0x73, + 0x22, 0x2c, 0x22, 0x77, 0x73, 0x73, 0x22, 0x2c, 0x22, 0x75, 0x72, 0x6e, + 0x22, 0x2c, 0x22, 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x75, 0x69, 0x64, 0x22, + 0x5d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, + 0x64, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x47, 0x64, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x74, + 0x29, 0x21, 0x3d, 0x3d, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x73, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x21, 0x30, 0x3a, 0x74, 0x2e, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x3f, + 0x21, 0x31, 0x3a, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3f, + 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x33, 0x26, 0x26, 0x28, 0x74, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, + 0x22, 0x77, 0x22, 0x7c, 0x7c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x57, 0x22, 0x29, 0x26, + 0x26, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5b, 0x31, + 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x22, 0x7c, 0x7c, 0x74, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, + 0x53, 0x22, 0x29, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x22, 0x7c, + 0x7c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5b, 0x32, 0x5d, + 0x3d, 0x3d, 0x3d, 0x22, 0x53, 0x22, 0x29, 0x3a, 0x21, 0x31, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6f, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x68, + 0x6f, 0x73, 0x74, 0x7c, 0x7c, 0x28, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x3d, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7c, 0x7c, 0x22, + 0x48, 0x54, 0x54, 0x50, 0x20, 0x55, 0x52, 0x49, 0x73, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x68, 0x6f, + 0x73, 0x74, 0x2e, 0x22, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6f, 0x28, 0x74, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x65, 0x3d, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x2e, 0x74, 0x6f, + 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x3d, + 0x3d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x22, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, + 0x3d, 0x3d, 0x28, 0x65, 0x3f, 0x34, 0x34, 0x33, 0x3a, 0x38, 0x30, 0x29, + 0x7c, 0x7c, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x3d, 0x3d, 0x22, + 0x22, 0x29, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, + 0x74, 0x68, 0x7c, 0x7c, 0x28, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x22, 0x2f, 0x22, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x3d, 0x50, 0x73, 0x28, 0x74, 0x29, 0x2c, 0x74, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x28, + 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x7c, 0x7c, 0x22, 0x2f, 0x22, 0x29, + 0x2b, 0x28, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3f, 0x22, 0x3f, + 0x22, 0x2b, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x22, 0x22, + 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x2c, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x64, 0x28, 0x74, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x3d, + 0x3d, 0x28, 0x50, 0x73, 0x28, 0x74, 0x29, 0x3f, 0x34, 0x34, 0x33, 0x3a, + 0x38, 0x30, 0x29, 0x7c, 0x7c, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, + 0x3d, 0x3d, 0x22, 0x22, 0x29, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x70, 0x6f, + 0x72, 0x74, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x65, 0x3d, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x3d, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x3f, 0x22, 0x77, + 0x73, 0x73, 0x22, 0x3a, 0x22, 0x77, 0x73, 0x22, 0x2c, 0x74, 0x2e, 0x73, + 0x65, 0x63, 0x75, 0x72, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x2c, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x5b, 0x65, 0x2c, + 0x72, 0x5d, 0x3d, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, + 0x22, 0x3f, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x65, 0x26, 0x26, 0x65, 0x21, 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x3f, 0x65, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x74, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x3d, 0x72, 0x2c, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x64, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x21, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x3d, 0x22, 0x55, 0x52, 0x4e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, + 0x22, 0x2c, 0x74, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x48, + 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x73, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x7c, + 0x7c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x7c, 0x7c, 0x22, + 0x75, 0x72, 0x6e, 0x22, 0x3b, 0x74, 0x2e, 0x6e, 0x69, 0x64, 0x3d, 0x72, + 0x5b, 0x31, 0x5d, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, + 0x61, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x74, 0x2e, 0x6e, 0x73, 0x73, 0x3d, + 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x60, + 0x24, 0x7b, 0x73, 0x7d, 0x3a, 0x24, 0x7b, 0x65, 0x2e, 0x6e, 0x69, 0x64, + 0x7c, 0x7c, 0x74, 0x2e, 0x6e, 0x69, 0x64, 0x7d, 0x60, 0x2c, 0x61, 0x3d, + 0x53, 0x73, 0x28, 0x6e, 0x29, 0x3b, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x61, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x61, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x2e, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x7c, 0x7c, 0x22, 0x55, 0x52, 0x4e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, + 0x2e, 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x64, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x6e, 0x69, + 0x64, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x55, 0x52, 0x4e, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x6f, 0x75, 0x74, 0x20, 0x6e, 0x69, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, + 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x7c, 0x7c, 0x74, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x7c, 0x7c, 0x22, 0x75, 0x72, + 0x6e, 0x22, 0x2c, 0x73, 0x3d, 0x74, 0x2e, 0x6e, 0x69, 0x64, 0x2e, 0x74, + 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, + 0x2c, 0x6e, 0x3d, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x3a, 0x24, 0x7b, 0x65, + 0x2e, 0x6e, 0x69, 0x64, 0x7c, 0x7c, 0x73, 0x7d, 0x60, 0x2c, 0x61, 0x3d, + 0x53, 0x73, 0x28, 0x6e, 0x29, 0x3b, 0x61, 0x26, 0x26, 0x28, 0x74, 0x3d, + 0x61, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, + 0x74, 0x2c, 0x69, 0x3d, 0x74, 0x2e, 0x6e, 0x73, 0x73, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x60, 0x24, 0x7b, 0x73, 0x7c, 0x7c, 0x65, 0x2e, 0x6e, 0x69, 0x64, 0x7d, + 0x3a, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x2c, 0x65, 0x2e, 0x73, 0x6b, 0x69, + 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3d, 0x21, 0x30, 0x2c, 0x6f, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x64, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, + 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x75, + 0x75, 0x69, 0x64, 0x3d, 0x72, 0x2e, 0x6e, 0x73, 0x73, 0x2c, 0x72, 0x2e, + 0x6e, 0x73, 0x73, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x21, + 0x65, 0x2e, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x26, 0x26, + 0x28, 0x21, 0x72, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x7c, 0x7c, 0x21, 0x4c, + 0x64, 0x28, 0x72, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x29, 0x29, 0x26, 0x26, + 0x28, 0x72, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x72, 0x2e, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x7c, 0x7c, 0x22, 0x55, 0x55, 0x49, 0x44, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x2e, 0x22, 0x29, 0x2c, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x58, 0x64, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x65, 0x3d, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x2e, 0x6e, 0x73, 0x73, 0x3d, 0x28, 0x74, 0x2e, 0x75, 0x75, 0x69, + 0x64, 0x7c, 0x7c, 0x22, 0x22, 0x29, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, + 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x65, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x63, 0x6f, 0x3d, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x22, 0x2c, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x3a, 0x6f, 0x6f, 0x2c, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x69, 0x6f, 0x7d, 0x2c, 0x65, 0x6c, + 0x3d, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x22, 0x2c, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x3a, 0x63, 0x6f, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3a, + 0x6f, 0x6f, 0x2c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x3a, 0x69, 0x6f, 0x7d, 0x2c, 0x64, 0x72, 0x3d, 0x7b, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x3a, 0x22, 0x77, 0x73, 0x22, 0x2c, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x3a, 0x57, 0x64, 0x2c, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x59, 0x64, 0x7d, 0x2c, 0x74, 0x6c, + 0x3d, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x22, 0x77, 0x73, + 0x73, 0x22, 0x2c, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x3a, 0x64, 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3a, 0x64, 0x72, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2c, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x64, 0x72, 0x2e, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x7d, 0x2c, 0x72, 0x6c, 0x3d, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x22, 0x75, 0x72, 0x6e, 0x22, 0x2c, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x3a, 0x5a, 0x64, 0x2c, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x51, 0x64, 0x2c, 0x73, 0x6b, + 0x69, 0x70, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x2c, 0x73, 0x6c, 0x3d, 0x7b, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x3a, 0x22, 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x75, 0x69, 0x64, + 0x22, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3a, 0x42, 0x64, 0x2c, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x58, 0x64, 0x2c, + 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x6c, 0x72, 0x3d, 0x7b, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x63, 0x6f, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x65, 0x6c, 0x2c, 0x77, 0x73, 0x3a, 0x64, 0x72, 0x2c, 0x77, 0x73, 0x73, + 0x3a, 0x74, 0x6c, 0x2c, 0x75, 0x72, 0x6e, 0x3a, 0x72, 0x6c, 0x2c, 0x22, + 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x75, 0x69, 0x64, 0x22, 0x3a, 0x73, 0x6c, + 0x7d, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x73, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, + 0x6c, 0x72, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x73, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x26, 0x26, 0x28, 0x6c, + 0x72, 0x5b, 0x74, 0x5d, 0x7c, 0x7c, 0x6c, 0x72, 0x5b, 0x74, 0x2e, 0x74, + 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, + 0x5d, 0x29, 0x7c, 0x7c, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x75, + 0x6f, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x7b, 0x77, + 0x73, 0x49, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x3a, 0x50, 0x73, + 0x2c, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x3a, 0x6c, 0x72, 0x2c, + 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x4a, 0x64, 0x2c, 0x67, 0x65, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x3a, 0x53, 0x73, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x70, 0x6f, 0x3d, 0x70, 0x28, 0x28, 0x72, 0x79, 0x2c, 0x6d, 0x72, 0x29, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x7b, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x50, 0x76, 0x36, 0x3a, 0x6e, 0x6c, + 0x2c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x74, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x52, 0x74, 0x2c, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x3a, 0x61, 0x6c, 0x2c, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x66, + 0x72, 0x2c, 0x69, 0x73, 0x49, 0x50, 0x76, 0x34, 0x3a, 0x6f, 0x6c, 0x2c, + 0x6e, 0x6f, 0x6e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x3a, 0x69, 0x6c, 0x7d, 0x3d, 0x45, 0x73, 0x28, 0x29, + 0x2c, 0x7b, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x3a, 0x63, 0x6c, + 0x2c, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x7d, 0x3d, 0x6c, 0x6f, + 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x6c, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, + 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x74, 0x3d, + 0x76, 0x65, 0x28, 0x71, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x65, + 0x29, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x28, 0x74, + 0x3d, 0x71, 0x65, 0x28, 0x76, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, + 0x65, 0x29, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x6c, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x72, 0x3f, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x7b, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6c, 0x6c, + 0x22, 0x7d, 0x2c, 0x72, 0x29, 0x3a, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x7d, 0x2c, 0x6e, 0x3d, + 0x6d, 0x6f, 0x28, 0x71, 0x65, 0x28, 0x74, 0x2c, 0x73, 0x29, 0x2c, 0x71, + 0x65, 0x28, 0x65, 0x2c, 0x73, 0x29, 0x2c, 0x73, 0x2c, 0x21, 0x30, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x2e, 0x73, 0x6b, + 0x69, 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3d, 0x21, 0x30, 0x2c, + 0x76, 0x65, 0x28, 0x6e, 0x2c, 0x73, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x7b, + 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x7c, 0x7c, + 0x28, 0x74, 0x3d, 0x71, 0x65, 0x28, 0x76, 0x65, 0x28, 0x74, 0x2c, 0x72, + 0x29, 0x2c, 0x72, 0x29, 0x2c, 0x65, 0x3d, 0x71, 0x65, 0x28, 0x76, 0x65, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x72, 0x29, 0x29, 0x2c, 0x72, 0x3d, + 0x72, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x21, 0x72, 0x2e, 0x74, 0x6f, 0x6c, + 0x65, 0x72, 0x61, 0x6e, 0x74, 0x26, 0x26, 0x65, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x3f, 0x28, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2c, 0x6e, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x3d, 0x65, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x6e, 0x2e, 0x68, + 0x6f, 0x73, 0x74, 0x3d, 0x65, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x6e, + 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x65, 0x2e, 0x70, 0x6f, 0x72, 0x74, + 0x2c, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x52, 0x74, 0x28, 0x65, + 0x2e, 0x70, 0x61, 0x74, 0x68, 0x7c, 0x7c, 0x22, 0x22, 0x29, 0x2c, 0x6e, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x65, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, + 0x6e, 0x66, 0x6f, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x7c, 0x7c, 0x65, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x65, 0x2e, 0x70, 0x6f, 0x72, + 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x28, + 0x6e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x3d, 0x65, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x6e, 0x2e, + 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x65, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, + 0x6e, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x65, 0x2e, 0x70, 0x6f, 0x72, + 0x74, 0x2c, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x52, 0x74, 0x28, + 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x7c, 0x7c, 0x22, 0x22, 0x29, 0x2c, + 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3f, 0x28, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x5b, 0x30, 0x5d, 0x3d, + 0x3d, 0x3d, 0x22, 0x2f, 0x22, 0x3f, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x52, 0x74, 0x28, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x3a, + 0x28, 0x28, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x74, + 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x7c, 0x7c, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x26, 0x26, 0x21, 0x74, + 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3f, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x22, 0x2f, 0x22, 0x2b, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3a, + 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3f, 0x6e, 0x2e, 0x70, 0x61, 0x74, + 0x68, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x28, 0x30, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, + 0x22, 0x2f, 0x22, 0x29, 0x2b, 0x31, 0x29, 0x2b, 0x65, 0x2e, 0x70, 0x61, + 0x74, 0x68, 0x3a, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x65, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x2c, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x52, 0x74, 0x28, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x2c, + 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x29, 0x3a, 0x28, 0x6e, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3f, 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x65, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x3a, 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x3d, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x29, 0x2c, 0x6e, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x3d, 0x74, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x6e, 0x2e, 0x68, 0x6f, + 0x73, 0x74, 0x3d, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x6e, 0x2e, + 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, + 0x2c, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x74, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x2c, 0x6e, 0x2e, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x65, 0x2e, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6c, 0x28, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x28, 0x74, 0x3d, 0x75, 0x6e, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x65, 0x28, 0x74, 0x29, 0x2c, 0x74, 0x3d, 0x76, 0x65, + 0x28, 0x66, 0x72, 0x28, 0x71, 0x65, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x2c, + 0x21, 0x30, 0x29, 0x2c, 0x7b, 0x2e, 0x2e, 0x2e, 0x72, 0x2c, 0x73, 0x6b, + 0x69, 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x29, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3d, + 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x76, 0x65, 0x28, 0x66, 0x72, 0x28, 0x74, 0x2c, 0x21, 0x30, + 0x29, 0x2c, 0x7b, 0x2e, 0x2e, 0x2e, 0x72, 0x2c, 0x73, 0x6b, 0x69, 0x70, + 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x29, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x28, 0x65, 0x3d, 0x75, + 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x65, 0x29, 0x2c, 0x65, + 0x3d, 0x76, 0x65, 0x28, 0x66, 0x72, 0x28, 0x71, 0x65, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x7b, 0x2e, 0x2e, 0x2e, 0x72, + 0x2c, 0x73, 0x6b, 0x69, 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x29, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x26, 0x26, 0x28, 0x65, 0x3d, 0x76, 0x65, 0x28, 0x66, 0x72, 0x28, 0x65, + 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x7b, 0x2e, 0x2e, 0x2e, 0x72, 0x2c, 0x73, + 0x6b, 0x69, 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, + 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x3d, 0x3d, 0x3d, 0x65, 0x2e, + 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, + 0x3d, 0x7b, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x74, 0x2e, 0x68, 0x6f, 0x73, + 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x74, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2c, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, + 0x66, 0x6f, 0x3a, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, + 0x6f, 0x2c, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x74, 0x2e, 0x70, 0x6f, 0x72, + 0x74, 0x2c, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x74, 0x2e, 0x70, 0x61, 0x74, + 0x68, 0x2c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x74, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2c, 0x6e, 0x69, 0x64, 0x3a, 0x74, 0x2e, 0x6e, 0x69, + 0x64, 0x2c, 0x6e, 0x73, 0x73, 0x3a, 0x74, 0x2e, 0x6e, 0x73, 0x73, 0x2c, + 0x75, 0x75, 0x69, 0x64, 0x3a, 0x74, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2c, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x74, 0x2e, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x74, 0x2e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x3a, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x22, 0x7d, 0x2c, + 0x73, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x7b, 0x7d, 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x3d, + 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x66, 0x6f, 0x28, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x7c, 0x7c, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x29, 0x3b, 0x61, 0x26, 0x26, 0x61, 0x2e, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x26, 0x26, 0x61, 0x2e, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x72, 0x2c, 0x73, 0x29, + 0x2c, 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x21, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x73, 0x6b, 0x69, + 0x70, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3f, 0x72, 0x2e, 0x70, 0x61, + 0x74, 0x68, 0x3d, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, + 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x3a, 0x28, 0x72, 0x2e, 0x70, + 0x61, 0x74, 0x68, 0x3d, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x72, + 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2c, 0x72, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x26, 0x26, 0x28, 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x72, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, + 0x25, 0x33, 0x41, 0x22, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, + 0x3a, 0x22, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x73, 0x2e, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x21, 0x3d, 0x3d, 0x22, 0x73, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x22, 0x26, 0x26, 0x72, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2c, 0x22, 0x3a, 0x22, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x61, 0x6c, 0x28, 0x72, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x21, 0x3d, 0x3d, 0x22, 0x73, 0x75, 0x66, + 0x66, 0x69, 0x78, 0x22, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x22, 0x2f, 0x2f, 0x22, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x6f, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x26, + 0x26, 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x5b, 0x30, 0x5d, 0x21, 0x3d, + 0x3d, 0x22, 0x2f, 0x22, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x22, 0x2f, 0x22, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x61, 0x74, + 0x68, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x72, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3b, 0x21, 0x73, 0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x26, 0x26, 0x28, 0x21, 0x61, 0x7c, 0x7c, 0x21, + 0x61, 0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x29, 0x26, 0x26, 0x28, 0x69, 0x3d, 0x52, 0x74, 0x28, 0x69, + 0x29, 0x29, 0x2c, 0x6f, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x26, 0x26, 0x69, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, + 0x22, 0x26, 0x26, 0x69, 0x5b, 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2f, + 0x22, 0x26, 0x26, 0x28, 0x69, 0x3d, 0x22, 0x2f, 0x25, 0x32, 0x46, 0x22, + 0x2b, 0x69, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, + 0x2c, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x29, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, + 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x3f, 0x22, 0x2c, 0x72, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x29, 0x2c, 0x72, 0x2e, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x22, 0x23, 0x22, 0x2c, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x29, 0x2c, 0x6e, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, + 0x22, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x66, 0x6c, 0x3d, 0x2f, 0x5e, + 0x28, 0x3f, 0x3a, 0x28, 0x5b, 0x5e, 0x23, 0x2f, 0x3a, 0x3f, 0x5d, 0x2b, + 0x29, 0x3a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x5c, 0x2f, 0x28, + 0x28, 0x3f, 0x3a, 0x28, 0x5b, 0x5e, 0x23, 0x2f, 0x3f, 0x40, 0x5d, 0x2a, + 0x29, 0x40, 0x29, 0x3f, 0x28, 0x5c, 0x5b, 0x5b, 0x5e, 0x23, 0x2f, 0x3f, + 0x5c, 0x5d, 0x5d, 0x2b, 0x5c, 0x5d, 0x7c, 0x5b, 0x5e, 0x23, 0x2f, 0x3a, + 0x3f, 0x5d, 0x2a, 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x28, 0x5c, 0x64, 0x2a, + 0x29, 0x29, 0x3f, 0x29, 0x29, 0x3f, 0x28, 0x5b, 0x5e, 0x23, 0x3f, 0x5d, + 0x2a, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x3f, 0x28, 0x5b, 0x5e, 0x23, 0x5d, + 0x2a, 0x29, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x23, 0x28, 0x28, 0x3f, 0x3a, + 0x2e, 0x7c, 0x5b, 0x5c, 0x6e, 0x5c, 0x72, 0x5d, 0x29, 0x2a, 0x29, 0x29, + 0x3f, 0x2f, 0x75, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x71, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x7b, 0x7d, 0x2c, 0x65, 0x29, 0x2c, 0x73, + 0x3d, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x2c, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x68, 0x6f, 0x73, 0x74, + 0x3a, 0x22, 0x22, 0x2c, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x2c, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x22, 0x22, 0x2c, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x2c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x7d, 0x2c, 0x6e, 0x3d, 0x21, 0x31, 0x3b, 0x72, + 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x3d, + 0x3d, 0x22, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x22, 0x26, 0x26, 0x28, + 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3f, 0x74, 0x3d, 0x72, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2b, 0x22, 0x3a, 0x22, 0x2b, + 0x74, 0x3a, 0x74, 0x3d, 0x22, 0x2f, 0x2f, 0x22, 0x2b, 0x74, 0x29, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x74, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x66, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x61, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3d, + 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, + 0x6e, 0x66, 0x6f, 0x3d, 0x61, 0x5b, 0x33, 0x5d, 0x2c, 0x73, 0x2e, 0x68, + 0x6f, 0x73, 0x74, 0x3d, 0x61, 0x5b, 0x34, 0x5d, 0x2c, 0x73, 0x2e, 0x70, + 0x6f, 0x72, 0x74, 0x3d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, + 0x28, 0x61, 0x5b, 0x35, 0x5d, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x73, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x3d, 0x61, 0x5b, 0x36, 0x5d, 0x7c, 0x7c, 0x22, + 0x22, 0x2c, 0x73, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x61, 0x5b, + 0x37, 0x5d, 0x2c, 0x73, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x3d, 0x61, 0x5b, 0x38, 0x5d, 0x2c, 0x69, 0x73, 0x4e, 0x61, 0x4e, + 0x28, 0x73, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x26, 0x26, 0x28, 0x73, + 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x61, 0x5b, 0x35, 0x5d, 0x29, 0x2c, + 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x69, 0x66, 0x28, 0x6f, 0x6c, + 0x28, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x3d, 0x3d, 0x3d, 0x21, + 0x31, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x6e, 0x6c, 0x28, + 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x3b, 0x73, 0x2e, 0x68, 0x6f, + 0x73, 0x74, 0x3d, 0x63, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2e, 0x74, 0x6f, + 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x2c, + 0x6e, 0x3d, 0x63, 0x2e, 0x69, 0x73, 0x49, 0x50, 0x56, 0x36, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x3d, 0x21, 0x30, 0x3b, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, + 0x66, 0x6f, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, + 0x26, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x73, 0x2e, 0x70, 0x6f, 0x72, 0x74, + 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x73, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x21, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3f, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x3d, 0x22, 0x73, 0x61, 0x6d, 0x65, 0x2d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x73, + 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x22, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x3a, 0x73, 0x2e, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x22, 0x3a, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x22, 0x75, 0x72, 0x69, 0x22, 0x2c, 0x72, + 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x26, 0x26, + 0x72, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x21, + 0x3d, 0x3d, 0x22, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x22, 0x26, 0x26, + 0x72, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x21, + 0x3d, 0x3d, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, + 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7c, 0x7c, 0x22, 0x55, 0x52, + 0x49, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x22, + 0x2b, 0x72, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2b, 0x22, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x66, 0x6f, + 0x28, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x7c, 0x7c, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x72, 0x2e, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x26, 0x26, 0x28, 0x21, 0x6f, 0x7c, 0x7c, + 0x21, 0x6f, 0x2e, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x26, 0x26, 0x73, 0x2e, 0x68, 0x6f, + 0x73, 0x74, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x7c, 0x7c, 0x6f, 0x26, 0x26, 0x6f, 0x2e, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x29, 0x26, + 0x26, 0x6e, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x26, 0x26, 0x69, 0x6c, 0x28, + 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x29, 0x74, 0x72, 0x79, 0x7b, + 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x55, 0x52, 0x4c, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x54, 0x6f, 0x41, 0x53, 0x43, 0x49, 0x49, + 0x28, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, + 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, 0x7d, 0x63, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x69, 0x29, 0x7b, 0x73, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3d, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7c, + 0x7c, 0x22, 0x48, 0x6f, 0x73, 0x74, 0x27, 0x73, 0x20, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x41, 0x53, 0x43, + 0x49, 0x49, 0x3a, 0x20, 0x22, 0x2b, 0x69, 0x7d, 0x28, 0x21, 0x6f, 0x7c, + 0x7c, 0x6f, 0x26, 0x26, 0x21, 0x6f, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x4e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x29, 0x26, 0x26, 0x28, + 0x74, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x25, + 0x22, 0x29, 0x21, 0x3d, 0x3d, 0x2d, 0x31, 0x26, 0x26, 0x28, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x3d, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x29, 0x2c, 0x73, + 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x3d, + 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x73, 0x2e, 0x68, + 0x6f, 0x73, 0x74, 0x29, 0x29, 0x29, 0x2c, 0x73, 0x2e, 0x70, 0x61, 0x74, + 0x68, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x28, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, + 0x2c, 0x73, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x26, + 0x26, 0x28, 0x73, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x3d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x28, 0x64, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x73, 0x2e, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x6f, 0x26, 0x26, + 0x6f, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x26, 0x26, 0x6f, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x28, 0x73, 0x2c, 0x72, 0x29, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x73, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7c, 0x7c, 0x22, 0x55, 0x52, 0x49, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x22, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6a, 0x73, + 0x3d, 0x7b, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x3a, 0x63, 0x6c, + 0x2c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x75, + 0x6c, 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x3a, 0x64, 0x6c, + 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x6d, 0x6f, 0x2c, 0x65, 0x71, 0x75, + 0x61, 0x6c, 0x3a, 0x6c, 0x6c, 0x2c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x3a, 0x76, 0x65, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x3a, 0x71, 0x65, 0x7d, 0x3b, 0x6d, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x3d, 0x6a, 0x73, 0x3b, 0x6d, 0x72, 0x2e, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x6a, 0x73, 0x3b, 0x6d, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x55, 0x72, 0x69, 0x3d, + 0x6a, 0x73, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, 0x6f, 0x3d, + 0x70, 0x28, 0x71, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x71, 0x73, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x68, 0x6f, 0x3d, 0x70, 0x6f, 0x28, 0x29, 0x3b, 0x68, 0x6f, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x3d, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x2f, 0x64, 0x69, 0x73, 0x74, + 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x75, 0x72, 0x69, + 0x22, 0x29, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x27, 0x3b, + 0x71, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x68, + 0x6f, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6b, 0x73, 0x3d, 0x70, + 0x28, 0x57, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x57, 0x2e, 0x43, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x6e, 0x3d, 0x57, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x57, 0x2e, 0x6e, 0x69, 0x6c, 0x3d, 0x57, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x57, 0x2e, 0x73, 0x74, 0x72, 0x3d, + 0x57, 0x2e, 0x5f, 0x3d, 0x57, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x43, 0x78, 0x74, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6d, 0x6c, 0x3d, 0x47, 0x65, 0x28, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, + 0x22, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x6c, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x78, 0x74, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x74, 0x3d, 0x45, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x5f, 0x22, 0x2c, 0x7b, 0x65, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, + 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x74, 0x2e, 0x5f, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x7d, 0x7d, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x22, 0x2c, + 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, + 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x75, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x7b, + 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, + 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x75, 0x74, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x57, 0x2c, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, + 0x6e, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x6e, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x6c, + 0x3d, 0x6b, 0x74, 0x28, 0x29, 0x2c, 0x62, 0x6f, 0x3d, 0x69, 0x74, 0x28, + 0x29, 0x2c, 0x68, 0x6c, 0x3d, 0x72, 0x73, 0x28, 0x29, 0x2c, 0x54, 0x74, + 0x3d, 0x49, 0x74, 0x28, 0x29, 0x2c, 0x79, 0x6c, 0x3d, 0x45, 0x28, 0x29, + 0x2c, 0x4d, 0x74, 0x3d, 0x71, 0x74, 0x28, 0x29, 0x2c, 0x70, 0x72, 0x3d, + 0x6a, 0x74, 0x28, 0x29, 0x2c, 0x4f, 0x73, 0x3d, 0x49, 0x28, 0x29, 0x2c, + 0x24, 0x6f, 0x3d, 0x74, 0x6f, 0x28, 0x29, 0x2c, 0x24, 0x6c, 0x3d, 0x79, + 0x6f, 0x28, 0x29, 0x2c, 0x77, 0x6f, 0x3d, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x3d, 0x3e, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x77, 0x6f, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x3d, 0x22, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, + 0x70, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, 0x6c, 0x3d, 0x5b, 0x22, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x2c, 0x22, 0x75, 0x73, 0x65, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x2c, 0x22, 0x63, 0x6f, 0x65, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x5d, 0x2c, 0x67, + 0x6c, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x5b, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x22, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x22, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x22, 0x2c, 0x22, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x2c, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x22, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x2c, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x22, 0x2c, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, + 0x22, 0x2c, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x22, + 0x2c, 0x22, 0x6f, 0x62, 0x6a, 0x22, 0x2c, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x5d, 0x29, 0x2c, 0x76, 0x6c, 0x3d, 0x7b, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x22, + 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x60, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x73, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x20, 0x63, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x22, 0x2c, 0x6e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x27, 0x22, 0x6e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x27, 0x2c, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x73, 0x3a, 0x22, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x22, 0x2c, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x52, 0x65, 0x66, 0x73, 0x3a, 0x22, 0x44, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x52, 0x65, 0x66, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x2e, 0x22, 0x2c, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x66, 0x73, 0x3a, 0x22, 0x50, 0x61, 0x73, 0x73, 0x20, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x24, 0x69, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6a, 0x76, + 0x2e, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x22, + 0x2c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x64, 0x65, + 0x3a, 0x22, 0x55, 0x73, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x60, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x7b, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x3a, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3a, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x60, 0x22, 0x2c, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x55, 0x73, 0x65, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x20, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x7d, 0x60, 0x22, 0x2c, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x22, + 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x6e, 0x6f, 0x77, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x60, 0x2e, 0x22, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x22, 0x49, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6e, + 0x6f, 0x77, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x60, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x60, 0x2e, + 0x22, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x3a, 0x27, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x27, 0x2c, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x3a, 0x22, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, + 0x60, 0x20, 0x74, 0x6f, 0x20, 0x60, 0x61, 0x6a, 0x76, 0x2e, 0x61, 0x64, + 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x60, 0x20, 0x28, 0x6f, 0x72, + 0x20, 0x60, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x60, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x22, 0x2c, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x3a, 0x22, 0x4d, 0x61, 0x70, 0x20, 0x69, 0x73, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x2c, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x61, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x22, + 0x2c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x22, + 0x4d, 0x61, 0x70, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x61, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x22, 0x2c, 0x61, 0x6a, 0x76, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x22, 0x49, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6e, 0x6f, + 0x77, 0x2e, 0x22, 0x7d, 0x2c, 0x62, 0x6c, 0x3d, 0x7b, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x57, + 0x69, 0x74, 0x68, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x22, 0x2c, 0x6a, 0x73, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x53, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x3a, 0x22, 0x22, 0x2c, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x27, 0x22, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x22, 0x2f, 0x22, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x22, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x62, 0x79, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x27, 0x7d, 0x2c, + 0x5f, 0x6f, 0x3d, 0x32, 0x30, 0x30, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6c, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, 0x2c, 0x61, 0x2c, + 0x6f, 0x2c, 0x69, 0x2c, 0x63, 0x2c, 0x75, 0x2c, 0x64, 0x2c, 0x6c, 0x2c, + 0x79, 0x2c, 0x68, 0x2c, 0x66, 0x2c, 0x6d, 0x2c, 0x24, 0x2c, 0x67, 0x2c, + 0x52, 0x2c, 0x71, 0x2c, 0x56, 0x2c, 0x53, 0x2c, 0x76, 0x2c, 0x77, 0x2c, + 0x4e, 0x2c, 0x7a, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x48, 0x3d, 0x74, 0x2e, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2c, 0x47, 0x3d, 0x28, 0x65, 0x3d, + 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x7c, 0x7c, 0x65, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x65, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x2c, 0x54, 0x3d, 0x47, + 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x7c, 0x7c, 0x47, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x31, 0x3a, 0x47, 0x7c, 0x7c, 0x30, + 0x2c, 0x44, 0x3d, 0x28, 0x73, 0x3d, 0x28, 0x72, 0x3d, 0x74, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, + 0x7c, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x72, 0x2e, 0x72, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, + 0x26, 0x73, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x73, 0x3a, 0x77, 0x6f, 0x2c, 0x69, 0x65, 0x3d, 0x28, 0x6e, 0x3d, 0x74, + 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x6e, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x6e, 0x3a, 0x24, + 0x6c, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x28, 0x6f, 0x3d, 0x28, 0x61, 0x3d, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x61, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x61, + 0x3a, 0x48, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x6f, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x6f, + 0x3a, 0x21, 0x30, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x28, 0x63, 0x3d, 0x28, 0x69, 0x3d, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, + 0x26, 0x69, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x69, 0x3a, 0x48, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, + 0x26, 0x63, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x63, 0x3a, 0x21, 0x30, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x3a, 0x28, 0x64, 0x3d, 0x28, 0x75, 0x3d, 0x74, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x75, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x75, 0x3a, 0x48, + 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x64, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x64, 0x3a, 0x22, + 0x6c, 0x6f, 0x67, 0x22, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x73, 0x3a, 0x28, 0x79, 0x3d, 0x28, 0x6c, 0x3d, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x75, 0x70, 0x6c, + 0x65, 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x6c, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x6c, + 0x3a, 0x48, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x79, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x79, + 0x3a, 0x22, 0x6c, 0x6f, 0x67, 0x22, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x28, 0x66, + 0x3d, 0x28, 0x68, 0x3d, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x21, 0x3d, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x68, 0x21, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x3f, 0x68, 0x3a, 0x48, 0x29, 0x21, 0x3d, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x66, 0x21, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x3f, 0x66, 0x3a, 0x21, 0x31, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x3a, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x3f, 0x7b, 0x2e, + 0x2e, 0x2e, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x3a, 0x54, 0x2c, 0x72, 0x65, 0x67, 0x45, + 0x78, 0x70, 0x3a, 0x44, 0x7d, 0x3a, 0x7b, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x3a, 0x54, 0x2c, 0x72, 0x65, 0x67, 0x45, 0x78, 0x70, + 0x3a, 0x44, 0x7d, 0x2c, 0x6c, 0x6f, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x3a, 0x28, 0x6d, 0x3d, 0x74, 0x2e, 0x6c, 0x6f, + 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x21, + 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x6d, 0x21, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x6d, 0x3a, 0x5f, 0x6f, 0x2c, + 0x6c, 0x6f, 0x6f, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x28, 0x24, 0x3d, + 0x74, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x29, 0x21, + 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x24, 0x21, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x24, 0x3a, 0x5f, 0x6f, 0x2c, + 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x28, 0x67, 0x3d, 0x74, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x67, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x67, + 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x3a, 0x28, 0x52, 0x3d, 0x74, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, + 0x52, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x52, + 0x3a, 0x21, 0x30, 0x2c, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x66, 0x73, 0x3a, 0x28, 0x71, 0x3d, 0x74, 0x2e, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x66, 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x26, 0x26, 0x71, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3f, 0x71, 0x3a, 0x21, 0x30, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x28, 0x56, 0x3d, 0x74, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x26, 0x26, 0x56, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3f, 0x56, 0x3a, 0x22, 0x24, 0x69, 0x64, 0x22, 0x2c, 0x61, + 0x64, 0x64, 0x55, 0x73, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x28, 0x53, 0x3d, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x55, 0x73, 0x65, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x21, 0x3d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x53, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3f, 0x53, 0x3a, 0x21, 0x30, 0x2c, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x28, 0x76, 0x3d, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x21, 0x3d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x76, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3f, 0x76, 0x3a, 0x21, 0x30, 0x2c, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, + 0x3a, 0x28, 0x77, 0x3d, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x29, 0x21, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x77, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x77, 0x3a, 0x21, 0x30, 0x2c, 0x75, + 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, + 0x3a, 0x28, 0x4e, 0x3d, 0x74, 0x2e, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x29, 0x21, 0x3d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x4e, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3f, 0x4e, 0x3a, 0x21, 0x30, 0x2c, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x28, 0x7a, 0x3d, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x29, + 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x7a, 0x21, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x7a, 0x3a, 0x21, 0x30, + 0x2c, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x3a, 0x69, 0x65, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x41, 0x74, 0x3d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x7b, 0x7d, 0x29, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, + 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, + 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x3d, 0x7b, 0x2e, 0x2e, 0x2e, 0x65, 0x2c, 0x2e, 0x2e, 0x2e, 0x77, 0x6c, + 0x28, 0x65, 0x29, 0x7d, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x65, 0x73, 0x35, + 0x3a, 0x72, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x73, 0x7d, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x79, 0x6c, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x7b, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x3a, 0x7b, 0x7d, 0x2c, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x73, 0x3a, 0x67, 0x6c, 0x2c, 0x65, 0x73, 0x35, 0x3a, 0x72, 0x2c, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x73, 0x7d, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x3d, 0x4e, 0x6c, + 0x28, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x29, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3b, 0x65, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x21, 0x31, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x3d, 0x28, 0x30, 0x2c, 0x68, 0x6c, + 0x2e, 0x67, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x28, 0x29, + 0x2c, 0x67, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x76, 0x6c, 0x2c, 0x65, 0x2c, 0x22, 0x4e, 0x4f, 0x54, 0x20, + 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x22, 0x29, 0x2c, + 0x67, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x62, 0x6c, 0x2c, 0x65, 0x2c, 0x22, 0x44, 0x45, 0x50, 0x52, 0x45, + 0x43, 0x41, 0x54, 0x45, 0x44, 0x22, 0x2c, 0x22, 0x77, 0x61, 0x72, 0x6e, + 0x22, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x4f, 0x70, 0x74, 0x73, 0x3d, 0x6a, 0x6c, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2c, 0x65, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x73, 0x26, 0x26, 0x50, 0x6c, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, + 0x29, 0x2c, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x26, 0x26, 0x53, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x29, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x2c, 0x45, 0x6c, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2c, 0x65, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x73, 0x3d, 0x6e, 0x7d, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, + 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x28, 0x22, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x22, + 0x29, 0x7d, 0x5f, 0x61, 0x64, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x65, 0x2c, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x6e, 0x3d, 0x24, 0x6f, 0x3b, + 0x73, 0x3d, 0x3d, 0x3d, 0x22, 0x69, 0x64, 0x22, 0x26, 0x26, 0x28, 0x6e, + 0x3d, 0x7b, 0x2e, 0x2e, 0x2e, 0x24, 0x6f, 0x7d, 0x2c, 0x6e, 0x2e, 0x69, + 0x64, 0x3d, 0x6e, 0x2e, 0x24, 0x69, 0x64, 0x2c, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x24, 0x69, 0x64, 0x29, 0x2c, 0x72, 0x26, + 0x26, 0x65, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x6e, + 0x2c, 0x6e, 0x5b, 0x73, 0x5d, 0x2c, 0x21, 0x31, 0x29, 0x7d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x65, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x72, 0x7d, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x65, 0x5b, 0x72, + 0x5d, 0x7c, 0x7c, 0x65, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x28, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x73, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x28, 0x65, 0x29, 0x2c, 0x21, 0x73, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x6e, 0x6f, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6f, 0x72, 0x20, + 0x72, 0x65, 0x66, 0x20, 0x22, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x60, 0x29, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x65, 0x29, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x73, 0x28, 0x72, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x22, 0x69, 0x6e, 0x20, 0x73, 0x7c, 0x7c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3d, 0x73, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x29, 0x2c, 0x6e, 0x7d, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x61, 0x64, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x28, 0x73, 0x29, 0x7d, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x21, 0x3d, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x73, 0x68, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x7b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x73, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x3b, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x64, 0x2c, 0x6c, 0x29, 0x7b, 0x61, + 0x77, 0x61, 0x69, 0x74, 0x20, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x64, 0x2e, 0x24, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x79, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x28, 0x64, 0x2c, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x7c, 0x7c, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x79, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x64, 0x29, + 0x7b, 0x64, 0x26, 0x26, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x64, 0x29, 0x26, 0x26, + 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x64, 0x7d, 0x2c, 0x21, 0x30, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, + 0x64, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x28, 0x64, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x29, + 0x2c, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x63, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x2e, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x2c, + 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x64, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x28, 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x64, 0x2c, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x3a, 0x6c, 0x7d, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, + 0x64, 0x5d, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x41, 0x6e, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x24, 0x7b, 0x64, 0x7d, 0x20, 0x69, + 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x24, 0x7b, 0x6c, 0x7d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x60, 0x29, 0x7d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x64, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x6c, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x75, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x64, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, + 0x64, 0x5d, 0x7c, 0x7c, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x61, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x2e, + 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x64, 0x5d, 0x7c, 0x7c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x28, 0x6c, 0x2c, 0x64, 0x2c, 0x72, 0x29, 0x7d, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x28, 0x64, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x5b, 0x64, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x6c, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x5b, 0x64, 0x5d, 0x3d, 0x73, 0x28, 0x64, 0x29, 0x29, 0x7d, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x5b, 0x64, 0x5d, 0x7d, 0x7d, 0x7d, 0x61, 0x64, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, + 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x65, 0x29, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x20, 0x6f, + 0x66, 0x20, 0x65, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x6f, 0x2c, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x2c, 0x73, 0x2c, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x6c, 0x65, 0x74, + 0x20, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x49, 0x64, 0x3a, 0x6f, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x61, 0x3d, 0x65, 0x5b, 0x6f, + 0x5d, 0x2c, 0x61, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x21, 0x3d, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x24, 0x7b, 0x6f, + 0x7d, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x60, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3d, 0x28, 0x30, 0x2c, 0x4d, 0x74, 0x2e, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, 0x28, 0x72, + 0x7c, 0x7c, 0x61, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x72, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x5b, 0x72, 0x5d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, + 0x73, 0x2c, 0x72, 0x2c, 0x6e, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x7d, 0x61, 0x64, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, + 0x2c, 0x72, 0x2c, 0x21, 0x30, 0x2c, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x7d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x30, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3b, + 0x69, 0x66, 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x24, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2c, 0x73, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x21, + 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x3d, 0x73, + 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x7c, + 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x21, 0x73, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, + 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x21, 0x30, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x28, 0x73, 0x2c, 0x65, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x26, 0x26, 0x72, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x61, 0x3d, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3a, + 0x20, 0x22, 0x2b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x54, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3d, 0x3d, 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x22, 0x29, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x61, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x61, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x7d, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x28, 0x72, 0x3d, + 0x76, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x65, 0x29, 0x29, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x3b, 0x29, 0x65, 0x3d, 0x72, 0x3b, 0x69, 0x66, 0x28, 0x72, + 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, + 0x73, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x74, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x28, 0x7b, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x7d, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x49, 0x64, 0x3a, 0x73, 0x7d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, + 0x3d, 0x54, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x2c, 0x21, 0x72, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x66, 0x73, 0x5b, 0x65, 0x5d, 0x3d, 0x72, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x45, 0x6e, 0x76, 0x28, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x6f, 0x66, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x66, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x3b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x65, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x75, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x3a, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, + 0x66, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, + 0x3d, 0x76, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x28, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x5b, 0x65, 0x5d, 0x2c, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x66, 0x73, 0x5b, 0x65, 0x5d, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x7d, 0x63, 0x61, 0x73, 0x65, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x3a, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x65, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x72, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x73, 0x3d, 0x65, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x5d, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x26, 0x26, 0x28, + 0x73, 0x3d, 0x28, 0x30, 0x2c, 0x4d, 0x74, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, 0x28, 0x73, 0x29, 0x2c, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x5b, 0x73, 0x5d, 0x2c, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x65, 0x66, 0x73, 0x5b, 0x73, 0x5d, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x7d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x61, 0x6a, 0x76, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x20, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x22, 0x29, 0x7d, 0x7d, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, + 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x28, 0x65, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, + 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x28, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x61, 0x64, 0x64, 0x4b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x73, 0x3d, 0x65, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x26, 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x6f, + 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x74, + 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, + 0x64, 0x6f, 0x63, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, + 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x29, 0x2c, 0x72, 0x2e, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3d, 0x73, 0x29, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x26, 0x26, 0x72, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x65, 0x2c, 0x73, 0x3d, + 0x72, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x73, 0x29, 0x26, 0x26, 0x21, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x64, 0x64, 0x4b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x20, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, + 0x6e, 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x64, + 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x6b, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x73, 0x2c, 0x72, 0x29, 0x2c, 0x21, 0x72, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x4f, 0x73, 0x2e, 0x65, + 0x61, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x29, 0x28, 0x73, 0x2c, 0x61, + 0x3d, 0x3e, 0x4e, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x61, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x3b, + 0x52, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x72, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x7b, 0x2e, + 0x2e, 0x2e, 0x72, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x28, 0x30, 0x2c, + 0x70, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x29, 0x28, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, + 0x28, 0x30, 0x2c, 0x70, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0x53, 0x4f, + 0x4e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x28, 0x72, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x7d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x4f, 0x73, 0x2e, 0x65, + 0x61, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x29, 0x28, 0x73, 0x2c, 0x6e, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3d, 0x3d, 0x3d, 0x30, 0x3f, 0x61, 0x3d, 0x3e, 0x4e, 0x73, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x2c, 0x6e, + 0x29, 0x3a, 0x61, 0x3d, 0x3e, 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x6f, 0x3d, 0x3e, 0x4e, + 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x61, 0x2c, 0x6e, 0x2c, 0x6f, 0x29, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x7d, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, 0x61, 0x6c, 0x6c, + 0x5b, 0x65, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x72, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x21, 0x21, 0x72, 0x7d, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x52, 0x55, 0x4c, 0x45, + 0x53, 0x3a, 0x72, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x3b, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x72, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x5b, 0x65, 0x5d, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x72, 0x2e, 0x61, 0x6c, 0x6c, 0x5b, 0x65, 0x5d, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x6e, 0x3d, 0x73, 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x66, + 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x61, 0x3d, 0x3e, + 0x61, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3d, 0x3d, 0x3d, + 0x65, 0x29, 0x3b, 0x6e, 0x3e, 0x3d, 0x30, 0x26, 0x26, 0x73, 0x2e, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x6e, 0x2c, 0x31, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x61, 0x64, 0x64, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, + 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x26, 0x26, 0x28, + 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, + 0x28, 0x72, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x73, 0x5b, 0x65, 0x5d, 0x3d, 0x72, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x7d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x54, 0x65, + 0x78, 0x74, 0x28, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x7b, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x3a, 0x72, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x56, 0x61, 0x72, 0x3a, 0x73, 0x3d, 0x22, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x7d, 0x3d, 0x7b, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x65, 0x7c, 0x7c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x3f, 0x22, 0x4e, 0x6f, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x65, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x6e, 0x3d, 0x3e, 0x60, 0x24, 0x7b, 0x73, 0x7d, 0x24, 0x7b, + 0x6e, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x7d, 0x60, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, + 0x65, 0x28, 0x28, 0x6e, 0x2c, 0x61, 0x29, 0x3d, 0x3e, 0x6e, 0x2b, 0x72, + 0x2b, 0x61, 0x29, 0x7d, 0x24, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x65, 0x74, + 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, 0x61, 0x6c, 0x6c, 0x3b, 0x65, 0x3d, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x28, 0x65, 0x29, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x61, 0x3d, 0x6e, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, + 0x22, 0x2f, 0x22, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, + 0x29, 0x2c, 0x6f, 0x3d, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x69, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x29, 0x6f, 0x3d, 0x6f, + 0x5b, 0x69, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x69, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x63, 0x3d, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x63, 0x21, 0x3d, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x75, 0x7d, 0x3d, 0x63, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x2c, 0x64, 0x3d, 0x6f, 0x5b, 0x69, 0x5d, 0x3b, 0x75, + 0x26, 0x26, 0x64, 0x26, 0x26, 0x28, 0x6f, 0x5b, 0x69, 0x5d, 0x3d, 0x45, + 0x6f, 0x28, 0x64, 0x29, 0x29, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x7d, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6e, + 0x3d, 0x65, 0x5b, 0x73, 0x5d, 0x3b, 0x28, 0x21, 0x72, 0x7c, 0x7c, 0x72, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x73, 0x29, 0x29, 0x26, 0x26, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3d, 0x3d, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x65, 0x5b, 0x73, 0x5d, 0x3a, 0x6e, 0x26, 0x26, 0x21, 0x6e, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x26, 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x28, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x65, 0x5b, 0x73, 0x5d, + 0x29, 0x29, 0x7d, 0x7d, 0x5f, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x6e, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, + 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x61, 0x64, 0x64, 0x55, 0x73, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x2c, 0x7b, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x69, 0x7d, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3d, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x6f, 0x3d, 0x65, 0x5b, 0x69, 0x5d, + 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6a, 0x74, 0x64, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x65, 0x21, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x7d, 0x6c, 0x65, 0x74, 0x20, 0x63, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x65, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x63, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3b, 0x73, 0x3d, 0x28, 0x30, 0x2c, + 0x4d, 0x74, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x49, 0x64, 0x29, 0x28, 0x6f, 0x7c, 0x7c, 0x73, 0x29, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x75, 0x3d, 0x4d, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x73, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x65, 0x2c, 0x73, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x54, 0x74, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x69, 0x2c, 0x6d, + 0x65, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x3a, 0x73, 0x2c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x73, + 0x3a, 0x75, 0x7d, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x63, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x63, 0x29, 0x2c, 0x61, 0x26, 0x26, + 0x21, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x28, 0x22, 0x23, 0x22, 0x29, 0x26, 0x26, 0x28, 0x73, 0x26, 0x26, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x73, 0x5d, 0x3d, 0x63, 0x29, + 0x2c, 0x6e, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, + 0x65, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x63, 0x7d, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x65, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x65, 0x5d, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x64, 0x20, + 0x22, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x60, 0x29, 0x7d, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x29, 0x3a, 0x54, 0x74, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x65, 0x29, 0x2c, 0x21, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x7d, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x73, 0x3b, 0x74, 0x72, 0x79, + 0x7b, 0x54, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x3d, 0x72, 0x7d, 0x7d, 0x7d, 0x3b, 0x41, 0x74, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x70, 0x6c, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3b, + 0x41, 0x74, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x66, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x62, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3b, 0x57, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x41, 0x74, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x73, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x6e, 0x3b, + 0x61, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x5b, 0x73, 0x5d, 0x28, 0x60, + 0x24, 0x7b, 0x72, 0x7d, 0x3a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x2e, 0x20, 0x24, 0x7b, 0x74, 0x5b, 0x61, + 0x5d, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x76, 0x6f, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3d, 0x28, 0x30, 0x2c, 0x4d, 0x74, 0x2e, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x49, 0x64, 0x29, + 0x28, 0x74, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x5b, 0x74, 0x5d, 0x7c, 0x7c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x5d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6c, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x29, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x29, + 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x28, 0x74, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x74, 0x5b, 0x65, 0x5d, 0x2c, 0x65, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, + 0x6c, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x5b, + 0x74, 0x5d, 0x3b, 0x65, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x64, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x53, 0x6c, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, + 0x29, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x56, + 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x28, 0x74, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, + 0x28, 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x70, + 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x3d, 0x74, 0x5b, 0x65, 0x5d, 0x3b, 0x72, 0x2e, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x7c, 0x7c, 0x28, 0x72, 0x2e, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3d, 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x28, 0x72, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6a, 0x6c, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x74, + 0x3d, 0x7b, 0x2e, 0x2e, 0x2e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x6c, 0x29, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x74, 0x5b, 0x65, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x71, 0x6c, 0x3d, + 0x7b, 0x6c, 0x6f, 0x67, 0x28, 0x29, 0x7b, 0x7d, 0x2c, 0x77, 0x61, 0x72, + 0x6e, 0x28, 0x29, 0x7b, 0x7d, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x29, 0x7b, 0x7d, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4e, 0x6c, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x71, 0x6c, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x69, 0x66, 0x28, + 0x74, 0x2e, 0x6c, 0x6f, 0x67, 0x26, 0x26, 0x74, 0x2e, 0x77, 0x61, 0x72, + 0x6e, 0x26, 0x26, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3b, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6c, + 0x6f, 0x67, 0x2c, 0x20, 0x77, 0x61, 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x73, 0x22, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x6c, 0x3d, + 0x2f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5f, 0x24, 0x5d, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x24, 0x3a, 0x2d, 0x5d, 0x2a, 0x24, 0x2f, + 0x69, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, + 0x6c, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x52, + 0x55, 0x4c, 0x45, 0x53, 0x3a, 0x72, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x3b, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4f, 0x73, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x29, 0x28, 0x74, 0x2c, 0x73, 0x3d, + 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x72, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x5b, 0x73, 0x5d, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, + 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x24, 0x7b, 0x73, 0x7d, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x60, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x4f, 0x6c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x73, 0x29, + 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x68, 0x61, 0x73, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x60, + 0x29, 0x7d, 0x29, 0x2c, 0x21, 0x21, 0x65, 0x26, 0x26, 0x65, 0x2e, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x26, 0x26, 0x21, 0x28, 0x22, 0x63, 0x6f, 0x64, + 0x65, 0x22, 0x69, 0x6e, 0x20, 0x65, 0x7c, 0x7c, 0x22, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x27, 0x24, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x73, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x65, 0x3f, 0x2e, 0x70, + 0x6f, 0x73, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x26, 0x26, 0x6e, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x27, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x52, 0x55, 0x4c, 0x45, 0x53, + 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6f, 0x3d, 0x6e, + 0x3f, 0x61, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x61, 0x2e, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x28, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x63, 0x7d, 0x29, 0x3d, 0x3e, 0x63, 0x3d, 0x3d, + 0x3d, 0x72, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x7c, 0x7c, 0x28, 0x6f, + 0x3d, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x72, 0x2c, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x7d, 0x2c, 0x61, 0x2e, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6f, 0x29, 0x29, 0x2c, + 0x61, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x74, + 0x5d, 0x3d, 0x21, 0x30, 0x2c, 0x21, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x7b, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7b, 0x2e, 0x2e, 0x2e, 0x65, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x28, 0x30, 0x2c, 0x70, 0x72, 0x2e, + 0x67, 0x65, 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x29, 0x28, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x28, 0x30, 0x2c, + 0x70, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x29, 0x28, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x7d, 0x7d, 0x3b, 0x65, 0x2e, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x3f, 0x49, 0x6c, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6f, 0x2c, 0x69, 0x2c, 0x65, + 0x2e, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x29, 0x3a, 0x6f, 0x2e, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x29, + 0x2c, 0x61, 0x2e, 0x61, 0x6c, 0x6c, 0x5b, 0x74, 0x5d, 0x3d, 0x69, 0x2c, + 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, + 0x7c, 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, + 0x7c, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x63, + 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, 0x63, 0x29, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6c, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x74, + 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x28, 0x6e, 0x3d, 0x3e, 0x6e, 0x2e, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3d, 0x3d, 0x3d, 0x72, 0x29, 0x3b, 0x73, + 0x3e, 0x3d, 0x30, 0x3f, 0x74, 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, + 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x73, 0x2c, 0x30, 0x2c, 0x65, + 0x29, 0x3a, 0x28, 0x74, 0x2e, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, + 0x60, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x69, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x60, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x52, 0x6c, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x6d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, + 0x7d, 0x3d, 0x74, 0x3b, 0x65, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x24, 0x64, 0x61, 0x74, 0x61, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x45, 0x6f, + 0x28, 0x65, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x65, + 0x2c, 0x21, 0x30, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x54, 0x6c, + 0x3d, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x72, 0x61, 0x77, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x75, 0x73, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x6a, 0x76, 0x2d, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x6a, 0x76, 0x2f, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x72, + 0x65, 0x66, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6a, 0x73, 0x6f, + 0x6e, 0x23, 0x22, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x45, 0x6f, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x74, 0x2c, + 0x54, 0x6c, 0x5d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x50, 0x6f, 0x3d, 0x70, 0x28, 0x49, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x49, 0x73, 0x2c, + 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x69, 0x64, 0x22, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x4e, 0x4f, + 0x54, 0x20, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x3a, + 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x22, 0x24, 0x69, 0x64, 0x22, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, + 0x49, 0x44, 0x27, 0x29, 0x7d, 0x7d, 0x3b, 0x49, 0x73, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x4d, 0x6c, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x24, 0x72, 0x3d, 0x70, 0x28, 0x57, 0x65, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x57, 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x30, 0x7d, 0x29, 0x3b, 0x57, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x52, + 0x65, 0x66, 0x3d, 0x57, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x41, 0x6c, 0x3d, 0x69, 0x74, 0x28, 0x29, + 0x2c, 0x53, 0x6f, 0x3d, 0x75, 0x65, 0x28, 0x29, 0x2c, 0x6e, 0x65, 0x3d, + 0x45, 0x28, 0x29, 0x2c, 0x64, 0x74, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, + 0x6a, 0x6f, 0x3d, 0x49, 0x74, 0x28, 0x29, 0x2c, 0x68, 0x72, 0x3d, 0x49, + 0x28, 0x29, 0x2c, 0x43, 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x69, 0x74, 0x3a, + 0x73, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x3a, 0x61, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x3a, 0x6f, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x69, + 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x63, 0x7d, 0x3d, 0x73, 0x2c, 0x7b, + 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x75, 0x7d, 0x3d, 0x61, 0x3b, 0x69, 0x66, + 0x28, 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x22, 0x23, 0x22, 0x7c, 0x7c, 0x72, + 0x3d, 0x3d, 0x3d, 0x22, 0x23, 0x2f, 0x22, 0x29, 0x26, 0x26, 0x6e, 0x3d, + 0x3d, 0x3d, 0x75, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x28, 0x29, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x64, 0x3d, 0x6a, 0x6f, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x52, 0x65, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, + 0x2c, 0x75, 0x2c, 0x6e, 0x2c, 0x72, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, + 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6c, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x2c, 0x6e, 0x2c, 0x72, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6a, + 0x6f, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x28, 0x64, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x28, 0x64, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x61, 0x3d, 0x3d, 0x3d, 0x75, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x72, 0x28, 0x74, 0x2c, 0x6f, 0x2c, + 0x61, 0x2c, 0x61, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x66, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x72, 0x6f, 0x6f, 0x74, + 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x75, 0x7d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x72, 0x28, 0x74, 0x2c, 0x28, + 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x66, 0x7d, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x60, 0x2c, 0x75, + 0x2c, 0x75, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x66, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x71, 0x6f, 0x28, 0x74, 0x2c, + 0x66, 0x29, 0x3b, 0x79, 0x72, 0x28, 0x74, 0x2c, 0x6d, 0x2c, 0x66, 0x2c, + 0x66, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x66, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x2c, 0x69, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x7b, + 0x72, 0x65, 0x66, 0x3a, 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x28, + 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x29, 0x28, 0x66, 0x29, 0x7d, 0x3a, 0x7b, 0x72, 0x65, 0x66, + 0x3a, 0x66, 0x7d, 0x29, 0x2c, 0x24, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x2c, 0x67, + 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x66, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x6e, + 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x2c, 0x74, 0x6f, 0x70, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x66, 0x3a, 0x6d, 0x2c, 0x65, 0x72, 0x72, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x72, + 0x7d, 0x2c, 0x24, 0x29, 0x3b, 0x74, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x28, 0x67, 0x29, + 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x24, 0x29, 0x7d, 0x7d, 0x7d, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x6f, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x72, 0x7d, 0x3d, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3f, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2c, + 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x7d, 0x29, 0x3a, 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x65, 0x7d, 0x29, + 0x7d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x60, 0x7d, + 0x57, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x3d, 0x71, 0x6f, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x79, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x73, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x6e, + 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x61, 0x6c, + 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x6f, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x3a, 0x69, 0x2c, 0x6f, 0x70, + 0x74, 0x73, 0x3a, 0x63, 0x7d, 0x3d, 0x61, 0x2c, 0x75, 0x3d, 0x63, 0x2e, + 0x70, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3f, + 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x74, + 0x68, 0x69, 0x73, 0x3a, 0x6e, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x3b, 0x73, + 0x3f, 0x64, 0x28, 0x29, 0x3a, 0x6c, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x21, 0x69, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x66, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x6e, 0x2e, 0x74, 0x72, 0x79, 0x28, + 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6e, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x53, 0x6f, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x75, 0x29, 0x7d, + 0x60, 0x29, 0x2c, 0x68, 0x28, 0x65, 0x29, 0x2c, 0x6f, 0x7c, 0x7c, 0x6e, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x66, 0x2c, 0x21, 0x30, + 0x29, 0x7d, 0x2c, 0x6d, 0x3d, 0x3e, 0x7b, 0x6e, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x21, 0x28, 0x24, + 0x7b, 0x6d, 0x7d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x29, + 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x6e, 0x2e, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x28, 0x6d, 0x29, 0x29, 0x2c, 0x79, 0x28, 0x6d, 0x29, 0x2c, 0x6f, + 0x7c, 0x7c, 0x6e, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x66, + 0x2c, 0x21, 0x31, 0x29, 0x7d, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, + 0x66, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x28, 0x28, 0x30, 0x2c, 0x53, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x29, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x75, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x68, 0x28, 0x65, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x79, 0x28, 0x65, + 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x28, 0x66, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x28, + 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x66, 0x7d, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x60, 0x3b, 0x6e, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x2c, 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x3f, 0x20, 0x24, 0x7b, 0x6d, 0x7d, 0x20, + 0x3a, 0x20, 0x24, 0x7b, 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x24, 0x7b, 0x6d, 0x7d, 0x29, + 0x60, 0x29, 0x2c, 0x6e, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x64, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x66, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6d, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x24, 0x3d, 0x28, 0x6d, 0x3d, 0x72, 0x3f, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x29, 0x3d, 0x3d, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x7c, 0x7c, 0x6d, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, + 0x6d, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3b, + 0x69, 0x66, 0x28, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, + 0x3d, 0x21, 0x30, 0x29, 0x69, 0x66, 0x28, 0x24, 0x26, 0x26, 0x21, 0x24, + 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x29, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x3d, 0x68, 0x72, 0x2e, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x28, 0x6e, 0x2c, 0x24, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x2c, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x29, 0x29, + 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x3d, + 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x66, 0x7d, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x60, 0x29, 0x3b, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3d, 0x68, 0x72, 0x2e, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x28, 0x6e, 0x2c, 0x67, 0x2c, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x2c, 0x6e, 0x65, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x69, 0x66, 0x28, 0x24, 0x26, + 0x26, 0x21, 0x24, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x29, 0x24, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, + 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x68, 0x72, 0x2e, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x28, 0x6e, 0x2c, 0x24, 0x2e, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x29, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x67, 0x3d, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x6e, 0x65, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x66, 0x7d, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x29, + 0x3b, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x68, 0x72, 0x2e, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x28, 0x6e, 0x2c, 0x67, + 0x2c, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x6e, 0x65, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x7d, 0x7d, 0x7d, 0x57, 0x65, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x66, 0x3d, 0x79, 0x72, 0x3b, 0x57, 0x65, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x43, 0x6c, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x73, 0x3d, 0x70, 0x28, 0x52, + 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x52, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x44, + 0x6c, 0x3d, 0x50, 0x6f, 0x28, 0x29, 0x2c, 0x7a, 0x6c, 0x3d, 0x24, 0x72, + 0x28, 0x29, 0x2c, 0x56, 0x6c, 0x3d, 0x5b, 0x22, 0x24, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x22, 0x24, 0x69, 0x64, 0x22, 0x2c, 0x22, + 0x24, 0x64, 0x65, 0x66, 0x73, 0x22, 0x2c, 0x22, 0x24, 0x76, 0x6f, 0x63, + 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x22, 0x2c, 0x7b, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x24, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x7d, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2c, 0x44, 0x6c, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x7a, 0x6c, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x52, 0x73, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x56, 0x6c, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x4e, 0x6f, 0x3d, 0x70, 0x28, 0x4d, 0x73, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x4d, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, 0x72, 0x3d, 0x45, + 0x28, 0x29, 0x2c, 0x4d, 0x65, 0x3d, 0x5f, 0x72, 0x2e, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2c, 0x67, 0x72, 0x3d, 0x7b, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, + 0x72, 0x3a, 0x22, 0x3c, 0x3d, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x4d, 0x65, + 0x2e, 0x4c, 0x54, 0x45, 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x4d, 0x65, + 0x2e, 0x47, 0x54, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x3a, 0x22, 0x3e, 0x3d, 0x22, + 0x2c, 0x6f, 0x6b, 0x3a, 0x4d, 0x65, 0x2e, 0x47, 0x54, 0x45, 0x2c, 0x66, + 0x61, 0x69, 0x6c, 0x3a, 0x4d, 0x65, 0x2e, 0x4c, 0x54, 0x7d, 0x2c, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x3a, 0x22, + 0x3c, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x4d, 0x65, 0x2e, 0x4c, 0x54, 0x2c, + 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x4d, 0x65, 0x2e, 0x47, 0x54, 0x45, 0x7d, + 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, 0x72, + 0x3a, 0x22, 0x3e, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x4d, 0x65, 0x2e, 0x47, + 0x54, 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x4d, 0x65, 0x2e, 0x4c, 0x54, + 0x45, 0x7d, 0x7d, 0x2c, 0x78, 0x6c, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, + 0x64, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x5f, + 0x72, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x24, 0x7b, 0x67, 0x72, 0x5b, 0x74, 0x5d, 0x2e, 0x6f, + 0x6b, 0x53, 0x74, 0x72, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x2c, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x3d, 0x3e, 0x28, + 0x30, 0x2c, 0x5f, 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x3a, 0x20, 0x24, 0x7b, 0x67, + 0x72, 0x5b, 0x74, 0x5d, 0x2e, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x7d, 0x2c, + 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x65, 0x7d, + 0x7d, 0x60, 0x7d, 0x2c, 0x4b, 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x28, 0x67, 0x72, 0x29, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x78, 0x6c, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x65, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x74, 0x2e, 0x66, + 0x61, 0x69, 0x6c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, + 0x5f, 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x24, + 0x7b, 0x67, 0x72, 0x5b, 0x65, 0x5d, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x7d, + 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x7c, 0x7c, 0x20, 0x69, 0x73, 0x4e, + 0x61, 0x4e, 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x29, 0x60, 0x29, 0x7d, 0x7d, + 0x3b, 0x4d, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, + 0x4b, 0x6c, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x6f, 0x3d, + 0x70, 0x28, 0x41, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x41, 0x73, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x43, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x55, 0x6c, 0x3d, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x43, 0x74, 0x2e, 0x73, 0x74, 0x72, + 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x24, 0x7b, + 0x74, 0x7d, 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, + 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, + 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x43, 0x74, 0x2e, 0x5f, + 0x29, 0x60, 0x7b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x46, + 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x22, 0x2c, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x55, 0x6c, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, + 0x74, 0x2c, 0x61, 0x3d, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x50, 0x72, 0x65, + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x6f, 0x3d, 0x65, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x72, 0x65, 0x73, 0x22, 0x29, 0x2c, 0x69, 0x3d, + 0x61, 0x3f, 0x28, 0x30, 0x2c, 0x43, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x62, 0x73, 0x28, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x24, 0x7b, 0x6f, 0x7d, 0x29, + 0x20, 0x2d, 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x29, 0x20, 0x3e, 0x20, 0x31, + 0x65, 0x2d, 0x24, 0x7b, 0x61, 0x7d, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x43, + 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x21, 0x3d, + 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x24, + 0x7b, 0x6f, 0x7d, 0x29, 0x60, 0x3b, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, + 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x43, 0x74, 0x2e, + 0x5f, 0x29, 0x60, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x24, 0x7b, 0x6f, 0x7d, 0x20, + 0x3d, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x7d, 0x2c, + 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x29, 0x29, 0x60, 0x29, 0x7d, 0x7d, 0x3b, + 0x41, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x46, + 0x6c, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x49, 0x6f, 0x3d, 0x70, + 0x28, 0x43, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x43, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x6f, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x73, 0x3d, 0x30, 0x2c, 0x6e, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x73, 0x3c, 0x65, 0x3b, 0x29, 0x72, + 0x2b, 0x2b, 0x2c, 0x6e, 0x3d, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, + 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x73, 0x2b, 0x2b, 0x29, 0x2c, 0x6e, + 0x3e, 0x3d, 0x35, 0x35, 0x32, 0x39, 0x36, 0x26, 0x26, 0x6e, 0x3c, 0x3d, + 0x35, 0x36, 0x33, 0x31, 0x39, 0x26, 0x26, 0x73, 0x3c, 0x65, 0x26, 0x26, + 0x28, 0x6e, 0x3d, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, + 0x65, 0x41, 0x74, 0x28, 0x73, 0x29, 0x2c, 0x28, 0x6e, 0x26, 0x36, 0x34, + 0x35, 0x31, 0x32, 0x29, 0x3d, 0x3d, 0x3d, 0x35, 0x36, 0x33, 0x32, 0x30, + 0x26, 0x26, 0x73, 0x2b, 0x2b, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x7d, 0x43, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3d, 0x6b, 0x6f, 0x3b, 0x6b, 0x6f, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x3d, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x61, 0x6a, 0x76, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x2f, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x75, 0x63, 0x73, 0x32, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x22, 0x29, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x27, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x52, 0x6f, 0x3d, + 0x70, 0x28, 0x44, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x44, 0x73, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x59, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4c, 0x6c, 0x3d, + 0x49, 0x28, 0x29, 0x2c, 0x48, 0x6c, 0x3d, 0x49, 0x6f, 0x28, 0x29, 0x2c, + 0x47, 0x6c, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x7d, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x3d, 0x3d, 0x3d, + 0x22, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x3f, + 0x22, 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x22, 0x66, 0x65, 0x77, 0x65, + 0x72, 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, + 0x59, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x24, 0x7b, + 0x72, 0x7d, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x24, 0x7b, 0x65, 0x7d, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x60, + 0x7d, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x59, 0x65, 0x2e, 0x5f, 0x29, 0x60, + 0x7b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, + 0x7d, 0x60, 0x7d, 0x2c, 0x4a, 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x22, 0x2c, 0x22, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x22, 0x5d, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, + 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x47, 0x6c, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, + 0x65, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x2c, + 0x61, 0x3d, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x3f, 0x59, 0x65, 0x2e, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x47, 0x54, 0x3a, 0x59, 0x65, + 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, + 0x54, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, + 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x3f, + 0x28, 0x30, 0x2c, 0x59, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, + 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x3a, 0x28, 0x30, + 0x2c, 0x59, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x28, 0x30, 0x2c, + 0x4c, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x29, 0x28, + 0x74, 0x2e, 0x67, 0x65, 0x6e, 0x2c, 0x48, 0x6c, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x29, + 0x60, 0x3b, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x28, 0x30, 0x2c, 0x59, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x6f, 0x7d, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x20, 0x24, 0x7b, 0x73, + 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x44, 0x73, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x4a, 0x6c, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x54, 0x6f, 0x3d, 0x70, 0x28, 0x7a, 0x73, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x7a, + 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x57, 0x6c, 0x3d, 0x75, 0x65, + 0x28, 0x29, 0x2c, 0x76, 0x72, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x59, 0x6c, + 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x74, + 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x76, 0x72, 0x2e, 0x73, 0x74, + 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x24, + 0x7b, 0x74, 0x7d, 0x22, 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, + 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x76, 0x72, + 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x5a, 0x6c, + 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x59, 0x6c, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x64, 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x6e, + 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x6f, 0x3d, 0x61, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x3f, 0x22, 0x75, 0x22, 0x3a, + 0x22, 0x22, 0x2c, 0x69, 0x3d, 0x72, 0x3f, 0x28, 0x30, 0x2c, 0x76, 0x72, + 0x2e, 0x5f, 0x29, 0x60, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x28, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, + 0x6f, 0x7d, 0x29, 0x29, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x57, 0x6c, 0x2e, + 0x75, 0x73, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x28, + 0x74, 0x2c, 0x73, 0x29, 0x3b, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x76, 0x72, 0x2e, 0x5f, + 0x29, 0x60, 0x21, 0x24, 0x7b, 0x69, 0x7d, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x28, 0x24, 0x7b, 0x65, 0x7d, 0x29, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x7a, + 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x5a, 0x6c, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x6f, 0x3d, 0x70, 0x28, + 0x56, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x56, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x44, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x51, 0x6c, 0x3d, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x72, 0x3d, 0x74, 0x3d, 0x3d, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x22, + 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x22, 0x66, 0x65, 0x77, 0x65, 0x72, + 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x44, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x72, + 0x7d, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x60, 0x7d, + 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, + 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x44, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x7b, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, + 0x60, 0x7d, 0x2c, 0x42, 0x6c, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x22, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x5d, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x3a, 0x51, 0x6c, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x7d, 0x3d, + 0x74, 0x2c, 0x6e, 0x3d, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x6d, 0x61, 0x78, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, + 0x44, 0x74, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x2e, 0x47, 0x54, 0x3a, 0x44, 0x74, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x54, 0x3b, 0x74, 0x2e, 0x66, 0x61, + 0x69, 0x6c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x44, + 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x29, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x24, + 0x7b, 0x73, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x56, 0x73, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x42, 0x6c, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x41, 0x6f, 0x3d, 0x70, 0x28, 0x78, 0x73, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x78, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x7a, 0x74, 0x3d, + 0x75, 0x65, 0x28, 0x29, 0x2c, 0x56, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, + 0x58, 0x6c, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x65, 0x66, 0x3d, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x74, 0x7d, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x56, 0x74, 0x2e, 0x73, 0x74, 0x72, + 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x27, 0x24, 0x7b, 0x74, 0x7d, 0x27, + 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x74, + 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x56, 0x74, 0x2e, 0x5f, + 0x29, 0x60, 0x7b, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, + 0x7d, 0x60, 0x7d, 0x2c, 0x74, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x65, 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x6e, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x61, + 0x2c, 0x69, 0x74, 0x3a, 0x6f, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x6f, 0x70, + 0x74, 0x73, 0x3a, 0x69, 0x7d, 0x3d, 0x6f, 0x3b, 0x69, 0x66, 0x28, 0x21, + 0x61, 0x26, 0x26, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, + 0x3d, 0x3d, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x63, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3e, 0x3d, 0x69, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x2e, 0x61, + 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3f, 0x75, 0x28, 0x29, + 0x3a, 0x64, 0x28, 0x29, 0x2c, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x68, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x7b, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3a, 0x66, 0x7d, 0x3d, 0x74, 0x2e, 0x69, 0x74, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x29, 0x69, 0x66, 0x28, 0x68, 0x3f, 0x2e, 0x5b, 0x6d, 0x5d, 0x3d, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x21, 0x66, 0x2e, + 0x68, 0x61, 0x73, 0x28, 0x6d, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x24, 0x3d, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x2b, 0x6f, 0x2e, 0x65, + 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x2c, 0x67, 0x3d, 0x60, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x22, 0x24, + 0x7b, 0x6d, 0x7d, 0x22, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x22, + 0x24, 0x7b, 0x24, 0x7d, 0x22, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x60, 0x3b, + 0x28, 0x30, 0x2c, 0x58, 0x6c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x6f, + 0x2c, 0x67, 0x2c, 0x6f, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x63, 0x7c, 0x7c, 0x61, 0x29, + 0x74, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x56, 0x74, 0x2e, 0x6e, 0x69, 0x6c, 0x2c, 0x6c, 0x29, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x68, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x29, 0x28, 0x30, 0x2c, 0x7a, 0x74, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x29, + 0x28, 0x74, 0x2c, 0x68, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x68, + 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x63, 0x7c, 0x7c, + 0x61, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x3d, 0x65, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x21, + 0x30, 0x29, 0x3b, 0x74, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x66, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x79, 0x28, + 0x68, 0x2c, 0x66, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x66, + 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x65, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x7a, 0x74, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x4d, + 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x29, 0x28, + 0x74, 0x2c, 0x72, 0x2c, 0x68, 0x29, 0x29, 0x2c, 0x28, 0x30, 0x2c, 0x7a, + 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x29, 0x28, 0x74, 0x2c, 0x68, + 0x29, 0x2c, 0x65, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x29, 0x7b, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x22, 0x2c, 0x73, 0x2c, 0x68, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x73, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x3a, 0x68, 0x7d, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, + 0x30, 0x2c, 0x7a, 0x74, 0x2e, 0x6e, 0x6f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x29, 0x28, 0x65, + 0x2c, 0x6e, 0x2c, 0x68, 0x2c, 0x69, 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x29, + 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x28, 0x68, 0x2c, 0x66, 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, + 0x68, 0x7d, 0x29, 0x2c, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, + 0x68, 0x2c, 0x73, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x66, 0x2c, 0x28, 0x30, 0x2c, 0x7a, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x29, 0x28, 0x65, 0x2c, 0x6e, 0x2c, 0x68, 0x2c, + 0x69, 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, + 0x30, 0x2c, 0x56, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x66, 0x29, + 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, + 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x56, 0x74, 0x2e, 0x6e, 0x69, 0x6c, 0x29, + 0x7d, 0x7d, 0x7d, 0x3b, 0x78, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3d, 0x74, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x43, 0x6f, 0x3d, 0x70, 0x28, 0x4b, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4b, 0x73, 0x2c, + 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, + 0x72, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x7d, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x3d, 0x3d, 0x3d, + 0x22, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3f, 0x22, + 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x22, 0x66, 0x65, 0x77, 0x65, 0x72, + 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x78, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x72, + 0x7d, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x7d, 0x2c, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, + 0x78, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x73, 0x66, + 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5b, 0x22, + 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x22, 0x6d, + 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x5d, 0x2c, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x72, 0x66, + 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x65, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2c, 0x6e, 0x3d, + 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3f, 0x78, 0x74, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x2e, 0x47, 0x54, 0x3a, 0x78, 0x74, 0x2e, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x54, 0x3b, 0x74, + 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, + 0x30, 0x2c, 0x78, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x6e, 0x7d, + 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x4b, 0x73, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x73, 0x66, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x62, 0x72, 0x3d, 0x70, 0x28, 0x55, + 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x55, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x44, + 0x6f, 0x3d, 0x64, 0x73, 0x28, 0x29, 0x3b, 0x44, 0x6f, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x3d, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x61, 0x6a, 0x76, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x2f, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x22, + 0x29, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x27, 0x3b, 0x55, + 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x44, 0x6f, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x7a, 0x6f, 0x3d, 0x70, 0x28, + 0x4c, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4c, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x46, 0x73, 0x3d, 0x6a, 0x74, 0x28, 0x29, 0x2c, 0x59, 0x3d, 0x45, 0x28, + 0x29, 0x2c, 0x6e, 0x66, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x61, 0x66, 0x3d, + 0x62, 0x72, 0x28, 0x29, 0x2c, 0x6f, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3a, 0x7b, 0x69, 0x3a, 0x74, 0x2c, 0x6a, 0x3a, 0x65, 0x7d, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x73, 0x74, 0x72, 0x29, + 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x23, 0x23, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x29, 0x60, 0x2c, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x7b, 0x69, 0x3a, 0x74, 0x2c, 0x6a, 0x3a, 0x65, 0x7d, + 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, + 0x7b, 0x69, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x2c, 0x20, 0x6a, 0x3a, + 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x63, 0x66, 0x3d, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x6f, 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, + 0x61, 0x3a, 0x72, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x6e, 0x2c, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x61, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x6f, + 0x2c, 0x69, 0x74, 0x3a, 0x69, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x73, 0x26, 0x26, 0x21, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x2c, 0x75, + 0x3d, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3f, 0x28, 0x30, 0x2c, + 0x46, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x28, 0x61, 0x2e, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x29, 0x3a, 0x5b, 0x5d, 0x3b, 0x74, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x63, 0x2c, 0x64, 0x2c, + 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x29, + 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x66, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x69, + 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x72, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x2c, + 0x6d, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x6a, 0x22, 0x29, + 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x28, 0x7b, 0x69, 0x3a, 0x66, 0x2c, 0x6a, 0x3a, 0x6d, 0x7d, 0x29, 0x2c, + 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x63, 0x2c, 0x21, + 0x30, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x59, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x66, 0x7d, 0x20, 0x3e, 0x20, 0x31, + 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x28, 0x6c, 0x28, 0x29, 0x3f, 0x79, + 0x3a, 0x68, 0x29, 0x28, 0x66, 0x2c, 0x6d, 0x29, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3e, 0x30, 0x26, 0x26, 0x21, 0x75, 0x2e, 0x73, 0x6f, 0x6d, + 0x65, 0x28, 0x66, 0x3d, 0x3e, 0x66, 0x3d, 0x3d, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x7c, 0x7c, 0x66, 0x3d, 0x3d, 0x3d, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x66, 0x2c, 0x6d, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x24, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x29, 0x2c, 0x67, 0x3d, 0x28, + 0x30, 0x2c, 0x46, 0x73, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x61, + 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x29, 0x28, 0x75, 0x2c, 0x24, + 0x2c, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2c, 0x46, 0x73, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x29, 0x2c, 0x52, 0x3d, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x28, 0x22, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x22, + 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x7d, 0x60, + 0x29, 0x3b, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x28, 0x28, 0x30, 0x2c, 0x59, + 0x2e, 0x5f, 0x29, 0x60, 0x3b, 0x24, 0x7b, 0x66, 0x7d, 0x2d, 0x2d, 0x3b, + 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x65, 0x2e, 0x6c, 0x65, 0x74, + 0x28, 0x24, 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x72, 0x7d, 0x5b, 0x24, 0x7b, 0x66, 0x7d, 0x5d, 0x60, 0x29, 0x2c, + 0x65, 0x2e, 0x69, 0x66, 0x28, 0x67, 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, + 0x5f, 0x29, 0x60, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x60, + 0x29, 0x2c, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, + 0x26, 0x26, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x59, 0x2e, + 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, + 0x24, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x60, 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x24, 0x7d, 0x20, 0x2b, 0x3d, 0x20, 0x22, 0x5f, 0x22, 0x60, + 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x59, 0x2e, + 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, + 0x52, 0x7d, 0x5b, 0x24, 0x7b, 0x24, 0x7d, 0x5d, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x60, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x7b, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x6d, 0x2c, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x52, 0x7d, 0x5b, 0x24, 0x7b, 0x24, 0x7d, 0x5d, 0x60, 0x29, 0x2c, 0x74, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x63, 0x2c, 0x21, 0x31, 0x29, 0x2e, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x7d, 0x29, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x28, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x52, 0x7d, 0x5b, 0x24, 0x7b, 0x24, 0x7d, 0x5d, 0x20, 0x3d, 0x20, + 0x24, 0x7b, 0x66, 0x7d, 0x60, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x66, 0x2c, 0x6d, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x24, 0x3d, 0x28, 0x30, 0x2c, 0x6e, 0x66, + 0x2e, 0x75, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x29, 0x28, 0x65, 0x2c, + 0x61, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x2c, + 0x67, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x22, 0x29, 0x3b, 0x65, 0x2e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x28, 0x67, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x28, 0x28, 0x30, 0x2c, + 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x3b, 0x24, 0x7b, 0x66, 0x7d, 0x2d, 0x2d, + 0x3b, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x28, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6d, + 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x66, 0x7d, 0x3b, 0x20, 0x24, 0x7b, + 0x6d, 0x7d, 0x2d, 0x2d, 0x3b, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x59, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x24, 0x7d, 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x5b, 0x24, 0x7b, + 0x66, 0x7d, 0x5d, 0x2c, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x5b, 0x24, 0x7b, + 0x6d, 0x7d, 0x5d, 0x29, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x63, 0x2c, 0x21, 0x31, 0x29, 0x2e, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x67, 0x29, 0x7d, 0x29, 0x29, 0x29, + 0x7d, 0x7d, 0x7d, 0x3b, 0x4c, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3d, 0x63, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x56, 0x6f, 0x3d, 0x70, 0x28, 0x47, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x47, 0x73, 0x2c, + 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x48, 0x73, 0x3d, 0x45, 0x28, 0x29, 0x2c, + 0x75, 0x66, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x64, 0x66, 0x3d, 0x62, 0x72, + 0x28, 0x29, 0x2c, 0x6c, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x3a, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x22, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, + 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x48, + 0x73, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, + 0x7d, 0x60, 0x7d, 0x2c, 0x66, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x22, 0x2c, + 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x6c, 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, + 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, + 0x65, 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x61, + 0x7d, 0x3d, 0x74, 0x3b, 0x73, 0x7c, 0x7c, 0x61, 0x26, 0x26, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x3f, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x48, 0x73, 0x2e, 0x5f, + 0x29, 0x60, 0x21, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x75, 0x66, 0x2e, 0x75, + 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x29, 0x28, 0x65, 0x2c, 0x64, 0x66, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x28, 0x24, + 0x7b, 0x72, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x60, 0x29, + 0x3a, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x28, 0x30, 0x2c, 0x48, + 0x73, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x20, 0x21, 0x3d, + 0x3d, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x47, + 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x66, 0x66, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x6f, 0x3d, 0x70, 0x28, + 0x4a, 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4a, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x4b, 0x74, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x6d, 0x66, 0x3d, 0x49, 0x28, + 0x29, 0x2c, 0x70, 0x66, 0x3d, 0x62, 0x72, 0x28, 0x29, 0x2c, 0x68, 0x66, + 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x22, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, + 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, + 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x4b, + 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x74, + 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x79, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x68, 0x66, + 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x72, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x6e, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x61, 0x2c, 0x69, 0x74, 0x3a, 0x6f, + 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x26, 0x26, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x3d, 0x6f, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x2c, 0x63, 0x2c, + 0x75, 0x3d, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x3f, 0x3f, 0x28, 0x63, 0x3d, + 0x28, 0x30, 0x2c, 0x6d, 0x66, 0x2e, 0x75, 0x73, 0x65, 0x46, 0x75, 0x6e, + 0x63, 0x29, 0x28, 0x65, 0x2c, 0x70, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x29, 0x29, 0x2c, 0x64, 0x3b, 0x69, 0x66, 0x28, 0x69, + 0x7c, 0x7c, 0x73, 0x29, 0x64, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x2c, 0x74, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x64, 0x2c, + 0x6c, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x21, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x6e, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, + 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x68, 0x3d, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x28, 0x22, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x2c, 0x61, 0x29, 0x3b, 0x64, 0x3d, 0x28, 0x30, 0x2c, 0x4b, 0x74, 0x2e, + 0x6f, 0x72, 0x29, 0x28, 0x2e, 0x2e, 0x2e, 0x6e, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x28, 0x66, 0x2c, 0x6d, 0x29, 0x3d, 0x3e, 0x79, 0x28, 0x68, 0x2c, + 0x6d, 0x29, 0x29, 0x29, 0x7d, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x28, + 0x64, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x28, 0x29, 0x7b, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x64, 0x2c, 0x21, 0x31, 0x29, 0x2c, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x4f, 0x66, 0x28, 0x22, 0x76, 0x22, 0x2c, 0x61, 0x2c, 0x68, 0x3d, 0x3e, + 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4b, 0x74, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x75, 0x28, 0x29, 0x7d, 0x28, 0x24, 0x7b, 0x72, + 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x68, 0x7d, 0x29, 0x60, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x64, + 0x2c, 0x21, 0x30, 0x29, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, + 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x28, 0x68, 0x2c, 0x66, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6d, + 0x3d, 0x6e, 0x5b, 0x66, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x3d, 0x3d, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x6d, 0x21, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3f, 0x28, 0x30, 0x2c, 0x4b, 0x74, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x75, 0x28, 0x29, 0x7d, 0x28, 0x24, 0x7b, + 0x72, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x68, 0x7d, 0x5b, 0x24, 0x7b, 0x66, + 0x7d, 0x5d, 0x29, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x4b, 0x74, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, + 0x7b, 0x6d, 0x7d, 0x60, 0x7d, 0x7d, 0x7d, 0x3b, 0x4a, 0x73, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x79, 0x66, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x59, 0x73, 0x3d, 0x70, 0x28, 0x57, 0x73, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x57, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x66, 0x3d, + 0x4e, 0x6f, 0x28, 0x29, 0x2c, 0x5f, 0x66, 0x3d, 0x4f, 0x6f, 0x28, 0x29, + 0x2c, 0x67, 0x66, 0x3d, 0x52, 0x6f, 0x28, 0x29, 0x2c, 0x76, 0x66, 0x3d, + 0x54, 0x6f, 0x28, 0x29, 0x2c, 0x62, 0x66, 0x3d, 0x4d, 0x6f, 0x28, 0x29, + 0x2c, 0x77, 0x66, 0x3d, 0x41, 0x6f, 0x28, 0x29, 0x2c, 0x45, 0x66, 0x3d, + 0x43, 0x6f, 0x28, 0x29, 0x2c, 0x50, 0x66, 0x3d, 0x7a, 0x6f, 0x28, 0x29, + 0x2c, 0x53, 0x66, 0x3d, 0x56, 0x6f, 0x28, 0x29, 0x2c, 0x6a, 0x66, 0x3d, + 0x78, 0x6f, 0x28, 0x29, 0x2c, 0x71, 0x66, 0x3d, 0x5b, 0x24, 0x66, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x5f, 0x66, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x67, 0x66, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x76, 0x66, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x62, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2c, 0x77, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2c, 0x45, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x50, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2c, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x5d, 0x7d, 0x2c, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x6e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x7d, 0x2c, 0x53, 0x66, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x6a, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x57, 0x73, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x71, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x51, 0x73, 0x3d, 0x70, 0x28, 0x55, 0x74, 0x3d, 0x3e, 0x7b, 0x22, + 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x55, 0x74, + 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x3b, 0x55, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x5a, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x5a, + 0x73, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x4e, 0x66, 0x3d, 0x7b, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, 0x7d, 0x29, + 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x29, + 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, + 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, + 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x7b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, + 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x4f, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x3a, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x4e, + 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x69, 0x74, 0x3a, 0x72, 0x7d, 0x3d, 0x74, + 0x2c, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x73, 0x7d, 0x3d, 0x65, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, + 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x29, 0x29, 0x7b, 0x28, + 0x30, 0x2c, 0x5a, 0x73, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x72, 0x2c, + 0x27, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x20, 0x69, 0x73, 0x20, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x27, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x4b, 0x6f, 0x28, 0x74, 0x2c, + 0x73, 0x29, 0x7d, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4b, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, 0x2c, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x61, 0x2c, 0x69, 0x74, + 0x3a, 0x6f, 0x7d, 0x3d, 0x74, 0x3b, 0x6f, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x3d, 0x21, 0x30, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x72, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x22, + 0x2c, 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x6e, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x73, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x74, 0x2e, + 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6c, + 0x65, 0x6e, 0x3a, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, + 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x28, 0x28, 0x30, 0x2c, + 0x5a, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x3c, + 0x3d, 0x20, 0x24, 0x7b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x7d, 0x60, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x3d, 0x3d, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x21, 0x28, 0x30, 0x2c, + 0x5a, 0x73, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6f, 0x2c, + 0x73, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x72, 0x2e, + 0x76, 0x61, 0x72, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, + 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, + 0x7d, 0x20, 0x3c, 0x3d, 0x20, 0x24, 0x7b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x7d, 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x75, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x28, 0x75, 0x29, 0x29, 0x2c, + 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x75, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x75, 0x29, 0x7b, 0x72, 0x2e, + 0x66, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x22, 0x69, 0x22, + 0x2c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, 0x2c, + 0x64, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x61, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, + 0x64, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x5a, 0x73, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4e, + 0x75, 0x6d, 0x7d, 0x2c, 0x75, 0x29, 0x2c, 0x6f, 0x2e, 0x61, 0x6c, 0x6c, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7c, 0x7c, 0x72, 0x2e, 0x69, 0x66, + 0x28, 0x28, 0x30, 0x2c, 0x5a, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, + 0x75, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x28, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x55, 0x74, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3d, + 0x4b, 0x6f, 0x3b, 0x55, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x4f, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x42, + 0x73, 0x3d, 0x70, 0x28, 0x46, 0x74, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, 0x74, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x46, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x55, 0x6f, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x77, + 0x72, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x6b, 0x66, 0x3d, 0x75, 0x65, 0x28, + 0x29, 0x2c, 0x49, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x5d, 0x2c, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x3a, 0x22, 0x75, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x69, 0x74, 0x3a, + 0x72, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x65, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x46, 0x6f, 0x28, 0x74, + 0x2c, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x2e, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x21, 0x30, 0x2c, 0x21, 0x28, 0x30, + 0x2c, 0x77, 0x72, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x72, + 0x2c, 0x65, 0x29, 0x26, 0x26, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x28, 0x30, + 0x2c, 0x6b, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x29, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x7d, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x6f, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x73, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x6e, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x61, + 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6f, 0x2c, 0x69, + 0x74, 0x3a, 0x69, 0x7d, 0x3d, 0x74, 0x3b, 0x64, 0x28, 0x6e, 0x29, 0x2c, + 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x26, 0x26, 0x72, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x26, 0x26, 0x28, 0x69, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x77, 0x72, 0x2e, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x28, 0x73, 0x2c, 0x72, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2c, 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, + 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x73, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x2c, + 0x75, 0x3d, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x6c, + 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x55, 0x6f, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, + 0x28, 0x28, 0x6c, 0x2c, 0x79, 0x29, 0x3d, 0x3e, 0x7b, 0x28, 0x30, 0x2c, + 0x77, 0x72, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x69, 0x2c, + 0x6c, 0x29, 0x7c, 0x7c, 0x28, 0x73, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, + 0x2c, 0x55, 0x6f, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x75, 0x7d, 0x20, + 0x3e, 0x20, 0x24, 0x7b, 0x79, 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6f, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x79, 0x2c, + 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x79, 0x7d, 0x2c, + 0x63, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, 0x29, + 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x28, 0x6c, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x6f, 0x70, 0x74, + 0x73, 0x3a, 0x79, 0x2c, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x68, 0x7d, 0x3d, 0x69, 0x2c, 0x66, + 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6d, 0x3d, + 0x66, 0x3d, 0x3d, 0x3d, 0x6c, 0x2e, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x26, 0x26, 0x28, 0x66, 0x3d, 0x3d, 0x3d, 0x6c, 0x2e, 0x6d, + 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7c, 0x7c, 0x6c, 0x5b, 0x65, + 0x5d, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x79, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, + 0x73, 0x26, 0x26, 0x21, 0x6d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x24, + 0x3d, 0x60, 0x22, 0x24, 0x7b, 0x6f, 0x7d, 0x22, 0x20, 0x69, 0x73, 0x20, + 0x24, 0x7b, 0x66, 0x7d, 0x2d, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x2c, 0x20, + 0x62, 0x75, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x2f, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, 0x7b, + 0x68, 0x7d, 0x22, 0x60, 0x3b, 0x28, 0x30, 0x2c, 0x77, 0x72, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, + 0x64, 0x65, 0x29, 0x28, 0x69, 0x2c, 0x24, 0x2c, 0x79, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x29, 0x7d, + 0x7d, 0x7d, 0x46, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x3d, 0x46, 0x6f, 0x3b, 0x46, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x49, 0x66, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4c, 0x6f, 0x3d, 0x70, 0x28, 0x58, + 0x73, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x58, 0x73, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x52, + 0x66, 0x3d, 0x42, 0x73, 0x28, 0x29, 0x2c, 0x54, 0x66, 0x3d, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x5d, 0x2c, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x3a, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x3d, 0x3e, + 0x28, 0x30, 0x2c, 0x52, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x29, 0x7d, 0x3b, 0x58, 0x73, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x54, 0x66, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x47, 0x6f, 0x3d, 0x70, 0x28, 0x65, 0x6e, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x65, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x48, 0x6f, + 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4d, 0x66, 0x3d, 0x49, 0x28, 0x29, 0x2c, + 0x41, 0x66, 0x3d, 0x75, 0x65, 0x28, 0x29, 0x2c, 0x43, 0x66, 0x3d, 0x51, + 0x73, 0x28, 0x29, 0x2c, 0x44, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, + 0x28, 0x30, 0x2c, 0x48, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x24, + 0x7b, 0x74, 0x7d, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x2c, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, 0x7d, 0x29, + 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x48, 0x6f, 0x2e, 0x5f, 0x29, 0x60, 0x7b, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, + 0x60, 0x7d, 0x2c, 0x7a, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x3a, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x44, + 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x72, 0x2c, 0x69, 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x6e, + 0x7d, 0x3d, 0x72, 0x3b, 0x73, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, + 0x21, 0x30, 0x2c, 0x21, 0x28, 0x30, 0x2c, 0x4d, 0x66, 0x2e, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x28, 0x73, 0x2c, 0x65, 0x29, 0x26, 0x26, 0x28, + 0x6e, 0x3f, 0x28, 0x30, 0x2c, 0x43, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x28, 0x74, 0x2c, 0x6e, + 0x29, 0x3a, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x66, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x29, 0x28, 0x74, 0x29, 0x29, 0x29, 0x7d, 0x7d, 0x3b, 0x65, + 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x7a, 0x66, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4a, 0x6f, 0x3d, 0x70, 0x28, + 0x74, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x74, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x6c, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x45, 0x72, 0x3d, 0x49, 0x28, + 0x29, 0x2c, 0x56, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, + 0x6d, 0x69, 0x6e, 0x3a, 0x74, 0x2c, 0x6d, 0x61, 0x78, 0x3a, 0x65, 0x7d, + 0x7d, 0x29, 0x3d, 0x3e, 0x65, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3f, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, + 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, + 0x24, 0x7b, 0x74, 0x7d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x28, 0x73, 0x29, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x6c, + 0x65, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x6e, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x28, 0x73, 0x29, 0x60, 0x2c, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x7b, 0x6d, 0x69, 0x6e, 0x3a, 0x74, 0x2c, 0x6d, 0x61, + 0x78, 0x3a, 0x65, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x65, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x28, 0x30, 0x2c, 0x6c, 0x65, + 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, + 0x3a, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x6d, + 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x20, + 0x24, 0x7b, 0x74, 0x7d, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x7d, + 0x60, 0x7d, 0x2c, 0x78, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, + 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x3a, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x56, 0x66, 0x2c, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, 0x2c, 0x69, 0x74, 0x3a, + 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x6f, 0x2c, 0x69, 0x2c, 0x7b, 0x6d, 0x69, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x63, 0x2c, + 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, + 0x75, 0x7d, 0x3d, 0x73, 0x3b, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x6e, 0x65, 0x78, 0x74, 0x3f, 0x28, 0x6f, 0x3d, 0x63, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x31, 0x3a, 0x63, 0x2c, 0x69, + 0x3d, 0x75, 0x29, 0x3a, 0x6f, 0x3d, 0x31, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x64, 0x3d, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x6c, + 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x60, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6d, 0x69, 0x6e, 0x3a, 0x6f, + 0x2c, 0x6d, 0x61, 0x78, 0x3a, 0x69, 0x7d, 0x29, 0x2c, 0x69, 0x3d, 0x3d, + 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x6f, 0x3d, 0x3d, + 0x3d, 0x30, 0x29, 0x7b, 0x28, 0x30, 0x2c, 0x45, 0x72, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x29, 0x28, 0x61, 0x2c, 0x27, 0x22, 0x6d, 0x69, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x22, 0x6d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x20, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x64, 0x27, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, + 0x69, 0x66, 0x28, 0x69, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x26, 0x26, 0x6f, 0x3e, 0x69, 0x29, 0x7b, 0x28, 0x30, 0x2c, 0x45, + 0x72, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x61, 0x2c, 0x27, 0x22, 0x6d, + 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x20, + 0x3e, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x22, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x27, 0x29, 0x2c, + 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x45, 0x72, + 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x61, 0x2c, 0x72, 0x29, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x28, 0x30, 0x2c, 0x6c, + 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x64, 0x7d, 0x20, 0x3e, 0x3d, + 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x60, 0x3b, 0x69, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x6d, 0x3d, 0x28, 0x30, + 0x2c, 0x6c, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6d, 0x7d, 0x20, + 0x26, 0x26, 0x20, 0x24, 0x7b, 0x64, 0x7d, 0x20, 0x3c, 0x3d, 0x20, 0x24, + 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, + 0x28, 0x6d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x61, + 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x21, 0x30, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x6c, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x69, 0x3d, 0x3d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x6f, 0x3d, 0x3d, 0x3d, + 0x31, 0x3f, 0x68, 0x28, 0x6c, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, + 0x69, 0x66, 0x28, 0x6c, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x29, 0x3a, 0x6f, 0x3d, 0x3d, + 0x3d, 0x30, 0x3f, 0x28, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x6c, 0x2c, + 0x21, 0x30, 0x29, 0x2c, 0x69, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x26, 0x26, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x6c, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x60, 0x2c, 0x79, + 0x29, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x6c, 0x2c, + 0x21, 0x31, 0x29, 0x2c, 0x79, 0x28, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x28, 0x6c, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x2c, 0x24, + 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x2c, 0x30, 0x29, 0x3b, 0x68, 0x28, 0x6d, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x6d, 0x2c, 0x28, 0x29, 0x3d, + 0x3e, 0x66, 0x28, 0x24, 0x29, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6d, 0x2c, 0x24, 0x29, 0x7b, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x22, + 0x69, 0x22, 0x2c, 0x30, 0x2c, 0x64, 0x2c, 0x67, 0x3d, 0x3e, 0x7b, 0x74, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, + 0x72, 0x6f, 0x70, 0x3a, 0x67, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x45, 0x72, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x2e, 0x4e, 0x75, 0x6d, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x2c, 0x6d, 0x29, 0x2c, 0x24, 0x28, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x6d, 0x29, 0x7b, + 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x30, 0x2c, 0x6c, 0x65, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6d, 0x7d, 0x2b, 0x2b, 0x60, 0x29, + 0x2c, 0x69, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x6d, 0x7d, 0x20, 0x3e, 0x3d, 0x20, 0x24, 0x7b, + 0x6f, 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, 0x21, 0x30, 0x29, 0x2e, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x3a, 0x28, 0x65, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, + 0x7b, 0x6d, 0x7d, 0x20, 0x3e, 0x20, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x6c, 0x2c, 0x21, 0x31, 0x29, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x28, 0x29, 0x29, 0x2c, 0x6f, 0x3d, 0x3d, 0x3d, 0x31, 0x3f, 0x65, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, 0x21, 0x30, 0x29, + 0x3a, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6c, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6d, 0x7d, 0x20, 0x3e, 0x3d, 0x20, 0x24, + 0x7b, 0x6f, 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, 0x21, 0x30, 0x29, 0x29, + 0x29, 0x7d, 0x7d, 0x7d, 0x3b, 0x74, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x78, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x50, 0x72, 0x3d, 0x70, 0x28, 0x62, 0x65, 0x3d, 0x3e, 0x7b, 0x22, + 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x62, 0x65, + 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x3b, 0x62, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x70, 0x73, 0x3d, + 0x62, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x44, 0x65, 0x70, 0x73, 0x3d, + 0x62, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x6e, 0x3d, 0x45, + 0x28, 0x29, 0x2c, 0x4b, 0x66, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x4c, 0x74, + 0x3d, 0x75, 0x65, 0x28, 0x29, 0x3b, 0x62, 0x65, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, + 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x74, 0x2c, 0x64, 0x65, 0x70, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x65, 0x2c, 0x64, 0x65, 0x70, + 0x73, 0x3a, 0x72, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x73, 0x3d, 0x65, 0x3d, 0x3d, 0x3d, 0x31, 0x3f, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x72, 0x6e, 0x2e, 0x73, 0x74, 0x72, + 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, + 0x24, 0x7b, 0x74, 0x7d, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x60, 0x7d, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x74, 0x2c, 0x64, 0x65, + 0x70, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x65, 0x2c, 0x64, 0x65, + 0x70, 0x73, 0x3a, 0x72, 0x2c, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x73, 0x7d, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x72, 0x6e, 0x2e, 0x5f, 0x29, 0x60, + 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x20, 0x24, + 0x7b, 0x74, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x70, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x20, 0x24, + 0x7b, 0x65, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x70, + 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x72, 0x7d, 0x7d, 0x60, 0x7d, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x55, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x22, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x62, 0x65, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x5b, 0x65, 0x2c, 0x72, 0x5d, 0x3d, + 0x46, 0x66, 0x28, 0x74, 0x29, 0x3b, 0x57, 0x6f, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x2c, 0x59, 0x6f, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x7d, 0x7d, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x66, 0x28, + 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x74, 0x7d, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x7b, 0x7d, 0x2c, 0x72, 0x3d, 0x7b, + 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x73, 0x3d, 0x3d, + 0x3d, 0x22, 0x5f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x5f, 0x22, + 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x6e, 0x3d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x5b, 0x73, 0x5d, 0x29, 0x3f, + 0x65, 0x3a, 0x72, 0x3b, 0x6e, 0x5b, 0x73, 0x5d, 0x3d, 0x74, 0x5b, 0x73, + 0x5d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, 0x2c, 0x72, + 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, + 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, + 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x65, 0x29, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, 0x72, + 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x69, 0x3d, 0x65, 0x5b, 0x6f, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x63, 0x3d, 0x28, 0x30, 0x2c, 0x4c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x29, 0x28, + 0x72, 0x2c, 0x73, 0x2c, 0x6f, 0x2c, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x3a, 0x6f, 0x2c, 0x64, 0x65, 0x70, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x3a, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x64, + 0x65, 0x70, 0x73, 0x3a, 0x69, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, + 0x2c, 0x20, 0x22, 0x29, 0x7d, 0x29, 0x2c, 0x6e, 0x2e, 0x61, 0x6c, 0x6c, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3f, 0x72, 0x2e, 0x69, 0x66, 0x28, + 0x63, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x75, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x29, 0x28, 0x30, + 0x2c, 0x4c, 0x74, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x70, 0x29, 0x28, 0x74, 0x2c, 0x75, 0x29, 0x7d, 0x29, 0x3a, 0x28, + 0x72, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x72, 0x6e, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x63, 0x7d, 0x20, 0x26, 0x26, 0x20, 0x28, 0x24, + 0x7b, 0x28, 0x30, 0x2c, 0x4c, 0x74, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x29, + 0x28, 0x74, 0x2c, 0x69, 0x2c, 0x61, 0x29, 0x7d, 0x29, 0x60, 0x29, 0x2c, + 0x28, 0x30, 0x2c, 0x4c, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x29, + 0x28, 0x74, 0x2c, 0x61, 0x29, 0x2c, 0x72, 0x2e, 0x65, 0x6c, 0x73, 0x65, + 0x28, 0x29, 0x29, 0x7d, 0x7d, 0x62, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x44, 0x65, 0x70, 0x73, 0x3d, 0x57, 0x6f, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x3d, + 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x73, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, + 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x6f, 0x3d, 0x72, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, + 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x28, 0x30, 0x2c, 0x4b, 0x66, 0x2e, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x61, 0x2c, 0x65, 0x5b, 0x69, + 0x5d, 0x29, 0x7c, 0x7c, 0x28, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, + 0x2c, 0x4c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x29, 0x28, 0x72, 0x2c, 0x73, 0x2c, + 0x69, 0x2c, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x77, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x74, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x69, 0x7d, 0x2c, + 0x6f, 0x29, 0x3b, 0x74, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x63, 0x2c, 0x6f, 0x29, 0x7d, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, + 0x2e, 0x76, 0x61, 0x72, 0x28, 0x6f, 0x2c, 0x21, 0x30, 0x29, 0x29, 0x2c, + 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x6f, 0x29, 0x29, 0x7d, 0x62, 0x65, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x44, 0x65, 0x70, 0x73, 0x3d, 0x59, 0x6f, 0x3b, 0x62, 0x65, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x55, 0x66, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x51, 0x6f, 0x3d, 0x70, 0x28, 0x73, + 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x73, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, + 0x6f, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4c, 0x66, 0x3d, 0x49, 0x28, 0x29, + 0x2c, 0x48, 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x74, + 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x5a, 0x6f, 0x2e, 0x5f, 0x29, + 0x60, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x60, 0x7d, + 0x2c, 0x47, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x5d, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x48, 0x66, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x69, 0x74, + 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x4c, 0x66, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6e, 0x2c, + 0x72, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x61, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x65, 0x2e, 0x66, 0x6f, + 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x73, 0x2c, + 0x6f, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x6f, 0x7d, 0x29, 0x2c, 0x74, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x6f, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x3a, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x3a, 0x6f, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x2c, + 0x61, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x5a, + 0x6f, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x61, 0x29, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x21, + 0x30, 0x29, 0x2c, 0x6e, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x7c, 0x7c, 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, + 0x29, 0x7d, 0x29, 0x7d, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x61, + 0x29, 0x7d, 0x7d, 0x3b, 0x73, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3d, 0x47, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x61, 0x6e, 0x3d, 0x70, 0x28, 0x6e, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x6e, 0x2c, + 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x53, 0x72, 0x3d, 0x75, 0x65, 0x28, 0x29, + 0x2c, 0x68, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4a, 0x66, 0x3d, 0x6f, + 0x65, 0x28, 0x29, 0x2c, 0x6a, 0x72, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x57, + 0x66, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x22, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, + 0x2c, 0x68, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x59, 0x66, 0x3d, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x3a, 0x21, 0x30, 0x2c, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, + 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x57, 0x66, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, + 0x2c, 0x65, 0x72, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x61, + 0x2c, 0x69, 0x74, 0x3a, 0x6f, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x61, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x20, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x3b, 0x6c, + 0x65, 0x74, 0x7b, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3a, 0x69, 0x2c, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x63, 0x7d, 0x3d, 0x6f, + 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3d, + 0x21, 0x30, 0x2c, 0x63, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x21, 0x3d, 0x3d, + 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x6a, 0x72, + 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6f, 0x2c, 0x72, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x75, 0x3d, 0x28, 0x30, 0x2c, 0x53, 0x72, 0x2e, 0x61, 0x6c, 0x6c, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x29, 0x28, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x2c, 0x64, 0x3d, 0x28, 0x30, 0x2c, + 0x53, 0x72, 0x2e, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x28, + 0x73, 0x2e, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x3b, 0x6c, 0x28, 0x29, + 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x61, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x24, 0x7b, 0x4a, 0x66, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x60, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x29, 0x7b, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, + 0x22, 0x2c, 0x6e, 0x2c, 0x24, 0x3d, 0x3e, 0x7b, 0x21, 0x75, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x21, 0x64, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x66, 0x28, 0x24, 0x29, 0x3a, 0x65, 0x2e, + 0x69, 0x66, 0x28, 0x79, 0x28, 0x24, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x66, 0x28, 0x24, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x24, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x67, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3e, 0x38, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x52, + 0x3d, 0x28, 0x30, 0x2c, 0x6a, 0x72, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x66, 0x4f, 0x72, 0x56, 0x61, 0x6c, 0x29, 0x28, 0x6f, + 0x2c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x2c, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x29, 0x3b, 0x67, 0x3d, 0x28, 0x30, 0x2c, 0x53, 0x72, 0x2e, + 0x69, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x29, 0x28, 0x65, 0x2c, 0x52, 0x2c, 0x24, 0x29, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x67, 0x3d, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x29, 0x28, + 0x2e, 0x2e, 0x2e, 0x75, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x52, 0x3d, 0x3e, + 0x28, 0x30, 0x2c, 0x68, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x24, + 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x52, 0x7d, 0x60, 0x29, + 0x29, 0x3a, 0x67, 0x3d, 0x68, 0x65, 0x2e, 0x6e, 0x69, 0x6c, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x26, 0x26, 0x28, 0x67, 0x3d, 0x28, 0x30, 0x2c, 0x68, 0x65, + 0x2e, 0x6f, 0x72, 0x29, 0x28, 0x67, 0x2c, 0x2e, 0x2e, 0x2e, 0x64, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x52, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x68, 0x65, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x53, 0x72, 0x2e, + 0x75, 0x73, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x28, + 0x74, 0x2c, 0x52, 0x29, 0x7d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x24, + 0x7b, 0x24, 0x7d, 0x29, 0x60, 0x29, 0x29, 0x29, 0x2c, 0x28, 0x30, 0x2c, + 0x68, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x67, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x24, 0x29, + 0x7b, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x30, 0x2c, 0x68, + 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x24, 0x7b, 0x6e, 0x7d, 0x5b, 0x24, 0x7b, 0x24, 0x7d, 0x5d, 0x60, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, + 0x24, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x63, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x3d, 0x3d, 0x3d, 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x7c, 0x7c, 0x63, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x26, 0x26, 0x72, 0x3d, 0x3d, 0x3d, 0x21, 0x31, + 0x29, 0x7b, 0x68, 0x28, 0x24, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, + 0x7b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x28, 0x7b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x24, 0x7d, 0x29, + 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x69, + 0x7c, 0x7c, 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x21, 0x28, 0x30, 0x2c, 0x6a, 0x72, + 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6f, 0x2c, 0x72, 0x29, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x3d, 0x65, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, + 0x63, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3d, 0x3d, 0x3d, 0x22, 0x66, 0x61, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x28, 0x6d, 0x28, 0x24, 0x2c, + 0x67, 0x2c, 0x21, 0x31, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, + 0x30, 0x2c, 0x68, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x67, 0x29, + 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x28, 0x29, 0x2c, 0x68, 0x28, 0x24, 0x29, 0x7d, 0x29, 0x29, 0x3a, + 0x28, 0x6d, 0x28, 0x24, 0x2c, 0x67, 0x29, 0x2c, 0x69, 0x7c, 0x7c, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x2e, 0x6e, 0x6f, + 0x74, 0x29, 0x28, 0x67, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x29, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x24, 0x2c, + 0x67, 0x2c, 0x52, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x71, 0x3d, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, + 0x72, 0x6f, 0x70, 0x3a, 0x24, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, + 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x6a, 0x72, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x7d, 0x3b, 0x52, 0x3d, 0x3d, 0x3d, + 0x21, 0x31, 0x26, 0x26, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x71, 0x2c, 0x7b, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x21, + 0x30, 0x2c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3a, 0x21, 0x31, 0x2c, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3a, 0x21, 0x31, 0x7d, 0x29, 0x2c, 0x74, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x71, 0x2c, 0x67, + 0x29, 0x7d, 0x7d, 0x7d, 0x3b, 0x6e, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x59, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x69, 0x3d, 0x70, 0x28, 0x63, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, + 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x63, 0x6e, + 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, 0x66, 0x3d, 0x47, 0x65, 0x28, + 0x29, 0x2c, 0x42, 0x6f, 0x3d, 0x75, 0x65, 0x28, 0x29, 0x2c, 0x6f, 0x6e, + 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x58, 0x6f, 0x3d, 0x61, 0x6e, 0x28, 0x29, + 0x2c, 0x51, 0x66, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, + 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x72, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, + 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x3b, 0x61, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3d, 0x3d, 0x3d, 0x22, + 0x61, 0x6c, 0x6c, 0x22, 0x26, 0x26, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x26, 0x26, 0x58, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x5a, + 0x66, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, + 0x28, 0x61, 0x2c, 0x58, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x28, 0x30, 0x2c, + 0x42, 0x6f, 0x2e, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x28, + 0x72, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x29, 0x61, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x6c, 0x29, 0x3b, 0x61, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x26, 0x26, 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x26, 0x26, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, + 0x3d, 0x21, 0x30, 0x26, 0x26, 0x28, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x73, 0x3d, 0x6f, 0x6e, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x73, 0x28, 0x65, 0x2c, 0x28, 0x30, 0x2c, 0x6f, 0x6e, 0x2e, 0x74, 0x6f, + 0x48, 0x61, 0x73, 0x68, 0x29, 0x28, 0x6f, 0x29, 0x2c, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, + 0x3d, 0x6f, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x3d, + 0x3e, 0x21, 0x28, 0x30, 0x2c, 0x6f, 0x6e, 0x2e, 0x61, 0x6c, 0x77, 0x61, + 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x29, 0x28, 0x61, 0x2c, 0x72, 0x5b, 0x6c, 0x5d, 0x29, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, + 0x3d, 0x3d, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x63, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, + 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x29, + 0x75, 0x28, 0x6c, 0x29, 0x3f, 0x64, 0x28, 0x6c, 0x29, 0x3a, 0x28, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x42, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x49, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x29, 0x28, 0x65, 0x2c, 0x6e, 0x2c, 0x6c, 0x2c, 0x61, 0x2e, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x29, 0x29, 0x2c, 0x64, 0x28, 0x6c, 0x29, 0x2c, + 0x61, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7c, + 0x7c, 0x65, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, 0x29, 0x2e, 0x76, 0x61, + 0x72, 0x28, 0x63, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x65, 0x2e, 0x65, 0x6e, + 0x64, 0x49, 0x66, 0x28, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x69, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x6c, 0x29, + 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6c, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x75, 0x73, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x26, 0x26, 0x21, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x26, 0x26, 0x72, 0x5b, 0x6c, 0x5d, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x21, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6c, 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x6c, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, + 0x72, 0x6f, 0x70, 0x3a, 0x6c, 0x7d, 0x2c, 0x63, 0x29, 0x7d, 0x7d, 0x7d, + 0x3b, 0x63, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, + 0x51, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x69, 0x3d, + 0x70, 0x28, 0x75, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x75, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x69, 0x3d, 0x75, 0x65, 0x28, 0x29, 0x2c, 0x71, 0x72, + 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x72, 0x69, 0x3d, 0x49, 0x28, 0x29, 0x2c, + 0x73, 0x69, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x42, 0x66, 0x3d, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x6e, 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x6f, + 0x70, 0x74, 0x73, 0x3a, 0x6f, 0x7d, 0x3d, 0x61, 0x2c, 0x69, 0x3d, 0x28, + 0x30, 0x2c, 0x74, 0x69, 0x2e, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x29, 0x28, 0x72, 0x29, 0x2c, 0x63, 0x3d, 0x69, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x28, 0x6d, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x72, 0x69, + 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x61, 0x2c, 0x72, 0x5b, + 0x6d, 0x5d, 0x29, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x30, 0x7c, 0x7c, 0x63, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x69, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x28, 0x21, 0x61, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x7c, 0x7c, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, 0x6f, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x26, 0x26, + 0x21, 0x6f, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x2c, 0x64, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x26, + 0x26, 0x21, 0x28, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x71, 0x72, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x26, 0x26, 0x28, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x3d, 0x28, 0x30, 0x2c, 0x73, 0x69, 0x2e, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x28, 0x65, 0x2c, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3a, 0x6c, 0x7d, 0x3d, 0x61, 0x3b, + 0x79, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x79, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x29, 0x75, 0x26, 0x26, 0x68, + 0x28, 0x6d, 0x29, 0x2c, 0x61, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3f, 0x66, 0x28, 0x6d, 0x29, 0x3a, 0x28, 0x65, 0x2e, + 0x76, 0x61, 0x72, 0x28, 0x64, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x66, 0x28, + 0x6d, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x64, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6d, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x24, 0x20, + 0x69, 0x6e, 0x20, 0x75, 0x29, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x28, 0x6d, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, + 0x24, 0x29, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x72, 0x69, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x29, 0x28, 0x61, 0x2c, 0x60, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x20, 0x24, 0x7b, 0x24, 0x7d, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x24, 0x7b, 0x6d, 0x7d, 0x20, 0x28, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x29, 0x60, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, + 0x6d, 0x29, 0x7b, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, + 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x73, 0x2c, 0x24, 0x3d, 0x3e, 0x7b, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x71, 0x72, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x74, 0x69, 0x2e, 0x75, 0x73, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x28, 0x74, 0x2c, 0x6d, + 0x29, 0x7d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x24, 0x7b, 0x24, 0x7d, + 0x29, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x67, 0x3d, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, + 0x28, 0x6d, 0x29, 0x3b, 0x67, 0x7c, 0x7c, 0x74, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x6d, + 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x24, 0x2c, + 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, + 0x3a, 0x73, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x72, + 0x7d, 0x2c, 0x64, 0x29, 0x2c, 0x61, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x26, + 0x26, 0x6c, 0x21, 0x3d, 0x3d, 0x21, 0x30, 0x3f, 0x65, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x28, 0x30, 0x2c, 0x71, 0x72, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x6c, 0x7d, 0x5b, 0x24, 0x7b, 0x24, 0x7d, 0x5d, + 0x60, 0x2c, 0x21, 0x30, 0x29, 0x3a, 0x21, 0x67, 0x26, 0x26, 0x21, 0x61, + 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x26, 0x26, + 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x71, 0x72, 0x2e, 0x6e, + 0x6f, 0x74, 0x29, 0x28, 0x64, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, + 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x7d, 0x29, 0x7d, + 0x29, 0x7d, 0x7d, 0x7d, 0x3b, 0x75, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x42, 0x66, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x61, 0x69, 0x3d, 0x70, 0x28, 0x64, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, + 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x64, 0x6e, + 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x58, 0x66, 0x3d, 0x49, 0x28, 0x29, + 0x2c, 0x65, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x5d, 0x2c, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x69, 0x74, 0x3a, + 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x58, + 0x66, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x73, 0x2c, 0x72, + 0x29, 0x29, 0x7b, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x6c, 0x65, 0x74, 0x20, 0x6e, + 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, + 0x2c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x3a, 0x21, 0x31, 0x2c, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x6e, 0x29, 0x2c, 0x74, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x28, 0x6e, + 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, + 0x28, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x29, 0x29, 0x7d, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x22, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x62, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x22, 0x7d, 0x7d, 0x3b, 0x64, 0x6e, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x65, 0x6d, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x69, 0x3d, 0x70, 0x28, 0x6c, 0x6e, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x6c, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6d, 0x3d, + 0x75, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x22, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x63, + 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, + 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x61, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x22, 0x7d, 0x7d, 0x3b, 0x6c, 0x6e, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x72, 0x6d, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x69, 0x3d, 0x70, 0x28, 0x66, 0x6e, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x66, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4e, 0x72, + 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x73, 0x6d, 0x3d, 0x49, 0x28, 0x29, 0x2c, + 0x6e, 0x6d, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, + 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x6e, + 0x65, 0x4f, 0x66, 0x22, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, + 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x74, 0x7d, 0x29, + 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x4e, 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x7b, + 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x61, 0x6d, 0x3d, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x6f, 0x6e, 0x65, + 0x4f, 0x66, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x21, + 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x6e, 0x6d, 0x2c, 0x63, + 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x72, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, + 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x72, 0x29, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x26, 0x26, 0x73, 0x2e, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x3d, + 0x72, 0x2c, 0x6f, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x21, 0x31, 0x29, 0x2c, 0x69, 0x3d, + 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x70, 0x61, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x63, 0x3d, + 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x3a, 0x69, 0x7d, 0x29, 0x2c, 0x65, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x28, 0x75, 0x29, 0x2c, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x28, 0x6f, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x28, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x21, 0x30, 0x29, 0x29, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, + 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x64, + 0x2c, 0x6c, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x79, 0x3b, + 0x28, 0x30, 0x2c, 0x73, 0x6d, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x28, 0x6e, 0x2c, 0x64, 0x29, 0x3f, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x28, + 0x63, 0x2c, 0x21, 0x30, 0x29, 0x3a, 0x79, 0x3d, 0x74, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x22, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, + 0x6c, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x63, 0x29, 0x2c, 0x6c, + 0x3e, 0x30, 0x26, 0x26, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, + 0x4e, 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x63, 0x7d, 0x20, 0x26, + 0x26, 0x20, 0x24, 0x7b, 0x6f, 0x7d, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x6f, 0x2c, 0x21, 0x31, 0x29, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x2c, 0x28, 0x30, 0x2c, 0x4e, 0x72, + 0x2e, 0x5f, 0x29, 0x60, 0x5b, 0x24, 0x7b, 0x69, 0x7d, 0x2c, 0x20, 0x24, + 0x7b, 0x6c, 0x7d, 0x5d, 0x60, 0x29, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, + 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x63, 0x2c, 0x28, 0x29, 0x3d, + 0x3e, 0x7b, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6f, + 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x69, 0x2c, 0x6c, 0x29, 0x2c, 0x79, 0x26, 0x26, 0x74, 0x2e, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x79, 0x2c, 0x4e, 0x72, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x29, 0x7d, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x7d, 0x3b, 0x66, 0x6e, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x61, 0x6d, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x69, 0x3d, 0x70, 0x28, 0x6d, 0x6e, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x6d, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x6d, + 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x69, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x22, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, + 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x69, + 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x28, 0x72, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x29, 0x3b, 0x72, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x61, 0x2c, 0x6f, + 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x6f, 0x6d, + 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x73, 0x2c, 0x61, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x69, 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, + 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x6f, 0x7d, 0x2c, 0x6e, 0x29, 0x3b, + 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x2e, 0x6d, 0x65, + 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x69, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x3b, 0x6d, 0x6e, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x69, 0x6d, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x69, 0x3d, 0x70, 0x28, 0x70, 0x6e, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x70, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x72, 0x3d, + 0x45, 0x28, 0x29, 0x2c, 0x64, 0x69, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x63, + 0x6d, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, + 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x74, 0x7d, 0x29, 0x3d, + 0x3e, 0x28, 0x30, 0x2c, 0x4f, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x22, + 0x24, 0x7b, 0x74, 0x2e, 0x69, 0x66, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x7d, 0x22, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x60, 0x2c, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x4f, + 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x66, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x20, 0x24, 0x7b, + 0x74, 0x2e, 0x69, 0x66, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x7d, 0x7d, + 0x60, 0x7d, 0x2c, 0x75, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x5d, 0x2c, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x63, 0x6d, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, + 0x2c, 0x69, 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x3b, 0x72, 0x2e, 0x74, + 0x68, 0x65, 0x6e, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x26, 0x26, 0x72, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x3d, 0x3d, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x30, 0x2c, 0x64, 0x69, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x73, 0x2c, 0x27, 0x22, 0x69, 0x66, + 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x22, 0x74, + 0x68, 0x65, 0x6e, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x65, 0x6c, + 0x73, 0x65, 0x22, 0x20, 0x69, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x64, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x75, + 0x69, 0x28, 0x73, 0x2c, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x2c, + 0x61, 0x3d, 0x75, 0x69, 0x28, 0x73, 0x2c, 0x22, 0x65, 0x6c, 0x73, 0x65, + 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x26, 0x26, 0x21, 0x61, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x6f, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x22, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x69, 0x3d, 0x65, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x63, 0x28, 0x29, 0x2c, 0x74, 0x2e, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x26, 0x26, 0x61, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x74, 0x28, 0x22, 0x69, 0x66, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x28, 0x7b, 0x69, 0x66, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x3a, + 0x64, 0x7d, 0x29, 0x2c, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x69, 0x2c, 0x75, + 0x28, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x2c, 0x64, 0x29, 0x2c, 0x75, + 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x64, 0x29, 0x29, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x3f, 0x65, 0x2e, 0x69, 0x66, 0x28, + 0x69, 0x2c, 0x75, 0x28, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x29, + 0x3a, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4f, 0x72, 0x2e, + 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x69, 0x29, 0x2c, 0x75, 0x28, 0x22, 0x65, + 0x6c, 0x73, 0x65, 0x22, 0x29, 0x29, 0x3b, 0x74, 0x2e, 0x70, 0x61, 0x73, + 0x73, 0x28, 0x6f, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x21, 0x30, 0x29, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x64, 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, + 0x21, 0x31, 0x2c, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x69, 0x29, 0x3b, 0x74, 0x2e, 0x6d, 0x65, + 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x64, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x28, 0x64, 0x2c, 0x6c, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x79, + 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x64, 0x7d, + 0x2c, 0x69, 0x29, 0x3b, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x6f, 0x2c, 0x69, 0x29, 0x2c, 0x74, 0x2e, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x28, 0x79, 0x2c, 0x6f, 0x29, 0x2c, 0x6c, 0x3f, 0x65, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6c, 0x2c, 0x28, 0x30, + 0x2c, 0x4f, 0x72, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x64, 0x7d, 0x60, + 0x29, 0x3a, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x28, 0x7b, 0x69, 0x66, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x3a, + 0x64, 0x7d, 0x29, 0x7d, 0x7d, 0x7d, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x69, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5b, 0x65, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x26, 0x26, 0x21, 0x28, 0x30, 0x2c, 0x64, 0x69, 0x2e, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x29, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x7d, 0x70, 0x6e, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x75, 0x6d, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x69, 0x3d, 0x70, 0x28, 0x68, 0x6e, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x68, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x6d, + 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x6c, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5b, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, + 0x2c, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x5d, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, + 0x69, 0x74, 0x3a, 0x72, 0x7d, 0x29, 0x7b, 0x65, 0x2e, 0x69, 0x66, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, 0x26, 0x28, 0x30, + 0x2c, 0x64, 0x6d, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x72, 0x2c, 0x60, + 0x22, 0x24, 0x7b, 0x74, 0x7d, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x22, 0x69, 0x66, 0x22, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x68, + 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x6c, 0x6d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x6e, 0x3d, 0x70, 0x28, + 0x79, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x79, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x66, 0x6d, 0x3d, 0x51, 0x73, 0x28, 0x29, 0x2c, 0x6d, 0x6d, 0x3d, 0x4c, + 0x6f, 0x28, 0x29, 0x2c, 0x70, 0x6d, 0x3d, 0x42, 0x73, 0x28, 0x29, 0x2c, + 0x68, 0x6d, 0x3d, 0x47, 0x6f, 0x28, 0x29, 0x2c, 0x79, 0x6d, 0x3d, 0x4a, + 0x6f, 0x28, 0x29, 0x2c, 0x24, 0x6d, 0x3d, 0x50, 0x72, 0x28, 0x29, 0x2c, + 0x5f, 0x6d, 0x3d, 0x51, 0x6f, 0x28, 0x29, 0x2c, 0x67, 0x6d, 0x3d, 0x61, + 0x6e, 0x28, 0x29, 0x2c, 0x76, 0x6d, 0x3d, 0x65, 0x69, 0x28, 0x29, 0x2c, + 0x62, 0x6d, 0x3d, 0x6e, 0x69, 0x28, 0x29, 0x2c, 0x77, 0x6d, 0x3d, 0x61, + 0x69, 0x28, 0x29, 0x2c, 0x45, 0x6d, 0x3d, 0x6f, 0x69, 0x28, 0x29, 0x2c, + 0x50, 0x6d, 0x3d, 0x69, 0x69, 0x28, 0x29, 0x2c, 0x53, 0x6d, 0x3d, 0x63, + 0x69, 0x28, 0x29, 0x2c, 0x6a, 0x6d, 0x3d, 0x6c, 0x69, 0x28, 0x29, 0x2c, + 0x71, 0x6d, 0x3d, 0x66, 0x69, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x6d, 0x28, 0x74, 0x3d, 0x21, 0x31, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x5b, 0x77, 0x6d, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x45, 0x6d, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x50, 0x6d, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x53, 0x6d, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x6a, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2c, 0x71, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2c, 0x5f, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x67, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2c, 0x24, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, + 0x76, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x62, + 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3f, 0x65, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x6d, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x68, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x29, 0x3a, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x66, 0x6d, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x70, 0x6d, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x79, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x29, 0x2c, 0x65, 0x7d, 0x79, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x4e, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x67, 0x6e, 0x3d, 0x70, 0x28, 0x48, 0x74, 0x3d, 0x3e, 0x7b, 0x22, + 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x48, 0x74, + 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, + 0x29, 0x3b, 0x48, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, 0x6e, 0x3d, 0x45, 0x28, 0x29, + 0x2c, 0x4f, 0x6d, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x6d, 0x69, 0x3d, + 0x49, 0x74, 0x28, 0x29, 0x2c, 0x6b, 0x6d, 0x3d, 0x24, 0x72, 0x28, 0x29, + 0x2c, 0x49, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x22, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x3d, 0x3e, 0x70, 0x69, + 0x28, 0x74, 0x2c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, + 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x69, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, + 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x69, 0x74, 0x3a, 0x73, 0x7d, 0x3d, 0x74, + 0x3b, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x5b, 0x65, 0x5d, 0x3d, + 0x21, 0x30, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x28, 0x30, 0x2c, + 0x5f, 0x6e, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x4f, 0x6d, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x7d, 0x24, 0x7b, + 0x28, 0x30, 0x2c, 0x5f, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x65, 0x29, 0x7d, 0x60, 0x2c, + 0x61, 0x3d, 0x73, 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x22, 0x23, 0x22, 0x3f, + 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x3a, 0x52, 0x6d, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x5f, 0x6e, 0x2e, 0x5f, 0x29, 0x60, 0x21, + 0x24, 0x7b, 0x6e, 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6e, 0x2c, 0x61, 0x29, 0x29, + 0x7d, 0x48, 0x74, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3d, 0x70, 0x69, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6d, 0x28, 0x74, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, + 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x7d, 0x3d, 0x74, 0x2e, 0x69, + 0x74, 0x2c, 0x7b, 0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x6e, 0x2c, 0x62, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x3a, 0x61, 0x2c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x52, 0x65, 0x66, 0x73, 0x3a, 0x6f, 0x2c, 0x6d, 0x65, 0x74, 0x61, 0x3a, + 0x69, 0x7d, 0x3d, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x7b, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x63, 0x7d, 0x3d, 0x73, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x75, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x6d, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, + 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x64, 0x3a, 0x63, 0x2c, 0x72, 0x6f, + 0x6f, 0x74, 0x3a, 0x6e, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x3a, + 0x61, 0x2c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x73, 0x3a, + 0x6f, 0x2c, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x69, 0x7d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x2c, 0x75, 0x29, 0x2c, 0x28, 0x30, 0x2c, + 0x6b, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x29, 0x28, 0x74, 0x2c, 0x75, 0x29, 0x7d, 0x48, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x49, 0x6d, 0x7d, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x6e, 0x3d, 0x70, 0x28, 0x47, 0x74, + 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x47, 0x74, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x47, 0x74, 0x2e, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x69, 0x3d, 0x45, 0x28, + 0x29, 0x2c, 0x54, 0x6d, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x79, 0x69, + 0x3d, 0x24, 0x72, 0x28, 0x29, 0x2c, 0x4d, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x24, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x3d, 0x3e, + 0x24, 0x69, 0x28, 0x74, 0x2c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x29, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x24, 0x69, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x73, 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, + 0x3b, 0x69, 0x66, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x21, 0x3d, 0x3d, 0x22, + 0x23, 0x22, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x22, 0x24, 0x7b, 0x73, + 0x7d, 0x22, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x60, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x61, + 0x3d, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x29, 0x6f, 0x28, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x21, 0x31, 0x29, 0x3b, + 0x6f, 0x28, 0x63, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, + 0x63, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x73, 0x5b, 0x61, 0x5d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x3d, + 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x5f, 0x76, 0x22, 0x2c, 0x28, + 0x30, 0x2c, 0x68, 0x69, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x54, 0x6d, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x7d, + 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x68, 0x69, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x61, 0x29, 0x7d, + 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x75, 0x2c, 0x69, 0x28, + 0x75, 0x2c, 0x63, 0x29, 0x2c, 0x69, 0x28, 0x6e, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x63, 0x29, + 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x28, 0x6e, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, + 0x63, 0x29, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x28, 0x63, 0x2c, 0x75, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x3f, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x28, + 0x30, 0x2c, 0x79, 0x69, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x66, + 0x29, 0x28, 0x74, 0x2c, 0x63, 0x29, 0x2c, 0x72, 0x2e, 0x6c, 0x65, 0x74, + 0x28, 0x75, 0x2c, 0x21, 0x30, 0x29, 0x7d, 0x29, 0x3a, 0x28, 0x29, 0x3d, + 0x3e, 0x28, 0x30, 0x2c, 0x79, 0x69, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x52, + 0x65, 0x66, 0x29, 0x28, 0x74, 0x2c, 0x63, 0x29, 0x7d, 0x7d, 0x47, 0x74, + 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3d, + 0x24, 0x69, 0x3b, 0x47, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x4d, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, + 0x69, 0x3d, 0x70, 0x28, 0x62, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x62, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x41, 0x6d, 0x3d, 0x67, 0x6e, 0x28, 0x29, 0x2c, + 0x43, 0x6d, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x44, 0x6d, 0x3d, 0x7b, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x24, 0x72, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x63, + 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3f, 0x28, 0x30, 0x2c, 0x41, 0x6d, 0x2e, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x29, + 0x28, 0x74, 0x2c, 0x22, 0x22, 0x29, 0x3a, 0x28, 0x30, 0x2c, 0x43, 0x6d, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, 0x74, 0x2e, 0x69, 0x74, 0x2c, 0x22, + 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x29, + 0x7d, 0x7d, 0x3b, 0x62, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x44, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, + 0x69, 0x3d, 0x70, 0x28, 0x77, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x77, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x7a, 0x6d, 0x3d, 0x76, 0x6e, 0x28, 0x29, 0x2c, + 0x56, 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, + 0x22, 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, + 0x65, 0x66, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x7a, + 0x6d, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, + 0x29, 0x28, 0x74, 0x2c, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x29, 0x7d, 0x3b, 0x77, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x56, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, + 0x69, 0x3d, 0x70, 0x28, 0x45, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x45, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x6d, 0x3d, 0x67, 0x6e, 0x28, 0x29, 0x2c, + 0x4b, 0x6d, 0x3d, 0x76, 0x6e, 0x28, 0x29, 0x2c, 0x55, 0x6d, 0x3d, 0x5f, + 0x69, 0x28, 0x29, 0x2c, 0x46, 0x6d, 0x3d, 0x67, 0x69, 0x28, 0x29, 0x2c, + 0x4c, 0x6d, 0x3d, 0x5b, 0x78, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2c, 0x4b, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x55, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2c, 0x46, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5d, + 0x3b, 0x45, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, + 0x4c, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x77, 0x69, 0x3d, + 0x70, 0x28, 0x50, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x50, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x62, 0x69, 0x3d, 0x50, 0x72, 0x28, 0x29, 0x2c, 0x48, 0x6d, + 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x62, 0x69, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, + 0x74, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x62, 0x69, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x44, 0x65, 0x70, 0x73, 0x29, 0x28, 0x74, 0x29, 0x7d, 0x3b, 0x50, + 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x48, 0x6d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x69, 0x3d, 0x70, 0x28, + 0x53, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x53, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x47, 0x6d, 0x3d, 0x50, 0x72, 0x28, 0x29, 0x2c, 0x4a, 0x6d, 0x3d, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x3d, 0x3e, 0x28, 0x30, 0x2c, + 0x47, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x70, 0x73, 0x29, 0x28, 0x74, + 0x29, 0x7d, 0x3b, 0x53, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x4a, 0x6d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x50, + 0x69, 0x3d, 0x70, 0x28, 0x6a, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6a, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x57, 0x6d, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x59, + 0x6d, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5b, + 0x22, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, + 0x22, 0x2c, 0x22, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x22, 0x5d, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x65, 0x2c, 0x69, 0x74, 0x3a, + 0x72, 0x7d, 0x29, 0x7b, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x26, + 0x26, 0x28, 0x30, 0x2c, 0x57, 0x6d, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x28, + 0x72, 0x2c, 0x60, 0x22, 0x24, 0x7b, 0x74, 0x7d, 0x22, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x22, 0x20, 0x69, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x64, 0x60, 0x29, 0x7d, 0x7d, 0x3b, 0x6a, 0x6e, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x59, 0x6d, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x53, 0x69, 0x3d, 0x70, 0x28, 0x71, 0x6e, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x71, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, 0x6d, 0x3d, + 0x77, 0x69, 0x28, 0x29, 0x2c, 0x51, 0x6d, 0x3d, 0x45, 0x69, 0x28, 0x29, + 0x2c, 0x42, 0x6d, 0x3d, 0x50, 0x69, 0x28, 0x29, 0x2c, 0x58, 0x6d, 0x3d, + 0x5b, 0x5a, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, + 0x51, 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x42, + 0x6d, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x71, + 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x58, 0x6d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, 0x69, 0x3d, 0x70, 0x28, + 0x4e, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4e, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x41, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x6a, 0x69, 0x3d, 0x49, 0x28, + 0x29, 0x2c, 0x65, 0x70, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, 0x74, 0x70, + 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x22, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, + 0x2c, 0x41, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x75, 0x6e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x2e, 0x75, 0x6e, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x72, 0x70, 0x3d, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x75, 0x6e, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3a, 0x74, 0x70, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, + 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x73, 0x2c, 0x65, 0x72, 0x72, 0x73, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x3a, 0x6e, 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, 0x3d, 0x74, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x61, 0x6a, 0x76, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x61, 0x6c, 0x6c, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x6f, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x3a, 0x69, 0x7d, 0x3d, 0x61, 0x3b, 0x69, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x41, 0x65, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x3f, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x41, + 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x69, 0x7d, 0x20, 0x21, 0x3d, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, + 0x22, 0x2c, 0x73, 0x2c, 0x6c, 0x3d, 0x3e, 0x65, 0x2e, 0x69, 0x66, 0x28, + 0x75, 0x28, 0x69, 0x2c, 0x6c, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x63, + 0x28, 0x6c, 0x29, 0x29, 0x29, 0x29, 0x3a, 0x69, 0x21, 0x3d, 0x3d, 0x21, + 0x30, 0x26, 0x26, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, + 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x73, 0x2c, 0x6c, 0x3d, 0x3e, 0x69, 0x3d, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, 0x63, 0x28, 0x6c, + 0x29, 0x3a, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x64, 0x28, 0x69, 0x2c, 0x6c, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x28, 0x6c, 0x29, 0x29, 0x29, + 0x2c, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3d, 0x21, 0x30, 0x2c, + 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x28, 0x30, 0x2c, 0x41, 0x65, 0x2e, 0x5f, + 0x29, 0x60, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, + 0x7b, 0x65, 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x60, 0x29, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x6c, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x7b, 0x74, + 0x2e, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, + 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x6c, 0x7d, 0x29, 0x2c, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2c, 0x6f, 0x7c, + 0x7c, 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x28, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x28, 0x30, + 0x2c, 0x6a, 0x69, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x29, 0x28, 0x61, + 0x2c, 0x72, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x79, 0x3d, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, + 0x22, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2c, + 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x6c, 0x2c, 0x64, + 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, + 0x6a, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x7d, + 0x2c, 0x79, 0x29, 0x2c, 0x6f, 0x7c, 0x7c, 0x65, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x41, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x79, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x28, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6c, 0x2c, 0x79, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x41, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x21, 0x24, 0x7b, 0x6c, 0x7d, 0x20, 0x7c, 0x7c, 0x20, 0x21, 0x24, + 0x7b, 0x6c, 0x7d, 0x5b, 0x24, 0x7b, 0x79, 0x7d, 0x5d, 0x60, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6c, 0x2c, + 0x79, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x68, 0x3d, 0x5b, 0x5d, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x20, 0x69, 0x6e, + 0x20, 0x6c, 0x29, 0x6c, 0x5b, 0x66, 0x5d, 0x3d, 0x3d, 0x3d, 0x21, 0x30, + 0x26, 0x26, 0x68, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x28, 0x30, 0x2c, + 0x41, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x79, 0x7d, 0x20, 0x21, + 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x66, 0x7d, 0x60, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x41, 0x65, 0x2e, 0x61, 0x6e, + 0x64, 0x29, 0x28, 0x2e, 0x2e, 0x2e, 0x68, 0x29, 0x7d, 0x7d, 0x7d, 0x3b, + 0x4e, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x72, + 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x69, 0x3d, 0x70, + 0x28, 0x4f, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x4f, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x51, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x4e, 0x69, 0x3d, 0x49, + 0x28, 0x29, 0x2c, 0x73, 0x70, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, + 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x28, + 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x24, 0x7b, + 0x74, 0x7d, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x2c, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x3a, 0x7b, 0x6c, 0x65, 0x6e, 0x3a, 0x74, 0x7d, 0x7d, 0x29, 0x3d, + 0x3e, 0x28, 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, + 0x7d, 0x2c, 0x6e, 0x70, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x22, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x73, 0x70, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, + 0x2c, 0x69, 0x74, 0x3a, 0x6e, 0x7d, 0x3d, 0x74, 0x2c, 0x61, 0x3d, 0x6e, + 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7c, 0x7c, 0x30, 0x3b, 0x69, 0x66, + 0x28, 0x61, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x3d, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x22, 0x2c, 0x28, + 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x73, 0x7d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x74, 0x2e, 0x73, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x7b, 0x6c, 0x65, 0x6e, + 0x3a, 0x61, 0x7d, 0x29, 0x2c, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, + 0x28, 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, + 0x7d, 0x20, 0x3e, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x60, 0x29, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x72, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x26, 0x26, 0x21, 0x28, 0x30, 0x2c, 0x4e, 0x69, 0x2e, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x29, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x63, 0x3d, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x28, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x51, 0x65, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x3c, 0x3d, 0x20, + 0x24, 0x7b, 0x61, 0x7d, 0x60, 0x29, 0x3b, 0x65, 0x2e, 0x69, 0x66, 0x28, + 0x28, 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, 0x28, 0x63, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x69, 0x28, 0x63, 0x2c, 0x61, 0x29, + 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, 0x7d, 0x6e, 0x2e, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3d, 0x21, 0x30, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x63, 0x2c, 0x75, 0x29, + 0x7b, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x22, 0x69, 0x22, 0x2c, 0x75, 0x2c, 0x6f, 0x2c, 0x64, 0x3d, 0x3e, 0x7b, + 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x75, 0x6e, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, + 0x3a, 0x64, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x4e, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, + 0x4e, 0x75, 0x6d, 0x7d, 0x2c, 0x63, 0x29, 0x2c, 0x6e, 0x2e, 0x61, 0x6c, + 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7c, 0x7c, 0x65, 0x2e, 0x69, + 0x66, 0x28, 0x28, 0x30, 0x2c, 0x51, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x29, + 0x28, 0x63, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x65, 0x2e, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x28, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x7d, 0x3b, + 0x4f, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x6e, + 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6b, 0x69, 0x3d, 0x70, + 0x28, 0x6b, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x6b, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x61, 0x70, 0x3d, 0x71, 0x69, 0x28, 0x29, 0x2c, 0x6f, 0x70, 0x3d, + 0x4f, 0x69, 0x28, 0x29, 0x2c, 0x69, 0x70, 0x3d, 0x5b, 0x61, 0x70, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x6f, 0x70, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x6b, 0x6e, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x69, 0x70, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x49, 0x69, 0x3d, 0x70, 0x28, 0x49, 0x6e, 0x3d, + 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x49, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4a, 0x3d, 0x45, + 0x28, 0x29, 0x2c, 0x63, 0x70, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, + 0x4a, 0x2e, 0x73, 0x74, 0x72, 0x29, 0x60, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x20, 0x22, 0x24, 0x7b, 0x74, 0x7d, 0x22, 0x60, 0x2c, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x74, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, + 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x74, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x75, + 0x70, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x5b, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, + 0x30, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x63, 0x70, 0x2c, 0x63, + 0x6f, 0x64, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x73, 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x6e, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x61, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x6f, 0x2c, 0x69, 0x74, 0x3a, 0x69, + 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x63, 0x2c, + 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, + 0x68, 0x3a, 0x75, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, + 0x76, 0x3a, 0x64, 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x7d, 0x3d, + 0x69, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6e, 0x3f, 0x79, 0x28, 0x29, + 0x3a, 0x68, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x79, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x3d, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x22, 0x2c, 0x7b, + 0x72, 0x65, 0x66, 0x3a, 0x6c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x63, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x7d, 0x29, 0x2c, + 0x6d, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x66, + 0x44, 0x65, 0x66, 0x22, 0x2c, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x66, 0x7d, 0x5b, 0x24, 0x7b, 0x6f, 0x7d, 0x5d, 0x60, + 0x29, 0x2c, 0x24, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x66, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x29, 0x2c, 0x67, 0x3d, 0x72, 0x2e, 0x6c, + 0x65, 0x74, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x29, + 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, + 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x6d, + 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x20, 0x26, 0x26, 0x20, 0x21, 0x28, 0x24, 0x7b, 0x6d, 0x7d, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x52, + 0x65, 0x67, 0x45, 0x78, 0x70, 0x29, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x24, 0x2c, 0x28, + 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6d, 0x7d, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x67, 0x2c, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x6d, 0x7d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x60, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x24, 0x2c, 0x28, 0x30, 0x2c, 0x4a, 0x2e, + 0x5f, 0x29, 0x60, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x60, + 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x67, 0x2c, 0x6d, + 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x6f, 0x72, 0x29, 0x28, + 0x52, 0x28, 0x29, 0x2c, 0x71, 0x28, 0x29, 0x29, 0x29, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x3d, 0x21, + 0x31, 0x3f, 0x4a, 0x2e, 0x6e, 0x69, 0x6c, 0x3a, 0x28, 0x30, 0x2c, 0x4a, + 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x6f, 0x7d, 0x20, 0x26, 0x26, 0x20, + 0x21, 0x24, 0x7b, 0x67, 0x7d, 0x60, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x56, 0x3d, 0x64, 0x2e, 0x24, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x3f, 0x28, + 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x28, 0x24, 0x7b, 0x6d, 0x7d, + 0x2e, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3f, 0x20, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x24, 0x7b, 0x67, 0x7d, 0x28, 0x24, 0x7b, 0x73, 0x7d, + 0x29, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x67, 0x7d, 0x28, 0x24, 0x7b, 0x73, + 0x7d, 0x29, 0x29, 0x60, 0x3a, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x67, 0x7d, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, + 0x2c, 0x53, 0x3d, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x67, 0x7d, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x3f, 0x20, 0x24, 0x7b, 0x56, 0x7d, 0x20, 0x3a, 0x20, 0x24, + 0x7b, 0x67, 0x7d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x24, 0x7b, 0x73, + 0x7d, 0x29, 0x29, 0x60, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x67, 0x7d, 0x20, + 0x26, 0x26, 0x20, 0x24, 0x7b, 0x67, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x24, 0x7d, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x20, 0x26, 0x26, + 0x20, 0x21, 0x24, 0x7b, 0x53, 0x7d, 0x60, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x66, 0x3d, 0x6c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x5b, 0x61, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x66, 0x29, 0x7b, + 0x52, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, + 0x66, 0x28, 0x66, 0x3d, 0x3d, 0x3d, 0x21, 0x30, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x5b, 0x6d, 0x2c, 0x24, 0x2c, + 0x67, 0x5d, 0x3d, 0x71, 0x28, 0x66, 0x29, 0x3b, 0x6d, 0x3d, 0x3d, 0x3d, + 0x65, 0x26, 0x26, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x28, 0x56, 0x28, + 0x29, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x52, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x63, 0x2e, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3d, 0x3d, 0x3d, + 0x21, 0x31, 0x29, 0x7b, 0x6c, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, + 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x53, 0x28, 0x29, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x53, 0x28, + 0x29, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x53, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x60, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x20, 0x22, 0x24, 0x7b, 0x61, 0x7d, 0x22, 0x20, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x20, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, + 0x24, 0x7b, 0x75, 0x7d, 0x22, 0x60, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x53, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x76, 0x3d, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x3f, + 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x29, 0x28, 0x53, 0x29, 0x3a, 0x63, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3f, 0x28, + 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x63, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x7d, + 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x61, 0x29, 0x7d, 0x60, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x2c, 0x77, 0x3d, 0x72, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x22, 0x2c, 0x7b, 0x6b, 0x65, + 0x79, 0x3a, 0x61, 0x2c, 0x72, 0x65, 0x66, 0x3a, 0x53, 0x2c, 0x63, 0x6f, + 0x64, 0x65, 0x3a, 0x76, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x3d, 0x3d, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x26, 0x21, 0x28, + 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, + 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x29, 0x3f, 0x5b, 0x53, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x7c, 0x7c, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2c, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x77, 0x7d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x60, + 0x5d, 0x3a, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x53, 0x2c, 0x77, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x56, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x66, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x26, 0x26, 0x21, 0x28, 0x66, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x67, 0x45, + 0x78, 0x70, 0x29, 0x26, 0x26, 0x66, 0x2e, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x64, 0x2e, 0x24, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x73, 0x79, 0x6e, 0x63, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x4a, + 0x2e, 0x5f, 0x29, 0x60, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x24, 0x7b, + 0x67, 0x7d, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x24, 0x3d, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3f, 0x28, 0x30, 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, + 0x67, 0x7d, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, 0x3a, 0x28, 0x30, + 0x2c, 0x4a, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x67, 0x7d, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, 0x7d, 0x7d, + 0x7d, 0x7d, 0x3b, 0x49, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x75, 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, + 0x6e, 0x3d, 0x70, 0x28, 0x52, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x52, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x64, 0x70, 0x3d, 0x49, 0x69, 0x28, 0x29, 0x2c, + 0x6c, 0x70, 0x3d, 0x5b, 0x64, 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5d, 0x3b, 0x52, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3d, 0x6c, 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x4d, 0x6e, 0x3d, 0x70, 0x28, 0x6c, 0x74, 0x3d, 0x3e, 0x7b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6c, 0x74, 0x2c, + 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x6c, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x56, + 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3d, 0x6c, 0x74, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x56, 0x6f, 0x63, + 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3b, 0x6c, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, + 0x3d, 0x5b, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x2c, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x2c, 0x22, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x22, + 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x2c, 0x22, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x2c, 0x22, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x5d, 0x3b, 0x6c, 0x74, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x63, 0x61, + 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3d, 0x5b, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x2c, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x5d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x69, 0x3d, 0x70, + 0x28, 0x41, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x41, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x66, 0x70, 0x3d, 0x54, 0x73, 0x28, 0x29, 0x2c, 0x6d, 0x70, 0x3d, + 0x59, 0x73, 0x28, 0x29, 0x2c, 0x70, 0x70, 0x3d, 0x24, 0x6e, 0x28, 0x29, + 0x2c, 0x68, 0x70, 0x3d, 0x76, 0x69, 0x28, 0x29, 0x2c, 0x79, 0x70, 0x3d, + 0x53, 0x69, 0x28, 0x29, 0x2c, 0x24, 0x70, 0x3d, 0x6b, 0x69, 0x28, 0x29, + 0x2c, 0x5f, 0x70, 0x3d, 0x54, 0x6e, 0x28, 0x29, 0x2c, 0x52, 0x69, 0x3d, + 0x4d, 0x6e, 0x28, 0x29, 0x2c, 0x67, 0x70, 0x3d, 0x5b, 0x68, 0x70, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x66, 0x70, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x6d, 0x70, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x28, 0x30, 0x2c, 0x70, 0x70, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x28, 0x21, 0x30, 0x29, + 0x2c, 0x5f, 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, + 0x52, 0x69, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x56, + 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x2c, 0x52, 0x69, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x63, 0x61, + 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x2c, 0x79, 0x70, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x24, 0x70, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5d, 0x3b, 0x41, 0x6e, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x67, 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x41, 0x69, 0x3d, 0x70, 0x28, 0x6b, 0x72, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6b, + 0x72, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x6b, 0x72, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x4d, 0x69, 0x3b, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x2e, 0x54, 0x61, + 0x67, 0x3d, 0x22, 0x74, 0x61, 0x67, 0x22, 0x2c, 0x74, 0x2e, 0x4d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x22, 0x7d, 0x29, 0x28, 0x4d, 0x69, 0x7c, 0x7c, 0x28, 0x6b, + 0x72, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x4d, 0x69, 0x3d, 0x7b, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x7a, 0x6e, 0x3d, 0x70, 0x28, 0x44, 0x6e, 0x3d, 0x3e, + 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x44, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, + 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x74, 0x3d, 0x45, + 0x28, 0x29, 0x2c, 0x43, 0x6e, 0x3d, 0x41, 0x69, 0x28, 0x29, 0x2c, 0x43, + 0x69, 0x3d, 0x49, 0x74, 0x28, 0x29, 0x2c, 0x76, 0x70, 0x3d, 0x69, 0x74, + 0x28, 0x29, 0x2c, 0x62, 0x70, 0x3d, 0x49, 0x28, 0x29, 0x2c, 0x77, 0x70, + 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, 0x7b, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x64, 0x69, 0x73, 0x63, + 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x74, 0x2c, 0x74, 0x61, 0x67, + 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x65, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x74, + 0x3d, 0x3d, 0x3d, 0x43, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x3f, 0x60, 0x74, 0x61, + 0x67, 0x20, 0x22, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x60, + 0x3a, 0x60, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x61, 0x67, 0x20, 0x22, 0x24, 0x7b, 0x65, 0x7d, 0x22, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x65, + 0x4f, 0x66, 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x28, + 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x7b, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x74, 0x2c, 0x74, 0x61, + 0x67, 0x3a, 0x65, 0x2c, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x3a, + 0x72, 0x7d, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x66, 0x74, 0x2e, + 0x5f, 0x29, 0x60, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x24, + 0x7b, 0x74, 0x7d, 0x2c, 0x20, 0x74, 0x61, 0x67, 0x3a, 0x20, 0x24, 0x7b, + 0x72, 0x7d, 0x2c, 0x20, 0x74, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x7d, 0x60, 0x7d, 0x2c, 0x45, 0x70, + 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x22, 0x64, + 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x77, 0x70, 0x2c, 0x63, 0x6f, 0x64, + 0x65, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, + 0x3a, 0x65, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x73, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x6e, 0x2c, 0x69, 0x74, + 0x3a, 0x61, 0x7d, 0x3d, 0x74, 0x2c, 0x7b, 0x6f, 0x6e, 0x65, 0x4f, 0x66, + 0x3a, 0x6f, 0x7d, 0x3d, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, + 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x69, 0x3d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x69, 0x21, 0x3d, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x64, + 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x64, 0x69, 0x73, 0x63, + 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x20, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6f, 0x29, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, + 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x22, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x65, + 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, + 0x2c, 0x21, 0x31, 0x29, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x28, 0x22, 0x74, 0x61, 0x67, 0x22, 0x2c, 0x28, 0x30, 0x2c, + 0x66, 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x72, 0x7d, 0x24, 0x7b, + 0x28, 0x30, 0x2c, 0x66, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x29, 0x28, 0x69, 0x29, 0x7d, 0x60, 0x29, + 0x3b, 0x65, 0x2e, 0x69, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x66, 0x74, 0x2e, + 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, + 0x75, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x64, 0x28, 0x29, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x21, 0x31, 0x2c, 0x7b, 0x64, 0x69, 0x73, 0x63, 0x72, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x43, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x2c, 0x74, 0x61, 0x67, + 0x3a, 0x75, 0x2c, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x69, + 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x6f, 0x6b, 0x28, 0x63, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x68, 0x3d, 0x79, 0x28, 0x29, 0x3b, 0x65, + 0x2e, 0x69, 0x66, 0x28, 0x21, 0x31, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x29, 0x65, + 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x28, 0x28, 0x30, 0x2c, 0x66, + 0x74, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x75, 0x7d, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x24, 0x7b, 0x66, 0x7d, 0x60, 0x29, 0x2c, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x63, 0x2c, 0x6c, 0x28, 0x68, 0x5b, + 0x66, 0x5d, 0x29, 0x29, 0x3b, 0x65, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x28, + 0x29, 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x21, 0x31, + 0x2c, 0x7b, 0x64, 0x69, 0x73, 0x63, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x43, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2c, 0x74, + 0x61, 0x67, 0x3a, 0x75, 0x2c, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, + 0x3a, 0x69, 0x7d, 0x29, 0x2c, 0x65, 0x2e, 0x65, 0x6e, 0x64, 0x49, 0x66, + 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x28, 0x68, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x3d, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x22, 0x29, 0x2c, 0x6d, 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x22, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x22, 0x2c, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x68, 0x7d, 0x2c, + 0x66, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x6d, 0x2c, 0x66, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x29, 0x2c, 0x66, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x79, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x66, 0x3d, 0x7b, 0x7d, 0x2c, 0x6d, 0x3d, 0x67, 0x28, + 0x6e, 0x29, 0x2c, 0x24, 0x3d, 0x21, 0x30, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x56, 0x3d, 0x30, 0x3b, 0x56, 0x3c, 0x6f, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x56, 0x2b, 0x2b, 0x29, 0x7b, + 0x6c, 0x65, 0x74, 0x20, 0x53, 0x3d, 0x6f, 0x5b, 0x56, 0x5d, 0x3b, 0x69, + 0x66, 0x28, 0x53, 0x3f, 0x2e, 0x24, 0x72, 0x65, 0x66, 0x26, 0x26, 0x21, + 0x28, 0x30, 0x2c, 0x62, 0x70, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x48, 0x61, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x75, 0x74, 0x52, + 0x65, 0x66, 0x29, 0x28, 0x53, 0x2c, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x29, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x77, 0x3d, 0x53, 0x2e, 0x24, 0x72, 0x65, 0x66, 0x3b, 0x69, 0x66, + 0x28, 0x53, 0x3d, 0x43, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x52, 0x65, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x2e, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x61, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x45, 0x6e, 0x76, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x61, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x2c, 0x77, 0x29, 0x2c, 0x53, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x43, + 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x6e, 0x76, 0x26, + 0x26, 0x28, 0x53, 0x3d, 0x53, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x29, 0x2c, 0x53, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x76, + 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x61, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x2c, 0x77, 0x29, 0x7d, 0x6c, 0x65, 0x74, 0x20, 0x76, 0x3d, 0x28, + 0x68, 0x3d, 0x53, 0x3f, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x29, 0x3d, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7c, + 0x7c, 0x68, 0x3d, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3f, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x68, 0x5b, 0x69, 0x5d, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x21, + 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x60, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x20, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x20, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x20, 0x28, + 0x6f, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x64, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x29, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x24, 0x7b, 0x69, + 0x7d, 0x22, 0x60, 0x29, 0x3b, 0x24, 0x3d, 0x24, 0x26, 0x26, 0x28, 0x6d, + 0x7c, 0x7c, 0x67, 0x28, 0x53, 0x29, 0x29, 0x2c, 0x52, 0x28, 0x76, 0x2c, + 0x56, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x24, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x24, 0x7b, 0x69, 0x7d, 0x22, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x60, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x28, 0x7b, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x3a, 0x56, 0x7d, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x56, 0x29, 0x26, 0x26, 0x56, 0x2e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x28, 0x56, 0x2c, 0x53, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x56, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x29, 0x71, + 0x28, 0x56, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2c, 0x53, 0x29, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x56, 0x2e, 0x65, 0x6e, + 0x75, 0x6d, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x76, + 0x20, 0x6f, 0x66, 0x20, 0x56, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x29, 0x71, + 0x28, 0x76, 0x2c, 0x53, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x60, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x24, 0x7b, 0x69, 0x7d, 0x22, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x65, + 0x6e, 0x75, 0x6d, 0x22, 0x60, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x56, 0x2c, 0x53, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x56, 0x21, 0x3d, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7c, 0x7c, 0x56, 0x20, + 0x69, 0x6e, 0x20, 0x66, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x64, 0x69, + 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3a, + 0x20, 0x22, 0x24, 0x7b, 0x69, 0x7d, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x73, 0x60, 0x29, 0x3b, 0x66, 0x5b, 0x56, 0x5d, 0x3d, 0x53, 0x7d, 0x7d, + 0x7d, 0x7d, 0x3b, 0x44, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3d, 0x45, 0x70, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x44, + 0x69, 0x3d, 0x70, 0x28, 0x28, 0x72, 0x24, 0x2c, 0x50, 0x70, 0x29, 0x3d, + 0x3e, 0x7b, 0x50, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x3d, 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, + 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, 0x64, + 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, + 0x2d, 0x31, 0x32, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, + 0x24, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, + 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, + 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, + 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, + 0x63, 0x61, 0x62, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, + 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, + 0x63, 0x61, 0x62, 0x2f, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, + 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, + 0x63, 0x61, 0x62, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2d, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x21, + 0x30, 0x2c, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, + 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x2c, + 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x5b, + 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x63, 0x6f, 0x72, 0x65, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x75, 0x6e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x22, 0x7d, 0x2c, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x6d, + 0x65, 0x74, 0x61, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2d, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x7d, 0x5d, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x24, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, + 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x61, + 0x6c, 0x73, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, + 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x20, 0x64, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, + 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x79, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x2e, + 0x22, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3a, 0x7b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x3a, 0x7b, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x27, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x22, 0x24, 0x64, 0x65, 0x66, 0x73, 0x22, 0x2e, 0x27, 0x2c, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x27, 0x22, 0x64, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x70, 0x6c, + 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x22, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x64, 0x65, 0x70, 0x65, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69, + 0x72, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x27, 0x2c, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, + 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, + 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, + 0x5d, 0x7d, 0x2c, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x7b, 0x24, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x27, 0x22, 0x24, 0x72, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x22, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x22, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x22, 0x2e, 0x27, 0x2c, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x23, + 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x21, 0x30, 0x7d, 0x2c, + 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, + 0x66, 0x3a, 0x7b, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x27, 0x22, 0x24, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x52, 0x65, 0x66, 0x22, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x22, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, + 0x65, 0x66, 0x22, 0x2e, 0x27, 0x2c, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x3a, + 0x21, 0x30, 0x7d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x7a, 0x69, 0x3d, 0x70, 0x28, 0x28, 0x73, 0x24, 0x2c, 0x53, 0x70, 0x29, + 0x3d, 0x3e, 0x7b, 0x53, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x3d, 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, + 0x32, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, + 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, + 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x24, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, + 0x32, 0x2f, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x2c, + 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, + 0x72, 0x79, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, + 0x22, 0x7d, 0x2c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, + 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, + 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, + 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, + 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, + 0x7d, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, + 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x22, 0x7d, + 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, + 0x2c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, + 0x61, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, + 0x7b, 0x7d, 0x7d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, + 0x61, 0x22, 0x7d, 0x2c, 0x69, 0x66, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, + 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x74, 0x68, 0x65, 0x6e, 0x3a, 0x7b, 0x24, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x65, 0x6c, 0x73, 0x65, + 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x61, + 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x61, 0x6e, + 0x79, 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x6f, 0x6e, 0x65, + 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, + 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x6e, 0x6f, 0x74, 0x3a, + 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, + 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x7d, 0x2c, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x3a, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x6d, 0x69, 0x6e, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x31, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x56, 0x69, 0x3d, 0x70, + 0x28, 0x28, 0x6e, 0x24, 0x2c, 0x6a, 0x70, 0x29, 0x3d, 0x3e, 0x7b, 0x6a, + 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x7b, 0x24, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, + 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, 0x64, 0x3a, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, + 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, + 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x24, 0x76, 0x6f, 0x63, 0x61, + 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x24, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3a, 0x22, 0x55, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, + 0x22, 0x7d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, + 0x69, 0x3d, 0x70, 0x28, 0x28, 0x61, 0x24, 0x2c, 0x71, 0x70, 0x29, 0x3d, + 0x3e, 0x7b, 0x71, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x3d, 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, + 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, 0x64, + 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, + 0x2d, 0x31, 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x24, 0x76, 0x6f, 0x63, 0x61, 0x62, + 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, + 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, + 0x63, 0x61, 0x62, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x22, 0x6d, 0x65, 0x74, + 0x61, 0x22, 0x2c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, + 0x2c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, + 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4b, 0x69, 0x3d, + 0x70, 0x28, 0x28, 0x6f, 0x24, 0x2c, 0x4e, 0x70, 0x29, 0x3d, 0x3e, 0x7b, + 0x4e, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x7b, + 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, 0x64, 0x3a, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, + 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x22, + 0x2c, 0x24, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, + 0x3a, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, + 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x24, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3a, + 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3a, 0x22, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, + 0x75, 0x6c, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x69, 0x64, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, + 0x65, 0x66, 0x73, 0x2f, 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x4e, 0x6f, + 0x6e, 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x3a, 0x22, 0x5e, 0x5b, 0x5e, 0x23, 0x5d, 0x2a, 0x23, + 0x3f, 0x24, 0x22, 0x7d, 0x2c, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, + 0x65, 0x66, 0x73, 0x2f, 0x75, 0x72, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, + 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x24, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x24, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, + 0x73, 0x2f, 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x24, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x24, 0x76, 0x6f, 0x63, + 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, + 0x65, 0x66, 0x73, 0x2f, 0x75, 0x72, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x7d, 0x7d, 0x2c, 0x24, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x24, 0x64, 0x65, 0x66, + 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3a, 0x7b, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x7d, 0x7d, + 0x7d, 0x2c, 0x24, 0x64, 0x65, 0x66, 0x73, 0x3a, 0x7b, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3a, 0x22, 0x5e, 0x5b, + 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5f, 0x5d, 0x5b, 0x2d, 0x41, 0x2d, + 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2e, 0x5f, 0x5d, 0x2a, 0x24, + 0x22, 0x7d, 0x2c, 0x75, 0x72, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, + 0x75, 0x72, 0x69, 0x22, 0x7d, 0x2c, 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, + 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x7d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x55, 0x69, 0x3d, 0x70, 0x28, 0x28, 0x69, 0x24, 0x2c, 0x4f, 0x70, 0x29, + 0x3d, 0x3e, 0x7b, 0x4f, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x3d, 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, + 0x32, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, + 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, + 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2d, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x24, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, + 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, 0x6f, 0x63, + 0x61, 0x62, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2d, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x21, 0x30, + 0x7d, 0x2c, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3a, 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x7d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x46, 0x69, + 0x3d, 0x70, 0x28, 0x28, 0x63, 0x24, 0x2c, 0x6b, 0x70, 0x29, 0x3d, 0x3e, + 0x7b, 0x6b, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, + 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, + 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, 0x69, 0x64, 0x3a, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, + 0x31, 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x6d, 0x65, 0x74, 0x61, + 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x24, 0x76, 0x6f, 0x63, 0x61, + 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x24, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x22, + 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, + 0x22, 0x4d, 0x65, 0x74, 0x61, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x65, + 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, + 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x7b, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x21, + 0x30, 0x2c, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, + 0x6e, 0x6c, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x21, 0x30, 0x7d, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x4c, 0x69, 0x3d, 0x70, 0x28, 0x28, 0x75, 0x24, 0x2c, 0x49, 0x70, + 0x29, 0x3d, 0x3e, 0x7b, 0x49, 0x70, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x3d, 0x7b, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, + 0x31, 0x32, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x24, + 0x69, 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, + 0x32, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x24, + 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x3a, 0x7b, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, 0x2d, + 0x31, 0x32, 0x2f, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x21, 0x30, 0x7d, + 0x2c, 0x24, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x3a, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, + 0x61, 0x72, 0x79, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x7d, + 0x2c, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, + 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, + 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x31, + 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x21, 0x30, 0x7d, 0x5d, 0x7d, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, + 0x2c, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, + 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, + 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, + 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, + 0x72, 0x65, 0x67, 0x65, 0x78, 0x22, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x21, 0x31, + 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x31, 0x7d, 0x2c, + 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x7d, 0x2c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, + 0x7d, 0x7d, 0x2c, 0x24, 0x64, 0x65, 0x66, 0x73, 0x3a, 0x7b, 0x6e, 0x6f, + 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, 0x2c, 0x6e, 0x6f, 0x6e, 0x4e, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x30, 0x3a, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, + 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x30, 0x7d, 0x2c, 0x73, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x7b, 0x65, 0x6e, + 0x75, 0x6d, 0x3a, 0x5b, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6c, + 0x6c, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x7d, 0x2c, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x5b, 0x5d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x48, 0x69, 0x3d, 0x70, 0x28, + 0x56, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x56, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x52, 0x70, 0x3d, 0x44, 0x69, 0x28, 0x29, 0x2c, 0x54, 0x70, 0x3d, 0x7a, + 0x69, 0x28, 0x29, 0x2c, 0x4d, 0x70, 0x3d, 0x56, 0x69, 0x28, 0x29, 0x2c, + 0x41, 0x70, 0x3d, 0x78, 0x69, 0x28, 0x29, 0x2c, 0x43, 0x70, 0x3d, 0x4b, + 0x69, 0x28, 0x29, 0x2c, 0x44, 0x70, 0x3d, 0x55, 0x69, 0x28, 0x29, 0x2c, + 0x7a, 0x70, 0x3d, 0x46, 0x69, 0x28, 0x29, 0x2c, 0x56, 0x70, 0x3d, 0x4c, + 0x69, 0x28, 0x29, 0x2c, 0x78, 0x70, 0x3d, 0x5b, 0x22, 0x2f, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x70, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x52, 0x70, 0x2c, + 0x54, 0x70, 0x2c, 0x4d, 0x70, 0x2c, 0x41, 0x70, 0x2c, 0x43, 0x70, 0x2c, + 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x44, 0x70, 0x29, 0x2c, 0x7a, + 0x70, 0x2c, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x56, 0x70, 0x29, + 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x72, 0x3d, + 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x72, 0x2c, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x2c, 0x21, 0x31, 0x29, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x28, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x3f, 0x72, 0x2e, 0x24, 0x64, 0x61, 0x74, 0x61, 0x4d, + 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x73, 0x2c, + 0x78, 0x70, 0x29, 0x3a, 0x73, 0x7d, 0x7d, 0x56, 0x6e, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x4b, 0x70, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x47, 0x69, 0x3d, 0x70, 0x28, 0x28, 0x46, 0x2c, 0x4b, + 0x6e, 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x46, 0x2e, 0x4d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x46, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x46, 0x2e, 0x43, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x6e, 0x3d, 0x46, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x46, 0x2e, 0x6e, 0x69, 0x6c, 0x3d, 0x46, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x46, 0x2e, 0x73, 0x74, 0x72, 0x3d, + 0x46, 0x2e, 0x5f, 0x3d, 0x46, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x43, 0x78, 0x74, 0x3d, 0x46, 0x2e, 0x41, 0x6a, 0x76, 0x32, 0x30, + 0x32, 0x30, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x55, 0x70, 0x3d, 0x6b, 0x73, 0x28, 0x29, 0x2c, 0x46, 0x70, + 0x3d, 0x54, 0x69, 0x28, 0x29, 0x2c, 0x4c, 0x70, 0x3d, 0x7a, 0x6e, 0x28, + 0x29, 0x2c, 0x48, 0x70, 0x3d, 0x48, 0x69, 0x28, 0x29, 0x2c, 0x78, 0x6e, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2f, 0x32, 0x30, 0x32, 0x30, + 0x2d, 0x31, 0x32, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, + 0x6d, 0x74, 0x3d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x73, 0x20, 0x55, 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x7b, 0x7d, 0x29, 0x7b, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x28, 0x7b, 0x2e, 0x2e, 0x2e, 0x65, 0x2c, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x66, 0x3a, 0x21, 0x30, 0x2c, + 0x6e, 0x65, 0x78, 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x75, 0x6e, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x7d, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x2c, 0x46, 0x70, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x45, + 0x61, 0x63, 0x68, 0x28, 0x65, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, + 0x79, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, 0x4c, + 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x5f, + 0x61, 0x64, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x29, 0x7b, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x28, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x24, 0x64, 0x61, + 0x74, 0x61, 0x3a, 0x65, 0x2c, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x72, 0x7d, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x72, + 0x26, 0x26, 0x28, 0x48, 0x70, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x65, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, 0x73, + 0x5b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x5d, 0x3d, 0x78, 0x6e, + 0x29, 0x7d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x3d, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x28, 0x29, 0x7c, 0x7c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x78, 0x6e, + 0x29, 0x3f, 0x78, 0x6e, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, + 0x7d, 0x7d, 0x3b, 0x46, 0x2e, 0x41, 0x6a, 0x76, 0x32, 0x30, 0x32, 0x30, + 0x3d, 0x6d, 0x74, 0x3b, 0x4b, 0x6e, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x3d, 0x46, 0x3d, 0x6d, 0x74, 0x3b, 0x4b, 0x6e, 0x2e, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x41, 0x6a, 0x76, 0x32, 0x30, + 0x32, 0x30, 0x3d, 0x6d, 0x74, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x46, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x6d, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x47, 0x70, 0x3d, 0x47, 0x65, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, 0x4b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, 0x22, 0x2c, 0x7b, 0x65, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, + 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x70, + 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, 0x7d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x74, 0x3d, 0x45, 0x28, + 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x46, 0x2c, 0x22, 0x5f, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x74, 0x2e, 0x5f, 0x7d, + 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x46, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x22, 0x2c, 0x7b, 0x65, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, + 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x74, + 0x2e, 0x73, 0x74, 0x72, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, + 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x74, 0x2e, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x7d, 0x7d, 0x29, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, + 0x2c, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, + 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x74, 0x2e, 0x6e, + 0x69, 0x6c, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x70, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x29, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, + 0x2c, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x22, 0x2c, 0x7b, + 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, + 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x7d, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4a, 0x70, 0x3d, 0x6b, 0x74, 0x28, + 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, + 0x46, 0x2c, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, + 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x70, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x57, 0x70, 0x3d, 0x69, 0x74, 0x28, 0x29, 0x3b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x46, 0x2c, 0x22, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x57, 0x70, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x7d, 0x29, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x63, 0x3d, 0x70, 0x28, 0x45, 0x65, 0x3d, 0x3e, 0x7b, + 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x45, + 0x65, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, + 0x7d, 0x29, 0x3b, 0x45, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x45, 0x65, 0x2e, 0x66, 0x61, 0x73, + 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x45, 0x65, 0x2e, + 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x74, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x65, 0x3a, 0x65, 0x7d, 0x7d, 0x45, 0x65, 0x2e, 0x66, 0x75, 0x6c, 0x6c, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x7b, 0x64, 0x61, 0x74, + 0x65, 0x3a, 0x77, 0x65, 0x28, 0x5a, 0x69, 0x2c, 0x48, 0x6e, 0x29, 0x2c, + 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x77, 0x65, 0x28, 0x46, 0x6e, 0x28, 0x21, + 0x30, 0x29, 0x2c, 0x47, 0x6e, 0x29, 0x2c, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x77, 0x65, 0x28, 0x4a, 0x69, + 0x28, 0x21, 0x30, 0x29, 0x2c, 0x42, 0x69, 0x29, 0x2c, 0x22, 0x69, 0x73, + 0x6f, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x77, 0x65, 0x28, 0x46, + 0x6e, 0x28, 0x29, 0x2c, 0x51, 0x69, 0x29, 0x2c, 0x22, 0x69, 0x73, 0x6f, + 0x2d, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, + 0x77, 0x65, 0x28, 0x4a, 0x69, 0x28, 0x29, 0x2c, 0x58, 0x69, 0x29, 0x2c, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x2f, 0x5e, 0x50, + 0x28, 0x3f, 0x21, 0x24, 0x29, 0x28, 0x28, 0x5c, 0x64, 0x2b, 0x59, 0x29, + 0x3f, 0x28, 0x5c, 0x64, 0x2b, 0x4d, 0x29, 0x3f, 0x28, 0x5c, 0x64, 0x2b, + 0x44, 0x29, 0x3f, 0x28, 0x54, 0x28, 0x3f, 0x3d, 0x5c, 0x64, 0x29, 0x28, + 0x5c, 0x64, 0x2b, 0x48, 0x29, 0x3f, 0x28, 0x5c, 0x64, 0x2b, 0x4d, 0x29, + 0x3f, 0x28, 0x5c, 0x64, 0x2b, 0x53, 0x29, 0x3f, 0x29, 0x3f, 0x7c, 0x28, + 0x5c, 0x64, 0x2b, 0x57, 0x29, 0x3f, 0x29, 0x24, 0x2f, 0x2c, 0x75, 0x72, + 0x69, 0x3a, 0x65, 0x68, 0x2c, 0x22, 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x2f, 0x5e, 0x28, + 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, + 0x2d, 0x39, 0x2b, 0x5c, 0x2d, 0x2e, 0x5d, 0x2a, 0x3a, 0x29, 0x3f, 0x28, + 0x3f, 0x3a, 0x5c, 0x2f, 0x3f, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x28, 0x3f, + 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, + 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, + 0x3a, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x40, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, + 0x5b, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x28, 0x3f, + 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x36, 0x7d, 0x7c, 0x3a, 0x3a, 0x28, 0x3f, + 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x35, 0x7d, 0x7c, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x29, 0x3f, 0x3a, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x34, + 0x7d, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, + 0x30, 0x2c, 0x31, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x28, 0x3f, 0x3a, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, + 0x7d, 0x3a, 0x29, 0x7b, 0x33, 0x7d, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, + 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x32, 0x7d, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x3f, + 0x3a, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x32, 0x7d, 0x7c, + 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, + 0x33, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x7c, 0x28, 0x3f, + 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x34, 0x7d, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, + 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x29, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, + 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, + 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x3f, 0x29, 0x5c, + 0x2e, 0x29, 0x7b, 0x33, 0x7d, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, + 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x3f, 0x29, + 0x29, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, + 0x30, 0x2c, 0x35, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x7c, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x36, + 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x29, 0x7c, 0x5b, 0x56, 0x76, 0x5d, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x2b, 0x5c, 0x2e, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, + 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x5d, + 0x2b, 0x29, 0x5c, 0x5d, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, + 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, + 0x5d, 0x5c, 0x64, 0x7c, 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, + 0x64, 0x3f, 0x29, 0x5c, 0x2e, 0x29, 0x7b, 0x33, 0x7d, 0x28, 0x3f, 0x3a, + 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, + 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, + 0x5c, 0x64, 0x3f, 0x29, 0x7c, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, + 0x22, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x5d, 0x7c, 0x25, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, + 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5c, 0x64, 0x2a, 0x29, 0x3f, 0x28, 0x3f, + 0x3a, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x22, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, + 0x29, 0x2a, 0x7c, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, + 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, + 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x32, 0x7d, 0x29, 0x2b, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x28, 0x3f, + 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, + 0x7e, 0x21, 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, + 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, 0x2a, 0x29, 0x3f, 0x7c, + 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, + 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2b, 0x28, 0x3f, 0x3a, + 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, + 0x2a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, 0x3f, 0x28, 0x3f, 0x3a, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, + 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, + 0x40, 0x2f, 0x3f, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, + 0x23, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, + 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x22, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x2f, 0x3f, 0x5d, 0x7c, 0x25, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, + 0x29, 0x3f, 0x24, 0x2f, 0x69, 0x2c, 0x22, 0x75, 0x72, 0x69, 0x2d, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x2f, 0x5e, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x5e, 0x5c, 0x78, 0x30, 0x30, 0x2d, + 0x5c, 0x78, 0x32, 0x30, 0x22, 0x27, 0x3c, 0x3e, 0x25, 0x5c, 0x5c, 0x5e, + 0x60, 0x7b, 0x7c, 0x7d, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x7c, 0x5c, 0x7b, 0x5b, 0x2b, + 0x23, 0x2e, 0x2f, 0x3b, 0x3f, 0x26, 0x3d, 0x2c, 0x21, 0x40, 0x7c, 0x5d, + 0x3f, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, + 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x32, 0x7d, 0x29, 0x2b, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x31, 0x2d, 0x39, + 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x30, 0x2c, 0x33, 0x7d, 0x7c, + 0x5c, 0x2a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x2c, 0x28, 0x3f, 0x3a, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x7c, 0x25, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2b, 0x28, + 0x3f, 0x3a, 0x3a, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, + 0x5d, 0x7b, 0x30, 0x2c, 0x33, 0x7d, 0x7c, 0x5c, 0x2a, 0x29, 0x3f, 0x29, + 0x2a, 0x5c, 0x7d, 0x29, 0x2a, 0x24, 0x2f, 0x69, 0x2c, 0x75, 0x72, 0x6c, + 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3f, + 0x7c, 0x66, 0x74, 0x70, 0x29, 0x3a, 0x5c, 0x2f, 0x5c, 0x2f, 0x28, 0x3f, + 0x3a, 0x5c, 0x53, 0x2b, 0x28, 0x3f, 0x3a, 0x3a, 0x5c, 0x53, 0x2a, 0x29, + 0x3f, 0x40, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x21, 0x28, 0x3f, + 0x3a, 0x31, 0x30, 0x7c, 0x31, 0x32, 0x37, 0x29, 0x28, 0x3f, 0x3a, 0x5c, + 0x2e, 0x5c, 0x64, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x29, 0x7b, 0x33, 0x7d, + 0x29, 0x28, 0x3f, 0x21, 0x28, 0x3f, 0x3a, 0x31, 0x36, 0x39, 0x5c, 0x2e, + 0x32, 0x35, 0x34, 0x7c, 0x31, 0x39, 0x32, 0x5c, 0x2e, 0x31, 0x36, 0x38, + 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5c, 0x64, 0x7b, 0x31, 0x2c, 0x33, + 0x7d, 0x29, 0x7b, 0x32, 0x7d, 0x29, 0x28, 0x3f, 0x21, 0x31, 0x37, 0x32, + 0x5c, 0x2e, 0x28, 0x3f, 0x3a, 0x31, 0x5b, 0x36, 0x2d, 0x39, 0x5d, 0x7c, + 0x32, 0x5c, 0x64, 0x7c, 0x33, 0x5b, 0x30, 0x2d, 0x31, 0x5d, 0x29, 0x28, + 0x3f, 0x3a, 0x5c, 0x2e, 0x5c, 0x64, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x29, + 0x7b, 0x32, 0x7d, 0x29, 0x28, 0x3f, 0x3a, 0x5b, 0x31, 0x2d, 0x39, 0x5d, + 0x5c, 0x64, 0x3f, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x32, 0x5b, + 0x30, 0x31, 0x5d, 0x5c, 0x64, 0x7c, 0x32, 0x32, 0x5b, 0x30, 0x2d, 0x33, + 0x5d, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x28, 0x3f, 0x3a, 0x31, 0x3f, + 0x5c, 0x64, 0x7b, 0x31, 0x2c, 0x32, 0x7d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, + 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, + 0x29, 0x29, 0x7b, 0x32, 0x7d, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x28, 0x3f, + 0x3a, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5c, 0x64, 0x3f, 0x7c, 0x31, 0x5c, + 0x64, 0x5c, 0x64, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x29, 0x29, 0x7c, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5c, 0x75, 0x7b, 0x30, 0x30, 0x61, 0x31, 0x7d, 0x2d, 0x5c, 0x75, 0x7b, + 0x66, 0x66, 0x66, 0x66, 0x7d, 0x5d, 0x2b, 0x2d, 0x29, 0x2a, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x75, 0x7b, 0x30, 0x30, 0x61, 0x31, + 0x7d, 0x2d, 0x5c, 0x75, 0x7b, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x5d, 0x2b, + 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x75, 0x7b, 0x30, 0x30, 0x61, 0x31, 0x7d, + 0x2d, 0x5c, 0x75, 0x7b, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x5d, 0x2b, 0x2d, + 0x29, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x75, 0x7b, + 0x30, 0x30, 0x61, 0x31, 0x7d, 0x2d, 0x5c, 0x75, 0x7b, 0x66, 0x66, 0x66, + 0x66, 0x7d, 0x5d, 0x2b, 0x29, 0x2a, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x28, + 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x5c, 0x75, 0x7b, 0x30, 0x30, 0x61, + 0x31, 0x7d, 0x2d, 0x5c, 0x75, 0x7b, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x5d, + 0x7b, 0x32, 0x2c, 0x7d, 0x29, 0x29, 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5c, + 0x64, 0x7b, 0x32, 0x2c, 0x35, 0x7d, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, + 0x2f, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, 0x2a, 0x29, 0x3f, 0x24, 0x2f, 0x69, + 0x75, 0x2c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x3a, 0x2f, 0x5e, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, + 0x2b, 0x2f, 0x3d, 0x3f, 0x5e, 0x5f, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0x2d, + 0x5d, 0x2b, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, + 0x2d, 0x39, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2f, 0x3d, + 0x3f, 0x5e, 0x5f, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0x2d, 0x5d, 0x2b, 0x29, + 0x2a, 0x40, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, + 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, + 0x5c, 0x2e, 0x29, 0x2b, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, + 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, + 0x2f, 0x69, 0x2c, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x2f, 0x5e, 0x28, 0x3f, 0x3d, 0x2e, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x33, + 0x7d, 0x5c, 0x2e, 0x3f, 0x24, 0x29, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x2d, 0x5d, 0x7b, 0x30, 0x2c, 0x36, 0x31, 0x7d, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x7a, 0x5d, 0x7b, 0x30, 0x2c, 0x36, 0x31, + 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x7a, 0x5d, 0x29, 0x3f, 0x29, + 0x2a, 0x5c, 0x2e, 0x3f, 0x24, 0x2f, 0x69, 0x2c, 0x69, 0x70, 0x76, 0x34, + 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, + 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, + 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, + 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x5c, 0x2e, 0x29, 0x7b, 0x33, 0x7d, 0x28, + 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, + 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, + 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x24, 0x2f, + 0x2c, 0x69, 0x70, 0x76, 0x36, 0x3a, 0x2f, 0x5e, 0x28, 0x28, 0x28, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x3a, 0x29, 0x7b, 0x37, 0x7d, 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x7c, 0x3a, 0x29, 0x29, 0x7c, + 0x28, 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x36, 0x7d, 0x28, 0x3a, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x7c, + 0x28, 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, + 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, + 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, + 0x2e, 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, + 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, + 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, + 0x33, 0x7d, 0x29, 0x7c, 0x3a, 0x29, 0x29, 0x7c, 0x28, 0x28, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, + 0x29, 0x7b, 0x35, 0x7d, 0x28, 0x28, 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x31, + 0x2c, 0x32, 0x7d, 0x29, 0x7c, 0x3a, 0x28, 0x28, 0x32, 0x35, 0x5b, 0x30, + 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, + 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, 0x2e, 0x28, 0x32, 0x35, 0x5b, 0x30, + 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, + 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, 0x33, 0x7d, 0x29, 0x7c, 0x3a, 0x29, + 0x29, 0x7c, 0x28, 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x34, 0x7d, 0x28, 0x28, + 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x29, 0x7c, 0x28, + 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x28, 0x28, 0x32, 0x35, 0x5b, 0x30, + 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, + 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, 0x2e, 0x28, 0x32, 0x35, 0x5b, 0x30, + 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, + 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, + 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, 0x33, 0x7d, 0x29, 0x29, 0x7c, 0x3a, + 0x29, 0x29, 0x7c, 0x28, 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x33, 0x7d, 0x28, + 0x28, 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7c, + 0x28, 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x30, 0x2c, 0x32, 0x7d, 0x3a, 0x28, + 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, + 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, + 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, 0x2e, + 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, + 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, + 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, 0x33, + 0x7d, 0x29, 0x29, 0x7c, 0x3a, 0x29, 0x29, 0x7c, 0x28, 0x28, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, + 0x29, 0x7b, 0x32, 0x7d, 0x28, 0x28, 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x31, + 0x2c, 0x35, 0x7d, 0x29, 0x7c, 0x28, 0x28, 0x3a, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x7b, 0x30, + 0x2c, 0x33, 0x7d, 0x3a, 0x28, 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, + 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, + 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, + 0x64, 0x29, 0x28, 0x5c, 0x2e, 0x28, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, + 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x31, + 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x3f, 0x5c, + 0x64, 0x29, 0x29, 0x7b, 0x33, 0x7d, 0x29, 0x29, 0x7c, 0x3a, 0x29, 0x29, + 0x7c, 0x28, 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x31, 0x7d, 0x28, 0x28, 0x28, + 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x36, 0x7d, 0x29, 0x7c, 0x28, 0x28, + 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, + 0x34, 0x7d, 0x29, 0x7b, 0x30, 0x2c, 0x34, 0x7d, 0x3a, 0x28, 0x28, 0x32, + 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, + 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, + 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, 0x2e, 0x28, 0x32, + 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, + 0x5d, 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, + 0x2d, 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, 0x33, 0x7d, 0x29, + 0x29, 0x7c, 0x3a, 0x29, 0x29, 0x7c, 0x28, 0x3a, 0x28, 0x28, 0x28, 0x3a, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, + 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x37, 0x7d, 0x29, 0x7c, 0x28, 0x28, 0x3a, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, + 0x7d, 0x29, 0x7b, 0x30, 0x2c, 0x35, 0x7d, 0x3a, 0x28, 0x28, 0x32, 0x35, + 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, + 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, + 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x28, 0x5c, 0x2e, 0x28, 0x32, 0x35, + 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, + 0x5c, 0x64, 0x7c, 0x31, 0x5c, 0x64, 0x5c, 0x64, 0x7c, 0x5b, 0x31, 0x2d, + 0x39, 0x5d, 0x3f, 0x5c, 0x64, 0x29, 0x29, 0x7b, 0x33, 0x7d, 0x29, 0x29, + 0x7c, 0x3a, 0x29, 0x29, 0x29, 0x24, 0x2f, 0x69, 0x2c, 0x72, 0x65, 0x67, + 0x65, 0x78, 0x3a, 0x69, 0x68, 0x2c, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x2f, + 0x5e, 0x28, 0x3f, 0x3a, 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x75, 0x69, 0x64, + 0x3a, 0x29, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x38, 0x7d, 0x2d, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x29, 0x7b, 0x33, 0x7d, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x24, 0x2f, + 0x69, 0x2c, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, + 0x28, 0x3f, 0x3a, 0x5b, 0x5e, 0x7e, 0x2f, 0x5d, 0x7c, 0x7e, 0x30, 0x7c, + 0x7e, 0x31, 0x29, 0x2a, 0x29, 0x2a, 0x24, 0x2f, 0x2c, 0x22, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x75, + 0x72, 0x69, 0x2d, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x2f, 0x5e, 0x23, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, + 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x5c, 0x2d, 0x2e, 0x21, + 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3a, 0x3d, 0x40, + 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x32, 0x7d, 0x7c, 0x7e, 0x30, 0x7c, 0x7e, 0x31, 0x29, 0x2a, 0x29, 0x2a, + 0x24, 0x2f, 0x69, 0x2c, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x2d, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x30, 0x7c, 0x5b, + 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x29, 0x28, + 0x3f, 0x3a, 0x23, 0x7c, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, + 0x5b, 0x5e, 0x7e, 0x2f, 0x5d, 0x7c, 0x7e, 0x30, 0x7c, 0x7e, 0x31, 0x29, + 0x2a, 0x29, 0x2a, 0x29, 0x24, 0x2f, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x3a, + 0x74, 0x68, 0x2c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6e, 0x68, 0x7d, + 0x2c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x61, 0x68, 0x7d, 0x2c, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x3a, 0x59, 0x69, 0x7d, 0x2c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x59, 0x69, 0x7d, 0x2c, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x21, 0x30, 0x2c, 0x62, 0x69, 0x6e, 0x61, + 0x72, 0x79, 0x3a, 0x21, 0x30, 0x7d, 0x3b, 0x45, 0x65, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x7b, 0x2e, + 0x2e, 0x2e, 0x45, 0x65, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x2c, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x77, 0x65, + 0x28, 0x2f, 0x5e, 0x5c, 0x64, 0x5c, 0x64, 0x5c, 0x64, 0x5c, 0x64, 0x2d, + 0x5b, 0x30, 0x2d, 0x31, 0x5d, 0x5c, 0x64, 0x2d, 0x5b, 0x30, 0x2d, 0x33, + 0x5d, 0x5c, 0x64, 0x24, 0x2f, 0x2c, 0x48, 0x6e, 0x29, 0x2c, 0x74, 0x69, + 0x6d, 0x65, 0x3a, 0x77, 0x65, 0x28, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x32, 0x5d, 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, + 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x5c, 0x64, 0x7c, 0x32, + 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x36, 0x30, 0x29, 0x28, 0x3f, 0x3a, 0x5c, + 0x2e, 0x5c, 0x64, 0x2b, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x7a, 0x7c, 0x5b, + 0x2b, 0x2d, 0x5d, 0x5c, 0x64, 0x5c, 0x64, 0x28, 0x3f, 0x3a, 0x3a, 0x3f, + 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x3f, 0x29, 0x24, 0x2f, 0x69, 0x2c, 0x47, + 0x6e, 0x29, 0x2c, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x3a, 0x77, 0x65, 0x28, 0x2f, 0x5e, 0x5c, 0x64, 0x5c, 0x64, + 0x5c, 0x64, 0x5c, 0x64, 0x2d, 0x5b, 0x30, 0x2d, 0x31, 0x5d, 0x5c, 0x64, + 0x2d, 0x5b, 0x30, 0x2d, 0x33, 0x5d, 0x5c, 0x64, 0x74, 0x28, 0x3f, 0x3a, + 0x5b, 0x30, 0x2d, 0x32, 0x5d, 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, + 0x5d, 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x5c, 0x64, 0x7c, + 0x32, 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x36, 0x30, 0x29, 0x28, 0x3f, 0x3a, + 0x5c, 0x2e, 0x5c, 0x64, 0x2b, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x7a, 0x7c, + 0x5b, 0x2b, 0x2d, 0x5d, 0x5c, 0x64, 0x5c, 0x64, 0x28, 0x3f, 0x3a, 0x3a, + 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x3f, 0x29, 0x24, 0x2f, 0x69, 0x2c, + 0x42, 0x69, 0x29, 0x2c, 0x22, 0x69, 0x73, 0x6f, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x3a, 0x77, 0x65, 0x28, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x32, 0x5d, 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, + 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x5c, 0x64, 0x7c, 0x32, + 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x36, 0x30, 0x29, 0x28, 0x3f, 0x3a, 0x5c, + 0x2e, 0x5c, 0x64, 0x2b, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x7a, 0x7c, 0x5b, + 0x2b, 0x2d, 0x5d, 0x5c, 0x64, 0x5c, 0x64, 0x28, 0x3f, 0x3a, 0x3a, 0x3f, + 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x3f, 0x29, 0x3f, 0x24, 0x2f, 0x69, 0x2c, + 0x51, 0x69, 0x29, 0x2c, 0x22, 0x69, 0x73, 0x6f, 0x2d, 0x64, 0x61, 0x74, + 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x77, 0x65, 0x28, 0x2f, + 0x5e, 0x5c, 0x64, 0x5c, 0x64, 0x5c, 0x64, 0x5c, 0x64, 0x2d, 0x5b, 0x30, + 0x2d, 0x31, 0x5d, 0x5c, 0x64, 0x2d, 0x5b, 0x30, 0x2d, 0x33, 0x5d, 0x5c, + 0x64, 0x5b, 0x74, 0x5c, 0x73, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, + 0x32, 0x5d, 0x5c, 0x64, 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x5c, 0x64, + 0x3a, 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x5c, 0x64, 0x7c, 0x32, 0x33, 0x3a, + 0x35, 0x39, 0x3a, 0x36, 0x30, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5c, + 0x64, 0x2b, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x7a, 0x7c, 0x5b, 0x2b, 0x2d, + 0x5d, 0x5c, 0x64, 0x5c, 0x64, 0x28, 0x3f, 0x3a, 0x3a, 0x3f, 0x5c, 0x64, + 0x5c, 0x64, 0x29, 0x3f, 0x29, 0x3f, 0x24, 0x2f, 0x69, 0x2c, 0x58, 0x69, + 0x29, 0x2c, 0x75, 0x72, 0x69, 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, 0x5b, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2b, + 0x5c, 0x2d, 0x2e, 0x5d, 0x2a, 0x3a, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, + 0x3f, 0x5c, 0x2f, 0x29, 0x3f, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, 0x2a, 0x24, + 0x2f, 0x69, 0x2c, 0x22, 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x2f, 0x5e, 0x28, 0x3f, 0x3a, + 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x2b, 0x5c, 0x2d, 0x2e, 0x5d, 0x2a, 0x3a, 0x29, 0x3f, + 0x5c, 0x2f, 0x3f, 0x5c, 0x2f, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5b, 0x5e, + 0x5c, 0x5c, 0x5c, 0x73, 0x23, 0x5d, 0x5b, 0x5e, 0x5c, 0x73, 0x23, 0x5d, + 0x2a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x23, 0x5b, 0x5e, 0x5c, 0x5c, 0x5c, + 0x73, 0x5d, 0x2a, 0x29, 0x3f, 0x24, 0x2f, 0x69, 0x2c, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x3a, 0x2f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x2e, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2f, 0x3d, 0x3f, + 0x5e, 0x5f, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0x2d, 0x5d, 0x2b, 0x40, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x30, 0x2c, 0x36, 0x31, + 0x7d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x28, + 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, + 0x7b, 0x30, 0x2c, 0x36, 0x31, 0x7d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5d, 0x29, 0x3f, 0x29, 0x2a, 0x24, 0x2f, 0x69, 0x7d, 0x3b, 0x45, + 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, + 0x73, 0x28, 0x45, 0x65, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x59, 0x70, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x25, 0x34, 0x3d, 0x3d, 0x3d, 0x30, 0x26, + 0x26, 0x28, 0x74, 0x25, 0x31, 0x30, 0x30, 0x21, 0x3d, 0x3d, 0x30, 0x7c, + 0x7c, 0x74, 0x25, 0x34, 0x30, 0x30, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x5a, 0x70, 0x3d, 0x2f, 0x5e, 0x28, 0x5c, 0x64, + 0x5c, 0x64, 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x2d, 0x28, 0x5c, 0x64, 0x5c, + 0x64, 0x29, 0x2d, 0x28, 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x24, 0x2f, 0x2c, + 0x51, 0x70, 0x3d, 0x5b, 0x30, 0x2c, 0x33, 0x31, 0x2c, 0x32, 0x38, 0x2c, + 0x33, 0x31, 0x2c, 0x33, 0x30, 0x2c, 0x33, 0x31, 0x2c, 0x33, 0x30, 0x2c, + 0x33, 0x31, 0x2c, 0x33, 0x31, 0x2c, 0x33, 0x30, 0x2c, 0x33, 0x31, 0x2c, + 0x33, 0x30, 0x2c, 0x33, 0x31, 0x5d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x69, 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x65, 0x3d, 0x5a, 0x70, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, + 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x65, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, + 0x2b, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x73, 0x3d, 0x2b, 0x65, 0x5b, 0x32, + 0x5d, 0x2c, 0x6e, 0x3d, 0x2b, 0x65, 0x5b, 0x33, 0x5d, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3e, 0x3d, 0x31, 0x26, 0x26, 0x73, + 0x3c, 0x3d, 0x31, 0x32, 0x26, 0x26, 0x6e, 0x3e, 0x3d, 0x31, 0x26, 0x26, + 0x6e, 0x3c, 0x3d, 0x28, 0x73, 0x3d, 0x3d, 0x3d, 0x32, 0x26, 0x26, 0x59, + 0x70, 0x28, 0x72, 0x29, 0x3f, 0x32, 0x39, 0x3a, 0x51, 0x70, 0x5b, 0x73, + 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x48, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x26, 0x26, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x3e, 0x65, 0x3f, 0x31, 0x3a, 0x74, 0x3c, 0x65, 0x3f, 0x2d, 0x31, 0x3a, + 0x30, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x55, 0x6e, 0x3d, 0x2f, 0x5e, 0x28, + 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x5c, 0x64, 0x29, + 0x3a, 0x28, 0x5c, 0x64, 0x5c, 0x64, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5c, + 0x64, 0x2b, 0x29, 0x3f, 0x29, 0x28, 0x7a, 0x7c, 0x28, 0x5b, 0x2b, 0x2d, + 0x5d, 0x29, 0x28, 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x28, 0x3f, 0x3a, 0x3a, + 0x3f, 0x28, 0x5c, 0x64, 0x5c, 0x64, 0x29, 0x29, 0x3f, 0x29, 0x3f, 0x24, + 0x2f, 0x69, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x46, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x55, 0x6e, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x28, 0x72, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x6e, 0x3d, 0x2b, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x61, 0x3d, 0x2b, + 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x6f, 0x3d, 0x2b, 0x73, 0x5b, 0x33, 0x5d, + 0x2c, 0x69, 0x3d, 0x73, 0x5b, 0x34, 0x5d, 0x2c, 0x63, 0x3d, 0x73, 0x5b, + 0x35, 0x5d, 0x3d, 0x3d, 0x3d, 0x22, 0x2d, 0x22, 0x3f, 0x2d, 0x31, 0x3a, + 0x31, 0x2c, 0x75, 0x3d, 0x2b, 0x28, 0x73, 0x5b, 0x36, 0x5d, 0x7c, 0x7c, + 0x30, 0x29, 0x2c, 0x64, 0x3d, 0x2b, 0x28, 0x73, 0x5b, 0x37, 0x5d, 0x7c, + 0x7c, 0x30, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x3e, 0x32, 0x33, 0x7c, + 0x7c, 0x64, 0x3e, 0x35, 0x39, 0x7c, 0x7c, 0x74, 0x26, 0x26, 0x21, 0x69, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x69, 0x66, + 0x28, 0x6e, 0x3c, 0x3d, 0x32, 0x33, 0x26, 0x26, 0x61, 0x3c, 0x3d, 0x35, + 0x39, 0x26, 0x26, 0x6f, 0x3c, 0x36, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x30, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x3d, 0x61, + 0x2d, 0x64, 0x2a, 0x63, 0x2c, 0x79, 0x3d, 0x6e, 0x2d, 0x75, 0x2a, 0x63, + 0x2d, 0x28, 0x6c, 0x3c, 0x30, 0x3f, 0x31, 0x3a, 0x30, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x79, 0x3d, 0x3d, 0x3d, 0x32, 0x33, + 0x7c, 0x7c, 0x79, 0x3d, 0x3d, 0x3d, 0x2d, 0x31, 0x29, 0x26, 0x26, 0x28, + 0x6c, 0x3d, 0x3d, 0x3d, 0x35, 0x39, 0x7c, 0x7c, 0x6c, 0x3d, 0x3d, 0x3d, + 0x2d, 0x31, 0x29, 0x26, 0x26, 0x6f, 0x3c, 0x36, 0x31, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x6e, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x74, 0x26, 0x26, + 0x65, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, + 0x28, 0x22, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x31, + 0x54, 0x22, 0x2b, 0x74, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, + 0x66, 0x28, 0x29, 0x2c, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, + 0x74, 0x65, 0x28, 0x22, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, + 0x30, 0x31, 0x54, 0x22, 0x2b, 0x65, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x4f, 0x66, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x26, 0x26, + 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2d, 0x73, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x69, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x74, + 0x26, 0x26, 0x65, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x72, 0x3d, 0x55, 0x6e, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x28, 0x74, 0x29, 0x2c, 0x73, 0x3d, 0x55, 0x6e, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x28, 0x65, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x26, 0x26, + 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3d, 0x72, + 0x5b, 0x31, 0x5d, 0x2b, 0x72, 0x5b, 0x32, 0x5d, 0x2b, 0x72, 0x5b, 0x33, + 0x5d, 0x2c, 0x65, 0x3d, 0x73, 0x5b, 0x31, 0x5d, 0x2b, 0x73, 0x5b, 0x32, + 0x5d, 0x2b, 0x73, 0x5b, 0x33, 0x5d, 0x2c, 0x74, 0x3e, 0x65, 0x3f, 0x31, + 0x3a, 0x74, 0x3c, 0x65, 0x3f, 0x2d, 0x31, 0x3a, 0x30, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x4c, 0x6e, 0x3d, 0x2f, 0x74, 0x7c, 0x5c, 0x73, 0x2f, 0x69, + 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x69, + 0x28, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x46, 0x6e, + 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x6e, 0x3d, 0x73, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x28, 0x4c, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x3d, 0x3d, 0x32, + 0x26, 0x26, 0x5a, 0x69, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x26, 0x26, + 0x65, 0x28, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x69, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x74, 0x26, 0x26, 0x65, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x74, + 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x28, 0x29, 0x2c, + 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x65, + 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x28, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x72, 0x26, 0x26, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x2d, 0x73, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x69, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x21, 0x28, 0x74, 0x26, 0x26, 0x65, 0x29, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x5b, 0x72, 0x2c, + 0x73, 0x5d, 0x3d, 0x74, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x4c, + 0x6e, 0x29, 0x2c, 0x5b, 0x6e, 0x2c, 0x61, 0x5d, 0x3d, 0x65, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x4c, 0x6e, 0x29, 0x2c, 0x6f, 0x3d, 0x48, + 0x6e, 0x28, 0x72, 0x2c, 0x6e, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x21, + 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7c, 0x7c, 0x47, 0x6e, 0x28, 0x73, 0x2c, + 0x61, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x42, 0x70, 0x3d, 0x2f, 0x5c, + 0x2f, 0x7c, 0x3a, 0x2f, 0x2c, 0x58, 0x70, 0x3d, 0x2f, 0x5e, 0x28, 0x3f, + 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x2b, 0x5c, 0x2d, 0x2e, 0x5d, 0x2a, 0x3a, 0x29, 0x28, 0x3f, 0x3a, + 0x5c, 0x2f, 0x3f, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, + 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x5d, + 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, + 0x7d, 0x29, 0x2a, 0x40, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, 0x5b, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x3a, 0x29, 0x7b, 0x36, 0x7d, 0x7c, 0x3a, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x3a, 0x29, 0x7b, 0x35, 0x7d, 0x7c, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x3f, + 0x3a, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x34, 0x7d, 0x7c, + 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, + 0x31, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, + 0x29, 0x7b, 0x33, 0x7d, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x32, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, + 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x32, 0x7d, 0x7c, 0x28, 0x3f, + 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, + 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x33, 0x7d, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, + 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, + 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x7c, 0x28, 0x3f, 0x3a, 0x28, + 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x34, 0x7d, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x29, + 0x3f, 0x3a, 0x3a, 0x29, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x7c, 0x28, + 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, 0x5d, + 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x5b, 0x30, + 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x3f, 0x29, 0x5c, 0x2e, 0x29, + 0x7b, 0x33, 0x7d, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, 0x30, 0x2d, 0x35, + 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, 0x64, 0x7c, 0x5b, + 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x3f, 0x29, 0x29, 0x7c, + 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, + 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, + 0x35, 0x7d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, + 0x2c, 0x34, 0x7d, 0x29, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, 0x7c, 0x28, 0x3f, 0x3a, + 0x28, 0x3f, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, + 0x31, 0x2c, 0x34, 0x7d, 0x3a, 0x29, 0x7b, 0x30, 0x2c, 0x36, 0x7d, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x31, 0x2c, 0x34, 0x7d, + 0x29, 0x3f, 0x3a, 0x3a, 0x29, 0x7c, 0x5b, 0x56, 0x76, 0x5d, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x2b, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x5d, 0x2b, 0x29, + 0x5c, 0x5d, 0x7c, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x32, 0x35, 0x5b, + 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, 0x5c, + 0x64, 0x7c, 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, 0x3f, + 0x29, 0x5c, 0x2e, 0x29, 0x7b, 0x33, 0x7d, 0x28, 0x3f, 0x3a, 0x32, 0x35, + 0x5b, 0x30, 0x2d, 0x35, 0x5d, 0x7c, 0x32, 0x5b, 0x30, 0x2d, 0x34, 0x5d, + 0x5c, 0x64, 0x7c, 0x5b, 0x30, 0x31, 0x5d, 0x3f, 0x5c, 0x64, 0x5c, 0x64, + 0x3f, 0x29, 0x7c, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, 0x28, 0x3f, + 0x3a, 0x3a, 0x5c, 0x64, 0x2a, 0x29, 0x3f, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, + 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, + 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, + 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, 0x2a, 0x7c, 0x5c, + 0x2f, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, + 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, 0x5b, + 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2b, + 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, 0x25, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, + 0x2a, 0x29, 0x2a, 0x29, 0x3f, 0x7c, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, 0x7c, + 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, + 0x29, 0x2b, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x28, 0x3f, 0x3a, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x5d, + 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, + 0x7d, 0x29, 0x2a, 0x29, 0x2a, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x3f, 0x28, + 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x2e, + 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x3b, + 0x3d, 0x3a, 0x40, 0x2f, 0x3f, 0x5d, 0x7c, 0x25, 0x5b, 0x30, 0x2d, 0x39, + 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, 0x2a, 0x29, 0x3f, 0x28, + 0x3f, 0x3a, 0x23, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5c, 0x2d, 0x2e, 0x5f, 0x7e, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x3b, 0x3d, 0x3a, 0x40, 0x2f, 0x3f, 0x5d, 0x7c, 0x25, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x5d, 0x7b, 0x32, 0x7d, 0x29, + 0x2a, 0x29, 0x3f, 0x24, 0x2f, 0x69, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x70, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x28, 0x74, 0x29, 0x26, 0x26, 0x58, 0x70, 0x2e, 0x74, 0x65, 0x73, 0x74, + 0x28, 0x74, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x57, 0x69, 0x3d, 0x2f, + 0x5e, 0x28, 0x3f, 0x3a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, + 0x2d, 0x39, 0x2b, 0x2f, 0x5d, 0x7b, 0x34, 0x7d, 0x29, 0x2a, 0x28, 0x3f, + 0x3a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2b, + 0x2f, 0x5d, 0x7b, 0x32, 0x7d, 0x3d, 0x3d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2b, 0x2f, 0x5d, 0x7b, 0x33, 0x7d, + 0x3d, 0x29, 0x3f, 0x24, 0x2f, 0x67, 0x6d, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x57, 0x69, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x2c, 0x57, 0x69, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x68, 0x3d, 0x2d, 0x28, 0x32, 0x2a, 0x2a, 0x33, 0x31, 0x29, 0x2c, + 0x73, 0x68, 0x3d, 0x32, 0x2a, 0x2a, 0x33, 0x31, 0x2d, 0x31, 0x3b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x68, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x28, 0x74, 0x29, 0x26, 0x26, 0x74, 0x3c, 0x3d, 0x73, 0x68, 0x26, + 0x26, 0x74, 0x3e, 0x3d, 0x72, 0x68, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x74, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x69, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x68, 0x3d, 0x2f, 0x5b, 0x5e, 0x5c, 0x5c, + 0x5d, 0x5c, 0x5c, 0x5a, 0x2f, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x6f, 0x68, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x74, 0x72, 0x79, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x52, + 0x65, 0x67, 0x45, 0x78, 0x70, 0x28, 0x74, 0x29, 0x2c, 0x21, 0x30, 0x7d, + 0x63, 0x61, 0x74, 0x63, 0x68, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x21, 0x31, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x63, 0x3d, 0x70, 0x28, 0x4a, 0x6e, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, + 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4a, 0x6e, 0x2c, 0x22, + 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x63, 0x68, 0x3d, 0x54, 0x73, 0x28, 0x29, 0x2c, + 0x75, 0x68, 0x3d, 0x59, 0x73, 0x28, 0x29, 0x2c, 0x64, 0x68, 0x3d, 0x24, + 0x6e, 0x28, 0x29, 0x2c, 0x6c, 0x68, 0x3d, 0x54, 0x6e, 0x28, 0x29, 0x2c, + 0x74, 0x63, 0x3d, 0x4d, 0x6e, 0x28, 0x29, 0x2c, 0x66, 0x68, 0x3d, 0x5b, + 0x63, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x75, + 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x28, 0x30, + 0x2c, 0x64, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, + 0x28, 0x29, 0x2c, 0x6c, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2c, 0x74, 0x63, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x2c, + 0x74, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, + 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, 0x79, 0x5d, 0x3b, 0x4a, 0x6e, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x66, 0x68, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x57, 0x6e, 0x3d, 0x70, 0x28, 0x28, + 0x6d, 0x24, 0x2c, 0x6d, 0x68, 0x29, 0x3d, 0x3e, 0x7b, 0x6d, 0x68, 0x2e, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x7b, 0x24, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2d, 0x30, + 0x37, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x23, 0x22, 0x2c, 0x24, + 0x69, 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2d, 0x30, 0x37, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x23, 0x22, 0x2c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3a, 0x22, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x6d, 0x69, 0x6e, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x31, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x7d, + 0x2c, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, 0x2c, 0x6e, + 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x30, 0x3a, 0x7b, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x7b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x3a, 0x30, 0x7d, 0x5d, 0x7d, 0x2c, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x3a, + 0x5b, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x2c, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x5d, 0x7d, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3a, 0x5b, 0x5d, 0x7d, 0x7d, 0x2c, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, 0x2c, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x69, 0x64, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x3a, 0x22, 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x22, 0x7d, 0x2c, 0x24, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, + 0x22, 0x75, 0x72, 0x69, 0x22, 0x7d, 0x2c, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x75, + 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x22, 0x7d, 0x2c, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x7d, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x21, 0x31, 0x7d, 0x2c, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, + 0x30, 0x7d, 0x2c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, + 0x2c, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, + 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, + 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x22, + 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, + 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x7d, 0x5d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x21, 0x31, 0x7d, 0x2c, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, + 0x7d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, + 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x61, + 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x6d, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x2c, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, + 0x5b, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x7d, 0x2c, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x5d, 0x7d, 0x2c, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x69, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x74, 0x68, 0x65, 0x6e, 0x3a, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x65, 0x6c, + 0x73, 0x65, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, + 0x7d, 0x2c, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x61, 0x6e, 0x79, 0x4f, 0x66, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, + 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x6e, 0x6f, 0x74, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x7d, 0x2c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x21, 0x30, 0x7d, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x5a, 0x6e, 0x3d, 0x70, 0x28, 0x28, 0x4c, 0x2c, 0x59, + 0x6e, 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x4c, 0x2e, 0x4d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x4c, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x4c, 0x2e, 0x43, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x6e, 0x3d, 0x4c, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x4c, 0x2e, 0x6e, 0x69, 0x6c, 0x3d, 0x4c, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x3d, 0x4c, 0x2e, 0x73, 0x74, 0x72, 0x3d, + 0x4c, 0x2e, 0x5f, 0x3d, 0x4c, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x43, 0x78, 0x74, 0x3d, 0x4c, 0x2e, 0x41, 0x6a, 0x76, 0x3d, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x68, + 0x3d, 0x6b, 0x73, 0x28, 0x29, 0x2c, 0x68, 0x68, 0x3d, 0x72, 0x63, 0x28, + 0x29, 0x2c, 0x79, 0x68, 0x3d, 0x7a, 0x6e, 0x28, 0x29, 0x2c, 0x73, 0x63, + 0x3d, 0x57, 0x6e, 0x28, 0x29, 0x2c, 0x24, 0x68, 0x3d, 0x5b, 0x22, 0x2f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x5d, + 0x2c, 0x49, 0x72, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2d, 0x30, 0x37, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x68, 0x74, 0x3d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x73, 0x20, 0x70, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x7b, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2e, 0x5f, 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x2c, 0x68, 0x68, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x45, + 0x61, 0x63, 0x68, 0x28, 0x65, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x64, 0x64, 0x56, 0x6f, 0x63, 0x61, 0x62, 0x75, 0x6c, 0x61, 0x72, + 0x79, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, 0x79, + 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x5f, + 0x61, 0x64, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x5f, 0x61, 0x64, 0x64, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x29, 0x2c, 0x21, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x65, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x24, + 0x64, 0x61, 0x74, 0x61, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x28, 0x73, 0x63, 0x2c, 0x24, 0x68, 0x29, 0x3a, 0x73, 0x63, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x4d, 0x65, 0x74, 0x61, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x65, 0x2c, 0x49, 0x72, 0x2c, + 0x21, 0x31, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x66, + 0x73, 0x5b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x5d, 0x3d, 0x49, + 0x72, 0x7d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x3d, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x28, 0x29, 0x7c, 0x7c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x49, 0x72, + 0x29, 0x3f, 0x49, 0x72, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x29, + 0x7d, 0x7d, 0x3b, 0x4c, 0x2e, 0x41, 0x6a, 0x76, 0x3d, 0x68, 0x74, 0x3b, + 0x59, 0x6e, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x4c, + 0x3d, 0x68, 0x74, 0x3b, 0x59, 0x6e, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x2e, 0x41, 0x6a, 0x76, 0x3d, 0x68, 0x74, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x5f, + 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x4c, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x68, 0x74, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x5f, 0x68, 0x3d, 0x47, 0x65, 0x28, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, + 0x22, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, 0x74, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x68, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x78, 0x74, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, + 0x74, 0x3d, 0x45, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x5f, 0x22, 0x2c, 0x7b, 0x65, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, + 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, + 0x74, 0x2e, 0x5f, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x22, + 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x7d, 0x7d, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x22, 0x2c, + 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, + 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x79, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x7b, + 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, + 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x79, 0x74, 0x2e, 0x6e, 0x69, 0x6c, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x74, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x7d, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, + 0x6e, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x79, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x6e, 0x7d, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, 0x68, + 0x3d, 0x6b, 0x74, 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4c, 0x2c, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, + 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, + 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x67, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x68, 0x3d, 0x69, 0x74, + 0x28, 0x29, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x4c, 0x2c, 0x22, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x66, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x7b, 0x65, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, + 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x68, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x7d, 0x29, 0x7d, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x63, 0x3d, 0x70, 0x28, 0x24, + 0x74, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x24, 0x74, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x24, 0x74, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x62, 0x68, 0x3d, 0x5a, 0x6e, + 0x28, 0x29, 0x2c, 0x79, 0x65, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x43, 0x65, + 0x3d, 0x79, 0x65, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x73, 0x2c, 0x52, 0x72, 0x3d, 0x7b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, + 0x74, 0x72, 0x3a, 0x22, 0x3c, 0x3d, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x43, + 0x65, 0x2e, 0x4c, 0x54, 0x45, 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x43, + 0x65, 0x2e, 0x47, 0x54, 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, + 0x74, 0x72, 0x3a, 0x22, 0x3e, 0x3d, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x43, + 0x65, 0x2e, 0x47, 0x54, 0x45, 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x43, + 0x65, 0x2e, 0x4c, 0x54, 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x3a, + 0x22, 0x3c, 0x22, 0x2c, 0x6f, 0x6b, 0x3a, 0x43, 0x65, 0x2e, 0x4c, 0x54, + 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x3a, 0x43, 0x65, 0x2e, 0x47, 0x54, 0x45, + 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x45, 0x78, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x3a, 0x7b, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x3a, 0x22, 0x3e, 0x22, 0x2c, + 0x6f, 0x6b, 0x3a, 0x43, 0x65, 0x2e, 0x47, 0x54, 0x2c, 0x66, 0x61, 0x69, + 0x6c, 0x3a, 0x43, 0x65, 0x2e, 0x4c, 0x54, 0x45, 0x7d, 0x7d, 0x2c, 0x77, + 0x68, 0x3d, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x28, + 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x74, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x7d, + 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, 0x73, 0x74, 0x72, + 0x29, 0x60, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, + 0x24, 0x7b, 0x52, 0x72, 0x5b, 0x74, 0x5d, 0x2e, 0x6f, 0x6b, 0x53, 0x74, + 0x72, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x60, 0x2c, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x3a, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x74, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, + 0x64, 0x65, 0x3a, 0x65, 0x7d, 0x29, 0x3d, 0x3e, 0x28, 0x30, 0x2c, 0x79, + 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x7b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x3a, 0x20, 0x24, 0x7b, 0x52, 0x72, 0x5b, 0x74, + 0x5d, 0x2e, 0x6f, 0x6b, 0x53, 0x74, 0x72, 0x7d, 0x2c, 0x20, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x3a, 0x20, 0x24, 0x7b, 0x65, 0x7d, 0x7d, 0x60, 0x7d, + 0x3b, 0x24, 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x52, + 0x72, 0x29, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x21, 0x30, 0x2c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x65, + 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x72, 0x2c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x2c, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x6e, 0x2c, 0x69, 0x74, 0x3a, 0x61, 0x7d, + 0x3d, 0x74, 0x2c, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x6f, 0x2c, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x69, 0x7d, 0x3d, 0x61, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x6f, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x62, 0x68, 0x2e, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x78, + 0x74, 0x28, 0x61, 0x2c, 0x69, 0x2e, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x2e, + 0x61, 0x6c, 0x6c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x29, 0x3b, 0x63, 0x2e, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x3f, 0x75, 0x28, 0x29, 0x3a, 0x64, 0x28, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x79, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x69, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2c, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x6f, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x7d, 0x29, 0x2c, 0x68, 0x3d, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x66, 0x6d, 0x74, 0x22, 0x2c, 0x28, + 0x30, 0x2c, 0x79, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x79, 0x7d, + 0x5b, 0x24, 0x7b, 0x63, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, + 0x6f, 0x64, 0x65, 0x7d, 0x5d, 0x60, 0x29, 0x3b, 0x74, 0x2e, 0x66, 0x61, + 0x69, 0x6c, 0x24, 0x64, 0x61, 0x74, 0x61, 0x28, 0x28, 0x30, 0x2c, 0x79, + 0x65, 0x2e, 0x6f, 0x72, 0x29, 0x28, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, + 0x68, 0x7d, 0x20, 0x21, 0x3d, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x60, 0x2c, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, 0x5f, 0x29, + 0x60, 0x24, 0x7b, 0x68, 0x7d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x60, + 0x2c, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, 0x5f, 0x29, 0x60, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x68, 0x7d, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x2c, 0x6c, 0x28, 0x68, + 0x29, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x79, 0x3d, 0x63, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2c, 0x68, 0x3d, 0x69, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x5b, 0x79, 0x5d, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x68, 0x7c, 0x7c, 0x68, 0x3d, 0x3d, 0x3d, 0x21, 0x30, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x68, 0x21, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x7c, 0x7c, 0x68, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x67, 0x45, + 0x78, 0x70, 0x7c, 0x7c, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x68, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x21, 0x3d, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x60, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x3a, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x24, 0x7b, 0x79, 0x7d, 0x22, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, + 0x22, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x22, 0x2c, 0x7b, 0x6b, 0x65, 0x79, 0x3a, 0x79, + 0x2c, 0x72, 0x65, 0x66, 0x3a, 0x68, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, + 0x6f, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x73, 0x3f, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, 0x5f, 0x29, 0x60, + 0x24, 0x7b, 0x6f, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x7d, 0x24, 0x7b, 0x28, 0x30, 0x2c, 0x79, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x29, 0x28, 0x79, 0x29, 0x7d, 0x60, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x30, 0x7d, 0x29, 0x3b, 0x74, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x24, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x6c, 0x28, 0x66, 0x29, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x79, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x30, 0x2c, 0x79, 0x65, 0x2e, + 0x5f, 0x29, 0x60, 0x24, 0x7b, 0x79, 0x7d, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x65, 0x28, 0x24, 0x7b, 0x72, 0x7d, 0x2c, 0x20, 0x24, 0x7b, + 0x73, 0x7d, 0x29, 0x20, 0x24, 0x7b, 0x52, 0x72, 0x5b, 0x6e, 0x5d, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x7d, 0x20, 0x30, 0x60, 0x7d, 0x7d, 0x2c, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3a, + 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x5d, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x45, 0x68, 0x3d, 0x74, 0x3d, 0x3e, 0x28, 0x74, + 0x2e, 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, + 0x24, 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x29, 0x2c, 0x74, 0x29, 0x3b, 0x24, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x3d, 0x45, 0x68, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x63, 0x63, 0x3d, 0x70, 0x28, 0x28, 0x4a, 0x74, 0x2c, 0x69, 0x63, + 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x4a, 0x74, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5f, + 0x74, 0x3d, 0x65, 0x63, 0x28, 0x29, 0x2c, 0x50, 0x68, 0x3d, 0x6e, 0x63, + 0x28, 0x29, 0x2c, 0x51, 0x6e, 0x3d, 0x45, 0x28, 0x29, 0x2c, 0x61, 0x63, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x51, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x28, 0x22, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x22, 0x29, 0x2c, 0x53, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x51, + 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x66, 0x61, 0x73, 0x74, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x22, 0x29, 0x2c, 0x42, 0x6e, + 0x3d, 0x28, 0x74, 0x2c, 0x65, 0x3d, 0x7b, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3d, 0x3e, 0x7b, 0x69, + 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x65, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x5f, 0x74, 0x2e, + 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2c, + 0x61, 0x63, 0x29, 0x2c, 0x74, 0x3b, 0x6c, 0x65, 0x74, 0x5b, 0x72, 0x2c, + 0x73, 0x5d, 0x3d, 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x3d, + 0x22, 0x66, 0x61, 0x73, 0x74, 0x22, 0x3f, 0x5b, 0x5f, 0x74, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2c, 0x53, + 0x68, 0x5d, 0x3a, 0x5b, 0x5f, 0x74, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2c, 0x61, 0x63, 0x5d, 0x2c, 0x6e, + 0x3d, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x7c, 0x7c, + 0x5f, 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x63, + 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x72, 0x2c, 0x73, 0x29, 0x2c, 0x65, 0x2e, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x26, 0x26, 0x28, 0x30, + 0x2c, 0x50, 0x68, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, + 0x28, 0x74, 0x29, 0x2c, 0x74, 0x7d, 0x3b, 0x42, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x3d, 0x28, 0x74, 0x2c, 0x65, 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c, + 0x22, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x3d, 0x28, + 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x66, 0x61, 0x73, 0x74, 0x22, 0x3f, 0x5f, + 0x74, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x3a, 0x5f, 0x74, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x29, 0x5b, 0x74, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, + 0x24, 0x7b, 0x74, 0x7d, 0x22, 0x60, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x63, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x73, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x61, 0x3b, 0x28, + 0x6e, 0x3d, 0x28, 0x61, 0x3d, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x63, 0x6f, 0x64, 0x65, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x29, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x26, 0x26, 0x6e, + 0x21, 0x3d, 0x3d, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7c, 0x7c, 0x28, + 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x3d, 0x28, 0x30, + 0x2c, 0x51, 0x6e, 0x2e, 0x5f, 0x29, 0x60, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x2d, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x73, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x2f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x73, 0x22, 0x29, 0x2e, 0x24, 0x7b, 0x73, 0x7d, 0x60, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x20, + 0x6f, 0x66, 0x20, 0x65, 0x29, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6f, 0x2c, 0x72, 0x5b, 0x6f, 0x5d, 0x29, + 0x7d, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, + 0x4a, 0x74, 0x3d, 0x42, 0x6e, 0x3b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x4a, 0x74, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x4a, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x42, 0x6e, 0x7d, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x66, 0x63, 0x3d, 0x70, 0x28, 0x28, 0x65, 0x61, + 0x2c, 0x74, 0x61, 0x29, 0x3d, 0x3e, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x65, 0x61, 0x2c, 0x22, 0x5f, 0x5f, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x5f, 0x3d, 0x5a, 0x6e, 0x28, 0x29, 0x2c, 0x44, 0x65, 0x3d, + 0x45, 0x28, 0x29, 0x2c, 0x75, 0x63, 0x3d, 0x42, 0x65, 0x28, 0x29, 0x2c, + 0x6a, 0x68, 0x3d, 0x47, 0x65, 0x28, 0x29, 0x2c, 0x57, 0x74, 0x3d, 0x74, + 0x74, 0x28, 0x29, 0x2c, 0x24, 0x65, 0x3d, 0x6f, 0x65, 0x28, 0x29, 0x2c, + 0x54, 0x72, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x7a, 0x65, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x5f, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x65, 0x6d, 0x55, + 0x73, 0x65, 0x64, 0x22, 0x29, 0x2c, 0x64, 0x63, 0x3d, 0x7b, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x22, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, + 0x2c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, + 0x73, 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, + 0x2c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x22, 0x7d, 0x2c, 0x6c, 0x63, 0x3d, 0x2f, 0x5c, + 0x24, 0x5c, 0x7b, 0x5b, 0x5e, 0x7d, 0x5d, 0x2b, 0x5c, 0x7d, 0x2f, 0x2c, + 0x71, 0x68, 0x3d, 0x2f, 0x5c, 0x24, 0x5c, 0x7b, 0x28, 0x5b, 0x5e, 0x7d, + 0x5d, 0x2b, 0x29, 0x5c, 0x7d, 0x2f, 0x67, 0x2c, 0x4e, 0x68, 0x3d, 0x2f, + 0x5e, 0x22, 0x22, 0x5c, 0x73, 0x2a, 0x5c, 0x2b, 0x5c, 0x73, 0x2a, 0x7c, + 0x5c, 0x73, 0x2a, 0x5c, 0x2b, 0x5c, 0x73, 0x2a, 0x22, 0x22, 0x24, 0x2f, + 0x67, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, + 0x68, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x54, 0x72, 0x2c, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x5d, 0x2c, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x21, + 0x30, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x7b, 0x67, 0x65, 0x6e, 0x3a, 0x72, 0x2c, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x73, 0x2c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x6e, 0x2c, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x61, 0x2c, 0x69, 0x74, 0x3a, 0x6f, 0x7d, 0x3d, 0x65, 0x3b, 0x69, 0x66, + 0x28, 0x6f, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3d, 0x3d, 0x3d, 0x21, 0x31, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x6e, 0x2c, + 0x63, 0x3d, 0x44, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x2c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x61, + 0x74, 0x68, 0x29, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x5f, 0x2e, 0x5f, + 0x60, 0x24, 0x7b, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x20, 0x3e, 0x20, + 0x30, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x69, 0x3d, 0x3d, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x5b, 0x77, + 0x2c, 0x4e, 0x5d, 0x3d, 0x64, 0x28, 0x69, 0x29, 0x3b, 0x4e, 0x26, 0x26, + 0x6c, 0x28, 0x4e, 0x29, 0x2c, 0x77, 0x26, 0x26, 0x79, 0x28, 0x77, 0x29, + 0x2c, 0x68, 0x28, 0x75, 0x28, 0x69, 0x29, 0x29, 0x7d, 0x6c, 0x65, 0x74, + 0x20, 0x76, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x69, 0x3d, + 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x69, 0x3a, + 0x69, 0x2e, 0x5f, 0x3b, 0x76, 0x26, 0x26, 0x66, 0x28, 0x76, 0x29, 0x2c, + 0x74, 0x2e, 0x6b, 0x65, 0x65, 0x70, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x7c, 0x7c, 0x6d, 0x28, 0x29, 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x7b, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x76, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x77, 0x7d, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x4e, + 0x3d, 0x7b, 0x7d, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x29, 0x7b, 0x4e, 0x2e, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x7a, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x29, + 0x4e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x5b, 0x7a, 0x5d, 0x3d, 0x5b, + 0x5d, 0x7d, 0x69, 0x66, 0x28, 0x77, 0x29, 0x7b, 0x4e, 0x2e, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x7a, 0x3d, 0x30, 0x3b, 0x7a, 0x3c, 0x77, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x7a, 0x2b, 0x2b, 0x29, 0x4e, 0x2e, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x7a, 0x5d, 0x3d, 0x5b, 0x5d, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x76, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x77, 0x2c, 0x4e, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x7a, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x7a, 0x3d, 0x3d, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x7c, 0x7c, 0x7a, 0x3d, 0x3d, 0x3d, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x29, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x48, 0x3d, 0x76, + 0x5b, 0x7a, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x48, 0x3d, 0x3d, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x29, 0x7b, 0x77, 0x7c, 0x7c, 0x28, 0x77, 0x3d, 0x7b, 0x7d, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x47, 0x3d, 0x77, 0x5b, 0x7a, 0x5d, 0x3d, + 0x7b, 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x54, + 0x20, 0x69, 0x6e, 0x20, 0x48, 0x29, 0x47, 0x5b, 0x54, 0x5d, 0x3d, 0x5b, + 0x5d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x4e, 0x7c, 0x7c, 0x28, 0x4e, + 0x3d, 0x7b, 0x7d, 0x29, 0x2c, 0x4e, 0x5b, 0x7a, 0x5d, 0x3d, 0x5b, 0x5d, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x77, 0x2c, 0x4e, 0x5d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, + 0x76, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x77, 0x3d, 0x72, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x65, 0x6d, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x22, 0x2c, 0x5f, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x79, 0x28, 0x76, 0x29, 0x29, 0x2c, 0x4e, 0x3d, 0x72, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x2c, 0x71, 0x28, 0x76, 0x2c, 0x6e, 0x29, + 0x29, 0x3b, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, 0x22, 0x65, + 0x72, 0x72, 0x22, 0x2c, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x54, + 0x3d, 0x3e, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x24, 0x28, 0x54, 0x2c, 0x77, + 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, 0x5b, 0x24, 0x7b, + 0x54, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5d, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, 0x54, 0x7d, 0x29, 0x60, 0x29, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x5f, 0x2e, 0x5f, 0x60, + 0x24, 0x7b, 0x54, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, 0x65, 0x7d, 0x60, 0x2c, + 0x21, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x7b, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x7a, 0x7d, + 0x3d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x7a, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x54, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x22, + 0x22, 0x60, 0x29, 0x2c, 0x44, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x5b, 0x5d, 0x60, 0x29, 0x3b, + 0x48, 0x28, 0x69, 0x65, 0x3d, 0x3e, 0x7b, 0x72, 0x2e, 0x69, 0x66, 0x28, + 0x54, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x54, 0x7d, 0x20, 0x2b, 0x3d, + 0x20, 0x24, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x7a, 0x3d, + 0x3d, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x7a, 0x3a, + 0x22, 0x3b, 0x22, 0x7d, 0x60, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x54, 0x7d, 0x20, + 0x2b, 0x3d, 0x20, 0x24, 0x7b, 0x47, 0x28, 0x69, 0x65, 0x29, 0x7d, 0x60, + 0x29, 0x2c, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x44, + 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x44, 0x7d, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x24, 0x7b, 0x77, 0x7d, 0x5b, 0x24, 0x7b, + 0x69, 0x65, 0x7d, 0x5d, 0x29, 0x60, 0x29, 0x7d, 0x29, 0x2c, 0x57, 0x74, + 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x65, 0x2c, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, + 0x54, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x5f, 0x2e, 0x5f, + 0x60, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x20, 0x24, 0x7b, + 0x44, 0x7d, 0x7d, 0x60, 0x7d, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x48, 0x28, 0x54, 0x3d, 0x3e, 0x57, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x47, 0x28, 0x54, 0x29, 0x2c, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x5f, 0x2e, 0x5f, 0x60, 0x7b, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x77, 0x7d, + 0x5b, 0x24, 0x7b, 0x54, 0x7d, 0x5d, 0x7d, 0x60, 0x7d, 0x29, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x28, 0x54, + 0x29, 0x7b, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, + 0x65, 0x79, 0x22, 0x2c, 0x77, 0x2c, 0x44, 0x3d, 0x3e, 0x72, 0x2e, 0x69, + 0x66, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, 0x5b, 0x24, + 0x7b, 0x44, 0x7d, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, + 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x54, 0x28, 0x44, 0x29, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x28, 0x54, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x2e, 0x5f, + 0x60, 0x24, 0x7b, 0x54, 0x7d, 0x20, 0x69, 0x6e, 0x20, 0x24, 0x7b, 0x4e, + 0x7d, 0x20, 0x3f, 0x20, 0x24, 0x7b, 0x4e, 0x7d, 0x5b, 0x24, 0x7b, 0x54, + 0x7d, 0x5d, 0x28, 0x29, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x5b, + 0x24, 0x7b, 0x54, 0x7d, 0x5d, 0x60, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x76, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x77, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, + 0x22, 0x65, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x5f, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x76, + 0x29, 0x29, 0x2c, 0x4e, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x44, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x29, 0x4e, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x44, 0x2c, 0x71, 0x28, 0x76, + 0x5b, 0x44, 0x5d, 0x2c, 0x6e, 0x5b, 0x44, 0x5d, 0x29, 0x5d, 0x29, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x7a, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x28, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x22, 0x2c, 0x72, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x2e, + 0x2e, 0x2e, 0x4e, 0x29, 0x29, 0x2c, 0x48, 0x3d, 0x72, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x22, 0x6f, 0x62, + 0x6a, 0x22, 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x64, 0x63, 0x2c, 0x63, + 0x6f, 0x64, 0x65, 0x3a, 0x5f, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x79, 0x28, 0x64, 0x63, 0x29, 0x7d, 0x29, 0x2c, 0x47, 0x3d, + 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x65, 0x6d, 0x50, 0x72, 0x6f, + 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x29, 0x2c, 0x54, 0x3d, + 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x65, 0x6d, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x29, 0x3b, + 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, 0x22, 0x65, 0x72, 0x72, + 0x22, 0x2c, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x44, 0x3d, 0x3e, + 0x72, 0x2e, 0x69, 0x66, 0x28, 0x24, 0x28, 0x44, 0x2c, 0x77, 0x29, 0x2c, + 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x47, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x48, 0x7d, + 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x5d, 0x60, 0x29, 0x2c, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x54, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, + 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x5d, 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x2e, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x5b, 0x24, 0x7b, 0x47, 0x7d, 0x5d, 0x5d, 0x60, 0x29, 0x2c, + 0x72, 0x2e, 0x69, 0x66, 0x28, 0x54, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, + 0x54, 0x7d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, 0x44, 0x7d, + 0x29, 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x5f, + 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x44, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, 0x65, + 0x7d, 0x60, 0x2c, 0x21, 0x30, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x72, + 0x2e, 0x66, 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x22, + 0x2c, 0x77, 0x2c, 0x44, 0x3d, 0x3e, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x49, + 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x22, 0x2c, + 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, 0x5b, 0x24, 0x7b, 0x44, + 0x7d, 0x5d, 0x60, 0x2c, 0x69, 0x65, 0x3d, 0x3e, 0x7b, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x54, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, + 0x24, 0x7b, 0x77, 0x7d, 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x5d, 0x5b, 0x24, + 0x7b, 0x69, 0x65, 0x7d, 0x5d, 0x60, 0x29, 0x2c, 0x72, 0x2e, 0x69, 0x66, + 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x54, 0x7d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x56, 0x65, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x28, 0x22, 0x74, 0x6d, 0x70, 0x6c, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, + 0x60, 0x24, 0x7b, 0x7a, 0x7d, 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x5d, 0x20, + 0x26, 0x26, 0x20, 0x24, 0x7b, 0x7a, 0x7d, 0x5b, 0x24, 0x7b, 0x44, 0x7d, + 0x5d, 0x5b, 0x24, 0x7b, 0x69, 0x65, 0x7d, 0x5d, 0x60, 0x29, 0x3b, 0x57, + 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x65, 0x2c, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x3a, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x56, 0x65, 0x7d, 0x20, 0x3f, + 0x20, 0x24, 0x7b, 0x56, 0x65, 0x7d, 0x28, 0x29, 0x20, 0x3a, 0x20, 0x24, + 0x7b, 0x61, 0x7d, 0x5b, 0x24, 0x7b, 0x44, 0x7d, 0x5d, 0x5b, 0x24, 0x7b, + 0x69, 0x65, 0x7d, 0x5d, 0x60, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x5f, 0x2e, 0x5f, 0x60, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3a, 0x20, 0x24, 0x7b, 0x54, 0x7d, 0x7d, 0x60, 0x7d, 0x29, 0x7d, 0x29, + 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x28, 0x76, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x7b, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x3a, 0x77, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, + 0x4e, 0x7d, 0x3d, 0x76, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x77, 0x26, 0x26, + 0x21, 0x4e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x7a, 0x3d, 0x5f, 0x2e, 0x5f, 0x60, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x24, 0x7b, 0x73, 0x7d, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x60, 0x2c, 0x48, 0x3d, 0x5f, + 0x2e, 0x5f, 0x60, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x24, 0x7b, 0x73, 0x7d, 0x29, 0x60, 0x2c, + 0x47, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x65, 0x6d, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x29, 0x2c, 0x54, 0x2c, 0x44, 0x2c, + 0x69, 0x65, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, 0x22, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x29, 0x3b, 0x77, 0x26, + 0x26, 0x4e, 0x3f, 0x28, 0x54, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x74, 0x28, + 0x22, 0x65, 0x6d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x4b, 0x77, 0x64, 0x22, + 0x29, 0x2c, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x7a, 0x29, 0x2c, 0x72, 0x2e, + 0x69, 0x66, 0x28, 0x48, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x56, 0x65, + 0x28, 0x4e, 0x2c, 0x6e, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x2c, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x54, 0x2c, 0x5f, + 0x2e, 0x73, 0x74, 0x72, 0x60, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x60, 0x29, + 0x7d, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x56, 0x65, 0x28, 0x77, 0x2c, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x29, 0x2c, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x54, + 0x2c, 0x5f, 0x2e, 0x73, 0x74, 0x72, 0x60, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x60, 0x29, 0x7d, 0x29, 0x2c, 0x44, 0x3d, + 0x5f, 0x2e, 0x5f, 0x60, 0x5b, 0x24, 0x7b, 0x54, 0x7d, 0x5d, 0x60, 0x29, + 0x3a, 0x4e, 0x3f, 0x28, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x48, 0x29, 0x2c, + 0x56, 0x65, 0x28, 0x4e, 0x2c, 0x6e, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x29, 0x2c, 0x44, 0x3d, 0x5f, 0x2e, 0x5f, 0x60, 0x2e, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x60, 0x29, 0x3a, 0x77, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x69, + 0x66, 0x28, 0x44, 0x65, 0x2e, 0x61, 0x6e, 0x64, 0x28, 0x7a, 0x2c, 0x44, + 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x28, 0x48, 0x29, 0x29, 0x29, 0x2c, 0x56, + 0x65, 0x28, 0x77, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x29, 0x2c, 0x44, 0x3d, 0x5f, 0x2e, 0x5f, 0x60, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x60, + 0x29, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, 0x28, 0x22, 0x65, + 0x72, 0x72, 0x22, 0x2c, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x61, + 0x65, 0x3d, 0x3e, 0x67, 0x28, 0x61, 0x65, 0x2c, 0x47, 0x2c, 0x4d, 0x72, + 0x3d, 0x3e, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x5f, 0x2e, 0x5f, + 0x60, 0x24, 0x7b, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x4d, 0x72, 0x7d, 0x5d, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, 0x61, 0x65, 0x7d, 0x29, + 0x60, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x61, 0x65, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, 0x65, + 0x7d, 0x60, 0x2c, 0x21, 0x30, 0x29, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x66, + 0x6f, 0x72, 0x49, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x47, + 0x2c, 0x61, 0x65, 0x3d, 0x3e, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x61, 0x65, 0x7d, + 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x60, 0x2c, 0x28, 0x29, + 0x3d, 0x3e, 0x7b, 0x57, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, 0x7b, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x3a, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x61, + 0x65, 0x7d, 0x20, 0x69, 0x6e, 0x20, 0x24, 0x7b, 0x69, 0x65, 0x7d, 0x20, + 0x3f, 0x20, 0x24, 0x7b, 0x69, 0x65, 0x7d, 0x5b, 0x24, 0x7b, 0x61, 0x65, + 0x7d, 0x5d, 0x28, 0x29, 0x20, 0x3a, 0x20, 0x24, 0x7b, 0x61, 0x7d, 0x24, + 0x7b, 0x44, 0x7d, 0x5b, 0x24, 0x7b, 0x61, 0x65, 0x7d, 0x5d, 0x60, 0x2c, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x5f, 0x2e, 0x5f, 0x60, 0x7b, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x20, 0x24, 0x7b, 0x47, 0x7d, + 0x5b, 0x24, 0x7b, 0x61, 0x65, 0x7d, 0x5d, 0x7d, 0x60, 0x7d, 0x29, 0x2c, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x5f, 0x2e, 0x5f, + 0x60, 0x24, 0x7b, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x5b, 0x24, + 0x7b, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x7d, 0x2d, 0x31, 0x5d, 0x2e, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x60, + 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x63, 0x7d, 0x20, 0x2b, 0x20, + 0x22, 0x2f, 0x22, 0x20, 0x2b, 0x20, 0x24, 0x7b, 0x61, 0x65, 0x7d, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x2f, 0x67, + 0x2c, 0x20, 0x22, 0x7e, 0x30, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5c, 0x2f, 0x2f, 0x67, 0x2c, 0x20, + 0x22, 0x7e, 0x31, 0x22, 0x29, 0x60, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x72, + 0x2e, 0x65, 0x6e, 0x64, 0x49, 0x66, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x65, 0x28, 0x61, 0x65, 0x2c, + 0x4d, 0x72, 0x29, 0x7b, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x47, 0x2c, 0x5f, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x28, 0x61, 0x65, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x69, 0x65, 0x2c, 0x71, 0x28, 0x61, 0x65, + 0x2c, 0x4d, 0x72, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x76, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x77, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, + 0x65, 0x6d, 0x45, 0x72, 0x72, 0x73, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, + 0x5b, 0x5d, 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, + 0x28, 0x22, 0x65, 0x72, 0x72, 0x22, 0x2c, 0x24, 0x65, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x2c, 0x4e, 0x3d, 0x3e, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x52, 0x28, + 0x4e, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, 0x4e, 0x7d, 0x29, 0x60, 0x29, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, + 0x7b, 0x4e, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, 0x65, 0x7d, 0x60, 0x2c, 0x21, + 0x30, 0x29, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x77, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x57, 0x74, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x2c, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x56, 0x28, 0x76, + 0x29, 0x2c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x5f, 0x2e, 0x5f, + 0x60, 0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x20, 0x24, 0x7b, + 0x77, 0x7d, 0x7d, 0x60, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x29, 0x7b, 0x6c, 0x65, 0x74, + 0x20, 0x76, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, + 0x65, 0x6d, 0x45, 0x72, 0x72, 0x73, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, + 0x5b, 0x5d, 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x4f, 0x66, + 0x28, 0x22, 0x65, 0x72, 0x72, 0x22, 0x2c, 0x24, 0x65, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x2c, 0x77, 0x3d, 0x3e, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x21, 0x24, 0x7b, 0x77, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, 0x65, + 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x72, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x24, 0x7b, 0x77, 0x7d, 0x29, 0x60, 0x29, 0x29, + 0x29, 0x2c, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x24, + 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x76, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x76, 0x29, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x28, 0x24, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x60, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x24, 0x28, 0x76, 0x2c, 0x77, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x44, 0x65, 0x2e, 0x61, 0x6e, 0x64, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x54, 0x72, 0x7d, + 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x21, 0x24, 0x7b, 0x76, 0x7d, 0x2e, + 0x24, 0x7b, 0x7a, 0x65, 0x7d, 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, + 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x63, + 0x7d, 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x24, + 0x7b, 0x77, 0x7d, 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x76, + 0x7d, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x24, 0x7b, 0x6f, + 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, + 0x74, 0x68, 0x7d, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x60, 0x2c, + 0x5f, 0x2e, 0x5f, 0x60, 0x2f, 0x5e, 0x5c, 0x5c, 0x2f, 0x5b, 0x5e, 0x5c, + 0x5c, 0x2f, 0x5d, 0x2a, 0x24, 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, + 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x24, 0x7b, + 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, + 0x29, 0x60, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x28, 0x76, 0x2c, 0x77, 0x2c, 0x4e, 0x29, 0x7b, 0x72, 0x2e, + 0x69, 0x66, 0x28, 0x44, 0x65, 0x2e, 0x61, 0x6e, 0x64, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x54, 0x72, 0x7d, + 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x21, 0x24, 0x7b, 0x76, 0x7d, 0x2e, + 0x24, 0x7b, 0x7a, 0x65, 0x7d, 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, + 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, + 0x28, 0x24, 0x7b, 0x63, 0x7d, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, + 0x60, 0x29, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x7a, 0x3d, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x28, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, + 0x2c, 0x7b, 0x72, 0x65, 0x66, 0x3a, 0x2f, 0x5e, 0x5c, 0x2f, 0x28, 0x5b, + 0x5e, 0x2f, 0x5d, 0x2a, 0x29, 0x28, 0x3f, 0x3a, 0x5c, 0x2f, 0x7c, 0x24, + 0x29, 0x2f, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x5f, 0x2e, 0x5f, 0x60, + 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x28, 0x22, + 0x5e, 0x5c, 0x5c, 0x5c, 0x2f, 0x28, 0x5b, 0x5e, 0x2f, 0x5d, 0x2a, 0x29, + 0x28, 0x3f, 0x3a, 0x5c, 0x5c, 0x5c, 0x2f, 0x7c, 0x24, 0x29, 0x22, 0x29, + 0x60, 0x7d, 0x29, 0x2c, 0x48, 0x3d, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x28, 0x22, 0x65, 0x6d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x7a, 0x7d, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x28, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x24, 0x7b, 0x63, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x29, 0x60, 0x29, 0x2c, 0x47, 0x3d, 0x72, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x28, 0x22, 0x65, 0x6d, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x22, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x48, 0x7d, + 0x20, 0x26, 0x26, 0x20, 0x24, 0x7b, 0x48, 0x7d, 0x5b, 0x31, 0x5d, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x31, 0x2f, + 0x67, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x2f, 0x7e, 0x30, 0x2f, 0x67, 0x2c, 0x20, 0x22, + 0x7e, 0x22, 0x29, 0x60, 0x29, 0x3b, 0x72, 0x2e, 0x69, 0x66, 0x28, 0x5f, + 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x47, 0x7d, 0x20, 0x21, 0x3d, 0x3d, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x26, 0x26, + 0x20, 0x24, 0x7b, 0x47, 0x7d, 0x20, 0x69, 0x6e, 0x20, 0x24, 0x7b, 0x77, + 0x7d, 0x60, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x4e, 0x28, 0x47, 0x29, 0x29, + 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x52, 0x28, 0x76, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x44, 0x65, 0x2e, 0x61, 0x6e, 0x64, 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, + 0x7b, 0x76, 0x7d, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, + 0x21, 0x3d, 0x3d, 0x20, 0x24, 0x7b, 0x54, 0x72, 0x7d, 0x60, 0x2c, 0x5f, + 0x2e, 0x5f, 0x60, 0x21, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x24, 0x7b, 0x7a, + 0x65, 0x7d, 0x60, 0x2c, 0x44, 0x65, 0x2e, 0x6f, 0x72, 0x28, 0x5f, 0x2e, + 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, + 0x24, 0x7b, 0x63, 0x7d, 0x60, 0x2c, 0x44, 0x65, 0x2e, 0x61, 0x6e, 0x64, + 0x28, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x24, 0x7b, 0x63, 0x7d, 0x29, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x60, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, + 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x5b, 0x24, 0x7b, 0x63, 0x7d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, + 0x2f, 0x22, 0x60, 0x29, 0x29, 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, + 0x76, 0x7d, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, + 0x68, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x24, 0x7b, + 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, + 0x61, 0x74, 0x68, 0x7d, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x60, + 0x2c, 0x5f, 0x2e, 0x5f, 0x60, 0x24, 0x7b, 0x76, 0x7d, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x74, 0x68, 0x5b, 0x24, 0x7b, 0x6f, + 0x2e, 0x65, 0x72, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, + 0x74, 0x68, 0x7d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5d, 0x20, + 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x2f, 0x22, 0x60, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x76, 0x2c, 0x77, + 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x4e, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x7a, 0x20, 0x69, 0x6e, 0x20, + 0x76, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x48, 0x3d, 0x77, 0x5b, 0x7a, + 0x5d, 0x3b, 0x6c, 0x63, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x48, 0x29, + 0x26, 0x26, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x7a, 0x2c, + 0x53, 0x28, 0x48, 0x29, 0x5d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x2e, + 0x2e, 0x2e, 0x4e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x56, 0x28, 0x76, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6c, 0x63, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x76, 0x29, + 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x75, 0x63, 0x2e, 0x5f, 0x43, 0x6f, 0x64, + 0x65, 0x28, 0x75, 0x63, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x76, 0x29, 0x2e, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x71, 0x68, 0x2c, 0x28, 0x77, 0x2c, + 0x4e, 0x29, 0x3d, 0x3e, 0x60, 0x22, 0x20, 0x2b, 0x20, 0x4a, 0x53, 0x4f, + 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, + 0x24, 0x7b, 0x6a, 0x68, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x4e, 0x2c, 0x6f, 0x29, 0x7d, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x60, + 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x4e, 0x68, + 0x2c, 0x22, 0x22, 0x29, 0x29, 0x3a, 0x5f, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x76, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x28, 0x76, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x2e, 0x5f, 0x60, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x24, 0x7b, 0x56, 0x28, 0x76, 0x29, 0x7d, 0x7d, + 0x60, 0x7d, 0x7d, 0x2c, 0x6d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x3a, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x7d, 0x2c, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x7d, 0x2c, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, + 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x7d, 0x2c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, + 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4f, 0x72, 0x4d, 0x61, 0x70, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x4d, 0x61, 0x70, 0x22, + 0x7d, 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x7d, 0x5d, 0x2c, 0x24, 0x64, 0x65, 0x66, 0x73, 0x3a, + 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x3a, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x7d, 0x7d, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, + 0x4d, 0x61, 0x70, 0x3a, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x2f, 0x24, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x22, 0x7d, 0x5d, 0x7d, 0x2c, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x58, 0x6e, 0x3d, 0x28, 0x74, 0x2c, 0x65, 0x3d, + 0x7b, 0x7d, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x2d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x20, 0x41, 0x6a, 0x76, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6a, 0x73, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x29, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x61, 0x6a, 0x76, 0x2d, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3a, 0x20, 0x61, 0x6a, 0x76, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6a, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x69, 0x73, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x61, 0x64, 0x64, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x28, 0x4f, + 0x68, 0x28, 0x65, 0x29, 0x29, 0x7d, 0x3b, 0x65, 0x61, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x58, 0x6e, 0x3b, 0x74, 0x61, 0x2e, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3d, 0x58, 0x6e, 0x3b, 0x74, + 0x61, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3d, 0x58, 0x6e, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x63, 0x3d, 0x5a, 0x74, 0x28, 0x47, 0x69, 0x28, + 0x29, 0x29, 0x2c, 0x68, 0x63, 0x3d, 0x5a, 0x74, 0x28, 0x63, 0x63, 0x28, + 0x29, 0x29, 0x2c, 0x79, 0x63, 0x3d, 0x5a, 0x74, 0x28, 0x66, 0x63, 0x28, + 0x29, 0x29, 0x2c, 0x24, 0x63, 0x3d, 0x5a, 0x74, 0x28, 0x57, 0x6e, 0x28, + 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x63, 0x3d, 0x7b, 0x24, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, + 0x2d, 0x30, 0x36, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x23, 0x22, + 0x2c, 0x24, 0x69, 0x64, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2d, 0x30, + 0x36, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x23, 0x22, 0x2c, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x22, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2c, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x7b, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x6d, 0x69, + 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x31, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, + 0x7d, 0x7d, 0x2c, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, + 0x2c, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x30, 0x3a, 0x7b, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x3a, 0x5b, + 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, + 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x7b, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3a, 0x30, 0x7d, 0x5d, 0x7d, 0x2c, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x7b, 0x65, 0x6e, 0x75, + 0x6d, 0x3a, 0x5b, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6c, 0x6c, + 0x22, 0x2c, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x7d, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x2c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x5b, 0x5d, 0x7d, 0x7d, 0x2c, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x5b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x5d, + 0x2c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x7b, 0x24, 0x69, 0x64, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x3a, 0x22, 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x7d, 0x2c, 0x24, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x3a, 0x22, 0x75, 0x72, 0x69, 0x22, 0x7d, 0x2c, 0x24, 0x72, 0x65, + 0x66, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, + 0x22, 0x75, 0x72, 0x69, 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x22, 0x7d, 0x2c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x2c, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, + 0x7d, 0x7d, 0x2c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x30, 0x7d, + 0x2c, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, + 0x2c, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, + 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x22, + 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, + 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x72, 0x65, 0x66, + 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x7d, 0x5d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x21, 0x31, 0x7d, 0x2c, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x30, 0x22, 0x7d, 0x2c, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, + 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x7d, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, + 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, + 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, + 0x7d, 0x2c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x3a, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, 0x2c, 0x7b, 0x24, + 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, + 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x3a, 0x7b, 0x7d, 0x2c, 0x65, 0x6e, + 0x75, 0x6d, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x3a, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x7b, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x5b, 0x7b, 0x24, 0x72, + 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x7d, 0x2c, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, + 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x22, 0x7d, 0x2c, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, + 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x3a, 0x21, 0x30, 0x7d, 0x5d, 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x3a, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x61, 0x6c, 0x6c, 0x4f, 0x66, + 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, + 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, + 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x3a, 0x7b, + 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x2f, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x7d, 0x2c, 0x6e, 0x6f, + 0x74, 0x3a, 0x7b, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x22, 0x23, 0x22, 0x7d, + 0x7d, 0x2c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x7b, 0x7d, + 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x59, 0x74, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x70, 0x63, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, + 0x7b, 0x61, 0x6c, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x21, + 0x30, 0x2c, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x3a, 0x21, 0x31, 0x2c, + 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, + 0x3b, 0x59, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x24, 0x63, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x29, 0x3b, 0x59, 0x74, 0x2e, 0x61, 0x64, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x28, 0x6d, + 0x63, 0x29, 0x3b, 0x28, 0x30, 0x2c, 0x68, 0x63, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x29, 0x28, 0x59, 0x74, 0x29, 0x3b, 0x28, 0x30, + 0x2c, 0x79, 0x63, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, + 0x28, 0x59, 0x74, 0x29, 0x3b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6a, 0x76, 0x3d, 0x59, 0x74, 0x3b, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x3d, 0x7b, 0x7d, 0x3b, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a +}; +unsigned int ajv_runtime_min_js_len = 149135; diff --git a/Plugins/Schema/external/ajv/dist/ajv_runtime.min.js b/Plugins/Schema/external/ajv/dist/ajv_runtime.min.js new file mode 100644 index 0000000000..6f3e19b51f --- /dev/null +++ b/Plugins/Schema/external/ajv/dist/ajv_runtime.min.js @@ -0,0 +1,8 @@ +(()=>{var _c=Object.create;var ra=Object.defineProperty;var gc=Object.getOwnPropertyDescriptor;var vc=Object.getOwnPropertyNames;var bc=Object.getPrototypeOf,wc=Object.prototype.hasOwnProperty;var p=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ec=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vc(e))!wc.call(t,n)&&n!==r&&ra(t,n,{get:()=>e[n],enumerable:!(s=gc(e,n))||s.enumerable});return t};var Zt=(t,e,r)=>(r=t!=null?_c(bc(t)):{},Ec(e||!t||!t.__esModule?ra(r,"default",{value:t,enumerable:!0}):r,t));var Be=p(C=>{"use strict";Object.defineProperty(C,"__esModule",{value:!0});C.regexpCode=C.getEsmExportName=C.getProperty=C.safeStringify=C.stringify=C.strConcat=C.addCodeArg=C.str=C._=C.nil=C._Code=C.Name=C.IDENTIFIER=C._CodeOrName=void 0;var gt=class{};C._CodeOrName=gt;C.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var xe=class extends gt{constructor(e){if(super(),!C.IDENTIFIER.test(e))throw new Error("CodeGen: name must be a valid identifier");this.str=e}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};C.Name=xe;var ce=class extends gt{constructor(e){super(),this._items=typeof e=="string"?[e]:e}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let e=this._items[0];return e===""||e==='""'}get str(){var e;return(e=this._str)!==null&&e!==void 0?e:this._str=this._items.reduce((r,s)=>`${r}${s}`,"")}get names(){var e;return(e=this._names)!==null&&e!==void 0?e:this._names=this._items.reduce((r,s)=>(s instanceof xe&&(r[s.str]=(r[s.str]||0)+1),r),{})}};C._Code=ce;C.nil=new ce("");function sa(t,...e){let r=[t[0]],s=0;for(;s{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.ValueScope=re.ValueScopeName=re.Scope=re.varKinds=re.UsedValueState=void 0;var te=Be(),Dr=class extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.value=e.value}},Qt;(function(t){t[t.Started=0]="Started",t[t.Completed=1]="Completed"})(Qt||(re.UsedValueState=Qt={}));re.varKinds={const:new te.Name("const"),let:new te.Name("let"),var:new te.Name("var")};var Bt=class{constructor({prefixes:e,parent:r}={}){this._names={},this._prefixes=e,this._parent=r}toName(e){return e instanceof te.Name?e:this.name(e)}name(e){return new te.Name(this._newName(e))}_newName(e){let r=this._names[e]||this._nameGroup(e);return`${e}${r.index++}`}_nameGroup(e){var r,s;if(!((s=(r=this._parent)===null||r===void 0?void 0:r._prefixes)===null||s===void 0)&&s.has(e)||this._prefixes&&!this._prefixes.has(e))throw new Error(`CodeGen: prefix "${e}" is not allowed in this scope`);return this._names[e]={prefix:e,index:0}}};re.Scope=Bt;var Xt=class extends te.Name{constructor(e,r){super(r),this.prefix=e}setValue(e,{property:r,itemIndex:s}){this.value=e,this.scopePath=(0,te._)`.${new te.Name(r)}[${s}]`}};re.ValueScopeName=Xt;var Rc=(0,te._)`\n`,zr=class extends Bt{constructor(e){super(e),this._values={},this._scope=e.scope,this.opts={...e,_n:e.lines?Rc:te.nil}}get(){return this._scope}name(e){return new Xt(e,this._newName(e))}value(e,r){var s;if(r.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let n=this.toName(e),{prefix:a}=n,o=(s=r.key)!==null&&s!==void 0?s:r.ref,i=this._values[a];if(i){let d=i.get(o);if(d)return d}else i=this._values[a]=new Map;i.set(o,n);let c=this._scope[a]||(this._scope[a]=[]),u=c.length;return c[u]=r.ref,n.setValue(r,{property:a,itemIndex:u}),n}getValue(e,r){let s=this._values[e];if(s)return s.get(r)}scopeRefs(e,r=this._values){return this._reduceValues(r,s=>{if(s.scopePath===void 0)throw new Error(`CodeGen: name "${s}" has no value`);return(0,te._)`${e}${s.scopePath}`})}scopeCode(e=this._values,r,s){return this._reduceValues(e,n=>{if(n.value===void 0)throw new Error(`CodeGen: name "${n}" has no value`);return n.value.code},r,s)}_reduceValues(e,r,s={},n){let a=te.nil;for(let o in e){let i=e[o];if(!i)continue;let c=s[o]=s[o]||new Map;i.forEach(u=>{if(c.has(u))return;c.set(u,Qt.Started);let d=r(u);if(d){let l=this.opts.es5?re.varKinds.var:re.varKinds.const;a=(0,te._)`${a}${l} ${u} = ${d};${this.opts._n}`}else if(d=n?.(u))a=(0,te._)`${a}${d}${this.opts._n}`;else throw new Dr(u);c.set(u,Qt.Completed)})}return a}};re.ValueScope=zr});var E=p(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.or=O.and=O.not=O.CodeGen=O.operators=O.varKinds=O.ValueScopeName=O.ValueScope=O.Scope=O.Name=O.regexpCode=O.stringify=O.getProperty=O.nil=O.strConcat=O.str=O._=void 0;var M=Be(),fe=Vr(),Ne=Be();Object.defineProperty(O,"_",{enumerable:!0,get:function(){return Ne._}});Object.defineProperty(O,"str",{enumerable:!0,get:function(){return Ne.str}});Object.defineProperty(O,"strConcat",{enumerable:!0,get:function(){return Ne.strConcat}});Object.defineProperty(O,"nil",{enumerable:!0,get:function(){return Ne.nil}});Object.defineProperty(O,"getProperty",{enumerable:!0,get:function(){return Ne.getProperty}});Object.defineProperty(O,"stringify",{enumerable:!0,get:function(){return Ne.stringify}});Object.defineProperty(O,"regexpCode",{enumerable:!0,get:function(){return Ne.regexpCode}});Object.defineProperty(O,"Name",{enumerable:!0,get:function(){return Ne.Name}});var sr=Vr();Object.defineProperty(O,"Scope",{enumerable:!0,get:function(){return sr.Scope}});Object.defineProperty(O,"ValueScope",{enumerable:!0,get:function(){return sr.ValueScope}});Object.defineProperty(O,"ValueScopeName",{enumerable:!0,get:function(){return sr.ValueScopeName}});Object.defineProperty(O,"varKinds",{enumerable:!0,get:function(){return sr.varKinds}});O.operators={GT:new M._Code(">"),GTE:new M._Code(">="),LT:new M._Code("<"),LTE:new M._Code("<="),EQ:new M._Code("==="),NEQ:new M._Code("!=="),NOT:new M._Code("!"),OR:new M._Code("||"),AND:new M._Code("&&"),ADD:new M._Code("+")};var Pe=class{optimizeNodes(){return this}optimizeNames(e,r){return this}},xr=class extends Pe{constructor(e,r,s){super(),this.varKind=e,this.name=r,this.rhs=s}render({es5:e,_n:r}){let s=e?fe.varKinds.var:this.varKind,n=this.rhs===void 0?"":` = ${this.rhs}`;return`${s} ${this.name}${n};`+r}optimizeNames(e,r){if(e[this.name.str])return this.rhs&&(this.rhs=et(this.rhs,e,r)),this}get names(){return this.rhs instanceof M._CodeOrName?this.rhs.names:{}}},er=class extends Pe{constructor(e,r,s){super(),this.lhs=e,this.rhs=r,this.sideEffects=s}render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}optimizeNames(e,r){if(!(this.lhs instanceof M.Name&&!e[this.lhs.str]&&!this.sideEffects))return this.rhs=et(this.rhs,e,r),this}get names(){let e=this.lhs instanceof M.Name?{}:{...this.lhs.names};return rr(e,this.rhs)}},Kr=class extends er{constructor(e,r,s,n){super(e,s,n),this.op=r}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}},Ur=class extends Pe{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}},Fr=class extends Pe{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}},Lr=class extends Pe{constructor(e){super(),this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}},Hr=class extends Pe{constructor(e){super(),this.code=e}render({_n:e}){return`${this.code};`+e}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(e,r){return this.code=et(this.code,e,r),this}get names(){return this.code instanceof M._CodeOrName?this.code.names:{}}},bt=class extends Pe{constructor(e=[]){super(),this.nodes=e}render(e){return this.nodes.reduce((r,s)=>r+s.render(e),"")}optimizeNodes(){let{nodes:e}=this,r=e.length;for(;r--;){let s=e[r].optimizeNodes();Array.isArray(s)?e.splice(r,1,...s):s?e[r]=s:e.splice(r,1)}return e.length>0?this:void 0}optimizeNames(e,r){let{nodes:s}=this,n=s.length;for(;n--;){let a=s[n];a.optimizeNames(e,r)||(Tc(e,a.names),s.splice(n,1))}return s.length>0?this:void 0}get names(){return this.nodes.reduce((e,r)=>Fe(e,r.names),{})}},Se=class extends bt{render(e){return"{"+e._n+super.render(e)+"}"+e._n}},Gr=class extends bt{},Xe=class extends Se{};Xe.kind="else";var Ke=class t extends Se{constructor(e,r){super(r),this.condition=e}render(e){let r=`if(${this.condition})`+super.render(e);return this.else&&(r+="else "+this.else.render(e)),r}optimizeNodes(){super.optimizeNodes();let e=this.condition;if(e===!0)return this.nodes;let r=this.else;if(r){let s=r.optimizeNodes();r=this.else=Array.isArray(s)?new Xe(s):s}if(r)return e===!1?r instanceof t?r:r.nodes:this.nodes.length?this:new t(aa(e),r instanceof t?[r]:r.nodes);if(!(e===!1||!this.nodes.length))return this}optimizeNames(e,r){var s;if(this.else=(s=this.else)===null||s===void 0?void 0:s.optimizeNames(e,r),!!(super.optimizeNames(e,r)||this.else))return this.condition=et(this.condition,e,r),this}get names(){let e=super.names;return rr(e,this.condition),this.else&&Fe(e,this.else.names),e}};Ke.kind="if";var Ue=class extends Se{};Ue.kind="for";var Jr=class extends Ue{constructor(e){super(),this.iteration=e}render(e){return`for(${this.iteration})`+super.render(e)}optimizeNames(e,r){if(super.optimizeNames(e,r))return this.iteration=et(this.iteration,e,r),this}get names(){return Fe(super.names,this.iteration.names)}},Wr=class extends Ue{constructor(e,r,s,n){super(),this.varKind=e,this.name=r,this.from=s,this.to=n}render(e){let r=e.es5?fe.varKinds.var:this.varKind,{name:s,from:n,to:a}=this;return`for(${r} ${s}=${n}; ${s}<${a}; ${s}++)`+super.render(e)}get names(){let e=rr(super.names,this.from);return rr(e,this.to)}},tr=class extends Ue{constructor(e,r,s,n){super(),this.loop=e,this.varKind=r,this.name=s,this.iterable=n}render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(e)}optimizeNames(e,r){if(super.optimizeNames(e,r))return this.iterable=et(this.iterable,e,r),this}get names(){return Fe(super.names,this.iterable.names)}},wt=class extends Se{constructor(e,r,s){super(),this.name=e,this.args=r,this.async=s}render(e){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(e)}};wt.kind="func";var Et=class extends bt{render(e){return"return "+super.render(e)}};Et.kind="return";var Yr=class extends Se{render(e){let r="try"+super.render(e);return this.catch&&(r+=this.catch.render(e)),this.finally&&(r+=this.finally.render(e)),r}optimizeNodes(){var e,r;return super.optimizeNodes(),(e=this.catch)===null||e===void 0||e.optimizeNodes(),(r=this.finally)===null||r===void 0||r.optimizeNodes(),this}optimizeNames(e,r){var s,n;return super.optimizeNames(e,r),(s=this.catch)===null||s===void 0||s.optimizeNames(e,r),(n=this.finally)===null||n===void 0||n.optimizeNames(e,r),this}get names(){let e=super.names;return this.catch&&Fe(e,this.catch.names),this.finally&&Fe(e,this.finally.names),e}},Pt=class extends Se{constructor(e){super(),this.error=e}render(e){return`catch(${this.error})`+super.render(e)}};Pt.kind="catch";var St=class extends Se{render(e){return"finally"+super.render(e)}};St.kind="finally";var Zr=class{constructor(e,r={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...r,_n:r.lines?` +`:""},this._extScope=e,this._scope=new fe.Scope({parent:e}),this._nodes=[new Gr]}toString(){return this._root.render(this.opts)}name(e){return this._scope.name(e)}scopeName(e){return this._extScope.name(e)}scopeValue(e,r){let s=this._extScope.value(e,r);return(this._values[s.prefix]||(this._values[s.prefix]=new Set)).add(s),s}getScopeValue(e,r){return this._extScope.getValue(e,r)}scopeRefs(e){return this._extScope.scopeRefs(e,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(e,r,s,n){let a=this._scope.toName(r);return s!==void 0&&n&&(this._constants[a.str]=s),this._leafNode(new xr(e,a,s)),a}const(e,r,s){return this._def(fe.varKinds.const,e,r,s)}let(e,r,s){return this._def(fe.varKinds.let,e,r,s)}var(e,r,s){return this._def(fe.varKinds.var,e,r,s)}assign(e,r,s){return this._leafNode(new er(e,r,s))}add(e,r){return this._leafNode(new Kr(e,O.operators.ADD,r))}code(e){return typeof e=="function"?e():e!==M.nil&&this._leafNode(new Hr(e)),this}object(...e){let r=["{"];for(let[s,n]of e)r.length>1&&r.push(","),r.push(s),(s!==n||this.opts.es5)&&(r.push(":"),(0,M.addCodeArg)(r,n));return r.push("}"),new M._Code(r)}if(e,r,s){if(this._blockNode(new Ke(e)),r&&s)this.code(r).else().code(s).endIf();else if(r)this.code(r).endIf();else if(s)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(e){return this._elseNode(new Ke(e))}else(){return this._elseNode(new Xe)}endIf(){return this._endBlockNode(Ke,Xe)}_for(e,r){return this._blockNode(e),r&&this.code(r).endFor(),this}for(e,r){return this._for(new Jr(e),r)}forRange(e,r,s,n,a=this.opts.es5?fe.varKinds.var:fe.varKinds.let){let o=this._scope.toName(e);return this._for(new Wr(a,o,r,s),()=>n(o))}forOf(e,r,s,n=fe.varKinds.const){let a=this._scope.toName(e);if(this.opts.es5){let o=r instanceof M.Name?r:this.var("_arr",r);return this.forRange("_i",0,(0,M._)`${o}.length`,i=>{this.var(a,(0,M._)`${o}[${i}]`),s(a)})}return this._for(new tr("of",n,a,r),()=>s(a))}forIn(e,r,s,n=this.opts.es5?fe.varKinds.var:fe.varKinds.const){if(this.opts.ownProperties)return this.forOf(e,(0,M._)`Object.keys(${r})`,s);let a=this._scope.toName(e);return this._for(new tr("in",n,a,r),()=>s(a))}endFor(){return this._endBlockNode(Ue)}label(e){return this._leafNode(new Ur(e))}break(e){return this._leafNode(new Fr(e))}return(e){let r=new Et;if(this._blockNode(r),this.code(e),r.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(Et)}try(e,r,s){if(!r&&!s)throw new Error('CodeGen: "try" without "catch" and "finally"');let n=new Yr;if(this._blockNode(n),this.code(e),r){let a=this.name("e");this._currNode=n.catch=new Pt(a),r(a)}return s&&(this._currNode=n.finally=new St,this.code(s)),this._endBlockNode(Pt,St)}throw(e){return this._leafNode(new Lr(e))}block(e,r){return this._blockStarts.push(this._nodes.length),e&&this.code(e).endBlock(r),this}endBlock(e){let r=this._blockStarts.pop();if(r===void 0)throw new Error("CodeGen: not in self-balancing block");let s=this._nodes.length-r;if(s<0||e!==void 0&&s!==e)throw new Error(`CodeGen: wrong number of nodes: ${s} vs ${e} expected`);return this._nodes.length=r,this}func(e,r=M.nil,s,n){return this._blockNode(new wt(e,r,s)),n&&this.code(n).endFunc(),this}endFunc(){return this._endBlockNode(wt)}optimize(e=1){for(;e-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(e){return this._currNode.nodes.push(e),this}_blockNode(e){this._currNode.nodes.push(e),this._nodes.push(e)}_endBlockNode(e,r){let s=this._currNode;if(s instanceof e||r&&s instanceof r)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${r?`${e.kind}/${r.kind}`:e.kind}"`)}_elseNode(e){let r=this._currNode;if(!(r instanceof Ke))throw new Error('CodeGen: "else" without "if"');return this._currNode=r.else=e,this}get _root(){return this._nodes[0]}get _currNode(){let e=this._nodes;return e[e.length-1]}set _currNode(e){let r=this._nodes;r[r.length-1]=e}};O.CodeGen=Zr;function Fe(t,e){for(let r in e)t[r]=(t[r]||0)+(e[r]||0);return t}function rr(t,e){return e instanceof M._CodeOrName?Fe(t,e.names):t}function et(t,e,r){if(t instanceof M.Name)return s(t);if(!n(t))return t;return new M._Code(t._items.reduce((a,o)=>(o instanceof M.Name&&(o=s(o)),o instanceof M._Code?a.push(...o._items):a.push(o),a),[]));function s(a){let o=r[a.str];return o===void 0||e[a.str]!==1?a:(delete e[a.str],o)}function n(a){return a instanceof M._Code&&a._items.some(o=>o instanceof M.Name&&e[o.str]===1&&r[o.str]!==void 0)}}function Tc(t,e){for(let r in e)t[r]=(t[r]||0)-(e[r]||0)}function aa(t){return typeof t=="boolean"||typeof t=="number"||t===null?!t:(0,M._)`!${Qr(t)}`}O.not=aa;var Mc=oa(O.operators.AND);function Ac(...t){return t.reduce(Mc)}O.and=Ac;var Cc=oa(O.operators.OR);function Dc(...t){return t.reduce(Cc)}O.or=Dc;function oa(t){return(e,r)=>e===M.nil?r:r===M.nil?e:(0,M._)`${Qr(e)} ${t} ${Qr(r)}`}function Qr(t){return t instanceof M.Name?t:(0,M._)`(${t})`}});var I=p(k=>{"use strict";Object.defineProperty(k,"__esModule",{value:!0});k.checkStrictMode=k.getErrorPath=k.Type=k.useFunc=k.setEvaluated=k.evaluatedPropsToName=k.mergeEvaluated=k.eachItem=k.unescapeJsonPointer=k.escapeJsonPointer=k.escapeFragment=k.unescapeFragment=k.schemaRefOrVal=k.schemaHasRulesButRef=k.schemaHasRules=k.checkUnknownRules=k.alwaysValidSchema=k.toHash=void 0;var K=E(),zc=Be();function Vc(t){let e={};for(let r of t)e[r]=!0;return e}k.toHash=Vc;function xc(t,e){return typeof e=="boolean"?e:Object.keys(e).length===0?!0:(ua(t,e),!da(e,t.self.RULES.all))}k.alwaysValidSchema=xc;function ua(t,e=t.schema){let{opts:r,self:s}=t;if(!r.strictSchema||typeof e=="boolean")return;let n=s.RULES.keywords;for(let a in e)n[a]||ma(t,`unknown keyword: "${a}"`)}k.checkUnknownRules=ua;function da(t,e){if(typeof t=="boolean")return!t;for(let r in t)if(e[r])return!0;return!1}k.schemaHasRules=da;function Kc(t,e){if(typeof t=="boolean")return!t;for(let r in t)if(r!=="$ref"&&e.all[r])return!0;return!1}k.schemaHasRulesButRef=Kc;function Uc({topSchemaRef:t,schemaPath:e},r,s,n){if(!n){if(typeof r=="number"||typeof r=="boolean")return r;if(typeof r=="string")return(0,K._)`${r}`}return(0,K._)`${t}${e}${(0,K.getProperty)(s)}`}k.schemaRefOrVal=Uc;function Fc(t){return la(decodeURIComponent(t))}k.unescapeFragment=Fc;function Lc(t){return encodeURIComponent(Xr(t))}k.escapeFragment=Lc;function Xr(t){return typeof t=="number"?`${t}`:t.replace(/~/g,"~0").replace(/\//g,"~1")}k.escapeJsonPointer=Xr;function la(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}k.unescapeJsonPointer=la;function Hc(t,e){if(Array.isArray(t))for(let r of t)e(r);else e(t)}k.eachItem=Hc;function ia({mergeNames:t,mergeToName:e,mergeValues:r,resultToName:s}){return(n,a,o,i)=>{let c=o===void 0?a:o instanceof K.Name?(a instanceof K.Name?t(n,a,o):e(n,a,o),o):a instanceof K.Name?(e(n,o,a),a):r(a,o);return i===K.Name&&!(c instanceof K.Name)?s(n,c):c}}k.mergeEvaluated={props:ia({mergeNames:(t,e,r)=>t.if((0,K._)`${r} !== true && ${e} !== undefined`,()=>{t.if((0,K._)`${e} === true`,()=>t.assign(r,!0),()=>t.assign(r,(0,K._)`${r} || {}`).code((0,K._)`Object.assign(${r}, ${e})`))}),mergeToName:(t,e,r)=>t.if((0,K._)`${r} !== true`,()=>{e===!0?t.assign(r,!0):(t.assign(r,(0,K._)`${r} || {}`),es(t,r,e))}),mergeValues:(t,e)=>t===!0?!0:{...t,...e},resultToName:fa}),items:ia({mergeNames:(t,e,r)=>t.if((0,K._)`${r} !== true && ${e} !== undefined`,()=>t.assign(r,(0,K._)`${e} === true ? true : ${r} > ${e} ? ${r} : ${e}`)),mergeToName:(t,e,r)=>t.if((0,K._)`${r} !== true`,()=>t.assign(r,e===!0?!0:(0,K._)`${r} > ${e} ? ${r} : ${e}`)),mergeValues:(t,e)=>t===!0?!0:Math.max(t,e),resultToName:(t,e)=>t.var("items",e)})};function fa(t,e){if(e===!0)return t.var("props",!0);let r=t.var("props",(0,K._)`{}`);return e!==void 0&&es(t,r,e),r}k.evaluatedPropsToName=fa;function es(t,e,r){Object.keys(r).forEach(s=>t.assign((0,K._)`${e}${(0,K.getProperty)(s)}`,!0))}k.setEvaluated=es;var ca={};function Gc(t,e){return t.scopeValue("func",{ref:e,code:ca[e.code]||(ca[e.code]=new zc._Code(e.code))})}k.useFunc=Gc;var Br;(function(t){t[t.Num=0]="Num",t[t.Str=1]="Str"})(Br||(k.Type=Br={}));function Jc(t,e,r){if(t instanceof K.Name){let s=e===Br.Num;return r?s?(0,K._)`"[" + ${t} + "]"`:(0,K._)`"['" + ${t} + "']"`:s?(0,K._)`"/" + ${t}`:(0,K._)`"/" + ${t}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return r?(0,K.getProperty)(t).toString():"/"+Xr(t)}k.getErrorPath=Jc;function ma(t,e,r=t.opts.strictSchema){if(r){if(e=`strict mode: ${e}`,r===!0)throw new Error(e);t.self.logger.warn(e)}}k.checkStrictMode=ma});var oe=p(ts=>{"use strict";Object.defineProperty(ts,"__esModule",{value:!0});var Z=E(),Wc={data:new Z.Name("data"),valCxt:new Z.Name("valCxt"),instancePath:new Z.Name("instancePath"),parentData:new Z.Name("parentData"),parentDataProperty:new Z.Name("parentDataProperty"),rootData:new Z.Name("rootData"),dynamicAnchors:new Z.Name("dynamicAnchors"),vErrors:new Z.Name("vErrors"),errors:new Z.Name("errors"),this:new Z.Name("this"),self:new Z.Name("self"),scope:new Z.Name("scope"),json:new Z.Name("json"),jsonPos:new Z.Name("jsonPos"),jsonLen:new Z.Name("jsonLen"),jsonPart:new Z.Name("jsonPart")};ts.default=Wc});var tt=p(Q=>{"use strict";Object.defineProperty(Q,"__esModule",{value:!0});Q.extendErrors=Q.resetErrorsCount=Q.reportExtraError=Q.reportError=Q.keyword$DataError=Q.keywordError=void 0;var A=E(),nr=I(),X=oe();Q.keywordError={message:({keyword:t})=>(0,A.str)`must pass "${t}" keyword validation`};Q.keyword$DataError={message:({keyword:t,schemaType:e})=>e?(0,A.str)`"${t}" keyword must be ${e} ($data)`:(0,A.str)`"${t}" keyword is invalid ($data)`};function Yc(t,e=Q.keywordError,r,s){let{it:n}=t,{gen:a,compositeRule:o,allErrors:i}=n,c=ya(t,e,r);s??(o||i)?pa(a,c):ha(n,(0,A._)`[${c}]`)}Q.reportError=Yc;function Zc(t,e=Q.keywordError,r){let{it:s}=t,{gen:n,compositeRule:a,allErrors:o}=s,i=ya(t,e,r);pa(n,i),a||o||ha(s,X.default.vErrors)}Q.reportExtraError=Zc;function Qc(t,e){t.assign(X.default.errors,e),t.if((0,A._)`${X.default.vErrors} !== null`,()=>t.if(e,()=>t.assign((0,A._)`${X.default.vErrors}.length`,e),()=>t.assign(X.default.vErrors,null)))}Q.resetErrorsCount=Qc;function Bc({gen:t,keyword:e,schemaValue:r,data:s,errsCount:n,it:a}){if(n===void 0)throw new Error("ajv implementation error");let o=t.name("err");t.forRange("i",n,X.default.errors,i=>{t.const(o,(0,A._)`${X.default.vErrors}[${i}]`),t.if((0,A._)`${o}.instancePath === undefined`,()=>t.assign((0,A._)`${o}.instancePath`,(0,A.strConcat)(X.default.instancePath,a.errorPath))),t.assign((0,A._)`${o}.schemaPath`,(0,A.str)`${a.errSchemaPath}/${e}`),a.opts.verbose&&(t.assign((0,A._)`${o}.schema`,r),t.assign((0,A._)`${o}.data`,s))})}Q.extendErrors=Bc;function pa(t,e){let r=t.const("err",e);t.if((0,A._)`${X.default.vErrors} === null`,()=>t.assign(X.default.vErrors,(0,A._)`[${r}]`),(0,A._)`${X.default.vErrors}.push(${r})`),t.code((0,A._)`${X.default.errors}++`)}function ha(t,e){let{gen:r,validateName:s,schemaEnv:n}=t;n.$async?r.throw((0,A._)`new ${t.ValidationError}(${e})`):(r.assign((0,A._)`${s}.errors`,e),r.return(!1))}var Le={keyword:new A.Name("keyword"),schemaPath:new A.Name("schemaPath"),params:new A.Name("params"),propertyName:new A.Name("propertyName"),message:new A.Name("message"),schema:new A.Name("schema"),parentSchema:new A.Name("parentSchema")};function ya(t,e,r){let{createErrors:s}=t.it;return s===!1?(0,A._)`{}`:Xc(t,e,r)}function Xc(t,e,r={}){let{gen:s,it:n}=t,a=[eu(n,r),tu(t,r)];return ru(t,e,a),s.object(...a)}function eu({errorPath:t},{instancePath:e}){let r=e?(0,A.str)`${t}${(0,nr.getErrorPath)(e,nr.Type.Str)}`:t;return[X.default.instancePath,(0,A.strConcat)(X.default.instancePath,r)]}function tu({keyword:t,it:{errSchemaPath:e}},{schemaPath:r,parentSchema:s}){let n=s?e:(0,A.str)`${e}/${t}`;return r&&(n=(0,A.str)`${n}${(0,nr.getErrorPath)(r,nr.Type.Str)}`),[Le.schemaPath,n]}function ru(t,{params:e,message:r},s){let{keyword:n,data:a,schemaValue:o,it:i}=t,{opts:c,propertyName:u,topSchemaRef:d,schemaPath:l}=i;s.push([Le.keyword,n],[Le.params,typeof e=="function"?e(t):e||(0,A._)`{}`]),c.messages&&s.push([Le.message,typeof r=="function"?r(t):r]),c.verbose&&s.push([Le.schema,o],[Le.parentSchema,(0,A._)`${d}${l}`],[X.default.data,a]),u&&s.push([Le.propertyName,u])}});var _a=p(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.boolOrEmptySchema=rt.topBoolOrEmptySchema=void 0;var su=tt(),nu=E(),au=oe(),ou={message:"boolean schema is false"};function iu(t){let{gen:e,schema:r,validateName:s}=t;r===!1?$a(t,!1):typeof r=="object"&&r.$async===!0?e.return(au.default.data):(e.assign((0,nu._)`${s}.errors`,null),e.return(!0))}rt.topBoolOrEmptySchema=iu;function cu(t,e){let{gen:r,schema:s}=t;s===!1?(r.var(e,!1),$a(t)):r.var(e,!0)}rt.boolOrEmptySchema=cu;function $a(t,e){let{gen:r,data:s}=t,n={gen:r,keyword:"false schema",data:s,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:t};(0,su.reportError)(n,ou,void 0,e)}});var rs=p(st=>{"use strict";Object.defineProperty(st,"__esModule",{value:!0});st.getRules=st.isJSONType=void 0;var uu=["string","number","integer","boolean","null","object","array"],du=new Set(uu);function lu(t){return typeof t=="string"&&du.has(t)}st.isJSONType=lu;function fu(){let t={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...t,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},t.number,t.string,t.array,t.object],post:{rules:[]},all:{},keywords:{}}}st.getRules=fu});var ss=p(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.shouldUseRule=Oe.shouldUseGroup=Oe.schemaHasRulesForType=void 0;function mu({schema:t,self:e},r){let s=e.RULES.types[r];return s&&s!==!0&&ga(t,s)}Oe.schemaHasRulesForType=mu;function ga(t,e){return e.rules.some(r=>va(t,r))}Oe.shouldUseGroup=ga;function va(t,e){var r;return t[e.keyword]!==void 0||((r=e.definition.implements)===null||r===void 0?void 0:r.some(s=>t[s]!==void 0))}Oe.shouldUseRule=va});var jt=p(B=>{"use strict";Object.defineProperty(B,"__esModule",{value:!0});B.reportTypeError=B.checkDataTypes=B.checkDataType=B.coerceAndCheckDataType=B.getJSONTypes=B.getSchemaTypes=B.DataType=void 0;var pu=rs(),hu=ss(),yu=tt(),j=E(),ba=I(),nt;(function(t){t[t.Correct=0]="Correct",t[t.Wrong=1]="Wrong"})(nt||(B.DataType=nt={}));function $u(t){let e=wa(t.type);if(e.includes("null")){if(t.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!e.length&&t.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');t.nullable===!0&&e.push("null")}return e}B.getSchemaTypes=$u;function wa(t){let e=Array.isArray(t)?t:t?[t]:[];if(e.every(pu.isJSONType))return e;throw new Error("type must be JSONType or JSONType[]: "+e.join(","))}B.getJSONTypes=wa;function _u(t,e){let{gen:r,data:s,opts:n}=t,a=gu(e,n.coerceTypes),o=e.length>0&&!(a.length===0&&e.length===1&&(0,hu.schemaHasRulesForType)(t,e[0]));if(o){let i=as(e,s,n.strictNumbers,nt.Wrong);r.if(i,()=>{a.length?vu(t,e,a):os(t)})}return o}B.coerceAndCheckDataType=_u;var Ea=new Set(["string","number","integer","boolean","null"]);function gu(t,e){return e?t.filter(r=>Ea.has(r)||e==="array"&&r==="array"):[]}function vu(t,e,r){let{gen:s,data:n,opts:a}=t,o=s.let("dataType",(0,j._)`typeof ${n}`),i=s.let("coerced",(0,j._)`undefined`);a.coerceTypes==="array"&&s.if((0,j._)`${o} == 'object' && Array.isArray(${n}) && ${n}.length == 1`,()=>s.assign(n,(0,j._)`${n}[0]`).assign(o,(0,j._)`typeof ${n}`).if(as(e,n,a.strictNumbers),()=>s.assign(i,n))),s.if((0,j._)`${i} !== undefined`);for(let u of r)(Ea.has(u)||u==="array"&&a.coerceTypes==="array")&&c(u);s.else(),os(t),s.endIf(),s.if((0,j._)`${i} !== undefined`,()=>{s.assign(n,i),bu(t,i)});function c(u){switch(u){case"string":s.elseIf((0,j._)`${o} == "number" || ${o} == "boolean"`).assign(i,(0,j._)`"" + ${n}`).elseIf((0,j._)`${n} === null`).assign(i,(0,j._)`""`);return;case"number":s.elseIf((0,j._)`${o} == "boolean" || ${n} === null + || (${o} == "string" && ${n} && ${n} == +${n})`).assign(i,(0,j._)`+${n}`);return;case"integer":s.elseIf((0,j._)`${o} === "boolean" || ${n} === null + || (${o} === "string" && ${n} && ${n} == +${n} && !(${n} % 1))`).assign(i,(0,j._)`+${n}`);return;case"boolean":s.elseIf((0,j._)`${n} === "false" || ${n} === 0 || ${n} === null`).assign(i,!1).elseIf((0,j._)`${n} === "true" || ${n} === 1`).assign(i,!0);return;case"null":s.elseIf((0,j._)`${n} === "" || ${n} === 0 || ${n} === false`),s.assign(i,null);return;case"array":s.elseIf((0,j._)`${o} === "string" || ${o} === "number" + || ${o} === "boolean" || ${n} === null`).assign(i,(0,j._)`[${n}]`)}}}function bu({gen:t,parentData:e,parentDataProperty:r},s){t.if((0,j._)`${e} !== undefined`,()=>t.assign((0,j._)`${e}[${r}]`,s))}function ns(t,e,r,s=nt.Correct){let n=s===nt.Correct?j.operators.EQ:j.operators.NEQ,a;switch(t){case"null":return(0,j._)`${e} ${n} null`;case"array":a=(0,j._)`Array.isArray(${e})`;break;case"object":a=(0,j._)`${e} && typeof ${e} == "object" && !Array.isArray(${e})`;break;case"integer":a=o((0,j._)`!(${e} % 1) && !isNaN(${e})`);break;case"number":a=o();break;default:return(0,j._)`typeof ${e} ${n} ${t}`}return s===nt.Correct?a:(0,j.not)(a);function o(i=j.nil){return(0,j.and)((0,j._)`typeof ${e} == "number"`,i,r?(0,j._)`isFinite(${e})`:j.nil)}}B.checkDataType=ns;function as(t,e,r,s){if(t.length===1)return ns(t[0],e,r,s);let n,a=(0,ba.toHash)(t);if(a.array&&a.object){let o=(0,j._)`typeof ${e} != "object"`;n=a.null?o:(0,j._)`!${e} || ${o}`,delete a.null,delete a.array,delete a.object}else n=j.nil;a.number&&delete a.integer;for(let o in a)n=(0,j.and)(n,ns(o,e,r,s));return n}B.checkDataTypes=as;var wu={message:({schema:t})=>`must be ${t}`,params:({schema:t,schemaValue:e})=>typeof t=="string"?(0,j._)`{type: ${t}}`:(0,j._)`{type: ${e}}`};function os(t){let e=Eu(t);(0,yu.reportError)(e,wu)}B.reportTypeError=os;function Eu(t){let{gen:e,data:r,schema:s}=t,n=(0,ba.schemaRefOrVal)(t,s,"type");return{gen:e,keyword:"type",data:r,schema:s.type,schemaCode:n,schemaValue:n,parentSchema:s,params:{},it:t}}});var Sa=p(ar=>{"use strict";Object.defineProperty(ar,"__esModule",{value:!0});ar.assignDefaults=void 0;var at=E(),Pu=I();function Su(t,e){let{properties:r,items:s}=t.schema;if(e==="object"&&r)for(let n in r)Pa(t,n,r[n].default);else e==="array"&&Array.isArray(s)&&s.forEach((n,a)=>Pa(t,a,n.default))}ar.assignDefaults=Su;function Pa(t,e,r){let{gen:s,compositeRule:n,data:a,opts:o}=t;if(r===void 0)return;let i=(0,at._)`${a}${(0,at.getProperty)(e)}`;if(n){(0,Pu.checkStrictMode)(t,`default is ignored for: ${i}`);return}let c=(0,at._)`${i} === undefined`;o.useDefaults==="empty"&&(c=(0,at._)`${c} || ${i} === null || ${i} === ""`),s.if(c,(0,at._)`${i} = ${(0,at.stringify)(r)}`)}});var ue=p(x=>{"use strict";Object.defineProperty(x,"__esModule",{value:!0});x.validateUnion=x.validateArray=x.usePattern=x.callValidateCode=x.schemaProperties=x.allSchemaProperties=x.noPropertyInData=x.propertyInData=x.isOwnProperty=x.hasPropFunc=x.reportMissingProp=x.checkMissingProp=x.checkReportMissingProp=void 0;var U=E(),is=I(),ke=oe(),ju=I();function qu(t,e){let{gen:r,data:s,it:n}=t;r.if(us(r,s,e,n.opts.ownProperties),()=>{t.setParams({missingProperty:(0,U._)`${e}`},!0),t.error()})}x.checkReportMissingProp=qu;function Nu({gen:t,data:e,it:{opts:r}},s,n){return(0,U.or)(...s.map(a=>(0,U.and)(us(t,e,a,r.ownProperties),(0,U._)`${n} = ${a}`)))}x.checkMissingProp=Nu;function Ou(t,e){t.setParams({missingProperty:e},!0),t.error()}x.reportMissingProp=Ou;function ja(t){return t.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,U._)`Object.prototype.hasOwnProperty`})}x.hasPropFunc=ja;function cs(t,e,r){return(0,U._)`${ja(t)}.call(${e}, ${r})`}x.isOwnProperty=cs;function ku(t,e,r,s){let n=(0,U._)`${e}${(0,U.getProperty)(r)} !== undefined`;return s?(0,U._)`${n} && ${cs(t,e,r)}`:n}x.propertyInData=ku;function us(t,e,r,s){let n=(0,U._)`${e}${(0,U.getProperty)(r)} === undefined`;return s?(0,U.or)(n,(0,U.not)(cs(t,e,r))):n}x.noPropertyInData=us;function qa(t){return t?Object.keys(t).filter(e=>e!=="__proto__"):[]}x.allSchemaProperties=qa;function Iu(t,e){return qa(e).filter(r=>!(0,is.alwaysValidSchema)(t,e[r]))}x.schemaProperties=Iu;function Ru({schemaCode:t,data:e,it:{gen:r,topSchemaRef:s,schemaPath:n,errorPath:a},it:o},i,c,u){let d=u?(0,U._)`${t}, ${e}, ${s}${n}`:e,l=[[ke.default.instancePath,(0,U.strConcat)(ke.default.instancePath,a)],[ke.default.parentData,o.parentData],[ke.default.parentDataProperty,o.parentDataProperty],[ke.default.rootData,ke.default.rootData]];o.opts.dynamicRef&&l.push([ke.default.dynamicAnchors,ke.default.dynamicAnchors]);let y=(0,U._)`${d}, ${r.object(...l)}`;return c!==U.nil?(0,U._)`${i}.call(${c}, ${y})`:(0,U._)`${i}(${y})`}x.callValidateCode=Ru;var Tu=(0,U._)`new RegExp`;function Mu({gen:t,it:{opts:e}},r){let s=e.unicodeRegExp?"u":"",{regExp:n}=e.code,a=n(r,s);return t.scopeValue("pattern",{key:a.toString(),ref:a,code:(0,U._)`${n.code==="new RegExp"?Tu:(0,ju.useFunc)(t,n)}(${r}, ${s})`})}x.usePattern=Mu;function Au(t){let{gen:e,data:r,keyword:s,it:n}=t,a=e.name("valid");if(n.allErrors){let i=e.let("valid",!0);return o(()=>e.assign(i,!1)),i}return e.var(a,!0),o(()=>e.break()),a;function o(i){let c=e.const("len",(0,U._)`${r}.length`);e.forRange("i",0,c,u=>{t.subschema({keyword:s,dataProp:u,dataPropType:is.Type.Num},a),e.if((0,U.not)(a),i)})}}x.validateArray=Au;function Cu(t){let{gen:e,schema:r,keyword:s,it:n}=t;if(!Array.isArray(r))throw new Error("ajv implementation error");if(r.some(c=>(0,is.alwaysValidSchema)(n,c))&&!n.opts.unevaluated)return;let o=e.let("valid",!1),i=e.name("_valid");e.block(()=>r.forEach((c,u)=>{let d=t.subschema({keyword:s,schemaProp:u,compositeRule:!0},i);e.assign(o,(0,U._)`${o} || ${i}`),t.mergeValidEvaluated(d,i)||e.if((0,U.not)(o))})),t.result(o,()=>t.reset(),()=>t.error(!0))}x.validateUnion=Cu});var ka=p(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0});_e.validateKeywordUsage=_e.validSchemaType=_e.funcKeywordCode=_e.macroKeywordCode=void 0;var ee=E(),He=oe(),Du=ue(),zu=tt();function Vu(t,e){let{gen:r,keyword:s,schema:n,parentSchema:a,it:o}=t,i=e.macro.call(o.self,n,a,o),c=Oa(r,s,i);o.opts.validateSchema!==!1&&o.self.validateSchema(i,!0);let u=r.name("valid");t.subschema({schema:i,schemaPath:ee.nil,errSchemaPath:`${o.errSchemaPath}/${s}`,topSchemaRef:c,compositeRule:!0},u),t.pass(u,()=>t.error(!0))}_e.macroKeywordCode=Vu;function xu(t,e){var r;let{gen:s,keyword:n,schema:a,parentSchema:o,$data:i,it:c}=t;Uu(c,e);let u=!i&&e.compile?e.compile.call(c.self,a,o,c):e.validate,d=Oa(s,n,u),l=s.let("valid");t.block$data(l,y),t.ok((r=e.valid)!==null&&r!==void 0?r:l);function y(){if(e.errors===!1)m(),e.modifying&&Na(t),$(()=>t.error());else{let g=e.async?h():f();e.modifying&&Na(t),$(()=>Ku(t,g))}}function h(){let g=s.let("ruleErrs",null);return s.try(()=>m((0,ee._)`await `),R=>s.assign(l,!1).if((0,ee._)`${R} instanceof ${c.ValidationError}`,()=>s.assign(g,(0,ee._)`${R}.errors`),()=>s.throw(R))),g}function f(){let g=(0,ee._)`${d}.errors`;return s.assign(g,null),m(ee.nil),g}function m(g=e.async?(0,ee._)`await `:ee.nil){let R=c.opts.passContext?He.default.this:He.default.self,q=!("compile"in e&&!i||e.schema===!1);s.assign(l,(0,ee._)`${g}${(0,Du.callValidateCode)(t,d,R,q)}`,e.modifying)}function $(g){var R;s.if((0,ee.not)((R=e.valid)!==null&&R!==void 0?R:l),g)}}_e.funcKeywordCode=xu;function Na(t){let{gen:e,data:r,it:s}=t;e.if(s.parentData,()=>e.assign(r,(0,ee._)`${s.parentData}[${s.parentDataProperty}]`))}function Ku(t,e){let{gen:r}=t;r.if((0,ee._)`Array.isArray(${e})`,()=>{r.assign(He.default.vErrors,(0,ee._)`${He.default.vErrors} === null ? ${e} : ${He.default.vErrors}.concat(${e})`).assign(He.default.errors,(0,ee._)`${He.default.vErrors}.length`),(0,zu.extendErrors)(t)},()=>t.error())}function Uu({schemaEnv:t},e){if(e.async&&!t.$async)throw new Error("async keyword in sync schema")}function Oa(t,e,r){if(r===void 0)throw new Error(`keyword "${e}" failed to compile`);return t.scopeValue("keyword",typeof r=="function"?{ref:r}:{ref:r,code:(0,ee.stringify)(r)})}function Fu(t,e,r=!1){return!e.length||e.some(s=>s==="array"?Array.isArray(t):s==="object"?t&&typeof t=="object"&&!Array.isArray(t):typeof t==s||r&&typeof t>"u")}_e.validSchemaType=Fu;function Lu({schema:t,opts:e,self:r,errSchemaPath:s},n,a){if(Array.isArray(n.keyword)?!n.keyword.includes(a):n.keyword!==a)throw new Error("ajv implementation error");let o=n.dependencies;if(o?.some(i=>!Object.prototype.hasOwnProperty.call(t,i)))throw new Error(`parent schema must have dependencies of ${a}: ${o.join(",")}`);if(n.validateSchema&&!n.validateSchema(t[a])){let c=`keyword "${a}" value is invalid at path "${s}": `+r.errorsText(n.validateSchema.errors);if(e.validateSchema==="log")r.logger.error(c);else throw new Error(c)}}_e.validateKeywordUsage=Lu});var Ra=p(Ie=>{"use strict";Object.defineProperty(Ie,"__esModule",{value:!0});Ie.extendSubschemaMode=Ie.extendSubschemaData=Ie.getSubschema=void 0;var ge=E(),Ia=I();function Hu(t,{keyword:e,schemaProp:r,schema:s,schemaPath:n,errSchemaPath:a,topSchemaRef:o}){if(e!==void 0&&s!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(e!==void 0){let i=t.schema[e];return r===void 0?{schema:i,schemaPath:(0,ge._)`${t.schemaPath}${(0,ge.getProperty)(e)}`,errSchemaPath:`${t.errSchemaPath}/${e}`}:{schema:i[r],schemaPath:(0,ge._)`${t.schemaPath}${(0,ge.getProperty)(e)}${(0,ge.getProperty)(r)}`,errSchemaPath:`${t.errSchemaPath}/${e}/${(0,Ia.escapeFragment)(r)}`}}if(s!==void 0){if(n===void 0||a===void 0||o===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:s,schemaPath:n,topSchemaRef:o,errSchemaPath:a}}throw new Error('either "keyword" or "schema" must be passed')}Ie.getSubschema=Hu;function Gu(t,e,{dataProp:r,dataPropType:s,data:n,dataTypes:a,propertyName:o}){if(n!==void 0&&r!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');let{gen:i}=e;if(r!==void 0){let{errorPath:u,dataPathArr:d,opts:l}=e,y=i.let("data",(0,ge._)`${e.data}${(0,ge.getProperty)(r)}`,!0);c(y),t.errorPath=(0,ge.str)`${u}${(0,Ia.getErrorPath)(r,s,l.jsPropertySyntax)}`,t.parentDataProperty=(0,ge._)`${r}`,t.dataPathArr=[...d,t.parentDataProperty]}if(n!==void 0){let u=n instanceof ge.Name?n:i.let("data",n,!0);c(u),o!==void 0&&(t.propertyName=o)}a&&(t.dataTypes=a);function c(u){t.data=u,t.dataLevel=e.dataLevel+1,t.dataTypes=[],e.definedProperties=new Set,t.parentData=e.data,t.dataNames=[...e.dataNames,u]}}Ie.extendSubschemaData=Gu;function Ju(t,{jtdDiscriminator:e,jtdMetadata:r,compositeRule:s,createErrors:n,allErrors:a}){s!==void 0&&(t.compositeRule=s),n!==void 0&&(t.createErrors=n),a!==void 0&&(t.allErrors=a),t.jtdDiscriminator=e,t.jtdMetadata=r}Ie.extendSubschemaMode=Ju});var ds=p((Gh,Ta)=>{"use strict";Ta.exports=function t(e,r){if(e===r)return!0;if(e&&r&&typeof e=="object"&&typeof r=="object"){if(e.constructor!==r.constructor)return!1;var s,n,a;if(Array.isArray(e)){if(s=e.length,s!=r.length)return!1;for(n=s;n--!==0;)if(!t(e[n],r[n]))return!1;return!0}if(e.constructor===RegExp)return e.source===r.source&&e.flags===r.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===r.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===r.toString();if(a=Object.keys(e),s=a.length,s!==Object.keys(r).length)return!1;for(n=s;n--!==0;)if(!Object.prototype.hasOwnProperty.call(r,a[n]))return!1;for(n=s;n--!==0;){var o=a[n];if(!t(e[o],r[o]))return!1}return!0}return e!==e&&r!==r}});var Aa=p((Jh,Ma)=>{"use strict";var Re=Ma.exports=function(t,e,r){typeof e=="function"&&(r=e,e={}),r=e.cb||r;var s=typeof r=="function"?r:r.pre||function(){},n=r.post||function(){};or(e,s,n,t,"",t)};Re.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0};Re.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0};Re.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0};Re.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function or(t,e,r,s,n,a,o,i,c,u){if(s&&typeof s=="object"&&!Array.isArray(s)){e(s,n,a,o,i,c,u);for(var d in s){var l=s[d];if(Array.isArray(l)){if(d in Re.arrayKeywords)for(var y=0;y{"use strict";Object.defineProperty(se,"__esModule",{value:!0});se.getSchemaRefs=se.resolveUrl=se.normalizeId=se._getFullPath=se.getFullPath=se.inlineRef=void 0;var Yu=I(),Zu=ds(),Qu=Aa(),Bu=new Set(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum","const"]);function Xu(t,e=!0){return typeof t=="boolean"?!0:e===!0?!ls(t):e?Ca(t)<=e:!1}se.inlineRef=Xu;var ed=new Set(["$ref","$recursiveRef","$recursiveAnchor","$dynamicRef","$dynamicAnchor"]);function ls(t){for(let e in t){if(ed.has(e))return!0;let r=t[e];if(Array.isArray(r)&&r.some(ls)||typeof r=="object"&&ls(r))return!0}return!1}function Ca(t){let e=0;for(let r in t){if(r==="$ref")return 1/0;if(e++,!Bu.has(r)&&(typeof t[r]=="object"&&(0,Yu.eachItem)(t[r],s=>e+=Ca(s)),e===1/0))return 1/0}return e}function Da(t,e="",r){r!==!1&&(e=ot(e));let s=t.parse(e);return za(t,s)}se.getFullPath=Da;function za(t,e){return t.serialize(e).split("#")[0]+"#"}se._getFullPath=za;var td=/#\/?$/;function ot(t){return t?t.replace(td,""):""}se.normalizeId=ot;function rd(t,e,r){return r=ot(r),t.resolve(e,r)}se.resolveUrl=rd;var sd=/^[a-z_][-a-z0-9._]*$/i;function nd(t,e){if(typeof t=="boolean")return{};let{schemaId:r,uriResolver:s}=this.opts,n=ot(t[r]||e),a={"":n},o=Da(s,n,!1),i={},c=new Set;return Qu(t,{allKeys:!0},(l,y,h,f)=>{if(f===void 0)return;let m=o+y,$=a[f];typeof l[r]=="string"&&($=g.call(this,l[r])),R.call(this,l.$anchor),R.call(this,l.$dynamicAnchor),a[y]=$;function g(q){let V=this.opts.uriResolver.resolve;if(q=ot($?V($,q):q),c.has(q))throw d(q);c.add(q);let S=this.refs[q];return typeof S=="string"&&(S=this.refs[S]),typeof S=="object"?u(l,S.schema,q):q!==ot(m)&&(q[0]==="#"?(u(l,i[q],q),i[q]=l):this.refs[q]=m),q}function R(q){if(typeof q=="string"){if(!sd.test(q))throw new Error(`invalid anchor "${q}"`);g.call(this,`#${q}`)}}}),i;function u(l,y,h){if(y!==void 0&&!Zu(l,y))throw d(h)}function d(l){return new Error(`reference "${l}" resolves to more than one schema`)}}se.getSchemaRefs=nd});var Ge=p(Te=>{"use strict";Object.defineProperty(Te,"__esModule",{value:!0});Te.getData=Te.KeywordCxt=Te.validateFunctionCode=void 0;var Fa=_a(),Va=jt(),ms=ss(),ir=jt(),ad=Sa(),Ot=ka(),fs=Ra(),b=E(),P=oe(),od=qt(),je=I(),Nt=tt();function id(t){if(Ga(t)&&(Ja(t),Ha(t))){dd(t);return}La(t,()=>(0,Fa.topBoolOrEmptySchema)(t))}Te.validateFunctionCode=id;function La({gen:t,validateName:e,schema:r,schemaEnv:s,opts:n},a){n.code.es5?t.func(e,(0,b._)`${P.default.data}, ${P.default.valCxt}`,s.$async,()=>{t.code((0,b._)`"use strict"; ${xa(r,n)}`),ud(t,n),t.code(a)}):t.func(e,(0,b._)`${P.default.data}, ${cd(n)}`,s.$async,()=>t.code(xa(r,n)).code(a))}function cd(t){return(0,b._)`{${P.default.instancePath}="", ${P.default.parentData}, ${P.default.parentDataProperty}, ${P.default.rootData}=${P.default.data}${t.dynamicRef?(0,b._)`, ${P.default.dynamicAnchors}={}`:b.nil}}={}`}function ud(t,e){t.if(P.default.valCxt,()=>{t.var(P.default.instancePath,(0,b._)`${P.default.valCxt}.${P.default.instancePath}`),t.var(P.default.parentData,(0,b._)`${P.default.valCxt}.${P.default.parentData}`),t.var(P.default.parentDataProperty,(0,b._)`${P.default.valCxt}.${P.default.parentDataProperty}`),t.var(P.default.rootData,(0,b._)`${P.default.valCxt}.${P.default.rootData}`),e.dynamicRef&&t.var(P.default.dynamicAnchors,(0,b._)`${P.default.valCxt}.${P.default.dynamicAnchors}`)},()=>{t.var(P.default.instancePath,(0,b._)`""`),t.var(P.default.parentData,(0,b._)`undefined`),t.var(P.default.parentDataProperty,(0,b._)`undefined`),t.var(P.default.rootData,P.default.data),e.dynamicRef&&t.var(P.default.dynamicAnchors,(0,b._)`{}`)})}function dd(t){let{schema:e,opts:r,gen:s}=t;La(t,()=>{r.$comment&&e.$comment&&Ya(t),hd(t),s.let(P.default.vErrors,null),s.let(P.default.errors,0),r.unevaluated&&ld(t),Wa(t),_d(t)})}function ld(t){let{gen:e,validateName:r}=t;t.evaluated=e.const("evaluated",(0,b._)`${r}.evaluated`),e.if((0,b._)`${t.evaluated}.dynamicProps`,()=>e.assign((0,b._)`${t.evaluated}.props`,(0,b._)`undefined`)),e.if((0,b._)`${t.evaluated}.dynamicItems`,()=>e.assign((0,b._)`${t.evaluated}.items`,(0,b._)`undefined`))}function xa(t,e){let r=typeof t=="object"&&t[e.schemaId];return r&&(e.code.source||e.code.process)?(0,b._)`/*# sourceURL=${r} */`:b.nil}function fd(t,e){if(Ga(t)&&(Ja(t),Ha(t))){md(t,e);return}(0,Fa.boolOrEmptySchema)(t,e)}function Ha({schema:t,self:e}){if(typeof t=="boolean")return!t;for(let r in t)if(e.RULES.all[r])return!0;return!1}function Ga(t){return typeof t.schema!="boolean"}function md(t,e){let{schema:r,gen:s,opts:n}=t;n.$comment&&r.$comment&&Ya(t),yd(t),$d(t);let a=s.const("_errs",P.default.errors);Wa(t,a),s.var(e,(0,b._)`${a} === ${P.default.errors}`)}function Ja(t){(0,je.checkUnknownRules)(t),pd(t)}function Wa(t,e){if(t.opts.jtd)return Ka(t,[],!1,e);let r=(0,Va.getSchemaTypes)(t.schema),s=(0,Va.coerceAndCheckDataType)(t,r);Ka(t,r,!s,e)}function pd(t){let{schema:e,errSchemaPath:r,opts:s,self:n}=t;e.$ref&&s.ignoreKeywordsWithRef&&(0,je.schemaHasRulesButRef)(e,n.RULES)&&n.logger.warn(`$ref: keywords ignored in schema at path "${r}"`)}function hd(t){let{schema:e,opts:r}=t;e.default!==void 0&&r.useDefaults&&r.strictSchema&&(0,je.checkStrictMode)(t,"default is ignored in the schema root")}function yd(t){let e=t.schema[t.opts.schemaId];e&&(t.baseId=(0,od.resolveUrl)(t.opts.uriResolver,t.baseId,e))}function $d(t){if(t.schema.$async&&!t.schemaEnv.$async)throw new Error("async schema in sync schema")}function Ya({gen:t,schemaEnv:e,schema:r,errSchemaPath:s,opts:n}){let a=r.$comment;if(n.$comment===!0)t.code((0,b._)`${P.default.self}.logger.log(${a})`);else if(typeof n.$comment=="function"){let o=(0,b.str)`${s}/$comment`,i=t.scopeValue("root",{ref:e.root});t.code((0,b._)`${P.default.self}.opts.$comment(${a}, ${o}, ${i}.schema)`)}}function _d(t){let{gen:e,schemaEnv:r,validateName:s,ValidationError:n,opts:a}=t;r.$async?e.if((0,b._)`${P.default.errors} === 0`,()=>e.return(P.default.data),()=>e.throw((0,b._)`new ${n}(${P.default.vErrors})`)):(e.assign((0,b._)`${s}.errors`,P.default.vErrors),a.unevaluated&&gd(t),e.return((0,b._)`${P.default.errors} === 0`))}function gd({gen:t,evaluated:e,props:r,items:s}){r instanceof b.Name&&t.assign((0,b._)`${e}.props`,r),s instanceof b.Name&&t.assign((0,b._)`${e}.items`,s)}function Ka(t,e,r,s){let{gen:n,schema:a,data:o,allErrors:i,opts:c,self:u}=t,{RULES:d}=u;if(a.$ref&&(c.ignoreKeywordsWithRef||!(0,je.schemaHasRulesButRef)(a,d))){n.block(()=>Qa(t,"$ref",d.all.$ref.definition));return}c.jtd||vd(t,e),n.block(()=>{for(let y of d.rules)l(y);l(d.post)});function l(y){(0,ms.shouldUseGroup)(a,y)&&(y.type?(n.if((0,ir.checkDataType)(y.type,o,c.strictNumbers)),Ua(t,y),e.length===1&&e[0]===y.type&&r&&(n.else(),(0,ir.reportTypeError)(t)),n.endIf()):Ua(t,y),i||n.if((0,b._)`${P.default.errors} === ${s||0}`))}}function Ua(t,e){let{gen:r,schema:s,opts:{useDefaults:n}}=t;n&&(0,ad.assignDefaults)(t,e.type),r.block(()=>{for(let a of e.rules)(0,ms.shouldUseRule)(s,a)&&Qa(t,a.keyword,a.definition,e.type)})}function vd(t,e){t.schemaEnv.meta||!t.opts.strictTypes||(bd(t,e),t.opts.allowUnionTypes||wd(t,e),Ed(t,t.dataTypes))}function bd(t,e){if(e.length){if(!t.dataTypes.length){t.dataTypes=e;return}e.forEach(r=>{Za(t.dataTypes,r)||ps(t,`type "${r}" not allowed by context "${t.dataTypes.join(",")}"`)}),Sd(t,e)}}function wd(t,e){e.length>1&&!(e.length===2&&e.includes("null"))&&ps(t,"use allowUnionTypes to allow union type keyword")}function Ed(t,e){let r=t.self.RULES.all;for(let s in r){let n=r[s];if(typeof n=="object"&&(0,ms.shouldUseRule)(t.schema,n)){let{type:a}=n.definition;a.length&&!a.some(o=>Pd(e,o))&&ps(t,`missing type "${a.join(",")}" for keyword "${s}"`)}}}function Pd(t,e){return t.includes(e)||e==="number"&&t.includes("integer")}function Za(t,e){return t.includes(e)||e==="integer"&&t.includes("number")}function Sd(t,e){let r=[];for(let s of t.dataTypes)Za(e,s)?r.push(s):e.includes("integer")&&s==="number"&&r.push("integer");t.dataTypes=r}function ps(t,e){let r=t.schemaEnv.baseId+t.errSchemaPath;e+=` at "${r}" (strictTypes)`,(0,je.checkStrictMode)(t,e,t.opts.strictTypes)}var cr=class{constructor(e,r,s){if((0,Ot.validateKeywordUsage)(e,r,s),this.gen=e.gen,this.allErrors=e.allErrors,this.keyword=s,this.data=e.data,this.schema=e.schema[s],this.$data=r.$data&&e.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,je.schemaRefOrVal)(e,this.schema,s,this.$data),this.schemaType=r.schemaType,this.parentSchema=e.schema,this.params={},this.it=e,this.def=r,this.$data)this.schemaCode=e.gen.const("vSchema",Ba(this.$data,e));else if(this.schemaCode=this.schemaValue,!(0,Ot.validSchemaType)(this.schema,r.schemaType,r.allowUndefined))throw new Error(`${s} value must be ${JSON.stringify(r.schemaType)}`);("code"in r?r.trackErrors:r.errors!==!1)&&(this.errsCount=e.gen.const("_errs",P.default.errors))}result(e,r,s){this.failResult((0,b.not)(e),r,s)}failResult(e,r,s){this.gen.if(e),s?s():this.error(),r?(this.gen.else(),r(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(e,r){this.failResult((0,b.not)(e),void 0,r)}fail(e){if(e===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(e),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(e){if(!this.$data)return this.fail(e);let{schemaCode:r}=this;this.fail((0,b._)`${r} !== undefined && (${(0,b.or)(this.invalid$data(),e)})`)}error(e,r,s){if(r){this.setParams(r),this._error(e,s),this.setParams({});return}this._error(e,s)}_error(e,r){(e?Nt.reportExtraError:Nt.reportError)(this,this.def.error,r)}$dataError(){(0,Nt.reportError)(this,this.def.$dataError||Nt.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,Nt.resetErrorsCount)(this.gen,this.errsCount)}ok(e){this.allErrors||this.gen.if(e)}setParams(e,r){r?Object.assign(this.params,e):this.params=e}block$data(e,r,s=b.nil){this.gen.block(()=>{this.check$data(e,s),r()})}check$data(e=b.nil,r=b.nil){if(!this.$data)return;let{gen:s,schemaCode:n,schemaType:a,def:o}=this;s.if((0,b.or)((0,b._)`${n} === undefined`,r)),e!==b.nil&&s.assign(e,!0),(a.length||o.validateSchema)&&(s.elseIf(this.invalid$data()),this.$dataError(),e!==b.nil&&s.assign(e,!1)),s.else()}invalid$data(){let{gen:e,schemaCode:r,schemaType:s,def:n,it:a}=this;return(0,b.or)(o(),i());function o(){if(s.length){if(!(r instanceof b.Name))throw new Error("ajv implementation error");let c=Array.isArray(s)?s:[s];return(0,b._)`${(0,ir.checkDataTypes)(c,r,a.opts.strictNumbers,ir.DataType.Wrong)}`}return b.nil}function i(){if(n.validateSchema){let c=e.scopeValue("validate$data",{ref:n.validateSchema});return(0,b._)`!${c}(${r})`}return b.nil}}subschema(e,r){let s=(0,fs.getSubschema)(this.it,e);(0,fs.extendSubschemaData)(s,this.it,e),(0,fs.extendSubschemaMode)(s,e);let n={...this.it,...s,items:void 0,props:void 0};return fd(n,r),n}mergeEvaluated(e,r){let{it:s,gen:n}=this;s.opts.unevaluated&&(s.props!==!0&&e.props!==void 0&&(s.props=je.mergeEvaluated.props(n,e.props,s.props,r)),s.items!==!0&&e.items!==void 0&&(s.items=je.mergeEvaluated.items(n,e.items,s.items,r)))}mergeValidEvaluated(e,r){let{it:s,gen:n}=this;if(s.opts.unevaluated&&(s.props!==!0||s.items!==!0))return n.if(r,()=>this.mergeEvaluated(e,b.Name)),!0}};Te.KeywordCxt=cr;function Qa(t,e,r,s){let n=new cr(t,r,e);"code"in r?r.code(n,s):n.$data&&r.validate?(0,Ot.funcKeywordCode)(n,r):"macro"in r?(0,Ot.macroKeywordCode)(n,r):(r.compile||r.validate)&&(0,Ot.funcKeywordCode)(n,r)}var jd=/^\/(?:[^~]|~0|~1)*$/,qd=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function Ba(t,{dataLevel:e,dataNames:r,dataPathArr:s}){let n,a;if(t==="")return P.default.rootData;if(t[0]==="/"){if(!jd.test(t))throw new Error(`Invalid JSON-pointer: ${t}`);n=t,a=P.default.rootData}else{let u=qd.exec(t);if(!u)throw new Error(`Invalid JSON-pointer: ${t}`);let d=+u[1];if(n=u[2],n==="#"){if(d>=e)throw new Error(c("property/index",d));return s[e-d]}if(d>e)throw new Error(c("data",d));if(a=r[e-d],!n)return a}let o=a,i=n.split("/");for(let u of i)u&&(a=(0,b._)`${a}${(0,b.getProperty)((0,je.unescapeJsonPointer)(u))}`,o=(0,b._)`${o} && ${a}`);return o;function c(u,d){return`Cannot access ${u} ${d} levels up, current level is ${e}`}}Te.getData=Ba});var kt=p(ys=>{"use strict";Object.defineProperty(ys,"__esModule",{value:!0});var hs=class extends Error{constructor(e){super("validation failed"),this.errors=e,this.ajv=this.validation=!0}};ys.default=hs});var it=p(gs=>{"use strict";Object.defineProperty(gs,"__esModule",{value:!0});var $s=qt(),_s=class extends Error{constructor(e,r,s,n){super(n||`can't resolve reference ${s} from id ${r}`),this.missingRef=(0,$s.resolveUrl)(e,r,s),this.missingSchema=(0,$s.normalizeId)((0,$s.getFullPath)(e,this.missingRef))}};gs.default=_s});var It=p(de=>{"use strict";Object.defineProperty(de,"__esModule",{value:!0});de.resolveSchema=de.getCompilingSchema=de.resolveRef=de.compileSchema=de.SchemaEnv=void 0;var me=E(),Nd=kt(),Je=oe(),pe=qt(),Xa=I(),Od=Ge(),ct=class{constructor(e){var r;this.refs={},this.dynamicAnchors={};let s;typeof e.schema=="object"&&(s=e.schema),this.schema=e.schema,this.schemaId=e.schemaId,this.root=e.root||this,this.baseId=(r=e.baseId)!==null&&r!==void 0?r:(0,pe.normalizeId)(s?.[e.schemaId||"$id"]),this.schemaPath=e.schemaPath,this.localRefs=e.localRefs,this.meta=e.meta,this.$async=s?.$async,this.refs={}}};de.SchemaEnv=ct;function bs(t){let e=eo.call(this,t);if(e)return e;let r=(0,pe.getFullPath)(this.opts.uriResolver,t.root.baseId),{es5:s,lines:n}=this.opts.code,{ownProperties:a}=this.opts,o=new me.CodeGen(this.scope,{es5:s,lines:n,ownProperties:a}),i;t.$async&&(i=o.scopeValue("Error",{ref:Nd.default,code:(0,me._)`require("ajv/dist/runtime/validation_error").default`}));let c=o.scopeName("validate");t.validateName=c;let u={gen:o,allErrors:this.opts.allErrors,data:Je.default.data,parentData:Je.default.parentData,parentDataProperty:Je.default.parentDataProperty,dataNames:[Je.default.data],dataPathArr:[me.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:o.scopeValue("schema",this.opts.code.source===!0?{ref:t.schema,code:(0,me.stringify)(t.schema)}:{ref:t.schema}),validateName:c,ValidationError:i,schema:t.schema,schemaEnv:t,rootId:r,baseId:t.baseId||r,schemaPath:me.nil,errSchemaPath:t.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,me._)`""`,opts:this.opts,self:this},d;try{this._compilations.add(t),(0,Od.validateFunctionCode)(u),o.optimize(this.opts.code.optimize);let l=o.toString();d=`${o.scopeRefs(Je.default.scope)}return ${l}`,this.opts.code.process&&(d=this.opts.code.process(d,t));let h=new Function(`${Je.default.self}`,`${Je.default.scope}`,d)(this,this.scope.get());if(this.scope.value(c,{ref:h}),h.errors=null,h.schema=t.schema,h.schemaEnv=t,t.$async&&(h.$async=!0),this.opts.code.source===!0&&(h.source={validateName:c,validateCode:l,scopeValues:o._values}),this.opts.unevaluated){let{props:f,items:m}=u;h.evaluated={props:f instanceof me.Name?void 0:f,items:m instanceof me.Name?void 0:m,dynamicProps:f instanceof me.Name,dynamicItems:m instanceof me.Name},h.source&&(h.source.evaluated=(0,me.stringify)(h.evaluated))}return t.validate=h,t}catch(l){throw delete t.validate,delete t.validateName,d&&this.logger.error("Error compiling schema, function code:",d),l}finally{this._compilations.delete(t)}}de.compileSchema=bs;function kd(t,e,r){var s;r=(0,pe.resolveUrl)(this.opts.uriResolver,e,r);let n=t.refs[r];if(n)return n;let a=Td.call(this,t,r);if(a===void 0){let o=(s=t.localRefs)===null||s===void 0?void 0:s[r],{schemaId:i}=this.opts;o&&(a=new ct({schema:o,schemaId:i,root:t,baseId:e}))}if(a!==void 0)return t.refs[r]=Id.call(this,a)}de.resolveRef=kd;function Id(t){return(0,pe.inlineRef)(t.schema,this.opts.inlineRefs)?t.schema:t.validate?t:bs.call(this,t)}function eo(t){for(let e of this._compilations)if(Rd(e,t))return e}de.getCompilingSchema=eo;function Rd(t,e){return t.schema===e.schema&&t.root===e.root&&t.baseId===e.baseId}function Td(t,e){let r;for(;typeof(r=this.refs[e])=="string";)e=r;return r||this.schemas[e]||ur.call(this,t,e)}function ur(t,e){let r=this.opts.uriResolver.parse(e),s=(0,pe._getFullPath)(this.opts.uriResolver,r),n=(0,pe.getFullPath)(this.opts.uriResolver,t.baseId,void 0);if(Object.keys(t.schema).length>0&&s===n)return vs.call(this,r,t);let a=(0,pe.normalizeId)(s),o=this.refs[a]||this.schemas[a];if(typeof o=="string"){let i=ur.call(this,t,o);return typeof i?.schema!="object"?void 0:vs.call(this,r,i)}if(typeof o?.schema=="object"){if(o.validate||bs.call(this,o),a===(0,pe.normalizeId)(e)){let{schema:i}=o,{schemaId:c}=this.opts,u=i[c];return u&&(n=(0,pe.resolveUrl)(this.opts.uriResolver,n,u)),new ct({schema:i,schemaId:c,root:t,baseId:n})}return vs.call(this,r,o)}}de.resolveSchema=ur;var Md=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function vs(t,{baseId:e,schema:r,root:s}){var n;if(((n=t.fragment)===null||n===void 0?void 0:n[0])!=="/")return;for(let i of t.fragment.slice(1).split("/")){if(typeof r=="boolean")return;let c=r[(0,Xa.unescapeFragment)(i)];if(c===void 0)return;r=c;let u=typeof r=="object"&&r[this.opts.schemaId];!Md.has(i)&&u&&(e=(0,pe.resolveUrl)(this.opts.uriResolver,e,u))}let a;if(typeof r!="boolean"&&r.$ref&&!(0,Xa.schemaHasRulesButRef)(r,this.RULES)){let i=(0,pe.resolveUrl)(this.opts.uriResolver,e,r.$ref);a=ur.call(this,s,i)}let{schemaId:o}=this.opts;if(a=a||new ct({schema:r,schemaId:o,root:s,baseId:e}),a.schema!==a.root.schema)return a}});var to=p((Xh,Ad)=>{Ad.exports={$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON AnySchema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}});var Es=p((ey,ao)=>{"use strict";var Cd=RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu),so=RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);function ws(t){let e="",r=0,s=0;for(s=0;s=48&&r<=57||r>=65&&r<=70||r>=97&&r<=102))return"";e+=t[s];break}for(s+=1;s=48&&r<=57||r>=65&&r<=70||r>=97&&r<=102))return"";e+=t[s]}return e}var Dd=RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);function ro(t){return t.length=0,!0}function zd(t,e,r){if(t.length){let s=ws(t);if(s!=="")e.push(s);else return r.error=!0,!1;t.length=0}return!0}function Vd(t){let e=0,r={error:!1,address:"",zone:""},s=[],n=[],a=!1,o=!1,i=zd;for(let c=0;c7){r.error=!0;break}c>0&&t[c-1]===":"&&(a=!0),s.push(":");continue}else if(u==="%"){if(!i(n,s,r))break;i=ro}else{n.push(u);continue}}return n.length&&(i===ro?r.zone=n.join(""):o?s.push(n.join("")):s.push(ws(n))),r.address=s.join(""),r}function no(t){if(xd(t,":")<2)return{host:t,isIPV6:!1};let e=Vd(t);if(e.error)return{host:t,isIPV6:!1};{let r=e.address,s=e.address;return e.zone&&(r+="%"+e.zone,s+="%25"+e.zone),{host:r,isIPV6:!0,escapedHost:s}}}function xd(t,e){let r=0;for(let s=0;s{"use strict";var{isUUID:Ld}=Es(),Hd=/([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu,Gd=["http","https","ws","wss","urn","urn:uuid"];function Jd(t){return Gd.indexOf(t)!==-1}function Ps(t){return t.secure===!0?!0:t.secure===!1?!1:t.scheme?t.scheme.length===3&&(t.scheme[0]==="w"||t.scheme[0]==="W")&&(t.scheme[1]==="s"||t.scheme[1]==="S")&&(t.scheme[2]==="s"||t.scheme[2]==="S"):!1}function oo(t){return t.host||(t.error=t.error||"HTTP URIs must have a host."),t}function io(t){let e=String(t.scheme).toLowerCase()==="https";return(t.port===(e?443:80)||t.port==="")&&(t.port=void 0),t.path||(t.path="/"),t}function Wd(t){return t.secure=Ps(t),t.resourceName=(t.path||"/")+(t.query?"?"+t.query:""),t.path=void 0,t.query=void 0,t}function Yd(t){if((t.port===(Ps(t)?443:80)||t.port==="")&&(t.port=void 0),typeof t.secure=="boolean"&&(t.scheme=t.secure?"wss":"ws",t.secure=void 0),t.resourceName){let[e,r]=t.resourceName.split("?");t.path=e&&e!=="/"?e:void 0,t.query=r,t.resourceName=void 0}return t.fragment=void 0,t}function Zd(t,e){if(!t.path)return t.error="URN can not be parsed",t;let r=t.path.match(Hd);if(r){let s=e.scheme||t.scheme||"urn";t.nid=r[1].toLowerCase(),t.nss=r[2];let n=`${s}:${e.nid||t.nid}`,a=Ss(n);t.path=void 0,a&&(t=a.parse(t,e))}else t.error=t.error||"URN can not be parsed.";return t}function Qd(t,e){if(t.nid===void 0)throw new Error("URN without nid cannot be serialized");let r=e.scheme||t.scheme||"urn",s=t.nid.toLowerCase(),n=`${r}:${e.nid||s}`,a=Ss(n);a&&(t=a.serialize(t,e));let o=t,i=t.nss;return o.path=`${s||e.nid}:${i}`,e.skipEscape=!0,o}function Bd(t,e){let r=t;return r.uuid=r.nss,r.nss=void 0,!e.tolerant&&(!r.uuid||!Ld(r.uuid))&&(r.error=r.error||"UUID is not valid."),r}function Xd(t){let e=t;return e.nss=(t.uuid||"").toLowerCase(),e}var co={scheme:"http",domainHost:!0,parse:oo,serialize:io},el={scheme:"https",domainHost:co.domainHost,parse:oo,serialize:io},dr={scheme:"ws",domainHost:!0,parse:Wd,serialize:Yd},tl={scheme:"wss",domainHost:dr.domainHost,parse:dr.parse,serialize:dr.serialize},rl={scheme:"urn",parse:Zd,serialize:Qd,skipNormalize:!0},sl={scheme:"urn:uuid",parse:Bd,serialize:Xd,skipNormalize:!0},lr={http:co,https:el,ws:dr,wss:tl,urn:rl,"urn:uuid":sl};Object.setPrototypeOf(lr,null);function Ss(t){return t&&(lr[t]||lr[t.toLowerCase()])||void 0}uo.exports={wsIsSecure:Ps,SCHEMES:lr,isValidSchemeName:Jd,getSchemeHandler:Ss}});var po=p((ry,mr)=>{"use strict";var{normalizeIPv6:nl,removeDotSegments:Rt,recomposeAuthority:al,normalizeComponentEncoding:fr,isIPv4:ol,nonSimpleDomain:il}=Es(),{SCHEMES:cl,getSchemeHandler:fo}=lo();function ul(t,e){return typeof t=="string"?t=ve(qe(t,e),e):typeof t=="object"&&(t=qe(ve(t,e),e)),t}function dl(t,e,r){let s=r?Object.assign({scheme:"null"},r):{scheme:"null"},n=mo(qe(t,s),qe(e,s),s,!0);return s.skipEscape=!0,ve(n,s)}function mo(t,e,r,s){let n={};return s||(t=qe(ve(t,r),r),e=qe(ve(e,r),r)),r=r||{},!r.tolerant&&e.scheme?(n.scheme=e.scheme,n.userinfo=e.userinfo,n.host=e.host,n.port=e.port,n.path=Rt(e.path||""),n.query=e.query):(e.userinfo!==void 0||e.host!==void 0||e.port!==void 0?(n.userinfo=e.userinfo,n.host=e.host,n.port=e.port,n.path=Rt(e.path||""),n.query=e.query):(e.path?(e.path[0]==="/"?n.path=Rt(e.path):((t.userinfo!==void 0||t.host!==void 0||t.port!==void 0)&&!t.path?n.path="/"+e.path:t.path?n.path=t.path.slice(0,t.path.lastIndexOf("/")+1)+e.path:n.path=e.path,n.path=Rt(n.path)),n.query=e.query):(n.path=t.path,e.query!==void 0?n.query=e.query:n.query=t.query),n.userinfo=t.userinfo,n.host=t.host,n.port=t.port),n.scheme=t.scheme),n.fragment=e.fragment,n}function ll(t,e,r){return typeof t=="string"?(t=unescape(t),t=ve(fr(qe(t,r),!0),{...r,skipEscape:!0})):typeof t=="object"&&(t=ve(fr(t,!0),{...r,skipEscape:!0})),typeof e=="string"?(e=unescape(e),e=ve(fr(qe(e,r),!0),{...r,skipEscape:!0})):typeof e=="object"&&(e=ve(fr(e,!0),{...r,skipEscape:!0})),t.toLowerCase()===e.toLowerCase()}function ve(t,e){let r={host:t.host,scheme:t.scheme,userinfo:t.userinfo,port:t.port,path:t.path,query:t.query,nid:t.nid,nss:t.nss,uuid:t.uuid,fragment:t.fragment,reference:t.reference,resourceName:t.resourceName,secure:t.secure,error:""},s=Object.assign({},e),n=[],a=fo(s.scheme||r.scheme);a&&a.serialize&&a.serialize(r,s),r.path!==void 0&&(s.skipEscape?r.path=unescape(r.path):(r.path=escape(r.path),r.scheme!==void 0&&(r.path=r.path.split("%3A").join(":")))),s.reference!=="suffix"&&r.scheme&&n.push(r.scheme,":");let o=al(r);if(o!==void 0&&(s.reference!=="suffix"&&n.push("//"),n.push(o),r.path&&r.path[0]!=="/"&&n.push("/")),r.path!==void 0){let i=r.path;!s.absolutePath&&(!a||!a.absolutePath)&&(i=Rt(i)),o===void 0&&i[0]==="/"&&i[1]==="/"&&(i="/%2F"+i.slice(2)),n.push(i)}return r.query!==void 0&&n.push("?",r.query),r.fragment!==void 0&&n.push("#",r.fragment),n.join("")}var fl=/^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;function qe(t,e){let r=Object.assign({},e),s={scheme:void 0,userinfo:void 0,host:"",port:void 0,path:"",query:void 0,fragment:void 0},n=!1;r.reference==="suffix"&&(r.scheme?t=r.scheme+":"+t:t="//"+t);let a=t.match(fl);if(a){if(s.scheme=a[1],s.userinfo=a[3],s.host=a[4],s.port=parseInt(a[5],10),s.path=a[6]||"",s.query=a[7],s.fragment=a[8],isNaN(s.port)&&(s.port=a[5]),s.host)if(ol(s.host)===!1){let c=nl(s.host);s.host=c.host.toLowerCase(),n=c.isIPV6}else n=!0;s.scheme===void 0&&s.userinfo===void 0&&s.host===void 0&&s.port===void 0&&s.query===void 0&&!s.path?s.reference="same-document":s.scheme===void 0?s.reference="relative":s.fragment===void 0?s.reference="absolute":s.reference="uri",r.reference&&r.reference!=="suffix"&&r.reference!==s.reference&&(s.error=s.error||"URI is not a "+r.reference+" reference.");let o=fo(r.scheme||s.scheme);if(!r.unicodeSupport&&(!o||!o.unicodeSupport)&&s.host&&(r.domainHost||o&&o.domainHost)&&n===!1&&il(s.host))try{s.host=URL.domainToASCII(s.host.toLowerCase())}catch(i){s.error=s.error||"Host's domain name can not be converted to ASCII: "+i}(!o||o&&!o.skipNormalize)&&(t.indexOf("%")!==-1&&(s.scheme!==void 0&&(s.scheme=unescape(s.scheme)),s.host!==void 0&&(s.host=unescape(s.host))),s.path&&(s.path=escape(unescape(s.path))),s.fragment&&(s.fragment=encodeURI(decodeURIComponent(s.fragment)))),o&&o.parse&&o.parse(s,r)}else s.error=s.error||"URI can not be parsed.";return s}var js={SCHEMES:cl,normalize:ul,resolve:dl,resolveComponent:mo,equal:ll,serialize:ve,parse:qe};mr.exports=js;mr.exports.default=js;mr.exports.fastUri=js});var yo=p(qs=>{"use strict";Object.defineProperty(qs,"__esModule",{value:!0});var ho=po();ho.code='require("ajv/dist/runtime/uri").default';qs.default=ho});var ks=p(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});W.CodeGen=W.Name=W.nil=W.stringify=W.str=W._=W.KeywordCxt=void 0;var ml=Ge();Object.defineProperty(W,"KeywordCxt",{enumerable:!0,get:function(){return ml.KeywordCxt}});var ut=E();Object.defineProperty(W,"_",{enumerable:!0,get:function(){return ut._}});Object.defineProperty(W,"str",{enumerable:!0,get:function(){return ut.str}});Object.defineProperty(W,"stringify",{enumerable:!0,get:function(){return ut.stringify}});Object.defineProperty(W,"nil",{enumerable:!0,get:function(){return ut.nil}});Object.defineProperty(W,"Name",{enumerable:!0,get:function(){return ut.Name}});Object.defineProperty(W,"CodeGen",{enumerable:!0,get:function(){return ut.CodeGen}});var pl=kt(),bo=it(),hl=rs(),Tt=It(),yl=E(),Mt=qt(),pr=jt(),Os=I(),$o=to(),$l=yo(),wo=(t,e)=>new RegExp(t,e);wo.code="new RegExp";var _l=["removeAdditional","useDefaults","coerceTypes"],gl=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),vl={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},bl={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},_o=200;function wl(t){var e,r,s,n,a,o,i,c,u,d,l,y,h,f,m,$,g,R,q,V,S,v,w,N,z;let H=t.strict,G=(e=t.code)===null||e===void 0?void 0:e.optimize,T=G===!0||G===void 0?1:G||0,D=(s=(r=t.code)===null||r===void 0?void 0:r.regExp)!==null&&s!==void 0?s:wo,ie=(n=t.uriResolver)!==null&&n!==void 0?n:$l.default;return{strictSchema:(o=(a=t.strictSchema)!==null&&a!==void 0?a:H)!==null&&o!==void 0?o:!0,strictNumbers:(c=(i=t.strictNumbers)!==null&&i!==void 0?i:H)!==null&&c!==void 0?c:!0,strictTypes:(d=(u=t.strictTypes)!==null&&u!==void 0?u:H)!==null&&d!==void 0?d:"log",strictTuples:(y=(l=t.strictTuples)!==null&&l!==void 0?l:H)!==null&&y!==void 0?y:"log",strictRequired:(f=(h=t.strictRequired)!==null&&h!==void 0?h:H)!==null&&f!==void 0?f:!1,code:t.code?{...t.code,optimize:T,regExp:D}:{optimize:T,regExp:D},loopRequired:(m=t.loopRequired)!==null&&m!==void 0?m:_o,loopEnum:($=t.loopEnum)!==null&&$!==void 0?$:_o,meta:(g=t.meta)!==null&&g!==void 0?g:!0,messages:(R=t.messages)!==null&&R!==void 0?R:!0,inlineRefs:(q=t.inlineRefs)!==null&&q!==void 0?q:!0,schemaId:(V=t.schemaId)!==null&&V!==void 0?V:"$id",addUsedSchema:(S=t.addUsedSchema)!==null&&S!==void 0?S:!0,validateSchema:(v=t.validateSchema)!==null&&v!==void 0?v:!0,validateFormats:(w=t.validateFormats)!==null&&w!==void 0?w:!0,unicodeRegExp:(N=t.unicodeRegExp)!==null&&N!==void 0?N:!0,int32range:(z=t.int32range)!==null&&z!==void 0?z:!0,uriResolver:ie}}var At=class{constructor(e={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,e=this.opts={...e,...wl(e)};let{es5:r,lines:s}=this.opts.code;this.scope=new yl.ValueScope({scope:{},prefixes:gl,es5:r,lines:s}),this.logger=Nl(e.logger);let n=e.validateFormats;e.validateFormats=!1,this.RULES=(0,hl.getRules)(),go.call(this,vl,e,"NOT SUPPORTED"),go.call(this,bl,e,"DEPRECATED","warn"),this._metaOpts=jl.call(this),e.formats&&Pl.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),e.keywords&&Sl.call(this,e.keywords),typeof e.meta=="object"&&this.addMetaSchema(e.meta),El.call(this),e.validateFormats=n}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){let{$data:e,meta:r,schemaId:s}=this.opts,n=$o;s==="id"&&(n={...$o},n.id=n.$id,delete n.$id),r&&e&&this.addMetaSchema(n,n[s],!1)}defaultMeta(){let{meta:e,schemaId:r}=this.opts;return this.opts.defaultMeta=typeof e=="object"?e[r]||e:void 0}validate(e,r){let s;if(typeof e=="string"){if(s=this.getSchema(e),!s)throw new Error(`no schema with key or ref "${e}"`)}else s=this.compile(e);let n=s(r);return"$async"in s||(this.errors=s.errors),n}compile(e,r){let s=this._addSchema(e,r);return s.validate||this._compileSchemaEnv(s)}compileAsync(e,r){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");let{loadSchema:s}=this.opts;return n.call(this,e,r);async function n(d,l){await a.call(this,d.$schema);let y=this._addSchema(d,l);return y.validate||o.call(this,y)}async function a(d){d&&!this.getSchema(d)&&await n.call(this,{$ref:d},!0)}async function o(d){try{return this._compileSchemaEnv(d)}catch(l){if(!(l instanceof bo.default))throw l;return i.call(this,l),await c.call(this,l.missingSchema),o.call(this,d)}}function i({missingSchema:d,missingRef:l}){if(this.refs[d])throw new Error(`AnySchema ${d} is loaded but ${l} cannot be resolved`)}async function c(d){let l=await u.call(this,d);this.refs[d]||await a.call(this,l.$schema),this.refs[d]||this.addSchema(l,d,r)}async function u(d){let l=this._loading[d];if(l)return l;try{return await(this._loading[d]=s(d))}finally{delete this._loading[d]}}}addSchema(e,r,s,n=this.opts.validateSchema){if(Array.isArray(e)){for(let o of e)this.addSchema(o,void 0,s,n);return this}let a;if(typeof e=="object"){let{schemaId:o}=this.opts;if(a=e[o],a!==void 0&&typeof a!="string")throw new Error(`schema ${o} must be string`)}return r=(0,Mt.normalizeId)(r||a),this._checkUnique(r),this.schemas[r]=this._addSchema(e,s,r,n,!0),this}addMetaSchema(e,r,s=this.opts.validateSchema){return this.addSchema(e,r,!0,s),this}validateSchema(e,r){if(typeof e=="boolean")return!0;let s;if(s=e.$schema,s!==void 0&&typeof s!="string")throw new Error("$schema must be a string");if(s=s||this.opts.defaultMeta||this.defaultMeta(),!s)return this.logger.warn("meta-schema not available"),this.errors=null,!0;let n=this.validate(s,e);if(!n&&r){let a="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(a);else throw new Error(a)}return n}getSchema(e){let r;for(;typeof(r=vo.call(this,e))=="string";)e=r;if(r===void 0){let{schemaId:s}=this.opts,n=new Tt.SchemaEnv({schema:{},schemaId:s});if(r=Tt.resolveSchema.call(this,n,e),!r)return;this.refs[e]=r}return r.validate||this._compileSchemaEnv(r)}removeSchema(e){if(e instanceof RegExp)return this._removeAllSchemas(this.schemas,e),this._removeAllSchemas(this.refs,e),this;switch(typeof e){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{let r=vo.call(this,e);return typeof r=="object"&&this._cache.delete(r.schema),delete this.schemas[e],delete this.refs[e],this}case"object":{let r=e;this._cache.delete(r);let s=e[this.opts.schemaId];return s&&(s=(0,Mt.normalizeId)(s),delete this.schemas[s],delete this.refs[s]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(e){for(let r of e)this.addKeyword(r);return this}addKeyword(e,r){let s;if(typeof e=="string")s=e,typeof r=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),r.keyword=s);else if(typeof e=="object"&&r===void 0){if(r=e,s=r.keyword,Array.isArray(s)&&!s.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(kl.call(this,s,r),!r)return(0,Os.eachItem)(s,a=>Ns.call(this,a)),this;Rl.call(this,r);let n={...r,type:(0,pr.getJSONTypes)(r.type),schemaType:(0,pr.getJSONTypes)(r.schemaType)};return(0,Os.eachItem)(s,n.type.length===0?a=>Ns.call(this,a,n):a=>n.type.forEach(o=>Ns.call(this,a,n,o))),this}getKeyword(e){let r=this.RULES.all[e];return typeof r=="object"?r.definition:!!r}removeKeyword(e){let{RULES:r}=this;delete r.keywords[e],delete r.all[e];for(let s of r.rules){let n=s.rules.findIndex(a=>a.keyword===e);n>=0&&s.rules.splice(n,1)}return this}addFormat(e,r){return typeof r=="string"&&(r=new RegExp(r)),this.formats[e]=r,this}errorsText(e=this.errors,{separator:r=", ",dataVar:s="data"}={}){return!e||e.length===0?"No errors":e.map(n=>`${s}${n.instancePath} ${n.message}`).reduce((n,a)=>n+r+a)}$dataMetaSchema(e,r){let s=this.RULES.all;e=JSON.parse(JSON.stringify(e));for(let n of r){let a=n.split("/").slice(1),o=e;for(let i of a)o=o[i];for(let i in s){let c=s[i];if(typeof c!="object")continue;let{$data:u}=c.definition,d=o[i];u&&d&&(o[i]=Eo(d))}}return e}_removeAllSchemas(e,r){for(let s in e){let n=e[s];(!r||r.test(s))&&(typeof n=="string"?delete e[s]:n&&!n.meta&&(this._cache.delete(n.schema),delete e[s]))}}_addSchema(e,r,s,n=this.opts.validateSchema,a=this.opts.addUsedSchema){let o,{schemaId:i}=this.opts;if(typeof e=="object")o=e[i];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof e!="boolean")throw new Error("schema must be object or boolean")}let c=this._cache.get(e);if(c!==void 0)return c;s=(0,Mt.normalizeId)(o||s);let u=Mt.getSchemaRefs.call(this,e,s);return c=new Tt.SchemaEnv({schema:e,schemaId:i,meta:r,baseId:s,localRefs:u}),this._cache.set(c.schema,c),a&&!s.startsWith("#")&&(s&&this._checkUnique(s),this.refs[s]=c),n&&this.validateSchema(e,!0),c}_checkUnique(e){if(this.schemas[e]||this.refs[e])throw new Error(`schema with key or id "${e}" already exists`)}_compileSchemaEnv(e){if(e.meta?this._compileMetaSchema(e):Tt.compileSchema.call(this,e),!e.validate)throw new Error("ajv implementation error");return e.validate}_compileMetaSchema(e){let r=this.opts;this.opts=this._metaOpts;try{Tt.compileSchema.call(this,e)}finally{this.opts=r}}};At.ValidationError=pl.default;At.MissingRefError=bo.default;W.default=At;function go(t,e,r,s="error"){for(let n in t){let a=n;a in e&&this.logger[s](`${r}: option ${n}. ${t[a]}`)}}function vo(t){return t=(0,Mt.normalizeId)(t),this.schemas[t]||this.refs[t]}function El(){let t=this.opts.schemas;if(t)if(Array.isArray(t))this.addSchema(t);else for(let e in t)this.addSchema(t[e],e)}function Pl(){for(let t in this.opts.formats){let e=this.opts.formats[t];e&&this.addFormat(t,e)}}function Sl(t){if(Array.isArray(t)){this.addVocabulary(t);return}this.logger.warn("keywords option as map is deprecated, pass array");for(let e in t){let r=t[e];r.keyword||(r.keyword=e),this.addKeyword(r)}}function jl(){let t={...this.opts};for(let e of _l)delete t[e];return t}var ql={log(){},warn(){},error(){}};function Nl(t){if(t===!1)return ql;if(t===void 0)return console;if(t.log&&t.warn&&t.error)return t;throw new Error("logger must implement log, warn and error methods")}var Ol=/^[a-z_$][a-z0-9_$:-]*$/i;function kl(t,e){let{RULES:r}=this;if((0,Os.eachItem)(t,s=>{if(r.keywords[s])throw new Error(`Keyword ${s} is already defined`);if(!Ol.test(s))throw new Error(`Keyword ${s} has invalid name`)}),!!e&&e.$data&&!("code"in e||"validate"in e))throw new Error('$data keyword must have "code" or "validate" function')}function Ns(t,e,r){var s;let n=e?.post;if(r&&n)throw new Error('keyword with "post" flag cannot have "type"');let{RULES:a}=this,o=n?a.post:a.rules.find(({type:c})=>c===r);if(o||(o={type:r,rules:[]},a.rules.push(o)),a.keywords[t]=!0,!e)return;let i={keyword:t,definition:{...e,type:(0,pr.getJSONTypes)(e.type),schemaType:(0,pr.getJSONTypes)(e.schemaType)}};e.before?Il.call(this,o,i,e.before):o.rules.push(i),a.all[t]=i,(s=e.implements)===null||s===void 0||s.forEach(c=>this.addKeyword(c))}function Il(t,e,r){let s=t.rules.findIndex(n=>n.keyword===r);s>=0?t.rules.splice(s,0,e):(t.rules.push(e),this.logger.warn(`rule ${r} is not defined`))}function Rl(t){let{metaSchema:e}=t;e!==void 0&&(t.$data&&this.opts.$data&&(e=Eo(e)),t.validateSchema=this.compile(e,!0))}var Tl={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function Eo(t){return{anyOf:[t,Tl]}}});var Po=p(Is=>{"use strict";Object.defineProperty(Is,"__esModule",{value:!0});var Ml={keyword:"id",code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID')}};Is.default=Ml});var $r=p(We=>{"use strict";Object.defineProperty(We,"__esModule",{value:!0});We.callRef=We.getValidate=void 0;var Al=it(),So=ue(),ne=E(),dt=oe(),jo=It(),hr=I(),Cl={keyword:"$ref",schemaType:"string",code(t){let{gen:e,schema:r,it:s}=t,{baseId:n,schemaEnv:a,validateName:o,opts:i,self:c}=s,{root:u}=a;if((r==="#"||r==="#/")&&n===u.baseId)return l();let d=jo.resolveRef.call(c,u,n,r);if(d===void 0)throw new Al.default(s.opts.uriResolver,n,r);if(d instanceof jo.SchemaEnv)return y(d);return h(d);function l(){if(a===u)return yr(t,o,a,a.$async);let f=e.scopeValue("root",{ref:u});return yr(t,(0,ne._)`${f}.validate`,u,u.$async)}function y(f){let m=qo(t,f);yr(t,m,f,f.$async)}function h(f){let m=e.scopeValue("schema",i.code.source===!0?{ref:f,code:(0,ne.stringify)(f)}:{ref:f}),$=e.name("valid"),g=t.subschema({schema:f,dataTypes:[],schemaPath:ne.nil,topSchemaRef:m,errSchemaPath:r},$);t.mergeEvaluated(g),t.ok($)}}};function qo(t,e){let{gen:r}=t;return e.validate?r.scopeValue("validate",{ref:e.validate}):(0,ne._)`${r.scopeValue("wrapper",{ref:e})}.validate`}We.getValidate=qo;function yr(t,e,r,s){let{gen:n,it:a}=t,{allErrors:o,schemaEnv:i,opts:c}=a,u=c.passContext?dt.default.this:ne.nil;s?d():l();function d(){if(!i.$async)throw new Error("async schema referenced by sync schema");let f=n.let("valid");n.try(()=>{n.code((0,ne._)`await ${(0,So.callValidateCode)(t,e,u)}`),h(e),o||n.assign(f,!0)},m=>{n.if((0,ne._)`!(${m} instanceof ${a.ValidationError})`,()=>n.throw(m)),y(m),o||n.assign(f,!1)}),t.ok(f)}function l(){t.result((0,So.callValidateCode)(t,e,u),()=>h(e),()=>y(e))}function y(f){let m=(0,ne._)`${f}.errors`;n.assign(dt.default.vErrors,(0,ne._)`${dt.default.vErrors} === null ? ${m} : ${dt.default.vErrors}.concat(${m})`),n.assign(dt.default.errors,(0,ne._)`${dt.default.vErrors}.length`)}function h(f){var m;if(!a.opts.unevaluated)return;let $=(m=r?.validate)===null||m===void 0?void 0:m.evaluated;if(a.props!==!0)if($&&!$.dynamicProps)$.props!==void 0&&(a.props=hr.mergeEvaluated.props(n,$.props,a.props));else{let g=n.var("props",(0,ne._)`${f}.evaluated.props`);a.props=hr.mergeEvaluated.props(n,g,a.props,ne.Name)}if(a.items!==!0)if($&&!$.dynamicItems)$.items!==void 0&&(a.items=hr.mergeEvaluated.items(n,$.items,a.items));else{let g=n.var("items",(0,ne._)`${f}.evaluated.items`);a.items=hr.mergeEvaluated.items(n,g,a.items,ne.Name)}}}We.callRef=yr;We.default=Cl});var Ts=p(Rs=>{"use strict";Object.defineProperty(Rs,"__esModule",{value:!0});var Dl=Po(),zl=$r(),Vl=["$schema","$id","$defs","$vocabulary",{keyword:"$comment"},"definitions",Dl.default,zl.default];Rs.default=Vl});var No=p(Ms=>{"use strict";Object.defineProperty(Ms,"__esModule",{value:!0});var _r=E(),Me=_r.operators,gr={maximum:{okStr:"<=",ok:Me.LTE,fail:Me.GT},minimum:{okStr:">=",ok:Me.GTE,fail:Me.LT},exclusiveMaximum:{okStr:"<",ok:Me.LT,fail:Me.GTE},exclusiveMinimum:{okStr:">",ok:Me.GT,fail:Me.LTE}},xl={message:({keyword:t,schemaCode:e})=>(0,_r.str)`must be ${gr[t].okStr} ${e}`,params:({keyword:t,schemaCode:e})=>(0,_r._)`{comparison: ${gr[t].okStr}, limit: ${e}}`},Kl={keyword:Object.keys(gr),type:"number",schemaType:"number",$data:!0,error:xl,code(t){let{keyword:e,data:r,schemaCode:s}=t;t.fail$data((0,_r._)`${r} ${gr[e].fail} ${s} || isNaN(${r})`)}};Ms.default=Kl});var Oo=p(As=>{"use strict";Object.defineProperty(As,"__esModule",{value:!0});var Ct=E(),Ul={message:({schemaCode:t})=>(0,Ct.str)`must be multiple of ${t}`,params:({schemaCode:t})=>(0,Ct._)`{multipleOf: ${t}}`},Fl={keyword:"multipleOf",type:"number",schemaType:"number",$data:!0,error:Ul,code(t){let{gen:e,data:r,schemaCode:s,it:n}=t,a=n.opts.multipleOfPrecision,o=e.let("res"),i=a?(0,Ct._)`Math.abs(Math.round(${o}) - ${o}) > 1e-${a}`:(0,Ct._)`${o} !== parseInt(${o})`;t.fail$data((0,Ct._)`(${s} === 0 || (${o} = ${r}/${s}, ${i}))`)}};As.default=Fl});var Io=p(Cs=>{"use strict";Object.defineProperty(Cs,"__esModule",{value:!0});function ko(t){let e=t.length,r=0,s=0,n;for(;s=55296&&n<=56319&&s{"use strict";Object.defineProperty(Ds,"__esModule",{value:!0});var Ye=E(),Ll=I(),Hl=Io(),Gl={message({keyword:t,schemaCode:e}){let r=t==="maxLength"?"more":"fewer";return(0,Ye.str)`must NOT have ${r} than ${e} characters`},params:({schemaCode:t})=>(0,Ye._)`{limit: ${t}}`},Jl={keyword:["maxLength","minLength"],type:"string",schemaType:"number",$data:!0,error:Gl,code(t){let{keyword:e,data:r,schemaCode:s,it:n}=t,a=e==="maxLength"?Ye.operators.GT:Ye.operators.LT,o=n.opts.unicode===!1?(0,Ye._)`${r}.length`:(0,Ye._)`${(0,Ll.useFunc)(t.gen,Hl.default)}(${r})`;t.fail$data((0,Ye._)`${o} ${a} ${s}`)}};Ds.default=Jl});var To=p(zs=>{"use strict";Object.defineProperty(zs,"__esModule",{value:!0});var Wl=ue(),vr=E(),Yl={message:({schemaCode:t})=>(0,vr.str)`must match pattern "${t}"`,params:({schemaCode:t})=>(0,vr._)`{pattern: ${t}}`},Zl={keyword:"pattern",type:"string",schemaType:"string",$data:!0,error:Yl,code(t){let{data:e,$data:r,schema:s,schemaCode:n,it:a}=t,o=a.opts.unicodeRegExp?"u":"",i=r?(0,vr._)`(new RegExp(${n}, ${o}))`:(0,Wl.usePattern)(t,s);t.fail$data((0,vr._)`!${i}.test(${e})`)}};zs.default=Zl});var Mo=p(Vs=>{"use strict";Object.defineProperty(Vs,"__esModule",{value:!0});var Dt=E(),Ql={message({keyword:t,schemaCode:e}){let r=t==="maxProperties"?"more":"fewer";return(0,Dt.str)`must NOT have ${r} than ${e} properties`},params:({schemaCode:t})=>(0,Dt._)`{limit: ${t}}`},Bl={keyword:["maxProperties","minProperties"],type:"object",schemaType:"number",$data:!0,error:Ql,code(t){let{keyword:e,data:r,schemaCode:s}=t,n=e==="maxProperties"?Dt.operators.GT:Dt.operators.LT;t.fail$data((0,Dt._)`Object.keys(${r}).length ${n} ${s}`)}};Vs.default=Bl});var Ao=p(xs=>{"use strict";Object.defineProperty(xs,"__esModule",{value:!0});var zt=ue(),Vt=E(),Xl=I(),ef={message:({params:{missingProperty:t}})=>(0,Vt.str)`must have required property '${t}'`,params:({params:{missingProperty:t}})=>(0,Vt._)`{missingProperty: ${t}}`},tf={keyword:"required",type:"object",schemaType:"array",$data:!0,error:ef,code(t){let{gen:e,schema:r,schemaCode:s,data:n,$data:a,it:o}=t,{opts:i}=o;if(!a&&r.length===0)return;let c=r.length>=i.loopRequired;if(o.allErrors?u():d(),i.strictRequired){let h=t.parentSchema.properties,{definedProperties:f}=t.it;for(let m of r)if(h?.[m]===void 0&&!f.has(m)){let $=o.schemaEnv.baseId+o.errSchemaPath,g=`required property "${m}" is not defined at "${$}" (strictRequired)`;(0,Xl.checkStrictMode)(o,g,o.opts.strictRequired)}}function u(){if(c||a)t.block$data(Vt.nil,l);else for(let h of r)(0,zt.checkReportMissingProp)(t,h)}function d(){let h=e.let("missing");if(c||a){let f=e.let("valid",!0);t.block$data(f,()=>y(h,f)),t.ok(f)}else e.if((0,zt.checkMissingProp)(t,r,h)),(0,zt.reportMissingProp)(t,h),e.else()}function l(){e.forOf("prop",s,h=>{t.setParams({missingProperty:h}),e.if((0,zt.noPropertyInData)(e,n,h,i.ownProperties),()=>t.error())})}function y(h,f){t.setParams({missingProperty:h}),e.forOf(h,s,()=>{e.assign(f,(0,zt.propertyInData)(e,n,h,i.ownProperties)),e.if((0,Vt.not)(f),()=>{t.error(),e.break()})},Vt.nil)}}};xs.default=tf});var Co=p(Ks=>{"use strict";Object.defineProperty(Ks,"__esModule",{value:!0});var xt=E(),rf={message({keyword:t,schemaCode:e}){let r=t==="maxItems"?"more":"fewer";return(0,xt.str)`must NOT have ${r} than ${e} items`},params:({schemaCode:t})=>(0,xt._)`{limit: ${t}}`},sf={keyword:["maxItems","minItems"],type:"array",schemaType:"number",$data:!0,error:rf,code(t){let{keyword:e,data:r,schemaCode:s}=t,n=e==="maxItems"?xt.operators.GT:xt.operators.LT;t.fail$data((0,xt._)`${r}.length ${n} ${s}`)}};Ks.default=sf});var br=p(Us=>{"use strict";Object.defineProperty(Us,"__esModule",{value:!0});var Do=ds();Do.code='require("ajv/dist/runtime/equal").default';Us.default=Do});var zo=p(Ls=>{"use strict";Object.defineProperty(Ls,"__esModule",{value:!0});var Fs=jt(),Y=E(),nf=I(),af=br(),of={message:({params:{i:t,j:e}})=>(0,Y.str)`must NOT have duplicate items (items ## ${e} and ${t} are identical)`,params:({params:{i:t,j:e}})=>(0,Y._)`{i: ${t}, j: ${e}}`},cf={keyword:"uniqueItems",type:"array",schemaType:"boolean",$data:!0,error:of,code(t){let{gen:e,data:r,$data:s,schema:n,parentSchema:a,schemaCode:o,it:i}=t;if(!s&&!n)return;let c=e.let("valid"),u=a.items?(0,Fs.getSchemaTypes)(a.items):[];t.block$data(c,d,(0,Y._)`${o} === false`),t.ok(c);function d(){let f=e.let("i",(0,Y._)`${r}.length`),m=e.let("j");t.setParams({i:f,j:m}),e.assign(c,!0),e.if((0,Y._)`${f} > 1`,()=>(l()?y:h)(f,m))}function l(){return u.length>0&&!u.some(f=>f==="object"||f==="array")}function y(f,m){let $=e.name("item"),g=(0,Fs.checkDataTypes)(u,$,i.opts.strictNumbers,Fs.DataType.Wrong),R=e.const("indices",(0,Y._)`{}`);e.for((0,Y._)`;${f}--;`,()=>{e.let($,(0,Y._)`${r}[${f}]`),e.if(g,(0,Y._)`continue`),u.length>1&&e.if((0,Y._)`typeof ${$} == "string"`,(0,Y._)`${$} += "_"`),e.if((0,Y._)`typeof ${R}[${$}] == "number"`,()=>{e.assign(m,(0,Y._)`${R}[${$}]`),t.error(),e.assign(c,!1).break()}).code((0,Y._)`${R}[${$}] = ${f}`)})}function h(f,m){let $=(0,nf.useFunc)(e,af.default),g=e.name("outer");e.label(g).for((0,Y._)`;${f}--;`,()=>e.for((0,Y._)`${m} = ${f}; ${m}--;`,()=>e.if((0,Y._)`${$}(${r}[${f}], ${r}[${m}])`,()=>{t.error(),e.assign(c,!1).break(g)})))}}};Ls.default=cf});var Vo=p(Gs=>{"use strict";Object.defineProperty(Gs,"__esModule",{value:!0});var Hs=E(),uf=I(),df=br(),lf={message:"must be equal to constant",params:({schemaCode:t})=>(0,Hs._)`{allowedValue: ${t}}`},ff={keyword:"const",$data:!0,error:lf,code(t){let{gen:e,data:r,$data:s,schemaCode:n,schema:a}=t;s||a&&typeof a=="object"?t.fail$data((0,Hs._)`!${(0,uf.useFunc)(e,df.default)}(${r}, ${n})`):t.fail((0,Hs._)`${a} !== ${r}`)}};Gs.default=ff});var xo=p(Js=>{"use strict";Object.defineProperty(Js,"__esModule",{value:!0});var Kt=E(),mf=I(),pf=br(),hf={message:"must be equal to one of the allowed values",params:({schemaCode:t})=>(0,Kt._)`{allowedValues: ${t}}`},yf={keyword:"enum",schemaType:"array",$data:!0,error:hf,code(t){let{gen:e,data:r,$data:s,schema:n,schemaCode:a,it:o}=t;if(!s&&n.length===0)throw new Error("enum must have non-empty array");let i=n.length>=o.opts.loopEnum,c,u=()=>c??(c=(0,mf.useFunc)(e,pf.default)),d;if(i||s)d=e.let("valid"),t.block$data(d,l);else{if(!Array.isArray(n))throw new Error("ajv implementation error");let h=e.const("vSchema",a);d=(0,Kt.or)(...n.map((f,m)=>y(h,m)))}t.pass(d);function l(){e.assign(d,!1),e.forOf("v",a,h=>e.if((0,Kt._)`${u()}(${r}, ${h})`,()=>e.assign(d,!0).break()))}function y(h,f){let m=n[f];return typeof m=="object"&&m!==null?(0,Kt._)`${u()}(${r}, ${h}[${f}])`:(0,Kt._)`${r} === ${m}`}}};Js.default=yf});var Ys=p(Ws=>{"use strict";Object.defineProperty(Ws,"__esModule",{value:!0});var $f=No(),_f=Oo(),gf=Ro(),vf=To(),bf=Mo(),wf=Ao(),Ef=Co(),Pf=zo(),Sf=Vo(),jf=xo(),qf=[$f.default,_f.default,gf.default,vf.default,bf.default,wf.default,Ef.default,Pf.default,{keyword:"type",schemaType:["string","array"]},{keyword:"nullable",schemaType:"boolean"},Sf.default,jf.default];Ws.default=qf});var Qs=p(Ut=>{"use strict";Object.defineProperty(Ut,"__esModule",{value:!0});Ut.validateAdditionalItems=void 0;var Ze=E(),Zs=I(),Nf={message:({params:{len:t}})=>(0,Ze.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,Ze._)`{limit: ${t}}`},Of={keyword:"additionalItems",type:"array",schemaType:["boolean","object"],before:"uniqueItems",error:Nf,code(t){let{parentSchema:e,it:r}=t,{items:s}=e;if(!Array.isArray(s)){(0,Zs.checkStrictMode)(r,'"additionalItems" is ignored when "items" is not an array of schemas');return}Ko(t,s)}};function Ko(t,e){let{gen:r,schema:s,data:n,keyword:a,it:o}=t;o.items=!0;let i=r.const("len",(0,Ze._)`${n}.length`);if(s===!1)t.setParams({len:e.length}),t.pass((0,Ze._)`${i} <= ${e.length}`);else if(typeof s=="object"&&!(0,Zs.alwaysValidSchema)(o,s)){let u=r.var("valid",(0,Ze._)`${i} <= ${e.length}`);r.if((0,Ze.not)(u),()=>c(u)),t.ok(u)}function c(u){r.forRange("i",e.length,i,d=>{t.subschema({keyword:a,dataProp:d,dataPropType:Zs.Type.Num},u),o.allErrors||r.if((0,Ze.not)(u),()=>r.break())})}}Ut.validateAdditionalItems=Ko;Ut.default=Of});var Bs=p(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.validateTuple=void 0;var Uo=E(),wr=I(),kf=ue(),If={keyword:"items",type:"array",schemaType:["object","array","boolean"],before:"uniqueItems",code(t){let{schema:e,it:r}=t;if(Array.isArray(e))return Fo(t,"additionalItems",e);r.items=!0,!(0,wr.alwaysValidSchema)(r,e)&&t.ok((0,kf.validateArray)(t))}};function Fo(t,e,r=t.schema){let{gen:s,parentSchema:n,data:a,keyword:o,it:i}=t;d(n),i.opts.unevaluated&&r.length&&i.items!==!0&&(i.items=wr.mergeEvaluated.items(s,r.length,i.items));let c=s.name("valid"),u=s.const("len",(0,Uo._)`${a}.length`);r.forEach((l,y)=>{(0,wr.alwaysValidSchema)(i,l)||(s.if((0,Uo._)`${u} > ${y}`,()=>t.subschema({keyword:o,schemaProp:y,dataProp:y},c)),t.ok(c))});function d(l){let{opts:y,errSchemaPath:h}=i,f=r.length,m=f===l.minItems&&(f===l.maxItems||l[e]===!1);if(y.strictTuples&&!m){let $=`"${o}" is ${f}-tuple, but minItems or maxItems/${e} are not specified or different at path "${h}"`;(0,wr.checkStrictMode)(i,$,y.strictTuples)}}}Ft.validateTuple=Fo;Ft.default=If});var Lo=p(Xs=>{"use strict";Object.defineProperty(Xs,"__esModule",{value:!0});var Rf=Bs(),Tf={keyword:"prefixItems",type:"array",schemaType:["array"],before:"uniqueItems",code:t=>(0,Rf.validateTuple)(t,"items")};Xs.default=Tf});var Go=p(en=>{"use strict";Object.defineProperty(en,"__esModule",{value:!0});var Ho=E(),Mf=I(),Af=ue(),Cf=Qs(),Df={message:({params:{len:t}})=>(0,Ho.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,Ho._)`{limit: ${t}}`},zf={keyword:"items",type:"array",schemaType:["object","boolean"],before:"uniqueItems",error:Df,code(t){let{schema:e,parentSchema:r,it:s}=t,{prefixItems:n}=r;s.items=!0,!(0,Mf.alwaysValidSchema)(s,e)&&(n?(0,Cf.validateAdditionalItems)(t,n):t.ok((0,Af.validateArray)(t)))}};en.default=zf});var Jo=p(tn=>{"use strict";Object.defineProperty(tn,"__esModule",{value:!0});var le=E(),Er=I(),Vf={message:({params:{min:t,max:e}})=>e===void 0?(0,le.str)`must contain at least ${t} valid item(s)`:(0,le.str)`must contain at least ${t} and no more than ${e} valid item(s)`,params:({params:{min:t,max:e}})=>e===void 0?(0,le._)`{minContains: ${t}}`:(0,le._)`{minContains: ${t}, maxContains: ${e}}`},xf={keyword:"contains",type:"array",schemaType:["object","boolean"],before:"uniqueItems",trackErrors:!0,error:Vf,code(t){let{gen:e,schema:r,parentSchema:s,data:n,it:a}=t,o,i,{minContains:c,maxContains:u}=s;a.opts.next?(o=c===void 0?1:c,i=u):o=1;let d=e.const("len",(0,le._)`${n}.length`);if(t.setParams({min:o,max:i}),i===void 0&&o===0){(0,Er.checkStrictMode)(a,'"minContains" == 0 without "maxContains": "contains" keyword ignored');return}if(i!==void 0&&o>i){(0,Er.checkStrictMode)(a,'"minContains" > "maxContains" is always invalid'),t.fail();return}if((0,Er.alwaysValidSchema)(a,r)){let m=(0,le._)`${d} >= ${o}`;i!==void 0&&(m=(0,le._)`${m} && ${d} <= ${i}`),t.pass(m);return}a.items=!0;let l=e.name("valid");i===void 0&&o===1?h(l,()=>e.if(l,()=>e.break())):o===0?(e.let(l,!0),i!==void 0&&e.if((0,le._)`${n}.length > 0`,y)):(e.let(l,!1),y()),t.result(l,()=>t.reset());function y(){let m=e.name("_valid"),$=e.let("count",0);h(m,()=>e.if(m,()=>f($)))}function h(m,$){e.forRange("i",0,d,g=>{t.subschema({keyword:"contains",dataProp:g,dataPropType:Er.Type.Num,compositeRule:!0},m),$()})}function f(m){e.code((0,le._)`${m}++`),i===void 0?e.if((0,le._)`${m} >= ${o}`,()=>e.assign(l,!0).break()):(e.if((0,le._)`${m} > ${i}`,()=>e.assign(l,!1).break()),o===1?e.assign(l,!0):e.if((0,le._)`${m} >= ${o}`,()=>e.assign(l,!0)))}}};tn.default=xf});var Pr=p(be=>{"use strict";Object.defineProperty(be,"__esModule",{value:!0});be.validateSchemaDeps=be.validatePropertyDeps=be.error=void 0;var rn=E(),Kf=I(),Lt=ue();be.error={message:({params:{property:t,depsCount:e,deps:r}})=>{let s=e===1?"property":"properties";return(0,rn.str)`must have ${s} ${r} when property ${t} is present`},params:({params:{property:t,depsCount:e,deps:r,missingProperty:s}})=>(0,rn._)`{property: ${t}, + missingProperty: ${s}, + depsCount: ${e}, + deps: ${r}}`};var Uf={keyword:"dependencies",type:"object",schemaType:"object",error:be.error,code(t){let[e,r]=Ff(t);Wo(t,e),Yo(t,r)}};function Ff({schema:t}){let e={},r={};for(let s in t){if(s==="__proto__")continue;let n=Array.isArray(t[s])?e:r;n[s]=t[s]}return[e,r]}function Wo(t,e=t.schema){let{gen:r,data:s,it:n}=t;if(Object.keys(e).length===0)return;let a=r.let("missing");for(let o in e){let i=e[o];if(i.length===0)continue;let c=(0,Lt.propertyInData)(r,s,o,n.opts.ownProperties);t.setParams({property:o,depsCount:i.length,deps:i.join(", ")}),n.allErrors?r.if(c,()=>{for(let u of i)(0,Lt.checkReportMissingProp)(t,u)}):(r.if((0,rn._)`${c} && (${(0,Lt.checkMissingProp)(t,i,a)})`),(0,Lt.reportMissingProp)(t,a),r.else())}}be.validatePropertyDeps=Wo;function Yo(t,e=t.schema){let{gen:r,data:s,keyword:n,it:a}=t,o=r.name("valid");for(let i in e)(0,Kf.alwaysValidSchema)(a,e[i])||(r.if((0,Lt.propertyInData)(r,s,i,a.opts.ownProperties),()=>{let c=t.subschema({keyword:n,schemaProp:i},o);t.mergeValidEvaluated(c,o)},()=>r.var(o,!0)),t.ok(o))}be.validateSchemaDeps=Yo;be.default=Uf});var Qo=p(sn=>{"use strict";Object.defineProperty(sn,"__esModule",{value:!0});var Zo=E(),Lf=I(),Hf={message:"property name must be valid",params:({params:t})=>(0,Zo._)`{propertyName: ${t.propertyName}}`},Gf={keyword:"propertyNames",type:"object",schemaType:["object","boolean"],error:Hf,code(t){let{gen:e,schema:r,data:s,it:n}=t;if((0,Lf.alwaysValidSchema)(n,r))return;let a=e.name("valid");e.forIn("key",s,o=>{t.setParams({propertyName:o}),t.subschema({keyword:"propertyNames",data:o,dataTypes:["string"],propertyName:o,compositeRule:!0},a),e.if((0,Zo.not)(a),()=>{t.error(!0),n.allErrors||e.break()})}),t.ok(a)}};sn.default=Gf});var an=p(nn=>{"use strict";Object.defineProperty(nn,"__esModule",{value:!0});var Sr=ue(),he=E(),Jf=oe(),jr=I(),Wf={message:"must NOT have additional properties",params:({params:t})=>(0,he._)`{additionalProperty: ${t.additionalProperty}}`},Yf={keyword:"additionalProperties",type:["object"],schemaType:["boolean","object"],allowUndefined:!0,trackErrors:!0,error:Wf,code(t){let{gen:e,schema:r,parentSchema:s,data:n,errsCount:a,it:o}=t;if(!a)throw new Error("ajv implementation error");let{allErrors:i,opts:c}=o;if(o.props=!0,c.removeAdditional!=="all"&&(0,jr.alwaysValidSchema)(o,r))return;let u=(0,Sr.allSchemaProperties)(s.properties),d=(0,Sr.allSchemaProperties)(s.patternProperties);l(),t.ok((0,he._)`${a} === ${Jf.default.errors}`);function l(){e.forIn("key",n,$=>{!u.length&&!d.length?f($):e.if(y($),()=>f($))})}function y($){let g;if(u.length>8){let R=(0,jr.schemaRefOrVal)(o,s.properties,"properties");g=(0,Sr.isOwnProperty)(e,R,$)}else u.length?g=(0,he.or)(...u.map(R=>(0,he._)`${$} === ${R}`)):g=he.nil;return d.length&&(g=(0,he.or)(g,...d.map(R=>(0,he._)`${(0,Sr.usePattern)(t,R)}.test(${$})`))),(0,he.not)(g)}function h($){e.code((0,he._)`delete ${n}[${$}]`)}function f($){if(c.removeAdditional==="all"||c.removeAdditional&&r===!1){h($);return}if(r===!1){t.setParams({additionalProperty:$}),t.error(),i||e.break();return}if(typeof r=="object"&&!(0,jr.alwaysValidSchema)(o,r)){let g=e.name("valid");c.removeAdditional==="failing"?(m($,g,!1),e.if((0,he.not)(g),()=>{t.reset(),h($)})):(m($,g),i||e.if((0,he.not)(g),()=>e.break()))}}function m($,g,R){let q={keyword:"additionalProperties",dataProp:$,dataPropType:jr.Type.Str};R===!1&&Object.assign(q,{compositeRule:!0,createErrors:!1,allErrors:!1}),t.subschema(q,g)}}};nn.default=Yf});var ei=p(cn=>{"use strict";Object.defineProperty(cn,"__esModule",{value:!0});var Zf=Ge(),Bo=ue(),on=I(),Xo=an(),Qf={keyword:"properties",type:"object",schemaType:"object",code(t){let{gen:e,schema:r,parentSchema:s,data:n,it:a}=t;a.opts.removeAdditional==="all"&&s.additionalProperties===void 0&&Xo.default.code(new Zf.KeywordCxt(a,Xo.default,"additionalProperties"));let o=(0,Bo.allSchemaProperties)(r);for(let l of o)a.definedProperties.add(l);a.opts.unevaluated&&o.length&&a.props!==!0&&(a.props=on.mergeEvaluated.props(e,(0,on.toHash)(o),a.props));let i=o.filter(l=>!(0,on.alwaysValidSchema)(a,r[l]));if(i.length===0)return;let c=e.name("valid");for(let l of i)u(l)?d(l):(e.if((0,Bo.propertyInData)(e,n,l,a.opts.ownProperties)),d(l),a.allErrors||e.else().var(c,!0),e.endIf()),t.it.definedProperties.add(l),t.ok(c);function u(l){return a.opts.useDefaults&&!a.compositeRule&&r[l].default!==void 0}function d(l){t.subschema({keyword:"properties",schemaProp:l,dataProp:l},c)}}};cn.default=Qf});var ni=p(un=>{"use strict";Object.defineProperty(un,"__esModule",{value:!0});var ti=ue(),qr=E(),ri=I(),si=I(),Bf={keyword:"patternProperties",type:"object",schemaType:"object",code(t){let{gen:e,schema:r,data:s,parentSchema:n,it:a}=t,{opts:o}=a,i=(0,ti.allSchemaProperties)(r),c=i.filter(m=>(0,ri.alwaysValidSchema)(a,r[m]));if(i.length===0||c.length===i.length&&(!a.opts.unevaluated||a.props===!0))return;let u=o.strictSchema&&!o.allowMatchingProperties&&n.properties,d=e.name("valid");a.props!==!0&&!(a.props instanceof qr.Name)&&(a.props=(0,si.evaluatedPropsToName)(e,a.props));let{props:l}=a;y();function y(){for(let m of i)u&&h(m),a.allErrors?f(m):(e.var(d,!0),f(m),e.if(d))}function h(m){for(let $ in u)new RegExp(m).test($)&&(0,ri.checkStrictMode)(a,`property ${$} matches pattern ${m} (use allowMatchingProperties)`)}function f(m){e.forIn("key",s,$=>{e.if((0,qr._)`${(0,ti.usePattern)(t,m)}.test(${$})`,()=>{let g=c.includes(m);g||t.subschema({keyword:"patternProperties",schemaProp:m,dataProp:$,dataPropType:si.Type.Str},d),a.opts.unevaluated&&l!==!0?e.assign((0,qr._)`${l}[${$}]`,!0):!g&&!a.allErrors&&e.if((0,qr.not)(d),()=>e.break())})})}}};un.default=Bf});var ai=p(dn=>{"use strict";Object.defineProperty(dn,"__esModule",{value:!0});var Xf=I(),em={keyword:"not",schemaType:["object","boolean"],trackErrors:!0,code(t){let{gen:e,schema:r,it:s}=t;if((0,Xf.alwaysValidSchema)(s,r)){t.fail();return}let n=e.name("valid");t.subschema({keyword:"not",compositeRule:!0,createErrors:!1,allErrors:!1},n),t.failResult(n,()=>t.reset(),()=>t.error())},error:{message:"must NOT be valid"}};dn.default=em});var oi=p(ln=>{"use strict";Object.defineProperty(ln,"__esModule",{value:!0});var tm=ue(),rm={keyword:"anyOf",schemaType:"array",trackErrors:!0,code:tm.validateUnion,error:{message:"must match a schema in anyOf"}};ln.default=rm});var ii=p(fn=>{"use strict";Object.defineProperty(fn,"__esModule",{value:!0});var Nr=E(),sm=I(),nm={message:"must match exactly one schema in oneOf",params:({params:t})=>(0,Nr._)`{passingSchemas: ${t.passing}}`},am={keyword:"oneOf",schemaType:"array",trackErrors:!0,error:nm,code(t){let{gen:e,schema:r,parentSchema:s,it:n}=t;if(!Array.isArray(r))throw new Error("ajv implementation error");if(n.opts.discriminator&&s.discriminator)return;let a=r,o=e.let("valid",!1),i=e.let("passing",null),c=e.name("_valid");t.setParams({passing:i}),e.block(u),t.result(o,()=>t.reset(),()=>t.error(!0));function u(){a.forEach((d,l)=>{let y;(0,sm.alwaysValidSchema)(n,d)?e.var(c,!0):y=t.subschema({keyword:"oneOf",schemaProp:l,compositeRule:!0},c),l>0&&e.if((0,Nr._)`${c} && ${o}`).assign(o,!1).assign(i,(0,Nr._)`[${i}, ${l}]`).else(),e.if(c,()=>{e.assign(o,!0),e.assign(i,l),y&&t.mergeEvaluated(y,Nr.Name)})})}}};fn.default=am});var ci=p(mn=>{"use strict";Object.defineProperty(mn,"__esModule",{value:!0});var om=I(),im={keyword:"allOf",schemaType:"array",code(t){let{gen:e,schema:r,it:s}=t;if(!Array.isArray(r))throw new Error("ajv implementation error");let n=e.name("valid");r.forEach((a,o)=>{if((0,om.alwaysValidSchema)(s,a))return;let i=t.subschema({keyword:"allOf",schemaProp:o},n);t.ok(n),t.mergeEvaluated(i)})}};mn.default=im});var li=p(pn=>{"use strict";Object.defineProperty(pn,"__esModule",{value:!0});var Or=E(),di=I(),cm={message:({params:t})=>(0,Or.str)`must match "${t.ifClause}" schema`,params:({params:t})=>(0,Or._)`{failingKeyword: ${t.ifClause}}`},um={keyword:"if",schemaType:["object","boolean"],trackErrors:!0,error:cm,code(t){let{gen:e,parentSchema:r,it:s}=t;r.then===void 0&&r.else===void 0&&(0,di.checkStrictMode)(s,'"if" without "then" and "else" is ignored');let n=ui(s,"then"),a=ui(s,"else");if(!n&&!a)return;let o=e.let("valid",!0),i=e.name("_valid");if(c(),t.reset(),n&&a){let d=e.let("ifClause");t.setParams({ifClause:d}),e.if(i,u("then",d),u("else",d))}else n?e.if(i,u("then")):e.if((0,Or.not)(i),u("else"));t.pass(o,()=>t.error(!0));function c(){let d=t.subschema({keyword:"if",compositeRule:!0,createErrors:!1,allErrors:!1},i);t.mergeEvaluated(d)}function u(d,l){return()=>{let y=t.subschema({keyword:d},i);e.assign(o,i),t.mergeValidEvaluated(y,o),l?e.assign(l,(0,Or._)`${d}`):t.setParams({ifClause:d})}}}};function ui(t,e){let r=t.schema[e];return r!==void 0&&!(0,di.alwaysValidSchema)(t,r)}pn.default=um});var fi=p(hn=>{"use strict";Object.defineProperty(hn,"__esModule",{value:!0});var dm=I(),lm={keyword:["then","else"],schemaType:["object","boolean"],code({keyword:t,parentSchema:e,it:r}){e.if===void 0&&(0,dm.checkStrictMode)(r,`"${t}" without "if" is ignored`)}};hn.default=lm});var $n=p(yn=>{"use strict";Object.defineProperty(yn,"__esModule",{value:!0});var fm=Qs(),mm=Lo(),pm=Bs(),hm=Go(),ym=Jo(),$m=Pr(),_m=Qo(),gm=an(),vm=ei(),bm=ni(),wm=ai(),Em=oi(),Pm=ii(),Sm=ci(),jm=li(),qm=fi();function Nm(t=!1){let e=[wm.default,Em.default,Pm.default,Sm.default,jm.default,qm.default,_m.default,gm.default,$m.default,vm.default,bm.default];return t?e.push(mm.default,hm.default):e.push(fm.default,pm.default),e.push(ym.default),e}yn.default=Nm});var gn=p(Ht=>{"use strict";Object.defineProperty(Ht,"__esModule",{value:!0});Ht.dynamicAnchor=void 0;var _n=E(),Om=oe(),mi=It(),km=$r(),Im={keyword:"$dynamicAnchor",schemaType:"string",code:t=>pi(t,t.schema)};function pi(t,e){let{gen:r,it:s}=t;s.schemaEnv.root.dynamicAnchors[e]=!0;let n=(0,_n._)`${Om.default.dynamicAnchors}${(0,_n.getProperty)(e)}`,a=s.errSchemaPath==="#"?s.validateName:Rm(t);r.if((0,_n._)`!${n}`,()=>r.assign(n,a))}Ht.dynamicAnchor=pi;function Rm(t){let{schemaEnv:e,schema:r,self:s}=t.it,{root:n,baseId:a,localRefs:o,meta:i}=e.root,{schemaId:c}=s.opts,u=new mi.SchemaEnv({schema:r,schemaId:c,root:n,baseId:a,localRefs:o,meta:i});return mi.compileSchema.call(s,u),(0,km.getValidate)(t,u)}Ht.default=Im});var vn=p(Gt=>{"use strict";Object.defineProperty(Gt,"__esModule",{value:!0});Gt.dynamicRef=void 0;var hi=E(),Tm=oe(),yi=$r(),Mm={keyword:"$dynamicRef",schemaType:"string",code:t=>$i(t,t.schema)};function $i(t,e){let{gen:r,keyword:s,it:n}=t;if(e[0]!=="#")throw new Error(`"${s}" only supports hash fragment reference`);let a=e.slice(1);if(n.allErrors)o();else{let c=r.let("valid",!1);o(c),t.ok(c)}function o(c){if(n.schemaEnv.root.dynamicAnchors[a]){let u=r.let("_v",(0,hi._)`${Tm.default.dynamicAnchors}${(0,hi.getProperty)(a)}`);r.if(u,i(u,c),i(n.validateName,c))}else i(n.validateName,c)()}function i(c,u){return u?()=>r.block(()=>{(0,yi.callRef)(t,c),r.let(u,!0)}):()=>(0,yi.callRef)(t,c)}}Gt.dynamicRef=$i;Gt.default=Mm});var _i=p(bn=>{"use strict";Object.defineProperty(bn,"__esModule",{value:!0});var Am=gn(),Cm=I(),Dm={keyword:"$recursiveAnchor",schemaType:"boolean",code(t){t.schema?(0,Am.dynamicAnchor)(t,""):(0,Cm.checkStrictMode)(t.it,"$recursiveAnchor: false is ignored")}};bn.default=Dm});var gi=p(wn=>{"use strict";Object.defineProperty(wn,"__esModule",{value:!0});var zm=vn(),Vm={keyword:"$recursiveRef",schemaType:"string",code:t=>(0,zm.dynamicRef)(t,t.schema)};wn.default=Vm});var vi=p(En=>{"use strict";Object.defineProperty(En,"__esModule",{value:!0});var xm=gn(),Km=vn(),Um=_i(),Fm=gi(),Lm=[xm.default,Km.default,Um.default,Fm.default];En.default=Lm});var wi=p(Pn=>{"use strict";Object.defineProperty(Pn,"__esModule",{value:!0});var bi=Pr(),Hm={keyword:"dependentRequired",type:"object",schemaType:"object",error:bi.error,code:t=>(0,bi.validatePropertyDeps)(t)};Pn.default=Hm});var Ei=p(Sn=>{"use strict";Object.defineProperty(Sn,"__esModule",{value:!0});var Gm=Pr(),Jm={keyword:"dependentSchemas",type:"object",schemaType:"object",code:t=>(0,Gm.validateSchemaDeps)(t)};Sn.default=Jm});var Pi=p(jn=>{"use strict";Object.defineProperty(jn,"__esModule",{value:!0});var Wm=I(),Ym={keyword:["maxContains","minContains"],type:"array",schemaType:"number",code({keyword:t,parentSchema:e,it:r}){e.contains===void 0&&(0,Wm.checkStrictMode)(r,`"${t}" without "contains" is ignored`)}};jn.default=Ym});var Si=p(qn=>{"use strict";Object.defineProperty(qn,"__esModule",{value:!0});var Zm=wi(),Qm=Ei(),Bm=Pi(),Xm=[Zm.default,Qm.default,Bm.default];qn.default=Xm});var qi=p(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});var Ae=E(),ji=I(),ep=oe(),tp={message:"must NOT have unevaluated properties",params:({params:t})=>(0,Ae._)`{unevaluatedProperty: ${t.unevaluatedProperty}}`},rp={keyword:"unevaluatedProperties",type:"object",schemaType:["boolean","object"],trackErrors:!0,error:tp,code(t){let{gen:e,schema:r,data:s,errsCount:n,it:a}=t;if(!n)throw new Error("ajv implementation error");let{allErrors:o,props:i}=a;i instanceof Ae.Name?e.if((0,Ae._)`${i} !== true`,()=>e.forIn("key",s,l=>e.if(u(i,l),()=>c(l)))):i!==!0&&e.forIn("key",s,l=>i===void 0?c(l):e.if(d(i,l),()=>c(l))),a.props=!0,t.ok((0,Ae._)`${n} === ${ep.default.errors}`);function c(l){if(r===!1){t.setParams({unevaluatedProperty:l}),t.error(),o||e.break();return}if(!(0,ji.alwaysValidSchema)(a,r)){let y=e.name("valid");t.subschema({keyword:"unevaluatedProperties",dataProp:l,dataPropType:ji.Type.Str},y),o||e.if((0,Ae.not)(y),()=>e.break())}}function u(l,y){return(0,Ae._)`!${l} || !${l}[${y}]`}function d(l,y){let h=[];for(let f in l)l[f]===!0&&h.push((0,Ae._)`${y} !== ${f}`);return(0,Ae.and)(...h)}}};Nn.default=rp});var Oi=p(On=>{"use strict";Object.defineProperty(On,"__esModule",{value:!0});var Qe=E(),Ni=I(),sp={message:({params:{len:t}})=>(0,Qe.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,Qe._)`{limit: ${t}}`},np={keyword:"unevaluatedItems",type:"array",schemaType:["boolean","object"],error:sp,code(t){let{gen:e,schema:r,data:s,it:n}=t,a=n.items||0;if(a===!0)return;let o=e.const("len",(0,Qe._)`${s}.length`);if(r===!1)t.setParams({len:a}),t.fail((0,Qe._)`${o} > ${a}`);else if(typeof r=="object"&&!(0,Ni.alwaysValidSchema)(n,r)){let c=e.var("valid",(0,Qe._)`${o} <= ${a}`);e.if((0,Qe.not)(c),()=>i(c,a)),t.ok(c)}n.items=!0;function i(c,u){e.forRange("i",u,o,d=>{t.subschema({keyword:"unevaluatedItems",dataProp:d,dataPropType:Ni.Type.Num},c),n.allErrors||e.if((0,Qe.not)(c),()=>e.break())})}}};On.default=np});var ki=p(kn=>{"use strict";Object.defineProperty(kn,"__esModule",{value:!0});var ap=qi(),op=Oi(),ip=[ap.default,op.default];kn.default=ip});var Ii=p(In=>{"use strict";Object.defineProperty(In,"__esModule",{value:!0});var J=E(),cp={message:({schemaCode:t})=>(0,J.str)`must match format "${t}"`,params:({schemaCode:t})=>(0,J._)`{format: ${t}}`},up={keyword:"format",type:["number","string"],schemaType:"string",$data:!0,error:cp,code(t,e){let{gen:r,data:s,$data:n,schema:a,schemaCode:o,it:i}=t,{opts:c,errSchemaPath:u,schemaEnv:d,self:l}=i;if(!c.validateFormats)return;n?y():h();function y(){let f=r.scopeValue("formats",{ref:l.formats,code:c.code.formats}),m=r.const("fDef",(0,J._)`${f}[${o}]`),$=r.let("fType"),g=r.let("format");r.if((0,J._)`typeof ${m} == "object" && !(${m} instanceof RegExp)`,()=>r.assign($,(0,J._)`${m}.type || "string"`).assign(g,(0,J._)`${m}.validate`),()=>r.assign($,(0,J._)`"string"`).assign(g,m)),t.fail$data((0,J.or)(R(),q()));function R(){return c.strictSchema===!1?J.nil:(0,J._)`${o} && !${g}`}function q(){let V=d.$async?(0,J._)`(${m}.async ? await ${g}(${s}) : ${g}(${s}))`:(0,J._)`${g}(${s})`,S=(0,J._)`(typeof ${g} == "function" ? ${V} : ${g}.test(${s}))`;return(0,J._)`${g} && ${g} !== true && ${$} === ${e} && !${S}`}}function h(){let f=l.formats[a];if(!f){R();return}if(f===!0)return;let[m,$,g]=q(f);m===e&&t.pass(V());function R(){if(c.strictSchema===!1){l.logger.warn(S());return}throw new Error(S());function S(){return`unknown format "${a}" ignored in schema at path "${u}"`}}function q(S){let v=S instanceof RegExp?(0,J.regexpCode)(S):c.code.formats?(0,J._)`${c.code.formats}${(0,J.getProperty)(a)}`:void 0,w=r.scopeValue("formats",{key:a,ref:S,code:v});return typeof S=="object"&&!(S instanceof RegExp)?[S.type||"string",S.validate,(0,J._)`${w}.validate`]:["string",S,w]}function V(){if(typeof f=="object"&&!(f instanceof RegExp)&&f.async){if(!d.$async)throw new Error("async format in sync schema");return(0,J._)`await ${g}(${s})`}return typeof $=="function"?(0,J._)`${g}(${s})`:(0,J._)`${g}.test(${s})`}}}};In.default=up});var Tn=p(Rn=>{"use strict";Object.defineProperty(Rn,"__esModule",{value:!0});var dp=Ii(),lp=[dp.default];Rn.default=lp});var Mn=p(lt=>{"use strict";Object.defineProperty(lt,"__esModule",{value:!0});lt.contentVocabulary=lt.metadataVocabulary=void 0;lt.metadataVocabulary=["title","description","default","deprecated","readOnly","writeOnly","examples"];lt.contentVocabulary=["contentMediaType","contentEncoding","contentSchema"]});var Ti=p(An=>{"use strict";Object.defineProperty(An,"__esModule",{value:!0});var fp=Ts(),mp=Ys(),pp=$n(),hp=vi(),yp=Si(),$p=ki(),_p=Tn(),Ri=Mn(),gp=[hp.default,fp.default,mp.default,(0,pp.default)(!0),_p.default,Ri.metadataVocabulary,Ri.contentVocabulary,yp.default,$p.default];An.default=gp});var Ai=p(kr=>{"use strict";Object.defineProperty(kr,"__esModule",{value:!0});kr.DiscrError=void 0;var Mi;(function(t){t.Tag="tag",t.Mapping="mapping"})(Mi||(kr.DiscrError=Mi={}))});var zn=p(Dn=>{"use strict";Object.defineProperty(Dn,"__esModule",{value:!0});var ft=E(),Cn=Ai(),Ci=It(),vp=it(),bp=I(),wp={message:({params:{discrError:t,tagName:e}})=>t===Cn.DiscrError.Tag?`tag "${e}" must be string`:`value of tag "${e}" must be in oneOf`,params:({params:{discrError:t,tag:e,tagName:r}})=>(0,ft._)`{error: ${t}, tag: ${r}, tagValue: ${e}}`},Ep={keyword:"discriminator",type:"object",schemaType:"object",error:wp,code(t){let{gen:e,data:r,schema:s,parentSchema:n,it:a}=t,{oneOf:o}=n;if(!a.opts.discriminator)throw new Error("discriminator: requires discriminator option");let i=s.propertyName;if(typeof i!="string")throw new Error("discriminator: requires propertyName");if(s.mapping)throw new Error("discriminator: mapping is not supported");if(!o)throw new Error("discriminator: requires oneOf keyword");let c=e.let("valid",!1),u=e.const("tag",(0,ft._)`${r}${(0,ft.getProperty)(i)}`);e.if((0,ft._)`typeof ${u} == "string"`,()=>d(),()=>t.error(!1,{discrError:Cn.DiscrError.Tag,tag:u,tagName:i})),t.ok(c);function d(){let h=y();e.if(!1);for(let f in h)e.elseIf((0,ft._)`${u} === ${f}`),e.assign(c,l(h[f]));e.else(),t.error(!1,{discrError:Cn.DiscrError.Mapping,tag:u,tagName:i}),e.endIf()}function l(h){let f=e.name("valid"),m=t.subschema({keyword:"oneOf",schemaProp:h},f);return t.mergeEvaluated(m,ft.Name),f}function y(){var h;let f={},m=g(n),$=!0;for(let V=0;V{Pp.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/schema",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/core":!0,"https://json-schema.org/draft/2020-12/vocab/applicator":!0,"https://json-schema.org/draft/2020-12/vocab/unevaluated":!0,"https://json-schema.org/draft/2020-12/vocab/validation":!0,"https://json-schema.org/draft/2020-12/vocab/meta-data":!0,"https://json-schema.org/draft/2020-12/vocab/format-annotation":!0,"https://json-schema.org/draft/2020-12/vocab/content":!0},$dynamicAnchor:"meta",title:"Core and Validation specifications meta-schema",allOf:[{$ref:"meta/core"},{$ref:"meta/applicator"},{$ref:"meta/unevaluated"},{$ref:"meta/validation"},{$ref:"meta/meta-data"},{$ref:"meta/format-annotation"},{$ref:"meta/content"}],type:["object","boolean"],$comment:"This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",properties:{definitions:{$comment:'"definitions" has been replaced by "$defs".',type:"object",additionalProperties:{$dynamicRef:"#meta"},deprecated:!0,default:{}},dependencies:{$comment:'"dependencies" has been split and replaced by "dependentSchemas" and "dependentRequired" in order to serve their differing semantics.',type:"object",additionalProperties:{anyOf:[{$dynamicRef:"#meta"},{$ref:"meta/validation#/$defs/stringArray"}]},deprecated:!0,default:{}},$recursiveAnchor:{$comment:'"$recursiveAnchor" has been replaced by "$dynamicAnchor".',$ref:"meta/core#/$defs/anchorString",deprecated:!0},$recursiveRef:{$comment:'"$recursiveRef" has been replaced by "$dynamicRef".',$ref:"meta/core#/$defs/uriReferenceString",deprecated:!0}}}});var zi=p((s$,Sp)=>{Sp.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/applicator",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/applicator":!0},$dynamicAnchor:"meta",title:"Applicator vocabulary meta-schema",type:["object","boolean"],properties:{prefixItems:{$ref:"#/$defs/schemaArray"},items:{$dynamicRef:"#meta"},contains:{$dynamicRef:"#meta"},additionalProperties:{$dynamicRef:"#meta"},properties:{type:"object",additionalProperties:{$dynamicRef:"#meta"},default:{}},patternProperties:{type:"object",additionalProperties:{$dynamicRef:"#meta"},propertyNames:{format:"regex"},default:{}},dependentSchemas:{type:"object",additionalProperties:{$dynamicRef:"#meta"},default:{}},propertyNames:{$dynamicRef:"#meta"},if:{$dynamicRef:"#meta"},then:{$dynamicRef:"#meta"},else:{$dynamicRef:"#meta"},allOf:{$ref:"#/$defs/schemaArray"},anyOf:{$ref:"#/$defs/schemaArray"},oneOf:{$ref:"#/$defs/schemaArray"},not:{$dynamicRef:"#meta"}},$defs:{schemaArray:{type:"array",minItems:1,items:{$dynamicRef:"#meta"}}}}});var Vi=p((n$,jp)=>{jp.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/unevaluated",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/unevaluated":!0},$dynamicAnchor:"meta",title:"Unevaluated applicator vocabulary meta-schema",type:["object","boolean"],properties:{unevaluatedItems:{$dynamicRef:"#meta"},unevaluatedProperties:{$dynamicRef:"#meta"}}}});var xi=p((a$,qp)=>{qp.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/content",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/content":!0},$dynamicAnchor:"meta",title:"Content vocabulary meta-schema",type:["object","boolean"],properties:{contentEncoding:{type:"string"},contentMediaType:{type:"string"},contentSchema:{$dynamicRef:"#meta"}}}});var Ki=p((o$,Np)=>{Np.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/core",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/core":!0},$dynamicAnchor:"meta",title:"Core vocabulary meta-schema",type:["object","boolean"],properties:{$id:{$ref:"#/$defs/uriReferenceString",$comment:"Non-empty fragments not allowed.",pattern:"^[^#]*#?$"},$schema:{$ref:"#/$defs/uriString"},$ref:{$ref:"#/$defs/uriReferenceString"},$anchor:{$ref:"#/$defs/anchorString"},$dynamicRef:{$ref:"#/$defs/uriReferenceString"},$dynamicAnchor:{$ref:"#/$defs/anchorString"},$vocabulary:{type:"object",propertyNames:{$ref:"#/$defs/uriString"},additionalProperties:{type:"boolean"}},$comment:{type:"string"},$defs:{type:"object",additionalProperties:{$dynamicRef:"#meta"}}},$defs:{anchorString:{type:"string",pattern:"^[A-Za-z_][-A-Za-z0-9._]*$"},uriString:{type:"string",format:"uri"},uriReferenceString:{type:"string",format:"uri-reference"}}}});var Ui=p((i$,Op)=>{Op.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/format-annotation",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/format-annotation":!0},$dynamicAnchor:"meta",title:"Format vocabulary meta-schema for annotation results",type:["object","boolean"],properties:{format:{type:"string"}}}});var Fi=p((c$,kp)=>{kp.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/meta-data",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/meta-data":!0},$dynamicAnchor:"meta",title:"Meta-data vocabulary meta-schema",type:["object","boolean"],properties:{title:{type:"string"},description:{type:"string"},default:!0,deprecated:{type:"boolean",default:!1},readOnly:{type:"boolean",default:!1},writeOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0}}}});var Li=p((u$,Ip)=>{Ip.exports={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://json-schema.org/draft/2020-12/meta/validation",$vocabulary:{"https://json-schema.org/draft/2020-12/vocab/validation":!0},$dynamicAnchor:"meta",title:"Validation vocabulary meta-schema",type:["object","boolean"],properties:{type:{anyOf:[{$ref:"#/$defs/simpleTypes"},{type:"array",items:{$ref:"#/$defs/simpleTypes"},minItems:1,uniqueItems:!0}]},const:!0,enum:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/$defs/nonNegativeInteger"},minLength:{$ref:"#/$defs/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},maxItems:{$ref:"#/$defs/nonNegativeInteger"},minItems:{$ref:"#/$defs/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},maxContains:{$ref:"#/$defs/nonNegativeInteger"},minContains:{$ref:"#/$defs/nonNegativeInteger",default:1},maxProperties:{$ref:"#/$defs/nonNegativeInteger"},minProperties:{$ref:"#/$defs/nonNegativeIntegerDefault0"},required:{$ref:"#/$defs/stringArray"},dependentRequired:{type:"object",additionalProperties:{$ref:"#/$defs/stringArray"}}},$defs:{nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{$ref:"#/$defs/nonNegativeInteger",default:0},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}}}});var Hi=p(Vn=>{"use strict";Object.defineProperty(Vn,"__esModule",{value:!0});var Rp=Di(),Tp=zi(),Mp=Vi(),Ap=xi(),Cp=Ki(),Dp=Ui(),zp=Fi(),Vp=Li(),xp=["/properties"];function Kp(t){return[Rp,Tp,Mp,Ap,Cp,e(this,Dp),zp,e(this,Vp)].forEach(r=>this.addMetaSchema(r,void 0,!1)),this;function e(r,s){return t?r.$dataMetaSchema(s,xp):s}}Vn.default=Kp});var Gi=p((F,Kn)=>{"use strict";Object.defineProperty(F,"__esModule",{value:!0});F.MissingRefError=F.ValidationError=F.CodeGen=F.Name=F.nil=F.stringify=F.str=F._=F.KeywordCxt=F.Ajv2020=void 0;var Up=ks(),Fp=Ti(),Lp=zn(),Hp=Hi(),xn="https://json-schema.org/draft/2020-12/schema",mt=class extends Up.default{constructor(e={}){super({...e,dynamicRef:!0,next:!0,unevaluated:!0})}_addVocabularies(){super._addVocabularies(),Fp.default.forEach(e=>this.addVocabulary(e)),this.opts.discriminator&&this.addKeyword(Lp.default)}_addDefaultMetaSchema(){super._addDefaultMetaSchema();let{$data:e,meta:r}=this.opts;r&&(Hp.default.call(this,e),this.refs["http://json-schema.org/schema"]=xn)}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(xn)?xn:void 0)}};F.Ajv2020=mt;Kn.exports=F=mt;Kn.exports.Ajv2020=mt;Object.defineProperty(F,"__esModule",{value:!0});F.default=mt;var Gp=Ge();Object.defineProperty(F,"KeywordCxt",{enumerable:!0,get:function(){return Gp.KeywordCxt}});var pt=E();Object.defineProperty(F,"_",{enumerable:!0,get:function(){return pt._}});Object.defineProperty(F,"str",{enumerable:!0,get:function(){return pt.str}});Object.defineProperty(F,"stringify",{enumerable:!0,get:function(){return pt.stringify}});Object.defineProperty(F,"nil",{enumerable:!0,get:function(){return pt.nil}});Object.defineProperty(F,"Name",{enumerable:!0,get:function(){return pt.Name}});Object.defineProperty(F,"CodeGen",{enumerable:!0,get:function(){return pt.CodeGen}});var Jp=kt();Object.defineProperty(F,"ValidationError",{enumerable:!0,get:function(){return Jp.default}});var Wp=it();Object.defineProperty(F,"MissingRefError",{enumerable:!0,get:function(){return Wp.default}})});var ec=p(Ee=>{"use strict";Object.defineProperty(Ee,"__esModule",{value:!0});Ee.formatNames=Ee.fastFormats=Ee.fullFormats=void 0;function we(t,e){return{validate:t,compare:e}}Ee.fullFormats={date:we(Zi,Hn),time:we(Fn(!0),Gn),"date-time":we(Ji(!0),Bi),"iso-time":we(Fn(),Qi),"iso-date-time":we(Ji(),Xi),duration:/^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,uri:eh,"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,url:/^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/,ipv6:/^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,regex:ih,uuid:/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,"json-pointer":/^(?:\/(?:[^~/]|~0|~1)*)*$/,"json-pointer-uri-fragment":/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,"relative-json-pointer":/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,byte:th,int32:{type:"number",validate:nh},int64:{type:"number",validate:ah},float:{type:"number",validate:Yi},double:{type:"number",validate:Yi},password:!0,binary:!0};Ee.fastFormats={...Ee.fullFormats,date:we(/^\d\d\d\d-[0-1]\d-[0-3]\d$/,Hn),time:we(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,Gn),"date-time":we(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,Bi),"iso-time":we(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,Qi),"iso-date-time":we(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,Xi),uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i};Ee.formatNames=Object.keys(Ee.fullFormats);function Yp(t){return t%4===0&&(t%100!==0||t%400===0)}var Zp=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,Qp=[0,31,28,31,30,31,30,31,31,30,31,30,31];function Zi(t){let e=Zp.exec(t);if(!e)return!1;let r=+e[1],s=+e[2],n=+e[3];return s>=1&&s<=12&&n>=1&&n<=(s===2&&Yp(r)?29:Qp[s])}function Hn(t,e){if(t&&e)return t>e?1:t23||d>59||t&&!i)return!1;if(n<=23&&a<=59&&o<60)return!0;let l=a-d*c,y=n-u*c-(l<0?1:0);return(y===23||y===-1)&&(l===59||l===-1)&&o<61}}function Gn(t,e){if(!(t&&e))return;let r=new Date("2020-01-01T"+t).valueOf(),s=new Date("2020-01-01T"+e).valueOf();if(r&&s)return r-s}function Qi(t,e){if(!(t&&e))return;let r=Un.exec(t),s=Un.exec(e);if(r&&s)return t=r[1]+r[2]+r[3],e=s[1]+s[2]+s[3],t>e?1:t=rh}function ah(t){return Number.isInteger(t)}function Yi(){return!0}var oh=/[^\\]\\Z/;function ih(t){if(oh.test(t))return!1;try{return new RegExp(t),!0}catch{return!1}}});var rc=p(Jn=>{"use strict";Object.defineProperty(Jn,"__esModule",{value:!0});var ch=Ts(),uh=Ys(),dh=$n(),lh=Tn(),tc=Mn(),fh=[ch.default,uh.default,(0,dh.default)(),lh.default,tc.metadataVocabulary,tc.contentVocabulary];Jn.default=fh});var Wn=p((m$,mh)=>{mh.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}});var Zn=p((L,Yn)=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.MissingRefError=L.ValidationError=L.CodeGen=L.Name=L.nil=L.stringify=L.str=L._=L.KeywordCxt=L.Ajv=void 0;var ph=ks(),hh=rc(),yh=zn(),sc=Wn(),$h=["/properties"],Ir="http://json-schema.org/draft-07/schema",ht=class extends ph.default{_addVocabularies(){super._addVocabularies(),hh.default.forEach(e=>this.addVocabulary(e)),this.opts.discriminator&&this.addKeyword(yh.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;let e=this.opts.$data?this.$dataMetaSchema(sc,$h):sc;this.addMetaSchema(e,Ir,!1),this.refs["http://json-schema.org/schema"]=Ir}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(Ir)?Ir:void 0)}};L.Ajv=ht;Yn.exports=L=ht;Yn.exports.Ajv=ht;Object.defineProperty(L,"__esModule",{value:!0});L.default=ht;var _h=Ge();Object.defineProperty(L,"KeywordCxt",{enumerable:!0,get:function(){return _h.KeywordCxt}});var yt=E();Object.defineProperty(L,"_",{enumerable:!0,get:function(){return yt._}});Object.defineProperty(L,"str",{enumerable:!0,get:function(){return yt.str}});Object.defineProperty(L,"stringify",{enumerable:!0,get:function(){return yt.stringify}});Object.defineProperty(L,"nil",{enumerable:!0,get:function(){return yt.nil}});Object.defineProperty(L,"Name",{enumerable:!0,get:function(){return yt.Name}});Object.defineProperty(L,"CodeGen",{enumerable:!0,get:function(){return yt.CodeGen}});var gh=kt();Object.defineProperty(L,"ValidationError",{enumerable:!0,get:function(){return gh.default}});var vh=it();Object.defineProperty(L,"MissingRefError",{enumerable:!0,get:function(){return vh.default}})});var nc=p($t=>{"use strict";Object.defineProperty($t,"__esModule",{value:!0});$t.formatLimitDefinition=void 0;var bh=Zn(),ye=E(),Ce=ye.operators,Rr={formatMaximum:{okStr:"<=",ok:Ce.LTE,fail:Ce.GT},formatMinimum:{okStr:">=",ok:Ce.GTE,fail:Ce.LT},formatExclusiveMaximum:{okStr:"<",ok:Ce.LT,fail:Ce.GTE},formatExclusiveMinimum:{okStr:">",ok:Ce.GT,fail:Ce.LTE}},wh={message:({keyword:t,schemaCode:e})=>(0,ye.str)`should be ${Rr[t].okStr} ${e}`,params:({keyword:t,schemaCode:e})=>(0,ye._)`{comparison: ${Rr[t].okStr}, limit: ${e}}`};$t.formatLimitDefinition={keyword:Object.keys(Rr),type:"string",schemaType:"string",$data:!0,error:wh,code(t){let{gen:e,data:r,schemaCode:s,keyword:n,it:a}=t,{opts:o,self:i}=a;if(!o.validateFormats)return;let c=new bh.KeywordCxt(a,i.RULES.all.format.definition,"format");c.$data?u():d();function u(){let y=e.scopeValue("formats",{ref:i.formats,code:o.code.formats}),h=e.const("fmt",(0,ye._)`${y}[${c.schemaCode}]`);t.fail$data((0,ye.or)((0,ye._)`typeof ${h} != "object"`,(0,ye._)`${h} instanceof RegExp`,(0,ye._)`typeof ${h}.compare != "function"`,l(h)))}function d(){let y=c.schema,h=i.formats[y];if(!h||h===!0)return;if(typeof h!="object"||h instanceof RegExp||typeof h.compare!="function")throw new Error(`"${n}": format "${y}" does not define "compare" function`);let f=e.scopeValue("formats",{key:y,ref:h,code:o.code.formats?(0,ye._)`${o.code.formats}${(0,ye.getProperty)(y)}`:void 0});t.fail$data(l(f))}function l(y){return(0,ye._)`${y}.compare(${r}, ${s}) ${Rr[n].fail} 0`}},dependencies:["format"]};var Eh=t=>(t.addKeyword($t.formatLimitDefinition),t);$t.default=Eh});var cc=p((Jt,ic)=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});var _t=ec(),Ph=nc(),Qn=E(),ac=new Qn.Name("fullFormats"),Sh=new Qn.Name("fastFormats"),Bn=(t,e={keywords:!0})=>{if(Array.isArray(e))return oc(t,e,_t.fullFormats,ac),t;let[r,s]=e.mode==="fast"?[_t.fastFormats,Sh]:[_t.fullFormats,ac],n=e.formats||_t.formatNames;return oc(t,n,r,s),e.keywords&&(0,Ph.default)(t),t};Bn.get=(t,e="full")=>{let s=(e==="fast"?_t.fastFormats:_t.fullFormats)[t];if(!s)throw new Error(`Unknown format "${t}"`);return s};function oc(t,e,r,s){var n,a;(n=(a=t.opts.code).formats)!==null&&n!==void 0||(a.formats=(0,Qn._)`require("ajv-formats/dist/formats").${s}`);for(let o of e)t.addFormat(o,r[o])}ic.exports=Jt=Bn;Object.defineProperty(Jt,"__esModule",{value:!0});Jt.default=Bn});var fc=p((ea,ta)=>{"use strict";Object.defineProperty(ea,"__esModule",{value:!0});var _=Zn(),De=E(),uc=Be(),jh=Ge(),Wt=tt(),$e=oe(),Tr="errorMessage",ze=new _.Name("emUsed"),dc={required:"missingProperty",dependencies:"property",dependentRequired:"property"},lc=/\$\{[^}]+\}/,qh=/\$\{([^}]+)\}/g,Nh=/^""\s*\+\s*|\s*\+\s*""$/g;function Oh(t){return{keyword:Tr,schemaType:["string","object"],post:!0,code(e){let{gen:r,data:s,schema:n,schemaValue:a,it:o}=e;if(o.createErrors===!1)return;let i=n,c=De.strConcat($e.default.instancePath,o.errorPath);r.if(_._`${$e.default.errors} > 0`,()=>{if(typeof i=="object"){let[w,N]=d(i);N&&l(N),w&&y(w),h(u(i))}let v=typeof i=="string"?i:i._;v&&f(v),t.keepErrors||m()});function u({properties:v,items:w}){let N={};if(v){N.props={};for(let z in v)N.props[z]=[]}if(w){N.items={};for(let z=0;zr.if($(T,w),()=>r.code(_._`${w}[${T}.keyword].push(${T})`).assign(_._`${T}.${ze}`,!0)));let{singleError:z}=t;if(z){let T=r.let("message",_._`""`),D=r.let("paramsErrors",_._`[]`);H(ie=>{r.if(T,()=>r.code(_._`${T} += ${typeof z=="string"?z:";"}`)),r.code(_._`${T} += ${G(ie)}`),r.assign(D,_._`${D}.concat(${w}[${ie}])`)}),Wt.reportError(e,{message:T,params:_._`{errors: ${D}}`})}else H(T=>Wt.reportError(e,{message:G(T),params:_._`{errors: ${w}[${T}]}`}));function H(T){r.forIn("key",w,D=>r.if(_._`${w}[${D}].length`,()=>T(D)))}function G(T){return _._`${T} in ${N} ? ${N}[${T}]() : ${a}[${T}]`}}function y(v){let w=r.const("emErrors",_.stringify(v)),N=[];for(let D in v)N.push([D,q(v[D],n[D])]);let z=r.const("templates",r.object(...N)),H=r.scopeValue("obj",{ref:dc,code:_.stringify(dc)}),G=r.let("emPropParams"),T=r.let("emParamsErrors");r.forOf("err",$e.default.vErrors,D=>r.if($(D,w),()=>{r.assign(G,_._`${H}[${D}.keyword]`),r.assign(T,_._`${w}[${D}.keyword][${D}.params[${G}]]`),r.if(T,()=>r.code(_._`${T}.push(${D})`).assign(_._`${D}.${ze}`,!0))})),r.forIn("key",w,D=>r.forIn("keyProp",_._`${w}[${D}]`,ie=>{r.assign(T,_._`${w}[${D}][${ie}]`),r.if(_._`${T}.length`,()=>{let Ve=r.const("tmpl",_._`${z}[${D}] && ${z}[${D}][${ie}]`);Wt.reportError(e,{message:_._`${Ve} ? ${Ve}() : ${a}[${D}][${ie}]`,params:_._`{errors: ${T}}`})})}))}function h(v){let{props:w,items:N}=v;if(!w&&!N)return;let z=_._`typeof ${s} == "object"`,H=_._`Array.isArray(${s})`,G=r.let("emErrors"),T,D,ie=r.let("templates");w&&N?(T=r.let("emChildKwd"),r.if(z),r.if(H,()=>{Ve(N,n.items),r.assign(T,_.str`items`)},()=>{Ve(w,n.properties),r.assign(T,_.str`properties`)}),D=_._`[${T}]`):N?(r.if(H),Ve(N,n.items),D=_._`.items`):w&&(r.if(De.and(z,De.not(H))),Ve(w,n.properties),D=_._`.properties`),r.forOf("err",$e.default.vErrors,ae=>g(ae,G,Mr=>r.code(_._`${G}[${Mr}].push(${ae})`).assign(_._`${ae}.${ze}`,!0))),r.forIn("key",G,ae=>r.if(_._`${G}[${ae}].length`,()=>{Wt.reportError(e,{message:_._`${ae} in ${ie} ? ${ie}[${ae}]() : ${a}${D}[${ae}]`,params:_._`{errors: ${G}[${ae}]}`}),r.assign(_._`${$e.default.vErrors}[${$e.default.errors}-1].instancePath`,_._`${c} + "/" + ${ae}.replace(/~/g, "~0").replace(/\\//g, "~1")`)})),r.endIf();function Ve(ae,Mr){r.assign(G,_.stringify(ae)),r.assign(ie,q(ae,Mr))}}function f(v){let w=r.const("emErrs",_._`[]`);r.forOf("err",$e.default.vErrors,N=>r.if(R(N),()=>r.code(_._`${w}.push(${N})`).assign(_._`${N}.${ze}`,!0))),r.if(_._`${w}.length`,()=>Wt.reportError(e,{message:V(v),params:_._`{errors: ${w}}`}))}function m(){let v=r.const("emErrs",_._`[]`);r.forOf("err",$e.default.vErrors,w=>r.if(_._`!${w}.${ze}`,()=>r.code(_._`${v}.push(${w})`))),r.assign($e.default.vErrors,v).assign($e.default.errors,_._`${v}.length`)}function $(v,w){return De.and(_._`${v}.keyword !== ${Tr}`,_._`!${v}.${ze}`,_._`${v}.instancePath === ${c}`,_._`${v}.keyword in ${w}`,_._`${v}.schemaPath.indexOf(${o.errSchemaPath}) === 0`,_._`/^\\/[^\\/]*$/.test(${v}.schemaPath.slice(${o.errSchemaPath.length}))`)}function g(v,w,N){r.if(De.and(_._`${v}.keyword !== ${Tr}`,_._`!${v}.${ze}`,_._`${v}.instancePath.indexOf(${c}) === 0`),()=>{let z=r.scopeValue("pattern",{ref:/^\/([^/]*)(?:\/|$)/,code:_._`new RegExp("^\\\/([^/]*)(?:\\\/|$)")`}),H=r.const("emMatches",_._`${z}.exec(${v}.instancePath.slice(${c}.length))`),G=r.const("emChild",_._`${H} && ${H}[1].replace(/~1/g, "/").replace(/~0/g, "~")`);r.if(_._`${G} !== undefined && ${G} in ${w}`,()=>N(G))})}function R(v){return De.and(_._`${v}.keyword !== ${Tr}`,_._`!${v}.${ze}`,De.or(_._`${v}.instancePath === ${c}`,De.and(_._`${v}.instancePath.indexOf(${c}) === 0`,_._`${v}.instancePath[${c}.length] === "/"`)),_._`${v}.schemaPath.indexOf(${o.errSchemaPath}) === 0`,_._`${v}.schemaPath[${o.errSchemaPath}.length] === "/"`)}function q(v,w){let N=[];for(let z in v){let H=w[z];lc.test(H)&&N.push([z,S(H)])}return r.object(...N)}function V(v){return lc.test(v)?new uc._Code(uc.safeStringify(v).replace(qh,(w,N)=>`" + JSON.stringify(${jh.getData(N,o)}) + "`).replace(Nh,"")):_.stringify(v)}function S(v){return _._`function(){return ${V(v)}}`}},metaSchema:{anyOf:[{type:"string"},{type:"object",properties:{properties:{$ref:"#/$defs/stringMap"},items:{$ref:"#/$defs/stringList"},required:{$ref:"#/$defs/stringOrMap"},dependencies:{$ref:"#/$defs/stringOrMap"}},additionalProperties:{type:"string"}}],$defs:{stringMap:{type:"object",additionalProperties:{type:"string"}},stringOrMap:{anyOf:[{type:"string"},{$ref:"#/$defs/stringMap"}]},stringList:{type:"array",items:{type:"string"}}}}}}var Xn=(t,e={})=>{if(!t.opts.allErrors)throw new Error("ajv-errors: Ajv option allErrors must be true");if(t.opts.jsPropertySyntax)throw new Error("ajv-errors: ajv option jsPropertySyntax is not supported");return t.addKeyword(Oh(e))};ea.default=Xn;ta.exports=Xn;ta.exports.default=Xn});var pc=Zt(Gi()),hc=Zt(cc()),yc=Zt(fc()),$c=Zt(Wn());var mc={$schema:"http://json-schema.org/draft-06/schema#",$id:"http://json-schema.org/draft-06/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},title:{type:"string"},description:{type:"string"},default:{},examples:{type:"array",items:{}},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:{}},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:{},enum:{type:"array",minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:{}};var Yt=new pc.default({allErrors:!0,strict:!1,verbose:!0});Yt.addMetaSchema($c.default);Yt.addMetaSchema(mc);(0,hc.default)(Yt);(0,yc.default)(Yt);globalThis.ajv=Yt;globalThis.compiledSchemas={};})(); diff --git a/Plugins/Schema/external/ajv/src/ajv_config.js b/Plugins/Schema/external/ajv/src/ajv_config.js new file mode 100644 index 0000000000..6e3caf75c6 --- /dev/null +++ b/Plugins/Schema/external/ajv/src/ajv_config.js @@ -0,0 +1,21 @@ +import Ajv2020 from "ajv/dist/2020"; +import addFormats from "ajv-formats"; +import ajvErrors from "ajv-errors"; + +import draft7Meta from "ajv/dist/refs/json-schema-draft-07.json"; +import draft6Meta from "ajv/dist/refs/json-schema-draft-06.json"; + +const ajv = new Ajv2020({ + allErrors: true, + strict: false, + verbose: true +}); + +ajv.addMetaSchema(draft7Meta); +ajv.addMetaSchema(draft6Meta); + +addFormats(ajv); +ajvErrors(ajv); + +globalThis.ajv = ajv; +globalThis.compiledSchemas = {}; diff --git a/Plugins/Schema/external/ajv/update-ajv.sh b/Plugins/Schema/external/ajv/update-ajv.sh new file mode 100644 index 0000000000..ccdd3963fc --- /dev/null +++ b/Plugins/Schema/external/ajv/update-ajv.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# Self-healing: Strip Windows line endings if running on Unix/macOS/Docker +[[ "$OSTYPE" == "linux-gnu"* || "$OSTYPE" == "darwin"* ]] && sed -i 's/\r$//' "$0" 2>/dev/null +# Standard Windows fix for Git Bash +sed -i 's/\r$//' "$0" 2>/dev/null + +set -e + +# 1. Setup paths +cd "$(dirname "$0")" +# Use -W only on Windows/MSYS to get clean forward-slash paths for Node.js +[[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]] && SCRIPT_DIR=$(pwd -W) || SCRIPT_DIR=$(pwd) + +# Define internal paths for clarity +SOURCE_FILE="$SCRIPT_DIR/src/ajv_config.js" +OUTPUT_FILE="$SCRIPT_DIR/dist/ajv_runtime.min.js" + +echo "--- Rebuilding Ajv Runtime Environment ---" + +# 2. Setup temporary workspace +TEMP_DIR=$(mktemp -d) +# Handle Windows path conversion for the temp dir +[[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]] && TEMP_DIR_WIN=$(cd "$TEMP_DIR" && pwd -W) || TEMP_DIR_WIN="$TEMP_DIR" +cd "$TEMP_DIR" + +# 3. Install packages +npm init -y > /dev/null +npm install ajv@latest ajv-formats@latest ajv-errors@latest esbuild@latest --no-save + +# 4. Run the Bundler +# MSYS_NO_PATHCONV is exported only on Windows/Git Bash +[[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]] && export MSYS_NO_PATHCONV=1 + +node < $DEST_HEADER ---" + +# Ensure destination directory exists +mkdir -p "$DEST_HEADER_DIR" + +# Ensure xxd is available +# Fail early if xxd is missing +if ! command -v xxd >/dev/null 2>&1; then + echo "ERROR: 'xxd' not found. Cannot generate $DEST_HEADER." + exit 1 +fi + +# Run xxd from inside the dist directory so it sees the basename +pushd "$DEST_HEADER_DIR" >/dev/null +if [ ! -f "ajv_runtime.min.js" ]; then + echo "ERROR: expected ajv_runtime.min.js in $DEST_HEADER_DIR but it's missing" + popd >/dev/null + exit 1 +fi +xxd -i "ajv_runtime.min.js" > "$DEST_HEADER" +echo "WROTE: $DEST_HEADER" +popd >/dev/null + +# 6. Cleanup +cd "$SCRIPT_DIR" +rm -rf "$TEMP_DIR" diff --git a/Plugins/Schema/external/quickjs/LICENSE.md b/Plugins/Schema/external/quickjs/LICENSE.md new file mode 100644 index 0000000000..864cd0bf32 --- /dev/null +++ b/Plugins/Schema/external/quickjs/LICENSE.md @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2017-2024 Fabrice Bellard +Copyright (c) 2017-2024 Charlie Gordon +Copyright (c) 2023-2025 Ben Noordhuis +Copyright (c) 2023-2025 Saúl Ibarra Corretgé + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Plugins/Schema/external/quickjs/src/amalgam.js b/Plugins/Schema/external/quickjs/src/amalgam.js new file mode 100644 index 0000000000..d2ff25ba1d --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/amalgam.js @@ -0,0 +1,55 @@ +import {loadFile, writeFile} from "qjs:std" + +const cutils_c = loadFile("cutils.c") +const cutils_h = loadFile("cutils.h") +const dtoa_c = loadFile("dtoa.c") +const dtoa_h = loadFile("dtoa.h") +const libregexp_c = loadFile("libregexp.c") +const libregexp_h = loadFile("libregexp.h") +const libregexp_opcode_h = loadFile("libregexp-opcode.h") +const libunicode_c = loadFile("libunicode.c") +const libunicode_h = loadFile("libunicode.h") +const libunicode_table_h = loadFile("libunicode-table.h") +const list_h = loadFile("list.h") +const quickjs_atom_h = loadFile("quickjs-atom.h") +const quickjs_c = loadFile("quickjs.c") +const quickjs_c_atomics_h = loadFile("quickjs-c-atomics.h") +const quickjs_h = loadFile("quickjs.h") +const quickjs_libc_c = loadFile("quickjs-libc.c") +const quickjs_libc_h = loadFile("quickjs-libc.h") +const quickjs_opcode_h = loadFile("quickjs-opcode.h") +const gen_builtin_array_fromasync_h = loadFile("builtin-array-fromasync.h") +const gen_builtin_iterator_zip_h = loadFile("builtin-iterator-zip.h") +const gen_builtin_iterator_zip_keyed_h = loadFile("builtin-iterator-zip-keyed.h") + +let source = "#if defined(QJS_BUILD_LIBC) && defined(__linux__) && !defined(_GNU_SOURCE)\n" + + "#define _GNU_SOURCE\n" + + "#endif\n" + + quickjs_c_atomics_h + + cutils_h + + dtoa_h + + list_h + + libunicode_h // exports lre_is_id_start, used by libregexp.h + + libregexp_h + + libunicode_table_h + + quickjs_h + + quickjs_c + + cutils_c + + dtoa_c + + libregexp_c + + libunicode_c + + "#ifdef QJS_BUILD_LIBC\n" + + quickjs_libc_h + + quickjs_libc_c + + "#endif // QJS_BUILD_LIBC\n" +source = source.replace(/#include "quickjs-atom.h"/g, quickjs_atom_h) +source = source.replace(/#include "quickjs-opcode.h"/g, quickjs_opcode_h) +source = source.replace(/#include "libregexp-opcode.h"/g, libregexp_opcode_h) +source = source.replace(/#include "builtin-array-fromasync.h"/g, + gen_builtin_array_fromasync_h) +source = source.replace(/#include "builtin-iterator-zip.h"/g, + gen_builtin_iterator_zip_h) +source = source.replace(/#include "builtin-iterator-zip-keyed.h"/g, + gen_builtin_iterator_zip_keyed_h) +source = source.replace(/#include "[^"]+"/g, "") +writeFile(execArgv[2] ?? "quickjs-amalgam.c", source) diff --git a/Plugins/Schema/external/quickjs/src/api-test.c b/Plugins/Schema/external/quickjs/src/api-test.c new file mode 100644 index 0000000000..082fc4bd9e --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/api-test.c @@ -0,0 +1,879 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include "quickjs.h" +#include "cutils.h" + +static JSValue eval(JSContext *ctx, const char *code) +{ + return JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_GLOBAL); +} + +static JSValue cfunc_callback(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + return JS_ThrowTypeError(ctx, "from cfunc"); +} + +static JSValue cfuncdata_callback(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, + int magic, JSValueConst *func_data) +{ + return JS_ThrowTypeError(ctx, "from cfuncdata"); +} + +static JSValue cclosure_callback(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, + int magic, void *func_data) +{ + return JS_ThrowTypeError(ctx, "from cclosure"); +} + +static bool closure_finalized = false; + +static void cclosure_opaque_finalize(void *opaque) +{ + if ((intptr_t)opaque == 12) + closure_finalized = true; +} + +static void cfunctions(void) +{ + uint32_t length; + const char *s; + JSValue ret, stack; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + JSValue cfunc = JS_NewCFunction(ctx, cfunc_callback, "cfunc", 42); + JSValue cfuncdata = + JS_NewCFunctionData2(ctx, cfuncdata_callback, "cfuncdata", + /*length*/1337, /*magic*/0, /*data_len*/0, NULL); + JSValue cclosure = + JS_NewCClosure(ctx, cclosure_callback, "cclosure", cclosure_opaque_finalize, + /*length*/0xC0DE, /*magic*/11, /*opaque*/(void*)12); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "cfunc", cfunc); + JS_SetPropertyStr(ctx, global, "cfuncdata", cfuncdata); + JS_SetPropertyStr(ctx, global, "cclosure", cclosure); + JS_FreeValue(ctx, global); + + ret = eval(ctx, "cfunc.name"); + assert(!JS_IsException(ret)); + assert(JS_IsString(ret)); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "cfunc")); + JS_FreeCString(ctx, s); + ret = eval(ctx, "cfunc.length"); + assert(!JS_IsException(ret)); + assert(JS_IsNumber(ret)); + assert(0 == JS_ToUint32(ctx, &length, ret)); + assert(length == 42); + + ret = eval(ctx, "cfuncdata.name"); + assert(!JS_IsException(ret)); + assert(JS_IsString(ret)); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "cfuncdata")); + JS_FreeCString(ctx, s); + ret = eval(ctx, "cfuncdata.length"); + assert(!JS_IsException(ret)); + assert(JS_IsNumber(ret)); + assert(0 == JS_ToUint32(ctx, &length, ret)); + assert(length == 1337); + + ret = eval(ctx, "cclosure.name"); + assert(!JS_IsException(ret)); + assert(JS_IsString(ret)); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "cclosure")); + JS_FreeCString(ctx, s); + ret = eval(ctx, "cclosure.length"); + assert(!JS_IsException(ret)); + assert(JS_IsNumber(ret)); + assert(0 == JS_ToUint32(ctx, &length, ret)); + assert(length == 0xC0DE); + + ret = eval(ctx, "cfunc()"); + assert(JS_IsException(ret)); + ret = JS_GetException(ctx); + assert(JS_IsError(ret)); + stack = JS_GetPropertyStr(ctx, ret, "stack"); + assert(JS_IsString(stack)); + s = JS_ToCString(ctx, stack); + JS_FreeValue(ctx, stack); + assert(s); + assert(!strcmp(s, " at cfunc (native)\n at (:1:1)\n")); + JS_FreeCString(ctx, s); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "TypeError: from cfunc")); + JS_FreeCString(ctx, s); + + ret = eval(ctx, "cfuncdata()"); + assert(JS_IsException(ret)); + ret = JS_GetException(ctx); + assert(JS_IsError(ret)); + stack = JS_GetPropertyStr(ctx, ret, "stack"); + assert(JS_IsString(stack)); + s = JS_ToCString(ctx, stack); + JS_FreeValue(ctx, stack); + assert(s); + assert(!strcmp(s, " at cfuncdata (native)\n at (:1:1)\n")); + JS_FreeCString(ctx, s); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "TypeError: from cfuncdata")); + JS_FreeCString(ctx, s); + + ret = eval(ctx, "cclosure()"); + assert(JS_IsException(ret)); + ret = JS_GetException(ctx); + assert(JS_IsError(ret)); + stack = JS_GetPropertyStr(ctx, ret, "stack"); + assert(JS_IsString(stack)); + s = JS_ToCString(ctx, stack); + JS_FreeValue(ctx, stack); + assert(s); + assert(!strcmp(s, " at cclosure (native)\n at (:1:1)\n")); + JS_FreeCString(ctx, s); + s = JS_ToCString(ctx, ret); + JS_FreeValue(ctx, ret); + assert(s); + assert(!strcmp(s, "TypeError: from cclosure")); + JS_FreeCString(ctx, s); + + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + + assert(closure_finalized); +} + +#define MAX_TIME 10 + +static int timeout_interrupt_handler(JSRuntime *rt, void *opaque) +{ + int *time = (int *)opaque; + if (*time <= MAX_TIME) + *time += 1; + return *time > MAX_TIME; +} + +static void sync_call(void) +{ + static const char code[] = +"(function() { \ + try { \ + while (true) {} \ + } catch (e) {} \ +})();"; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + int time = 0; + JS_SetInterruptHandler(rt, timeout_interrupt_handler, &time); + JSValue ret = eval(ctx, code); + assert(time > MAX_TIME); + assert(JS_IsException(ret)); + JS_FreeValue(ctx, ret); + assert(JS_HasException(ctx)); + JSValue e = JS_GetException(ctx); + assert(JS_IsUncatchableError(e)); + JS_FreeValue(ctx, e); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void async_call(void) +{ + static const char code[] = +"(async function() { \ + const loop = async () => { \ + await Promise.resolve(); \ + while (true) {} \ + }; \ + await loop().catch(() => {}); \ +})();"; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + int time = 0; + JS_SetInterruptHandler(rt, timeout_interrupt_handler, &time); + JSValue ret = eval(ctx, code); + assert(!JS_IsException(ret)); + JS_FreeValue(ctx, ret); + assert(JS_IsJobPending(rt)); + int r = 0; + while (JS_IsJobPending(rt)) { + r = JS_ExecutePendingJob(rt, &ctx); + } + assert(time > MAX_TIME); + assert(r == -1); + assert(JS_HasException(ctx)); + JSValue e = JS_GetException(ctx); + assert(JS_IsUncatchableError(e)); + JS_FreeValue(ctx, e); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static JSValue save_value(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + assert(argc == 1); + JSValue *p = (JSValue *)JS_GetContextOpaque(ctx); + *p = JS_DupValue(ctx, argv[0]); + return JS_UNDEFINED; +} + +static void async_call_stack_overflow(void) +{ + static const char code[] = +"(async function() { \ + const f = () => f(); \ + try { \ + await Promise.resolve(); \ + f(); \ + } catch (e) { \ + save_value(e); \ + } \ +})();"; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + JSValue value = JS_UNDEFINED; + JS_SetContextOpaque(ctx, &value); + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global, "save_value", JS_NewCFunction(ctx, save_value, "save_value", 1)); + JS_FreeValue(ctx, global); + JSValue ret = eval(ctx, code); + assert(!JS_IsException(ret)); + JS_FreeValue(ctx, ret); + assert(JS_IsJobPending(rt)); + int r = 0; + while (JS_IsJobPending(rt)) { + r = JS_ExecutePendingJob(rt, &ctx); + } + assert(r == 1); + assert(!JS_HasException(ctx)); + assert(JS_IsError(value)); // stack overflow should be caught + JS_FreeValue(ctx, value); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +// https://github.com/quickjs-ng/quickjs/issues/914 +static void raw_context_global_var(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContextRaw(rt); + JS_AddIntrinsicEval(ctx); + { + JSValue ret = eval(ctx, "globalThis"); + assert(JS_IsException(ret)); + JS_FreeValue(ctx, ret); + } + { + JSValue ret = eval(ctx, "var x = 42"); + assert(JS_IsUndefined(ret)); + JS_FreeValue(ctx, ret); + } + { + JSValue ret = eval(ctx, "function f() {}"); + assert(JS_IsUndefined(ret)); + JS_FreeValue(ctx, ret); + } + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void is_array(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + { + JSValue ret = eval(ctx, "[]"); + assert(!JS_IsException(ret)); + assert(JS_IsArray(ret)); + JS_FreeValue(ctx, ret); + } + { + JSValue ret = eval(ctx, "new Proxy([], {})"); + assert(!JS_IsException(ret)); + assert(!JS_IsArray(ret)); + assert(JS_IsProxy(ret)); + JSValue handler = JS_GetProxyHandler(ctx, ret); + JSValue target = JS_GetProxyTarget(ctx, ret); + assert(!JS_IsException(handler)); + assert(!JS_IsException(target)); + assert(!JS_IsProxy(handler)); + assert(!JS_IsProxy(target)); + assert(JS_IsObject(handler)); + assert(JS_IsArray(target)); + JS_FreeValue(ctx, handler); + JS_FreeValue(ctx, target); + JS_FreeValue(ctx, ret); + } + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static int loader_calls; + +static JSModuleDef *loader(JSContext *ctx, const char *name, void *opaque) +{ + loader_calls++; + assert(!strcmp(name, "b")); + static const char code[] = "export function f(x){}"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "b", + JS_EVAL_TYPE_MODULE|JS_EVAL_FLAG_COMPILE_ONLY); + assert(!JS_IsException(ret)); + JSModuleDef *m = JS_VALUE_GET_PTR(ret); + assert(m); + JS_FreeValue(ctx, ret); + return m; +} + +static void module_serde(void) +{ + JSRuntime *rt = JS_NewRuntime(); + //JS_SetDumpFlags(rt, JS_DUMP_MODULE_RESOLVE); + JS_SetModuleLoaderFunc(rt, NULL, loader, NULL); + JSContext *ctx = JS_NewContext(rt); + static const char code[] = "import {f} from 'b'; f()"; + assert(loader_calls == 0); + JSValue mod = JS_Eval(ctx, code, strlen(code), "a", + JS_EVAL_TYPE_MODULE|JS_EVAL_FLAG_COMPILE_ONLY); + assert(loader_calls == 1); + assert(!JS_IsException(mod)); + assert(JS_IsModule(mod)); + size_t len = 0; + uint8_t *buf = JS_WriteObject(ctx, &len, mod, + JS_WRITE_OBJ_BYTECODE|JS_WRITE_OBJ_REFERENCE); + assert(buf); + assert(len > 0); + JS_FreeValue(ctx, mod); + assert(loader_calls == 1); + mod = JS_ReadObject(ctx, buf, len, JS_READ_OBJ_BYTECODE); + js_free(ctx, buf); + assert(loader_calls == 1); // 'b' is returned from cache + assert(!JS_IsException(mod)); + JSValue ret = JS_EvalFunction(ctx, mod); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + JSValue result = JS_PromiseResult(ctx, ret); + assert(!JS_IsException(result)); + assert(JS_IsUndefined(result)); + JS_FreeValue(ctx, result); + JS_FreeValue(ctx, ret); + JS_FreeValue(ctx, mod); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void runtime_cstring_free(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + // string -> cstring + JS_FreeCStringRT + { + JSValue ret = eval(ctx, "\"testStringPleaseIgnore\""); + assert(JS_IsString(ret)); + const char *s = JS_ToCString(ctx, ret); + assert(s); + assert(strcmp(s, "testStringPleaseIgnore") == 0); + JS_FreeCStringRT(rt, s); + JS_FreeValue(ctx, ret); + } + // string -> cstring + JS_FreeCStringRT, destroying the source value first + { + JSValue ret = eval(ctx, "\"testStringPleaseIgnore\""); + assert(JS_IsString(ret)); + const char *s = JS_ToCString(ctx, ret); + assert(s); + JS_FreeValue(ctx, ret); + assert(strcmp(s, "testStringPleaseIgnore") == 0); + JS_FreeCStringRT(rt, s); + } + // number -> cstring + JS_FreeCStringRT + { + JSValue ret = eval(ctx, "123987"); + assert(JS_IsNumber(ret)); + const char *s = JS_ToCString(ctx, ret); + assert(s); + assert(strcmp(s, "123987") == 0); + JS_FreeCStringRT(rt, s); + JS_FreeValue(ctx, ret); + } + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void utf16_string(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + { + JSValue v = JS_NewStringUTF16(ctx, NULL, 0); + assert(!JS_IsException(v)); + const char *s = JS_ToCString(ctx, v); + assert(s); + assert(!strcmp(s, "")); + JS_FreeCString(ctx, s); + JS_FreeValue(ctx, v); + } + { + JSValue v = JS_NewStringUTF16(ctx, (uint16_t[]){'o','k'}, 2); + assert(!JS_IsException(v)); + const char *s = JS_ToCString(ctx, v); + assert(s); + assert(!strcmp(s, "ok")); + JS_FreeCString(ctx, s); + size_t n; + const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); + assert(u); + assert(n == 2); + assert(u[0] == 'o'); + assert(u[1] == 'k'); + JS_FreeCStringUTF16(ctx, u); + JS_FreeValue(ctx, v); + } + { + JSValue v = JS_NewStringUTF16(ctx, (uint16_t[]){0xD800}, 1); + assert(!JS_IsException(v)); + const char *s = JS_ToCString(ctx, v); + assert(s); + // questionable but surrogates don't map to UTF-8 without WTF-8 + assert(!strcmp(s, "\xED\xA0\x80")); + JS_FreeCString(ctx, s); + size_t n; + const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); + assert(u); + assert(n == 1); + assert(u[0] == 0xD800); + JS_FreeCStringUTF16(ctx, u); + JS_FreeValue(ctx, v); + } + { + JSValue v = JS_NewStringLen(ctx, "ok", 2); // ascii -> ucs + assert(!JS_IsException(v)); + size_t n; + const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); + assert(u); + assert(n == 2); + assert(u[0] == 'o'); + assert(u[1] == 'k'); + JS_FreeCStringUTF16(ctx, u); + JS_FreeValue(ctx, v); + } + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void weak_map_gc_check(void) +{ + static const char init_code[] = +"const map = new WeakMap(); \ +function addItem() { \ + const k = { \ + text: 'a', \ + }; \ + map.set(k, {k}); \ +}"; + static const char test_code[] = "addItem()"; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + + JSValue ret = eval(ctx, init_code); + assert(!JS_IsException(ret)); + + JSValue ret_test = eval(ctx, test_code); + assert(!JS_IsException(ret_test)); + JS_RunGC(rt); + JSMemoryUsage memory_usage; + JS_ComputeMemoryUsage(rt, &memory_usage); + + for (int i = 0; i < 3; i++) { + JSValue ret_test2 = eval(ctx, test_code); + assert(!JS_IsException(ret_test2)); + JS_RunGC(rt); + JSMemoryUsage memory_usage2; + JS_ComputeMemoryUsage(rt, &memory_usage2); + + assert(memory_usage.memory_used_count == memory_usage2.memory_used_count); + assert(memory_usage.memory_used_size == memory_usage2.memory_used_size); + JS_FreeValue(ctx, ret_test2); + } + + JS_FreeValue(ctx, ret); + JS_FreeValue(ctx, ret_test); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +struct { + int hook_type_call_count[4]; +} promise_hook_state; + +static void promise_hook_cb(JSContext *ctx, JSPromiseHookType type, + JSValueConst promise, JSValueConst parent_promise, + void *opaque) +{ + assert(type == JS_PROMISE_HOOK_INIT || + type == JS_PROMISE_HOOK_BEFORE || + type == JS_PROMISE_HOOK_AFTER || + type == JS_PROMISE_HOOK_RESOLVE); + promise_hook_state.hook_type_call_count[type]++; + assert(opaque == (void *)&promise_hook_state); + if (!JS_IsUndefined(parent_promise)) { + JSValue global_object = JS_GetGlobalObject(ctx); + JS_SetPropertyStr(ctx, global_object, "actual", + JS_DupValue(ctx, parent_promise)); + JS_FreeValue(ctx, global_object); + } +} + +static void promise_hook(void) +{ + int *cc = promise_hook_state.hook_type_call_count; + JSContext *unused; + JSRuntime *rt = JS_NewRuntime(); + //JS_SetDumpFlags(rt, JS_DUMP_PROMISE); + JS_SetPromiseHook(rt, promise_hook_cb, &promise_hook_state); + JSContext *ctx = JS_NewContext(rt); + JSValue global_object = JS_GetGlobalObject(ctx); + { + // empty module; creates an outer and inner module promise; + // JS_Eval returns the outer promise + JSValue ret = JS_Eval(ctx, "", 0, "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); + JS_FreeValue(ctx, ret); + assert(2 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(2 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(!JS_IsJobPending(rt)); + } + memset(&promise_hook_state, 0, sizeof(promise_hook_state)); + { + // module with unresolved promise; the outer and inner module promises + // are resolved but not the user's promise + static const char code[] = "new Promise(() => {})"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); // outer module promise + JS_FreeValue(ctx, ret); + assert(3 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(2 == cc[JS_PROMISE_HOOK_RESOLVE]); // outer and inner module promise + assert(!JS_IsJobPending(rt)); + } + memset(&promise_hook_state, 0, sizeof(promise_hook_state)); + { + // module with resolved promise + static const char code[] = "new Promise((resolve,reject) => resolve())"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); // outer module promise + JS_FreeValue(ctx, ret); + assert(3 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(3 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(!JS_IsJobPending(rt)); + } + memset(&promise_hook_state, 0, sizeof(promise_hook_state)); + { + // module with rejected promise + static const char code[] = "new Promise((resolve,reject) => reject())"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); // outer module promise + JS_FreeValue(ctx, ret); + assert(3 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(2 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(!JS_IsJobPending(rt)); + } + memset(&promise_hook_state, 0, sizeof(promise_hook_state)); + { + // module with promise chain + static const char code[] = + "globalThis.count = 0;" + "globalThis.actual = undefined;" // set by promise_hook_cb + "globalThis.expected = new Promise(resolve => resolve());" + "expected.then(_ => count++)"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); // outer module promise + JS_FreeValue(ctx, ret); + assert(4 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(3 == cc[JS_PROMISE_HOOK_RESOLVE]); + JSValue v = JS_GetPropertyStr(ctx, global_object, "count"); + assert(!JS_IsException(v)); + int32_t count; + assert(0 == JS_ToInt32(ctx, &count, v)); + assert(0 == count); + JS_FreeValue(ctx, v); + assert(JS_IsJobPending(rt)); + assert(1 == JS_ExecutePendingJob(rt, &unused)); + assert(!JS_HasException(ctx)); + assert(4 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(4 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(!JS_IsJobPending(rt)); + v = JS_GetPropertyStr(ctx, global_object, "count"); + assert(!JS_IsException(v)); + assert(0 == JS_ToInt32(ctx, &count, v)); + assert(1 == count); + JS_FreeValue(ctx, v); + JSValue actual = JS_GetPropertyStr(ctx, global_object, "actual"); + JSValue expected = JS_GetPropertyStr(ctx, global_object, "expected"); + assert(!JS_IsException(actual)); + assert(!JS_IsException(expected)); + assert(JS_IsSameValue(ctx, actual, expected)); + JS_FreeValue(ctx, actual); + JS_FreeValue(ctx, expected); + } + memset(&promise_hook_state, 0, sizeof(promise_hook_state)); + { + // module with thenable; fires before and after hooks + static const char code[] = + "new Promise(resolve => resolve({then(resolve){ resolve() }}))"; + JSValue ret = JS_Eval(ctx, code, strlen(code), "", JS_EVAL_TYPE_MODULE); + assert(!JS_IsException(ret)); + assert(JS_IsPromise(ret)); + assert(JS_PROMISE_FULFILLED == JS_PromiseState(ctx, ret)); // outer module promise + JS_FreeValue(ctx, ret); + assert(3 == cc[JS_PROMISE_HOOK_INIT]); + assert(0 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(0 == cc[JS_PROMISE_HOOK_AFTER]); + assert(2 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(JS_IsJobPending(rt)); + assert(1 == JS_ExecutePendingJob(rt, &unused)); + assert(!JS_HasException(ctx)); + assert(3 == cc[JS_PROMISE_HOOK_INIT]); + assert(1 == cc[JS_PROMISE_HOOK_BEFORE]); + assert(1 == cc[JS_PROMISE_HOOK_AFTER]); + assert(3 == cc[JS_PROMISE_HOOK_RESOLVE]); + assert(!JS_IsJobPending(rt)); + } + JS_FreeValue(ctx, global_object); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void dump_memory_usage(void) +{ + JSMemoryUsage stats; + + JSRuntime *rt = NULL; + JSContext *ctx = NULL; + + rt = JS_NewRuntime(); + ctx = JS_NewContext(rt); + + //JS_SetDumpFlags(rt, JS_DUMP_PROMISE); + + static const char code[] = + "globalThis.count = 0;" + "globalThis.actual = undefined;" // set by promise_hook_cb + "globalThis.expected = new Promise(resolve => resolve());" + "expected.then(_ => count++)"; + + JSValue evalVal = JS_Eval(ctx, code, strlen(code), "", 0); + JS_FreeValue(ctx, evalVal); + + FILE *temp = tmpfile(); + assert(temp != NULL); + JS_ComputeMemoryUsage(rt, &stats); + JS_DumpMemoryUsage(temp, &stats, rt); + // JS_DumpMemoryUsage(stdout, &stats, rt); + fclose(temp); + + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static void new_errors(void) +{ + typedef struct { + const char name[16]; + JSValue (*func)(JSContext *, const char *, ...); + } Entry; + static const Entry entries[] = { + {"Error", JS_NewPlainError}, + {"InternalError", JS_NewInternalError}, + {"RangeError", JS_NewRangeError}, + {"ReferenceError", JS_NewReferenceError}, + {"SyntaxError", JS_NewSyntaxError}, + {"TypeError", JS_NewTypeError}, + }; + const Entry *e; + + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + for (e = entries; e < endof(entries); e++) { + JSValue obj = (*e->func)(ctx, "the %s", "needle"); + assert(!JS_IsException(obj)); + assert(JS_IsObject(obj)); + assert(JS_IsError(obj)); + const char *haystack = JS_ToCString(ctx, obj); + char needle[256]; + snprintf(needle, sizeof(needle), "%s: the needle", e->name); + assert(strstr(haystack, needle)); + JS_FreeCString(ctx, haystack); + JSValue stack = JS_GetPropertyStr(ctx, obj, "stack"); + assert(!JS_IsException(stack)); + assert(JS_IsString(stack)); + JS_FreeValue(ctx, stack); + JS_FreeValue(ctx, obj); + } + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static int gop_get_own_property(JSContext *ctx, JSPropertyDescriptor *desc, + JSValueConst obj, JSAtom prop) +{ + const char *name; + int found; + + found = 0; + name = JS_AtomToCString(ctx, prop); + if (!name) + return -1; + if (!strcmp(name, "answer")) { + found = 1; + *desc = (JSPropertyDescriptor){ + .value = JS_NewInt32(ctx, 42), + .flags = JS_PROP_C_W_E | JS_PROP_HAS_VALUE, + }; + } + JS_FreeCString(ctx, name); + return found; +} + +static void global_object_prototype(void) +{ + static const char code[] = "answer"; + JSValue global_object, proto, ret; + JSClassID class_id; + JSRuntime *rt; + JSContext *ctx; + int32_t answer; + int res; + + { + rt = JS_NewRuntime(); + ctx = JS_NewContext(rt); + proto = JS_NewObject(ctx); + assert(JS_IsObject(proto)); + JSCFunctionListEntry prop = JS_PROP_INT32_DEF("answer", 42, JS_PROP_C_W_E); + JS_SetPropertyFunctionList(ctx, proto, &prop, 1); + global_object = JS_GetGlobalObject(ctx); + res = JS_SetPrototype(ctx, global_object, proto); + assert(res == true); + JS_FreeValue(ctx, global_object); + JS_FreeValue(ctx, proto); + ret = eval(ctx, code); + assert(!JS_IsException(ret)); + assert(JS_IsNumber(ret)); + res = JS_ToInt32(ctx, &answer, ret); + assert(res == 0); + assert(answer == 42); + JS_FreeValue(ctx, ret); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + } + { + JSClassExoticMethods exotic = (JSClassExoticMethods){ + .get_own_property = gop_get_own_property, + }; + JSClassDef def = (JSClassDef){ + .class_name = "Global Object", + .exotic = &exotic, + }; + rt = JS_NewRuntime(); + class_id = 0; + JS_NewClassID(rt, &class_id); + res = JS_NewClass(rt, class_id, &def); + assert(res == 0); + ctx = JS_NewContext(rt); + proto = JS_NewObjectClass(ctx, class_id); + assert(JS_IsObject(proto)); + global_object = JS_GetGlobalObject(ctx); + res = JS_SetPrototype(ctx, global_object, proto); + assert(res == true); + JS_FreeValue(ctx, global_object); + JS_FreeValue(ctx, proto); + ret = eval(ctx, code); + assert(!JS_IsException(ret)); + assert(JS_IsNumber(ret)); + res = JS_ToInt32(ctx, &answer, ret); + assert(res == 0); + assert(answer == 42); + JS_FreeValue(ctx, ret); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + } +} + +// https://github.com/quickjs-ng/quickjs/issues/1178 +static void slice_string_tocstring(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + JSValue ret = eval(ctx, "'.'.repeat(16384).slice(1, -1)"); + assert(!JS_IsException(ret)); + assert(JS_IsString(ret)); + const char *str = JS_ToCString(ctx, ret); + assert(strlen(str) == 16382); + JS_FreeCString(ctx, str); + JS_FreeValue(ctx, ret); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +int main(void) +{ + cfunctions(); + sync_call(); + async_call(); + async_call_stack_overflow(); + raw_context_global_var(); + is_array(); + module_serde(); + runtime_cstring_free(); + utf16_string(); + weak_map_gc_check(); + promise_hook(); + dump_memory_usage(); + new_errors(); + global_object_prototype(); + slice_string_tocstring(); + return 0; +} diff --git a/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.h b/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.h new file mode 100644 index 0000000000..ae191f198e --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.h @@ -0,0 +1,118 @@ +/* File generated automatically by the QuickJS-ng compiler. */ + +#include + +const uint32_t qjsc_builtin_array_fromasync_size = 871; + +const uint8_t qjsc_builtin_array_fromasync[871] = { + 0x16, 0x0e, 0x01, 0x28, 0x53, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0xb7, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x01, 0x2a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0xb7, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x01, + 0x1e, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0xb7, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x01, 0x12, 0x61, 0x72, 0x72, 0x61, 0x79, 0x4c, + 0x69, 0x6b, 0x65, 0x01, 0x0a, 0x6d, 0x61, 0x70, + 0x46, 0x6e, 0x01, 0x0e, 0x74, 0x68, 0x69, 0x73, + 0x41, 0x72, 0x67, 0x01, 0x0c, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x01, 0x02, 0x69, 0x01, 0x1a, + 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x01, 0x08, 0x73, + 0x79, 0x6e, 0x63, 0x01, 0x0c, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x01, 0x08, 0x69, 0x74, 0x65, + 0x72, 0x01, 0x1c, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x01, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x0c, + 0x00, 0x02, 0x00, 0xa2, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, 0xa4, 0x01, + 0x00, 0x00, 0x00, 0x0c, 0x43, 0x02, 0x01, 0x00, + 0x05, 0x00, 0x05, 0x01, 0x05, 0x00, 0x01, 0x03, + 0x05, 0xae, 0x02, 0x00, 0x01, 0x40, 0x03, 0xa4, + 0x03, 0x00, 0x01, 0x40, 0x00, 0xca, 0x03, 0x00, + 0x01, 0x40, 0x01, 0xcc, 0x03, 0x00, 0x01, 0x40, + 0x04, 0xce, 0x03, 0x00, 0x01, 0x40, 0x02, 0x0c, + 0x60, 0x02, 0x01, 0xf8, 0x01, 0x03, 0x0e, 0x01, + 0x06, 0x00, 0x05, 0x00, 0x86, 0x04, 0x11, 0xd0, + 0x03, 0x00, 0x01, 0x00, 0xd2, 0x03, 0x00, 0x01, + 0x00, 0xd4, 0x03, 0x00, 0x01, 0x00, 0xd0, 0x03, + 0x01, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x20, 0xd2, + 0x03, 0x01, 0x01, 0x20, 0xd4, 0x03, 0x01, 0x02, + 0x20, 0xd6, 0x03, 0x02, 0x00, 0x20, 0xd8, 0x03, + 0x02, 0x04, 0x20, 0xda, 0x03, 0x02, 0x05, 0x20, + 0xdc, 0x03, 0x02, 0x06, 0x20, 0xde, 0x03, 0x02, + 0x07, 0x20, 0x64, 0x06, 0x08, 0x20, 0x82, 0x01, + 0x07, 0x09, 0x20, 0xe0, 0x03, 0x0a, 0x08, 0x30, + 0x82, 0x01, 0x0d, 0x0b, 0x20, 0xd4, 0x01, 0x0d, + 0x0c, 0x20, 0x10, 0x00, 0x01, 0x00, 0xa4, 0x03, + 0x01, 0x03, 0xca, 0x03, 0x02, 0x03, 0xce, 0x03, + 0x04, 0x03, 0xae, 0x02, 0x00, 0x03, 0xcc, 0x03, + 0x03, 0x03, 0x08, 0xc4, 0x0d, 0x62, 0x02, 0x00, + 0x62, 0x01, 0x00, 0x62, 0x00, 0x00, 0xd3, 0xcb, + 0xd4, 0x11, 0xf4, 0xec, 0x08, 0x0e, 0x39, 0x46, + 0x00, 0x00, 0x00, 0xdc, 0xcc, 0xd5, 0x11, 0xf4, + 0xec, 0x08, 0x0e, 0x39, 0x46, 0x00, 0x00, 0x00, + 0xdd, 0xcd, 0x62, 0x07, 0x00, 0x62, 0x06, 0x00, + 0x62, 0x05, 0x00, 0x62, 0x04, 0x00, 0x62, 0x03, + 0x00, 0xd4, 0x39, 0x46, 0x00, 0x00, 0x00, 0xb0, + 0xec, 0x16, 0xd4, 0x98, 0x04, 0x1b, 0x00, 0x00, + 0x00, 0xb0, 0xec, 0x0c, 0xdf, 0x11, 0x04, 0xf1, + 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x06, + 0xce, 0xb6, 0xc4, 0x04, 0xc3, 0x0d, 0xf7, 0xc4, + 0x05, 0x09, 0xc4, 0x06, 0xd3, 0xe0, 0x48, 0xc4, + 0x07, 0x63, 0x07, 0x00, 0x07, 0xad, 0xec, 0x0f, + 0x0a, 0x11, 0x64, 0x06, 0x00, 0x0e, 0xd3, 0xe1, + 0x48, 0x11, 0x64, 0x07, 0x00, 0x0e, 0x63, 0x07, + 0x00, 0x07, 0xad, 0x6a, 0xa6, 0x00, 0x00, 0x00, + 0x62, 0x08, 0x00, 0x06, 0x11, 0xf4, 0xed, 0x0c, + 0x71, 0x43, 0x32, 0x00, 0x00, 0x00, 0xc4, 0x08, + 0x0e, 0xee, 0x05, 0x0e, 0xd3, 0xee, 0xf2, 0x63, + 0x08, 0x00, 0x8e, 0x11, 0xed, 0x03, 0x0e, 0xb6, + 0x11, 0x64, 0x08, 0x00, 0x0e, 0x63, 0x05, 0x00, + 0xec, 0x0c, 0xc3, 0x0d, 0x11, 0x63, 0x08, 0x00, + 0x21, 0x01, 0x00, 0xee, 0x06, 0xe2, 0x63, 0x08, + 0x00, 0xf1, 0x11, 0x64, 0x03, 0x00, 0x0e, 0x63, + 0x04, 0x00, 0x63, 0x08, 0x00, 0xa7, 0x6a, 0x2a, + 0x01, 0x00, 0x00, 0x62, 0x09, 0x00, 0xd3, 0x63, + 0x04, 0x00, 0x48, 0xc4, 0x09, 0x63, 0x06, 0x00, + 0xec, 0x0a, 0x63, 0x09, 0x00, 0x8c, 0x11, 0x64, + 0x09, 0x00, 0x0e, 0xd4, 0xec, 0x17, 0xd4, 0x43, + 0xf2, 0x00, 0x00, 0x00, 0xd5, 0x63, 0x09, 0x00, + 0x63, 0x04, 0x00, 0x24, 0x03, 0x00, 0x8c, 0x11, + 0x64, 0x09, 0x00, 0x0e, 0x5f, 0x04, 0x00, 0x63, + 0x03, 0x00, 0x63, 0x04, 0x00, 0x92, 0x64, 0x04, + 0x00, 0x0b, 0x63, 0x09, 0x00, 0x4d, 0x41, 0x00, + 0x00, 0x00, 0x0a, 0x4d, 0x3e, 0x00, 0x00, 0x00, + 0x0a, 0x4d, 0x3f, 0x00, 0x00, 0x00, 0xf3, 0x0e, + 0xee, 0x9e, 0x62, 0x0a, 0x00, 0x63, 0x07, 0x00, + 0x43, 0xf2, 0x00, 0x00, 0x00, 0xd3, 0x24, 0x01, + 0x00, 0xc4, 0x0a, 0x63, 0x05, 0x00, 0xec, 0x09, + 0xc3, 0x0d, 0x11, 0x21, 0x00, 0x00, 0xee, 0x03, + 0xe2, 0xf0, 0x11, 0x64, 0x03, 0x00, 0x0e, 0x6d, + 0x8c, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x62, + 0x0b, 0x00, 0x06, 0x11, 0xf4, 0xed, 0x13, 0x71, + 0x43, 0x41, 0x00, 0x00, 0x00, 0xc4, 0x0b, 0x43, + 0x6a, 0x00, 0x00, 0x00, 0xc4, 0x0c, 0x0e, 0xee, + 0x10, 0x0e, 0x63, 0x0a, 0x00, 0x43, 0x6b, 0x00, + 0x00, 0x00, 0x24, 0x00, 0x00, 0x8c, 0xee, 0xe0, + 0x63, 0x0c, 0x00, 0xed, 0x4e, 0x63, 0x06, 0x00, + 0xec, 0x0a, 0x63, 0x0b, 0x00, 0x8c, 0x11, 0x64, + 0x0b, 0x00, 0x0e, 0xd4, 0xec, 0x17, 0xd4, 0x43, + 0xf2, 0x00, 0x00, 0x00, 0xd5, 0x63, 0x0b, 0x00, + 0x63, 0x04, 0x00, 0x24, 0x03, 0x00, 0x8c, 0x11, + 0x64, 0x0b, 0x00, 0x0e, 0x5f, 0x04, 0x00, 0x63, + 0x03, 0x00, 0x63, 0x04, 0x00, 0x92, 0x64, 0x04, + 0x00, 0x0b, 0x63, 0x0b, 0x00, 0x4d, 0x41, 0x00, + 0x00, 0x00, 0x0a, 0x4d, 0x3e, 0x00, 0x00, 0x00, + 0x0a, 0x4d, 0x3f, 0x00, 0x00, 0x00, 0xf3, 0x0e, + 0xee, 0x83, 0x0e, 0x06, 0x6e, 0x0d, 0x00, 0x00, + 0x00, 0x0e, 0xee, 0x1e, 0x6e, 0x05, 0x00, 0x00, + 0x00, 0x30, 0x63, 0x0a, 0x00, 0x42, 0x06, 0x00, + 0x00, 0x00, 0xec, 0x0d, 0x63, 0x0a, 0x00, 0x43, + 0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, + 0x6f, 0x63, 0x03, 0x00, 0x63, 0x04, 0x00, 0x44, + 0x32, 0x00, 0x00, 0x00, 0x63, 0x03, 0x00, 0x2f, + 0xc1, 0x00, 0x28, 0xc1, 0x00, 0xcf, 0x28, +}; + diff --git a/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.js b/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.js new file mode 100644 index 0000000000..3e425c0044 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-array-fromasync.js @@ -0,0 +1,36 @@ +;(function(Array, TypeError, Symbol·asyncIterator, Object·defineProperty, Symbol·iterator) { + "use strict" // result.length=i should throw if .length is not writable + return async function fromAsync(arrayLike, mapFn=undefined, thisArg=undefined) { + if (mapFn !== undefined && typeof mapFn !== "function") throw new TypeError("not a function") + let result, i = 0, isConstructor = typeof this === "function" + let sync = false, method = arrayLike[Symbol·asyncIterator] + if (method == null) sync = true, method = arrayLike[Symbol·iterator] + if (method == null) { + let {length} = arrayLike + length = +length || 0 + result = isConstructor ? new this(length) : Array(length) + while (i < length) { + let value = arrayLike[i] + if (sync) value = await value + if (mapFn) value = await mapFn.call(thisArg, value, i) + Object·defineProperty(result, i++, {value, configurable: true, writable: true}) + } + } else { + const iter = method.call(arrayLike) + result = isConstructor ? new this() : Array() + try { + for (;;) { + let {value, done} = await iter.next() + if (done) break + if (sync) value = await value + if (mapFn) value = await mapFn.call(thisArg, value, i) + Object·defineProperty(result, i++, {value, configurable: true, writable: true}) + } + } finally { + if (iter.return) iter.return() + } + } + result.length = i + return result + } +}) diff --git a/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.h b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.h new file mode 100644 index 0000000000..2183c24dd4 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.h @@ -0,0 +1,332 @@ +/* File generated automatically by the QuickJS-ng compiler. */ + +#include + +const uint32_t qjsc_builtin_iterator_zip_keyed_size = 2578; + +const uint8_t qjsc_builtin_iterator_zip_keyed[2578] = { + 0x16, 0x2b, 0x01, 0x1c, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x6c, 0x70, + 0x65, 0x72, 0x01, 0x08, 0x63, 0x61, 0x6c, 0x6c, + 0x01, 0x24, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, + 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x01, 0x24, 0x67, 0x65, + 0x74, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x01, 0x1e, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0xb7, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x01, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x01, 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x01, + 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x61, 0x6c, + 0x6c, 0x01, 0x02, 0x76, 0x01, 0x02, 0x73, 0x01, + 0x08, 0x69, 0x74, 0x65, 0x72, 0x01, 0x0c, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x01, 0x02, 0x65, + 0x01, 0x0a, 0x69, 0x74, 0x65, 0x72, 0x73, 0x01, + 0x0a, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x01, 0x04, + 0x65, 0x78, 0x01, 0x02, 0x69, 0x01, 0x12, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x01, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x01, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x01, + 0x0e, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x01, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x01, + 0x08, 0x70, 0x61, 0x64, 0x73, 0x01, 0x06, 0x6b, + 0x65, 0x79, 0x01, 0x06, 0x64, 0x65, 0x6c, 0x01, + 0x02, 0x6a, 0x01, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x01, 0x0a, 0x61, 0x6c, 0x69, 0x76, 0x65, + 0x01, 0x0a, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x01, + 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x01, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x01, 0x1c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x72, + 0x01, 0x06, 0x62, 0x75, 0x67, 0x01, 0x0e, 0x6c, + 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x01, 0x0c, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x01, 0x22, + 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x01, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x65, 0x73, 0x74, 0x01, 0x16, 0x62, 0x75, 0x67, + 0x3a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3d, + 0x01, 0x1a, 0x62, 0x61, 0x64, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x01, + 0x16, 0x62, 0x61, 0x64, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x01, 0x10, 0x62, 0x61, + 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x01, 0x16, + 0x62, 0x61, 0x64, 0x20, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x01, 0x18, 0x62, 0x61, 0x64, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x0c, 0x00, 0x02, 0x00, 0xa2, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, + 0xa4, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x43, 0x02, + 0x00, 0x00, 0x07, 0x03, 0x07, 0x01, 0x0a, 0x00, + 0x04, 0x0c, 0x0a, 0xca, 0x03, 0x00, 0x01, 0x40, + 0x09, 0xa8, 0x03, 0x00, 0x01, 0x40, 0x03, 0xa4, + 0x03, 0x00, 0x01, 0x40, 0x00, 0xcc, 0x03, 0x00, + 0x01, 0x40, 0x01, 0xce, 0x03, 0x00, 0x01, 0x40, + 0x07, 0xd0, 0x03, 0x00, 0x01, 0x40, 0x06, 0xd2, + 0x03, 0x00, 0x01, 0x40, 0x08, 0xd4, 0x03, 0x00, + 0x00, 0x40, 0x05, 0xd6, 0x03, 0x00, 0x01, 0x40, + 0x02, 0xd8, 0x03, 0x00, 0x02, 0x40, 0x04, 0x0c, + 0x43, 0x02, 0x00, 0xd4, 0x03, 0x02, 0x00, 0x02, + 0x03, 0x00, 0x01, 0x00, 0x17, 0x02, 0xda, 0x03, + 0x00, 0x01, 0x00, 0xdc, 0x03, 0x00, 0x01, 0x00, + 0xa4, 0x03, 0x02, 0x03, 0xd3, 0x98, 0x04, 0x4a, + 0x00, 0x00, 0x00, 0xaf, 0xec, 0x07, 0xd3, 0x07, + 0xb0, 0xec, 0x02, 0x29, 0xdf, 0x11, 0xd4, 0x21, + 0x01, 0x00, 0x30, 0x0c, 0x43, 0x02, 0x00, 0xd6, + 0x03, 0x01, 0x02, 0x01, 0x04, 0x00, 0x01, 0x00, + 0x2e, 0x03, 0xde, 0x03, 0x00, 0x01, 0x00, 0xe0, + 0x03, 0x02, 0x00, 0x20, 0xe2, 0x03, 0x05, 0x00, + 0x03, 0xcc, 0x03, 0x03, 0x03, 0x6d, 0x23, 0x00, + 0x00, 0x00, 0x62, 0x00, 0x00, 0xd3, 0x97, 0xec, + 0x04, 0x06, 0x70, 0x28, 0xd3, 0x42, 0x06, 0x00, + 0x00, 0x00, 0xcb, 0x63, 0x00, 0x00, 0xec, 0x08, + 0xdf, 0xd3, 0x63, 0x00, 0x00, 0xf2, 0x0e, 0x0e, + 0x29, 0xcc, 0x6d, 0x07, 0x00, 0x00, 0x00, 0xc8, + 0x70, 0x28, 0x30, 0x0c, 0x43, 0x02, 0x00, 0xd8, + 0x03, 0x02, 0x04, 0x02, 0x03, 0x00, 0x01, 0x00, + 0x55, 0x06, 0xe4, 0x03, 0x00, 0x01, 0x00, 0xe6, + 0x03, 0x00, 0x01, 0x00, 0xe8, 0x03, 0x01, 0x00, + 0x20, 0xea, 0x03, 0x02, 0x01, 0x20, 0xde, 0x03, + 0x03, 0x02, 0x20, 0xe2, 0x03, 0x03, 0x03, 0x20, + 0xd6, 0x03, 0x01, 0x01, 0x62, 0x00, 0x00, 0x39, + 0x46, 0x00, 0x00, 0x00, 0xcb, 0x62, 0x01, 0x00, + 0xd4, 0xcc, 0x63, 0x01, 0x00, 0x91, 0x64, 0x01, + 0x00, 0xb6, 0xa9, 0xec, 0x39, 0x62, 0x03, 0x00, + 0x62, 0x02, 0x00, 0xd3, 0x63, 0x01, 0x00, 0x48, + 0xcd, 0xd3, 0x63, 0x01, 0x00, 0x1b, 0x11, 0xb1, + 0xed, 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x39, 0x46, + 0x00, 0x00, 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0xdf, + 0x63, 0x02, 0x00, 0xf1, 0xce, 0x63, 0x00, 0x00, + 0x97, 0xec, 0xc8, 0x63, 0x03, 0x00, 0x11, 0x64, + 0x00, 0x00, 0x0e, 0xee, 0xbe, 0x63, 0x00, 0x00, + 0x28, 0x0c, 0x41, 0x02, 0x00, 0xaa, 0x02, 0x02, + 0x15, 0x01, 0x06, 0x08, 0x09, 0x02, 0xc9, 0x05, + 0x17, 0xec, 0x03, 0x00, 0x01, 0x00, 0xee, 0x03, + 0x00, 0x01, 0x00, 0xec, 0x03, 0x01, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x20, 0xee, 0x03, 0x01, 0x01, + 0x20, 0xf0, 0x03, 0x02, 0x00, 0x60, 0x04, 0xf2, + 0x03, 0x02, 0x03, 0x20, 0x60, 0x02, 0x04, 0x60, + 0x02, 0xe6, 0x03, 0x02, 0x05, 0x60, 0x01, 0xe4, + 0x03, 0x02, 0x06, 0x60, 0x03, 0xf4, 0x03, 0x02, + 0x07, 0x60, 0x06, 0xf6, 0x03, 0x02, 0x08, 0x60, + 0x05, 0xf8, 0x03, 0x09, 0x15, 0x20, 0xea, 0x03, + 0x0b, 0x15, 0x20, 0xfa, 0x03, 0x0c, 0x0b, 0x20, + 0xf8, 0x03, 0x0c, 0x0c, 0x20, 0xde, 0x03, 0x0e, + 0x0d, 0x20, 0xe0, 0x03, 0x10, 0x0e, 0x20, 0xfc, + 0x03, 0x14, 0x0d, 0x20, 0xea, 0x03, 0x19, 0x15, + 0x20, 0xea, 0x03, 0x1b, 0x15, 0x20, 0xe2, 0x03, + 0x1c, 0x15, 0x03, 0xfe, 0x03, 0x02, 0x09, 0x60, + 0x00, 0x80, 0x04, 0x02, 0x14, 0x60, 0x07, 0xa4, + 0x03, 0x02, 0x03, 0xa8, 0x03, 0x01, 0x03, 0xcc, + 0x03, 0x03, 0x03, 0xd8, 0x03, 0x02, 0x01, 0xd4, + 0x03, 0x00, 0x01, 0xd0, 0x03, 0x05, 0x03, 0xce, + 0x03, 0x04, 0x03, 0xd2, 0x03, 0x06, 0x03, 0xca, + 0x03, 0x00, 0x03, 0x0c, 0x42, 0x03, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x05, 0x00, 0x0c, 0x00, 0xf7, + 0x04, 0x09, 0x82, 0x04, 0x01, 0x00, 0x20, 0xd8, + 0x01, 0x01, 0x01, 0x20, 0x84, 0x04, 0x01, 0x02, + 0x20, 0xea, 0x03, 0x03, 0x03, 0x20, 0xf8, 0x03, + 0x04, 0x04, 0x20, 0xde, 0x03, 0x04, 0x05, 0x20, + 0x86, 0x04, 0x04, 0x06, 0x20, 0xe2, 0x03, 0x09, + 0x07, 0x03, 0xe8, 0x03, 0x10, 0x07, 0x20, 0xfe, + 0x03, 0x13, 0x09, 0xa4, 0x03, 0x00, 0x02, 0xa8, + 0x03, 0x01, 0x02, 0xe6, 0x03, 0x05, 0x09, 0x60, + 0x04, 0x09, 0xe4, 0x03, 0x06, 0x09, 0xf0, 0x03, + 0x02, 0x09, 0xf6, 0x03, 0x08, 0x09, 0xcc, 0x03, + 0x02, 0x02, 0xf4, 0x03, 0x07, 0x09, 0x80, 0x04, + 0x14, 0x09, 0xd8, 0x03, 0x03, 0x00, 0x62, 0x02, + 0x00, 0x62, 0x01, 0x00, 0x62, 0x00, 0x00, 0x66, + 0x00, 0x00, 0x11, 0xb6, 0xaf, 0xed, 0x06, 0x11, + 0xb7, 0xaf, 0xec, 0x09, 0xb8, 0x11, 0x67, 0x00, + 0x00, 0x0e, 0xee, 0x33, 0x11, 0xb8, 0xaf, 0xec, + 0x0c, 0xe0, 0x11, 0x04, 0x04, 0x01, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x11, 0xb9, 0xaf, 0xec, + 0x13, 0x0b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x4d, + 0x41, 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x6a, 0x00, + 0x00, 0x00, 0x28, 0xe1, 0x11, 0x04, 0x05, 0x01, + 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x0e, 0xb6, + 0xcb, 0xb6, 0xcc, 0x0c, 0x07, 0xcd, 0x62, 0x03, + 0x00, 0xb6, 0xce, 0x63, 0x03, 0x00, 0x66, 0x03, + 0x00, 0xa7, 0x6a, 0xdd, 0x01, 0x00, 0x00, 0x62, + 0x06, 0x00, 0x62, 0x05, 0x00, 0x62, 0x04, 0x00, + 0x66, 0x04, 0x00, 0x63, 0x03, 0x00, 0x48, 0xc4, + 0x04, 0x66, 0x05, 0x00, 0x63, 0x03, 0x00, 0x48, + 0xc4, 0x05, 0x63, 0x05, 0x00, 0x97, 0xec, 0x34, + 0x66, 0x06, 0x00, 0x04, 0x06, 0x01, 0x00, 0x00, + 0xb0, 0xec, 0x0c, 0xe1, 0x11, 0x04, 0x05, 0x01, + 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, 0x02, + 0x00, 0x63, 0x04, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x66, 0x07, 0x00, + 0x63, 0x03, 0x00, 0x48, 0x1b, 0x72, 0x1b, 0x4a, + 0xef, 0x7c, 0x01, 0x06, 0xc4, 0x06, 0x6d, 0x1a, + 0x00, 0x00, 0x00, 0x5f, 0x08, 0x00, 0x63, 0x05, + 0x00, 0x66, 0x09, 0x00, 0x63, 0x03, 0x00, 0x48, + 0xf2, 0x11, 0x64, 0x06, 0x00, 0x0e, 0x0e, 0xee, + 0x35, 0xc4, 0x07, 0x6d, 0x30, 0x00, 0x00, 0x00, + 0xb6, 0x11, 0x67, 0x0a, 0x00, 0x0e, 0x66, 0x05, + 0x00, 0x63, 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x39, 0x46, 0x00, + 0x00, 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0x5f, 0x0b, + 0x00, 0x66, 0x05, 0x00, 0x66, 0x03, 0x00, 0xf2, + 0x0e, 0xc3, 0x07, 0x30, 0x30, 0x63, 0x06, 0x00, + 0x42, 0x6a, 0x00, 0x00, 0x00, 0x97, 0xec, 0x4f, + 0x66, 0x06, 0x00, 0x04, 0x07, 0x01, 0x00, 0x00, + 0xaf, 0xec, 0x1e, 0x63, 0x00, 0x00, 0xb6, 0xa9, + 0xec, 0x17, 0x5f, 0x0b, 0x00, 0x66, 0x05, 0x00, + 0x66, 0x03, 0x00, 0xf2, 0x0e, 0xe0, 0x11, 0x04, + 0x08, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, + 0x63, 0x02, 0x00, 0x63, 0x04, 0x00, 0x1b, 0x11, + 0xb1, 0xed, 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, + 0x06, 0x00, 0x42, 0x41, 0x00, 0x00, 0x00, 0x1b, + 0x72, 0x1b, 0x4a, 0x63, 0x01, 0x00, 0x92, 0x64, + 0x01, 0x00, 0x0e, 0xef, 0xd1, 0x00, 0x66, 0x0a, + 0x00, 0x91, 0x67, 0x0a, 0x00, 0x0e, 0x63, 0x00, + 0x00, 0x92, 0x64, 0x00, 0x00, 0x0e, 0x66, 0x05, + 0x00, 0x63, 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x39, 0x46, 0x00, + 0x00, 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0x66, 0x06, + 0x00, 0x62, 0x08, 0x00, 0x11, 0x04, 0x09, 0x01, + 0x00, 0x00, 0xaf, 0xec, 0x2e, 0x5f, 0x0b, 0x00, + 0x66, 0x05, 0x00, 0x66, 0x03, 0x00, 0xf2, 0xc4, + 0x08, 0x63, 0x08, 0x00, 0xec, 0x05, 0x63, 0x08, + 0x00, 0x30, 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, + 0x0b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, + 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, + 0x00, 0x28, 0x11, 0x04, 0x06, 0x01, 0x00, 0x00, + 0xaf, 0xec, 0x3c, 0x66, 0x0a, 0x00, 0xb7, 0xa7, + 0xec, 0x19, 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, + 0x0b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, + 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, + 0x00, 0x28, 0x63, 0x02, 0x00, 0x63, 0x04, 0x00, + 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, 0x72, 0x1b, + 0x1b, 0x66, 0x07, 0x00, 0x63, 0x03, 0x00, 0x48, + 0x1b, 0x72, 0x1b, 0x4a, 0xee, 0x27, 0x11, 0x04, + 0x07, 0x01, 0x00, 0x00, 0xaf, 0xec, 0x1e, 0x63, + 0x01, 0x00, 0xb6, 0xa9, 0xec, 0x17, 0x5f, 0x0b, + 0x00, 0x66, 0x05, 0x00, 0x66, 0x03, 0x00, 0xf2, + 0x0e, 0xe0, 0x11, 0x04, 0x08, 0x01, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x0e, 0x63, 0x03, 0x00, + 0x92, 0x64, 0x03, 0x00, 0x0e, 0xef, 0x1d, 0xfe, + 0x63, 0x01, 0x00, 0xb6, 0xaf, 0xec, 0x19, 0xb9, + 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, 0x39, 0x46, + 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, 0x00, + 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, 0xb7, + 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, 0x63, 0x02, + 0x00, 0x4d, 0x41, 0x00, 0x00, 0x00, 0x09, 0x4d, + 0x6a, 0x00, 0x00, 0x00, 0x28, 0x0c, 0x42, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x06, + 0x00, 0x88, 0x01, 0x01, 0xe8, 0x03, 0x01, 0x00, + 0x20, 0xfe, 0x03, 0x13, 0x09, 0xa4, 0x03, 0x00, + 0x02, 0xa8, 0x03, 0x01, 0x02, 0xd8, 0x03, 0x03, + 0x00, 0xe4, 0x03, 0x06, 0x09, 0xe6, 0x03, 0x05, + 0x09, 0x62, 0x00, 0x00, 0x66, 0x00, 0x00, 0x11, + 0xb6, 0xaf, 0xec, 0x09, 0xb9, 0x11, 0x67, 0x00, + 0x00, 0x0e, 0xee, 0x4b, 0x11, 0xb7, 0xaf, 0xec, + 0x09, 0xb8, 0x11, 0x67, 0x00, 0x00, 0x0e, 0xee, + 0x3e, 0x11, 0xb8, 0xaf, 0xec, 0x0c, 0xe0, 0x11, + 0x04, 0x04, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, + 0x30, 0x11, 0xb9, 0xaf, 0xec, 0x13, 0x0b, 0x39, + 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, + 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, + 0xe1, 0x11, 0x04, 0x0a, 0x01, 0x00, 0x00, 0x43, + 0x5d, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, + 0x01, 0x00, 0x21, 0x01, 0x00, 0x30, 0x0e, 0xe2, + 0x66, 0x04, 0x00, 0x66, 0x05, 0x00, 0xf2, 0xcb, + 0x63, 0x00, 0x00, 0xec, 0x05, 0x63, 0x00, 0x00, + 0x30, 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, + 0x39, 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, + 0x00, 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, + 0x28, 0x62, 0x01, 0x00, 0x62, 0x00, 0x00, 0xd3, + 0xcb, 0xd4, 0x11, 0xf4, 0xec, 0x08, 0x0e, 0x39, + 0x46, 0x00, 0x00, 0x00, 0xdc, 0xcc, 0x62, 0x14, + 0x00, 0x62, 0x13, 0x00, 0x62, 0x08, 0x00, 0x62, + 0x07, 0x00, 0x62, 0x06, 0x00, 0x62, 0x05, 0x00, + 0x62, 0x04, 0x00, 0x62, 0x03, 0x00, 0x62, 0x02, + 0x00, 0x5f, 0x04, 0x00, 0xd3, 0x04, 0x0b, 0x01, + 0x00, 0x00, 0xf2, 0x0e, 0xd4, 0x39, 0x46, 0x00, + 0x00, 0x00, 0xaf, 0xec, 0x06, 0x0c, 0x07, 0xd8, + 0xee, 0x0c, 0x5f, 0x04, 0x00, 0xd4, 0x04, 0x0c, + 0x01, 0x00, 0x00, 0xf2, 0x0e, 0xd4, 0x42, 0xf8, + 0x00, 0x00, 0x00, 0xcd, 0x63, 0x02, 0x00, 0x39, + 0x46, 0x00, 0x00, 0x00, 0xaf, 0xec, 0x0b, 0x04, + 0x09, 0x01, 0x00, 0x00, 0x11, 0x64, 0x02, 0x00, + 0x0e, 0x63, 0x02, 0x00, 0x04, 0x07, 0x01, 0x00, + 0x00, 0xaf, 0x11, 0xed, 0x18, 0x0e, 0x63, 0x02, + 0x00, 0x04, 0x06, 0x01, 0x00, 0x00, 0xaf, 0x11, + 0xed, 0x0b, 0x0e, 0x63, 0x02, 0x00, 0x04, 0x09, + 0x01, 0x00, 0x00, 0xaf, 0x97, 0xec, 0x0c, 0xdf, + 0x11, 0x04, 0x0d, 0x01, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x30, 0x39, 0x46, 0x00, 0x00, 0x00, 0xce, + 0x63, 0x02, 0x00, 0x04, 0x06, 0x01, 0x00, 0x00, + 0xaf, 0xec, 0x24, 0xd4, 0x42, 0xf9, 0x00, 0x00, + 0x00, 0x11, 0x64, 0x03, 0x00, 0x0e, 0x63, 0x03, + 0x00, 0x39, 0x46, 0x00, 0x00, 0x00, 0xb0, 0xec, + 0x0e, 0x5f, 0x04, 0x00, 0x63, 0x03, 0x00, 0x04, + 0x0e, 0x01, 0x00, 0x00, 0xf2, 0x0e, 0x26, 0x00, + 0x00, 0xc4, 0x04, 0xb6, 0xc4, 0x05, 0x26, 0x00, + 0x00, 0xc4, 0x06, 0x26, 0x00, 0x00, 0xc4, 0x07, + 0x26, 0x00, 0x00, 0xc4, 0x08, 0x62, 0x09, 0x00, + 0x5f, 0x05, 0x00, 0xd3, 0xf1, 0x7f, 0xee, 0x1d, + 0xc4, 0x09, 0x63, 0x04, 0x00, 0x63, 0x05, 0x00, + 0x92, 0x64, 0x05, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x09, 0x00, + 0x1b, 0x72, 0x1b, 0x4a, 0x82, 0x00, 0xec, 0xe1, + 0x0e, 0x85, 0x6d, 0x7d, 0x01, 0x00, 0x00, 0x62, + 0x0a, 0x00, 0xb6, 0xc4, 0x0a, 0x63, 0x0a, 0x00, + 0x63, 0x05, 0x00, 0xa7, 0x6a, 0xf0, 0x00, 0x00, + 0x00, 0x62, 0x0c, 0x00, 0x62, 0x0b, 0x00, 0x0a, + 0xc4, 0x0b, 0x63, 0x04, 0x00, 0x63, 0x0a, 0x00, + 0x48, 0xc4, 0x0c, 0x5f, 0x06, 0x00, 0xd3, 0x63, + 0x0c, 0x00, 0xf2, 0xec, 0x78, 0x62, 0x0d, 0x00, + 0xd3, 0x63, 0x0c, 0x00, 0x48, 0xc4, 0x0d, 0x63, + 0x0d, 0x00, 0x39, 0x46, 0x00, 0x00, 0x00, 0xb0, + 0xec, 0x63, 0x62, 0x0e, 0x00, 0x5f, 0x04, 0x00, + 0x63, 0x0d, 0x00, 0x04, 0x0f, 0x01, 0x00, 0x00, + 0xf2, 0x0e, 0x63, 0x0d, 0x00, 0x5f, 0x07, 0x00, + 0x48, 0xc4, 0x0e, 0x63, 0x0e, 0x00, 0xec, 0x0e, + 0xe1, 0x63, 0x0d, 0x00, 0x63, 0x0e, 0x00, 0xf2, + 0x11, 0x64, 0x0d, 0x00, 0x0e, 0x63, 0x06, 0x00, + 0x63, 0x0a, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, + 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x0d, 0x00, 0x1b, + 0x72, 0x1b, 0x4a, 0x63, 0x07, 0x00, 0x63, 0x0a, + 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, 0x72, + 0x1b, 0x1b, 0x63, 0x0d, 0x00, 0x42, 0x6b, 0x00, + 0x00, 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0x09, 0x11, + 0x64, 0x0b, 0x00, 0x0e, 0x63, 0x0b, 0x00, 0xec, + 0x4a, 0x62, 0x0f, 0x00, 0x63, 0x0a, 0x00, 0xb7, + 0x9e, 0xc4, 0x0f, 0x63, 0x0f, 0x00, 0x63, 0x05, + 0x00, 0xa7, 0xec, 0x27, 0x63, 0x04, 0x00, 0x63, + 0x0f, 0x00, 0xb7, 0x9f, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x04, 0x00, + 0x63, 0x0f, 0x00, 0x48, 0x1b, 0x72, 0x1b, 0x4a, + 0x63, 0x0f, 0x00, 0x92, 0x64, 0x0f, 0x00, 0x0e, + 0xee, 0xd2, 0x63, 0x05, 0x00, 0x91, 0x64, 0x05, + 0x00, 0x0e, 0x63, 0x0a, 0x00, 0x91, 0x64, 0x0a, + 0x00, 0x0e, 0x63, 0x0a, 0x00, 0x92, 0x64, 0x0a, + 0x00, 0x0e, 0xef, 0x0a, 0xff, 0x63, 0x02, 0x00, + 0x04, 0x06, 0x01, 0x00, 0x00, 0xaf, 0xec, 0x6e, + 0x63, 0x03, 0x00, 0xec, 0x38, 0x62, 0x10, 0x00, + 0xb6, 0xc4, 0x10, 0x63, 0x10, 0x00, 0x63, 0x05, + 0x00, 0xa7, 0xec, 0x5a, 0x63, 0x08, 0x00, 0x63, + 0x10, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, + 0x72, 0x1b, 0x1b, 0x63, 0x03, 0x00, 0x63, 0x04, + 0x00, 0x63, 0x10, 0x00, 0x48, 0x48, 0x1b, 0x72, + 0x1b, 0x4a, 0x63, 0x10, 0x00, 0x92, 0x64, 0x10, + 0x00, 0x0e, 0xee, 0xd0, 0x62, 0x11, 0x00, 0xb6, + 0xc4, 0x11, 0x63, 0x11, 0x00, 0x63, 0x05, 0x00, + 0xa7, 0xec, 0x23, 0x63, 0x08, 0x00, 0x63, 0x11, + 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, 0x72, + 0x1b, 0x1b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x1b, + 0x72, 0x1b, 0x4a, 0x63, 0x11, 0x00, 0x92, 0x64, + 0x11, 0x00, 0x0e, 0xee, 0xd6, 0x0e, 0xee, 0x15, + 0xc4, 0x12, 0x6d, 0x10, 0x00, 0x00, 0x00, 0xe2, + 0x63, 0x06, 0x00, 0x63, 0x05, 0x00, 0xf2, 0x0e, + 0xc3, 0x12, 0x30, 0x30, 0xb6, 0xc4, 0x13, 0x63, + 0x05, 0x00, 0xc4, 0x14, 0x0b, 0x5f, 0x08, 0x00, + 0x50, 0xc1, 0x00, 0x55, 0x6b, 0x00, 0x00, 0x00, + 0x04, 0xc1, 0x01, 0x55, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x28, 0xc1, 0x00, 0xcb, 0xc1, 0x01, 0xcc, + 0xc1, 0x02, 0xcd, 0xc1, 0x03, 0x28, 0xc1, 0x00, + 0xcf, 0x28, +}; + diff --git a/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.js b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.js new file mode 100644 index 0000000000..10aedf3731 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip-keyed.js @@ -0,0 +1,194 @@ +;(function(IteratorHelper, InternalError, TypeError, call, + hasOwnEnumProperty, getOwnPropertyKeys, Symbol·iterator) { + function check(v, s) { + if (typeof v === "object" && v !== null) return + throw new TypeError(s) + } + function close(iter) { + try { + if (!iter) return + let method = iter.return + if (method) call(iter, method) + } catch (e) { + return e + } + } + function closeall(iters, count) { + let ex = undefined + for (let i = count; i-- > 0;) { + let iter = iters[i] + iters[i] = undefined + let e = close(iter) + if (!ex) ex = e + } + return ex + } + return function zipKeyed(iterables, options = undefined) { + check(iterables, "bad iterables") + if (options === undefined) options = {__proto__: null} + else check(options, "bad options") + let mode = options.mode + if (mode === undefined) mode = "shortest" + if (!(mode === "strict" || mode === "longest" || mode === "shortest")) + throw new TypeError("bad mode") + let padding = undefined + if (mode === "longest") { + padding = options.padding + if (padding !== undefined) check(padding, "bad padding") + } + let keys = [] + let count = 0 + let iters = [] + let nexts = [] + let pads = [] + for (let key of getOwnPropertyKeys(iterables)) keys[count++] = key + try { + for (let i = 0; i < count; i++) { + let del = true + let key = keys[i] + // test262 goes out of its way to destroy performance here: + // we must only add enumerable properties but because evil + // getters can flip the visibility of subsequent properties, + // we have to first collect *all* properties, enumerable and + // non-enumerable, then check each one when we add it to the + // final list + // TODO(bnoordhuis) optimize by introducing some kind of + // mutation observer; mutation is the uncommon case + if (hasOwnEnumProperty(iterables, key)) { + let iter = iterables[key] + if (iter !== undefined) { + check(iter, "bad iterator") + let method = iter[Symbol·iterator] + if (method) iter = call(iter, method) // iterable -> iterator + iters[i] = iter + nexts[i] = iter.next + del = false + } + } + if (del) { + // splice out property; the assumption here is that the + // vast majority of objects don't have non-enumerable + // properties, or properties whose value is undefined + for (let j = i+1; j < count; j++) keys[j-1] = keys[j] + count-- + i-- + } + } + if (mode === "longest") { + if (padding) { + for (let i = 0; i < count; i++) pads[i] = padding[keys[i]] + } else { + for (let i = 0; i < count; i++) pads[i] = undefined + } + } + } catch (e) { + closeall(iters, count) + throw e + } + // note: uses plain numbers for |state|, using + // constants grows the bytecode by about 200 bytes + let state = 0 // new, suspend, execute, complete + let alive = count + return { + __proto__: IteratorHelper, + // TODO(bnoordhuis) shows up as "at next (:0:1)" in stack + // traces when iterator throws, should be "at next (native)" + next() { + switch (state) { + case 0: // new + case 1: // suspend + state = 2 // execute + break + case 2: // execute + throw new TypeError("running zipper") + case 3: // complete + return {value:undefined, done:true} + default: + throw new InternalError("bug") + } + let dones = 0 + let values = 0 + let results = {__proto__: null} + for (let i = 0; i < count; i++) { + let key = keys[i] + let iter = iters[i] + if (!iter) { + if (mode !== "longest") throw new InternalError("bug") + results[key] = pads[i] + continue + } + let result + try { + result = call(iter, nexts[i]) + } catch (e) { + alive = 0 + iters[i] = undefined + closeall(iters, count) + throw e + } + // order of .done and .value property + // access is observable and matters + if (!result.done) { + if (mode === "strict" && dones > 0) { + closeall(iters, count) + throw new TypeError("mismatched inputs") + } + results[key] = result.value + values++ + continue + } + alive-- + dones++ + iters[i] = undefined + switch (mode) { + case "shortest": + let ex = closeall(iters, count) + if (ex) throw ex + state = 3 // complete + return {value:undefined, done:true} + case "longest": + if (alive < 1) { + state = 3 // complete + return {value:undefined, done:true} + } + results[key] = pads[i] + break + case "strict": + if (values > 0) { + closeall(iters, count) + throw new TypeError("mismatched inputs") + } + break + } + } + if (values === 0) { + state = 3 // complete + return {value:undefined, done:true} + } + state = 1 // suspend + return {value:results, done:false} + }, + return() { + switch (state) { + case 0: // new + state = 3 // complete + break + case 1: // suspend + state = 2 // execute + break + case 2: // execute + throw new TypeError("running zipper") + case 3: // complete + return {value:undefined, done:true} + default: + throw new InternalError(`bug: state=${state}`) + } + // TODO skip when already closed because of earlier exception + let ex = closeall(iters, count) + if (ex) throw ex + state = 3 // complete + return {value:undefined, done:true} + }, + } + } +}) diff --git a/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.h b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.h new file mode 100644 index 0000000000..7e3544ac98 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.h @@ -0,0 +1,337 @@ +/* File generated automatically by the QuickJS-ng compiler. */ + +#include + +const uint32_t qjsc_builtin_iterator_zip_size = 2617; + +const uint8_t qjsc_builtin_iterator_zip[2617] = { + 0x16, 0x2a, 0x01, 0x1c, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x6c, 0x70, + 0x65, 0x72, 0x01, 0x08, 0x63, 0x61, 0x6c, 0x6c, + 0x01, 0x1e, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0xb7, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x01, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x01, 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x01, + 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x61, 0x6c, + 0x6c, 0x01, 0x02, 0x76, 0x01, 0x02, 0x73, 0x01, + 0x08, 0x69, 0x74, 0x65, 0x72, 0x01, 0x0c, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x01, 0x02, 0x65, + 0x01, 0x0a, 0x69, 0x74, 0x65, 0x72, 0x73, 0x01, + 0x0a, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x01, 0x04, + 0x65, 0x78, 0x01, 0x02, 0x69, 0x01, 0x12, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x01, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x01, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x01, + 0x0e, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x01, 0x08, 0x70, 0x61, 0x64, 0x73, 0x01, 0x0a, + 0x6e, 0x65, 0x78, 0x74, 0x73, 0x01, 0x16, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x69, 0x74, + 0x65, 0x72, 0x01, 0x1a, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x69, 0x74, 0x65, + 0x72, 0x01, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x01, + 0x02, 0x74, 0x01, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x01, 0x0a, 0x61, 0x6c, 0x69, 0x76, 0x65, + 0x01, 0x0a, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x01, + 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x01, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x01, 0x1c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x72, + 0x01, 0x06, 0x62, 0x75, 0x67, 0x01, 0x0e, 0x6c, + 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x01, 0x0c, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x01, 0x22, + 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x01, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x65, 0x73, 0x74, 0x01, 0x16, 0x62, 0x75, 0x67, + 0x3a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3d, + 0x01, 0x1a, 0x62, 0x61, 0x64, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x01, + 0x16, 0x62, 0x61, 0x64, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x01, 0x10, 0x62, 0x61, + 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x01, 0x16, + 0x62, 0x61, 0x64, 0x20, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x01, 0x18, 0x62, 0x61, 0x64, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x0c, 0x00, 0x02, 0x00, 0xa2, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, + 0xa4, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x43, 0x02, + 0x00, 0x00, 0x05, 0x03, 0x05, 0x01, 0x08, 0x00, + 0x04, 0x0c, 0x08, 0xca, 0x03, 0x00, 0x01, 0x40, + 0x07, 0xa8, 0x03, 0x00, 0x01, 0x40, 0x03, 0xa4, + 0x03, 0x00, 0x01, 0x40, 0x00, 0xcc, 0x03, 0x00, + 0x01, 0x40, 0x01, 0xce, 0x03, 0x00, 0x01, 0x40, + 0x06, 0xd0, 0x03, 0x00, 0x00, 0x40, 0x05, 0xd2, + 0x03, 0x00, 0x01, 0x40, 0x02, 0xd4, 0x03, 0x00, + 0x02, 0x40, 0x04, 0x0c, 0x43, 0x02, 0x00, 0xd0, + 0x03, 0x02, 0x00, 0x02, 0x03, 0x00, 0x01, 0x00, + 0x17, 0x02, 0xd6, 0x03, 0x00, 0x01, 0x00, 0xd8, + 0x03, 0x00, 0x01, 0x00, 0xa4, 0x03, 0x02, 0x03, + 0xd3, 0x98, 0x04, 0x4a, 0x00, 0x00, 0x00, 0xaf, + 0xec, 0x07, 0xd3, 0x07, 0xb0, 0xec, 0x02, 0x29, + 0xdf, 0x11, 0xd4, 0x21, 0x01, 0x00, 0x30, 0x0c, + 0x43, 0x02, 0x00, 0xd2, 0x03, 0x01, 0x02, 0x01, + 0x04, 0x00, 0x01, 0x00, 0x2e, 0x03, 0xda, 0x03, + 0x00, 0x01, 0x00, 0xdc, 0x03, 0x02, 0x00, 0x20, + 0xde, 0x03, 0x05, 0x00, 0x03, 0xcc, 0x03, 0x03, + 0x03, 0x6d, 0x23, 0x00, 0x00, 0x00, 0x62, 0x00, + 0x00, 0xd3, 0x97, 0xec, 0x04, 0x06, 0x70, 0x28, + 0xd3, 0x42, 0x06, 0x00, 0x00, 0x00, 0xcb, 0x63, + 0x00, 0x00, 0xec, 0x08, 0xdf, 0xd3, 0x63, 0x00, + 0x00, 0xf2, 0x0e, 0x0e, 0x29, 0xcc, 0x6d, 0x07, + 0x00, 0x00, 0x00, 0xc8, 0x70, 0x28, 0x30, 0x0c, + 0x43, 0x02, 0x00, 0xd4, 0x03, 0x02, 0x04, 0x02, + 0x03, 0x00, 0x01, 0x00, 0x55, 0x06, 0xe0, 0x03, + 0x00, 0x01, 0x00, 0xe2, 0x03, 0x00, 0x01, 0x00, + 0xe4, 0x03, 0x01, 0x00, 0x20, 0xe6, 0x03, 0x02, + 0x01, 0x20, 0xda, 0x03, 0x03, 0x02, 0x20, 0xde, + 0x03, 0x03, 0x03, 0x20, 0xd2, 0x03, 0x01, 0x01, + 0x62, 0x00, 0x00, 0x39, 0x46, 0x00, 0x00, 0x00, + 0xcb, 0x62, 0x01, 0x00, 0xd4, 0xcc, 0x63, 0x01, + 0x00, 0x91, 0x64, 0x01, 0x00, 0xb6, 0xa9, 0xec, + 0x39, 0x62, 0x03, 0x00, 0x62, 0x02, 0x00, 0xd3, + 0x63, 0x01, 0x00, 0x48, 0xcd, 0xd3, 0x63, 0x01, + 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, 0x72, + 0x1b, 0x1b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x1b, + 0x72, 0x1b, 0x4a, 0xdf, 0x63, 0x02, 0x00, 0xf1, + 0xce, 0x63, 0x00, 0x00, 0x97, 0xec, 0xc8, 0x63, + 0x03, 0x00, 0x11, 0x64, 0x00, 0x00, 0x0e, 0xee, + 0xbe, 0x63, 0x00, 0x00, 0x28, 0x0c, 0x41, 0x02, + 0x00, 0xa8, 0x02, 0x02, 0x1a, 0x01, 0x05, 0x07, + 0x08, 0x02, 0x8a, 0x06, 0x1c, 0xe8, 0x03, 0x00, + 0x01, 0x00, 0xea, 0x03, 0x00, 0x01, 0x00, 0xe8, + 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x20, + 0xea, 0x03, 0x01, 0x01, 0x20, 0xec, 0x03, 0x02, + 0x00, 0x60, 0x03, 0xee, 0x03, 0x02, 0x03, 0x20, + 0xf0, 0x03, 0x02, 0x04, 0x60, 0x04, 0xe0, 0x03, + 0x02, 0x05, 0x60, 0x02, 0xf2, 0x03, 0x02, 0x06, + 0x60, 0x05, 0xe2, 0x03, 0x02, 0x07, 0x60, 0x01, + 0xf4, 0x03, 0x02, 0x08, 0x20, 0xf6, 0x03, 0x02, + 0x09, 0x20, 0xd6, 0x01, 0x09, 0x1a, 0x20, 0xf8, + 0x03, 0x0b, 0x0b, 0x20, 0xde, 0x03, 0x0d, 0x0f, + 0x03, 0xda, 0x03, 0x0b, 0x0c, 0x20, 0xdc, 0x03, + 0x0b, 0x0e, 0x20, 0xd6, 0x01, 0x13, 0x0b, 0x20, + 0xe6, 0x03, 0x13, 0x10, 0x20, 0xd4, 0x01, 0x13, + 0x11, 0x20, 0x82, 0x01, 0x15, 0x16, 0x20, 0xf8, + 0x03, 0x16, 0x13, 0x20, 0xde, 0x03, 0x17, 0x13, + 0x03, 0xfa, 0x03, 0x13, 0x12, 0x20, 0xe4, 0x03, + 0x1c, 0x16, 0x20, 0xde, 0x03, 0x1f, 0x1a, 0x03, + 0xfc, 0x03, 0x02, 0x0a, 0x60, 0x00, 0xfe, 0x03, + 0x02, 0x19, 0x60, 0x06, 0xa4, 0x03, 0x02, 0x03, + 0xa8, 0x03, 0x01, 0x03, 0xcc, 0x03, 0x03, 0x03, + 0xd4, 0x03, 0x02, 0x01, 0xd0, 0x03, 0x00, 0x01, + 0xce, 0x03, 0x04, 0x03, 0xd2, 0x03, 0x01, 0x01, + 0xca, 0x03, 0x00, 0x03, 0x0c, 0x42, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0b, 0x00, + 0xec, 0x04, 0x08, 0x80, 0x04, 0x01, 0x00, 0x20, + 0xd8, 0x01, 0x01, 0x01, 0x20, 0x82, 0x04, 0x01, + 0x02, 0x20, 0xe6, 0x03, 0x03, 0x03, 0x20, 0xda, + 0x03, 0x04, 0x04, 0x20, 0x84, 0x04, 0x04, 0x05, + 0x20, 0xde, 0x03, 0x09, 0x06, 0x03, 0xe4, 0x03, + 0x10, 0x06, 0x20, 0xfc, 0x03, 0x18, 0x09, 0xa4, + 0x03, 0x00, 0x02, 0xa8, 0x03, 0x01, 0x02, 0xe2, + 0x03, 0x07, 0x09, 0xe0, 0x03, 0x05, 0x09, 0xec, + 0x03, 0x02, 0x09, 0xf0, 0x03, 0x04, 0x09, 0xcc, + 0x03, 0x02, 0x02, 0xf2, 0x03, 0x06, 0x09, 0xfe, + 0x03, 0x19, 0x09, 0xd4, 0x03, 0x03, 0x00, 0x62, + 0x02, 0x00, 0x62, 0x01, 0x00, 0x62, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x11, 0xb6, 0xaf, 0xed, 0x06, + 0x11, 0xb7, 0xaf, 0xec, 0x09, 0xb8, 0x11, 0x67, + 0x00, 0x00, 0x0e, 0xee, 0x33, 0x11, 0xb8, 0xaf, + 0xec, 0x0c, 0xe0, 0x11, 0x04, 0x03, 0x01, 0x00, + 0x00, 0x21, 0x01, 0x00, 0x30, 0x11, 0xb9, 0xaf, + 0xec, 0x13, 0x0b, 0x39, 0x46, 0x00, 0x00, 0x00, + 0x4d, 0x41, 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x6a, + 0x00, 0x00, 0x00, 0x28, 0xe1, 0x11, 0x04, 0x04, + 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x0e, + 0xb6, 0xcb, 0xb6, 0xcc, 0x26, 0x00, 0x00, 0xcd, + 0x62, 0x03, 0x00, 0xb6, 0xce, 0x63, 0x03, 0x00, + 0x66, 0x03, 0x00, 0xa7, 0x6a, 0xd1, 0x01, 0x00, + 0x00, 0x62, 0x05, 0x00, 0x62, 0x04, 0x00, 0x66, + 0x04, 0x00, 0x63, 0x03, 0x00, 0x48, 0xc4, 0x04, + 0x63, 0x04, 0x00, 0x97, 0xec, 0x34, 0x66, 0x05, + 0x00, 0x04, 0x05, 0x01, 0x00, 0x00, 0xb0, 0xec, + 0x0c, 0xe1, 0x11, 0x04, 0x04, 0x01, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x63, 0x02, 0x00, 0x63, + 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, + 0x72, 0x1b, 0x1b, 0x66, 0x06, 0x00, 0x63, 0x03, + 0x00, 0x48, 0x1b, 0x72, 0x1b, 0x4a, 0xef, 0x7c, + 0x01, 0x06, 0xc4, 0x05, 0x6d, 0x1a, 0x00, 0x00, + 0x00, 0x5f, 0x07, 0x00, 0x63, 0x04, 0x00, 0x66, + 0x08, 0x00, 0x63, 0x03, 0x00, 0x48, 0xf2, 0x11, + 0x64, 0x05, 0x00, 0x0e, 0x0e, 0xee, 0x35, 0xc4, + 0x06, 0x6d, 0x30, 0x00, 0x00, 0x00, 0xb6, 0x11, + 0x67, 0x09, 0x00, 0x0e, 0x66, 0x04, 0x00, 0x63, + 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, + 0x72, 0x1b, 0x1b, 0x39, 0x46, 0x00, 0x00, 0x00, + 0x1b, 0x72, 0x1b, 0x4a, 0x5f, 0x0a, 0x00, 0x66, + 0x04, 0x00, 0x66, 0x03, 0x00, 0xf2, 0x0e, 0xc3, + 0x06, 0x30, 0x30, 0x63, 0x05, 0x00, 0x42, 0x6a, + 0x00, 0x00, 0x00, 0x97, 0xec, 0x4f, 0x66, 0x05, + 0x00, 0x04, 0x06, 0x01, 0x00, 0x00, 0xaf, 0xec, + 0x1e, 0x63, 0x00, 0x00, 0xb6, 0xa9, 0xec, 0x17, + 0x5f, 0x0a, 0x00, 0x66, 0x04, 0x00, 0x66, 0x03, + 0x00, 0xf2, 0x0e, 0xe0, 0x11, 0x04, 0x07, 0x01, + 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x63, 0x02, + 0x00, 0x63, 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x05, 0x00, + 0x42, 0x41, 0x00, 0x00, 0x00, 0x1b, 0x72, 0x1b, + 0x4a, 0x63, 0x01, 0x00, 0x92, 0x64, 0x01, 0x00, + 0x0e, 0xef, 0xd1, 0x00, 0x66, 0x09, 0x00, 0x91, + 0x67, 0x09, 0x00, 0x0e, 0x63, 0x00, 0x00, 0x92, + 0x64, 0x00, 0x00, 0x0e, 0x66, 0x04, 0x00, 0x63, + 0x03, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, + 0x72, 0x1b, 0x1b, 0x39, 0x46, 0x00, 0x00, 0x00, + 0x1b, 0x72, 0x1b, 0x4a, 0x66, 0x05, 0x00, 0x62, + 0x07, 0x00, 0x11, 0x04, 0x08, 0x01, 0x00, 0x00, + 0xaf, 0xec, 0x2e, 0x5f, 0x0a, 0x00, 0x66, 0x04, + 0x00, 0x66, 0x03, 0x00, 0xf2, 0xc4, 0x07, 0x63, + 0x07, 0x00, 0xec, 0x05, 0x63, 0x07, 0x00, 0x30, + 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, 0x39, + 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, + 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, + 0x11, 0x04, 0x05, 0x01, 0x00, 0x00, 0xaf, 0xec, + 0x3c, 0x66, 0x09, 0x00, 0xb7, 0xa7, 0xec, 0x19, + 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, 0x39, + 0x46, 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, + 0x00, 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, + 0x63, 0x02, 0x00, 0x63, 0x03, 0x00, 0x1b, 0x11, + 0xb1, 0xed, 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x66, + 0x06, 0x00, 0x63, 0x03, 0x00, 0x48, 0x1b, 0x72, + 0x1b, 0x4a, 0xee, 0x27, 0x11, 0x04, 0x06, 0x01, + 0x00, 0x00, 0xaf, 0xec, 0x1e, 0x63, 0x01, 0x00, + 0xb6, 0xa9, 0xec, 0x17, 0x5f, 0x0a, 0x00, 0x66, + 0x04, 0x00, 0x66, 0x03, 0x00, 0xf2, 0x0e, 0xe0, + 0x11, 0x04, 0x07, 0x01, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x30, 0x0e, 0x63, 0x03, 0x00, 0x92, 0x64, + 0x03, 0x00, 0x0e, 0xef, 0x29, 0xfe, 0x63, 0x01, + 0x00, 0xb6, 0xaf, 0xec, 0x19, 0xb9, 0x11, 0x67, + 0x00, 0x00, 0x0e, 0x0b, 0x39, 0x46, 0x00, 0x00, + 0x00, 0x4d, 0x41, 0x00, 0x00, 0x00, 0x0a, 0x4d, + 0x6a, 0x00, 0x00, 0x00, 0x28, 0xb7, 0x11, 0x67, + 0x00, 0x00, 0x0e, 0x0b, 0x63, 0x02, 0x00, 0x4d, + 0x41, 0x00, 0x00, 0x00, 0x09, 0x4d, 0x6a, 0x00, + 0x00, 0x00, 0x28, 0x0c, 0x42, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x06, 0x00, 0x88, + 0x01, 0x01, 0xe4, 0x03, 0x01, 0x00, 0x20, 0xfc, + 0x03, 0x18, 0x09, 0xa4, 0x03, 0x00, 0x02, 0xa8, + 0x03, 0x01, 0x02, 0xd4, 0x03, 0x03, 0x00, 0xe0, + 0x03, 0x05, 0x09, 0xe2, 0x03, 0x07, 0x09, 0x62, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x11, 0xb6, 0xaf, + 0xec, 0x09, 0xb9, 0x11, 0x67, 0x00, 0x00, 0x0e, + 0xee, 0x4b, 0x11, 0xb7, 0xaf, 0xec, 0x09, 0xb8, + 0x11, 0x67, 0x00, 0x00, 0x0e, 0xee, 0x3e, 0x11, + 0xb8, 0xaf, 0xec, 0x0c, 0xe0, 0x11, 0x04, 0x03, + 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x11, + 0xb9, 0xaf, 0xec, 0x13, 0x0b, 0x39, 0x46, 0x00, + 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, 0x00, 0x0a, + 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, 0xe1, 0x11, + 0x04, 0x09, 0x01, 0x00, 0x00, 0x43, 0x5d, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, 0x01, 0x00, + 0x21, 0x01, 0x00, 0x30, 0x0e, 0xe2, 0x66, 0x04, + 0x00, 0x66, 0x05, 0x00, 0xf2, 0xcb, 0x63, 0x00, + 0x00, 0xec, 0x05, 0x63, 0x00, 0x00, 0x30, 0xb9, + 0x11, 0x67, 0x00, 0x00, 0x0e, 0x0b, 0x39, 0x46, + 0x00, 0x00, 0x00, 0x4d, 0x41, 0x00, 0x00, 0x00, + 0x0a, 0x4d, 0x6a, 0x00, 0x00, 0x00, 0x28, 0x62, + 0x01, 0x00, 0x62, 0x00, 0x00, 0xd3, 0xcb, 0xd4, + 0x11, 0xf4, 0xec, 0x08, 0x0e, 0x39, 0x46, 0x00, + 0x00, 0x00, 0xdc, 0xcc, 0x62, 0x19, 0x00, 0x62, + 0x18, 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, 0x5f, 0x04, 0x00, 0xd3, 0x04, 0x0a, + 0x01, 0x00, 0x00, 0xf2, 0x0e, 0xd4, 0x39, 0x46, + 0x00, 0x00, 0x00, 0xaf, 0xec, 0x06, 0x0c, 0x07, + 0xd8, 0xee, 0x0c, 0x5f, 0x04, 0x00, 0xd4, 0x04, + 0x0b, 0x01, 0x00, 0x00, 0xf2, 0x0e, 0xd4, 0x42, + 0xf6, 0x00, 0x00, 0x00, 0xcd, 0x63, 0x02, 0x00, + 0x39, 0x46, 0x00, 0x00, 0x00, 0xaf, 0xec, 0x0b, + 0x04, 0x08, 0x01, 0x00, 0x00, 0x11, 0x64, 0x02, + 0x00, 0x0e, 0x63, 0x02, 0x00, 0x04, 0x06, 0x01, + 0x00, 0x00, 0xaf, 0x11, 0xed, 0x18, 0x0e, 0x63, + 0x02, 0x00, 0x04, 0x05, 0x01, 0x00, 0x00, 0xaf, + 0x11, 0xed, 0x0b, 0x0e, 0x63, 0x02, 0x00, 0x04, + 0x08, 0x01, 0x00, 0x00, 0xaf, 0x97, 0xec, 0x0c, + 0xdf, 0x11, 0x04, 0x0c, 0x01, 0x00, 0x00, 0x21, + 0x01, 0x00, 0x30, 0x39, 0x46, 0x00, 0x00, 0x00, + 0xce, 0x63, 0x02, 0x00, 0x04, 0x05, 0x01, 0x00, + 0x00, 0xaf, 0xec, 0x24, 0xd4, 0x42, 0xf7, 0x00, + 0x00, 0x00, 0x11, 0x64, 0x03, 0x00, 0x0e, 0x63, + 0x03, 0x00, 0x39, 0x46, 0x00, 0x00, 0x00, 0xb0, + 0xec, 0x0e, 0x5f, 0x04, 0x00, 0x63, 0x03, 0x00, + 0x04, 0x0d, 0x01, 0x00, 0x00, 0xf2, 0x0e, 0x26, + 0x00, 0x00, 0xc4, 0x04, 0x26, 0x00, 0x00, 0xc4, + 0x05, 0x26, 0x00, 0x00, 0xc4, 0x06, 0xb6, 0xc4, + 0x07, 0x39, 0x46, 0x00, 0x00, 0x00, 0xc4, 0x08, + 0xd3, 0x5f, 0x05, 0x00, 0x49, 0x24, 0x00, 0x00, + 0xc4, 0x09, 0x6d, 0xcc, 0x01, 0x00, 0x00, 0x62, + 0x0a, 0x00, 0x63, 0x09, 0x00, 0x42, 0x6b, 0x00, + 0x00, 0x00, 0xc4, 0x0a, 0x62, 0x0e, 0x00, 0x62, + 0x0d, 0x00, 0x62, 0x0b, 0x00, 0x06, 0xc4, 0x0b, + 0x6d, 0x14, 0x00, 0x00, 0x00, 0xe1, 0x63, 0x09, + 0x00, 0x63, 0x0a, 0x00, 0xf2, 0x11, 0x64, 0x0b, + 0x00, 0x0e, 0x0e, 0xee, 0x16, 0xc4, 0x0c, 0x6d, + 0x11, 0x00, 0x00, 0x00, 0x39, 0x46, 0x00, 0x00, + 0x00, 0x11, 0x64, 0x09, 0x00, 0x0e, 0xc3, 0x0c, + 0x30, 0x30, 0x63, 0x0b, 0x00, 0x42, 0x6a, 0x00, + 0x00, 0x00, 0xed, 0x6f, 0x63, 0x0b, 0x00, 0x42, + 0x41, 0x00, 0x00, 0x00, 0xc4, 0x0d, 0x5f, 0x04, + 0x00, 0x63, 0x0d, 0x00, 0x04, 0x0e, 0x01, 0x00, + 0x00, 0xf2, 0x0e, 0x63, 0x0d, 0x00, 0x5f, 0x05, + 0x00, 0x48, 0xc4, 0x0e, 0x63, 0x0e, 0x00, 0xec, + 0x0e, 0xe1, 0x63, 0x0d, 0x00, 0x63, 0x0e, 0x00, + 0xf2, 0x11, 0x64, 0x0d, 0x00, 0x0e, 0x63, 0x05, + 0x00, 0x63, 0x07, 0x00, 0x1b, 0x11, 0xb1, 0xed, + 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x0d, 0x00, + 0x1b, 0x72, 0x1b, 0x4a, 0x63, 0x06, 0x00, 0x63, + 0x07, 0x00, 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, + 0x72, 0x1b, 0x1b, 0x63, 0x0d, 0x00, 0x42, 0x6b, + 0x00, 0x00, 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0x63, + 0x07, 0x00, 0x92, 0x64, 0x07, 0x00, 0x0e, 0xef, + 0x54, 0xff, 0x39, 0x46, 0x00, 0x00, 0x00, 0x11, + 0x64, 0x09, 0x00, 0x0e, 0x63, 0x03, 0x00, 0x6a, + 0xfc, 0x00, 0x00, 0x00, 0x62, 0x15, 0x00, 0x62, + 0x11, 0x00, 0x62, 0x10, 0x00, 0x62, 0x0f, 0x00, + 0x63, 0x03, 0x00, 0x5f, 0x05, 0x00, 0x49, 0x24, + 0x00, 0x00, 0x11, 0x64, 0x08, 0x00, 0x0e, 0x63, + 0x08, 0x00, 0x42, 0x6b, 0x00, 0x00, 0x00, 0xc4, + 0x0f, 0xb6, 0xc4, 0x10, 0x09, 0xc4, 0x11, 0x63, + 0x10, 0x00, 0x63, 0x07, 0x00, 0xa7, 0xec, 0x70, + 0x62, 0x12, 0x00, 0x06, 0xc4, 0x12, 0x6d, 0x2e, + 0x00, 0x00, 0x00, 0x62, 0x13, 0x00, 0xe1, 0x63, + 0x08, 0x00, 0x63, 0x0f, 0x00, 0xf2, 0xc4, 0x13, + 0x63, 0x13, 0x00, 0x42, 0x6a, 0x00, 0x00, 0x00, + 0x11, 0x64, 0x11, 0x00, 0x0e, 0x63, 0x13, 0x00, + 0x42, 0x41, 0x00, 0x00, 0x00, 0x11, 0x64, 0x12, + 0x00, 0x0e, 0x0e, 0xee, 0x16, 0xc4, 0x14, 0x6d, + 0x11, 0x00, 0x00, 0x00, 0x39, 0x46, 0x00, 0x00, + 0x00, 0x11, 0x64, 0x08, 0x00, 0x0e, 0xc3, 0x14, + 0x30, 0x30, 0x63, 0x11, 0x00, 0xed, 0x21, 0x63, + 0x04, 0x00, 0x63, 0x10, 0x00, 0x1b, 0x11, 0xb1, + 0xed, 0x04, 0x1b, 0x72, 0x1b, 0x1b, 0x63, 0x12, + 0x00, 0x1b, 0x72, 0x1b, 0x4a, 0x63, 0x10, 0x00, + 0x92, 0x64, 0x10, 0x00, 0x0e, 0xee, 0x89, 0x63, + 0x08, 0x00, 0xc4, 0x15, 0x39, 0x46, 0x00, 0x00, + 0x00, 0x11, 0x64, 0x08, 0x00, 0x0e, 0x63, 0x11, + 0x00, 0x97, 0xec, 0x16, 0x62, 0x16, 0x00, 0x5f, + 0x06, 0x00, 0x63, 0x15, 0x00, 0xf1, 0xc4, 0x16, + 0x63, 0x16, 0x00, 0xec, 0x05, 0x63, 0x16, 0x00, + 0x30, 0x63, 0x10, 0x00, 0x63, 0x07, 0x00, 0xa7, + 0xec, 0x23, 0x63, 0x04, 0x00, 0x63, 0x10, 0x00, + 0x1b, 0x11, 0xb1, 0xed, 0x04, 0x1b, 0x72, 0x1b, + 0x1b, 0x39, 0x46, 0x00, 0x00, 0x00, 0x1b, 0x72, + 0x1b, 0x4a, 0x63, 0x10, 0x00, 0x92, 0x64, 0x10, + 0x00, 0x0e, 0xee, 0xd6, 0x0e, 0xee, 0x25, 0xc4, + 0x17, 0x6d, 0x20, 0x00, 0x00, 0x00, 0xe2, 0x63, + 0x05, 0x00, 0x63, 0x07, 0x00, 0xf2, 0x0e, 0x5f, + 0x06, 0x00, 0x63, 0x09, 0x00, 0xf1, 0x0e, 0x5f, + 0x06, 0x00, 0x63, 0x08, 0x00, 0xf1, 0x0e, 0xc3, + 0x17, 0x30, 0x30, 0xb6, 0xc4, 0x18, 0x63, 0x07, + 0x00, 0xc4, 0x19, 0x0b, 0x5f, 0x07, 0x00, 0x50, + 0xc1, 0x00, 0x55, 0x6b, 0x00, 0x00, 0x00, 0x04, + 0xc1, 0x01, 0x55, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x28, 0xc1, 0x00, 0xcb, 0xc1, 0x01, 0xcc, 0xc1, + 0x02, 0xcd, 0xc1, 0x03, 0x28, 0xc1, 0x00, 0xcf, + 0x28, +}; + diff --git a/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.js b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.js new file mode 100644 index 0000000000..8d2707e769 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/builtin-iterator-zip.js @@ -0,0 +1,210 @@ +;(function(IteratorHelper, InternalError, TypeError, call, Symbol·iterator) { + function check(v, s) { + if (typeof v === "object" && v !== null) return + throw new TypeError(s) + } + function close(iter) { + try { + if (!iter) return + let method = iter.return + if (method) call(iter, method) + } catch (e) { + return e + } + } + function closeall(iters, count) { + let ex = undefined + for (let i = count; i-- > 0;) { + let iter = iters[i] + iters[i] = undefined + let e = close(iter) + if (!ex) ex = e + } + return ex + } + return function zip(iterables, options = undefined) { + check(iterables, "bad iterables") + if (options === undefined) options = {__proto__: null} + else check(options, "bad options") + let mode = options.mode + if (mode === undefined) mode = "shortest" + if (!(mode === "strict" || mode === "longest" || mode === "shortest")) + throw new TypeError("bad mode") + let padding = undefined + if (mode === "longest") { + padding = options.padding + if (padding !== undefined) check(padding, "bad padding") + } + let pads = [] + let iters = [] + let nexts = [] + let count = 0 + let paddingiter = undefined + let iterablesiter = iterables[Symbol·iterator]() + try { + let next = iterablesiter.next + for (;;) { + let item + try { + item = call(iterablesiter, next) + } catch (e) { + // *don't* close |iterablesiter| when .next() throws + iterablesiter = undefined + throw e + } + // order of .done and .value property + // access is observable and matters + if (item.done) break + let iter = item.value + check(iter, "bad iterator") + let method = iter[Symbol·iterator] + if (method) iter = call(iter, method) // iterable -> iterator + iters[count] = iter + nexts[count] = iter.next + count++ + } + iterablesiter = undefined + if (padding) { + paddingiter = padding[Symbol·iterator]() + let next = paddingiter.next + let i = 0 + let done = false + for (; i < count; i++) { + let value + try { + let item = call(paddingiter, next) + // order of .done and .value property + // access is observable and matters + done = item.done + value = item.value + } catch (e) { + // *don't* close |paddingiter| when .next() + // or .done or .value property access throws + paddingiter = undefined + throw e + } + if (done) break + pads[i] = value + } + // have to be careful to not double-close on exception + // exceptions from .return() should still bubble up though + let t = paddingiter + paddingiter = undefined + if (!done) { + let ex = close(t) + if (ex) throw ex + } + for (; i < count; i++) pads[i] = undefined + } + } catch (e) { + closeall(iters, count) + close(iterablesiter) + close(paddingiter) + throw e + } + // note: uses plain numbers for |state|, using + // constants grows the bytecode by about 200 bytes + let state = 0 // new, suspend, execute, complete + let alive = count + return { + __proto__: IteratorHelper, + // TODO(bnoordhuis) shows up as "at next (:0:1)" in stack + // traces when iterator throws, should be "at next (native)" + next() { + switch (state) { + case 0: // new + case 1: // suspend + state = 2 // execute + break + case 2: // execute + throw new TypeError("running zipper") + case 3: // complete + return {value:undefined, done:true} + default: + throw new InternalError("bug") + } + let dones = 0 + let values = 0 + let results = [] + for (let i = 0; i < count; i++) { + let iter = iters[i] + if (!iter) { + if (mode !== "longest") throw new InternalError("bug") + results[i] = pads[i] + continue + } + let result + try { + result = call(iter, nexts[i]) + } catch (e) { + alive = 0 + iters[i] = undefined + closeall(iters, count) + throw e + } + // order of .done and .value property + // access is observable and matters + if (!result.done) { + if (mode === "strict" && dones > 0) { + closeall(iters, count) + throw new TypeError("mismatched inputs") + } + results[i] = result.value + values++ + continue + } + alive-- + dones++ + iters[i] = undefined + switch (mode) { + case "shortest": + let ex = closeall(iters, count) + if (ex) throw ex + state = 3 // complete + return {value:undefined, done:true} + case "longest": + if (alive < 1) { + state = 3 // complete + return {value:undefined, done:true} + } + results[i] = pads[i] + break + case "strict": + if (values > 0) { + closeall(iters, count) + throw new TypeError("mismatched inputs") + } + break + } + } + if (values === 0) { + state = 3 // complete + return {value:undefined, done:true} + } + state = 1 // suspend + return {value:results, done:false} + }, + return() { + switch (state) { + case 0: // new + state = 3 // complete + break + case 1: // suspend + state = 2 // execute + break + case 2: // execute + throw new TypeError("running zipper") + case 3: // complete + return {value:undefined, done:true} + default: + throw new InternalError(`bug: state=${state}`) + } + // TODO skip when already closed because of earlier exception + let ex = closeall(iters, count) + if (ex) throw ex + state = 3 // complete + return {value:undefined, done:true} + }, + } + } +}) diff --git a/Plugins/Schema/external/quickjs/src/ctest.c b/Plugins/Schema/external/quickjs/src/ctest.c new file mode 100644 index 0000000000..eeb03e8699 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/ctest.c @@ -0,0 +1,17 @@ +// note: file is not actually compiled, only checked for C syntax errors +#include "quickjs.h" + +int main(void) +{ + JSRuntime *rt = JS_NewRuntime(); + JSContext *ctx = JS_NewContext(rt); + JS_FreeValue(ctx, JS_NAN); + JS_FreeValue(ctx, JS_UNDEFINED); + JS_FreeValue(ctx, JS_NewFloat64(ctx, 42)); + // not a legal way of using JS_MKPTR but this is here + // to have the compiler syntax-check its definition + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_UNINITIALIZED, 0)); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + return 0; +} diff --git a/Plugins/Schema/external/quickjs/src/cutils.c b/Plugins/Schema/external/quickjs/src/cutils.c new file mode 100644 index 0000000000..487fb2b09d --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/cutils.c @@ -0,0 +1,1349 @@ +/* + * C utilities + * + * Copyright (c) 2017 Fabrice Bellard + * Copyright (c) 2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#if !defined(_MSC_VER) +#include +#endif +#if defined(_WIN32) +#include +#include // _beginthread +#endif +#if defined(__APPLE__) +#include +#endif + +#include "cutils.h" + +#undef NANOSEC +#define NANOSEC ((uint64_t) 1e9) + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif + +void js__pstrcpy(char *buf, int buf_size, const char *str) +{ + int c; + char *q = buf; + + if (buf_size <= 0) + return; + + for(;;) { + c = *str++; + if (c == 0 || q >= buf + buf_size - 1) + break; + *q++ = c; + } + *q = '\0'; +} + +/* strcat and truncate. */ +char *js__pstrcat(char *buf, int buf_size, const char *s) +{ + int len; + len = strlen(buf); + if (len < buf_size) + js__pstrcpy(buf + len, buf_size - len, s); + return buf; +} + +int js__strstart(const char *str, const char *val, const char **ptr) +{ + const char *p, *q; + p = str; + q = val; + while (*q != '\0') { + if (*p != *q) + return 0; + p++; + q++; + } + if (ptr) + *ptr = p; + return 1; +} + +int js__has_suffix(const char *str, const char *suffix) +{ + size_t len = strlen(str); + size_t slen = strlen(suffix); + return (len >= slen && !memcmp(str + len - slen, suffix, slen)); +} + +/* Dynamic buffer package */ + +static void *dbuf_default_realloc(void *opaque, void *ptr, size_t size) +{ + if (unlikely(size == 0)) { + free(ptr); + return NULL; + } + return realloc(ptr, size); +} + +void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func) +{ + memset(s, 0, sizeof(*s)); + if (!realloc_func) + realloc_func = dbuf_default_realloc; + s->opaque = opaque; + s->realloc_func = realloc_func; +} + +void dbuf_init(DynBuf *s) +{ + dbuf_init2(s, NULL, NULL); +} + +/* return < 0 if error */ +int dbuf_realloc(DynBuf *s, size_t new_size) +{ + size_t size; + uint8_t *new_buf; + if (new_size > s->allocated_size) { + if (s->error) + return -1; + size = s->allocated_size * 3 / 2; + if (size > new_size) + new_size = size; + new_buf = s->realloc_func(s->opaque, s->buf, new_size); + if (!new_buf) { + s->error = true; + return -1; + } + s->buf = new_buf; + s->allocated_size = new_size; + } + return 0; +} + +int dbuf_write(DynBuf *s, size_t offset, const void *data, size_t len) +{ + size_t end; + end = offset + len; + if (dbuf_realloc(s, end)) + return -1; + memcpy(s->buf + offset, data, len); + if (end > s->size) + s->size = end; + return 0; +} + +int dbuf_put(DynBuf *s, const void *data, size_t len) +{ + if (unlikely((s->size + len) > s->allocated_size)) { + if (dbuf_realloc(s, s->size + len)) + return -1; + } + if (len > 0) { + memcpy(s->buf + s->size, data, len); + s->size += len; + } + return 0; +} + +int dbuf_put_self(DynBuf *s, size_t offset, size_t len) +{ + if (unlikely((s->size + len) > s->allocated_size)) { + if (dbuf_realloc(s, s->size + len)) + return -1; + } + memcpy(s->buf + s->size, s->buf + offset, len); + s->size += len; + return 0; +} + +int dbuf_putc(DynBuf *s, uint8_t c) +{ + return dbuf_put(s, &c, 1); +} + +int dbuf_putstr(DynBuf *s, const char *str) +{ + return dbuf_put(s, (const uint8_t *)str, strlen(str)); +} + +int JS_PRINTF_FORMAT_ATTR(2, 3) dbuf_printf(DynBuf *s, JS_PRINTF_FORMAT const char *fmt, ...) +{ + va_list ap; + char buf[128]; + int len; + + va_start(ap, fmt); + len = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (len < (int)sizeof(buf)) { + /* fast case */ + return dbuf_put(s, (uint8_t *)buf, len); + } else { + if (dbuf_realloc(s, s->size + len + 1)) + return -1; + va_start(ap, fmt); + vsnprintf((char *)(s->buf + s->size), s->allocated_size - s->size, + fmt, ap); + va_end(ap); + s->size += len; + } + return 0; +} + +void dbuf_free(DynBuf *s) +{ + /* we test s->buf as a fail safe to avoid crashing if dbuf_free() + is called twice */ + if (s->buf) { + s->realloc_func(s->opaque, s->buf, 0); + } + memset(s, 0, sizeof(*s)); +} + +/*--- UTF-8 utility functions --*/ + +/* Note: only encode valid codepoints (0x0000..0x10FFFF). + At most UTF8_CHAR_LEN_MAX bytes are output. */ + +/* Compute the number of bytes of the UTF-8 encoding for a codepoint + `c` is a code-point. + Returns the number of bytes. If a codepoint is beyond 0x10FFFF the + return value is 3 as the codepoint would be encoded as 0xFFFD. + */ +size_t utf8_encode_len(uint32_t c) +{ + if (c < 0x80) + return 1; + if (c < 0x800) + return 2; + if (c < 0x10000) + return 3; + if (c < 0x110000) + return 4; + return 3; +} + +/* Encode a codepoint in UTF-8 + `buf` points to an array of at least `UTF8_CHAR_LEN_MAX` bytes + `c` is a code-point. + Returns the number of bytes. If a codepoint is beyond 0x10FFFF the + return value is 3 and the codepoint is encoded as 0xFFFD. + No null byte is stored after the encoded bytes. + Return value is in range 1..4 + */ +size_t utf8_encode(uint8_t buf[minimum_length(UTF8_CHAR_LEN_MAX)], uint32_t c) +{ + if (c < 0x80) { + buf[0] = c; + return 1; + } + if (c < 0x800) { + buf[0] = (c >> 6) | 0xC0; + buf[1] = (c & 0x3F) | 0x80; + return 2; + } + if (c < 0x10000) { + buf[0] = (c >> 12) | 0xE0; + buf[1] = ((c >> 6) & 0x3F) | 0x80; + buf[2] = (c & 0x3F) | 0x80; + return 3; + } + if (c < 0x110000) { + buf[0] = (c >> 18) | 0xF0; + buf[1] = ((c >> 12) & 0x3F) | 0x80; + buf[2] = ((c >> 6) & 0x3F) | 0x80; + buf[3] = (c & 0x3F) | 0x80; + return 4; + } + buf[0] = (0xFFFD >> 12) | 0xE0; + buf[1] = ((0xFFFD >> 6) & 0x3F) | 0x80; + buf[2] = (0xFFFD & 0x3F) | 0x80; + return 3; +} + +/* Decode a single code point from a UTF-8 encoded array of bytes + `p` is a valid pointer to an array of bytes + `pp` is a valid pointer to a `const uint8_t *` to store a pointer + to the byte following the current sequence. + Return the code point at `p`, in the range `0..0x10FFFF` + Return 0xFFFD on error. Only a single byte is consumed in this case + The maximum length for a UTF-8 byte sequence is 4 bytes. + This implements the algorithm specified in whatwg.org, except it accepts + UTF-8 encoded surrogates as JavaScript allows them in strings. + The source string is assumed to have at least UTF8_CHAR_LEN_MAX bytes + or be null terminated. + If `p[0]` is '\0', the return value is `0` and the byte is consumed. + cf: https://encoding.spec.whatwg.org/#utf-8-encoder + */ +uint32_t utf8_decode(const uint8_t *p, const uint8_t **pp) +{ + uint32_t c; + uint8_t lower, upper; + + c = *p++; + if (c < 0x80) { + *pp = p; + return c; + } + switch(c) { + case 0xC2: case 0xC3: + case 0xC4: case 0xC5: case 0xC6: case 0xC7: + case 0xC8: case 0xC9: case 0xCA: case 0xCB: + case 0xCC: case 0xCD: case 0xCE: case 0xCF: + case 0xD0: case 0xD1: case 0xD2: case 0xD3: + case 0xD4: case 0xD5: case 0xD6: case 0xD7: + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + if (*p >= 0x80 && *p <= 0xBF) { + *pp = p + 1; + return ((c - 0xC0) << 6) + (*p - 0x80); + } + // otherwise encoding error + break; + case 0xE0: + lower = 0xA0; /* reject invalid encoding */ + goto need2; + case 0xE1: case 0xE2: case 0xE3: + case 0xE4: case 0xE5: case 0xE6: case 0xE7: + case 0xE8: case 0xE9: case 0xEA: case 0xEB: + case 0xEC: case 0xED: case 0xEE: case 0xEF: + lower = 0x80; + need2: + if (*p >= lower && *p <= 0xBF && p[1] >= 0x80 && p[1] <= 0xBF) { + *pp = p + 2; + return ((c - 0xE0) << 12) + ((*p - 0x80) << 6) + (p[1] - 0x80); + } + // otherwise encoding error + break; + case 0xF0: + lower = 0x90; /* reject invalid encoding */ + upper = 0xBF; + goto need3; + case 0xF4: + lower = 0x80; + upper = 0x8F; /* reject values above 0x10FFFF */ + goto need3; + case 0xF1: case 0xF2: case 0xF3: + lower = 0x80; + upper = 0xBF; + need3: + if (*p >= lower && *p <= upper && p[1] >= 0x80 && p[1] <= 0xBF + && p[2] >= 0x80 && p[2] <= 0xBF) { + *pp = p + 3; + return ((c - 0xF0) << 18) + ((*p - 0x80) << 12) + + ((p[1] - 0x80) << 6) + (p[2] - 0x80); + } + // otherwise encoding error + break; + default: + // invalid lead byte + break; + } + *pp = p; + return 0xFFFD; +} + +uint32_t utf8_decode_len(const uint8_t *p, size_t max_len, const uint8_t **pp) { + switch (max_len) { + case 0: + *pp = p; + return 0xFFFD; + case 1: + if (*p < 0x80) + goto good; + break; + case 2: + if (*p < 0xE0) + goto good; + break; + case 3: + if (*p < 0xF0) + goto good; + break; + default: + good: + return utf8_decode(p, pp); + } + *pp = p + 1; + return 0xFFFD; +} + +/* Scan a UTF-8 encoded buffer for content type + `buf` is a valid pointer to a UTF-8 encoded string + `len` is the number of bytes to scan + `plen` points to a `size_t` variable to receive the number of units + Return value is a mask of bits. + - `UTF8_PLAIN_ASCII`: return value for 7-bit ASCII plain text + - `UTF8_NON_ASCII`: bit for non ASCII code points (8-bit or more) + - `UTF8_HAS_16BIT`: bit for 16-bit code points + - `UTF8_HAS_NON_BMP1`: bit for non-BMP1 code points, needs UTF-16 surrogate pairs + - `UTF8_HAS_ERRORS`: bit for encoding errors + */ +int utf8_scan(const char *buf, size_t buf_len, size_t *plen) +{ + const uint8_t *p, *p_end, *p_next; + size_t i, len; + int kind; + uint8_t cbits; + + kind = UTF8_PLAIN_ASCII; + cbits = 0; + len = buf_len; + // TODO: handle more than 1 byte at a time + for (i = 0; i < buf_len; i++) + cbits |= buf[i]; + if (cbits >= 0x80) { + p = (const uint8_t *)buf; + p_end = p + buf_len; + kind = UTF8_NON_ASCII; + len = 0; + while (p < p_end) { + len++; + if (*p++ >= 0x80) { + /* parse UTF-8 sequence, check for encoding error */ + uint32_t c = utf8_decode_len(p - 1, p_end - (p - 1), &p_next); + if (p_next == p) + kind |= UTF8_HAS_ERRORS; + p = p_next; + if (c > 0xFF) { + kind |= UTF8_HAS_16BIT; + if (c > 0xFFFF) { + len++; + kind |= UTF8_HAS_NON_BMP1; + } + } + } + } + } + *plen = len; + return kind; +} + +/* Decode a string encoded in UTF-8 into an array of bytes + `src` points to the source string. It is assumed to be correctly encoded + and only contains code points below 0x800 + `src_len` is the length of the source string + `dest` points to the destination array, it can be null if `dest_len` is `0` + `dest_len` is the length of the destination array. A null + terminator is stored at the end of the array unless `dest_len` is `0`. + */ +size_t utf8_decode_buf8(uint8_t *dest, size_t dest_len, const char *src, size_t src_len) +{ + const uint8_t *p, *p_end; + size_t i; + + p = (const uint8_t *)src; + p_end = p + src_len; + for (i = 0; p < p_end; i++) { + uint32_t c = *p++; + if (c >= 0xC0) + c = (c << 6) + *p++ - ((0xC0 << 6) + 0x80); + if (i < dest_len) + dest[i] = c; + } + if (i < dest_len) + dest[i] = '\0'; + else if (dest_len > 0) + dest[dest_len - 1] = '\0'; + return i; +} + +/* Decode a string encoded in UTF-8 into an array of 16-bit words + `src` points to the source string. It is assumed to be correctly encoded. + `src_len` is the length of the source string + `dest` points to the destination array, it can be null if `dest_len` is `0` + `dest_len` is the length of the destination array. No null terminator is + stored at the end of the array. + */ +size_t utf8_decode_buf16(uint16_t *dest, size_t dest_len, const char *src, size_t src_len) +{ + const uint8_t *p, *p_end; + size_t i; + + p = (const uint8_t *)src; + p_end = p + src_len; + for (i = 0; p < p_end; i++) { + uint32_t c = *p++; + if (c >= 0x80) { + /* parse utf-8 sequence */ + c = utf8_decode_len(p - 1, p_end - (p - 1), &p); + /* encoding errors are converted as 0xFFFD and use a single byte */ + if (c > 0xFFFF) { + if (i < dest_len) + dest[i] = get_hi_surrogate(c); + i++; + c = get_lo_surrogate(c); + } + } + if (i < dest_len) + dest[i] = c; + } + return i; +} + +/* Encode a buffer of 8-bit bytes as a UTF-8 encoded string + `src` points to the source buffer. + `src_len` is the length of the source buffer + `dest` points to the destination array, it can be null if `dest_len` is `0` + `dest_len` is the length in bytes of the destination array. A null + terminator is stored at the end of the array unless `dest_len` is `0`. + */ +size_t utf8_encode_buf8(char *dest, size_t dest_len, const uint8_t *src, size_t src_len) +{ + size_t i, j; + uint32_t c; + + for (i = j = 0; i < src_len; i++) { + c = src[i]; + if (c < 0x80) { + if (j + 1 >= dest_len) + goto overflow; + dest[j++] = c; + } else { + if (j + 2 >= dest_len) + goto overflow; + dest[j++] = (c >> 6) | 0xC0; + dest[j++] = (c & 0x3F) | 0x80; + } + } + if (j < dest_len) + dest[j] = '\0'; + return j; + +overflow: + if (j < dest_len) + dest[j] = '\0'; + while (i < src_len) + j += 1 + (src[i++] >= 0x80); + return j; +} + +/* Encode a buffer of 16-bit code points as a UTF-8 encoded string + `src` points to the source buffer. + `src_len` is the length of the source buffer + `dest` points to the destination array, it can be null if `dest_len` is `0` + `dest_len` is the length in bytes of the destination array. A null + terminator is stored at the end of the array unless `dest_len` is `0`. + */ +size_t utf8_encode_buf16(char *dest, size_t dest_len, const uint16_t *src, size_t src_len) +{ + size_t i, j; + uint32_t c; + + for (i = j = 0; i < src_len;) { + c = src[i++]; + if (c < 0x80) { + if (j + 1 >= dest_len) + goto overflow; + dest[j++] = c; + } else { + if (is_hi_surrogate(c) && i < src_len && is_lo_surrogate(src[i])) + c = from_surrogate(c, src[i++]); + if (j + utf8_encode_len(c) >= dest_len) + goto overflow; + j += utf8_encode((uint8_t *)dest + j, c); + } + } + if (j < dest_len) + dest[j] = '\0'; + return j; + +overflow: + i -= 1 + (c > 0xFFFF); + if (j < dest_len) + dest[j] = '\0'; + while (i < src_len) { + c = src[i++]; + if (c < 0x80) { + j++; + } else { + if (is_hi_surrogate(c) && i < src_len && is_lo_surrogate(src[i])) + c = from_surrogate(c, src[i++]); + j += utf8_encode_len(c); + } + } + return j; +} + +/*---- sorting with opaque argument ----*/ + +typedef void (*exchange_f)(void *a, void *b, size_t size); +typedef int (*cmp_f)(const void *, const void *, void *opaque); + +static void exchange_bytes(void *a, void *b, size_t size) { + uint8_t *ap = (uint8_t *)a; + uint8_t *bp = (uint8_t *)b; + + while (size-- != 0) { + uint8_t t = *ap; + *ap++ = *bp; + *bp++ = t; + } +} + +static void exchange_one_byte(void *a, void *b, size_t size) { + uint8_t *ap = (uint8_t *)a; + uint8_t *bp = (uint8_t *)b; + uint8_t t = *ap; + *ap = *bp; + *bp = t; +} + +static void exchange_int16s(void *a, void *b, size_t size) { + uint16_t *ap = (uint16_t *)a; + uint16_t *bp = (uint16_t *)b; + + for (size /= sizeof(uint16_t); size-- != 0;) { + uint16_t t = *ap; + *ap++ = *bp; + *bp++ = t; + } +} + +static void exchange_one_int16(void *a, void *b, size_t size) { + uint16_t *ap = (uint16_t *)a; + uint16_t *bp = (uint16_t *)b; + uint16_t t = *ap; + *ap = *bp; + *bp = t; +} + +static void exchange_int32s(void *a, void *b, size_t size) { + uint32_t *ap = (uint32_t *)a; + uint32_t *bp = (uint32_t *)b; + + for (size /= sizeof(uint32_t); size-- != 0;) { + uint32_t t = *ap; + *ap++ = *bp; + *bp++ = t; + } +} + +static void exchange_one_int32(void *a, void *b, size_t size) { + uint32_t *ap = (uint32_t *)a; + uint32_t *bp = (uint32_t *)b; + uint32_t t = *ap; + *ap = *bp; + *bp = t; +} + +static void exchange_int64s(void *a, void *b, size_t size) { + uint64_t *ap = (uint64_t *)a; + uint64_t *bp = (uint64_t *)b; + + for (size /= sizeof(uint64_t); size-- != 0;) { + uint64_t t = *ap; + *ap++ = *bp; + *bp++ = t; + } +} + +static void exchange_one_int64(void *a, void *b, size_t size) { + uint64_t *ap = (uint64_t *)a; + uint64_t *bp = (uint64_t *)b; + uint64_t t = *ap; + *ap = *bp; + *bp = t; +} + +static void exchange_int128s(void *a, void *b, size_t size) { + uint64_t *ap = (uint64_t *)a; + uint64_t *bp = (uint64_t *)b; + + for (size /= sizeof(uint64_t) * 2; size-- != 0; ap += 2, bp += 2) { + uint64_t t = ap[0]; + uint64_t u = ap[1]; + ap[0] = bp[0]; + ap[1] = bp[1]; + bp[0] = t; + bp[1] = u; + } +} + +static void exchange_one_int128(void *a, void *b, size_t size) { + uint64_t *ap = (uint64_t *)a; + uint64_t *bp = (uint64_t *)b; + uint64_t t = ap[0]; + uint64_t u = ap[1]; + ap[0] = bp[0]; + ap[1] = bp[1]; + bp[0] = t; + bp[1] = u; +} + +static inline exchange_f exchange_func(const void *base, size_t size) { + switch (((uintptr_t)base | (uintptr_t)size) & 15) { + case 0: + if (size == sizeof(uint64_t) * 2) + return exchange_one_int128; + else + return exchange_int128s; + case 8: + if (size == sizeof(uint64_t)) + return exchange_one_int64; + else + return exchange_int64s; + case 4: + case 12: + if (size == sizeof(uint32_t)) + return exchange_one_int32; + else + return exchange_int32s; + case 2: + case 6: + case 10: + case 14: + if (size == sizeof(uint16_t)) + return exchange_one_int16; + else + return exchange_int16s; + default: + if (size == 1) + return exchange_one_byte; + else + return exchange_bytes; + } +} + +static void heapsortx(void *base, size_t nmemb, size_t size, cmp_f cmp, void *opaque) +{ + uint8_t *basep = (uint8_t *)base; + size_t i, n, c, r; + exchange_f swap = exchange_func(base, size); + + if (nmemb > 1) { + i = (nmemb / 2) * size; + n = nmemb * size; + + while (i > 0) { + i -= size; + for (r = i; (c = r * 2 + size) < n; r = c) { + if (c < n - size && cmp(basep + c, basep + c + size, opaque) <= 0) + c += size; + if (cmp(basep + r, basep + c, opaque) > 0) + break; + swap(basep + r, basep + c, size); + } + } + for (i = n - size; i > 0; i -= size) { + swap(basep, basep + i, size); + + for (r = 0; (c = r * 2 + size) < i; r = c) { + if (c < i - size && cmp(basep + c, basep + c + size, opaque) <= 0) + c += size; + if (cmp(basep + r, basep + c, opaque) > 0) + break; + swap(basep + r, basep + c, size); + } + } + } +} + +static inline void *med3(void *a, void *b, void *c, cmp_f cmp, void *opaque) +{ + return cmp(a, b, opaque) < 0 ? + (cmp(b, c, opaque) < 0 ? b : (cmp(a, c, opaque) < 0 ? c : a )) : + (cmp(b, c, opaque) > 0 ? b : (cmp(a, c, opaque) < 0 ? a : c )); +} + +/* pointer based version with local stack and insertion sort threshhold */ +void rqsort(void *base, size_t nmemb, size_t size, cmp_f cmp, void *opaque) +{ + struct { uint8_t *base; size_t count; int depth; } stack[50], *sp = stack; + uint8_t *ptr, *pi, *pj, *plt, *pgt, *top, *m; + size_t m4, i, lt, gt, span, span2; + int c, depth; + exchange_f swap = exchange_func(base, size); + exchange_f swap_block = exchange_func(base, size | 128); + + if (nmemb < 2 || size <= 0) + return; + + sp->base = (uint8_t *)base; + sp->count = nmemb; + sp->depth = 0; + sp++; + + while (sp > stack) { + sp--; + ptr = sp->base; + nmemb = sp->count; + depth = sp->depth; + + while (nmemb > 6) { + if (++depth > 50) { + /* depth check to ensure worst case logarithmic time */ + heapsortx(ptr, nmemb, size, cmp, opaque); + nmemb = 0; + break; + } + /* select median of 3 from 1/4, 1/2, 3/4 positions */ + /* should use median of 5 or 9? */ + m4 = (nmemb >> 2) * size; + m = med3(ptr + m4, ptr + 2 * m4, ptr + 3 * m4, cmp, opaque); + swap(ptr, m, size); /* move the pivot to the start or the array */ + i = lt = 1; + pi = plt = ptr + size; + gt = nmemb; + pj = pgt = top = ptr + nmemb * size; + for (;;) { + while (pi < pj && (c = cmp(ptr, pi, opaque)) >= 0) { + if (c == 0) { + swap(plt, pi, size); + lt++; + plt += size; + } + i++; + pi += size; + } + while (pi < (pj -= size) && (c = cmp(ptr, pj, opaque)) <= 0) { + if (c == 0) { + gt--; + pgt -= size; + swap(pgt, pj, size); + } + } + if (pi >= pj) + break; + swap(pi, pj, size); + i++; + pi += size; + } + /* array has 4 parts: + * from 0 to lt excluded: elements identical to pivot + * from lt to pi excluded: elements smaller than pivot + * from pi to gt excluded: elements greater than pivot + * from gt to n excluded: elements identical to pivot + */ + /* move elements identical to pivot in the middle of the array: */ + /* swap values in ranges [0..lt[ and [i-lt..i[ + swapping the smallest span between lt and i-lt is sufficient + */ + span = plt - ptr; + span2 = pi - plt; + lt = i - lt; + if (span > span2) + span = span2; + swap_block(ptr, pi - span, span); + /* swap values in ranges [gt..top[ and [i..top-(top-gt)[ + swapping the smallest span between top-gt and gt-i is sufficient + */ + span = top - pgt; + span2 = pgt - pi; + pgt = top - span2; + gt = nmemb - (gt - i); + if (span > span2) + span = span2; + swap_block(pi, top - span, span); + + /* now array has 3 parts: + * from 0 to lt excluded: elements smaller than pivot + * from lt to gt excluded: elements identical to pivot + * from gt to n excluded: elements greater than pivot + */ + /* stack the larger segment and keep processing the smaller one + to minimize stack use for pathological distributions */ + if (lt > nmemb - gt) { + sp->base = ptr; + sp->count = lt; + sp->depth = depth; + sp++; + ptr = pgt; + nmemb -= gt; + } else { + sp->base = pgt; + sp->count = nmemb - gt; + sp->depth = depth; + sp++; + nmemb = lt; + } + } + /* Use insertion sort for small fragments */ + for (pi = ptr + size, top = ptr + nmemb * size; pi < top; pi += size) { + for (pj = pi; pj > ptr && cmp(pj - size, pj, opaque) > 0; pj -= size) + swap(pj, pj - size, size); + } + } +} + +/*---- Portable time functions ----*/ + +#ifdef _WIN32 + // From: https://stackoverflow.com/a/26085827 +static int gettimeofday_msvc(struct timeval *tp) +{ + static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL); + + SYSTEMTIME system_time; + FILETIME file_time; + uint64_t time; + + GetSystemTime(&system_time); + SystemTimeToFileTime(&system_time, &file_time); + time = ((uint64_t)file_time.dwLowDateTime); + time += ((uint64_t)file_time.dwHighDateTime) << 32; + + tp->tv_sec = (long)((time - EPOCH) / 10000000L); + tp->tv_usec = (long)(system_time.wMilliseconds * 1000); + + return 0; +} + +uint64_t js__hrtime_ns(void) { + LARGE_INTEGER counter, frequency; + double scaled_freq; + double result; + + if (!QueryPerformanceFrequency(&frequency)) + abort(); + assert(frequency.QuadPart != 0); + + if (!QueryPerformanceCounter(&counter)) + abort(); + assert(counter.QuadPart != 0); + + /* Because we have no guarantee about the order of magnitude of the + * performance counter interval, integer math could cause this computation + * to overflow. Therefore we resort to floating point math. + */ + scaled_freq = (double) frequency.QuadPart / NANOSEC; + result = (double) counter.QuadPart / scaled_freq; + return (uint64_t) result; +} +#else +uint64_t js__hrtime_ns(void) { +#ifdef __DJGPP + struct timeval tv; + if (gettimeofday(&tv, NULL)) + abort(); + return tv.tv_sec * NANOSEC + tv.tv_usec * 1000; +#else + struct timespec t; + + if (clock_gettime(CLOCK_MONOTONIC, &t)) + abort(); + + return t.tv_sec * NANOSEC + t.tv_nsec; +#endif +} +#endif + +int64_t js__gettimeofday_us(void) { + struct timeval tv; +#ifdef _WIN32 + gettimeofday_msvc(&tv); +#else + gettimeofday(&tv, NULL); +#endif + 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__) || defined(__GNU__) +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 +#if defined(_WIN32) +typedef void (*js__once_cb)(void); + +typedef struct { + js__once_cb callback; +} js__once_data_t; + +static int WINAPI js__once_inner(INIT_ONCE *once, void *param, void **context) { + js__once_data_t *data = param; + + data->callback(); + + return 1; +} + +void js_once(js_once_t *guard, js__once_cb callback) { + js__once_data_t data = { .callback = callback }; + InitOnceExecuteOnce(guard, js__once_inner, (void*) &data, NULL); +} + +void js_mutex_init(js_mutex_t *mutex) { + InitializeCriticalSection(mutex); +} + +void js_mutex_destroy(js_mutex_t *mutex) { + DeleteCriticalSection(mutex); +} + +void js_mutex_lock(js_mutex_t *mutex) { + EnterCriticalSection(mutex); +} + +void js_mutex_unlock(js_mutex_t *mutex) { + LeaveCriticalSection(mutex); +} + +void js_cond_init(js_cond_t *cond) { + InitializeConditionVariable(cond); +} + +void js_cond_destroy(js_cond_t *cond) { + /* nothing to do */ + (void) cond; +} + +void js_cond_signal(js_cond_t *cond) { + WakeConditionVariable(cond); +} + +void js_cond_broadcast(js_cond_t *cond) { + WakeAllConditionVariable(cond); +} + +void js_cond_wait(js_cond_t *cond, js_mutex_t *mutex) { + if (!SleepConditionVariableCS(cond, mutex, INFINITE)) + abort(); +} + +int js_cond_timedwait(js_cond_t *cond, js_mutex_t *mutex, uint64_t timeout) { + if (SleepConditionVariableCS(cond, mutex, (DWORD)(timeout / 1e6))) + return 0; + if (GetLastError() != ERROR_TIMEOUT) + abort(); + return -1; +} + +int js_thread_create(js_thread_t *thrd, void (*start)(void *), void *arg, + int flags) +{ + HANDLE h, cp; + + *thrd = INVALID_HANDLE_VALUE; + if (flags & ~JS_THREAD_CREATE_DETACHED) + return -1; + h = (HANDLE)_beginthread(start, /*stacksize*/2<<20, arg); + if (!h) + return -1; + if (flags & JS_THREAD_CREATE_DETACHED) + return 0; + // _endthread() automatically closes the handle but we want to wait on + // it so make a copy. Race-y for very short-lived threads. Can be solved + // by switching to _beginthreadex(CREATE_SUSPENDED) but means changing + // |start| from __cdecl to __stdcall. + cp = GetCurrentProcess(); + if (DuplicateHandle(cp, h, cp, thrd, 0, FALSE, DUPLICATE_SAME_ACCESS)) + return 0; + return -1; +} + +int js_thread_join(js_thread_t thrd) +{ + if (WaitForSingleObject(thrd, INFINITE)) + return -1; + CloseHandle(thrd); + return 0; +} + +#else /* !defined(_WIN32) */ + +void js_once(js_once_t *guard, void (*callback)(void)) { + if (pthread_once(guard, callback)) + abort(); +} + +void js_mutex_init(js_mutex_t *mutex) { + if (pthread_mutex_init(mutex, NULL)) + abort(); +} + +void js_mutex_destroy(js_mutex_t *mutex) { + if (pthread_mutex_destroy(mutex)) + abort(); +} + +void js_mutex_lock(js_mutex_t *mutex) { + if (pthread_mutex_lock(mutex)) + abort(); +} + +void js_mutex_unlock(js_mutex_t *mutex) { + if (pthread_mutex_unlock(mutex)) + abort(); +} + +void js_cond_init(js_cond_t *cond) { +#if defined(__APPLE__) && defined(__MACH__) + if (pthread_cond_init(cond, NULL)) + abort(); +#else + pthread_condattr_t attr; + + if (pthread_condattr_init(&attr)) + abort(); + + if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) + abort(); + + if (pthread_cond_init(cond, &attr)) + abort(); + + if (pthread_condattr_destroy(&attr)) + abort(); +#endif +} + +void js_cond_destroy(js_cond_t *cond) { +#if defined(__APPLE__) && defined(__MACH__) + /* It has been reported that destroying condition variables that have been + * signalled but not waited on can sometimes result in application crashes. + * See https://codereview.chromium.org/1323293005. + */ + pthread_mutex_t mutex; + struct timespec ts; + int err; + + if (pthread_mutex_init(&mutex, NULL)) + abort(); + + if (pthread_mutex_lock(&mutex)) + abort(); + + ts.tv_sec = 0; + ts.tv_nsec = 1; + + err = pthread_cond_timedwait_relative_np(cond, &mutex, &ts); + if (err != 0 && err != ETIMEDOUT) + abort(); + + if (pthread_mutex_unlock(&mutex)) + abort(); + + if (pthread_mutex_destroy(&mutex)) + abort(); +#endif /* defined(__APPLE__) && defined(__MACH__) */ + + if (pthread_cond_destroy(cond)) + abort(); +} + +void js_cond_signal(js_cond_t *cond) { + if (pthread_cond_signal(cond)) + abort(); +} + +void js_cond_broadcast(js_cond_t *cond) { + if (pthread_cond_broadcast(cond)) + abort(); +} + +void js_cond_wait(js_cond_t *cond, js_mutex_t *mutex) { +#if defined(__APPLE__) && defined(__MACH__) + int r; + + errno = 0; + r = pthread_cond_wait(cond, mutex); + + /* Workaround for a bug in OS X at least up to 13.6 + * See https://github.com/libuv/libuv/issues/4165 + */ + if (r == EINVAL && errno == EBUSY) + return; + if (r) + abort(); +#else + if (pthread_cond_wait(cond, mutex)) + abort(); +#endif +} + +int js_cond_timedwait(js_cond_t *cond, js_mutex_t *mutex, uint64_t timeout) { + int r; + struct timespec ts; + +#if !defined(__APPLE__) + timeout += js__hrtime_ns(); +#endif + + ts.tv_sec = timeout / NANOSEC; + ts.tv_nsec = timeout % NANOSEC; +#if defined(__APPLE__) && defined(__MACH__) + r = pthread_cond_timedwait_relative_np(cond, mutex, &ts); +#else + r = pthread_cond_timedwait(cond, mutex, &ts); +#endif + + if (r == 0) + return 0; + + if (r == ETIMEDOUT) + return -1; + + abort(); + + /* Pacify some compilers. */ + return -1; +} + +int js_thread_create(js_thread_t *thrd, void (*start)(void *), void *arg, + int flags) +{ + union { + void (*x)(void *); + void *(*f)(void *); + } u = {start}; + pthread_attr_t attr; + int ret; + + if (flags & ~JS_THREAD_CREATE_DETACHED) + return -1; + if (pthread_attr_init(&attr)) + return -1; + ret = -1; + if (pthread_attr_setstacksize(&attr, 2<<20)) + goto fail; + if (flags & JS_THREAD_CREATE_DETACHED) + if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) + goto fail; + if (pthread_create(thrd, &attr, u.f, arg)) + goto fail; + ret = 0; +fail: + pthread_attr_destroy(&attr); + return ret; +} + +int js_thread_join(js_thread_t thrd) +{ + if (pthread_join(thrd, NULL)) + return -1; + return 0; +} + +#endif /* !defined(_WIN32) */ +#endif /* JS_HAVE_THREADS */ + +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif diff --git a/Plugins/Schema/external/quickjs/src/cutils.h b/Plugins/Schema/external/quickjs/src/cutils.h new file mode 100644 index 0000000000..d7971e005c --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/cutils.h @@ -0,0 +1,655 @@ +/* + * C utilities + * + * Copyright (c) 2017 Fabrice Bellard + * Copyright (c) 2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef CUTILS_H +#define CUTILS_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) +#include +#include +#define alloca _alloca +#define ssize_t ptrdiff_t +#endif +#if defined(__APPLE__) +#include +#elif defined(__linux__) || defined(__ANDROID__) || defined(__CYGWIN__) || defined(__GLIBC__) +#include +#elif defined(__FreeBSD__) +#include +#elif defined(_WIN32) +#include +#endif +#if !defined(_WIN32) && !defined(EMSCRIPTEN) && !defined(__wasi__) && !defined(__DJGPP) +#include +#include +#endif +#if !defined(_WIN32) +#include +#include +#endif + +#if defined(__sun) +#undef __maybe_unused +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +# define likely(x) (x) +# define unlikely(x) (x) +# define force_inline __forceinline +# define no_inline __declspec(noinline) +# define __maybe_unused +# define __attribute__(x) +# define __attribute(x) +#else +# define likely(x) __builtin_expect(!!(x), 1) +# define unlikely(x) __builtin_expect(!!(x), 0) +# define force_inline inline __attribute__((always_inline)) +# define no_inline __attribute__((noinline)) +# define __maybe_unused __attribute__((unused)) +#endif + +#ifndef offsetof +#define offsetof(type, field) ((size_t) &((type *)0)->field) +#endif +#ifndef countof +#define countof(x) (sizeof(x) / sizeof((x)[0])) +#ifndef endof +#define endof(x) ((x) + countof(x)) +#endif +#endif +#ifndef container_of +/* return the pointer of type 'type *' containing 'ptr' as field 'member' */ +#define container_of(ptr, type, member) ((type *)((uint8_t *)(ptr) - offsetof(type, member))) +#endif + +#if defined(_MSC_VER) || defined(__cplusplus) +#define minimum_length(n) n +#else +#define minimum_length(n) static n +#endif + +/* Borrowed from Folly */ +#ifndef JS_PRINTF_FORMAT +#ifdef _MSC_VER +#include +#define JS_PRINTF_FORMAT _Printf_format_string_ +#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) +#else +#define JS_PRINTF_FORMAT +#if !defined(__clang__) && defined(__GNUC__) +#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \ + __attribute__((format(gnu_printf, format_param, dots_param))) +#else +#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#endif +#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); +int js__has_suffix(const char *str, const char *suffix); + +static inline uint8_t is_be(void) { + union { + uint16_t a; + uint8_t b; + } u = { 0x100 }; + return u.b; +} + +static inline int max_int(int a, int b) +{ + if (a > b) + return a; + else + return b; +} + +static inline int min_int(int a, int b) +{ + if (a < b) + return a; + else + return b; +} + +static inline uint32_t max_uint32(uint32_t a, uint32_t b) +{ + if (a > b) + return a; + else + return b; +} + +static inline uint32_t min_uint32(uint32_t a, uint32_t b) +{ + if (a < b) + return a; + else + return b; +} + +static inline int64_t max_int64(int64_t a, int64_t b) +{ + if (a > b) + return a; + else + return b; +} + +static inline int64_t min_int64(int64_t a, int64_t b) +{ + if (a < b) + return a; + else + return b; +} + +/* WARNING: undefined if a = 0 */ +static inline int clz32(unsigned int a) +{ +#if defined(_MSC_VER) && !defined(__clang__) + unsigned long index; + _BitScanReverse(&index, a); + return 31 - index; +#else + return __builtin_clz(a); +#endif +} + +/* WARNING: undefined if a = 0 */ +static inline int clz64(uint64_t a) +{ +#if defined(_MSC_VER) && !defined(__clang__) +#if INTPTR_MAX == INT64_MAX + unsigned long index; + _BitScanReverse64(&index, a); + return 63 - index; +#else + if (a >> 32) + return clz32((unsigned)(a >> 32)); + else + return clz32((unsigned)a) + 32; +#endif +#else + return __builtin_clzll(a); +#endif +} + +/* WARNING: undefined if a = 0 */ +static inline int ctz32(unsigned int a) +{ +#if defined(_MSC_VER) && !defined(__clang__) + unsigned long index; + _BitScanForward(&index, a); + return index; +#else + return __builtin_ctz(a); +#endif +} + +/* WARNING: undefined if a = 0 */ +static inline int ctz64(uint64_t a) +{ +#if defined(_MSC_VER) && !defined(__clang__) + unsigned long index; + _BitScanForward64(&index, a); + return index; +#else + return __builtin_ctzll(a); +#endif +} + +static inline uint64_t get_u64(const uint8_t *tab) +{ + uint64_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline int64_t get_i64(const uint8_t *tab) +{ + int64_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline void put_u64(uint8_t *tab, uint64_t val) +{ + memcpy(tab, &val, sizeof(val)); +} + +static inline uint32_t get_u32(const uint8_t *tab) +{ + uint32_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline int32_t get_i32(const uint8_t *tab) +{ + int32_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline void put_u32(uint8_t *tab, uint32_t val) +{ + memcpy(tab, &val, sizeof(val)); +} + +static inline uint32_t get_u16(const uint8_t *tab) +{ + uint16_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline int32_t get_i16(const uint8_t *tab) +{ + int16_t v; + memcpy(&v, tab, sizeof(v)); + return v; +} + +static inline void put_u16(uint8_t *tab, uint16_t val) +{ + memcpy(tab, &val, sizeof(val)); +} + +static inline uint32_t get_u8(const uint8_t *tab) +{ + return *tab; +} + +static inline int32_t get_i8(const uint8_t *tab) +{ + return (int8_t)*tab; +} + +static inline void put_u8(uint8_t *tab, uint8_t val) +{ + *tab = val; +} + +#ifndef bswap16 +static inline uint16_t bswap16(uint16_t x) +{ + return (x >> 8) | (x << 8); +} +#endif + +#ifndef bswap32 +static inline uint32_t bswap32(uint32_t v) +{ + return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) | + ((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24); +} +#endif + +#ifndef bswap64 +static inline uint64_t bswap64(uint64_t v) +{ + return ((v & ((uint64_t)0xff << (7 * 8))) >> (7 * 8)) | + ((v & ((uint64_t)0xff << (6 * 8))) >> (5 * 8)) | + ((v & ((uint64_t)0xff << (5 * 8))) >> (3 * 8)) | + ((v & ((uint64_t)0xff << (4 * 8))) >> (1 * 8)) | + ((v & ((uint64_t)0xff << (3 * 8))) << (1 * 8)) | + ((v & ((uint64_t)0xff << (2 * 8))) << (3 * 8)) | + ((v & ((uint64_t)0xff << (1 * 8))) << (5 * 8)) | + ((v & ((uint64_t)0xff << (0 * 8))) << (7 * 8)); +} +#endif + +static inline void inplace_bswap16(uint8_t *tab) { + put_u16(tab, bswap16(get_u16(tab))); +} + +static inline void inplace_bswap32(uint8_t *tab) { + put_u32(tab, bswap32(get_u32(tab))); +} + +static inline double fromfp16(uint16_t v) { + double d, s; + int e; + if ((v & 0x7C00) == 0x7C00) { + d = (v & 0x3FF) ? NAN : INFINITY; + } else { + d = (v & 0x3FF) / 1024.; + e = (v & 0x7C00) >> 10; + if (e == 0) { + e = -14; + } else { + d += 1; + e -= 15; + } + d = scalbn(d, e); + } + s = (v & 0x8000) ? -1.0 : 1.0; + return d * s; +} + +static inline uint16_t tofp16(double d) { + uint16_t f, s; + double t; + int e; + s = 0; + if (copysign(1, d) < 0) { // preserve sign when |d| is negative zero + d = -d; + s = 0x8000; + } + if (isinf(d)) + return s | 0x7C00; + if (isnan(d)) + return s | 0x7C01; + if (d == 0) + return s | 0; + d = 2 * frexp(d, &e); + e--; + if (e > 15) + return s | 0x7C00; // out of range, return +/-infinity + if (e < -25) { + d = 0; + e = 0; + } else if (e < -14) { + d = scalbn(d, e + 14); + e = 0; + } else { + d -= 1; + e += 15; + } + d *= 1024.; + f = (uint16_t)d; + t = d - f; + if (t < 0.5) + goto done; + if (t == 0.5) + if ((f & 1) == 0) + goto done; + // adjust for rounding + if (++f == 1024) { + f = 0; + if (++e == 31) + return s | 0x7C00; // out of range, return +/-infinity + } +done: + return s | (e << 10) | f; +} + +static inline int isfp16nan(uint16_t v) { + return (v & 0x7FFF) > 0x7C00; +} + +static inline int isfp16zero(uint16_t v) { + return (v & 0x7FFF) == 0; +} + +/* XXX: should take an extra argument to pass slack information to the caller */ +typedef void *DynBufReallocFunc(void *opaque, void *ptr, size_t size); + +typedef struct DynBuf { + uint8_t *buf; + size_t size; + size_t allocated_size; + bool error; /* true if a memory allocation error occurred */ + DynBufReallocFunc *realloc_func; + void *opaque; /* for realloc_func */ +} DynBuf; + +void dbuf_init(DynBuf *s); +void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func); +int dbuf_realloc(DynBuf *s, size_t new_size); +int dbuf_write(DynBuf *s, size_t offset, const void *data, size_t len); +int dbuf_put(DynBuf *s, const void *data, size_t len); +int dbuf_put_self(DynBuf *s, size_t offset, size_t len); +int dbuf_putc(DynBuf *s, uint8_t c); +int dbuf_putstr(DynBuf *s, const char *str); +static inline int dbuf_put_u16(DynBuf *s, uint16_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 2); +} +static inline int dbuf_put_u32(DynBuf *s, uint32_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 4); +} +static inline int dbuf_put_u64(DynBuf *s, uint64_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 8); +} +int JS_PRINTF_FORMAT_ATTR(2, 3) dbuf_printf(DynBuf *s, JS_PRINTF_FORMAT const char *fmt, ...); +void dbuf_free(DynBuf *s); +static inline bool dbuf_error(DynBuf *s) { + return s->error; +} +static inline void dbuf_set_error(DynBuf *s) +{ + s->error = true; +} + +/*---- UTF-8 and UTF-16 handling ----*/ + +#define UTF8_CHAR_LEN_MAX 4 + +enum { + UTF8_PLAIN_ASCII = 0, // 7-bit ASCII plain text + UTF8_NON_ASCII = 1, // has non ASCII code points (8-bit or more) + UTF8_HAS_16BIT = 2, // has 16-bit code points + UTF8_HAS_NON_BMP1 = 4, // has non-BMP1 code points, needs UTF-16 surrogate pairs + UTF8_HAS_ERRORS = 8, // has encoding errors +}; +int utf8_scan(const char *buf, size_t len, size_t *plen); +size_t utf8_encode_len(uint32_t c); +size_t utf8_encode(uint8_t buf[minimum_length(UTF8_CHAR_LEN_MAX)], uint32_t c); +uint32_t utf8_decode_len(const uint8_t *p, size_t max_len, const uint8_t **pp); +uint32_t utf8_decode(const uint8_t *p, const uint8_t **pp); +size_t utf8_decode_buf8(uint8_t *dest, size_t dest_len, const char *src, size_t src_len); +size_t utf8_decode_buf16(uint16_t *dest, size_t dest_len, const char *src, size_t src_len); +size_t utf8_encode_buf8(char *dest, size_t dest_len, const uint8_t *src, size_t src_len); +size_t utf8_encode_buf16(char *dest, size_t dest_len, const uint16_t *src, size_t src_len); + +static inline bool is_surrogate(uint32_t c) +{ + return (c >> 11) == (0xD800 >> 11); // 0xD800-0xDFFF +} + +static inline bool is_hi_surrogate(uint32_t c) +{ + return (c >> 10) == (0xD800 >> 10); // 0xD800-0xDBFF +} + +static inline bool is_lo_surrogate(uint32_t c) +{ + return (c >> 10) == (0xDC00 >> 10); // 0xDC00-0xDFFF +} + +static inline uint32_t get_hi_surrogate(uint32_t c) +{ + return (c >> 10) - (0x10000 >> 10) + 0xD800; +} + +static inline uint32_t get_lo_surrogate(uint32_t c) +{ + return (c & 0x3FF) | 0xDC00; +} + +static inline uint32_t from_surrogate(uint32_t hi, uint32_t lo) +{ + return 65536 + 1024 * (hi & 1023) + (lo & 1023); +} + +static inline int from_hex(int c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else + return -1; +} + +static inline uint8_t is_upper_ascii(uint8_t c) { + return c >= 'A' && c <= 'Z'; +} + +static inline uint8_t to_upper_ascii(uint8_t c) { + return c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; +} + +void rqsort(void *base, size_t nmemb, size_t size, + int (*cmp)(const void *, const void *, void *), + void *arg); + +static inline uint64_t float64_as_uint64(double d) +{ + union { + double d; + uint64_t u64; + } u; + u.d = d; + return u.u64; +} + +static inline double uint64_as_float64(uint64_t u64) +{ + union { + double d; + uint64_t u64; + } u; + u.u64 = u64; + return u.d; +} + +int64_t js__gettimeofday_us(void); +uint64_t js__hrtime_ns(void); + +static inline size_t js__malloc_usable_size(const void *ptr) +{ +#if defined(__APPLE__) + return malloc_size(ptr); +#elif defined(_WIN32) + return _msize((void *)ptr); +#elif defined(__linux__) || defined(__ANDROID__) || defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__GLIBC__) + return malloc_usable_size((void *)ptr); +#else + return 0; +#endif +} + +int js_exepath(char* buffer, size_t* size); + +/* Cross-platform threading APIs. */ + +#if defined(EMSCRIPTEN) || defined(__wasi__) || defined(__DJGPP) + +#define JS_HAVE_THREADS 0 + +#else + +#define JS_HAVE_THREADS 1 + +#if defined(_WIN32) +#define JS_ONCE_INIT INIT_ONCE_STATIC_INIT +typedef INIT_ONCE js_once_t; +typedef CRITICAL_SECTION js_mutex_t; +typedef CONDITION_VARIABLE js_cond_t; +typedef HANDLE js_thread_t; +#else +#define JS_ONCE_INIT PTHREAD_ONCE_INIT +typedef pthread_once_t js_once_t; +typedef pthread_mutex_t js_mutex_t; +typedef pthread_cond_t js_cond_t; +typedef pthread_t js_thread_t; +#endif + +void js_once(js_once_t *guard, void (*callback)(void)); + +void js_mutex_init(js_mutex_t *mutex); +void js_mutex_destroy(js_mutex_t *mutex); +void js_mutex_lock(js_mutex_t *mutex); +void js_mutex_unlock(js_mutex_t *mutex); + +void js_cond_init(js_cond_t *cond); +void js_cond_destroy(js_cond_t *cond); +void js_cond_signal(js_cond_t *cond); +void js_cond_broadcast(js_cond_t *cond); +void js_cond_wait(js_cond_t *cond, js_mutex_t *mutex); +int js_cond_timedwait(js_cond_t *cond, js_mutex_t *mutex, uint64_t timeout); + +enum { + JS_THREAD_CREATE_DETACHED = 1, +}; + +// creates threads with 2 MB stacks (glibc default) +int js_thread_create(js_thread_t *thrd, void (*start)(void *), void *arg, + int flags); +int js_thread_join(js_thread_t thrd); + +#endif /* !defined(EMSCRIPTEN) && !defined(__wasi__) */ + +// JS requires strict rounding behavior. Turn on 64-bits double precision +// and disable x87 80-bits extended precision for intermediate floating-point +// results. 0x300 is extended precision, 0x200 is double precision. +// Note that `*&cw` in the asm constraints looks redundant but isn't. +#if defined(__i386__) && !defined(_MSC_VER) +#define JS_X87_FPCW_SAVE_AND_ADJUST(cw) \ + unsigned short cw; \ + __asm__ __volatile__("fnstcw %0" : "=m"(*&cw)); \ + do { \ + unsigned short t = 0x200 | (cw & ~0x300); \ + __asm__ __volatile__("fldcw %0" : /*empty*/ : "m"(*&t)); \ + } while (0) +#define JS_X87_FPCW_RESTORE(cw) \ + __asm__ __volatile__("fldcw %0" : /*empty*/ : "m"(*&cw)) +#else +#define JS_X87_FPCW_SAVE_AND_ADJUST(cw) +#define JS_X87_FPCW_RESTORE(cw) +#endif + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + +#endif /* CUTILS_H */ diff --git a/Plugins/Schema/external/quickjs/src/dtoa.c b/Plugins/Schema/external/quickjs/src/dtoa.c new file mode 100644 index 0000000000..a89e824f92 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/dtoa.c @@ -0,0 +1,1619 @@ +/* + * Tiny float64 printing and parsing library + * + * Copyright (c) 2024 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include +// #include +#include +// #include + +#include "cutils.h" +#include "dtoa.h" + +/* + TODO: + - simplify subnormal handling + - reduce max memory usage + - free format: could add shortcut if exact result + - use 64 bit limb_t when possible + - use another algorithm for free format dtoa in base 10 (ryu ?) +*/ + +#define USE_POW5_TABLE +/* use fast path to print small integers in free format */ +#define USE_FAST_INT + +#define LIMB_LOG2_BITS 5 + +#define LIMB_BITS (1 << LIMB_LOG2_BITS) + +typedef int32_t slimb_t; +typedef uint32_t limb_t; +typedef uint64_t dlimb_t; + +#define LIMB_DIGITS 9 + +#define JS_RADIX_MAX 36 + +#define DBIGNUM_LEN_MAX 52 /* ~ 2^(1072+53)*36^100 (dtoa) */ +#define MANT_LEN_MAX 18 /* < 36^100 */ + +typedef intptr_t mp_size_t; + +/* the represented number is sum(i, tab[i]*2^(LIMB_BITS * i)) */ +typedef struct { + int len; /* >= 1 */ + limb_t tab[]; +} mpb_t; + +static limb_t mp_add_ui(limb_t *tab, limb_t b, size_t n) +{ + size_t i; + limb_t k, a; + + k=b; + for(i=0;i> LIMB_BITS; + } + return l; +} + +/* WARNING: d must be >= 2^(LIMB_BITS-1) */ +static inline limb_t udiv1norm_init(limb_t d) +{ + limb_t a0, a1; + a1 = -d - 1; + a0 = -1; + return (((dlimb_t)a1 << LIMB_BITS) | a0) / d; +} + +/* return the quotient and the remainder in '*pr'of 'a1*2^LIMB_BITS+a0 + / d' with 0 <= a1 < d. */ +static inline limb_t udiv1norm(limb_t *pr, limb_t a1, limb_t a0, + limb_t d, limb_t d_inv) +{ + limb_t n1m, n_adj, q, r, ah; + dlimb_t a; + n1m = ((slimb_t)a0 >> (LIMB_BITS - 1)); + n_adj = a0 + (n1m & d); + a = (dlimb_t)d_inv * (a1 - n1m) + n_adj; + q = (a >> LIMB_BITS) + a1; + /* compute a - q * r and update q so that the remainder is between + 0 and d - 1 */ + a = ((dlimb_t)a1 << LIMB_BITS) | a0; + a = a - (dlimb_t)q * d - d; + ah = a >> LIMB_BITS; + q += 1 + ah; + r = (limb_t)a + (ah & d); + *pr = r; + return q; +} + +static limb_t mp_div1(limb_t *tabr, const limb_t *taba, limb_t n, + limb_t b, limb_t r) +{ + slimb_t i; + dlimb_t a1; + for(i = n - 1; i >= 0; i--) { + a1 = ((dlimb_t)r << LIMB_BITS) | taba[i]; + tabr[i] = a1 / b; + r = a1 % b; + } + return r; +} + +/* r = (a + high*B^n) >> shift. Return the remainder r (0 <= r < 2^shift). + 1 <= shift <= LIMB_BITS - 1 */ +static limb_t mp_shr(limb_t *tab_r, const limb_t *tab, mp_size_t n, + int shift, limb_t high) +{ + mp_size_t i; + limb_t l, a; + + assert(shift >= 1 && shift < LIMB_BITS); + l = high; + for(i = n - 1; i >= 0; i--) { + a = tab[i]; + tab_r[i] = (a >> shift) | (l << (LIMB_BITS - shift)); + l = a; + } + return l & (((limb_t)1 << shift) - 1); +} + +/* r = (a << shift) + low. 1 <= shift <= LIMB_BITS - 1, 0 <= low < + 2^shift. */ +static limb_t mp_shl(limb_t *tab_r, const limb_t *tab, mp_size_t n, + int shift, limb_t low) +{ + mp_size_t i; + limb_t l, a; + + assert(shift >= 1 && shift < LIMB_BITS); + l = low; + for(i = 0; i < n; i++) { + a = tab[i]; + tab_r[i] = (a << shift) | l; + l = (a >> (LIMB_BITS - shift)); + } + return l; +} + +static no_inline limb_t mp_div1norm(limb_t *tabr, const limb_t *taba, limb_t n, + limb_t b, limb_t r, limb_t b_inv, int shift) +{ + slimb_t i; + + if (shift != 0) { + r = (r << shift) | mp_shl(tabr, taba, n, shift, 0); + } + for(i = n - 1; i >= 0; i--) { + tabr[i] = udiv1norm(&r, r, taba[i], b, b_inv); + } + r >>= shift; + return r; +} + +static __maybe_unused void mpb_dump(const char *str, const mpb_t *a) +{ + int i; + + printf("%s= 0x", str); + for(i = a->len - 1; i >= 0; i--) { + printf("%08x", a->tab[i]); + if (i != 0) + printf("_"); + } + printf("\n"); +} + +static void mpb_renorm(mpb_t *r) +{ + while (r->len > 1 && r->tab[r->len - 1] == 0) + r->len--; +} + +#ifdef USE_POW5_TABLE +static const uint32_t pow5_table[17] = { + 0x00000005, 0x00000019, 0x0000007d, 0x00000271, + 0x00000c35, 0x00003d09, 0x0001312d, 0x0005f5e1, + 0x001dcd65, 0x009502f9, 0x02e90edd, 0x0e8d4a51, + 0x48c27395, 0x6bcc41e9, 0x1afd498d, 0x86f26fc1, + 0xa2bc2ec5, +}; + +static const uint8_t pow5h_table[4] = { + 0x00000001, 0x00000007, 0x00000023, 0x000000b1, +}; + +static const uint32_t pow5_inv_table[13] = { + 0x99999999, 0x47ae147a, 0x0624dd2f, 0xa36e2eb1, + 0x4f8b588e, 0x0c6f7a0b, 0xad7f29ab, 0x5798ee23, + 0x12e0be82, 0xb7cdfd9d, 0x5fd7fe17, 0x19799812, + 0xc25c2684, +}; +#endif + +/* return a^b */ +static uint64_t pow_ui(uint32_t a, uint32_t b) +{ + int i, n_bits; + uint64_t r; + if (b == 0) + return 1; + if (b == 1) + return a; +#ifdef USE_POW5_TABLE + if ((a == 5 || a == 10) && b <= 17) { + r = pow5_table[b - 1]; + if (b >= 14) { + r |= (uint64_t)pow5h_table[b - 14] << 32; + } + if (a == 10) + r <<= b; + return r; + } +#endif + r = a; + n_bits = 32 - clz32(b); + for(i = n_bits - 2; i >= 0; i--) { + r *= r; + if ((b >> i) & 1) + r *= a; + } + return r; +} + +static uint32_t pow_ui_inv(uint32_t *pr_inv, int *pshift, uint32_t a, uint32_t b) +{ + uint32_t r_inv, r; + int shift; +#ifdef USE_POW5_TABLE + if (a == 5 && b >= 1 && b <= 13) { + r = pow5_table[b - 1]; + shift = clz32(r); + r <<= shift; + r_inv = pow5_inv_table[b - 1]; + } else +#endif + { + r = pow_ui(a, b); + shift = clz32(r); + r <<= shift; + r_inv = udiv1norm_init(r); + } + *pshift = shift; + *pr_inv = r_inv; + return r; +} + +enum { + JS_RNDN, /* round to nearest, ties to even */ + JS_RNDNA, /* round to nearest, ties away from zero */ + JS_RNDZ, +}; + +static int mpb_get_bit(const mpb_t *r, int k) +{ + int l; + + l = (unsigned)k / LIMB_BITS; + k = k & (LIMB_BITS - 1); + if (l >= r->len) + return 0; + else + return (r->tab[l] >> k) & 1; +} + +/* compute round(r / 2^shift). 'shift' can be negative */ +static void mpb_shr_round(mpb_t *r, int shift, int rnd_mode) +{ + int l, i; + + if (shift == 0) + return; + if (shift < 0) { + shift = -shift; + l = (unsigned)shift / LIMB_BITS; + shift = shift & (LIMB_BITS - 1); + if (shift != 0) { + r->tab[r->len] = mp_shl(r->tab, r->tab, r->len, shift, 0); + r->len++; + mpb_renorm(r); + } + if (l > 0) { + for(i = r->len - 1; i >= 0; i--) + r->tab[i + l] = r->tab[i]; + for(i = 0; i < l; i++) + r->tab[i] = 0; + r->len += l; + } + } else { + limb_t bit1, bit2; + int k, add_one; + + switch(rnd_mode) { + default: + case JS_RNDZ: + add_one = 0; + break; + case JS_RNDN: + case JS_RNDNA: + bit1 = mpb_get_bit(r, shift - 1); + if (bit1) { + if (rnd_mode == JS_RNDNA) { + bit2 = 1; + } else { + /* bit2 = oring of all the bits after bit1 */ + bit2 = 0; + if (shift >= 2) { + k = shift - 1; + l = (unsigned)k / LIMB_BITS; + k = k & (LIMB_BITS - 1); + for(i = 0; i < min_int(l, r->len); i++) + bit2 |= r->tab[i]; + if (l < r->len) + bit2 |= r->tab[l] & (((limb_t)1 << k) - 1); + } + } + if (bit2) { + add_one = 1; + } else { + /* round to even */ + add_one = mpb_get_bit(r, shift); + } + } else { + add_one = 0; + } + break; + } + + l = (unsigned)shift / LIMB_BITS; + shift = shift & (LIMB_BITS - 1); + if (l >= r->len) { + r->len = 1; + r->tab[0] = add_one; + } else { + if (l > 0) { + r->len -= l; + for(i = 0; i < r->len; i++) + r->tab[i] = r->tab[i + l]; + } + if (shift != 0) { + mp_shr(r->tab, r->tab, r->len, shift, 0); + mpb_renorm(r); + } + if (add_one) { + limb_t a; + a = mp_add_ui(r->tab, 1, r->len); + if (a) + r->tab[r->len++] = a; + } + } + } +} + +/* return -1, 0 or 1 */ +static int mpb_cmp(const mpb_t *a, const mpb_t *b) +{ + mp_size_t i; + if (a->len < b->len) + return -1; + else if (a->len > b->len) + return 1; + for(i = a->len - 1; i >= 0; i--) { + if (a->tab[i] != b->tab[i]) { + if (a->tab[i] < b->tab[i]) + return -1; + else + return 1; + } + } + return 0; +} + +static void mpb_set_u64(mpb_t *r, uint64_t m) +{ +#if LIMB_BITS == 64 + r->tab[0] = m; + r->len = 1; +#else + r->tab[0] = m; + r->tab[1] = m >> LIMB_BITS; + if (r->tab[1] == 0) + r->len = 1; + else + r->len = 2; +#endif +} + +static uint64_t mpb_get_u64(mpb_t *r) +{ +#if LIMB_BITS == 64 + return r->tab[0]; +#else + if (r->len == 1) { + return r->tab[0]; + } else { + return r->tab[0] | ((uint64_t)r->tab[1] << LIMB_BITS); + } +#endif +} + +/* floor_log2() = position of the first non zero bit or -1 if zero. */ +static int mpb_floor_log2(mpb_t *a) +{ + limb_t v; + v = a->tab[a->len - 1]; + if (v == 0) + return -1; + else + return a->len * LIMB_BITS - 1 - clz32(v); +} + +#define MUL_LOG2_RADIX_BASE_LOG2 24 + +/* round((1 << MUL_LOG2_RADIX_BASE_LOG2)/log2(i + 2)) */ +static const uint32_t mul_log2_radix_table[JS_RADIX_MAX - 1] = { + 0x000000, 0xa1849d, 0x000000, 0x6e40d2, + 0x6308c9, 0x5b3065, 0x000000, 0x50c24e, + 0x4d104d, 0x4a0027, 0x4768ce, 0x452e54, + 0x433d00, 0x418677, 0x000000, 0x3ea16b, + 0x3d645a, 0x3c43c2, 0x3b3b9a, 0x3a4899, + 0x39680b, 0x3897b3, 0x37d5af, 0x372069, + 0x367686, 0x35d6df, 0x354072, 0x34b261, + 0x342bea, 0x33ac62, 0x000000, 0x32bfd9, + 0x3251dd, 0x31e8d6, 0x318465, +}; + +/* return floor(a / log2(radix)) for -2048 <= a <= 2047 */ +static int mul_log2_radix(int a, int radix) +{ + int radix_bits, mult; + + if ((radix & (radix - 1)) == 0) { + /* if the radix is a power of two better to do it exactly */ + radix_bits = 31 - clz32(radix); + if (a < 0) + a -= radix_bits - 1; + return a / radix_bits; + } else { + mult = mul_log2_radix_table[radix - 2]; + return ((int64_t)a * mult) >> MUL_LOG2_RADIX_BASE_LOG2; + } +} + +#if 0 +static void build_mul_log2_radix_table(void) +{ + int base, radix, mult, col, base_log2; + + base_log2 = 24; + base = 1 << base_log2; + col = 0; + for(radix = 2; radix <= 36; radix++) { + if ((radix & (radix - 1)) == 0) + mult = 0; + else + mult = lrint((double)base / log2(radix)); + printf("0x%06x, ", mult); + if (++col == 4) { + printf("\n"); + col = 0; + } + } + printf("\n"); +} + +static void mul_log2_radix_test(void) +{ + int radix, i, ref, r; + + for(radix = 2; radix <= 36; radix++) { + for(i = -2048; i <= 2047; i++) { + ref = (int)floor((double)i / log2(radix)); + r = mul_log2_radix(i, radix); + if (ref != r) { + printf("ERROR: radix=%d i=%d r=%d ref=%d\n", + radix, i, r, ref); + exit(1); + } + } + } + if (0) + build_mul_log2_radix_table(); +} +#endif + +static void u32toa_len(char *buf, uint32_t n, size_t len) +{ + int digit, i; + for(i = len - 1; i >= 0; i--) { + digit = n % 10; + n = n / 10; + buf[i] = digit + '0'; + } +} + +/* for power of 2 radixes. len >= 1 */ +static void u64toa_bin_len(char *buf, uint64_t n, unsigned int radix_bits, int len) +{ + int digit, i; + unsigned int mask; + + mask = (1 << radix_bits) - 1; + for(i = len - 1; i >= 0; i--) { + digit = n & mask; + n >>= radix_bits; + if (digit < 10) + digit += '0'; + else + digit += 'a' - 10; + buf[i] = digit; + } +} + +/* len >= 1. 2 <= radix <= 36 */ +static void limb_to_a(char *buf, limb_t n, unsigned int radix, int len) +{ + int digit, i; + + if (radix == 10) { + /* specific case with constant divisor */ +#if LIMB_BITS == 32 + u32toa_len(buf, n, len); +#else + /* XXX: optimize */ + for(i = len - 1; i >= 0; i--) { + digit = (limb_t)n % 10; + n = (limb_t)n / 10; + buf[i] = digit + '0'; + } +#endif + } else { + for(i = len - 1; i >= 0; i--) { + digit = (limb_t)n % radix; + n = (limb_t)n / radix; + if (digit < 10) + digit += '0'; + else + digit += 'a' - 10; + buf[i] = digit; + } + } +} + +size_t u32toa(char *buf, uint32_t n) +{ + char buf1[10], *q; + size_t len; + + q = buf1 + sizeof(buf1); + do { + *--q = n % 10 + '0'; + n /= 10; + } while (n != 0); + len = buf1 + sizeof(buf1) - q; + memcpy(buf, q, len); + return len; +} + +size_t i32toa(char *buf, int32_t n) +{ + if (n >= 0) { + return u32toa(buf, n); + } else { + buf[0] = '-'; + return u32toa(buf + 1, -(uint32_t)n) + 1; + } +} + +#ifdef USE_FAST_INT +size_t u64toa(char *buf, uint64_t n) +{ + if (n < 0x100000000) { + return u32toa(buf, n); + } else { + uint64_t n1; + char *q = buf; + uint32_t n2; + + n1 = n / 1000000000; + n %= 1000000000; + if (n1 >= 0x100000000) { + n2 = n1 / 1000000000; + n1 = n1 % 1000000000; + /* at most two digits */ + if (n2 >= 10) { + *q++ = n2 / 10 + '0'; + n2 %= 10; + } + *q++ = n2 + '0'; + u32toa_len(q, n1, 9); + q += 9; + } else { + q += u32toa(q, n1); + } + u32toa_len(q, n, 9); + q += 9; + return q - buf; + } +} + +size_t i64toa(char *buf, int64_t n) +{ + if (n >= 0) { + return u64toa(buf, n); + } else { + buf[0] = '-'; + return u64toa(buf + 1, -(uint64_t)n) + 1; + } +} + +/* XXX: only tested for 1 <= n < 2^53 */ +size_t u64toa_radix(char *buf, uint64_t n, unsigned int radix) +{ + int radix_bits, l; + if (likely(radix == 10)) + return u64toa(buf, n); + if ((radix & (radix - 1)) == 0) { + radix_bits = 31 - clz32(radix); + if (n == 0) + l = 1; + else + l = (64 - clz64(n) + radix_bits - 1) / radix_bits; + u64toa_bin_len(buf, n, radix_bits, l); + return l; + } else { + char buf1[41], *q; /* maximum length for radix = 3 */ + size_t len; + int digit; + q = buf1 + sizeof(buf1); + do { + digit = n % radix; + n /= radix; + if (digit < 10) + digit += '0'; + else + digit += 'a' - 10; + *--q = digit; + } while (n != 0); + len = buf1 + sizeof(buf1) - q; + memcpy(buf, q, len); + return len; + } +} + +size_t i64toa_radix(char *buf, int64_t n, unsigned int radix) +{ + if (n >= 0) { + return u64toa_radix(buf, n, radix); + } else { + buf[0] = '-'; + return u64toa_radix(buf + 1, -(uint64_t)n, radix) + 1; + } +} +#endif /* USE_FAST_INT */ + +static const uint8_t digits_per_limb_table[JS_RADIX_MAX - 1] = { +#if LIMB_BITS == 32 +32,20,16,13,12,11,10,10, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +#else +64,40,32,27,24,22,21,20,19,18,17,17,16,16,16,15,15,15,14,14,14,14,13,13,13,13,13,13,13,12,12,12,12,12,12, +#endif +}; + +static const uint32_t radix_base_table[JS_RADIX_MAX - 1] = { + 0x00000000, 0xcfd41b91, 0x00000000, 0x48c27395, + 0x81bf1000, 0x75db9c97, 0x40000000, 0xcfd41b91, + 0x3b9aca00, 0x8c8b6d2b, 0x19a10000, 0x309f1021, + 0x57f6c100, 0x98c29b81, 0x00000000, 0x18754571, + 0x247dbc80, 0x3547667b, 0x4c4b4000, 0x6b5a6e1d, + 0x94ace180, 0xcaf18367, 0x0b640000, 0x0e8d4a51, + 0x1269ae40, 0x17179149, 0x1cb91000, 0x23744899, + 0x2b73a840, 0x34e63b41, 0x40000000, 0x4cfa3cc1, + 0x5c13d840, 0x6d91b519, 0x81bf1000, +}; + +/* XXX: remove the table ? */ +static uint8_t dtoa_max_digits_table[JS_RADIX_MAX - 1] = { + 54, 35, 28, 24, 22, 20, 19, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, +}; + +/* we limit the maximum number of significant digits for atod to about + 128 bits of precision for non power of two bases. The only + requirement for Javascript is at least 20 digits in base 10. For + power of two bases, we do an exact rounding in all the cases. */ +static uint8_t atod_max_digits_table[JS_RADIX_MAX - 1] = { + 64, 80, 32, 55, 49, 45, 21, 40, 38, 37, 35, 34, 33, 32, 16, 31, 30, 30, 29, 29, 28, 28, 27, 27, 27, 26, 26, 26, 26, 25, 12, 25, 25, 24, 24, +}; + +/* if abs(d) >= B^max_exponent, it is an overflow */ +static const int16_t max_exponent[JS_RADIX_MAX - 1] = { + 1024, 647, 512, 442, 397, 365, 342, 324, + 309, 297, 286, 277, 269, 263, 256, 251, + 246, 242, 237, 234, 230, 227, 224, 221, + 218, 216, 214, 211, 209, 207, 205, 203, + 202, 200, 199, +}; + +/* if abs(d) <= B^min_exponent, it is an underflow */ +static const int16_t min_exponent[JS_RADIX_MAX - 1] = { +-1075, -679, -538, -463, -416, -383, -359, -340, + -324, -311, -300, -291, -283, -276, -269, -263, + -258, -254, -249, -245, -242, -238, -235, -232, + -229, -227, -224, -222, -220, -217, -215, -214, + -212, -210, -208, +}; + +#if 0 +void build_tables(void) +{ + int r, j, radix, n, col, i; + + /* radix_base_table */ + for(radix = 2; radix <= 36; radix++) { + r = 1; + for(j = 0; j < digits_per_limb_table[radix - 2]; j++) { + r *= radix; + } + printf(" 0x%08x,", r); + if ((radix % 4) == 1) + printf("\n"); + } + printf("\n"); + + /* dtoa_max_digits_table */ + for(radix = 2; radix <= 36; radix++) { + /* Note: over estimated when the radix is a power of two */ + printf(" %d,", 1 + (int)ceil(53.0 / log2(radix))); + } + printf("\n"); + + /* atod_max_digits_table */ + for(radix = 2; radix <= 36; radix++) { + if ((radix & (radix - 1)) == 0) { + /* 64 bits is more than enough */ + n = (int)floor(64.0 / log2(radix)); + } else { + n = (int)floor(128.0 / log2(radix)); + } + printf(" %d,", n); + } + printf("\n"); + + printf("static const int16_t max_exponent[JS_RADIX_MAX - 1] = {\n"); + col = 0; + for(radix = 2; radix <= 36; radix++) { + printf("%5d, ", (int)ceil(1024 / log2(radix))); + if (++col == 8) { + col = 0; + printf("\n"); + } + } + printf("\n};\n\n"); + + printf("static const int16_t min_exponent[JS_RADIX_MAX - 1] = {\n"); + col = 0; + for(radix = 2; radix <= 36; radix++) { + printf("%5d, ", (int)floor(-1075 / log2(radix))); + if (++col == 8) { + col = 0; + printf("\n"); + } + } + printf("\n};\n\n"); + + printf("static const uint32_t pow5_table[16] = {\n"); + col = 0; + for(i = 2; i <= 17; i++) { + r = 1; + for(j = 0; j < i; j++) { + r *= 5; + } + printf("0x%08x, ", r); + if (++col == 4) { + col = 0; + printf("\n"); + } + } + printf("\n};\n\n"); + + /* high part */ + printf("static const uint8_t pow5h_table[4] = {\n"); + col = 0; + for(i = 14; i <= 17; i++) { + uint64_t r1; + r1 = 1; + for(j = 0; j < i; j++) { + r1 *= 5; + } + printf("0x%08x, ", (uint32_t)(r1 >> 32)); + if (++col == 4) { + col = 0; + printf("\n"); + } + } + printf("\n};\n\n"); +} +#endif + +/* n_digits >= 1. 0 <= dot_pos <= n_digits. If dot_pos == n_digits, + the dot is not displayed. 'a' is modified. */ +static int output_digits(char *buf, + mpb_t *a, int radix, int n_digits1, + int dot_pos) +{ + int n_digits, digits_per_limb, radix_bits, n, len; + + n_digits = n_digits1; + if ((radix & (radix - 1)) == 0) { + /* radix = 2^radix_bits */ + radix_bits = 31 - clz32(radix); + } else { + radix_bits = 0; + } + digits_per_limb = digits_per_limb_table[radix - 2]; + if (radix_bits != 0) { + for(;;) { + n = min_int(n_digits, digits_per_limb); + n_digits -= n; + u64toa_bin_len(buf + n_digits, a->tab[0], radix_bits, n); + if (n_digits == 0) + break; + mpb_shr_round(a, digits_per_limb * radix_bits, JS_RNDZ); + } + } else { + limb_t r; + while (n_digits != 0) { + n = min_int(n_digits, digits_per_limb); + n_digits -= n; + r = mp_div1(a->tab, a->tab, a->len, radix_base_table[radix - 2], 0); + mpb_renorm(a); + limb_to_a(buf + n_digits, r, radix, n); + } + } + + /* add the dot */ + len = n_digits1; + if (dot_pos != n_digits1) { + memmove(buf + dot_pos + 1, buf + dot_pos, n_digits1 - dot_pos); + buf[dot_pos] = '.'; + len++; + } + return len; +} + +/* return (a, e_offset) such that a = a * (radix1*2^radix_shift)^f * + 2^-e_offset. 'f' can be negative. */ +static int mul_pow(mpb_t *a, int radix1, int radix_shift, int f, bool is_int, int e) +{ + int e_offset, d, n, n0; + + e_offset = -f * radix_shift; + if (radix1 != 1) { + d = digits_per_limb_table[radix1 - 2]; + if (f >= 0) { + limb_t h, b; + + b = 0; + n0 = 0; + while (f != 0) { + n = min_int(f, d); + if (n != n0) { + b = pow_ui(radix1, n); + n0 = n; + } + h = mp_mul1(a->tab, a->tab, a->len, b, 0); + if (h != 0) { + a->tab[a->len++] = h; + } + f -= n; + } + } else { + int extra_bits, l, shift; + limb_t r, rem, b, b_inv; + + f = -f; + l = (f + d - 1) / d; /* high bound for the number of limbs (XXX: make it better) */ + e_offset += l * LIMB_BITS; + if (!is_int) { + /* at least 'e' bits are needed in the final result for rounding */ + extra_bits = max_int(e - mpb_floor_log2(a), 0); + } else { + /* at least two extra bits are needed in the final result + for rounding */ + extra_bits = max_int(2 + e - e_offset, 0); + } + e_offset += extra_bits; + mpb_shr_round(a, -(l * LIMB_BITS + extra_bits), JS_RNDZ); + + b = 0; + b_inv = 0; + shift = 0; + n0 = 0; + rem = 0; + while (f != 0) { + n = min_int(f, d); + if (n != n0) { + b = pow_ui_inv(&b_inv, &shift, radix1, n); + n0 = n; + } + r = mp_div1norm(a->tab, a->tab, a->len, b, 0, b_inv, shift); + rem |= r; + mpb_renorm(a); + f -= n; + } + /* if the remainder is non zero, use it for rounding */ + a->tab[0] |= (rem != 0); + } + } + return e_offset; +} + +/* tmp1 = round(m*2^e*radix^f). 'tmp0' is a temporary storage */ +static void mul_pow_round(mpb_t *tmp1, uint64_t m, int e, int radix1, int radix_shift, int f, + int rnd_mode) +{ + int e_offset; + + mpb_set_u64(tmp1, m); + e_offset = mul_pow(tmp1, radix1, radix_shift, f, true, e); + mpb_shr_round(tmp1, -e + e_offset, rnd_mode); +} + +/* return round(a*2^e_offset) rounded as a float64. 'a' is modified */ +static uint64_t round_to_d(int *pe, mpb_t *a, int e_offset, int rnd_mode) +{ + int e; + uint64_t m; + + if (a->tab[0] == 0 && a->len == 1) { + /* zero result */ + m = 0; + e = 0; /* don't care */ + } else { + int prec, prec1, e_min; + e = mpb_floor_log2(a) + 1 - e_offset; + prec1 = 53; + e_min = -1021; + if (e < e_min) { + /* subnormal result or zero */ + prec = prec1 - (e_min - e); + } else { + prec = prec1; + } + mpb_shr_round(a, e + e_offset - prec, rnd_mode); + m = mpb_get_u64(a); + m <<= (53 - prec); + /* mantissa overflow due to rounding */ + if (m >= (uint64_t)1 << 53) { + m >>= 1; + e++; + } + } + *pe = e; + return m; +} + +/* return (m, e) such that m*2^(e-53) = round(a * radix^f) with 2^52 + <= m < 2^53 or m = 0. + 'a' is modified. */ +static uint64_t mul_pow_round_to_d(int *pe, mpb_t *a, + int radix1, int radix_shift, int f, int rnd_mode) +{ + int e_offset; + + e_offset = mul_pow(a, radix1, radix_shift, f, false, 55); + return round_to_d(pe, a, e_offset, rnd_mode); +} + +#ifdef JS_DTOA_DUMP_STATS +static int out_len_count[17]; + +void js_dtoa_dump_stats(void) +{ + int i, sum; + sum = 0; + for(i = 0; i < 17; i++) + sum += out_len_count[i]; + for(i = 0; i < 17; i++) { + printf("%2d %8d %5.2f%%\n", + i + 1, out_len_count[i], (double)out_len_count[i] / sum * 100); + } +} +#endif + +/* return a maximum bound of the string length. The bound depends on + 'd' only if format = JS_DTOA_FORMAT_FRAC or if JS_DTOA_EXP_DISABLED + is enabled. */ +int js_dtoa_max_len(double d, int radix, int n_digits, int flags) +{ + int fmt = flags & JS_DTOA_FORMAT_MASK; + int n, e; + uint64_t a; + + if (fmt != JS_DTOA_FORMAT_FRAC) { + if (fmt == JS_DTOA_FORMAT_FREE) { + n = dtoa_max_digits_table[radix - 2]; + } else { + n = n_digits; + } + if ((flags & JS_DTOA_EXP_MASK) == JS_DTOA_EXP_DISABLED) { + /* no exponential */ + a = float64_as_uint64(d); + e = (a >> 52) & 0x7ff; + if (e == 0x7ff) { + /* NaN, Infinity */ + n = 0; + } else { + e -= 1023; + /* XXX: adjust */ + n += 10 + abs(mul_log2_radix(e - 1, radix)); + } + } else { + /* extra: sign, 1 dot and exponent "e-1000" */ + n += 1 + 1 + 6; + } + } else { + a = float64_as_uint64(d); + e = (a >> 52) & 0x7ff; + if (e == 0x7ff) { + /* NaN, Infinity */ + n = 0; + } else { + /* high bound for the integer part */ + e -= 1023; + /* x < 2^(e + 1) */ + if (e < 0) { + n = 1; + } else { + n = 2 + mul_log2_radix(e - 1, radix); + } + /* sign, extra digit, 1 dot */ + n += 1 + 1 + 1 + n_digits; + } + } + return max_int(n, 9); /* also include NaN and [-]Infinity */ +} + +#if defined(__SANITIZE_ADDRESS__) && 0 +static void *dtoa_malloc(uint64_t **pptr, size_t size) +{ + return malloc(size); +} +static void dtoa_free(void *ptr) +{ + free(ptr); +} +#else +static void *dtoa_malloc(uint64_t **pptr, size_t size) +{ + void *ret; + ret = *pptr; + *pptr += (size + 7) / 8; + return ret; +} + +static void dtoa_free(void *ptr) +{ +} +#endif + +/* return the length */ +int js_dtoa(char *buf, double d, int radix, int n_digits, int flags, + JSDTOATempMem *tmp_mem) +{ + uint64_t a, m, *mptr = tmp_mem->mem; + int e, sgn, l, E, P, i, E_max, radix1, radix_shift; + char *q; + mpb_t *tmp1, *mant_max; + int fmt = flags & JS_DTOA_FORMAT_MASK; + + tmp1 = dtoa_malloc(&mptr, sizeof(mpb_t) + sizeof(limb_t) * DBIGNUM_LEN_MAX); + mant_max = dtoa_malloc(&mptr, sizeof(mpb_t) + sizeof(limb_t) * MANT_LEN_MAX); + assert((mptr - tmp_mem->mem) <= sizeof(JSDTOATempMem) / sizeof(mptr[0])); + + radix_shift = ctz32(radix); + radix1 = radix >> radix_shift; + a = float64_as_uint64(d); + sgn = a >> 63; + e = (a >> 52) & 0x7ff; + m = a & (((uint64_t)1 << 52) - 1); + q = buf; + if (e == 0x7ff) { + if (m == 0) { + if (sgn) + *q++ = '-'; + memcpy(q, "Infinity", 8); + q += 8; + } else { + memcpy(q, "NaN", 3); + q += 3; + } + goto done; + } else if (e == 0) { + if (m == 0) { + tmp1->len = 1; + tmp1->tab[0] = 0; + E = 1; + if (fmt == JS_DTOA_FORMAT_FREE) + P = 1; + else if (fmt == JS_DTOA_FORMAT_FRAC) + P = n_digits + 1; + else + P = n_digits; + /* "-0" is displayed as "0" if JS_DTOA_MINUS_ZERO is not present */ + if (sgn && (flags & JS_DTOA_MINUS_ZERO)) + *q++ = '-'; + goto output; + } + /* denormal number: convert to a normal number */ + l = clz64(m) - 11; + e -= l - 1; + m <<= l; + } else { + m |= (uint64_t)1 << 52; + } + if (sgn) + *q++ = '-'; + /* remove the bias */ + e -= 1022; + /* d = 2^(e-53)*m */ + // printf("m=0x%016" PRIx64 " e=%d\n", m, e); +#ifdef USE_FAST_INT + if (fmt == JS_DTOA_FORMAT_FREE && + e >= 1 && e <= 53 && + (m & (((uint64_t)1 << (53 - e)) - 1)) == 0 && + (flags & JS_DTOA_EXP_MASK) != JS_DTOA_EXP_ENABLED) { + m >>= 53 - e; + /* 'm' is never zero */ + q += u64toa_radix(q, m, radix); + goto done; + } +#endif + + /* this choice of E implies F=round(x*B^(P-E) is such as: + B^(P-1) <= F < 2.B^P. */ + E = 1 + mul_log2_radix(e - 1, radix); + + if (fmt == JS_DTOA_FORMAT_FREE) { + int P_max, E0, e1, E_found, P_found; + uint64_t m1, mant_found, mant, mant_max1; + /* P_max is guarranteed to work by construction */ + P_max = dtoa_max_digits_table[radix - 2]; + E0 = E; + E_found = 0; + P_found = 0; + mant_found = 0; + /* find the minimum number of digits by successive tries */ + P = P_max; /* P_max is guarateed to work */ + for(;;) { + /* mant_max always fits on 64 bits */ + mant_max1 = pow_ui(radix, P); + /* compute the mantissa in base B */ + E = E0; + for(;;) { + /* XXX: add inexact flag */ + mul_pow_round(tmp1, m, e - 53, radix1, radix_shift, P - E, JS_RNDN); + mant = mpb_get_u64(tmp1); + if (mant < mant_max1) + break; + E++; /* at most one iteration is possible */ + } + /* remove useless trailing zero digits */ + while ((mant % radix) == 0) { + mant /= radix; + P--; + } + /* garanteed to work for P = P_max */ + if (P_found == 0) + goto prec_found; + /* convert back to base 2 */ + mpb_set_u64(tmp1, mant); + m1 = mul_pow_round_to_d(&e1, tmp1, radix1, radix_shift, E - P, JS_RNDN); + // printf("P=%2d: m=0x%016" PRIx64 " e=%d m1=0x%016" PRIx64 " e1=%d\n", P, m, e, m1, e1); + /* Note: (m, e) is never zero here, so the exponent for m1 + = 0 does not matter */ + if (m1 == m && e1 == e) { + prec_found: + P_found = P; + E_found = E; + mant_found = mant; + if (P == 1) + break; + P--; /* try lower exponent */ + } else { + break; + } + } + P = P_found; + E = E_found; + mpb_set_u64(tmp1, mant_found); +#ifdef JS_DTOA_DUMP_STATS + if (radix == 10) { + out_len_count[P - 1]++; + } +#endif + } else if (fmt == JS_DTOA_FORMAT_FRAC) { + int len; + + assert(n_digits >= 0 && n_digits <= JS_DTOA_MAX_DIGITS); + /* P = max_int(E, 1) + n_digits; */ + /* frac is rounded using RNDNA */ + mul_pow_round(tmp1, m, e - 53, radix1, radix_shift, n_digits, JS_RNDNA); + + /* we add one extra digit on the left and remove it if needed + to avoid testing if the result is < radix^P */ + len = output_digits(q, tmp1, radix, max_int(E + 1, 1) + n_digits, + max_int(E + 1, 1)); + if (q[0] == '0' && len >= 2 && q[1] != '.') { + len--; + memmove(q, q + 1, len); + } + q += len; + goto done; + } else { + int pow_shift; + assert(n_digits >= 1 && n_digits <= JS_DTOA_MAX_DIGITS); + P = n_digits; + /* mant_max = radix^P */ + mant_max->len = 1; + mant_max->tab[0] = 1; + pow_shift = mul_pow(mant_max, radix1, radix_shift, P, false, 0); + mpb_shr_round(mant_max, pow_shift, JS_RNDZ); + + for(;;) { + /* fixed and frac are rounded using RNDNA */ + mul_pow_round(tmp1, m, e - 53, radix1, radix_shift, P - E, JS_RNDNA); + if (mpb_cmp(tmp1, mant_max) < 0) + break; + E++; /* at most one iteration is possible */ + } + } + output: + if (fmt == JS_DTOA_FORMAT_FIXED) + E_max = n_digits; + else + E_max = dtoa_max_digits_table[radix - 2] + 4; + if ((flags & JS_DTOA_EXP_MASK) == JS_DTOA_EXP_ENABLED || + ((flags & JS_DTOA_EXP_MASK) == JS_DTOA_EXP_AUTO && (E <= -6 || E > E_max))) { + q += output_digits(q, tmp1, radix, P, 1); + E--; + if (radix == 10) { + *q++ = 'e'; + } else if (radix1 == 1 && radix_shift <= 4) { + E *= radix_shift; + *q++ = 'p'; + } else { + *q++ = '@'; + } + if (E < 0) { + *q++ = '-'; + E = -E; + } else { + *q++ = '+'; + } + q += u32toa(q, E); + } else if (E <= 0) { + *q++ = '0'; + *q++ = '.'; + for(i = 0; i < -E; i++) + *q++ = '0'; + q += output_digits(q, tmp1, radix, P, P); + } else { + q += output_digits(q, tmp1, radix, P, min_int(P, E)); + for(i = 0; i < E - P; i++) + *q++ = '0'; + } + done: + *q = '\0'; + dtoa_free(mant_max); + dtoa_free(tmp1); + return q - buf; +} + +static inline int to_digit(int c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'Z') + return c - 'A' + 10; + else if (c >= 'a' && c <= 'z') + return c - 'a' + 10; + else + return 36; +} + +/* r = r * radix_base + a. radix_base = 0 means radix_base = 2^32 */ +static void mpb_mul1_base(mpb_t *r, limb_t radix_base, limb_t a) +{ + int i; + if (r->tab[0] == 0 && r->len == 1) { + r->tab[0] = a; + } else { + if (radix_base == 0) { + for(i = r->len; i >= 0; i--) { + r->tab[i + 1] = r->tab[i]; + } + r->tab[0] = a; + } else { + r->tab[r->len] = mp_mul1(r->tab, r->tab, r->len, + radix_base, a); + } + r->len++; + mpb_renorm(r); + } +} + +/* XXX: add fast path for small integers */ +double js_atod(const char *str, const char **pnext, int radix, int flags, + JSATODTempMem *tmp_mem) +{ + uint64_t *mptr = tmp_mem->mem; + const char *p, *p_start; + limb_t cur_limb, radix_base, extra_digits; + int is_neg, digit_count, limb_digit_count, digits_per_limb, sep, radix1, radix_shift; + int radix_bits, expn, e, max_digits, expn_offset, dot_pos, sig_pos, pos; + mpb_t *tmp0; + double dval; + bool is_bin_exp, is_zero, expn_overflow; + uint64_t m, a; + + tmp0 = dtoa_malloc(&mptr, sizeof(mpb_t) + sizeof(limb_t) * DBIGNUM_LEN_MAX); + assert((mptr - tmp_mem->mem) <= sizeof(JSATODTempMem) / sizeof(mptr[0])); + /* optional separator between digits */ + sep = (flags & JS_ATOD_ACCEPT_UNDERSCORES) ? '_' : 256; + + p = str; + is_neg = 0; + if (p[0] == '+') { + p++; + p_start = p; + } else if (p[0] == '-') { + is_neg = 1; + p++; + p_start = p; + } else { + p_start = p; + } + + if (p[0] == '0') { + if ((p[1] == 'x' || p[1] == 'X') && + (radix == 0 || radix == 16)) { + p += 2; + radix = 16; + } else if ((p[1] == 'o' || p[1] == 'O') && + radix == 0 && (flags & JS_ATOD_ACCEPT_BIN_OCT)) { + p += 2; + radix = 8; + } else if ((p[1] == 'b' || p[1] == 'B') && + radix == 0 && (flags & JS_ATOD_ACCEPT_BIN_OCT)) { + p += 2; + radix = 2; + } else if ((p[1] >= '0' && p[1] <= '9') && + radix == 0 && (flags & JS_ATOD_ACCEPT_LEGACY_OCTAL)) { + int i; + sep = 256; + for (i = 1; (p[i] >= '0' && p[i] <= '7'); i++) + continue; + if (p[i] == '8' || p[i] == '9') + goto no_prefix; + p += 1; + radix = 8; + } else { + goto no_prefix; + } + /* there must be a digit after the prefix */ + if (to_digit((uint8_t)*p) >= radix) + goto fail; + no_prefix: ; + } else { + if (!(flags & JS_ATOD_INT_ONLY) && js__strstart(p, "Infinity", &p)) + goto overflow; + } + if (radix == 0) + radix = 10; + + cur_limb = 0; + expn_offset = 0; + digit_count = 0; + limb_digit_count = 0; + max_digits = atod_max_digits_table[radix - 2]; + digits_per_limb = digits_per_limb_table[radix - 2]; + radix_base = radix_base_table[radix - 2]; + radix_shift = ctz32(radix); + radix1 = radix >> radix_shift; + if (radix1 == 1) { + /* radix = 2^radix_bits */ + radix_bits = radix_shift; + } else { + radix_bits = 0; + } + tmp0->len = 1; + tmp0->tab[0] = 0; + extra_digits = 0; + pos = 0; + dot_pos = -1; + /* skip leading zeros */ + for(;;) { + if (*p == '.' && (p > p_start || to_digit(p[1]) < radix) && + !(flags & JS_ATOD_INT_ONLY)) { + if (*p == sep) + goto fail; + if (dot_pos >= 0) + break; + dot_pos = pos; + p++; + } + if (*p == sep && p > p_start && p[1] == '0') + p++; + if (*p != '0') + break; + p++; + pos++; + } + + sig_pos = pos; + for(;;) { + limb_t c; + if (*p == '.' && (p > p_start || to_digit(p[1]) < radix) && + !(flags & JS_ATOD_INT_ONLY)) { + if (*p == sep) + goto fail; + if (dot_pos >= 0) + break; + dot_pos = pos; + p++; + } + if (*p == sep && p > p_start && to_digit(p[1]) < radix) + p++; + c = to_digit(*p); + if (c >= radix) + break; + p++; + pos++; + if (digit_count < max_digits) { + /* XXX: could be faster when radix_bits != 0 */ + cur_limb = cur_limb * radix + c; + limb_digit_count++; + if (limb_digit_count == digits_per_limb) { + mpb_mul1_base(tmp0, radix_base, cur_limb); + cur_limb = 0; + limb_digit_count = 0; + } + digit_count++; + } else { + extra_digits |= c; + } + } + if (limb_digit_count != 0) { + mpb_mul1_base(tmp0, pow_ui(radix, limb_digit_count), cur_limb); + } + if (digit_count == 0) { + is_zero = true; + expn_offset = 0; + } else { + is_zero = false; + if (dot_pos < 0) + dot_pos = pos; + expn_offset = sig_pos + digit_count - dot_pos; + } + + /* Use the extra digits for rounding if the base is a power of + two. Otherwise they are just truncated. */ + if (radix_bits != 0 && extra_digits != 0) { + tmp0->tab[0] |= 1; + } + + /* parse the exponent, if any */ + expn = 0; + expn_overflow = false; + is_bin_exp = false; + if (!(flags & JS_ATOD_INT_ONLY) && + ((radix == 10 && (*p == 'e' || *p == 'E')) || + (radix != 10 && (*p == '@' || + (radix_bits >= 1 && radix_bits <= 4 && (*p == 'p' || *p == 'P'))))) && + p > p_start) { + bool exp_is_neg; + int c; + is_bin_exp = (*p == 'p' || *p == 'P'); + p++; + exp_is_neg = false; + if (*p == '+') { + p++; + } else if (*p == '-') { + exp_is_neg = true; + p++; + } + c = to_digit(*p); + if (c >= 10) + goto fail; /* XXX: could stop before the exponent part */ + expn = c; + p++; + for(;;) { + if (*p == sep && to_digit(p[1]) < 10) + p++; + c = to_digit(*p); + if (c >= 10) + break; + if (!expn_overflow) { + if (unlikely(expn > ((INT32_MAX - 2 - 9) / 10))) { + expn_overflow = true; + } else { + expn = expn * 10 + c; + } + } + p++; + } + if (exp_is_neg) + expn = -expn; + /* if zero result, the exponent can be arbitrarily large */ + if (!is_zero && expn_overflow) { + if (exp_is_neg) + a = 0; + else + a = (uint64_t)0x7ff << 52; /* infinity */ + goto done; + } + } + + if (p == p_start) + goto fail; + + if (is_zero) { + a = 0; + } else { + int expn1; + if (radix_bits != 0) { + if (!is_bin_exp) + expn *= radix_bits; + expn -= expn_offset * radix_bits; + expn1 = expn + digit_count * radix_bits; + if (expn1 >= 1024 + radix_bits) + goto overflow; + else if (expn1 <= -1075) + goto underflow; + m = round_to_d(&e, tmp0, -expn, JS_RNDN); + } else { + expn -= expn_offset; + expn1 = expn + digit_count; + if (expn1 >= max_exponent[radix - 2] + 1) + goto overflow; + else if (expn1 <= min_exponent[radix - 2]) + goto underflow; + m = mul_pow_round_to_d(&e, tmp0, radix1, radix_shift, expn, JS_RNDN); + } + if (m == 0) { + underflow: + a = 0; + } else if (e > 1024) { + overflow: + /* overflow */ + a = (uint64_t)0x7ff << 52; + } else if (e < -1073) { + /* underflow */ + /* XXX: check rounding */ + a = 0; + } else if (e < -1021) { + /* subnormal */ + a = m >> (-e - 1021); + } else { + a = ((uint64_t)(e + 1022) << 52) | (m & (((uint64_t)1 << 52) - 1)); + } + } + done: + a |= (uint64_t)is_neg << 63; + dval = uint64_as_float64(a); + done1: + if (pnext) + *pnext = p; + dtoa_free(tmp0); + return dval; + fail: + dval = NAN; + goto done1; +} diff --git a/Plugins/Schema/external/quickjs/src/dtoa.h b/Plugins/Schema/external/quickjs/src/dtoa.h new file mode 100644 index 0000000000..85be040698 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/dtoa.h @@ -0,0 +1,87 @@ +/* + * Tiny float64 printing and parsing library + * + * Copyright (c) 2024 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef DTOA_H +#define DTOA_H + +//#define JS_DTOA_DUMP_STATS + +/* maximum number of digits for fixed and frac formats */ +#define JS_DTOA_MAX_DIGITS 101 + +/* radix != 10 is only supported with flags = JS_DTOA_FORMAT_FREE */ +/* use as many digits as necessary */ +#define JS_DTOA_FORMAT_FREE (0 << 0) +/* use n_digits significant digits (1 <= n_digits <= JS_DTOA_MAX_DIGITS) */ +#define JS_DTOA_FORMAT_FIXED (1 << 0) +/* force fractional format: [-]dd.dd with n_digits fractional digits. + 0 <= n_digits <= JS_DTOA_MAX_DIGITS */ +#define JS_DTOA_FORMAT_FRAC (2 << 0) +#define JS_DTOA_FORMAT_MASK (3 << 0) + +/* select exponential notation either in fixed or free format */ +#define JS_DTOA_EXP_AUTO (0 << 2) +#define JS_DTOA_EXP_ENABLED (1 << 2) +#define JS_DTOA_EXP_DISABLED (2 << 2) +#define JS_DTOA_EXP_MASK (3 << 2) + +#define JS_DTOA_MINUS_ZERO (1 << 4) /* show the minus sign for -0 */ + +/* only accepts integers (no dot, no exponent) */ +#define JS_ATOD_INT_ONLY (1 << 0) +/* accept Oo and Ob prefixes in addition to 0x prefix if radix = 0 */ +#define JS_ATOD_ACCEPT_BIN_OCT (1 << 1) +/* accept O prefix as octal if radix == 0 and properly formed (Annex B) */ +#define JS_ATOD_ACCEPT_LEGACY_OCTAL (1 << 2) +/* accept _ between digits as a digit separator */ +#define JS_ATOD_ACCEPT_UNDERSCORES (1 << 3) + +typedef struct { + uint64_t mem[37]; +} JSDTOATempMem; + +typedef struct { + uint64_t mem[27]; +} JSATODTempMem; + +/* return a maximum bound of the string length */ +int js_dtoa_max_len(double d, int radix, int n_digits, int flags); +/* return the string length */ +int js_dtoa(char *buf, double d, int radix, int n_digits, int flags, + JSDTOATempMem *tmp_mem); +double js_atod(const char *str, const char **pnext, int radix, int flags, + JSATODTempMem *tmp_mem); + +#ifdef JS_DTOA_DUMP_STATS +void js_dtoa_dump_stats(void); +#endif + +/* additional exported functions */ +size_t u32toa(char *buf, uint32_t n); +size_t i32toa(char *buf, int32_t n); +size_t u64toa(char *buf, uint64_t n); +size_t i64toa(char *buf, int64_t n); +size_t u64toa_radix(char *buf, uint64_t n, unsigned int radix); +size_t i64toa_radix(char *buf, int64_t n, unsigned int radix); + +#endif /* DTOA_H */ diff --git a/Plugins/Schema/external/quickjs/src/fuzz.c b/Plugins/Schema/external/quickjs/src/fuzz.c new file mode 100644 index 0000000000..fca8fa413b --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/fuzz.c @@ -0,0 +1,22 @@ +// clang -g -O1 -fsanitize=fuzzer -o fuzz fuzz.c +#include "quickjs.h" +#include "quickjs.c" +#include "cutils.c" +#include "libregexp.c" +#include "libunicode.c" +#include + +int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) +{ + JSRuntime *rt = JS_NewRuntime(); + if (!rt) + exit(1); + JSContext *ctx = JS_NewContext(rt); + if (!ctx) + exit(1); + JSValue val = JS_ReadObject(ctx, buf, len, /*flags*/0); + JS_FreeValue(ctx, val); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + return 0; +} diff --git a/Plugins/Schema/external/quickjs/src/libregexp-opcode.h b/Plugins/Schema/external/quickjs/src/libregexp-opcode.h new file mode 100644 index 0000000000..5c1714ab0c --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libregexp-opcode.h @@ -0,0 +1,58 @@ +/* + * Regular Expression Engine + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifdef DEF + +DEF(invalid, 1) /* never used */ +DEF(char8, 2) /* 7 bits in fact */ +DEF(char16, 3) +DEF(char32, 5) +DEF(dot, 1) +DEF(any, 1) /* same as dot but match any character including line terminator */ +DEF(line_start, 1) +DEF(line_end, 1) +DEF(goto, 5) +DEF(split_goto_first, 5) +DEF(split_next_first, 5) +DEF(match, 1) +DEF(save_start, 2) /* save start position */ +DEF(save_end, 2) /* save end position, must come after saved_start */ +DEF(save_reset, 3) /* reset save positions */ +DEF(loop, 5) /* decrement the top the stack and goto if != 0 */ +DEF(push_i32, 5) /* push integer on the stack */ +DEF(drop, 1) +DEF(word_boundary, 1) +DEF(not_word_boundary, 1) +DEF(back_reference, 2) +DEF(backward_back_reference, 2) /* must come after back_reference */ +DEF(range, 3) /* variable length */ +DEF(range32, 3) /* variable length */ +DEF(lookahead, 5) +DEF(negative_lookahead, 5) +DEF(push_char_pos, 1) /* push the character position on the stack */ +DEF(check_advance, 1) /* pop one stack element and check that it is different from the character position */ +DEF(prev, 1) /* go to the previous char */ +DEF(simple_greedy_quant, 17) + +#endif /* DEF */ diff --git a/Plugins/Schema/external/quickjs/src/libregexp.c b/Plugins/Schema/external/quickjs/src/libregexp.c new file mode 100644 index 0000000000..65539a20c5 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libregexp.c @@ -0,0 +1,2680 @@ +/* + * Regular Expression Engine + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include + +#include "cutils.h" +#include "libregexp.h" + +#if defined(__sun) +#include +#endif + +/* + TODO: + + - Add a lock step execution mode (=linear time execution guaranteed) + when the regular expression is "simple" i.e. no backreference nor + complicated lookahead. The opcodes are designed for this execution + model. +*/ + +#if defined(TEST) +#define DUMP_REOP +#endif + +typedef enum { +#define DEF(id, size) REOP_ ## id, +#include "libregexp-opcode.h" +#undef DEF + REOP_COUNT, +} REOPCodeEnum; + +#define CAPTURE_COUNT_MAX 255 +#define STACK_SIZE_MAX 255 +/* must be large enough to have a negligible runtime cost and small + enough to call the interrupt callback often. */ +#define INTERRUPT_COUNTER_INIT 10000 + +/* unicode code points */ +#define CP_LS 0x2028 +#define CP_PS 0x2029 + +#define TMP_BUF_SIZE 128 + +// invariant: is_unicode ^ unicode_sets (or neither, but not both) +typedef struct { + DynBuf byte_code; + const uint8_t *buf_ptr; + const uint8_t *buf_end; + const uint8_t *buf_start; + int re_flags; + bool is_unicode; + bool unicode_sets; + bool ignore_case; + bool dotall; + int capture_count; + int total_capture_count; /* -1 = not computed yet */ + int has_named_captures; /* -1 = don't know, 0 = no, 1 = yes */ + void *opaque; + DynBuf group_names; + union { + char error_msg[TMP_BUF_SIZE]; + char tmp_buf[TMP_BUF_SIZE]; + } u; +} REParseState; + +typedef struct { +#ifdef DUMP_REOP + const char *name; +#endif + uint8_t size; +} REOpCode; + +static const REOpCode reopcode_info[REOP_COUNT] = { +#ifdef DUMP_REOP +#define DEF(id, size) { #id, size }, +#else +#define DEF(id, size) { size }, +#endif +#include "libregexp-opcode.h" +#undef DEF +}; + +#define RE_HEADER_FLAGS 0 +#define RE_HEADER_CAPTURE_COUNT 2 +#define RE_HEADER_STACK_SIZE 3 +#define RE_HEADER_BYTECODE_LEN 4 + +#define RE_HEADER_LEN 8 + +static inline int lre_is_digit(int c) { + return c >= '0' && c <= '9'; +} + +/* insert 'len' bytes at position 'pos'. Return < 0 if error. */ +static int dbuf_insert(DynBuf *s, int pos, int len) +{ + if (dbuf_realloc(s, s->size + len)) + return -1; + memmove(s->buf + pos + len, s->buf + pos, s->size - pos); + s->size += len; + return 0; +} + +static const uint16_t char_range_d[] = { + 1, + 0x0030, 0x0039 + 1, +}; + +/* code point ranges for Zs,Zl or Zp property */ +static const uint16_t char_range_s[] = { + 10, + 0x0009, 0x000D + 1, + 0x0020, 0x0020 + 1, + 0x00A0, 0x00A0 + 1, + 0x1680, 0x1680 + 1, + 0x2000, 0x200A + 1, + /* 2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; */ + /* 2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; */ + 0x2028, 0x2029 + 1, + 0x202F, 0x202F + 1, + 0x205F, 0x205F + 1, + 0x3000, 0x3000 + 1, + /* FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; */ + 0xFEFF, 0xFEFF + 1, +}; + +bool lre_is_space(int c) +{ + int i, n, low, high; + n = (countof(char_range_s) - 1) / 2; + for(i = 0; i < n; i++) { + low = char_range_s[2 * i + 1]; + if (c < low) + return false; + high = char_range_s[2 * i + 2]; + if (c < high) + return true; + } + return false; +} + +uint32_t const lre_id_start_table_ascii[4] = { + /* $ A-Z _ a-z */ + 0x00000000, 0x00000010, 0x87FFFFFE, 0x07FFFFFE +}; + +uint32_t const lre_id_continue_table_ascii[4] = { + /* $ 0-9 A-Z _ a-z */ + 0x00000000, 0x03FF0010, 0x87FFFFFE, 0x07FFFFFE +}; + + +static const uint16_t char_range_w[] = { + 4, + 0x0030, 0x0039 + 1, + 0x0041, 0x005A + 1, + 0x005F, 0x005F + 1, + 0x0061, 0x007A + 1, +}; + +#define CLASS_RANGE_BASE 0x40000000 + +typedef enum { + CHAR_RANGE_d, + CHAR_RANGE_D, + CHAR_RANGE_s, + CHAR_RANGE_S, + CHAR_RANGE_w, + CHAR_RANGE_W, +} CharRangeEnum; + +static const uint16_t *char_range_table[] = { + char_range_d, + char_range_s, + char_range_w, +}; + +static int cr_init_char_range(REParseState *s, CharRange *cr, uint32_t c) +{ + bool invert; + const uint16_t *c_pt; + int len, i; + + invert = c & 1; + c_pt = char_range_table[c >> 1]; + len = *c_pt++; + cr_init(cr, s->opaque, lre_realloc); + for(i = 0; i < len * 2; i++) { + if (cr_add_point(cr, c_pt[i])) + goto fail; + } + if (invert) { + if (cr_invert(cr)) + goto fail; + } + return 0; + fail: + cr_free(cr); + return -1; +} + +#ifdef DUMP_REOP +static __maybe_unused void lre_dump_bytecode(const uint8_t *buf, + int buf_len) +{ + int pos, len, opcode, bc_len, re_flags, i; + uint32_t val; + + assert(buf_len >= RE_HEADER_LEN); + + re_flags = lre_get_flags(buf); + bc_len = get_u32(buf + RE_HEADER_BYTECODE_LEN); + assert(bc_len + RE_HEADER_LEN <= buf_len); + printf("flags: 0x%x capture_count=%d stack_size=%d\n", + re_flags, buf[RE_HEADER_CAPTURE_COUNT], buf[RE_HEADER_STACK_SIZE]); + if (re_flags & LRE_FLAG_NAMED_GROUPS) { + const char *p; + p = (char *)buf + RE_HEADER_LEN + bc_len; + printf("named groups: "); + for(i = 1; i < buf[RE_HEADER_CAPTURE_COUNT]; i++) { + if (i != 1) + printf(","); + printf("<%s>", p); + p += strlen(p) + 1; + } + printf("\n"); + assert(p == (char *)(buf + buf_len)); + } + printf("bytecode_len=%d\n", bc_len); + + buf += RE_HEADER_LEN; + pos = 0; + while (pos < bc_len) { + printf("%5u: ", pos); + opcode = buf[pos]; + len = reopcode_info[opcode].size; + if (opcode >= REOP_COUNT) { + printf(" invalid opcode=0x%02x\n", opcode); + break; + } + if ((pos + len) > bc_len) { + printf(" buffer overflow (opcode=0x%02x)\n", opcode); + break; + } + printf("%s", reopcode_info[opcode].name); + switch(opcode) { + case REOP_char8: + val = get_u8(buf + pos + 1); + goto printchar; + case REOP_char16: + val = get_u16(buf + pos + 1); + goto printchar; + case REOP_char32: + val = get_u32(buf + pos + 1); + printchar: + if (val >= ' ' && val <= 126) + printf(" '%c'", val); + else + printf(" 0x%08x", val); + break; + case REOP_goto: + case REOP_split_goto_first: + case REOP_split_next_first: + case REOP_loop: + case REOP_lookahead: + case REOP_negative_lookahead: + val = get_u32(buf + pos + 1); + val += (pos + 5); + printf(" %u", val); + break; + case REOP_simple_greedy_quant: + printf(" %u %u %u %u", + get_u32(buf + pos + 1) + (pos + 17), + get_u32(buf + pos + 1 + 4), + get_u32(buf + pos + 1 + 8), + get_u32(buf + pos + 1 + 12)); + break; + case REOP_save_start: + case REOP_save_end: + case REOP_back_reference: + case REOP_backward_back_reference: + printf(" %u", buf[pos + 1]); + break; + case REOP_save_reset: + printf(" %u %u", buf[pos + 1], buf[pos + 2]); + break; + case REOP_push_i32: + val = get_u32(buf + pos + 1); + printf(" %d", val); + break; + case REOP_range: + { + int n, i; + n = get_u16(buf + pos + 1); + len += n * 4; + for(i = 0; i < n * 2; i++) { + val = get_u16(buf + pos + 3 + i * 2); + printf(" 0x%04x", val); + } + } + break; + case REOP_range32: + { + int n, i; + n = get_u16(buf + pos + 1); + len += n * 8; + for(i = 0; i < n * 2; i++) { + val = get_u32(buf + pos + 3 + i * 4); + printf(" 0x%08x", val); + } + } + break; + default: + break; + } + printf("\n"); + pos += len; + } +} +#endif + +static void re_emit_op(REParseState *s, int op) +{ + dbuf_putc(&s->byte_code, op); +} + +/* return the offset of the u32 value */ +static int re_emit_op_u32(REParseState *s, int op, uint32_t val) +{ + int pos; + dbuf_putc(&s->byte_code, op); + pos = s->byte_code.size; + dbuf_put_u32(&s->byte_code, val); + return pos; +} + +static int re_emit_goto(REParseState *s, int op, uint32_t val) +{ + int pos; + dbuf_putc(&s->byte_code, op); + pos = s->byte_code.size; + dbuf_put_u32(&s->byte_code, val - (pos + 4)); + return pos; +} + +static void re_emit_op_u8(REParseState *s, int op, uint32_t val) +{ + dbuf_putc(&s->byte_code, op); + dbuf_putc(&s->byte_code, val); +} + +static void re_emit_op_u16(REParseState *s, int op, uint32_t val) +{ + dbuf_putc(&s->byte_code, op); + dbuf_put_u16(&s->byte_code, val); +} + +static int JS_PRINTF_FORMAT_ATTR(2, 3) re_parse_error(REParseState *s, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsnprintf(s->u.error_msg, sizeof(s->u.error_msg), fmt, ap); + va_end(ap); + return -1; +} + +static int re_parse_out_of_memory(REParseState *s) +{ + return re_parse_error(s, "out of memory"); +} + +static int lre_check_size(REParseState *s) +{ + if (s->byte_code.size < 64*1024*1024) + return 0; + return re_parse_out_of_memory(s); +} + +/* If allow_overflow is false, return -1 in case of + overflow. Otherwise return INT32_MAX. */ +static int parse_digits(const uint8_t **pp, bool allow_overflow) +{ + const uint8_t *p; + uint64_t v; + int c; + + p = *pp; + v = 0; + for(;;) { + c = *p; + if (c < '0' || c > '9') + break; + v = v * 10 + c - '0'; + if (v >= INT32_MAX) { + if (allow_overflow) + v = INT32_MAX; + else + return -1; + } + p++; + } + *pp = p; + return v; +} + +static int re_parse_expect(REParseState *s, const uint8_t **pp, int c) +{ + const uint8_t *p; + p = *pp; + if (*p != c) + return re_parse_error(s, "expecting '%c'", c); + p++; + *pp = p; + return 0; +} + +/* Parse an escape sequence, *pp points after the '\': + allow_utf16 value: + 0 : no UTF-16 escapes allowed + 1 : UTF-16 escapes allowed + 2 : UTF-16 escapes allowed and escapes of surrogate pairs are + converted to a unicode character (unicode regexp case). + + Return the unicode char and update *pp if recognized, + return -1 if malformed escape, + return -2 otherwise. */ +int lre_parse_escape(const uint8_t **pp, int allow_utf16) +{ + const uint8_t *p; + uint32_t c; + + p = *pp; + c = *p++; + switch(c) { + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'v': + c = '\v'; + break; + case 'x': + case 'u': + { + int h, n, i; + uint32_t c1; + + if (*p == '{' && allow_utf16) { + p++; + c = 0; + for(;;) { + h = from_hex(*p++); + if (h < 0) + return -1; + c = (c << 4) | h; + if (c > 0x10FFFF) + return -1; + if (*p == '}') + break; + } + p++; + } else { + if (c == 'x') { + n = 2; + } else { + n = 4; + } + + c = 0; + for(i = 0; i < n; i++) { + h = from_hex(*p++); + if (h < 0) { + return -1; + } + c = (c << 4) | h; + } + if (is_hi_surrogate(c) && + allow_utf16 == 2 && p[0] == '\\' && p[1] == 'u') { + /* convert an escaped surrogate pair into a + unicode char */ + c1 = 0; + for(i = 0; i < 4; i++) { + h = from_hex(p[2 + i]); + if (h < 0) + break; + c1 = (c1 << 4) | h; + } + if (i == 4 && is_lo_surrogate(c1)) { + p += 6; + c = from_surrogate(c, c1); + } + } + } + } + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c -= '0'; + if (allow_utf16 == 2) { + /* only accept \0 not followed by digit */ + if (c != 0 || lre_is_digit(*p)) + return -1; + } else { + /* parse a legacy octal sequence */ + uint32_t v; + v = *p - '0'; + if (v > 7) + break; + c = (c << 3) | v; + p++; + if (c >= 32) + break; + v = *p - '0'; + if (v > 7) + break; + c = (c << 3) | v; + p++; + } + break; + default: + return -2; + } + *pp = p; + return c; +} + +/* XXX: we use the same chars for name and value */ +static bool is_unicode_char(int c) +{ + return ((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c == '_')); +} + +static int parse_unicode_property(REParseState *s, CharRange *cr, + const uint8_t **pp, bool is_inv) +{ + const uint8_t *p; + char name[64], value[64]; + char *q; + bool script_ext; + int ret; + + p = *pp; + if (*p != '{') + return re_parse_error(s, "expecting '{' after \\p"); + p++; + q = name; + while (is_unicode_char(*p)) { + if ((q - name) >= sizeof(name) - 1) + goto unknown_property_name; + *q++ = *p++; + } + *q = '\0'; + q = value; + if (*p == '=') { + p++; + while (is_unicode_char(*p)) { + if ((q - value) >= sizeof(value) - 1) + return re_parse_error(s, "unknown unicode property value"); + *q++ = *p++; + } + } + *q = '\0'; + if (*p != '}') + return re_parse_error(s, "expecting '}'"); + p++; + // printf("name=%s value=%s\n", name, value); + + if (!strcmp(name, "Script") || !strcmp(name, "sc")) { + script_ext = false; + goto do_script; + } else if (!strcmp(name, "Script_Extensions") || !strcmp(name, "scx")) { + script_ext = true; + do_script: + cr_init(cr, s->opaque, lre_realloc); + ret = unicode_script(cr, value, script_ext); + if (ret) { + cr_free(cr); + if (ret == -2) + return re_parse_error(s, "unknown unicode script"); + else + goto out_of_memory; + } + } else if (!strcmp(name, "General_Category") || !strcmp(name, "gc")) { + cr_init(cr, s->opaque, lre_realloc); + ret = unicode_general_category(cr, value); + if (ret) { + cr_free(cr); + if (ret == -2) + return re_parse_error(s, "unknown unicode general category"); + else + goto out_of_memory; + } + } else if (value[0] == '\0') { + cr_init(cr, s->opaque, lre_realloc); + ret = unicode_general_category(cr, name); + if (ret == -1) { + cr_free(cr); + goto out_of_memory; + } + if (ret < 0) { + ret = unicode_prop(cr, name); + if (ret) { + cr_free(cr); + if (ret == -2) + goto unknown_property_name; + else + goto out_of_memory; + } + } + } else { + unknown_property_name: + return re_parse_error(s, "unknown unicode property name"); + } + + if (is_inv) { + if (cr_invert(cr)) { + cr_free(cr); + return -1; + } + } + *pp = p; + return 0; + out_of_memory: + return re_parse_out_of_memory(s); +} + +/* return -1 if error otherwise the character or a class range + (CLASS_RANGE_BASE). In case of class range, 'cr' is + initialized. Otherwise, it is ignored. */ +static int get_class_atom(REParseState *s, CharRange *cr, + const uint8_t **pp, bool inclass) +{ + const uint8_t *p, *p_next; + uint32_t c; + int ret; + + p = *pp; + + c = *p; + switch(c) { + case '\\': + p++; + if (p >= s->buf_end) + goto unexpected_end; + c = *p++; + switch(c) { + case 'd': + c = CHAR_RANGE_d; + goto class_range; + case 'D': + c = CHAR_RANGE_D; + goto class_range; + case 's': + c = CHAR_RANGE_s; + goto class_range; + case 'S': + c = CHAR_RANGE_S; + goto class_range; + case 'w': + c = CHAR_RANGE_w; + goto class_range; + case 'W': + c = CHAR_RANGE_W; + class_range: + if (cr_init_char_range(s, cr, c)) + return -1; + c = CLASS_RANGE_BASE; + break; + case 'c': + c = *p; + if ((c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (((c >= '0' && c <= '9') || c == '_') && + inclass && !s->is_unicode)) { /* Annex B.1.4 */ + c &= 0x1f; + p++; + } else if (s->is_unicode) { + goto invalid_escape; + } else { + /* otherwise return '\' and 'c' */ + p--; + c = '\\'; + } + break; + case 'p': + case 'P': + if (s->is_unicode) { + if (parse_unicode_property(s, cr, &p, (c == 'P'))) + return -1; + c = CLASS_RANGE_BASE; + break; + } + /* fall thru */ + default: + p--; + ret = lre_parse_escape(&p, s->is_unicode * 2); + if (ret >= 0) { + c = ret; + } else { + if (ret == -2 && *p != '\0' && strchr("^$\\.*+?()[]{}|/", *p)) { + /* always valid to escape these characters */ + goto normal_char; + } else if (s->is_unicode) { + // special case: allowed inside [] but not outside + if (ret == -2 && *p == '-' && inclass) + goto normal_char; + invalid_escape: + return re_parse_error(s, "invalid escape sequence in regular expression"); + } else { + /* just ignore the '\' */ + goto normal_char; + } + } + break; + } + break; + case '\0': + if (p >= s->buf_end) { + unexpected_end: + return re_parse_error(s, "unexpected end"); + } + /* fall thru */ + default: + normal_char: + p++; + if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) + return re_parse_error(s, "invalid UTF-8 sequence"); + p = p_next; + if (c > 0xFFFF && !s->is_unicode) { + // TODO(chqrlie): should handle non BMP-1 code points in + // the calling function and no require the source string + // to be CESU-8 encoded if not s->is_unicode + return re_parse_error(s, "malformed unicode char"); + } + } + break; + } + *pp = p; + return c; +} + +static int re_emit_range(REParseState *s, const CharRange *cr) +{ + int len, i; + uint32_t high; + + len = (unsigned)cr->len / 2; + if (len >= 65535) + return re_parse_error(s, "too many ranges"); + if (len == 0) { + /* not sure it can really happen. Emit a match that is always + false */ + re_emit_op_u32(s, REOP_char32, -1); + } else { + high = cr->points[cr->len - 1]; + if (high == UINT32_MAX) + high = cr->points[cr->len - 2]; + if (high <= 0xffff) { + /* can use 16 bit ranges with the conversion that 0xffff = + infinity */ + re_emit_op_u16(s, REOP_range, len); + for(i = 0; i < cr->len; i += 2) { + dbuf_put_u16(&s->byte_code, cr->points[i]); + high = cr->points[i + 1] - 1; + if (high == UINT32_MAX - 1) + high = 0xffff; + dbuf_put_u16(&s->byte_code, high); + } + } else { + re_emit_op_u16(s, REOP_range32, len); + for(i = 0; i < cr->len; i += 2) { + dbuf_put_u32(&s->byte_code, cr->points[i]); + dbuf_put_u32(&s->byte_code, cr->points[i + 1] - 1); + } + } + } + return 0; +} + +// s->unicode turns patterns like []] into syntax errors +// s->unicode_sets turns more patterns into errors, like [a-] or [[] +static int re_parse_char_class(REParseState *s, const uint8_t **pp) +{ + const uint8_t *p; + uint32_t c1, c2; + CharRange cr_s, *cr = &cr_s; + CharRange cr1_s, *cr1 = &cr1_s; + bool invert; + + cr_init(cr, s->opaque, lre_realloc); + p = *pp; + p++; /* skip '[' */ + + if (s->unicode_sets) { + static const char verboten[] = + "()[{}/-|" "\0" + "&&!!##$$%%**++,,..::;;<<==>>??@@``~~" "\0" + "^^^_^^"; + const char *s = verboten; + int n = 1; + do { + if (!memcmp(s, p, n)) + if (p[n] == ']') + goto invalid_class_range; + s += n; + if (!*s) { + s++; + n++; + } + } while (n < 4); + } + + invert = false; + if (*p == '^') { + p++; + invert = true; + } + + for(;;) { + if (*p == ']') + break; + c1 = get_class_atom(s, cr1, &p, true); + if ((int)c1 < 0) + goto fail; + if (*p == '-' && p[1] == ']' && s->unicode_sets) { + if (c1 >= CLASS_RANGE_BASE) + cr_free(cr1); + goto invalid_class_range; + } + if (*p == '-' && p[1] != ']') { + const uint8_t *p0 = p + 1; + if (c1 >= CLASS_RANGE_BASE) { + if (s->is_unicode) { + cr_free(cr1); + goto invalid_class_range; + } + /* Annex B: match '-' character */ + goto class_atom; + } + c2 = get_class_atom(s, cr1, &p0, true); + if ((int)c2 < 0) + goto fail; + if (c2 >= CLASS_RANGE_BASE) { + cr_free(cr1); + if (s->is_unicode) { + goto invalid_class_range; + } + /* Annex B: match '-' character */ + goto class_atom; + } + p = p0; + if (c2 < c1) { + invalid_class_range: + re_parse_error(s, "invalid class range"); + goto fail; + } + if (cr_union_interval(cr, c1, c2)) + goto memory_error; + } else { + class_atom: + if (c1 >= CLASS_RANGE_BASE) { + int ret; + ret = cr_union1(cr, cr1->points, cr1->len); + cr_free(cr1); + if (ret) + goto memory_error; + } else { + if (cr_union_interval(cr, c1, c1)) + goto memory_error; + } + } + } + if (s->ignore_case) { + if (cr_regexp_canonicalize(cr, s->is_unicode)) + goto memory_error; + } + if (invert) { + if (cr_invert(cr)) + goto memory_error; + } + if (re_emit_range(s, cr)) + goto fail; + cr_free(cr); + p++; /* skip ']' */ + *pp = p; + return 0; + memory_error: + re_parse_out_of_memory(s); + fail: + cr_free(cr); + return -1; +} + +/* Return: + - true if the opcodes may not advance the char pointer + - false if the opcodes always advance the char pointer +*/ +static bool re_need_check_advance(const uint8_t *bc_buf, int bc_buf_len) +{ + int pos, opcode, len; + uint32_t val; + bool ret; + + ret = true; + pos = 0; + + while (pos < bc_buf_len) { + opcode = bc_buf[pos]; + len = reopcode_info[opcode].size; + switch(opcode) { + case REOP_range: + val = get_u16(bc_buf + pos + 1); + len += val * 4; + goto simple_char; + case REOP_range32: + val = get_u16(bc_buf + pos + 1); + len += val * 8; + goto simple_char; + case REOP_char32: + case REOP_char16: + case REOP_char8: + case REOP_dot: + case REOP_any: + simple_char: + ret = false; + break; + case REOP_line_start: + case REOP_line_end: + case REOP_push_i32: + case REOP_push_char_pos: + case REOP_drop: + case REOP_word_boundary: + case REOP_not_word_boundary: + case REOP_prev: + /* no effect */ + break; + case REOP_save_start: + case REOP_save_end: + case REOP_save_reset: + case REOP_back_reference: + case REOP_backward_back_reference: + break; + default: + /* safe behvior: we cannot predict the outcome */ + return true; + } + pos += len; + } + return ret; +} + +/* return -1 if a simple quantifier cannot be used. Otherwise return + the number of characters in the atom. */ +static int re_is_simple_quantifier(const uint8_t *bc_buf, int bc_buf_len) +{ + int pos, opcode, len, count; + uint32_t val; + + count = 0; + pos = 0; + while (pos < bc_buf_len) { + opcode = bc_buf[pos]; + len = reopcode_info[opcode].size; + switch(opcode) { + case REOP_range: + val = get_u16(bc_buf + pos + 1); + len += val * 4; + goto simple_char; + case REOP_range32: + val = get_u16(bc_buf + pos + 1); + len += val * 8; + goto simple_char; + case REOP_char32: + case REOP_char16: + case REOP_char8: + case REOP_dot: + case REOP_any: + simple_char: + count++; + break; + case REOP_line_start: + case REOP_line_end: + case REOP_word_boundary: + case REOP_not_word_boundary: + break; + default: + return -1; + } + pos += len; + } + return count; +} + +/* '*pp' is the first char after '<' */ +static int re_parse_group_name(char *buf, int buf_size, const uint8_t **pp) +{ + const uint8_t *p, *p_next; + uint32_t c, d; + char *q; + + p = *pp; + q = buf; + for(;;) { + c = *p++; + if (c == '\\') { + if (*p != 'u') + return -1; + c = lre_parse_escape(&p, 2); // accept surrogate pairs + if ((int)c < 0) + return -1; + } else if (c == '>') { + break; + } else if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) + return -1; + p = p_next; + if (is_hi_surrogate(c)) { + d = utf8_decode(p, &p_next); + if (is_lo_surrogate(d)) { + c = from_surrogate(c, d); + p = p_next; + } + } + } + if (q == buf) { + if (!lre_js_is_ident_first(c)) + return -1; + } else { + if (!lre_js_is_ident_next(c)) + return -1; + } + if ((q - buf + UTF8_CHAR_LEN_MAX + 1) > buf_size) + return -1; + if (c < 0x80) { + *q++ = c; + } else { + q += utf8_encode((uint8_t*)q, c); + } + } + if (q == buf) + return -1; + *q = '\0'; + *pp = p; + return 0; +} + +/* if capture_name = NULL: return the number of captures + 1. + Otherwise, return the capture index corresponding to capture_name + or -1 if none */ +static int re_parse_captures(REParseState *s, int *phas_named_captures, + const char *capture_name) +{ + const uint8_t *p; + int capture_index; + char name[TMP_BUF_SIZE]; + + capture_index = 1; + *phas_named_captures = 0; + for (p = s->buf_start; p < s->buf_end; p++) { + switch (*p) { + case '(': + if (p[1] == '?') { + if (p[2] == '<' && p[3] != '=' && p[3] != '!') { + *phas_named_captures = 1; + /* potential named capture */ + if (capture_name) { + p += 3; + if (re_parse_group_name(name, sizeof(name), &p) == 0) { + if (!strcmp(name, capture_name)) + return capture_index; + } + } + capture_index++; + if (capture_index >= CAPTURE_COUNT_MAX) + goto done; + } + } else { + capture_index++; + if (capture_index >= CAPTURE_COUNT_MAX) + goto done; + } + break; + case '\\': + p++; + break; + case '[': + for (p += 1 + (*p == ']'); p < s->buf_end && *p != ']'; p++) { + if (*p == '\\') + p++; + } + break; + } + } + done: + if (capture_name) + return -1; + else + return capture_index; +} + +static int re_count_captures(REParseState *s) +{ + if (s->total_capture_count < 0) { + s->total_capture_count = re_parse_captures(s, &s->has_named_captures, + NULL); + } + return s->total_capture_count; +} + +static bool re_has_named_captures(REParseState *s) +{ + if (s->has_named_captures < 0) + re_count_captures(s); + return s->has_named_captures; +} + +static int find_group_name(REParseState *s, const char *name) +{ + const char *p, *buf_end; + size_t len, name_len; + int capture_index; + + p = (char *)s->group_names.buf; + if (!p) return -1; + buf_end = (char *)s->group_names.buf + s->group_names.size; + name_len = strlen(name); + capture_index = 1; + while (p < buf_end) { + len = strlen(p); + if (len == name_len && memcmp(name, p, name_len) == 0) + return capture_index; + p += len + 1; + capture_index++; + } + return -1; +} + +static int re_parse_disjunction(REParseState *s, bool is_backward_dir); + +static int re_parse_term(REParseState *s, bool is_backward_dir) +{ + const uint8_t *p; + int c, last_atom_start, quant_min, quant_max, last_capture_count; + bool greedy, add_zero_advance_check, is_neg, is_backward_lookahead; + CharRange cr_s, *cr = &cr_s; + + if (lre_check_size(s)) + return -1; + last_atom_start = -1; + last_capture_count = 0; + p = s->buf_ptr; + c = *p; + switch(c) { + case '^': + p++; + re_emit_op(s, REOP_line_start); + break; + case '$': + p++; + re_emit_op(s, REOP_line_end); + break; + case '.': + p++; + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + if (is_backward_dir) + re_emit_op(s, REOP_prev); + re_emit_op(s, s->dotall ? REOP_any : REOP_dot); + if (is_backward_dir) + re_emit_op(s, REOP_prev); + break; + case '{': + if (s->is_unicode) { + return re_parse_error(s, "syntax error"); + } else if (!lre_is_digit(p[1])) { + /* Annex B: we accept '{' not followed by digits as a + normal atom */ + goto parse_class_atom; + } else { + const uint8_t *p1 = p + 1; + /* Annex B: error if it is like a repetition count */ + parse_digits(&p1, true); + if (*p1 == ',') { + p1++; + if (lre_is_digit(*p1)) { + parse_digits(&p1, true); + } + } + if (*p1 != '}') { + goto parse_class_atom; + } + } + /* fall thru */ + case '*': + case '+': + case '?': + return re_parse_error(s, "nothing to repeat"); + case '(': + if (p[1] == '?') { + if (p[2] == ':') { + p += 3; + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + s->buf_ptr = p; + if (re_parse_disjunction(s, is_backward_dir)) + return -1; + p = s->buf_ptr; + if (re_parse_expect(s, &p, ')')) + return -1; + } else if ((p[2] == '=' || p[2] == '!')) { + is_neg = (p[2] == '!'); + is_backward_lookahead = false; + p += 3; + goto lookahead; + } else if (p[2] == '<' && + (p[3] == '=' || p[3] == '!')) { + int pos; + is_neg = (p[3] == '!'); + is_backward_lookahead = true; + p += 4; + /* lookahead */ + lookahead: + /* Annex B allows lookahead to be used as an atom for + the quantifiers */ + if (!s->is_unicode && !is_backward_lookahead) { + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + } + pos = re_emit_op_u32(s, REOP_lookahead + is_neg, 0); + s->buf_ptr = p; + if (re_parse_disjunction(s, is_backward_lookahead)) + return -1; + p = s->buf_ptr; + if (re_parse_expect(s, &p, ')')) + return -1; + re_emit_op(s, REOP_match); + /* jump after the 'match' after the lookahead is successful */ + if (dbuf_error(&s->byte_code)) + return -1; + put_u32(s->byte_code.buf + pos, s->byte_code.size - (pos + 4)); + } else if (p[2] == '<') { + p += 3; + if (re_parse_group_name(s->u.tmp_buf, sizeof(s->u.tmp_buf), + &p)) { + return re_parse_error(s, "invalid group name"); + } + if (find_group_name(s, s->u.tmp_buf) > 0) { + return re_parse_error(s, "duplicate group name"); + } + /* group name with a trailing zero */ + dbuf_put(&s->group_names, (uint8_t *)s->u.tmp_buf, + strlen(s->u.tmp_buf) + 1); + s->has_named_captures = 1; + goto parse_capture; + } else { + return re_parse_error(s, "invalid group"); + } + } else { + int capture_index; + p++; + /* capture without group name */ + dbuf_putc(&s->group_names, 0); + parse_capture: + if (s->capture_count >= CAPTURE_COUNT_MAX) + return re_parse_error(s, "too many captures"); + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + capture_index = s->capture_count++; + re_emit_op_u8(s, REOP_save_start + is_backward_dir, + capture_index); + + s->buf_ptr = p; + if (re_parse_disjunction(s, is_backward_dir)) + return -1; + p = s->buf_ptr; + + re_emit_op_u8(s, REOP_save_start + 1 - is_backward_dir, + capture_index); + + if (re_parse_expect(s, &p, ')')) + return -1; + } + break; + case '\\': + switch(p[1]) { + case 'b': + case 'B': + re_emit_op(s, REOP_word_boundary + (p[1] != 'b')); + p += 2; + break; + case 'k': + { + const uint8_t *p1; + int dummy_res; + + p1 = p; + if (p1[2] != '<') { + /* annex B: we tolerate invalid group names in non + unicode mode if there is no named capture + definition */ + if (s->is_unicode || re_has_named_captures(s)) + return re_parse_error(s, "expecting group name"); + else + goto parse_class_atom; + } + p1 += 3; + if (re_parse_group_name(s->u.tmp_buf, sizeof(s->u.tmp_buf), + &p1)) { + if (s->is_unicode || re_has_named_captures(s)) + return re_parse_error(s, "invalid group name"); + else + goto parse_class_atom; + } + c = find_group_name(s, s->u.tmp_buf); + if (c < 0) { + /* no capture name parsed before, try to look + after (inefficient, but hopefully not common */ + c = re_parse_captures(s, &dummy_res, s->u.tmp_buf); + if (c < 0) { + if (s->is_unicode || re_has_named_captures(s)) + return re_parse_error(s, "group name not defined"); + else + goto parse_class_atom; + } + } + p = p1; + } + goto emit_back_reference; + case '0': + p += 2; + c = 0; + if (s->is_unicode) { + if (lre_is_digit(*p)) { + return re_parse_error(s, "invalid decimal escape in regular expression"); + } + } else { + /* Annex B.1.4: accept legacy octal */ + if (*p >= '0' && *p <= '7') { + c = *p++ - '0'; + if (*p >= '0' && *p <= '7') { + c = (c << 3) + *p++ - '0'; + } + } + } + goto normal_char; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': + case '9': + { + const uint8_t *q = ++p; + + c = parse_digits(&p, false); + if (c < 0 || (c >= s->capture_count && c >= re_count_captures(s))) { + if (!s->is_unicode) { + /* Annex B.1.4: accept legacy octal */ + p = q; + if (*p <= '7') { + c = 0; + if (*p <= '3') + c = *p++ - '0'; + if (*p >= '0' && *p <= '7') { + c = (c << 3) + *p++ - '0'; + if (*p >= '0' && *p <= '7') { + c = (c << 3) + *p++ - '0'; + } + } + } else { + c = *p++; + } + goto normal_char; + } + return re_parse_error(s, "back reference out of range in regular expression"); + } + emit_back_reference: + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + re_emit_op_u8(s, REOP_back_reference + is_backward_dir, c); + } + break; + default: + goto parse_class_atom; + } + break; + case '[': + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + if (is_backward_dir) + re_emit_op(s, REOP_prev); + if (re_parse_char_class(s, &p)) + return -1; + if (is_backward_dir) + re_emit_op(s, REOP_prev); + break; + case ']': + case '}': + if (s->is_unicode) + return re_parse_error(s, "syntax error"); + goto parse_class_atom; + default: + parse_class_atom: + c = get_class_atom(s, cr, &p, false); + if ((int)c < 0) + return -1; + normal_char: + last_atom_start = s->byte_code.size; + last_capture_count = s->capture_count; + if (is_backward_dir) + re_emit_op(s, REOP_prev); + if (c >= CLASS_RANGE_BASE) { + int ret; + /* Note: canonicalization is not needed */ + ret = re_emit_range(s, cr); + cr_free(cr); + if (ret) + return -1; + } else { + if (s->ignore_case) + c = lre_canonicalize(c, s->is_unicode); + if (c <= 0x7f) + re_emit_op_u8(s, REOP_char8, c); + else if (c <= 0xffff) + re_emit_op_u16(s, REOP_char16, c); + else + re_emit_op_u32(s, REOP_char32, c); + } + if (is_backward_dir) + re_emit_op(s, REOP_prev); + break; + } + + /* quantifier */ + if (last_atom_start >= 0) { + c = *p; + switch(c) { + case '*': + p++; + quant_min = 0; + quant_max = INT32_MAX; + goto quantifier; + case '+': + p++; + quant_min = 1; + quant_max = INT32_MAX; + goto quantifier; + case '?': + p++; + quant_min = 0; + quant_max = 1; + goto quantifier; + case '{': + { + const uint8_t *p1 = p; + /* As an extension (see ES6 annex B), we accept '{' not + followed by digits as a normal atom */ + if (!lre_is_digit(p[1])) { + if (s->is_unicode) + goto invalid_quant_count; + break; + } + p++; + quant_min = parse_digits(&p, true); + quant_max = quant_min; + if (*p == ',') { + p++; + if (lre_is_digit(*p)) { + quant_max = parse_digits(&p, true); + if (quant_max < quant_min) { + invalid_quant_count: + return re_parse_error(s, "invalid repetition count"); + } + } else { + quant_max = INT32_MAX; /* infinity */ + } + } + if (*p != '}' && !s->is_unicode) { + /* Annex B: normal atom if invalid '{' syntax */ + p = p1; + break; + } + if (re_parse_expect(s, &p, '}')) + return -1; + } + quantifier: + greedy = true; + if (*p == '?') { + p++; + greedy = false; + } + if (last_atom_start < 0) { + return re_parse_error(s, "nothing to repeat"); + } + if (greedy) { + int len, pos; + + if (quant_max > 0) { + /* specific optimization for simple quantifiers */ + if (dbuf_error(&s->byte_code)) + goto out_of_memory; + len = re_is_simple_quantifier(s->byte_code.buf + last_atom_start, + s->byte_code.size - last_atom_start); + if (len > 0) { + re_emit_op(s, REOP_match); + + if (dbuf_insert(&s->byte_code, last_atom_start, 17)) + goto out_of_memory; + pos = last_atom_start; + s->byte_code.buf[pos++] = REOP_simple_greedy_quant; + put_u32(&s->byte_code.buf[pos], + s->byte_code.size - last_atom_start - 17); + pos += 4; + put_u32(&s->byte_code.buf[pos], quant_min); + pos += 4; + put_u32(&s->byte_code.buf[pos], quant_max); + pos += 4; + put_u32(&s->byte_code.buf[pos], len); + pos += 4; + goto done; + } + } + + if (dbuf_error(&s->byte_code)) + goto out_of_memory; + } + /* the spec tells that if there is no advance when + running the atom after the first quant_min times, + then there is no match. We remove this test when we + are sure the atom always advances the position. */ + add_zero_advance_check = re_need_check_advance(s->byte_code.buf + last_atom_start, + s->byte_code.size - last_atom_start); + + { + int len, pos; + len = s->byte_code.size - last_atom_start; + if (quant_min == 0) { + /* need to reset the capture in case the atom is + not executed */ + if (last_capture_count != s->capture_count) { + if (dbuf_insert(&s->byte_code, last_atom_start, 3)) + goto out_of_memory; + s->byte_code.buf[last_atom_start++] = REOP_save_reset; + s->byte_code.buf[last_atom_start++] = last_capture_count; + s->byte_code.buf[last_atom_start++] = s->capture_count - 1; + } + if (quant_max == 0) { + s->byte_code.size = last_atom_start; + } else if (quant_max == 1 || quant_max == INT32_MAX) { + bool has_goto = (quant_max == INT32_MAX); + if (dbuf_insert(&s->byte_code, last_atom_start, 5 + add_zero_advance_check)) + goto out_of_memory; + s->byte_code.buf[last_atom_start] = REOP_split_goto_first + + greedy; + put_u32(s->byte_code.buf + last_atom_start + 1, + len + 5 * has_goto + add_zero_advance_check * 2); + if (add_zero_advance_check) { + s->byte_code.buf[last_atom_start + 1 + 4] = REOP_push_char_pos; + re_emit_op(s, REOP_check_advance); + } + if (has_goto) + re_emit_goto(s, REOP_goto, last_atom_start); + } else { + if (dbuf_insert(&s->byte_code, last_atom_start, 10 + add_zero_advance_check)) + goto out_of_memory; + pos = last_atom_start; + s->byte_code.buf[pos++] = REOP_push_i32; + put_u32(s->byte_code.buf + pos, quant_max); + pos += 4; + s->byte_code.buf[pos++] = REOP_split_goto_first + greedy; + put_u32(s->byte_code.buf + pos, len + 5 + add_zero_advance_check * 2); + pos += 4; + if (add_zero_advance_check) { + s->byte_code.buf[pos++] = REOP_push_char_pos; + re_emit_op(s, REOP_check_advance); + } + re_emit_goto(s, REOP_loop, last_atom_start + 5); + re_emit_op(s, REOP_drop); + } + } else if (quant_min == 1 && quant_max == INT32_MAX && + !add_zero_advance_check) { + re_emit_goto(s, REOP_split_next_first - greedy, + last_atom_start); + } else { + if (quant_min == 1) { + /* nothing to add */ + } else { + if (dbuf_insert(&s->byte_code, last_atom_start, 5)) + goto out_of_memory; + s->byte_code.buf[last_atom_start] = REOP_push_i32; + put_u32(s->byte_code.buf + last_atom_start + 1, + quant_min); + last_atom_start += 5; + re_emit_goto(s, REOP_loop, last_atom_start); + re_emit_op(s, REOP_drop); + } + if (quant_max == INT32_MAX) { + pos = s->byte_code.size; + re_emit_op_u32(s, REOP_split_goto_first + greedy, + len + 5 + add_zero_advance_check * 2); + if (add_zero_advance_check) + re_emit_op(s, REOP_push_char_pos); + /* copy the atom */ + dbuf_put_self(&s->byte_code, last_atom_start, len); + if (add_zero_advance_check) + re_emit_op(s, REOP_check_advance); + re_emit_goto(s, REOP_goto, pos); + } else if (quant_max > quant_min) { + re_emit_op_u32(s, REOP_push_i32, quant_max - quant_min); + pos = s->byte_code.size; + re_emit_op_u32(s, REOP_split_goto_first + greedy, + len + 5 + add_zero_advance_check * 2); + if (add_zero_advance_check) + re_emit_op(s, REOP_push_char_pos); + /* copy the atom */ + dbuf_put_self(&s->byte_code, last_atom_start, len); + if (add_zero_advance_check) + re_emit_op(s, REOP_check_advance); + re_emit_goto(s, REOP_loop, pos); + re_emit_op(s, REOP_drop); + } + } + last_atom_start = -1; + } + break; + default: + break; + } + } + done: + s->buf_ptr = p; + return 0; + out_of_memory: + return re_parse_out_of_memory(s); +} + +static int re_parse_alternative(REParseState *s, bool is_backward_dir) +{ + const uint8_t *p; + int ret; + size_t start, term_start, end, term_size; + + if (lre_check_size(s)) + return -1; + start = s->byte_code.size; + for(;;) { + p = s->buf_ptr; + if (p >= s->buf_end) + break; + if (*p == '|' || *p == ')') + break; + term_start = s->byte_code.size; + ret = re_parse_term(s, is_backward_dir); + if (ret) + return ret; + if (is_backward_dir) { + /* reverse the order of the terms (XXX: inefficient, but + speed is not really critical here) */ + end = s->byte_code.size; + term_size = end - term_start; + if (dbuf_realloc(&s->byte_code, end + term_size)) + return -1; + memmove(s->byte_code.buf + start + term_size, + s->byte_code.buf + start, + end - start); + memcpy(s->byte_code.buf + start, s->byte_code.buf + end, + term_size); + } + } + return 0; +} + +static int re_parse_disjunction(REParseState *s, bool is_backward_dir) +{ + int start, len, pos; + + if (lre_check_stack_overflow(s->opaque, 0)) + return re_parse_error(s, "stack overflow"); + if (lre_check_size(s)) + return -1; + start = s->byte_code.size; + if (re_parse_alternative(s, is_backward_dir)) + return -1; + while (*s->buf_ptr == '|') { + s->buf_ptr++; + + len = s->byte_code.size - start; + + /* insert a split before the first alternative */ + if (dbuf_insert(&s->byte_code, start, 5)) { + return re_parse_out_of_memory(s); + } + s->byte_code.buf[start] = REOP_split_next_first; + put_u32(s->byte_code.buf + start + 1, len + 5); + + pos = re_emit_op_u32(s, REOP_goto, 0); + + if (re_parse_alternative(s, is_backward_dir)) + return -1; + + /* patch the goto */ + len = s->byte_code.size - (pos + 4); + put_u32(s->byte_code.buf + pos, len); + } + return 0; +} + +/* the control flow is recursive so the analysis can be linear */ +static int lre_compute_stack_size(const uint8_t *bc_buf, int bc_buf_len) +{ + int stack_size, stack_size_max, pos, opcode, len; + uint32_t val; + + stack_size = 0; + stack_size_max = 0; + bc_buf += RE_HEADER_LEN; + bc_buf_len -= RE_HEADER_LEN; + pos = 0; + while (pos < bc_buf_len) { + opcode = bc_buf[pos]; + len = reopcode_info[opcode].size; + assert(opcode < REOP_COUNT); + assert((pos + len) <= bc_buf_len); + switch(opcode) { + case REOP_push_i32: + case REOP_push_char_pos: + stack_size++; + if (stack_size > stack_size_max) { + if (stack_size > STACK_SIZE_MAX) + return -1; + stack_size_max = stack_size; + } + break; + case REOP_drop: + case REOP_check_advance: + assert(stack_size > 0); + stack_size--; + break; + case REOP_range: + val = get_u16(bc_buf + pos + 1); + len += val * 4; + break; + case REOP_range32: + val = get_u16(bc_buf + pos + 1); + len += val * 8; + break; + } + pos += len; + } + return stack_size_max; +} + +/* 'buf' must be a zero terminated UTF-8 string of length buf_len. + Return NULL if error and allocate an error message in *perror_msg, + otherwise the compiled bytecode and its length in plen. +*/ +uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size, + const char *buf, size_t buf_len, int re_flags, + void *opaque) +{ + REParseState s_s, *s = &s_s; + int stack_size; + bool is_sticky; + + memset(s, 0, sizeof(*s)); + s->opaque = opaque; + s->buf_ptr = (const uint8_t *)buf; + s->buf_end = s->buf_ptr + buf_len; + s->buf_start = s->buf_ptr; + s->re_flags = re_flags; + s->is_unicode = ((re_flags & LRE_FLAG_UNICODE) != 0); + is_sticky = ((re_flags & LRE_FLAG_STICKY) != 0); + s->ignore_case = ((re_flags & LRE_FLAG_IGNORECASE) != 0); + s->dotall = ((re_flags & LRE_FLAG_DOTALL) != 0); + s->unicode_sets = ((re_flags & LRE_FLAG_UNICODE_SETS) != 0); + s->capture_count = 1; + s->total_capture_count = -1; + s->has_named_captures = -1; + + dbuf_init2(&s->byte_code, opaque, lre_realloc); + dbuf_init2(&s->group_names, opaque, lre_realloc); + + dbuf_put_u16(&s->byte_code, re_flags); /* first element is the flags */ + dbuf_putc(&s->byte_code, 0); /* second element is the number of captures */ + dbuf_putc(&s->byte_code, 0); /* stack size */ + dbuf_put_u32(&s->byte_code, 0); /* bytecode length */ + + if (!is_sticky) { + /* iterate thru all positions (about the same as .*?( ... ) ) + . We do it without an explicit loop so that lock step + thread execution will be possible in an optimized + implementation */ + re_emit_op_u32(s, REOP_split_goto_first, 1 + 5); + re_emit_op(s, REOP_any); + re_emit_op_u32(s, REOP_goto, -(5 + 1 + 5)); + } + re_emit_op_u8(s, REOP_save_start, 0); + + if (re_parse_disjunction(s, false)) { + error: + dbuf_free(&s->byte_code); + dbuf_free(&s->group_names); + js__pstrcpy(error_msg, error_msg_size, s->u.error_msg); + *plen = 0; + return NULL; + } + + re_emit_op_u8(s, REOP_save_end, 0); + + re_emit_op(s, REOP_match); + + if (*s->buf_ptr != '\0') { + re_parse_error(s, "extraneous characters at the end"); + goto error; + } + + if (dbuf_error(&s->byte_code)) { + re_parse_out_of_memory(s); + goto error; + } + + stack_size = lre_compute_stack_size(s->byte_code.buf, s->byte_code.size); + if (stack_size < 0) { + re_parse_error(s, "too many imbricated quantifiers"); + goto error; + } + + s->byte_code.buf[RE_HEADER_CAPTURE_COUNT] = s->capture_count; + s->byte_code.buf[RE_HEADER_STACK_SIZE] = stack_size; + put_u32(s->byte_code.buf + RE_HEADER_BYTECODE_LEN, + s->byte_code.size - RE_HEADER_LEN); + + /* add the named groups if needed */ + if (s->group_names.size > (s->capture_count - 1)) { + dbuf_put(&s->byte_code, s->group_names.buf, s->group_names.size); + put_u16(s->byte_code.buf + RE_HEADER_FLAGS, + LRE_FLAG_NAMED_GROUPS | lre_get_flags(s->byte_code.buf)); + } + dbuf_free(&s->group_names); + +#ifdef DUMP_REOP + lre_dump_bytecode(s->byte_code.buf, s->byte_code.size); +#endif + + error_msg[0] = '\0'; + *plen = s->byte_code.size; + return s->byte_code.buf; +} + +static bool is_line_terminator(uint32_t c) +{ + return (c == '\n' || c == '\r' || c == CP_LS || c == CP_PS); +} + +static bool is_word_char(uint32_t c) +{ + return ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c == '_')); +} + +#define GET_CHAR(c, cptr, cbuf_end, cbuf_type) \ + do { \ + if (cbuf_type == 0) { \ + c = *cptr++; \ + } else { \ + const uint16_t *_p = (const uint16_t *)cptr; \ + const uint16_t *_end = (const uint16_t *)cbuf_end; \ + c = *_p++; \ + if (is_hi_surrogate(c)) \ + if (cbuf_type == 2) \ + if (_p < _end) \ + if (is_lo_surrogate(*_p)) \ + c = from_surrogate(c, *_p++); \ + cptr = (const void *)_p; \ + } \ + } while (0) + +#define PEEK_CHAR(c, cptr, cbuf_end, cbuf_type) \ + do { \ + if (cbuf_type == 0) { \ + c = cptr[0]; \ + } else { \ + const uint16_t *_p = (const uint16_t *)cptr; \ + const uint16_t *_end = (const uint16_t *)cbuf_end; \ + c = *_p++; \ + if (is_hi_surrogate(c)) \ + if (cbuf_type == 2) \ + if (_p < _end) \ + if (is_lo_surrogate(*_p)) \ + c = from_surrogate(c, *_p); \ + } \ + } while (0) + +#define PEEK_PREV_CHAR(c, cptr, cbuf_start, cbuf_type) \ + do { \ + if (cbuf_type == 0) { \ + c = cptr[-1]; \ + } else { \ + const uint16_t *_p = (const uint16_t *)cptr - 1; \ + const uint16_t *_start = (const uint16_t *)cbuf_start; \ + c = *_p; \ + if (is_lo_surrogate(c)) \ + if (cbuf_type == 2) \ + if (_p > _start) \ + if (is_hi_surrogate(_p[-1])) \ + c = from_surrogate(*--_p, c); \ + } \ + } while (0) + +#define GET_PREV_CHAR(c, cptr, cbuf_start, cbuf_type) \ + do { \ + if (cbuf_type == 0) { \ + cptr--; \ + c = cptr[0]; \ + } else { \ + const uint16_t *_p = (const uint16_t *)cptr - 1; \ + const uint16_t *_start = (const uint16_t *)cbuf_start; \ + c = *_p; \ + if (is_lo_surrogate(c)) \ + if (cbuf_type == 2) \ + if (_p > _start) \ + if (is_hi_surrogate(_p[-1])) \ + c = from_surrogate(*--_p, c); \ + cptr = (const void *)_p; \ + } \ + } while (0) + +#define PREV_CHAR(cptr, cbuf_start, cbuf_type) \ + do { \ + if (cbuf_type == 0) { \ + cptr--; \ + } else { \ + const uint16_t *_p = (const uint16_t *)cptr - 1; \ + const uint16_t *_start = (const uint16_t *)cbuf_start; \ + if (is_lo_surrogate(*_p)) \ + if (cbuf_type == 2) \ + if (_p > _start) \ + if (is_hi_surrogate(_p[-1])) \ + _p--; \ + cptr = (const void *)_p; \ + } \ + } while (0) + +typedef uintptr_t StackInt; + +typedef enum { + RE_EXEC_STATE_SPLIT, + RE_EXEC_STATE_LOOKAHEAD, + RE_EXEC_STATE_NEGATIVE_LOOKAHEAD, + RE_EXEC_STATE_GREEDY_QUANT, +} REExecStateEnum; + +typedef struct REExecState { + REExecStateEnum type : 8; + uint8_t stack_len; + size_t count; /* only used for RE_EXEC_STATE_GREEDY_QUANT */ + const uint8_t *cptr; + const uint8_t *pc; + void *buf[]; +} REExecState; + +typedef struct { + const uint8_t *cbuf; + const uint8_t *cbuf_end; + /* 0 = 8 bit chars, 1 = 16 bit chars, 2 = 16 bit chars, UTF-16 */ + int cbuf_type; + int capture_count; + int stack_size_max; + bool multi_line; + bool ignore_case; + bool is_unicode; + int interrupt_counter; + void *opaque; /* used for stack overflow check */ + + size_t state_size; + uint8_t *state_stack; + size_t state_stack_size; + size_t state_stack_len; +} REExecContext; + +static int push_state(REExecContext *s, + uint8_t **capture, + StackInt *stack, size_t stack_len, + const uint8_t *pc, const uint8_t *cptr, + REExecStateEnum type, size_t count) +{ + REExecState *rs; + uint8_t *new_stack; + size_t new_size, i, n; + StackInt *stack_buf; + + if (unlikely((s->state_stack_len + 1) > s->state_stack_size)) { + /* reallocate the stack */ + new_size = s->state_stack_size * 3 / 2; + if (new_size < 8) + new_size = 8; + new_stack = lre_realloc(s->opaque, s->state_stack, new_size * s->state_size); + if (!new_stack) + return -1; + s->state_stack_size = new_size; + s->state_stack = new_stack; + } + rs = (REExecState *)(s->state_stack + s->state_stack_len * s->state_size); + s->state_stack_len++; + rs->type = type; + rs->count = count; + rs->stack_len = stack_len; + rs->cptr = cptr; + rs->pc = pc; + n = 2 * s->capture_count; + for(i = 0; i < n; i++) + rs->buf[i] = capture[i]; + stack_buf = (StackInt *)(rs->buf + n); + for(i = 0; i < stack_len; i++) + stack_buf[i] = stack[i]; + return 0; +} + +static int lre_poll_timeout(REExecContext *s) +{ + if (unlikely(--s->interrupt_counter <= 0)) { + s->interrupt_counter = INTERRUPT_COUNTER_INIT; + if (lre_check_timeout(s->opaque)) + return LRE_RET_TIMEOUT; + } + return 0; +} + +/* return 1 if match, 0 if not match or < 0 if error. */ +static intptr_t lre_exec_backtrack(REExecContext *s, uint8_t **capture, + StackInt *stack, int stack_len, + const uint8_t *pc, const uint8_t *cptr, + bool no_recurse) +{ + int opcode, ret; + int cbuf_type; + uint32_t val, c; + const uint8_t *cbuf_end; + + cbuf_type = s->cbuf_type; + cbuf_end = s->cbuf_end; + + for(;;) { + // printf("top=%p: pc=%d\n", th_list.top, (int)(pc - (bc_buf + RE_HEADER_LEN))); + opcode = *pc++; + switch(opcode) { + case REOP_match: + { + REExecState *rs; + if (no_recurse) + return (intptr_t)cptr; + ret = 1; + goto recurse; + no_match: + if (no_recurse) + return 0; + ret = 0; + recurse: + for(;;) { + if (lre_poll_timeout(s)) + return LRE_RET_TIMEOUT; + if (s->state_stack_len == 0) + return ret; + rs = (REExecState *)(s->state_stack + + (s->state_stack_len - 1) * s->state_size); + if (rs->type == RE_EXEC_STATE_SPLIT) { + if (!ret) { + pop_state: + memcpy(capture, rs->buf, + sizeof(capture[0]) * 2 * s->capture_count); + pop_state1: + pc = rs->pc; + cptr = rs->cptr; + stack_len = rs->stack_len; + memcpy(stack, rs->buf + 2 * s->capture_count, + stack_len * sizeof(stack[0])); + s->state_stack_len--; + break; + } + } else if (rs->type == RE_EXEC_STATE_GREEDY_QUANT) { + if (!ret) { + uint32_t char_count, i; + memcpy(capture, rs->buf, + sizeof(capture[0]) * 2 * s->capture_count); + stack_len = rs->stack_len; + memcpy(stack, rs->buf + 2 * s->capture_count, + stack_len * sizeof(stack[0])); + pc = rs->pc; + cptr = rs->cptr; + /* go backward */ + char_count = get_u32(pc + 12); + for(i = 0; i < char_count; i++) { + PREV_CHAR(cptr, s->cbuf, cbuf_type); + } + pc = (pc + 16) + (int)get_u32(pc); + rs->cptr = cptr; + rs->count--; + if (rs->count == 0) { + s->state_stack_len--; + } + break; + } + } else { + ret = ((rs->type == RE_EXEC_STATE_LOOKAHEAD && ret) || + (rs->type == RE_EXEC_STATE_NEGATIVE_LOOKAHEAD && !ret)); + if (ret) { + /* keep the capture in case of positive lookahead */ + if (rs->type == RE_EXEC_STATE_LOOKAHEAD) + goto pop_state1; + else + goto pop_state; + } + } + s->state_stack_len--; + } + } + break; + case REOP_char32: + val = get_u32(pc); + pc += 4; + goto test_char; + case REOP_char16: + val = get_u16(pc); + pc += 2; + goto test_char; + case REOP_char8: + val = get_u8(pc); + pc += 1; + test_char: + if (cptr >= cbuf_end) + goto no_match; + GET_CHAR(c, cptr, cbuf_end, cbuf_type); + if (s->ignore_case) { + c = lre_canonicalize(c, s->is_unicode); + } + if (val != c) + goto no_match; + break; + case REOP_split_goto_first: + case REOP_split_next_first: + { + const uint8_t *pc1; + + val = get_u32(pc); + pc += 4; + if (opcode == REOP_split_next_first) { + pc1 = pc + (int)val; + } else { + pc1 = pc; + pc = pc + (int)val; + } + ret = push_state(s, capture, stack, stack_len, + pc1, cptr, RE_EXEC_STATE_SPLIT, 0); + if (ret < 0) + return LRE_RET_MEMORY_ERROR; + break; + } + case REOP_lookahead: + case REOP_negative_lookahead: + val = get_u32(pc); + pc += 4; + ret = push_state(s, capture, stack, stack_len, + pc + (int)val, cptr, + RE_EXEC_STATE_LOOKAHEAD + opcode - REOP_lookahead, + 0); + if (ret < 0) + return LRE_RET_MEMORY_ERROR; + break; + + case REOP_goto: + val = get_u32(pc); + pc += 4 + (int)val; + if (lre_poll_timeout(s)) + return LRE_RET_TIMEOUT; + break; + case REOP_line_start: + if (cptr == s->cbuf) + break; + if (!s->multi_line) + goto no_match; + PEEK_PREV_CHAR(c, cptr, s->cbuf, cbuf_type); + if (!is_line_terminator(c)) + goto no_match; + break; + case REOP_line_end: + if (cptr == cbuf_end) + break; + if (!s->multi_line) + goto no_match; + PEEK_CHAR(c, cptr, cbuf_end, cbuf_type); + if (!is_line_terminator(c)) + goto no_match; + break; + case REOP_dot: + if (cptr == cbuf_end) + goto no_match; + GET_CHAR(c, cptr, cbuf_end, cbuf_type); + if (is_line_terminator(c)) + goto no_match; + break; + case REOP_any: + if (cptr == cbuf_end) + goto no_match; + GET_CHAR(c, cptr, cbuf_end, cbuf_type); + break; + case REOP_save_start: + case REOP_save_end: + val = *pc++; + assert(val < s->capture_count); + capture[2 * val + opcode - REOP_save_start] = (uint8_t *)cptr; + break; + case REOP_save_reset: + { + uint32_t val2; + val = pc[0]; + val2 = pc[1]; + pc += 2; + assert(val2 < s->capture_count); + while (val <= val2) { + capture[2 * val] = NULL; + capture[2 * val + 1] = NULL; + val++; + } + } + break; + case REOP_push_i32: + val = get_u32(pc); + pc += 4; + stack[stack_len++] = val; + break; + case REOP_drop: + stack_len--; + break; + case REOP_loop: + val = get_u32(pc); + pc += 4; + if (--stack[stack_len - 1] != 0) { + pc += (int)val; + if (lre_poll_timeout(s)) + return LRE_RET_TIMEOUT; + } + break; + case REOP_push_char_pos: + stack[stack_len++] = (uintptr_t)cptr; + break; + case REOP_check_advance: + if (stack[--stack_len] == (uintptr_t)cptr) + goto no_match; + break; + case REOP_word_boundary: + case REOP_not_word_boundary: + { + bool v1, v2; + /* char before */ + if (cptr == s->cbuf) { + v1 = false; + } else { + PEEK_PREV_CHAR(c, cptr, s->cbuf, cbuf_type); + v1 = is_word_char(c); + } + /* current char */ + if (cptr >= cbuf_end) { + v2 = false; + } else { + PEEK_CHAR(c, cptr, cbuf_end, cbuf_type); + v2 = is_word_char(c); + } + if (v1 ^ v2 ^ (REOP_not_word_boundary - opcode)) + goto no_match; + } + break; + case REOP_back_reference: + case REOP_backward_back_reference: + { + const uint8_t *cptr1, *cptr1_end, *cptr1_start; + uint32_t c1, c2; + + val = *pc++; + if (val >= s->capture_count) + goto no_match; + cptr1_start = capture[2 * val]; + cptr1_end = capture[2 * val + 1]; + if (!cptr1_start || !cptr1_end) + break; + if (opcode == REOP_back_reference) { + cptr1 = cptr1_start; + while (cptr1 < cptr1_end) { + if (cptr >= cbuf_end) + goto no_match; + GET_CHAR(c1, cptr1, cptr1_end, cbuf_type); + GET_CHAR(c2, cptr, cbuf_end, cbuf_type); + if (s->ignore_case) { + c1 = lre_canonicalize(c1, s->is_unicode); + c2 = lre_canonicalize(c2, s->is_unicode); + } + if (c1 != c2) + goto no_match; + } + } else { + cptr1 = cptr1_end; + while (cptr1 > cptr1_start) { + if (cptr == s->cbuf) + goto no_match; + GET_PREV_CHAR(c1, cptr1, cptr1_start, cbuf_type); + GET_PREV_CHAR(c2, cptr, s->cbuf, cbuf_type); + if (s->ignore_case) { + c1 = lre_canonicalize(c1, s->is_unicode); + c2 = lre_canonicalize(c2, s->is_unicode); + } + if (c1 != c2) + goto no_match; + } + } + } + break; + case REOP_range: + { + int n; + uint32_t low, high, idx_min, idx_max, idx; + + n = get_u16(pc); /* n must be >= 1 */ + pc += 2; + if (cptr >= cbuf_end) + goto no_match; + GET_CHAR(c, cptr, cbuf_end, cbuf_type); + if (s->ignore_case) { + c = lre_canonicalize(c, s->is_unicode); + } + idx_min = 0; + low = get_u16(pc + 0 * 4); + if (c < low) + goto no_match; + idx_max = n - 1; + high = get_u16(pc + idx_max * 4 + 2); + /* 0xffff in for last value means +infinity */ + if (unlikely(c >= 0xffff) && high == 0xffff) + goto range_match; + if (c > high) + goto no_match; + while (idx_min <= idx_max) { + idx = (idx_min + idx_max) / 2; + low = get_u16(pc + idx * 4); + high = get_u16(pc + idx * 4 + 2); + if (c < low) + idx_max = idx - 1; + else if (c > high) + idx_min = idx + 1; + else + goto range_match; + } + goto no_match; + range_match: + pc += 4 * n; + } + break; + case REOP_range32: + { + int n; + uint32_t low, high, idx_min, idx_max, idx; + + n = get_u16(pc); /* n must be >= 1 */ + pc += 2; + if (cptr >= cbuf_end) + goto no_match; + GET_CHAR(c, cptr, cbuf_end, cbuf_type); + if (s->ignore_case) { + c = lre_canonicalize(c, s->is_unicode); + } + idx_min = 0; + low = get_u32(pc + 0 * 8); + if (c < low) + goto no_match; + idx_max = n - 1; + high = get_u32(pc + idx_max * 8 + 4); + if (c > high) + goto no_match; + while (idx_min <= idx_max) { + idx = (idx_min + idx_max) / 2; + low = get_u32(pc + idx * 8); + high = get_u32(pc + idx * 8 + 4); + if (c < low) + idx_max = idx - 1; + else if (c > high) + idx_min = idx + 1; + else + goto range32_match; + } + goto no_match; + range32_match: + pc += 8 * n; + } + break; + case REOP_prev: + /* go to the previous char */ + if (cptr == s->cbuf) + goto no_match; + PREV_CHAR(cptr, s->cbuf, cbuf_type); + break; + case REOP_simple_greedy_quant: + { + uint32_t next_pos, quant_min, quant_max; + size_t q; + intptr_t res; + const uint8_t *pc1; + + next_pos = get_u32(pc); + quant_min = get_u32(pc + 4); + quant_max = get_u32(pc + 8); + pc += 16; + pc1 = pc; + pc += (int)next_pos; + + q = 0; + for(;;) { + if (lre_poll_timeout(s)) + return LRE_RET_TIMEOUT; + res = lre_exec_backtrack(s, capture, stack, stack_len, + pc1, cptr, true); + if (res == LRE_RET_MEMORY_ERROR || + res == LRE_RET_TIMEOUT) + return res; + if (!res) + break; + cptr = (uint8_t *)res; + q++; + if (q >= quant_max && quant_max != INT32_MAX) + break; + } + if (q < quant_min) + goto no_match; + if (q > quant_min) { + /* will examine all matches down to quant_min */ + ret = push_state(s, capture, stack, stack_len, + pc1 - 16, cptr, + RE_EXEC_STATE_GREEDY_QUANT, + q - quant_min); + if (ret < 0) + return LRE_RET_MEMORY_ERROR; + } + } + break; + default: + abort(); + } + } +} + +/* Return 1 if match, 0 if not match or < 0 if error (see LRE_RET_x). cindex is the + starting position of the match and must be such as 0 <= cindex <= + clen. */ +int lre_exec(uint8_t **capture, + const uint8_t *bc_buf, const uint8_t *cbuf, int cindex, int clen, + int cbuf_type, void *opaque) +{ + REExecContext s_s, *s = &s_s; + int re_flags, i, alloca_size, ret; + StackInt *stack_buf; + + re_flags = lre_get_flags(bc_buf); + s->multi_line = (re_flags & LRE_FLAG_MULTILINE) != 0; + s->ignore_case = (re_flags & LRE_FLAG_IGNORECASE) != 0; + s->is_unicode = (re_flags & LRE_FLAG_UNICODE) != 0; + s->capture_count = bc_buf[RE_HEADER_CAPTURE_COUNT]; + s->stack_size_max = bc_buf[RE_HEADER_STACK_SIZE]; + s->cbuf = cbuf; + s->cbuf_end = cbuf + (clen << cbuf_type); + s->cbuf_type = cbuf_type; + if (s->cbuf_type == 1 && s->is_unicode) + s->cbuf_type = 2; + s->interrupt_counter = INTERRUPT_COUNTER_INIT; + s->opaque = opaque; + + s->state_size = sizeof(REExecState) + + s->capture_count * sizeof(capture[0]) * 2 + + s->stack_size_max * sizeof(stack_buf[0]); + s->state_stack = NULL; + s->state_stack_len = 0; + s->state_stack_size = 0; + + for(i = 0; i < s->capture_count * 2; i++) + capture[i] = NULL; + alloca_size = s->stack_size_max * sizeof(stack_buf[0]); + stack_buf = alloca(alloca_size); + ret = lre_exec_backtrack(s, capture, stack_buf, 0, bc_buf + RE_HEADER_LEN, + cbuf + (cindex << cbuf_type), false); + lre_realloc(s->opaque, s->state_stack, 0); + return ret; +} + +int lre_get_capture_count(const uint8_t *bc_buf) +{ + return bc_buf[RE_HEADER_CAPTURE_COUNT]; +} + +int lre_get_flags(const uint8_t *bc_buf) +{ + return get_u16(bc_buf + RE_HEADER_FLAGS); +} + +/* Return NULL if no group names. Otherwise, return a pointer to + 'capture_count - 1' zero terminated UTF-8 strings. */ +const char *lre_get_groupnames(const uint8_t *bc_buf) +{ + uint32_t re_bytecode_len; + if ((lre_get_flags(bc_buf) & LRE_FLAG_NAMED_GROUPS) == 0) + return NULL; + re_bytecode_len = get_u32(bc_buf + RE_HEADER_BYTECODE_LEN); + return (const char *)(bc_buf + RE_HEADER_LEN + re_bytecode_len); +} + +void lre_byte_swap(uint8_t *buf, size_t len, bool is_byte_swapped) +{ + uint8_t *p, *pe; + uint32_t n, r, nw; + + p = buf; + if (len < RE_HEADER_LEN) + abort(); + + // format is: + //
+ // + // + // + // etc. + inplace_bswap16(&p[RE_HEADER_FLAGS]); + + n = get_u32(&p[RE_HEADER_BYTECODE_LEN]); + inplace_bswap32(&p[RE_HEADER_BYTECODE_LEN]); + if (is_byte_swapped) + n = bswap32(n); + if (n > len - RE_HEADER_LEN) + abort(); + + p = &buf[RE_HEADER_LEN]; + pe = &p[n]; + + while (p < pe) { + n = reopcode_info[*p].size; + switch (n) { + case 1: + case 2: + break; + case 3: + switch (*p) { + case REOP_save_reset: // has two 8 bit arguments + break; + case REOP_range32: // variable length + nw = get_u16(&p[1]); // number of pairs of uint32_t + if (is_byte_swapped) + n = bswap16(n); + for (r = 3 + 8 * nw; n < r; n += 4) + inplace_bswap32(&p[n]); + goto doswap16; + case REOP_range: // variable length + nw = get_u16(&p[1]); // number of pairs of uint16_t + if (is_byte_swapped) + n = bswap16(n); + for (r = 3 + 4 * nw; n < r; n += 2) + inplace_bswap16(&p[n]); + goto doswap16; + default: + doswap16: + inplace_bswap16(&p[1]); + break; + } + break; + case 5: + inplace_bswap32(&p[1]); + break; + case 17: + assert(*p == REOP_simple_greedy_quant); + inplace_bswap32(&p[1]); + inplace_bswap32(&p[5]); + inplace_bswap32(&p[9]); + inplace_bswap32(&p[13]); + break; + default: + abort(); + } + p = &p[n]; + } +} + +#ifdef TEST + +bool lre_check_stack_overflow(void *opaque, size_t alloca_size) +{ + return false; +} + +void *lre_realloc(void *opaque, void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +int main(int argc, char **argv) +{ + int len, flags, ret, i; + uint8_t *bc; + char error_msg[64]; + uint8_t *capture[CAPTURE_COUNT_MAX * 2]; + const char *input; + int input_len, capture_count; + + if (argc < 4) { + printf("usage: %s regexp flags input\n", argv[0]); + exit(1); + } + flags = atoi(argv[2]); + bc = lre_compile(&len, error_msg, sizeof(error_msg), argv[1], + strlen(argv[1]), flags, NULL); + if (!bc) { + fprintf(stderr, "error: %s\n", error_msg); + exit(1); + } + + input = argv[3]; + input_len = strlen(input); + + ret = lre_exec(capture, bc, (uint8_t *)input, 0, input_len, 0, NULL); + printf("ret=%d\n", ret); + if (ret == 1) { + capture_count = lre_get_capture_count(bc); + for(i = 0; i < 2 * capture_count; i++) { + uint8_t *ptr; + ptr = capture[i]; + printf("%d: ", i); + if (!ptr) + printf(""); + else + printf("%u", (int)(ptr - (uint8_t *)input)); + printf("\n"); + } + } + return 0; +} +#endif diff --git a/Plugins/Schema/external/quickjs/src/libregexp.h b/Plugins/Schema/external/quickjs/src/libregexp.h new file mode 100644 index 0000000000..898e9a7a30 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libregexp.h @@ -0,0 +1,97 @@ +/* + * Regular Expression Engine + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef LIBREGEXP_H +#define LIBREGEXP_H + +#include +#include + +#include "libunicode.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LRE_FLAG_GLOBAL (1 << 0) +#define LRE_FLAG_IGNORECASE (1 << 1) +#define LRE_FLAG_MULTILINE (1 << 2) +#define LRE_FLAG_DOTALL (1 << 3) +#define LRE_FLAG_UNICODE (1 << 4) +#define LRE_FLAG_STICKY (1 << 5) +#define LRE_FLAG_INDICES (1 << 6) /* Unused by libregexp, just recorded. */ +#define LRE_FLAG_NAMED_GROUPS (1 << 7) /* named groups are present in the regexp */ +#define LRE_FLAG_UNICODE_SETS (1 << 8) + +#define LRE_RET_MEMORY_ERROR (-1) +#define LRE_RET_TIMEOUT (-2) + +uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size, + const char *buf, size_t buf_len, int re_flags, + void *opaque); +int lre_get_capture_count(const uint8_t *bc_buf); +int lre_get_flags(const uint8_t *bc_buf); +const char *lre_get_groupnames(const uint8_t *bc_buf); +int lre_exec(uint8_t **capture, + const uint8_t *bc_buf, const uint8_t *cbuf, int cindex, int clen, + int cbuf_type, void *opaque); + +int lre_parse_escape(const uint8_t **pp, int allow_utf16); +bool lre_is_space(int c); + +void lre_byte_swap(uint8_t *buf, size_t len, bool is_byte_swapped); + +/* must be provided by the user */ +bool lre_check_stack_overflow(void *opaque, size_t alloca_size); +/* must be provided by the user, return non zero if time out */ +int lre_check_timeout(void *opaque); +void *lre_realloc(void *opaque, void *ptr, size_t size); + +/* JS identifier test */ +extern uint32_t const lre_id_start_table_ascii[4]; +extern uint32_t const lre_id_continue_table_ascii[4]; + +static inline int lre_js_is_ident_first(int c) +{ + if ((uint32_t)c < 128) { + return (lre_id_start_table_ascii[c >> 5] >> (c & 31)) & 1; + } else { + return lre_is_id_start(c); + } +} + +static inline int lre_js_is_ident_next(int c) +{ + if ((uint32_t)c < 128) { + return (lre_id_continue_table_ascii[c >> 5] >> (c & 31)) & 1; + } else { + /* ZWNJ and ZWJ are accepted in identifiers */ + return lre_is_id_continue(c) || c == 0x200C || c == 0x200D; + } +} + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + +#endif /* LIBREGEXP_H */ diff --git a/Plugins/Schema/external/quickjs/src/libunicode-table.h b/Plugins/Schema/external/quickjs/src/libunicode-table.h new file mode 100644 index 0000000000..c75e9e3871 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libunicode-table.h @@ -0,0 +1,4707 @@ +/* Compressed unicode tables */ +/* Automatically generated file - do not edit */ + +#include + +static const uint32_t case_conv_table1[378] = { + 0x00209a30, 0x00309a00, 0x005a8173, 0x00601730, + 0x006c0730, 0x006f81b3, 0x00701700, 0x007c0700, + 0x007f8100, 0x00803040, 0x009801c3, 0x00988190, + 0x00990640, 0x009c9040, 0x00a481b4, 0x00a52e40, + 0x00bc0130, 0x00bc8640, 0x00bf8170, 0x00c00100, + 0x00c08130, 0x00c10440, 0x00c30130, 0x00c38240, + 0x00c48230, 0x00c58240, 0x00c70130, 0x00c78130, + 0x00c80130, 0x00c88240, 0x00c98130, 0x00ca0130, + 0x00ca8100, 0x00cb0130, 0x00cb8130, 0x00cc0240, + 0x00cd0100, 0x00cd8101, 0x00ce0130, 0x00ce8130, + 0x00cf0100, 0x00cf8130, 0x00d00640, 0x00d30130, + 0x00d38240, 0x00d48130, 0x00d60240, 0x00d70130, + 0x00d78240, 0x00d88230, 0x00d98440, 0x00db8130, + 0x00dc0240, 0x00de0240, 0x00df8100, 0x00e20350, + 0x00e38350, 0x00e50350, 0x00e69040, 0x00ee8100, + 0x00ef1240, 0x00f801b4, 0x00f88350, 0x00fa0240, + 0x00fb0130, 0x00fb8130, 0x00fc2840, 0x01100130, + 0x01111240, 0x011d0131, 0x011d8240, 0x011e8130, + 0x011f0131, 0x011f8201, 0x01208240, 0x01218130, + 0x01220130, 0x01228130, 0x01230a40, 0x01280101, + 0x01288101, 0x01290101, 0x01298100, 0x012a0100, + 0x012b0200, 0x012c8100, 0x012d8100, 0x012e0101, + 0x01300100, 0x01308101, 0x01318100, 0x01320101, + 0x01328101, 0x01330101, 0x01340100, 0x01348100, + 0x01350101, 0x01358101, 0x01360101, 0x01378100, + 0x01388101, 0x01390100, 0x013a8100, 0x013e8101, + 0x01400100, 0x01410101, 0x01418100, 0x01438101, + 0x01440100, 0x01448100, 0x01450200, 0x01460100, + 0x01490100, 0x014e8101, 0x014f0101, 0x01a28173, + 0x01b80440, 0x01bb0240, 0x01bd8300, 0x01bf8130, + 0x01c30130, 0x01c40330, 0x01c60130, 0x01c70230, + 0x01c801d0, 0x01c89130, 0x01d18930, 0x01d60100, + 0x01d68300, 0x01d801d3, 0x01d89100, 0x01e10173, + 0x01e18900, 0x01e60100, 0x01e68200, 0x01e78130, + 0x01e80173, 0x01e88173, 0x01ea8173, 0x01eb0173, + 0x01eb8100, 0x01ec1840, 0x01f80173, 0x01f88173, + 0x01f90100, 0x01f98100, 0x01fa01a0, 0x01fa8173, + 0x01fb8240, 0x01fc8130, 0x01fd0240, 0x01fe8330, + 0x02001030, 0x02082030, 0x02182000, 0x02281000, + 0x02302240, 0x02453640, 0x02600130, 0x02608e40, + 0x02678100, 0x02686040, 0x0298a630, 0x02b0a600, + 0x02c381b5, 0x08502631, 0x08638131, 0x08668131, + 0x08682b00, 0x087e8300, 0x09d05011, 0x09f80610, + 0x09fc0620, 0x0e400174, 0x0e408174, 0x0e410174, + 0x0e418174, 0x0e420174, 0x0e428174, 0x0e430174, + 0x0e438180, 0x0e440180, 0x0e448240, 0x0e482b30, + 0x0e5e8330, 0x0ebc8101, 0x0ebe8101, 0x0ec70101, + 0x0f007e40, 0x0f3f1840, 0x0f4b01b5, 0x0f4b81b6, + 0x0f4c01b6, 0x0f4c81b6, 0x0f4d01b7, 0x0f4d8180, + 0x0f4f0130, 0x0f506040, 0x0f800800, 0x0f840830, + 0x0f880600, 0x0f8c0630, 0x0f900800, 0x0f940830, + 0x0f980800, 0x0f9c0830, 0x0fa00600, 0x0fa40630, + 0x0fa801b0, 0x0fa88100, 0x0fa901d3, 0x0fa98100, + 0x0faa01d3, 0x0faa8100, 0x0fab01d3, 0x0fab8100, + 0x0fac8130, 0x0fad8130, 0x0fae8130, 0x0faf8130, + 0x0fb00800, 0x0fb40830, 0x0fb80200, 0x0fb90400, + 0x0fbb0201, 0x0fbc0201, 0x0fbd0201, 0x0fbe0201, + 0x0fc008b7, 0x0fc40867, 0x0fc808b8, 0x0fcc0868, + 0x0fd008b8, 0x0fd40868, 0x0fd80200, 0x0fd901b9, + 0x0fd981b1, 0x0fda01b9, 0x0fdb01b1, 0x0fdb81d7, + 0x0fdc0230, 0x0fdd0230, 0x0fde0161, 0x0fdf0173, + 0x0fe101b9, 0x0fe181b2, 0x0fe201ba, 0x0fe301b2, + 0x0fe381d8, 0x0fe40430, 0x0fe60162, 0x0fe80201, + 0x0fe901d0, 0x0fe981d0, 0x0feb01b0, 0x0feb81d0, + 0x0fec0230, 0x0fed0230, 0x0ff00201, 0x0ff101d3, + 0x0ff181d3, 0x0ff201ba, 0x0ff28101, 0x0ff301b0, + 0x0ff381d3, 0x0ff40231, 0x0ff50230, 0x0ff60131, + 0x0ff901ba, 0x0ff981b2, 0x0ffa01bb, 0x0ffb01b2, + 0x0ffb81d9, 0x0ffc0230, 0x0ffd0230, 0x0ffe0162, + 0x109301a0, 0x109501a0, 0x109581a0, 0x10990131, + 0x10a70101, 0x10b01031, 0x10b81001, 0x10c18240, + 0x125b1a31, 0x12681a01, 0x16003031, 0x16183001, + 0x16300240, 0x16310130, 0x16318130, 0x16320130, + 0x16328100, 0x16330100, 0x16338640, 0x16368130, + 0x16370130, 0x16378130, 0x16380130, 0x16390240, + 0x163a8240, 0x163f0230, 0x16406440, 0x16758440, + 0x16790240, 0x16802600, 0x16938100, 0x16968100, + 0x53202e40, 0x53401c40, 0x53910e40, 0x53993e40, + 0x53bc8440, 0x53be8130, 0x53bf0a40, 0x53c58240, + 0x53c68130, 0x53c80440, 0x53ca0101, 0x53cb1440, + 0x53d50130, 0x53d58130, 0x53d60130, 0x53d68130, + 0x53d70130, 0x53d80130, 0x53d88130, 0x53d90130, + 0x53d98131, 0x53da1040, 0x53e20131, 0x53e28130, + 0x53e30130, 0x53e38440, 0x53e58130, 0x53e61040, + 0x53ee0130, 0x53fa8240, 0x55a98101, 0x55b85020, + 0x7d8001b2, 0x7d8081b2, 0x7d8101b2, 0x7d8181da, + 0x7d8201da, 0x7d8281b3, 0x7d8301b3, 0x7d8981bb, + 0x7d8a01bb, 0x7d8a81bb, 0x7d8b01bc, 0x7d8b81bb, + 0x7f909a31, 0x7fa09a01, 0x82002831, 0x82142801, + 0x82582431, 0x826c2401, 0x82b80b31, 0x82be0f31, + 0x82c60731, 0x82ca0231, 0x82cb8b01, 0x82d18f01, + 0x82d98701, 0x82dd8201, 0x86403331, 0x86603301, + 0x86a81631, 0x86b81601, 0x8c502031, 0x8c602001, + 0xb7202031, 0xb7302001, 0xb7501931, 0xb75d9901, + 0xf4802231, 0xf4912201, +}; + +static const uint8_t case_conv_table2[378] = { + 0x01, 0x00, 0x9c, 0x06, 0x07, 0x4d, 0x03, 0x04, + 0x10, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x11, 0x00, + 0x08, 0x00, 0x53, 0x4b, 0x52, 0x00, 0x53, 0x00, + 0x54, 0x00, 0x3b, 0x55, 0x56, 0x00, 0x58, 0x5a, + 0x40, 0x5f, 0x5e, 0x00, 0x47, 0x50, 0x63, 0x65, + 0x43, 0x66, 0x00, 0x68, 0x00, 0x6a, 0x00, 0x6c, + 0x00, 0x6e, 0x00, 0x70, 0x00, 0x00, 0x41, 0x00, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x93, 0x00, 0x00, + 0x20, 0x36, 0x00, 0x28, 0x00, 0x24, 0x00, 0x24, + 0x25, 0x2d, 0x00, 0x13, 0x6d, 0x6f, 0x00, 0x29, + 0x27, 0x2a, 0x14, 0x16, 0x18, 0x1b, 0x1c, 0x41, + 0x1e, 0x42, 0x1f, 0x4e, 0x3c, 0x40, 0x22, 0x21, + 0x44, 0x21, 0x43, 0x26, 0x28, 0x27, 0x29, 0x23, + 0x2b, 0x4b, 0x2d, 0x46, 0x2f, 0x4c, 0x31, 0x4d, + 0x33, 0x47, 0x45, 0x99, 0x00, 0x00, 0x97, 0x91, + 0x7f, 0x80, 0x85, 0x86, 0x12, 0x82, 0x84, 0x78, + 0x79, 0x12, 0x7d, 0xa3, 0x7e, 0x7a, 0x7b, 0x8c, + 0x92, 0x98, 0xa6, 0xa0, 0x87, 0x00, 0x9a, 0xa1, + 0x95, 0x77, 0x33, 0x95, 0x00, 0x90, 0x00, 0x76, + 0x9b, 0x9a, 0x99, 0x98, 0x00, 0x00, 0xa0, 0x00, + 0x9e, 0x00, 0xa3, 0xa2, 0x15, 0x31, 0x32, 0x33, + 0xb7, 0xb8, 0x53, 0xac, 0xab, 0x12, 0x14, 0x1e, + 0x21, 0x22, 0x22, 0x2a, 0x34, 0x35, 0x00, 0xa8, + 0xa9, 0x39, 0x22, 0x4c, 0x00, 0x00, 0x97, 0x01, + 0x5a, 0xda, 0x1d, 0x36, 0x05, 0x00, 0xc7, 0xc6, + 0xc9, 0xc8, 0xcb, 0xca, 0xcd, 0xcc, 0xcf, 0xce, + 0xc4, 0xd8, 0x45, 0xd9, 0x42, 0xda, 0x46, 0xdb, + 0xd1, 0xd3, 0xd5, 0xd7, 0xdd, 0xdc, 0xf1, 0xf9, + 0x01, 0x11, 0x0a, 0x12, 0x80, 0x9f, 0x00, 0x21, + 0x80, 0xa3, 0xf0, 0x00, 0xc0, 0x40, 0xc6, 0x60, + 0xea, 0xde, 0xe6, 0x99, 0xc0, 0x00, 0x00, 0x06, + 0x60, 0xdf, 0x29, 0x00, 0x15, 0x12, 0x06, 0x16, + 0xfb, 0xe0, 0x09, 0x15, 0x12, 0x84, 0x0b, 0xc6, + 0x16, 0x02, 0xe2, 0x06, 0xc0, 0x40, 0x00, 0x46, + 0x60, 0xe1, 0xe3, 0x6d, 0x37, 0x38, 0x39, 0x18, + 0x17, 0x1a, 0x19, 0x00, 0x1d, 0x1c, 0x1f, 0x1e, + 0x00, 0x61, 0xba, 0x67, 0x45, 0x48, 0x00, 0x50, + 0x64, 0x4f, 0x51, 0x00, 0x00, 0x49, 0x00, 0x00, + 0x00, 0xa5, 0xa6, 0xa7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0x5c, 0x00, 0x4a, 0x00, + 0x5d, 0x57, 0x59, 0x62, 0x60, 0x72, 0x6b, 0x71, + 0x52, 0x00, 0x3e, 0x69, 0xbb, 0x00, 0x5b, 0x00, + 0x25, 0x00, 0x48, 0xaa, 0x8a, 0x8b, 0x8c, 0xab, + 0xac, 0x58, 0x58, 0xaf, 0x94, 0xb0, 0x6f, 0xb2, + 0x61, 0x60, 0x63, 0x62, 0x65, 0x64, 0x6a, 0x6b, + 0x6c, 0x6d, 0x66, 0x67, 0x68, 0x69, 0x6f, 0x6e, + 0x71, 0x70, 0x73, 0x72, 0x75, 0x74, 0x77, 0x76, + 0x79, 0x78, +}; + +static const uint16_t case_conv_ext[58] = { + 0x0399, 0x0308, 0x0301, 0x03a5, 0x0313, 0x0300, 0x0342, 0x0391, + 0x0397, 0x03a9, 0x0046, 0x0049, 0x004c, 0x0053, 0x0069, 0x0307, + 0x02bc, 0x004e, 0x004a, 0x030c, 0x0535, 0x0552, 0x0048, 0x0331, + 0x0054, 0x0057, 0x030a, 0x0059, 0x0041, 0x02be, 0x1f08, 0x1f80, + 0x1f28, 0x1f90, 0x1f68, 0x1fa0, 0x1fba, 0x0386, 0x1fb3, 0x1fca, + 0x0389, 0x1fc3, 0x03a1, 0x1ffa, 0x038f, 0x1ff3, 0x0544, 0x0546, + 0x053b, 0x054e, 0x053d, 0x03b8, 0x0462, 0xa64a, 0x1e60, 0x03c9, + 0x006b, 0x00e5, +}; + +static const uint8_t unicode_prop_Cased1_table[190] = { + 0x40, 0xa9, 0x80, 0x8e, 0x80, 0xfc, 0x80, 0xd3, + 0x80, 0x9b, 0x81, 0x8d, 0x02, 0x80, 0xe1, 0x80, + 0x91, 0x85, 0x9a, 0x01, 0x00, 0x01, 0x11, 0x03, + 0x04, 0x08, 0x01, 0x08, 0x30, 0x08, 0x01, 0x15, + 0x20, 0x01, 0x31, 0x99, 0x31, 0x9d, 0x84, 0x40, + 0x94, 0x80, 0xd6, 0x82, 0xa6, 0x80, 0x41, 0x62, + 0x80, 0xa6, 0x80, 0x4b, 0x72, 0x80, 0x4c, 0x02, + 0xf8, 0x02, 0x80, 0x8f, 0x80, 0xb0, 0x40, 0xdb, + 0x08, 0x80, 0x41, 0xd0, 0x80, 0x8c, 0x80, 0x8f, + 0x8c, 0xe4, 0x03, 0x01, 0x89, 0x00, 0x14, 0x28, + 0x10, 0x11, 0x02, 0x01, 0x18, 0x0b, 0x24, 0x4b, + 0x26, 0x01, 0x01, 0x86, 0xe5, 0x80, 0x60, 0x79, + 0xb6, 0x81, 0x40, 0x91, 0x81, 0xbd, 0x88, 0x94, + 0x05, 0x80, 0x98, 0x80, 0xc0, 0x1a, 0x82, 0x43, + 0x34, 0xa2, 0x06, 0x80, 0x8d, 0x60, 0x5c, 0x15, + 0x01, 0x10, 0xa9, 0x80, 0x88, 0x60, 0xcc, 0x44, + 0xd4, 0x80, 0xc6, 0x01, 0x08, 0x09, 0x0b, 0x80, + 0x8b, 0x00, 0x06, 0x80, 0xc0, 0x03, 0x0f, 0x06, + 0x80, 0x9b, 0x03, 0x04, 0x00, 0x16, 0x80, 0x41, + 0x53, 0x81, 0x98, 0x80, 0x98, 0x80, 0x9e, 0x80, + 0x98, 0x80, 0x9e, 0x80, 0x98, 0x80, 0x9e, 0x80, + 0x98, 0x80, 0x9e, 0x80, 0x98, 0x07, 0x47, 0x33, + 0x89, 0x80, 0x93, 0x2d, 0x41, 0x04, 0xbd, 0x50, + 0xc1, 0x99, 0x85, 0x99, 0x85, 0x99, +}; + +static const uint8_t unicode_prop_Cased1_index[18] = { + 0xb9, 0x02, 0x80, 0xa0, 0x1e, 0x40, 0x9e, 0xa6, + 0x40, 0x55, 0xd4, 0x21, 0x15, 0xd7, 0x21, 0x8a, + 0xf1, 0x01, +}; + +static const uint8_t unicode_prop_Case_Ignorable_table[785] = { + 0xa6, 0x05, 0x80, 0x8a, 0x80, 0xa2, 0x00, 0x80, + 0xc6, 0x03, 0x00, 0x03, 0x01, 0x81, 0x41, 0xf6, + 0x40, 0xbf, 0x19, 0x18, 0x88, 0x08, 0x80, 0x40, + 0xfa, 0x86, 0x40, 0xce, 0x04, 0x80, 0xb0, 0xac, + 0x00, 0x01, 0x01, 0x00, 0xab, 0x80, 0x8a, 0x85, + 0x89, 0x8a, 0x00, 0xa2, 0x80, 0x89, 0x94, 0x8f, + 0x80, 0xe4, 0x38, 0x89, 0x03, 0xa0, 0x00, 0x80, + 0x9d, 0x9a, 0xda, 0x8a, 0xb9, 0x8a, 0x18, 0x08, + 0x97, 0x97, 0xaa, 0x82, 0xab, 0x06, 0x0c, 0x88, + 0xa8, 0xb9, 0xb6, 0x00, 0x03, 0x3b, 0x02, 0x86, + 0x89, 0x81, 0x8c, 0x80, 0x8e, 0x80, 0xb9, 0x03, + 0x1f, 0x80, 0x93, 0x81, 0x99, 0x01, 0x81, 0xb8, + 0x03, 0x0b, 0x09, 0x12, 0x80, 0x9d, 0x0a, 0x80, + 0x8a, 0x81, 0xb8, 0x03, 0x20, 0x0b, 0x80, 0x93, + 0x81, 0x95, 0x28, 0x80, 0xb9, 0x01, 0x00, 0x1f, + 0x06, 0x81, 0x8a, 0x81, 0x9d, 0x80, 0xbc, 0x80, + 0x8b, 0x80, 0xb1, 0x02, 0x80, 0xb6, 0x00, 0x14, + 0x10, 0x1e, 0x81, 0x8a, 0x81, 0x9c, 0x80, 0xb9, + 0x01, 0x05, 0x04, 0x81, 0x93, 0x81, 0x9b, 0x81, + 0xb8, 0x0b, 0x1f, 0x80, 0x93, 0x81, 0x9c, 0x80, + 0xc7, 0x06, 0x10, 0x80, 0xd9, 0x01, 0x86, 0x8a, + 0x88, 0xe1, 0x01, 0x88, 0x88, 0x00, 0x86, 0xc8, + 0x81, 0x9a, 0x00, 0x00, 0x80, 0xb6, 0x8d, 0x04, + 0x01, 0x84, 0x8a, 0x80, 0xa3, 0x88, 0x80, 0xe5, + 0x18, 0x28, 0x09, 0x81, 0x98, 0x0b, 0x82, 0x8f, + 0x83, 0x8c, 0x01, 0x0d, 0x80, 0x8e, 0x80, 0xdd, + 0x80, 0x42, 0x5f, 0x82, 0x43, 0xb1, 0x82, 0x9c, + 0x81, 0x9d, 0x81, 0x9d, 0x81, 0xbf, 0x08, 0x37, + 0x01, 0x8a, 0x10, 0x20, 0xac, 0x84, 0xb2, 0x80, + 0xc0, 0x81, 0xa1, 0x80, 0xf5, 0x13, 0x81, 0x88, + 0x05, 0x82, 0x40, 0xda, 0x09, 0x80, 0xb9, 0x00, + 0x30, 0x00, 0x01, 0x3d, 0x89, 0x08, 0xa6, 0x07, + 0xad, 0x81, 0x8b, 0x93, 0x83, 0xaf, 0x00, 0x20, + 0x04, 0x80, 0xa7, 0x88, 0x8b, 0x81, 0x9f, 0x19, + 0x08, 0x82, 0xb7, 0x00, 0x0a, 0x00, 0x82, 0xb9, + 0x39, 0x81, 0xbf, 0x85, 0xd1, 0x10, 0x8c, 0x06, + 0x18, 0x28, 0x11, 0xb1, 0xbe, 0x8c, 0x80, 0xa1, + 0xe4, 0x41, 0xbc, 0x00, 0x82, 0x8a, 0x82, 0x8c, + 0x82, 0x8c, 0x82, 0x8c, 0x81, 0x8b, 0x27, 0x81, + 0x89, 0x01, 0x01, 0x84, 0xb0, 0x20, 0x89, 0x00, + 0x8c, 0x80, 0x8f, 0x8c, 0xb2, 0xa0, 0x4b, 0x8a, + 0x81, 0xf0, 0x82, 0xfc, 0x80, 0x8e, 0x80, 0xdf, + 0x9f, 0xae, 0x80, 0x41, 0xd4, 0x80, 0xa3, 0x1a, + 0x24, 0x80, 0xdc, 0x85, 0xdc, 0x82, 0x60, 0x6f, + 0x15, 0x80, 0x44, 0xe1, 0x85, 0x41, 0x0d, 0x80, + 0xe1, 0x18, 0x89, 0x00, 0x9b, 0x83, 0xcf, 0x81, + 0x8d, 0xa1, 0xcd, 0x80, 0x96, 0x82, 0xe5, 0x1a, + 0x0f, 0x02, 0x03, 0x80, 0x98, 0x0c, 0x80, 0x40, + 0x96, 0x81, 0x99, 0x91, 0x8c, 0x80, 0xa5, 0x87, + 0x98, 0x8a, 0xad, 0x82, 0xaf, 0x01, 0x19, 0x81, + 0x90, 0x80, 0x94, 0x81, 0xc1, 0x29, 0x09, 0x81, + 0x8b, 0x07, 0x80, 0xa2, 0x80, 0x8a, 0x80, 0xb2, + 0x00, 0x11, 0x0c, 0x08, 0x80, 0x9a, 0x80, 0x8d, + 0x0c, 0x08, 0x80, 0xe3, 0x84, 0x88, 0x82, 0xf8, + 0x01, 0x03, 0x80, 0x60, 0x4f, 0x2f, 0x80, 0x40, + 0x92, 0x90, 0x42, 0x3c, 0x8f, 0x10, 0x8b, 0x8f, + 0xa1, 0x01, 0x80, 0x40, 0xa8, 0x06, 0x05, 0x80, + 0x8a, 0x80, 0xa2, 0x00, 0x80, 0xae, 0x80, 0xac, + 0x81, 0xc2, 0x80, 0x94, 0x82, 0x42, 0x00, 0x80, + 0x40, 0xe1, 0x80, 0x40, 0x94, 0x84, 0x44, 0x04, + 0x28, 0xa9, 0x80, 0x88, 0x42, 0x45, 0x10, 0x0c, + 0x83, 0xa7, 0x13, 0x80, 0x40, 0xa4, 0x81, 0x42, + 0x3c, 0x83, 0xa5, 0x80, 0x99, 0x20, 0x80, 0x41, + 0x3a, 0x81, 0x97, 0x80, 0xb3, 0x85, 0xc5, 0x8a, + 0xb0, 0x83, 0xfa, 0x80, 0xb5, 0x8e, 0xa8, 0x01, + 0x81, 0x89, 0x82, 0xb0, 0x19, 0x09, 0x03, 0x80, + 0x89, 0x80, 0xb1, 0x82, 0xa3, 0x20, 0x87, 0xbd, + 0x80, 0x8b, 0x81, 0xb3, 0x88, 0x89, 0x19, 0x80, + 0xde, 0x11, 0x00, 0x0d, 0x01, 0x80, 0x40, 0x9c, + 0x02, 0x87, 0x94, 0x81, 0xb8, 0x0a, 0x80, 0xa4, + 0x32, 0x84, 0xc5, 0x85, 0x8c, 0x00, 0x00, 0x80, + 0x8d, 0x81, 0xd4, 0x39, 0x10, 0x80, 0x96, 0x80, + 0xd3, 0x28, 0x03, 0x08, 0x81, 0x40, 0xed, 0x1d, + 0x08, 0x81, 0x9a, 0x81, 0xd4, 0x39, 0x00, 0x81, + 0xe9, 0x00, 0x01, 0x28, 0x80, 0xe4, 0x00, 0x01, + 0x18, 0x84, 0x41, 0x02, 0x88, 0x01, 0x40, 0xff, + 0x08, 0x03, 0x80, 0x40, 0x8f, 0x19, 0x0b, 0x80, + 0x9f, 0x89, 0xa7, 0x29, 0x1f, 0x80, 0x88, 0x29, + 0x82, 0xad, 0x8c, 0x01, 0x40, 0xc5, 0x00, 0x10, + 0x80, 0x40, 0xc8, 0x30, 0x28, 0x80, 0xd1, 0x95, + 0x0e, 0x01, 0x01, 0xf9, 0x2a, 0x00, 0x08, 0x30, + 0x80, 0xc7, 0x0a, 0x00, 0x80, 0xc0, 0x80, 0x41, + 0x18, 0x81, 0x8a, 0x81, 0xb3, 0x24, 0x00, 0x80, + 0x96, 0x80, 0x54, 0xd4, 0x90, 0x85, 0x8e, 0x60, + 0x2c, 0xc7, 0x8b, 0x12, 0x49, 0xbf, 0x84, 0xba, + 0x86, 0x88, 0x83, 0x41, 0xfb, 0x82, 0xa7, 0x81, + 0x41, 0xe1, 0x80, 0xbe, 0x90, 0xbf, 0x08, 0x81, + 0x8c, 0x81, 0x60, 0x3f, 0xfb, 0x18, 0x30, 0x81, + 0x4c, 0x9d, 0x08, 0x83, 0x52, 0x5b, 0xad, 0x81, + 0x96, 0x42, 0x1f, 0x82, 0x88, 0x8f, 0x0e, 0x9d, + 0x83, 0x40, 0x93, 0x82, 0x47, 0xba, 0xb6, 0x83, + 0xb1, 0x38, 0x8d, 0x80, 0x95, 0x20, 0x8e, 0x45, + 0x4f, 0x30, 0x90, 0x0e, 0x01, 0x04, 0x84, 0xbd, + 0xa0, 0x80, 0x40, 0x9f, 0x8d, 0x41, 0x6f, 0x80, + 0xbc, 0x83, 0x41, 0xfa, 0x84, 0x40, 0xfd, 0x81, + 0x40, 0xf2, 0x01, 0x06, 0x0c, 0x80, 0x88, 0x80, + 0x41, 0xcf, 0x86, 0xec, 0x87, 0x4a, 0xae, 0x84, + 0x6c, 0x0c, 0x00, 0x80, 0x9d, 0xdf, 0xff, 0x40, + 0xef, +}; + +static const uint8_t unicode_prop_Case_Ignorable_index[75] = { + 0xbe, 0x05, 0x00, 0xfe, 0x07, 0x00, 0x52, 0x0a, + 0xa0, 0xc1, 0x0b, 0x00, 0x82, 0x0d, 0x00, 0x3f, + 0x10, 0x80, 0xd4, 0x17, 0x40, 0xde, 0x1a, 0x20, + 0xe9, 0x1c, 0x00, 0x72, 0x20, 0x00, 0x16, 0xa0, + 0x40, 0xc6, 0xa8, 0x40, 0xc2, 0xaa, 0xa0, 0x30, + 0xfe, 0x00, 0xb1, 0x07, 0x41, 0x51, 0x0f, 0x01, + 0xd0, 0x11, 0x01, 0x5f, 0x14, 0x01, 0x44, 0x19, + 0x61, 0xa8, 0x1c, 0x01, 0x2a, 0x61, 0x61, 0xff, + 0xaf, 0x01, 0x19, 0xe0, 0x61, 0x00, 0xe7, 0x01, + 0xf0, 0x01, 0x0e, +}; + +static const uint8_t unicode_prop_ID_Start_table[1146] = { + 0xc0, 0x99, 0x85, 0x99, 0xae, 0x80, 0x89, 0x03, + 0x04, 0x96, 0x80, 0x9e, 0x80, 0x41, 0xc9, 0x83, + 0x8b, 0x8d, 0x26, 0x00, 0x80, 0x40, 0x80, 0x20, + 0x09, 0x18, 0x05, 0x00, 0x10, 0x00, 0x93, 0x80, + 0xd2, 0x80, 0x40, 0x8a, 0x87, 0x40, 0xa5, 0x80, + 0xa5, 0x08, 0x85, 0xa8, 0xc6, 0x9a, 0x1b, 0xac, + 0xaa, 0xa2, 0x08, 0xe2, 0x00, 0x8e, 0x0e, 0x81, + 0x89, 0x11, 0x80, 0x8f, 0x00, 0x9d, 0x9c, 0xd8, + 0x8a, 0x80, 0x97, 0xa0, 0x88, 0x0b, 0x04, 0x95, + 0x18, 0x88, 0x02, 0x80, 0x96, 0x98, 0x86, 0x8a, + 0x84, 0x97, 0x06, 0x8f, 0xa9, 0xb9, 0xb5, 0x10, + 0x91, 0x06, 0x89, 0x8e, 0x8f, 0x1f, 0x09, 0x81, + 0x95, 0x06, 0x00, 0x13, 0x10, 0x8f, 0x80, 0x8c, + 0x08, 0x82, 0x8d, 0x81, 0x89, 0x07, 0x2b, 0x09, + 0x95, 0x06, 0x01, 0x01, 0x01, 0x9e, 0x18, 0x80, + 0x92, 0x82, 0x8f, 0x88, 0x02, 0x80, 0x95, 0x06, + 0x01, 0x04, 0x10, 0x91, 0x80, 0x8e, 0x81, 0x96, + 0x80, 0x8a, 0x39, 0x09, 0x95, 0x06, 0x01, 0x04, + 0x10, 0x9d, 0x08, 0x82, 0x8e, 0x80, 0x90, 0x00, + 0x2a, 0x10, 0x1a, 0x08, 0x00, 0x0a, 0x0a, 0x12, + 0x8b, 0x95, 0x80, 0xb3, 0x38, 0x10, 0x96, 0x80, + 0x8f, 0x10, 0x99, 0x10, 0x09, 0x81, 0x9d, 0x03, + 0x38, 0x10, 0x96, 0x80, 0x89, 0x04, 0x10, 0x9d, + 0x10, 0x81, 0x8e, 0x81, 0x90, 0x88, 0x02, 0x80, + 0xa8, 0x08, 0x8f, 0x04, 0x17, 0x82, 0x97, 0x2c, + 0x91, 0x82, 0x97, 0x80, 0x88, 0x00, 0x0e, 0xb9, + 0xaf, 0x01, 0x8b, 0x86, 0xb9, 0x08, 0x00, 0x20, + 0x97, 0x00, 0x80, 0x89, 0x01, 0x88, 0x01, 0x20, + 0x80, 0x94, 0x83, 0x9f, 0x80, 0xbe, 0x38, 0xa3, + 0x9a, 0x84, 0xf2, 0xaa, 0x93, 0x80, 0x8f, 0x2b, + 0x1a, 0x02, 0x0e, 0x13, 0x8c, 0x8b, 0x80, 0x90, + 0xa5, 0x00, 0x20, 0x81, 0xaa, 0x80, 0x41, 0x4c, + 0x03, 0x0e, 0x00, 0x03, 0x81, 0xa8, 0x03, 0x81, + 0xa0, 0x03, 0x0e, 0x00, 0x03, 0x81, 0x8e, 0x80, + 0xb8, 0x03, 0x81, 0xc2, 0xa4, 0x8f, 0x8f, 0xd5, + 0x0d, 0x82, 0x42, 0x6b, 0x81, 0x90, 0x80, 0x99, + 0x84, 0xca, 0x82, 0x8a, 0x86, 0x91, 0x8c, 0x92, + 0x8d, 0x91, 0x8d, 0x8c, 0x02, 0x8e, 0xb3, 0xa2, + 0x03, 0x80, 0xc2, 0xd8, 0x86, 0xa8, 0x00, 0x84, + 0xc5, 0x89, 0x9e, 0xb0, 0x9d, 0x0c, 0x8a, 0xab, + 0x83, 0x99, 0xb5, 0x96, 0x88, 0xb4, 0xd1, 0x80, + 0xdc, 0xae, 0x90, 0x87, 0xb5, 0x9d, 0x8c, 0x81, + 0x89, 0xab, 0x99, 0xa3, 0xa8, 0x82, 0x89, 0xa3, + 0x81, 0x8a, 0x84, 0xaa, 0x0a, 0xa8, 0x18, 0x28, + 0x0a, 0x04, 0x40, 0xbf, 0xbf, 0x41, 0x15, 0x0d, + 0x81, 0xa5, 0x0d, 0x0f, 0x00, 0x00, 0x00, 0x80, + 0x9e, 0x81, 0xb4, 0x06, 0x00, 0x12, 0x06, 0x13, + 0x0d, 0x83, 0x8c, 0x22, 0x06, 0xf3, 0x80, 0x8c, + 0x80, 0x8f, 0x8c, 0xe4, 0x03, 0x01, 0x89, 0x00, + 0x0d, 0x28, 0x00, 0x00, 0x80, 0x8f, 0x0b, 0x24, + 0x18, 0x90, 0xa8, 0x4a, 0x76, 0x40, 0xe4, 0x2b, + 0x11, 0x8b, 0xa5, 0x00, 0x20, 0x81, 0xb7, 0x30, + 0x8f, 0x96, 0x88, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x86, 0x42, 0x25, 0x82, 0x98, 0x88, + 0x34, 0x0c, 0x83, 0xd5, 0x1c, 0x80, 0xd9, 0x03, + 0x84, 0xaa, 0x80, 0xdd, 0x90, 0x9f, 0xaf, 0x8f, + 0x41, 0xff, 0x59, 0xbf, 0xbf, 0x60, 0x56, 0x8c, + 0xc2, 0xad, 0x81, 0x41, 0x0c, 0x82, 0x8f, 0x89, + 0x81, 0x93, 0xae, 0x8f, 0x9e, 0x81, 0xcf, 0xa6, + 0x88, 0x81, 0xe6, 0x81, 0xd1, 0x93, 0x90, 0x02, + 0x03, 0x80, 0x96, 0x9c, 0xb3, 0x8d, 0xb1, 0xbd, + 0x2a, 0x00, 0x81, 0x8a, 0x9b, 0x89, 0x96, 0x98, + 0x9c, 0x86, 0xae, 0x9b, 0x80, 0x8f, 0x20, 0x89, + 0x89, 0x20, 0xa8, 0x96, 0x10, 0x87, 0x93, 0x96, + 0x10, 0x82, 0xb1, 0x00, 0x11, 0x0c, 0x08, 0x00, + 0x97, 0x11, 0x8a, 0x32, 0x8b, 0x29, 0x29, 0x85, + 0x88, 0x30, 0x30, 0xaa, 0x80, 0x8d, 0x85, 0xf2, + 0x9c, 0x60, 0x2b, 0xa3, 0x8b, 0x96, 0x83, 0xb0, + 0x60, 0x21, 0x03, 0x41, 0x6d, 0x81, 0xe9, 0xa5, + 0x86, 0x8b, 0x24, 0x00, 0x89, 0x80, 0x8c, 0x04, + 0x00, 0x01, 0x01, 0x80, 0xeb, 0xa0, 0x41, 0x6a, + 0x91, 0xbf, 0x81, 0xb5, 0xa7, 0x8b, 0xf3, 0x20, + 0x40, 0x86, 0xa3, 0x99, 0x85, 0x99, 0x8a, 0xd8, + 0x15, 0x0d, 0x0d, 0x0a, 0xa2, 0x8b, 0x80, 0x99, + 0x80, 0x92, 0x01, 0x80, 0x8e, 0x81, 0x8d, 0xa1, + 0xfa, 0xc4, 0xb4, 0x41, 0x0a, 0x9c, 0x82, 0xb0, + 0xae, 0x9f, 0x8c, 0x9d, 0x84, 0xa5, 0x89, 0x9d, + 0x81, 0xa3, 0x1f, 0x04, 0xa9, 0x40, 0x9d, 0x91, + 0xa3, 0x83, 0xa3, 0x83, 0xa7, 0x87, 0xb3, 0x8b, + 0x8a, 0x80, 0x8e, 0x06, 0x01, 0x80, 0x8a, 0x80, + 0x8e, 0x06, 0x01, 0x82, 0xb3, 0x8b, 0x41, 0x36, + 0x88, 0x95, 0x89, 0x87, 0x97, 0x28, 0xa9, 0x80, + 0x88, 0xc4, 0x29, 0x00, 0xab, 0x01, 0x10, 0x81, + 0x96, 0x89, 0x96, 0x88, 0x9e, 0xc0, 0x92, 0x01, + 0x89, 0x95, 0x89, 0x99, 0x85, 0x99, 0xa5, 0xb7, + 0x29, 0xbf, 0x80, 0x8e, 0x18, 0x10, 0x9c, 0xa9, + 0x9c, 0x82, 0x9c, 0xa2, 0x38, 0x9b, 0x9a, 0xb5, + 0x89, 0x95, 0x89, 0x92, 0x8c, 0x91, 0xed, 0xc8, + 0xb6, 0xb2, 0x8c, 0xb2, 0x8c, 0xa3, 0xa5, 0x9b, + 0x88, 0x96, 0x40, 0xf9, 0xa9, 0x29, 0x8f, 0x85, + 0xb7, 0x9c, 0x89, 0x07, 0x95, 0xa9, 0x91, 0xad, + 0x94, 0x9a, 0x96, 0x8b, 0xb4, 0xb8, 0x09, 0x80, + 0x8c, 0xac, 0x9f, 0x98, 0x99, 0xa3, 0x9c, 0x01, + 0x07, 0xa2, 0x10, 0x8b, 0xaf, 0x8d, 0x83, 0x94, + 0x00, 0x80, 0xa2, 0x91, 0x80, 0x98, 0x92, 0x81, + 0xbe, 0x30, 0x00, 0x18, 0x8e, 0x80, 0x89, 0x86, + 0xae, 0xa5, 0x39, 0x09, 0x95, 0x06, 0x01, 0x04, + 0x10, 0x91, 0x80, 0x8b, 0x84, 0x9d, 0x89, 0x00, + 0x08, 0x80, 0xa5, 0x00, 0x98, 0x00, 0x80, 0xab, + 0xb4, 0x91, 0x83, 0x93, 0x82, 0x9d, 0xaf, 0x93, + 0x08, 0x80, 0x40, 0xb7, 0xae, 0xa8, 0x83, 0xa3, + 0xaf, 0x93, 0x80, 0xba, 0xaa, 0x8c, 0x80, 0xc6, + 0x9a, 0xa4, 0x86, 0x40, 0xb8, 0xab, 0xf3, 0xbf, + 0x9e, 0x39, 0x01, 0x38, 0x08, 0x97, 0x8e, 0x00, + 0x80, 0xdd, 0x39, 0xa6, 0x8f, 0x00, 0x80, 0x9b, + 0x80, 0x89, 0xa7, 0x30, 0x94, 0x80, 0x8a, 0xad, + 0x92, 0x80, 0x91, 0xc8, 0x40, 0xc6, 0xa0, 0x9e, + 0x88, 0x80, 0xa4, 0x90, 0x80, 0xb0, 0x9d, 0xef, + 0x30, 0x08, 0xa5, 0x94, 0x80, 0x98, 0x28, 0x08, + 0x9f, 0x8d, 0x80, 0x96, 0xab, 0x41, 0x03, 0x92, + 0x8e, 0x00, 0x8c, 0x80, 0xa1, 0xfb, 0x80, 0xce, + 0x43, 0x99, 0xe5, 0xee, 0x90, 0x40, 0xc3, 0x4a, + 0x4b, 0xe0, 0x8e, 0x44, 0x2f, 0x90, 0x85, 0x98, + 0x4f, 0x9a, 0x84, 0x42, 0x46, 0x5a, 0xb8, 0x9d, + 0x46, 0xe1, 0x42, 0x38, 0x86, 0x9e, 0x90, 0xce, + 0x90, 0x9d, 0x91, 0xaf, 0x8f, 0x83, 0x9e, 0x94, + 0x84, 0x92, 0x41, 0xaf, 0xac, 0x40, 0xd2, 0xbf, + 0x9f, 0x98, 0x81, 0x98, 0xab, 0xca, 0x20, 0xc1, + 0x8c, 0xbf, 0x08, 0x80, 0x8d, 0x84, 0x88, 0x5c, + 0xd5, 0xa8, 0x9f, 0xe0, 0xf2, 0x60, 0x21, 0xfc, + 0x18, 0x30, 0x08, 0x41, 0x22, 0x8e, 0x80, 0x9c, + 0x11, 0x80, 0x8d, 0x1f, 0x41, 0x8b, 0x49, 0x03, + 0xea, 0x84, 0x8c, 0x82, 0x88, 0x86, 0x89, 0x57, + 0x65, 0xd4, 0x80, 0xc6, 0x01, 0x08, 0x09, 0x0b, + 0x80, 0x8b, 0x00, 0x06, 0x80, 0xc0, 0x03, 0x0f, + 0x06, 0x80, 0x9b, 0x03, 0x04, 0x00, 0x16, 0x80, + 0x41, 0x53, 0x81, 0x98, 0x80, 0x98, 0x80, 0x9e, + 0x80, 0x98, 0x80, 0x9e, 0x80, 0x98, 0x80, 0x9e, + 0x80, 0x98, 0x80, 0x9e, 0x80, 0x98, 0x07, 0x47, + 0x33, 0x9e, 0x2d, 0x41, 0x04, 0xbd, 0x40, 0x91, + 0xac, 0x89, 0x86, 0x8f, 0x80, 0x41, 0x40, 0x9d, + 0x91, 0xab, 0x41, 0xe3, 0x9b, 0x40, 0xe3, 0x9d, + 0x08, 0x40, 0xce, 0x9e, 0x02, 0x01, 0x06, 0x0c, + 0x88, 0x81, 0x40, 0xdf, 0x30, 0x18, 0x08, 0x8e, + 0x80, 0x40, 0xc4, 0xba, 0xc3, 0x30, 0x44, 0xb3, + 0x18, 0x9a, 0x01, 0x00, 0x08, 0x80, 0x89, 0x03, + 0x00, 0x00, 0x28, 0x18, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0b, 0x06, 0x03, 0x03, 0x00, 0x80, 0x89, 0x80, + 0x90, 0x22, 0x04, 0x80, 0x90, 0x51, 0x43, 0x60, + 0xa6, 0xdf, 0x9f, 0x51, 0x1d, 0x81, 0x56, 0x8d, + 0x81, 0x5d, 0x30, 0x8e, 0x42, 0x6d, 0x49, 0xa1, + 0x42, 0x1d, 0x45, 0xe1, 0x53, 0x4a, 0x84, 0x60, + 0x21, 0x29, +}; + +static const uint8_t unicode_prop_ID_Start_index[108] = { + 0xf6, 0x03, 0x20, 0xa6, 0x07, 0x00, 0xa9, 0x09, + 0x20, 0xb1, 0x0a, 0x00, 0xba, 0x0b, 0x20, 0x3b, + 0x0d, 0x20, 0xc7, 0x0e, 0x20, 0x49, 0x12, 0x00, + 0x9b, 0x16, 0x00, 0xac, 0x19, 0x00, 0xc0, 0x1d, + 0x80, 0x80, 0x20, 0x20, 0x70, 0x2d, 0x00, 0x00, + 0x32, 0x00, 0x06, 0xa8, 0x00, 0x77, 0xaa, 0x00, + 0xfc, 0xd7, 0x00, 0xfd, 0xfe, 0x40, 0xd1, 0x02, + 0x01, 0xb2, 0x05, 0x21, 0xf6, 0x08, 0x01, 0x49, + 0x0c, 0x01, 0x76, 0x10, 0x01, 0xdf, 0x12, 0x21, + 0xc8, 0x14, 0x41, 0x42, 0x19, 0x21, 0x31, 0x1d, + 0x61, 0xf1, 0x2f, 0x41, 0x78, 0x6b, 0x01, 0x23, + 0xb1, 0xa1, 0xad, 0xd4, 0x01, 0x6f, 0xd7, 0x01, + 0xee, 0xe5, 0x01, 0x38, 0xee, 0x01, 0xe0, 0xa6, + 0x42, 0x7a, 0x34, 0x03, +}; + +static const uint8_t unicode_prop_ID_Continue1_table[708] = { + 0xaf, 0x89, 0xa4, 0x80, 0xd6, 0x80, 0x42, 0x47, + 0xef, 0x96, 0x80, 0x40, 0xfa, 0x84, 0x41, 0x08, + 0xac, 0x00, 0x01, 0x01, 0x00, 0xc7, 0x8a, 0xaf, + 0x9e, 0x28, 0xe4, 0x31, 0x29, 0x08, 0x19, 0x89, + 0x96, 0x80, 0x9d, 0x9a, 0xda, 0x8a, 0x8e, 0x89, + 0xa0, 0x88, 0x88, 0x80, 0x97, 0x18, 0x88, 0x02, + 0x04, 0xaa, 0x82, 0xba, 0x88, 0xa9, 0x97, 0x80, + 0xa0, 0xb5, 0x10, 0x91, 0x06, 0x89, 0x09, 0x89, + 0x90, 0x82, 0xb7, 0x00, 0x31, 0x09, 0x82, 0x88, + 0x80, 0x89, 0x09, 0x89, 0x8d, 0x01, 0x82, 0xb7, + 0x00, 0x23, 0x09, 0x12, 0x80, 0x93, 0x8b, 0x10, + 0x8a, 0x82, 0xb7, 0x00, 0x38, 0x10, 0x82, 0x93, + 0x09, 0x89, 0x89, 0x28, 0x82, 0xb7, 0x00, 0x31, + 0x09, 0x16, 0x82, 0x89, 0x09, 0x89, 0x91, 0x80, + 0xba, 0x22, 0x10, 0x83, 0x88, 0x80, 0x8d, 0x89, + 0x8f, 0x84, 0xb6, 0x00, 0x30, 0x10, 0x1e, 0x81, + 0x8a, 0x09, 0x89, 0x90, 0x82, 0xb7, 0x00, 0x30, + 0x10, 0x1e, 0x81, 0x8a, 0x09, 0x89, 0x10, 0x8b, + 0x83, 0xb6, 0x08, 0x30, 0x10, 0x83, 0x88, 0x80, + 0x89, 0x09, 0x89, 0x90, 0x82, 0xc5, 0x03, 0x28, + 0x00, 0x3d, 0x89, 0x09, 0xbc, 0x01, 0x86, 0x8b, + 0x38, 0x89, 0xd6, 0x01, 0x88, 0x8a, 0x30, 0x89, + 0xbd, 0x0d, 0x89, 0x8a, 0x00, 0x00, 0x03, 0x81, + 0xb0, 0x93, 0x01, 0x84, 0x8a, 0x80, 0xa3, 0x88, + 0x80, 0xe3, 0x93, 0x80, 0x89, 0x8b, 0x1b, 0x10, + 0x11, 0x32, 0x83, 0x8c, 0x8b, 0x80, 0x8e, 0x42, + 0xbe, 0x82, 0x88, 0x88, 0x43, 0x9f, 0x83, 0x9b, + 0x82, 0x9c, 0x81, 0x9d, 0x81, 0xbf, 0x9f, 0x88, + 0x01, 0x89, 0xa0, 0x10, 0x8a, 0x40, 0x8e, 0x80, + 0xf5, 0x8b, 0x83, 0x8b, 0x89, 0x89, 0xff, 0x8a, + 0xbb, 0x84, 0xb8, 0x89, 0x80, 0x9c, 0x81, 0x8a, + 0x85, 0x89, 0x95, 0x8d, 0x80, 0x9e, 0x81, 0x8b, + 0x93, 0x84, 0xae, 0x90, 0x8a, 0x89, 0x90, 0x88, + 0x8b, 0x82, 0x9d, 0x8c, 0x81, 0x89, 0xab, 0x8d, + 0xaf, 0x93, 0x87, 0x89, 0x85, 0x89, 0xf5, 0x10, + 0x94, 0x18, 0x28, 0x0a, 0x40, 0xc5, 0xbf, 0x42, + 0x0b, 0x81, 0xb0, 0x81, 0x92, 0x80, 0xfa, 0x8c, + 0x18, 0x82, 0x8b, 0x4b, 0xfd, 0x82, 0x40, 0x8c, + 0x80, 0xdf, 0x9f, 0x42, 0x29, 0x85, 0xe8, 0x81, + 0xdf, 0x80, 0x60, 0x75, 0x23, 0x89, 0xc4, 0x03, + 0x89, 0x9f, 0x81, 0xcf, 0x81, 0x41, 0x0f, 0x02, + 0x03, 0x80, 0x96, 0x23, 0x80, 0xd2, 0x81, 0xb1, + 0x91, 0x89, 0x89, 0x85, 0x91, 0x8c, 0x8a, 0x9b, + 0x87, 0x98, 0x8c, 0xab, 0x83, 0xae, 0x8d, 0x8e, + 0x89, 0x8a, 0x80, 0x89, 0x89, 0xae, 0x8d, 0x8b, + 0x07, 0x09, 0x89, 0xa0, 0x82, 0xb1, 0x00, 0x11, + 0x0c, 0x08, 0x80, 0xa8, 0x24, 0x81, 0x40, 0xeb, + 0x38, 0x09, 0x89, 0x60, 0x4f, 0x23, 0x80, 0x42, + 0xe0, 0x8f, 0x8f, 0x8f, 0x11, 0x97, 0x82, 0x40, + 0xbf, 0x89, 0xa4, 0x80, 0xa4, 0x80, 0x42, 0x96, + 0x80, 0x40, 0xe1, 0x80, 0x40, 0x94, 0x84, 0x41, + 0x24, 0x89, 0x45, 0x56, 0x10, 0x0c, 0x83, 0xa7, + 0x13, 0x80, 0x40, 0xa4, 0x81, 0x42, 0x3c, 0x1f, + 0x89, 0x85, 0x89, 0x9e, 0x84, 0x41, 0x3c, 0x81, + 0xcc, 0x85, 0xc5, 0x8a, 0xb0, 0x83, 0xf9, 0x82, + 0xb4, 0x8e, 0x9e, 0x8a, 0x09, 0x89, 0x83, 0xac, + 0x8a, 0x30, 0xac, 0x89, 0x2a, 0xa3, 0x8d, 0x80, + 0x89, 0x21, 0xab, 0x80, 0x8b, 0x82, 0xaf, 0x8d, + 0x3b, 0x80, 0x8b, 0xd1, 0x8b, 0x28, 0x08, 0x40, + 0x9c, 0x8b, 0x84, 0x89, 0x2b, 0xb6, 0x08, 0x31, + 0x09, 0x82, 0x88, 0x80, 0x89, 0x09, 0x32, 0x84, + 0xc2, 0x88, 0x00, 0x08, 0x03, 0x04, 0x00, 0x8d, + 0x81, 0xd1, 0x91, 0x88, 0x89, 0x18, 0xd0, 0x93, + 0x8b, 0x89, 0x40, 0xd4, 0x31, 0x88, 0x9a, 0x81, + 0xd1, 0x90, 0x8e, 0x89, 0xd0, 0x8c, 0x87, 0x89, + 0x85, 0x93, 0xb8, 0x8e, 0x83, 0x89, 0x40, 0xf1, + 0x8e, 0x40, 0xa4, 0x89, 0xc5, 0x28, 0x09, 0x18, + 0x00, 0x81, 0x8b, 0x89, 0xf6, 0x31, 0x32, 0x80, + 0x9b, 0x89, 0xa7, 0x30, 0x1f, 0x80, 0x88, 0x8a, + 0xad, 0x8f, 0x40, 0xc5, 0x87, 0x40, 0x87, 0x89, + 0xb4, 0x38, 0x87, 0x8f, 0x89, 0xb7, 0x95, 0x80, + 0x8d, 0xf9, 0x2a, 0x00, 0x08, 0x30, 0x07, 0x89, + 0xaf, 0x20, 0x08, 0x27, 0x89, 0xb5, 0x89, 0x41, + 0x08, 0x83, 0x88, 0x08, 0x80, 0xaf, 0x32, 0x84, + 0x8c, 0x8a, 0x54, 0xe4, 0x05, 0x8e, 0x60, 0x2c, + 0xc7, 0x9b, 0x49, 0x25, 0x89, 0xd5, 0x89, 0xa5, + 0x84, 0xba, 0x86, 0x98, 0x89, 0x42, 0x15, 0x89, + 0x41, 0xd4, 0x00, 0xb6, 0x33, 0xd0, 0x80, 0x8a, + 0x81, 0x60, 0x4c, 0xaa, 0x81, 0x50, 0x50, 0x89, + 0x42, 0x05, 0xad, 0x81, 0x96, 0x42, 0x1d, 0x22, + 0x2f, 0x39, 0x86, 0x9d, 0x83, 0x40, 0x93, 0x82, + 0x45, 0x88, 0xb1, 0x41, 0xff, 0xb6, 0x83, 0xb1, + 0x38, 0x8d, 0x80, 0x95, 0x20, 0x8e, 0x45, 0x4f, + 0x30, 0x90, 0x0e, 0x01, 0x04, 0xe3, 0x80, 0x40, + 0x9f, 0x86, 0x88, 0x89, 0x41, 0x63, 0x80, 0xbc, + 0x8d, 0x41, 0xf1, 0x8d, 0x40, 0xf3, 0x08, 0x89, + 0x40, 0xe7, 0x01, 0x06, 0x0c, 0x80, 0x41, 0xd9, + 0x86, 0xec, 0x34, 0x89, 0x52, 0x95, 0x89, 0x6c, + 0x05, 0x05, 0x40, 0xef, +}; + +static const uint8_t unicode_prop_ID_Continue1_index[66] = { + 0xfa, 0x06, 0x00, 0x70, 0x09, 0x00, 0xf0, 0x0a, + 0x40, 0x57, 0x0c, 0x00, 0xf0, 0x0d, 0x60, 0xc7, + 0x0f, 0x20, 0xea, 0x17, 0x40, 0xec, 0x1a, 0x00, + 0x0e, 0x20, 0x40, 0x7e, 0xa6, 0x20, 0xda, 0xa9, + 0x20, 0x10, 0xfe, 0x40, 0x40, 0x0a, 0x41, 0xbb, + 0x10, 0x21, 0x4e, 0x13, 0x41, 0xde, 0x15, 0x01, + 0xe5, 0x19, 0x01, 0x5a, 0x1d, 0x01, 0xf5, 0x6a, + 0x21, 0x8c, 0xd1, 0x61, 0x37, 0xe1, 0x41, 0xf0, + 0x01, 0x0e, +}; + +static const uint8_t unicode_prop_White_Space_table[22] = { + 0x88, 0x84, 0x91, 0x80, 0xe3, 0x80, 0x99, 0x80, + 0x55, 0xde, 0x80, 0x49, 0x7e, 0x8a, 0x9c, 0x0c, + 0x80, 0xae, 0x80, 0x4f, 0x9f, 0x80, +}; + +static const uint8_t unicode_prop_White_Space_index[3] = { + 0x01, 0x30, 0x00, +}; + +static const uint8_t unicode_cc_table[937] = { + 0xb2, 0xcf, 0xd4, 0x00, 0xe8, 0x03, 0xdc, 0x00, + 0xe8, 0x00, 0xd8, 0x04, 0xdc, 0x01, 0xca, 0x03, + 0xdc, 0x01, 0xca, 0x0a, 0xdc, 0x04, 0x01, 0x03, + 0xdc, 0xc7, 0x00, 0xf0, 0xc0, 0x02, 0xdc, 0xc2, + 0x01, 0xdc, 0x80, 0xc2, 0x03, 0xdc, 0xc0, 0x00, + 0xe8, 0x01, 0xdc, 0xc0, 0x41, 0xe9, 0x00, 0xea, + 0x41, 0xe9, 0x00, 0xea, 0x00, 0xe9, 0xcc, 0xb0, + 0xe2, 0xc4, 0xb0, 0xd8, 0x00, 0xdc, 0xc3, 0x00, + 0xdc, 0xc2, 0x00, 0xde, 0x00, 0xdc, 0xc5, 0x05, + 0xdc, 0xc1, 0x00, 0xdc, 0xc1, 0x00, 0xde, 0x00, + 0xe4, 0xc0, 0x49, 0x0a, 0x43, 0x13, 0x80, 0x00, + 0x17, 0x80, 0x41, 0x18, 0x80, 0xc0, 0x00, 0xdc, + 0x80, 0x00, 0x12, 0xb0, 0x17, 0xc7, 0x42, 0x1e, + 0xaf, 0x47, 0x1b, 0xc1, 0x01, 0xdc, 0xc4, 0x00, + 0xdc, 0xc1, 0x00, 0xdc, 0x8f, 0x00, 0x23, 0xb0, + 0x34, 0xc6, 0x81, 0xc3, 0x00, 0xdc, 0xc0, 0x81, + 0xc1, 0x80, 0x00, 0xdc, 0xc1, 0x00, 0xdc, 0xa2, + 0x00, 0x24, 0x9d, 0xc0, 0x00, 0xdc, 0xc1, 0x00, + 0xdc, 0xc1, 0x02, 0xdc, 0xc0, 0x01, 0xdc, 0xc0, + 0x00, 0xdc, 0xc2, 0x00, 0xdc, 0xc0, 0x00, 0xdc, + 0xc0, 0x00, 0xdc, 0xc0, 0x00, 0xdc, 0xc1, 0xb0, + 0x6f, 0xc6, 0x00, 0xdc, 0xc0, 0x88, 0x00, 0xdc, + 0x97, 0xc3, 0x80, 0xc8, 0x80, 0xc2, 0x80, 0xc4, + 0xaa, 0x02, 0xdc, 0xb0, 0x0a, 0xc1, 0x02, 0xdc, + 0xc3, 0xa9, 0xc4, 0x04, 0xdc, 0xcd, 0x80, 0x00, + 0xdc, 0xc1, 0x00, 0xdc, 0xc1, 0x00, 0xdc, 0xc2, + 0x02, 0xdc, 0x42, 0x1b, 0xc2, 0x00, 0xdc, 0xc1, + 0x01, 0xdc, 0xc4, 0xb0, 0x0b, 0x00, 0x07, 0x8f, + 0x00, 0x09, 0x82, 0xc0, 0x00, 0xdc, 0xc1, 0xb0, + 0x36, 0x00, 0x07, 0x8f, 0x00, 0x09, 0xaf, 0xc0, + 0xb0, 0x0c, 0x00, 0x07, 0x8f, 0x00, 0x09, 0xb0, + 0x3d, 0x00, 0x07, 0x8f, 0x00, 0x09, 0xb0, 0x3d, + 0x00, 0x07, 0x8f, 0x00, 0x09, 0xb0, 0x4e, 0x00, + 0x09, 0xb0, 0x3d, 0x00, 0x07, 0x8f, 0x00, 0x09, + 0x86, 0x00, 0x54, 0x00, 0x5b, 0xb0, 0x34, 0x00, + 0x07, 0x8f, 0x00, 0x09, 0xb0, 0x3c, 0x01, 0x09, + 0x8f, 0x00, 0x09, 0xb0, 0x4b, 0x00, 0x09, 0xb0, + 0x3c, 0x01, 0x67, 0x00, 0x09, 0x8c, 0x03, 0x6b, + 0xb0, 0x3b, 0x01, 0x76, 0x00, 0x09, 0x8c, 0x03, + 0x7a, 0xb0, 0x1b, 0x01, 0xdc, 0x9a, 0x00, 0xdc, + 0x80, 0x00, 0xdc, 0x80, 0x00, 0xd8, 0xb0, 0x06, + 0x41, 0x81, 0x80, 0x00, 0x84, 0x84, 0x03, 0x82, + 0x81, 0x00, 0x82, 0x80, 0xc1, 0x00, 0x09, 0x80, + 0xc1, 0xb0, 0x0d, 0x00, 0xdc, 0xb0, 0x3f, 0x00, + 0x07, 0x80, 0x01, 0x09, 0xb0, 0x21, 0x00, 0xdc, + 0xb2, 0x9e, 0xc2, 0xb3, 0x83, 0x01, 0x09, 0x9d, + 0x00, 0x09, 0xb0, 0x6c, 0x00, 0x09, 0x89, 0xc0, + 0xb0, 0x9a, 0x00, 0xe4, 0xb0, 0x5e, 0x00, 0xde, + 0xc0, 0x00, 0xdc, 0xb0, 0xaa, 0xc0, 0x00, 0xdc, + 0xb0, 0x16, 0x00, 0x09, 0x93, 0xc7, 0x81, 0x00, + 0xdc, 0xaf, 0xc4, 0x05, 0xdc, 0xc1, 0x00, 0xdc, + 0x80, 0x01, 0xdc, 0xc1, 0x01, 0xdc, 0xc4, 0x00, + 0xdc, 0xd1, 0x00, 0xdc, 0x81, 0xc5, 0x00, 0xdc, + 0xc3, 0x00, 0xea, 0xb0, 0x17, 0x00, 0x07, 0x8e, + 0x00, 0x09, 0xa5, 0xc0, 0x00, 0xdc, 0xc6, 0xb0, + 0x05, 0x01, 0x09, 0xb0, 0x09, 0x00, 0x07, 0x8a, + 0x01, 0x09, 0xb0, 0x12, 0x00, 0x07, 0xb0, 0x67, + 0xc2, 0x41, 0x00, 0x04, 0xdc, 0xc1, 0x03, 0xdc, + 0xc0, 0x41, 0x00, 0x05, 0x01, 0x83, 0x00, 0xdc, + 0x85, 0xc0, 0x82, 0xc1, 0xb0, 0x95, 0xc1, 0x00, + 0xdc, 0xc6, 0x00, 0xdc, 0xc1, 0x00, 0xea, 0x00, + 0xd6, 0x00, 0xdc, 0x00, 0xca, 0xe4, 0x00, 0xe8, + 0x01, 0xe4, 0x00, 0xdc, 0x00, 0xda, 0xc0, 0x00, + 0xe9, 0x00, 0xdc, 0xc0, 0x00, 0xdc, 0xb2, 0x9f, + 0xc1, 0x01, 0x01, 0xc3, 0x02, 0x01, 0xc1, 0x83, + 0xc0, 0x82, 0x01, 0x01, 0xc0, 0x00, 0xdc, 0xc0, + 0x01, 0x01, 0x03, 0xdc, 0xc0, 0xb8, 0x03, 0xcd, + 0xc2, 0xb0, 0x5c, 0x00, 0x09, 0xb0, 0x2f, 0xdf, + 0xb1, 0xf9, 0x00, 0xda, 0x00, 0xe4, 0x00, 0xe8, + 0x00, 0xde, 0x01, 0xe0, 0xb0, 0x38, 0x01, 0x08, + 0xb8, 0x6d, 0xa3, 0xc0, 0x83, 0xc9, 0x9f, 0xc1, + 0xb0, 0x1f, 0xc1, 0xb0, 0xe3, 0x00, 0x09, 0xa4, + 0x00, 0x09, 0xb0, 0x66, 0x00, 0x09, 0x9a, 0xd1, + 0xb0, 0x08, 0x02, 0xdc, 0xa4, 0x00, 0x09, 0xb0, + 0x2e, 0x00, 0x07, 0x8b, 0x00, 0x09, 0xb0, 0xbe, + 0xc0, 0x80, 0xc1, 0x00, 0xdc, 0x81, 0xc1, 0x84, + 0xc1, 0x80, 0xc0, 0xb0, 0x03, 0x00, 0x09, 0xb0, + 0xc5, 0x00, 0x09, 0xb8, 0x46, 0xff, 0x00, 0x1a, + 0xb2, 0xd0, 0xc6, 0x06, 0xdc, 0xc1, 0xb3, 0x9c, + 0x00, 0xdc, 0xb0, 0xb1, 0x00, 0xdc, 0xb0, 0x64, + 0xc4, 0xb6, 0x61, 0x00, 0xdc, 0x80, 0xc0, 0xa7, + 0xc0, 0x00, 0x01, 0x00, 0xdc, 0x83, 0x00, 0x09, + 0xb0, 0x74, 0xc0, 0x00, 0xdc, 0xb2, 0x0c, 0xc3, + 0xb0, 0x10, 0xc4, 0xb1, 0x0c, 0xc1, 0xb0, 0x1c, + 0x01, 0xdc, 0x80, 0x02, 0xdc, 0xb0, 0x15, 0x01, + 0xdc, 0xc2, 0x00, 0xdc, 0xc0, 0x03, 0xdc, 0xb0, + 0x00, 0xc0, 0x00, 0xdc, 0xc0, 0x00, 0xdc, 0xb0, + 0x8f, 0x00, 0x09, 0xa8, 0x00, 0x09, 0x8d, 0x00, + 0x09, 0xb0, 0x08, 0x00, 0x09, 0x00, 0x07, 0xb0, + 0x14, 0xc2, 0xaf, 0x01, 0x09, 0xb0, 0x0d, 0x00, + 0x07, 0xb0, 0x1b, 0x00, 0x09, 0x88, 0x00, 0x07, + 0xb0, 0x39, 0x00, 0x09, 0x00, 0x07, 0xb0, 0x81, + 0x00, 0x07, 0x00, 0x09, 0xb0, 0x1f, 0x01, 0x07, + 0x8f, 0x00, 0x09, 0x97, 0xc6, 0x82, 0xc4, 0xb0, + 0x28, 0x02, 0x09, 0xb0, 0x40, 0x00, 0x09, 0x82, + 0x00, 0x07, 0x96, 0xc0, 0xb0, 0x32, 0x00, 0x09, + 0x00, 0x07, 0xb0, 0xca, 0x00, 0x09, 0x00, 0x07, + 0xb0, 0x4d, 0x00, 0x09, 0xb0, 0x45, 0x00, 0x09, + 0x00, 0x07, 0xb0, 0x42, 0x00, 0x09, 0xb0, 0xdc, + 0x00, 0x09, 0x00, 0x07, 0xb0, 0xd1, 0x01, 0x09, + 0x83, 0x00, 0x07, 0xb0, 0x6b, 0x00, 0x09, 0xb0, + 0x22, 0x00, 0x09, 0x91, 0x00, 0x09, 0xb0, 0x20, + 0x00, 0x09, 0xb1, 0x74, 0x00, 0x09, 0xb0, 0xd1, + 0x00, 0x07, 0x80, 0x01, 0x09, 0xb0, 0x20, 0x00, + 0x09, 0xb1, 0x78, 0x01, 0x09, 0xb8, 0x39, 0xbb, + 0x00, 0x09, 0xb8, 0x01, 0x8f, 0x04, 0x01, 0xb0, + 0x0a, 0xc6, 0xb4, 0x88, 0x01, 0x06, 0xb8, 0x44, + 0x7b, 0x00, 0x01, 0xb8, 0x0c, 0x95, 0x01, 0xd8, + 0x02, 0x01, 0x82, 0x00, 0xe2, 0x04, 0xd8, 0x87, + 0x07, 0xdc, 0x81, 0xc4, 0x01, 0xdc, 0x9d, 0xc3, + 0xb0, 0x63, 0xc2, 0xb8, 0x05, 0x8a, 0xc6, 0x80, + 0xd0, 0x81, 0xc6, 0x80, 0xc1, 0x80, 0xc4, 0xb0, + 0x33, 0xc0, 0xb0, 0x6f, 0xc6, 0xb1, 0x46, 0xc0, + 0xb0, 0x0c, 0xc3, 0xb1, 0xcb, 0x01, 0xe8, 0x00, + 0xdc, 0xc0, 0xb0, 0xcd, 0xc0, 0x00, 0xdc, 0xb0, + 0xc2, 0xc0, 0x81, 0xc0, 0x86, 0xc1, 0x84, 0xc0, + 0xb1, 0xa9, 0x06, 0xdc, 0xb0, 0x3c, 0xc5, 0x00, + 0x07, +}; + +static const uint8_t unicode_cc_index[90] = { + 0x4d, 0x03, 0x00, 0x97, 0x05, 0x20, 0xc6, 0x05, + 0x00, 0xe7, 0x06, 0x00, 0x45, 0x07, 0x00, 0x9c, + 0x08, 0x00, 0x4d, 0x09, 0x00, 0x3c, 0x0b, 0x00, + 0x3d, 0x0d, 0x00, 0x36, 0x0f, 0x00, 0x38, 0x10, + 0x20, 0x3a, 0x19, 0x00, 0xcb, 0x1a, 0x20, 0xf2, + 0x1b, 0x00, 0xc3, 0x1d, 0x20, 0xd0, 0x20, 0x00, + 0x00, 0x2e, 0x00, 0x2c, 0xa8, 0x00, 0xbe, 0xaa, + 0x00, 0x76, 0x03, 0x01, 0xfa, 0x0e, 0x01, 0x80, + 0x10, 0x21, 0xe9, 0x12, 0x01, 0xc3, 0x14, 0x01, + 0x3f, 0x19, 0x01, 0x98, 0x1d, 0x21, 0x67, 0xd1, + 0x01, 0x8f, 0xe0, 0x21, 0xf6, 0xe6, 0x01, 0x4b, + 0xe9, 0x01, +}; + +static const uint32_t unicode_decomp_table1[709] = { + 0x00280081, 0x002a0097, 0x002a8081, 0x002bc097, + 0x002c8115, 0x002d0097, 0x002d4081, 0x002e0097, + 0x002e4115, 0x002f0199, 0x00302016, 0x00400842, + 0x00448a42, 0x004a0442, 0x004c0096, 0x004c8117, + 0x004d0242, 0x004e4342, 0x004fc12f, 0x0050c342, + 0x005240bf, 0x00530342, 0x00550942, 0x005a0842, + 0x005e0096, 0x005e4342, 0x005fc081, 0x00680142, + 0x006bc142, 0x00710185, 0x0071c317, 0x00734844, + 0x00778344, 0x00798342, 0x007b02be, 0x007c4197, + 0x007d0142, 0x007e0444, 0x00800e42, 0x00878142, + 0x00898744, 0x00ac0483, 0x00b60317, 0x00b80283, + 0x00d00214, 0x00d10096, 0x00dd0080, 0x00de8097, + 0x00df8080, 0x00e10097, 0x00e1413e, 0x00e1c080, + 0x00e204be, 0x00ea83ae, 0x00f282ae, 0x00f401ad, + 0x00f4c12e, 0x00f54103, 0x00fc0303, 0x00fe4081, + 0x0100023e, 0x0101c0be, 0x010301be, 0x010640be, + 0x010e40be, 0x0114023e, 0x0115c0be, 0x011701be, + 0x011d8144, 0x01304144, 0x01340244, 0x01358144, + 0x01368344, 0x01388344, 0x013a8644, 0x013e0144, + 0x0161c085, 0x018882ae, 0x019d422f, 0x01b00184, + 0x01b4c084, 0x024a4084, 0x024c4084, 0x024d0084, + 0x0256042e, 0x0272c12e, 0x02770120, 0x0277c084, + 0x028cc084, 0x028d8084, 0x029641ae, 0x02978084, + 0x02d20084, 0x02d2c12e, 0x02d70120, 0x02e50084, + 0x02f281ae, 0x03120084, 0x03300084, 0x0331c122, + 0x0332812e, 0x035281ae, 0x03768084, 0x037701ae, + 0x038cc085, 0x03acc085, 0x03b7012f, 0x03c30081, + 0x03d0c084, 0x03d34084, 0x03d48084, 0x03d5c084, + 0x03d70084, 0x03da4084, 0x03dcc084, 0x03dd412e, + 0x03ddc085, 0x03de0084, 0x03de4085, 0x03e04084, + 0x03e4c084, 0x03e74084, 0x03e88084, 0x03e9c084, + 0x03eb0084, 0x03ee4084, 0x04098084, 0x043f0081, + 0x06c18484, 0x06c48084, 0x06cec184, 0x06d00120, + 0x06d0c084, 0x074b0383, 0x074cc41f, 0x074f1783, + 0x075e0081, 0x0766d283, 0x07801d44, 0x078e8942, + 0x07931844, 0x079f0d42, 0x07a58216, 0x07a68085, + 0x07a6c0be, 0x07a80d44, 0x07aea044, 0x07c00122, + 0x07c08344, 0x07c20122, 0x07c28344, 0x07c40122, + 0x07c48244, 0x07c60122, 0x07c68244, 0x07c8113e, + 0x07d08244, 0x07d20122, 0x07d28244, 0x07d40122, + 0x07d48344, 0x07d64c3e, 0x07dc4080, 0x07dc80be, + 0x07dcc080, 0x07dd00be, 0x07dd4080, 0x07dd80be, + 0x07ddc080, 0x07de00be, 0x07de4080, 0x07de80be, + 0x07dec080, 0x07df00be, 0x07df4080, 0x07e00820, + 0x07e40820, 0x07e80820, 0x07ec05be, 0x07eec080, + 0x07ef00be, 0x07ef4097, 0x07ef8080, 0x07efc117, + 0x07f0443e, 0x07f24080, 0x07f280be, 0x07f2c080, + 0x07f303be, 0x07f4c080, 0x07f582ae, 0x07f6c080, + 0x07f7433e, 0x07f8c080, 0x07f903ae, 0x07fac080, + 0x07fb013e, 0x07fb8102, 0x07fc83be, 0x07fe4080, + 0x07fe80be, 0x07fec080, 0x07ff00be, 0x07ff4080, + 0x07ff8097, 0x0800011e, 0x08008495, 0x08044081, + 0x0805c097, 0x08090081, 0x08094097, 0x08098099, + 0x080bc081, 0x080cc085, 0x080d00b1, 0x080d8085, + 0x080dc0b1, 0x080f0197, 0x0811c197, 0x0815c0b3, + 0x0817c081, 0x081c0595, 0x081ec081, 0x081f0215, + 0x0820051f, 0x08228583, 0x08254415, 0x082a0097, + 0x08400119, 0x08408081, 0x0840c0bf, 0x08414119, + 0x0841c081, 0x084240bf, 0x0842852d, 0x08454081, + 0x08458097, 0x08464295, 0x08480097, 0x08484099, + 0x08488097, 0x08490081, 0x08498080, 0x084a0081, + 0x084a8102, 0x084b0495, 0x084d421f, 0x084e4081, + 0x084ec099, 0x084f0283, 0x08514295, 0x08540119, + 0x0854809b, 0x0854c619, 0x0857c097, 0x08580081, + 0x08584097, 0x08588099, 0x0858c097, 0x08590081, + 0x08594097, 0x08598099, 0x0859c09b, 0x085a0097, + 0x085a4081, 0x085a8097, 0x085ac099, 0x085b0295, + 0x085c4097, 0x085c8099, 0x085cc097, 0x085d0081, + 0x085d4097, 0x085d8099, 0x085dc09b, 0x085e0097, + 0x085e4081, 0x085e8097, 0x085ec099, 0x085f0215, + 0x08624099, 0x0866813e, 0x086b80be, 0x087341be, + 0x088100be, 0x088240be, 0x088300be, 0x088901be, + 0x088b0085, 0x088b40b1, 0x088bc085, 0x088c00b1, + 0x089040be, 0x089100be, 0x0891c1be, 0x089801be, + 0x089b42be, 0x089d0144, 0x089e0144, 0x08a00144, + 0x08a10144, 0x08a20144, 0x08ab023e, 0x08b80244, + 0x08ba8220, 0x08ca411e, 0x0918049f, 0x091a4523, + 0x091cc097, 0x091d04a5, 0x091f452b, 0x0921c09b, + 0x092204a1, 0x09244525, 0x0926c099, 0x09270d25, + 0x092d8d1f, 0x09340d1f, 0x093a8081, 0x0a8300b3, + 0x0a9d0099, 0x0a9d4097, 0x0a9d8099, 0x0ab700be, + 0x0b1f0115, 0x0b5bc081, 0x0ba7c081, 0x0bbcc081, + 0x0bc004ad, 0x0bc244ad, 0x0bc484ad, 0x0bc6f383, + 0x0be0852d, 0x0be31d03, 0x0bf1882d, 0x0c000081, + 0x0c0d8283, 0x0c130b84, 0x0c194284, 0x0c1c0122, + 0x0c1cc122, 0x0c1d8122, 0x0c1e4122, 0x0c1f0122, + 0x0c250084, 0x0c26c123, 0x0c278084, 0x0c27c085, + 0x0c2b0b84, 0x0c314284, 0x0c340122, 0x0c34c122, + 0x0c358122, 0x0c364122, 0x0c370122, 0x0c3d0084, + 0x0c3dc220, 0x0c3f8084, 0x0c3fc085, 0x0c4c4a2d, + 0x0c51451f, 0x0c53ca9f, 0x0c5915ad, 0x0c648703, + 0x0c800741, 0x0c838089, 0x0c83c129, 0x0c8441a9, + 0x0c850089, 0x0c854129, 0x0c85c2a9, 0x0c870089, + 0x0c87408f, 0x0c87808d, 0x0c881241, 0x0c910203, + 0x0c940099, 0x0c9444a3, 0x0c968323, 0x0c98072d, + 0x0c9b84af, 0x0c9dc2a1, 0x0c9f00b5, 0x0c9f40b3, + 0x0c9f8085, 0x0ca01883, 0x0cac4223, 0x0cad4523, + 0x0cafc097, 0x0cb004a1, 0x0cb241a5, 0x0cb30097, + 0x0cb34099, 0x0cb38097, 0x0cb3c099, 0x0cb417ad, + 0x0cbfc085, 0x0cc001b3, 0x0cc0c0b1, 0x0cc100b3, + 0x0cc14131, 0x0cc1c0b5, 0x0cc200b3, 0x0cc241b1, + 0x0cc30133, 0x0cc38131, 0x0cc40085, 0x0cc440b1, + 0x0cc48133, 0x0cc50085, 0x0cc540b5, 0x0cc580b7, + 0x0cc5c0b5, 0x0cc600b1, 0x0cc64135, 0x0cc6c0b3, + 0x0cc701b1, 0x0cc7c0b3, 0x0cc800b5, 0x0cc840b3, + 0x0cc881b1, 0x0cc9422f, 0x0cca4131, 0x0ccac0b5, + 0x0ccb00b1, 0x0ccb40b3, 0x0ccb80b5, 0x0ccbc0b1, + 0x0ccc012f, 0x0ccc80b5, 0x0cccc0b3, 0x0ccd00b5, + 0x0ccd40b1, 0x0ccd80b5, 0x0ccdc085, 0x0cce02b1, + 0x0ccf40b3, 0x0ccf80b1, 0x0ccfc085, 0x0cd001b1, + 0x0cd0c0b3, 0x0cd101b1, 0x0cd1c0b5, 0x0cd200b3, + 0x0cd24085, 0x0cd280b5, 0x0cd2c085, 0x0cd30133, + 0x0cd381b1, 0x0cd440b3, 0x0cd48085, 0x0cd4c0b1, + 0x0cd500b3, 0x0cd54085, 0x0cd580b5, 0x0cd5c0b1, + 0x0cd60521, 0x0cd88525, 0x0cdb02a5, 0x0cdc4099, + 0x0cdc8117, 0x0cdd0099, 0x0cdd4197, 0x0cde0127, + 0x0cde8285, 0x0cdfc089, 0x0ce0043f, 0x0ce20099, + 0x0ce2409b, 0x0ce283bf, 0x0ce44219, 0x0ce54205, + 0x0ce6433f, 0x0ce7c131, 0x0ce84085, 0x0ce881b1, + 0x0ce94085, 0x0ce98107, 0x0cea0089, 0x0cea4097, + 0x0cea8219, 0x0ceb809d, 0x0cebc08d, 0x0cec083f, + 0x0cf00105, 0x0cf0809b, 0x0cf0c197, 0x0cf1809b, + 0x0cf1c099, 0x0cf20517, 0x0cf48099, 0x0cf4c117, + 0x0cf54119, 0x0cf5c097, 0x0cf6009b, 0x0cf64099, + 0x0cf68217, 0x0cf78119, 0x0cf804a1, 0x0cfa4525, + 0x0cfcc525, 0x0cff4125, 0x0cffc099, 0x29a70103, + 0x29dc0081, 0x29fc4215, 0x29fe0103, 0x2ad70203, + 0x2ada4081, 0x3e401482, 0x3e4a7f82, 0x3e6a3f82, + 0x3e8aa102, 0x3e9b0110, 0x3e9c2f82, 0x3eb3c590, + 0x3ec00197, 0x3ec0c119, 0x3ec1413f, 0x3ec4c2af, + 0x3ec74184, 0x3ec804ad, 0x3eca4081, 0x3eca8304, + 0x3ecc03a0, 0x3ece02a0, 0x3ecf8084, 0x3ed00120, + 0x3ed0c120, 0x3ed184ae, 0x3ed3c085, 0x3ed4312d, + 0x3ef4cbad, 0x3efa892f, 0x3eff022d, 0x3f002f2f, + 0x3f1782a5, 0x3f18c0b1, 0x3f1907af, 0x3f1cffaf, + 0x3f3c81a5, 0x3f3d64af, 0x3f542031, 0x3f649b31, + 0x3f7c0131, 0x3f7c83b3, 0x3f7e40b1, 0x3f7e80bd, + 0x3f7ec0bb, 0x3f7f00b3, 0x3f840503, 0x3f8c01ad, + 0x3f8cc315, 0x3f8e462d, 0x3f91cc03, 0x3f97c695, + 0x3f9c01af, 0x3f9d0085, 0x3f9d852f, 0x3fa03aad, + 0x3fbd442f, 0x3fc06f1f, 0x3fd7c11f, 0x3fd85fad, + 0x3fe80081, 0x3fe84f1f, 0x3ff0831f, 0x3ff2831f, + 0x3ff4831f, 0x3ff6819f, 0x3ff80783, 0x41724092, + 0x41790092, 0x41e04d83, 0x41e70f91, 0x44268192, + 0x442ac092, 0x444b8112, 0x44d2c112, 0x44e0c192, + 0x44e38092, 0x44e44092, 0x44f14212, 0x452ec212, + 0x456e8112, 0x464e0092, 0x58484412, 0x5b5a0192, + 0x73358d1f, 0x733c051f, 0x74578392, 0x746ec312, + 0x75000d1f, 0x75068d1f, 0x750d0d1f, 0x7513839f, + 0x7515891f, 0x751a0d1f, 0x75208d1f, 0x75271015, + 0x752f439f, 0x7531459f, 0x75340d1f, 0x753a8d1f, + 0x75410395, 0x7543441f, 0x7545839f, 0x75478d1f, + 0x754e0795, 0x7552839f, 0x75548d1f, 0x755b0d1f, + 0x75618d1f, 0x75680d1f, 0x756e8d1f, 0x75750d1f, + 0x757b8d1f, 0x75820d1f, 0x75888d1f, 0x758f0d1f, + 0x75958d1f, 0x759c0d1f, 0x75a28d1f, 0x75a90103, + 0x75aa089f, 0x75ae4081, 0x75ae839f, 0x75b04081, + 0x75b08c9f, 0x75b6c081, 0x75b7032d, 0x75b8889f, + 0x75bcc081, 0x75bd039f, 0x75bec081, 0x75bf0c9f, + 0x75c54081, 0x75c5832d, 0x75c7089f, 0x75cb4081, + 0x75cb839f, 0x75cd4081, 0x75cd8c9f, 0x75d3c081, + 0x75d4032d, 0x75d5889f, 0x75d9c081, 0x75da039f, + 0x75dbc081, 0x75dc0c9f, 0x75e24081, 0x75e2832d, + 0x75e4089f, 0x75e84081, 0x75e8839f, 0x75ea4081, + 0x75ea8c9f, 0x75f0c081, 0x75f1042d, 0x75f3851f, + 0x75f6051f, 0x75f8851f, 0x75fb051f, 0x75fd851f, + 0x780c049f, 0x780e419f, 0x780f059f, 0x7811c203, + 0x7812d0ad, 0x781b0103, 0x7b80022d, 0x7b814dad, + 0x7b884203, 0x7b89c081, 0x7b8a452d, 0x7b8d0403, + 0x7b908081, 0x7b91dc03, 0x7ba0052d, 0x7ba2c8ad, + 0x7ba84483, 0x7baac8ad, 0x7c400097, 0x7c404521, + 0x7c440d25, 0x7c4a8087, 0x7c4ac115, 0x7c4b4117, + 0x7c4c0d1f, 0x7c528217, 0x7c538099, 0x7c53c097, + 0x7c5a8197, 0x7c640097, 0x7c80012f, 0x7c808081, + 0x7c841603, 0x7c9004c1, 0x7c940103, 0x7efc051f, + 0xbe0001ac, 0xbe00d110, 0xbe0947ac, 0xbe0d3910, + 0xbe29872c, 0xbe2d022c, 0xbe2e3790, 0xbe49ff90, + 0xbe69bc10, +}; + +static const uint16_t unicode_decomp_table2[709] = { + 0x0020, 0x0000, 0x0061, 0x0002, 0x0004, 0x0006, 0x03bc, 0x0008, + 0x000a, 0x000c, 0x0015, 0x0095, 0x00a5, 0x00b9, 0x00c1, 0x00c3, + 0x00c7, 0x00cb, 0x00d1, 0x00d7, 0x00dd, 0x00e0, 0x00e6, 0x00f8, + 0x0108, 0x010a, 0x0073, 0x0110, 0x0112, 0x0114, 0x0120, 0x012c, + 0x0144, 0x014d, 0x0153, 0x0162, 0x0168, 0x016a, 0x0176, 0x0192, + 0x0194, 0x01a9, 0x01bb, 0x01c7, 0x01d1, 0x01d5, 0x02b9, 0x01d7, + 0x003b, 0x01d9, 0x01db, 0x00b7, 0x01e1, 0x01fc, 0x020c, 0x0218, + 0x021d, 0x0223, 0x0227, 0x03a3, 0x0233, 0x023f, 0x0242, 0x024b, + 0x024e, 0x0251, 0x025d, 0x0260, 0x0269, 0x026c, 0x026f, 0x0275, + 0x0278, 0x0281, 0x028a, 0x029c, 0x029f, 0x02a3, 0x02af, 0x02b9, + 0x02c5, 0x02c9, 0x02cd, 0x02d1, 0x02d5, 0x02e7, 0x02ed, 0x02f1, + 0x02f5, 0x02f9, 0x02fd, 0x0305, 0x0309, 0x030d, 0x0313, 0x0317, + 0x031b, 0x0323, 0x0327, 0x032b, 0x032f, 0x0335, 0x033d, 0x0341, + 0x0349, 0x034d, 0x0351, 0x0f0b, 0x0357, 0x035b, 0x035f, 0x0363, + 0x0367, 0x036b, 0x036f, 0x0373, 0x0379, 0x037d, 0x0381, 0x0385, + 0x0389, 0x038d, 0x0391, 0x0395, 0x0399, 0x039d, 0x03a1, 0x10dc, + 0x03a5, 0x03c9, 0x03cd, 0x03d9, 0x03dd, 0x03e1, 0x03ef, 0x03f1, + 0x043d, 0x044f, 0x0499, 0x04f0, 0x0502, 0x054a, 0x0564, 0x056c, + 0x0570, 0x0573, 0x059a, 0x05fa, 0x05fe, 0x0607, 0x060b, 0x0614, + 0x0618, 0x061e, 0x0622, 0x0628, 0x068e, 0x0694, 0x0698, 0x069e, + 0x06a2, 0x06ab, 0x03ac, 0x06f3, 0x03ad, 0x06f6, 0x03ae, 0x06f9, + 0x03af, 0x06fc, 0x03cc, 0x06ff, 0x03cd, 0x0702, 0x03ce, 0x0705, + 0x0709, 0x070d, 0x0711, 0x0386, 0x0732, 0x0735, 0x03b9, 0x0737, + 0x073b, 0x0388, 0x0753, 0x0389, 0x0756, 0x0390, 0x076b, 0x038a, + 0x0777, 0x03b0, 0x0789, 0x038e, 0x0799, 0x079f, 0x07a3, 0x038c, + 0x07b8, 0x038f, 0x07bb, 0x00b4, 0x07be, 0x07c0, 0x07c2, 0x2010, + 0x07cb, 0x002e, 0x07cd, 0x07cf, 0x0020, 0x07d2, 0x07d6, 0x07db, + 0x07df, 0x07e4, 0x07ea, 0x07f0, 0x0020, 0x07f6, 0x2212, 0x0801, + 0x0805, 0x0807, 0x081d, 0x0825, 0x0827, 0x0043, 0x082d, 0x0830, + 0x0190, 0x0836, 0x0839, 0x004e, 0x0845, 0x0847, 0x084c, 0x084e, + 0x0851, 0x005a, 0x03a9, 0x005a, 0x0853, 0x0857, 0x0860, 0x0069, + 0x0862, 0x0865, 0x086f, 0x0874, 0x087a, 0x087e, 0x08a2, 0x0049, + 0x08a4, 0x08a6, 0x08a9, 0x0056, 0x08ab, 0x08ad, 0x08b0, 0x08b4, + 0x0058, 0x08b6, 0x08b8, 0x08bb, 0x08c0, 0x08c2, 0x08c5, 0x0076, + 0x08c7, 0x08c9, 0x08cc, 0x08d0, 0x0078, 0x08d2, 0x08d4, 0x08d7, + 0x08db, 0x08de, 0x08e4, 0x08e7, 0x08f0, 0x08f3, 0x08f6, 0x08f9, + 0x0902, 0x0906, 0x090b, 0x090f, 0x0914, 0x0917, 0x091a, 0x0923, + 0x092c, 0x093b, 0x093e, 0x0941, 0x0944, 0x0947, 0x094a, 0x0956, + 0x095c, 0x0960, 0x0962, 0x0964, 0x0968, 0x096a, 0x0970, 0x0978, + 0x097c, 0x0980, 0x0986, 0x0989, 0x098f, 0x0991, 0x0030, 0x0993, + 0x0999, 0x099c, 0x099e, 0x09a1, 0x09a4, 0x2d61, 0x6bcd, 0x9f9f, + 0x09a6, 0x09b1, 0x09bc, 0x09c7, 0x0a95, 0x0aa1, 0x0b15, 0x0020, + 0x0b27, 0x0b31, 0x0b8d, 0x0ba1, 0x0ba5, 0x0ba9, 0x0bad, 0x0bb1, + 0x0bb5, 0x0bb9, 0x0bbd, 0x0bc1, 0x0bc5, 0x0c21, 0x0c35, 0x0c39, + 0x0c3d, 0x0c41, 0x0c45, 0x0c49, 0x0c4d, 0x0c51, 0x0c55, 0x0c59, + 0x0c6f, 0x0c71, 0x0c73, 0x0ca0, 0x0cbc, 0x0cdc, 0x0ce4, 0x0cec, + 0x0cf4, 0x0cfc, 0x0d04, 0x0d0c, 0x0d14, 0x0d22, 0x0d2e, 0x0d7a, + 0x0d82, 0x0d85, 0x0d89, 0x0d8d, 0x0d9d, 0x0db1, 0x0db5, 0x0dbc, + 0x0dc2, 0x0dc6, 0x0e28, 0x0e2c, 0x0e30, 0x0e32, 0x0e36, 0x0e3c, + 0x0e3e, 0x0e41, 0x0e43, 0x0e46, 0x0e77, 0x0e7b, 0x0e89, 0x0e8e, + 0x0e94, 0x0e9c, 0x0ea3, 0x0ea9, 0x0eb4, 0x0ebe, 0x0ec6, 0x0eca, + 0x0ecf, 0x0ed9, 0x0edd, 0x0ee4, 0x0eec, 0x0ef3, 0x0ef8, 0x0f04, + 0x0f0a, 0x0f15, 0x0f1b, 0x0f22, 0x0f28, 0x0f33, 0x0f3d, 0x0f45, + 0x0f4c, 0x0f51, 0x0f57, 0x0f5e, 0x0f63, 0x0f69, 0x0f70, 0x0f76, + 0x0f7d, 0x0f82, 0x0f89, 0x0f8d, 0x0f9e, 0x0fa4, 0x0fa9, 0x0fad, + 0x0fb8, 0x0fbe, 0x0fc9, 0x0fd0, 0x0fd6, 0x0fda, 0x0fe1, 0x0fe5, + 0x0fef, 0x0ffa, 0x1000, 0x1004, 0x1009, 0x100f, 0x1013, 0x101a, + 0x101f, 0x1023, 0x1029, 0x102f, 0x1032, 0x1036, 0x1039, 0x103f, + 0x1045, 0x1059, 0x1061, 0x1079, 0x107c, 0x1080, 0x1095, 0x10a1, + 0x10b1, 0x10c3, 0x10cb, 0x10cf, 0x10da, 0x10de, 0x10ea, 0x10f2, + 0x10f4, 0x1100, 0x1105, 0x1111, 0x1141, 0x1149, 0x114d, 0x1153, + 0x1157, 0x115a, 0x116e, 0x1171, 0x1175, 0x117b, 0x117d, 0x1181, + 0x1184, 0x118c, 0x1192, 0x1196, 0x119c, 0x11a2, 0x11a8, 0x11ab, + 0xa76f, 0x11af, 0x11b3, 0x11b7, 0x028d, 0x11bf, 0x1211, 0x130f, + 0x140d, 0x1491, 0x1496, 0x1554, 0x156d, 0x1573, 0x1579, 0x157f, + 0x158b, 0x1597, 0x002b, 0x15a2, 0x15ba, 0x15be, 0x15c2, 0x15c6, + 0x15ca, 0x15ce, 0x15e2, 0x15e6, 0x164a, 0x1663, 0x1689, 0x168f, + 0x174d, 0x1753, 0x1758, 0x1778, 0x1878, 0x187e, 0x1912, 0x19d4, + 0x1a78, 0x1a80, 0x1a9e, 0x1aa3, 0x1ab7, 0x1ac1, 0x1ac7, 0x1adb, + 0x1ae0, 0x1ae6, 0x1af4, 0x1b24, 0x1b31, 0x1b39, 0x1b3d, 0x1b53, + 0x1bca, 0x1bdc, 0x1bde, 0x1be0, 0x3164, 0x1c21, 0x1c23, 0x1c25, + 0x1c27, 0x1c29, 0x1c2b, 0x1c49, 0x1c4e, 0x1c53, 0x1c89, 0x1ccf, + 0x1cdd, 0x1ce2, 0x1ceb, 0x1cf4, 0x1d02, 0x1d07, 0x1d0c, 0x1d1e, + 0x1d30, 0x1d39, 0x1d3e, 0x1d62, 0x1d70, 0x1d72, 0x1d74, 0x1d94, + 0x1daf, 0x1db1, 0x1db3, 0x1db5, 0x1db7, 0x1db9, 0x1dbb, 0x1dbd, + 0x1ddd, 0x1ddf, 0x1de1, 0x1de3, 0x1de5, 0x1dec, 0x1dee, 0x1df0, + 0x1df2, 0x1e01, 0x1e03, 0x1e05, 0x1e07, 0x1e09, 0x1e0b, 0x1e0d, + 0x1e0f, 0x1e11, 0x1e13, 0x1e15, 0x1e17, 0x1e19, 0x1e1b, 0x1e1d, + 0x1e21, 0x03f4, 0x1e23, 0x2207, 0x1e25, 0x2202, 0x1e27, 0x1e2f, + 0x03f4, 0x1e31, 0x2207, 0x1e33, 0x2202, 0x1e35, 0x1e3d, 0x03f4, + 0x1e3f, 0x2207, 0x1e41, 0x2202, 0x1e43, 0x1e4b, 0x03f4, 0x1e4d, + 0x2207, 0x1e4f, 0x2202, 0x1e51, 0x1e59, 0x03f4, 0x1e5b, 0x2207, + 0x1e5d, 0x2202, 0x1e5f, 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, + 0x1e73, 0x1e75, 0x1e77, 0x1e79, 0x1e81, 0x1ea4, 0x1ea8, 0x1eae, + 0x1ecb, 0x062d, 0x1ed3, 0x1edf, 0x062c, 0x1eef, 0x1f5f, 0x1f6b, + 0x1f7e, 0x1f90, 0x1fa3, 0x1fa5, 0x1fa9, 0x1faf, 0x1fb5, 0x1fb7, + 0x1fbb, 0x1fbd, 0x1fc5, 0x1fc8, 0x1fca, 0x1fd0, 0x1fd2, 0x30b5, + 0x1fd8, 0x2030, 0x2046, 0x204a, 0x204c, 0x2051, 0x209e, 0x20af, + 0x21b0, 0x21c0, 0x21c6, 0x22c0, 0x23de, +}; + +static const uint8_t unicode_decomp_data[9452] = { + 0x20, 0x88, 0x20, 0x84, 0x32, 0x33, 0x20, 0x81, + 0x20, 0xa7, 0x31, 0x6f, 0x31, 0xd0, 0x34, 0x31, + 0xd0, 0x32, 0x33, 0xd0, 0x34, 0x41, 0x80, 0x41, + 0x81, 0x41, 0x82, 0x41, 0x83, 0x41, 0x88, 0x41, + 0x8a, 0x00, 0x00, 0x43, 0xa7, 0x45, 0x80, 0x45, + 0x81, 0x45, 0x82, 0x45, 0x88, 0x49, 0x80, 0x49, + 0x81, 0x49, 0x82, 0x49, 0x88, 0x00, 0x00, 0x4e, + 0x83, 0x4f, 0x80, 0x4f, 0x81, 0x4f, 0x82, 0x4f, + 0x83, 0x4f, 0x88, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x80, 0x55, 0x81, 0x55, 0x82, 0x55, 0x88, 0x59, + 0x81, 0x00, 0x00, 0x00, 0x00, 0x61, 0x80, 0x61, + 0x81, 0x61, 0x82, 0x61, 0x83, 0x61, 0x88, 0x61, + 0x8a, 0x00, 0x00, 0x63, 0xa7, 0x65, 0x80, 0x65, + 0x81, 0x65, 0x82, 0x65, 0x88, 0x69, 0x80, 0x69, + 0x81, 0x69, 0x82, 0x69, 0x88, 0x00, 0x00, 0x6e, + 0x83, 0x6f, 0x80, 0x6f, 0x81, 0x6f, 0x82, 0x6f, + 0x83, 0x6f, 0x88, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x80, 0x75, 0x81, 0x75, 0x82, 0x75, 0x88, 0x79, + 0x81, 0x00, 0x00, 0x79, 0x88, 0x41, 0x84, 0x41, + 0x86, 0x41, 0xa8, 0x43, 0x81, 0x43, 0x82, 0x43, + 0x87, 0x43, 0x8c, 0x44, 0x8c, 0x45, 0x84, 0x45, + 0x86, 0x45, 0x87, 0x45, 0xa8, 0x45, 0x8c, 0x47, + 0x82, 0x47, 0x86, 0x47, 0x87, 0x47, 0xa7, 0x48, + 0x82, 0x49, 0x83, 0x49, 0x84, 0x49, 0x86, 0x49, + 0xa8, 0x49, 0x87, 0x49, 0x4a, 0x69, 0x6a, 0x4a, + 0x82, 0x4b, 0xa7, 0x4c, 0x81, 0x4c, 0xa7, 0x4c, + 0x8c, 0x4c, 0x00, 0x00, 0x6b, 0x20, 0x6b, 0x4e, + 0x81, 0x4e, 0xa7, 0x4e, 0x8c, 0xbc, 0x02, 0x6e, + 0x4f, 0x84, 0x4f, 0x86, 0x4f, 0x8b, 0x52, 0x81, + 0x52, 0xa7, 0x52, 0x8c, 0x53, 0x81, 0x53, 0x82, + 0x53, 0xa7, 0x53, 0x8c, 0x54, 0xa7, 0x54, 0x8c, + 0x55, 0x83, 0x55, 0x84, 0x55, 0x86, 0x55, 0x8a, + 0x55, 0x8b, 0x55, 0xa8, 0x57, 0x82, 0x59, 0x82, + 0x59, 0x88, 0x5a, 0x81, 0x5a, 0x87, 0x5a, 0x8c, + 0x4f, 0x9b, 0x55, 0x9b, 0x44, 0x00, 0x7d, 0x01, + 0x44, 0x00, 0x7e, 0x01, 0x64, 0x00, 0x7e, 0x01, + 0x4c, 0x4a, 0x4c, 0x6a, 0x6c, 0x6a, 0x4e, 0x4a, + 0x4e, 0x6a, 0x6e, 0x6a, 0x41, 0x00, 0x8c, 0x49, + 0x00, 0x8c, 0x4f, 0x00, 0x8c, 0x55, 0x00, 0x8c, + 0xdc, 0x00, 0x84, 0xdc, 0x00, 0x81, 0xdc, 0x00, + 0x8c, 0xdc, 0x00, 0x80, 0xc4, 0x00, 0x84, 0x26, + 0x02, 0x84, 0xc6, 0x00, 0x84, 0x47, 0x8c, 0x4b, + 0x8c, 0x4f, 0xa8, 0xea, 0x01, 0x84, 0xeb, 0x01, + 0x84, 0xb7, 0x01, 0x8c, 0x92, 0x02, 0x8c, 0x6a, + 0x00, 0x8c, 0x44, 0x5a, 0x44, 0x7a, 0x64, 0x7a, + 0x47, 0x81, 0x4e, 0x00, 0x80, 0xc5, 0x00, 0x81, + 0xc6, 0x00, 0x81, 0xd8, 0x00, 0x81, 0x41, 0x8f, + 0x41, 0x91, 0x45, 0x8f, 0x45, 0x91, 0x49, 0x8f, + 0x49, 0x91, 0x4f, 0x8f, 0x4f, 0x91, 0x52, 0x8f, + 0x52, 0x91, 0x55, 0x8f, 0x55, 0x91, 0x53, 0xa6, + 0x54, 0xa6, 0x48, 0x8c, 0x41, 0x00, 0x87, 0x45, + 0x00, 0xa7, 0xd6, 0x00, 0x84, 0xd5, 0x00, 0x84, + 0x4f, 0x00, 0x87, 0x2e, 0x02, 0x84, 0x59, 0x00, + 0x84, 0x68, 0x00, 0x66, 0x02, 0x6a, 0x00, 0x72, + 0x00, 0x79, 0x02, 0x7b, 0x02, 0x81, 0x02, 0x77, + 0x00, 0x79, 0x00, 0x20, 0x86, 0x20, 0x87, 0x20, + 0x8a, 0x20, 0xa8, 0x20, 0x83, 0x20, 0x8b, 0x63, + 0x02, 0x6c, 0x00, 0x73, 0x00, 0x78, 0x00, 0x95, + 0x02, 0x80, 0x81, 0x00, 0x93, 0x88, 0x81, 0x20, + 0xc5, 0x20, 0x81, 0xa8, 0x00, 0x81, 0x91, 0x03, + 0x81, 0x95, 0x03, 0x81, 0x97, 0x03, 0x81, 0x99, + 0x03, 0x81, 0x00, 0x00, 0x00, 0x9f, 0x03, 0x81, + 0x00, 0x00, 0x00, 0xa5, 0x03, 0x81, 0xa9, 0x03, + 0x81, 0xca, 0x03, 0x81, 0x01, 0x03, 0x98, 0x07, + 0xa4, 0x07, 0xb0, 0x00, 0xb4, 0x00, 0xb6, 0x00, + 0xb8, 0x00, 0xca, 0x00, 0x01, 0x03, 0xb8, 0x07, + 0xc4, 0x07, 0xbe, 0x00, 0xc4, 0x00, 0xc8, 0x00, + 0xa5, 0x03, 0x0d, 0x13, 0x00, 0x01, 0x03, 0xd1, + 0x00, 0xd1, 0x07, 0xc6, 0x03, 0xc0, 0x03, 0xba, + 0x03, 0xc1, 0x03, 0xc2, 0x03, 0x00, 0x00, 0x98, + 0x03, 0xb5, 0x03, 0x15, 0x04, 0x80, 0x15, 0x04, + 0x88, 0x00, 0x00, 0x00, 0x13, 0x04, 0x81, 0x06, + 0x04, 0x88, 0x1a, 0x04, 0x81, 0x18, 0x04, 0x80, + 0x23, 0x04, 0x86, 0x18, 0x04, 0x86, 0x38, 0x04, + 0x86, 0x35, 0x04, 0x80, 0x35, 0x04, 0x88, 0x00, + 0x00, 0x00, 0x33, 0x04, 0x81, 0x56, 0x04, 0x88, + 0x3a, 0x04, 0x81, 0x38, 0x04, 0x80, 0x43, 0x04, + 0x86, 0x74, 0x04, 0x8f, 0x16, 0x04, 0x86, 0x10, + 0x04, 0x86, 0x10, 0x04, 0x88, 0x15, 0x04, 0x86, + 0xd8, 0x04, 0x88, 0x16, 0x04, 0x88, 0x17, 0x04, + 0x88, 0x18, 0x04, 0x84, 0x18, 0x04, 0x88, 0x1e, + 0x04, 0x88, 0xe8, 0x04, 0x88, 0x2d, 0x04, 0x88, + 0x23, 0x04, 0x84, 0x23, 0x04, 0x88, 0x23, 0x04, + 0x8b, 0x27, 0x04, 0x88, 0x2b, 0x04, 0x88, 0x65, + 0x05, 0x82, 0x05, 0x27, 0x06, 0x00, 0x2c, 0x00, + 0x2d, 0x21, 0x2d, 0x00, 0x2e, 0x23, 0x2d, 0x27, + 0x06, 0x00, 0x4d, 0x21, 0x4d, 0xa0, 0x4d, 0x23, + 0x4d, 0xd5, 0x06, 0x54, 0x06, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0x06, 0x54, 0x06, 0xd2, 0x06, 0x54, + 0x06, 0x28, 0x09, 0x3c, 0x09, 0x30, 0x09, 0x3c, + 0x09, 0x33, 0x09, 0x3c, 0x09, 0x15, 0x09, 0x00, + 0x27, 0x01, 0x27, 0x02, 0x27, 0x07, 0x27, 0x0c, + 0x27, 0x0d, 0x27, 0x16, 0x27, 0x1a, 0x27, 0xbe, + 0x09, 0x09, 0x00, 0x09, 0x19, 0xa1, 0x09, 0xbc, + 0x09, 0xaf, 0x09, 0xbc, 0x09, 0x32, 0x0a, 0x3c, + 0x0a, 0x38, 0x0a, 0x3c, 0x0a, 0x16, 0x0a, 0x00, + 0x26, 0x01, 0x26, 0x06, 0x26, 0x2b, 0x0a, 0x3c, + 0x0a, 0x47, 0x0b, 0x56, 0x0b, 0x3e, 0x0b, 0x09, + 0x00, 0x09, 0x19, 0x21, 0x0b, 0x3c, 0x0b, 0x92, + 0x0b, 0xd7, 0x0b, 0xbe, 0x0b, 0x08, 0x00, 0x09, + 0x00, 0x08, 0x19, 0x46, 0x0c, 0x56, 0x0c, 0xbf, + 0x0c, 0xd5, 0x0c, 0xc6, 0x0c, 0xd5, 0x0c, 0xc2, + 0x0c, 0x04, 0x00, 0x08, 0x13, 0x3e, 0x0d, 0x08, + 0x00, 0x09, 0x00, 0x08, 0x19, 0xd9, 0x0d, 0xca, + 0x0d, 0xca, 0x0d, 0x0f, 0x05, 0x12, 0x00, 0x0f, + 0x15, 0x4d, 0x0e, 0x32, 0x0e, 0xcd, 0x0e, 0xb2, + 0x0e, 0x99, 0x0e, 0x12, 0x00, 0x12, 0x08, 0x42, + 0x0f, 0xb7, 0x0f, 0x4c, 0x0f, 0xb7, 0x0f, 0x51, + 0x0f, 0xb7, 0x0f, 0x56, 0x0f, 0xb7, 0x0f, 0x5b, + 0x0f, 0xb7, 0x0f, 0x40, 0x0f, 0xb5, 0x0f, 0x71, + 0x0f, 0x72, 0x0f, 0x71, 0x0f, 0x00, 0x03, 0x41, + 0x0f, 0xb2, 0x0f, 0x81, 0x0f, 0xb3, 0x0f, 0x80, + 0x0f, 0xb3, 0x0f, 0x81, 0x0f, 0x71, 0x0f, 0x80, + 0x0f, 0x92, 0x0f, 0xb7, 0x0f, 0x9c, 0x0f, 0xb7, + 0x0f, 0xa1, 0x0f, 0xb7, 0x0f, 0xa6, 0x0f, 0xb7, + 0x0f, 0xab, 0x0f, 0xb7, 0x0f, 0x90, 0x0f, 0xb5, + 0x0f, 0x25, 0x10, 0x2e, 0x10, 0x05, 0x1b, 0x35, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1b, 0x35, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x09, 0x1b, 0x35, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x1b, 0x35, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x1b, 0x35, + 0x1b, 0x11, 0x1b, 0x35, 0x1b, 0x3a, 0x1b, 0x35, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1b, 0x35, + 0x1b, 0x3e, 0x1b, 0x35, 0x1b, 0x42, 0x1b, 0x35, + 0x1b, 0x41, 0x00, 0xc6, 0x00, 0x42, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x45, 0x00, 0x8e, 0x01, 0x47, + 0x00, 0x4f, 0x00, 0x22, 0x02, 0x50, 0x00, 0x52, + 0x00, 0x54, 0x00, 0x55, 0x00, 0x57, 0x00, 0x61, + 0x00, 0x50, 0x02, 0x51, 0x02, 0x02, 0x1d, 0x62, + 0x00, 0x64, 0x00, 0x65, 0x00, 0x59, 0x02, 0x5b, + 0x02, 0x5c, 0x02, 0x67, 0x00, 0x00, 0x00, 0x6b, + 0x00, 0x6d, 0x00, 0x4b, 0x01, 0x6f, 0x00, 0x54, + 0x02, 0x16, 0x1d, 0x17, 0x1d, 0x70, 0x00, 0x74, + 0x00, 0x75, 0x00, 0x1d, 0x1d, 0x6f, 0x02, 0x76, + 0x00, 0x25, 0x1d, 0xb2, 0x03, 0xb3, 0x03, 0xb4, + 0x03, 0xc6, 0x03, 0xc7, 0x03, 0x69, 0x00, 0x72, + 0x00, 0x75, 0x00, 0x76, 0x00, 0xb2, 0x03, 0xb3, + 0x03, 0xc1, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0x52, + 0x02, 0x63, 0x00, 0x55, 0x02, 0xf0, 0x00, 0x5c, + 0x02, 0x66, 0x00, 0x5f, 0x02, 0x61, 0x02, 0x65, + 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x7b, + 0x1d, 0x9d, 0x02, 0x6d, 0x02, 0x85, 0x1d, 0x9f, + 0x02, 0x71, 0x02, 0x70, 0x02, 0x72, 0x02, 0x73, + 0x02, 0x74, 0x02, 0x75, 0x02, 0x78, 0x02, 0x82, + 0x02, 0x83, 0x02, 0xab, 0x01, 0x89, 0x02, 0x8a, + 0x02, 0x1c, 0x1d, 0x8b, 0x02, 0x8c, 0x02, 0x7a, + 0x00, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0xb8, + 0x03, 0x41, 0x00, 0xa5, 0x42, 0x00, 0x87, 0x42, + 0x00, 0xa3, 0x42, 0x00, 0xb1, 0xc7, 0x00, 0x81, + 0x44, 0x00, 0x87, 0x44, 0x00, 0xa3, 0x44, 0x00, + 0xb1, 0x44, 0x00, 0xa7, 0x44, 0x00, 0xad, 0x12, + 0x01, 0x80, 0x12, 0x01, 0x81, 0x45, 0x00, 0xad, + 0x45, 0x00, 0xb0, 0x28, 0x02, 0x86, 0x46, 0x00, + 0x87, 0x47, 0x00, 0x84, 0x48, 0x00, 0x87, 0x48, + 0x00, 0xa3, 0x48, 0x00, 0x88, 0x48, 0x00, 0xa7, + 0x48, 0x00, 0xae, 0x49, 0x00, 0xb0, 0xcf, 0x00, + 0x81, 0x4b, 0x00, 0x81, 0x4b, 0x00, 0xa3, 0x4b, + 0x00, 0xb1, 0x4c, 0x00, 0xa3, 0x36, 0x1e, 0x84, + 0x4c, 0xb1, 0x4c, 0xad, 0x4d, 0x81, 0x4d, 0x87, + 0x4d, 0xa3, 0x4e, 0x87, 0x4e, 0xa3, 0x4e, 0xb1, + 0x4e, 0xad, 0xd5, 0x00, 0x81, 0xd5, 0x00, 0x88, + 0x4c, 0x01, 0x80, 0x4c, 0x01, 0x81, 0x50, 0x00, + 0x81, 0x50, 0x00, 0x87, 0x52, 0x00, 0x87, 0x52, + 0x00, 0xa3, 0x5a, 0x1e, 0x84, 0x52, 0x00, 0xb1, + 0x53, 0x00, 0x87, 0x53, 0x00, 0xa3, 0x5a, 0x01, + 0x87, 0x60, 0x01, 0x87, 0x62, 0x1e, 0x87, 0x54, + 0x00, 0x87, 0x54, 0x00, 0xa3, 0x54, 0x00, 0xb1, + 0x54, 0x00, 0xad, 0x55, 0x00, 0xa4, 0x55, 0x00, + 0xb0, 0x55, 0x00, 0xad, 0x68, 0x01, 0x81, 0x6a, + 0x01, 0x88, 0x56, 0x83, 0x56, 0xa3, 0x57, 0x80, + 0x57, 0x81, 0x57, 0x88, 0x57, 0x87, 0x57, 0xa3, + 0x58, 0x87, 0x58, 0x88, 0x59, 0x87, 0x5a, 0x82, + 0x5a, 0xa3, 0x5a, 0xb1, 0x68, 0xb1, 0x74, 0x88, + 0x77, 0x8a, 0x79, 0x8a, 0x61, 0x00, 0xbe, 0x02, + 0x7f, 0x01, 0x87, 0x41, 0x00, 0xa3, 0x41, 0x00, + 0x89, 0xc2, 0x00, 0x81, 0xc2, 0x00, 0x80, 0xc2, + 0x00, 0x89, 0xc2, 0x00, 0x83, 0xa0, 0x1e, 0x82, + 0x02, 0x01, 0x81, 0x02, 0x01, 0x80, 0x02, 0x01, + 0x89, 0x02, 0x01, 0x83, 0xa0, 0x1e, 0x86, 0x45, + 0x00, 0xa3, 0x45, 0x00, 0x89, 0x45, 0x00, 0x83, + 0xca, 0x00, 0x81, 0xca, 0x00, 0x80, 0xca, 0x00, + 0x89, 0xca, 0x00, 0x83, 0xb8, 0x1e, 0x82, 0x49, + 0x00, 0x89, 0x49, 0x00, 0xa3, 0x4f, 0x00, 0xa3, + 0x4f, 0x00, 0x89, 0xd4, 0x00, 0x81, 0xd4, 0x00, + 0x80, 0xd4, 0x00, 0x89, 0xd4, 0x00, 0x83, 0xcc, + 0x1e, 0x82, 0xa0, 0x01, 0x81, 0xa0, 0x01, 0x80, + 0xa0, 0x01, 0x89, 0xa0, 0x01, 0x83, 0xa0, 0x01, + 0xa3, 0x55, 0x00, 0xa3, 0x55, 0x00, 0x89, 0xaf, + 0x01, 0x81, 0xaf, 0x01, 0x80, 0xaf, 0x01, 0x89, + 0xaf, 0x01, 0x83, 0xaf, 0x01, 0xa3, 0x59, 0x00, + 0x80, 0x59, 0x00, 0xa3, 0x59, 0x00, 0x89, 0x59, + 0x00, 0x83, 0xb1, 0x03, 0x13, 0x03, 0x00, 0x1f, + 0x80, 0x00, 0x1f, 0x81, 0x00, 0x1f, 0xc2, 0x91, + 0x03, 0x13, 0x03, 0x08, 0x1f, 0x80, 0x08, 0x1f, + 0x81, 0x08, 0x1f, 0xc2, 0xb5, 0x03, 0x13, 0x03, + 0x10, 0x1f, 0x80, 0x10, 0x1f, 0x81, 0x95, 0x03, + 0x13, 0x03, 0x18, 0x1f, 0x80, 0x18, 0x1f, 0x81, + 0xb7, 0x03, 0x93, 0xb7, 0x03, 0x94, 0x20, 0x1f, + 0x80, 0x21, 0x1f, 0x80, 0x20, 0x1f, 0x81, 0x21, + 0x1f, 0x81, 0x20, 0x1f, 0xc2, 0x21, 0x1f, 0xc2, + 0x97, 0x03, 0x93, 0x97, 0x03, 0x94, 0x28, 0x1f, + 0x80, 0x29, 0x1f, 0x80, 0x28, 0x1f, 0x81, 0x29, + 0x1f, 0x81, 0x28, 0x1f, 0xc2, 0x29, 0x1f, 0xc2, + 0xb9, 0x03, 0x93, 0xb9, 0x03, 0x94, 0x30, 0x1f, + 0x80, 0x31, 0x1f, 0x80, 0x30, 0x1f, 0x81, 0x31, + 0x1f, 0x81, 0x30, 0x1f, 0xc2, 0x31, 0x1f, 0xc2, + 0x99, 0x03, 0x93, 0x99, 0x03, 0x94, 0x38, 0x1f, + 0x80, 0x39, 0x1f, 0x80, 0x38, 0x1f, 0x81, 0x39, + 0x1f, 0x81, 0x38, 0x1f, 0xc2, 0x39, 0x1f, 0xc2, + 0xbf, 0x03, 0x93, 0xbf, 0x03, 0x94, 0x40, 0x1f, + 0x80, 0x40, 0x1f, 0x81, 0x9f, 0x03, 0x13, 0x03, + 0x48, 0x1f, 0x80, 0x48, 0x1f, 0x81, 0xc5, 0x03, + 0x13, 0x03, 0x50, 0x1f, 0x80, 0x50, 0x1f, 0x81, + 0x50, 0x1f, 0xc2, 0xa5, 0x03, 0x94, 0x00, 0x00, + 0x00, 0x59, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x59, + 0x1f, 0x81, 0x00, 0x00, 0x00, 0x59, 0x1f, 0xc2, + 0xc9, 0x03, 0x93, 0xc9, 0x03, 0x94, 0x60, 0x1f, + 0x80, 0x61, 0x1f, 0x80, 0x60, 0x1f, 0x81, 0x61, + 0x1f, 0x81, 0x60, 0x1f, 0xc2, 0x61, 0x1f, 0xc2, + 0xa9, 0x03, 0x93, 0xa9, 0x03, 0x94, 0x68, 0x1f, + 0x80, 0x69, 0x1f, 0x80, 0x68, 0x1f, 0x81, 0x69, + 0x1f, 0x81, 0x68, 0x1f, 0xc2, 0x69, 0x1f, 0xc2, + 0xb1, 0x03, 0x80, 0xb5, 0x03, 0x80, 0xb7, 0x03, + 0x80, 0xb9, 0x03, 0x80, 0xbf, 0x03, 0x80, 0xc5, + 0x03, 0x80, 0xc9, 0x03, 0x80, 0x00, 0x1f, 0x45, + 0x03, 0x20, 0x1f, 0x45, 0x03, 0x60, 0x1f, 0x45, + 0x03, 0xb1, 0x03, 0x86, 0xb1, 0x03, 0x84, 0x70, + 0x1f, 0xc5, 0xb1, 0x03, 0xc5, 0xac, 0x03, 0xc5, + 0x00, 0x00, 0x00, 0xb1, 0x03, 0xc2, 0xb6, 0x1f, + 0xc5, 0x91, 0x03, 0x86, 0x91, 0x03, 0x84, 0x91, + 0x03, 0x80, 0x91, 0x03, 0xc5, 0x20, 0x93, 0x20, + 0x93, 0x20, 0xc2, 0xa8, 0x00, 0xc2, 0x74, 0x1f, + 0xc5, 0xb7, 0x03, 0xc5, 0xae, 0x03, 0xc5, 0x00, + 0x00, 0x00, 0xb7, 0x03, 0xc2, 0xc6, 0x1f, 0xc5, + 0x95, 0x03, 0x80, 0x97, 0x03, 0x80, 0x97, 0x03, + 0xc5, 0xbf, 0x1f, 0x80, 0xbf, 0x1f, 0x81, 0xbf, + 0x1f, 0xc2, 0xb9, 0x03, 0x86, 0xb9, 0x03, 0x84, + 0xca, 0x03, 0x80, 0x00, 0x03, 0xb9, 0x42, 0xca, + 0x42, 0x99, 0x06, 0x99, 0x04, 0x99, 0x00, 0xfe, + 0x1f, 0x80, 0xfe, 0x1f, 0x81, 0xfe, 0x1f, 0xc2, + 0xc5, 0x03, 0x86, 0xc5, 0x03, 0x84, 0xcb, 0x03, + 0x80, 0x00, 0x03, 0xc1, 0x13, 0xc1, 0x14, 0xc5, + 0x42, 0xcb, 0x42, 0xa5, 0x06, 0xa5, 0x04, 0xa5, + 0x00, 0xa1, 0x03, 0x94, 0xa8, 0x00, 0x80, 0x85, + 0x03, 0x60, 0x00, 0x7c, 0x1f, 0xc5, 0xc9, 0x03, + 0xc5, 0xce, 0x03, 0xc5, 0x00, 0x00, 0x00, 0xc9, + 0x03, 0xc2, 0xf6, 0x1f, 0xc5, 0x9f, 0x03, 0x80, + 0xa9, 0x03, 0x80, 0xa9, 0x03, 0xc5, 0x20, 0x94, + 0x02, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0xb3, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x32, 0x20, 0x32, 0x20, 0x32, 0x20, + 0x00, 0x00, 0x00, 0x35, 0x20, 0x35, 0x20, 0x35, + 0x20, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00, 0x00, + 0x20, 0x85, 0x3f, 0x3f, 0x3f, 0x21, 0x21, 0x3f, + 0x32, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x69, + 0x00, 0x00, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x2b, 0x3d, 0x28, 0x29, 0x6e, 0x30, 0x00, 0x2b, + 0x00, 0x12, 0x22, 0x3d, 0x00, 0x28, 0x00, 0x29, + 0x00, 0x00, 0x00, 0x61, 0x00, 0x65, 0x00, 0x6f, + 0x00, 0x78, 0x00, 0x59, 0x02, 0x68, 0x6b, 0x6c, + 0x6d, 0x6e, 0x70, 0x73, 0x74, 0x52, 0x73, 0x61, + 0x2f, 0x63, 0x61, 0x2f, 0x73, 0xb0, 0x00, 0x43, + 0x63, 0x2f, 0x6f, 0x63, 0x2f, 0x75, 0xb0, 0x00, + 0x46, 0x48, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, + 0xdf, 0x01, 0x01, 0x04, 0x24, 0x4e, 0x6f, 0x50, + 0x51, 0x52, 0x52, 0x52, 0x53, 0x4d, 0x54, 0x45, + 0x4c, 0x54, 0x4d, 0x4b, 0x00, 0xc5, 0x00, 0x42, + 0x43, 0x00, 0x65, 0x45, 0x46, 0x00, 0x4d, 0x6f, + 0xd0, 0x05, 0x46, 0x41, 0x58, 0xc0, 0x03, 0xb3, + 0x03, 0x93, 0x03, 0xa0, 0x03, 0x11, 0x22, 0x44, + 0x64, 0x65, 0x69, 0x6a, 0x31, 0xd0, 0x37, 0x31, + 0xd0, 0x39, 0x31, 0xd0, 0x31, 0x30, 0x31, 0xd0, + 0x33, 0x32, 0xd0, 0x33, 0x31, 0xd0, 0x35, 0x32, + 0xd0, 0x35, 0x33, 0xd0, 0x35, 0x34, 0xd0, 0x35, + 0x31, 0xd0, 0x36, 0x35, 0xd0, 0x36, 0x31, 0xd0, + 0x38, 0x33, 0xd0, 0x38, 0x35, 0xd0, 0x38, 0x37, + 0xd0, 0x38, 0x31, 0xd0, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x56, 0x56, 0x49, 0x56, 0x49, 0x49, + 0x56, 0x49, 0x49, 0x49, 0x49, 0x58, 0x58, 0x49, + 0x58, 0x49, 0x49, 0x4c, 0x43, 0x44, 0x4d, 0x69, + 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x76, 0x76, + 0x69, 0x76, 0x69, 0x69, 0x76, 0x69, 0x69, 0x69, + 0x69, 0x78, 0x78, 0x69, 0x78, 0x69, 0x69, 0x6c, + 0x63, 0x64, 0x6d, 0x30, 0xd0, 0x33, 0x90, 0x21, + 0xb8, 0x92, 0x21, 0xb8, 0x94, 0x21, 0xb8, 0xd0, + 0x21, 0xb8, 0xd4, 0x21, 0xb8, 0xd2, 0x21, 0xb8, + 0x03, 0x22, 0xb8, 0x08, 0x22, 0xb8, 0x0b, 0x22, + 0xb8, 0x23, 0x22, 0xb8, 0x00, 0x00, 0x00, 0x25, + 0x22, 0xb8, 0x2b, 0x22, 0x2b, 0x22, 0x2b, 0x22, + 0x00, 0x00, 0x00, 0x2e, 0x22, 0x2e, 0x22, 0x2e, + 0x22, 0x00, 0x00, 0x00, 0x3c, 0x22, 0xb8, 0x43, + 0x22, 0xb8, 0x45, 0x22, 0xb8, 0x00, 0x00, 0x00, + 0x48, 0x22, 0xb8, 0x3d, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x61, 0x22, 0xb8, 0x4d, 0x22, 0xb8, 0x3c, + 0x00, 0xb8, 0x3e, 0x00, 0xb8, 0x64, 0x22, 0xb8, + 0x65, 0x22, 0xb8, 0x72, 0x22, 0xb8, 0x76, 0x22, + 0xb8, 0x7a, 0x22, 0xb8, 0x82, 0x22, 0xb8, 0x86, + 0x22, 0xb8, 0xa2, 0x22, 0xb8, 0xa8, 0x22, 0xb8, + 0xa9, 0x22, 0xb8, 0xab, 0x22, 0xb8, 0x7c, 0x22, + 0xb8, 0x91, 0x22, 0xb8, 0xb2, 0x22, 0x38, 0x03, + 0x08, 0x30, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, + 0x32, 0x30, 0x28, 0x00, 0x31, 0x00, 0x29, 0x00, + 0x28, 0x00, 0x31, 0x00, 0x30, 0x00, 0x29, 0x00, + 0x28, 0x32, 0x30, 0x29, 0x31, 0x00, 0x2e, 0x00, + 0x31, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x32, 0x30, + 0x2e, 0x28, 0x00, 0x61, 0x00, 0x29, 0x00, 0x41, + 0x00, 0x61, 0x00, 0x2b, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x3a, 0x3a, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0xdd, 0x2a, 0xb8, 0x6a, 0x56, 0x00, 0x4e, + 0x00, 0x28, 0x36, 0x3f, 0x59, 0x85, 0x8c, 0xa0, + 0xba, 0x3f, 0x51, 0x00, 0x26, 0x2c, 0x43, 0x57, + 0x6c, 0xa1, 0xb6, 0xc1, 0x9b, 0x52, 0x00, 0x5e, + 0x7a, 0x7f, 0x9d, 0xa6, 0xc1, 0xce, 0xe7, 0xb6, + 0x53, 0xc8, 0x53, 0xe3, 0x53, 0xd7, 0x56, 0x1f, + 0x57, 0xeb, 0x58, 0x02, 0x59, 0x0a, 0x59, 0x15, + 0x59, 0x27, 0x59, 0x73, 0x59, 0x50, 0x5b, 0x80, + 0x5b, 0xf8, 0x5b, 0x0f, 0x5c, 0x22, 0x5c, 0x38, + 0x5c, 0x6e, 0x5c, 0x71, 0x5c, 0xdb, 0x5d, 0xe5, + 0x5d, 0xf1, 0x5d, 0xfe, 0x5d, 0x72, 0x5e, 0x7a, + 0x5e, 0x7f, 0x5e, 0xf4, 0x5e, 0xfe, 0x5e, 0x0b, + 0x5f, 0x13, 0x5f, 0x50, 0x5f, 0x61, 0x5f, 0x73, + 0x5f, 0xc3, 0x5f, 0x08, 0x62, 0x36, 0x62, 0x4b, + 0x62, 0x2f, 0x65, 0x34, 0x65, 0x87, 0x65, 0x97, + 0x65, 0xa4, 0x65, 0xb9, 0x65, 0xe0, 0x65, 0xe5, + 0x65, 0xf0, 0x66, 0x08, 0x67, 0x28, 0x67, 0x20, + 0x6b, 0x62, 0x6b, 0x79, 0x6b, 0xb3, 0x6b, 0xcb, + 0x6b, 0xd4, 0x6b, 0xdb, 0x6b, 0x0f, 0x6c, 0x14, + 0x6c, 0x34, 0x6c, 0x6b, 0x70, 0x2a, 0x72, 0x36, + 0x72, 0x3b, 0x72, 0x3f, 0x72, 0x47, 0x72, 0x59, + 0x72, 0x5b, 0x72, 0xac, 0x72, 0x84, 0x73, 0x89, + 0x73, 0xdc, 0x74, 0xe6, 0x74, 0x18, 0x75, 0x1f, + 0x75, 0x28, 0x75, 0x30, 0x75, 0x8b, 0x75, 0x92, + 0x75, 0x76, 0x76, 0x7d, 0x76, 0xae, 0x76, 0xbf, + 0x76, 0xee, 0x76, 0xdb, 0x77, 0xe2, 0x77, 0xf3, + 0x77, 0x3a, 0x79, 0xb8, 0x79, 0xbe, 0x79, 0x74, + 0x7a, 0xcb, 0x7a, 0xf9, 0x7a, 0x73, 0x7c, 0xf8, + 0x7c, 0x36, 0x7f, 0x51, 0x7f, 0x8a, 0x7f, 0xbd, + 0x7f, 0x01, 0x80, 0x0c, 0x80, 0x12, 0x80, 0x33, + 0x80, 0x7f, 0x80, 0x89, 0x80, 0xe3, 0x81, 0x00, + 0x07, 0x10, 0x19, 0x29, 0x38, 0x3c, 0x8b, 0x8f, + 0x95, 0x4d, 0x86, 0x6b, 0x86, 0x40, 0x88, 0x4c, + 0x88, 0x63, 0x88, 0x7e, 0x89, 0x8b, 0x89, 0xd2, + 0x89, 0x00, 0x8a, 0x37, 0x8c, 0x46, 0x8c, 0x55, + 0x8c, 0x78, 0x8c, 0x9d, 0x8c, 0x64, 0x8d, 0x70, + 0x8d, 0xb3, 0x8d, 0xab, 0x8e, 0xca, 0x8e, 0x9b, + 0x8f, 0xb0, 0x8f, 0xb5, 0x8f, 0x91, 0x90, 0x49, + 0x91, 0xc6, 0x91, 0xcc, 0x91, 0xd1, 0x91, 0x77, + 0x95, 0x80, 0x95, 0x1c, 0x96, 0xb6, 0x96, 0xb9, + 0x96, 0xe8, 0x96, 0x51, 0x97, 0x5e, 0x97, 0x62, + 0x97, 0x69, 0x97, 0xcb, 0x97, 0xed, 0x97, 0xf3, + 0x97, 0x01, 0x98, 0xa8, 0x98, 0xdb, 0x98, 0xdf, + 0x98, 0x96, 0x99, 0x99, 0x99, 0xac, 0x99, 0xa8, + 0x9a, 0xd8, 0x9a, 0xdf, 0x9a, 0x25, 0x9b, 0x2f, + 0x9b, 0x32, 0x9b, 0x3c, 0x9b, 0x5a, 0x9b, 0xe5, + 0x9c, 0x75, 0x9e, 0x7f, 0x9e, 0xa5, 0x9e, 0x00, + 0x16, 0x1e, 0x28, 0x2c, 0x54, 0x58, 0x69, 0x6e, + 0x7b, 0x96, 0xa5, 0xad, 0xe8, 0xf7, 0xfb, 0x12, + 0x30, 0x00, 0x00, 0x41, 0x53, 0x44, 0x53, 0x45, + 0x53, 0x4b, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x51, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x57, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x59, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x5f, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x30, 0x99, 0x30, 0x64, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x66, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0x30, 0x99, + 0x30, 0x6f, 0x30, 0x99, 0x30, 0x72, 0x30, 0x99, + 0x30, 0x75, 0x30, 0x99, 0x30, 0x78, 0x30, 0x99, + 0x30, 0x7b, 0x30, 0x99, 0x30, 0x46, 0x30, 0x99, + 0x30, 0x20, 0x00, 0x99, 0x30, 0x9d, 0x30, 0x99, + 0x30, 0x88, 0x30, 0x8a, 0x30, 0xab, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xad, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xb7, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x30, 0x99, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x30, 0x99, + 0x30, 0xc4, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x30, 0x99, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xc8, 0x30, 0x99, 0x30, 0xcf, 0x30, 0x99, + 0x30, 0xd2, 0x30, 0x99, 0x30, 0xd5, 0x30, 0x99, + 0x30, 0xd8, 0x30, 0x99, 0x30, 0xdb, 0x30, 0x99, + 0x30, 0xa6, 0x30, 0x99, 0x30, 0xef, 0x30, 0x99, + 0x30, 0xfd, 0x30, 0x99, 0x30, 0xb3, 0x30, 0xc8, + 0x30, 0x00, 0x11, 0x00, 0x01, 0xaa, 0x02, 0xac, + 0xad, 0x03, 0x04, 0x05, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0x1a, 0x06, 0x07, 0x08, 0x21, 0x09, + 0x11, 0x61, 0x11, 0x14, 0x11, 0x4c, 0x00, 0x01, + 0xb3, 0xb4, 0xb8, 0xba, 0xbf, 0xc3, 0xc5, 0x08, + 0xc9, 0xcb, 0x09, 0x0a, 0x0c, 0x0e, 0x0f, 0x13, + 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1e, 0x22, + 0x2c, 0x33, 0x38, 0xdd, 0xde, 0x43, 0x44, 0x45, + 0x70, 0x71, 0x74, 0x7d, 0x7e, 0x80, 0x8a, 0x8d, + 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x4e, 0xdb, 0x56, + 0x0a, 0x4e, 0x2d, 0x4e, 0x0b, 0x4e, 0x32, 0x75, + 0x59, 0x4e, 0x19, 0x4e, 0x01, 0x4e, 0x29, 0x59, + 0x30, 0x57, 0xba, 0x4e, 0x28, 0x00, 0x29, 0x00, + 0x00, 0x11, 0x02, 0x11, 0x03, 0x11, 0x05, 0x11, + 0x06, 0x11, 0x07, 0x11, 0x09, 0x11, 0x0b, 0x11, + 0x0c, 0x11, 0x0e, 0x11, 0x0f, 0x11, 0x10, 0x11, + 0x11, 0x11, 0x12, 0x11, 0x28, 0x00, 0x00, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x02, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x05, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x09, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x0b, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x0e, 0x11, + 0x61, 0x11, 0x29, 0x00, 0x28, 0x00, 0x0c, 0x11, + 0x6e, 0x11, 0x29, 0x00, 0x28, 0x00, 0x0b, 0x11, + 0x69, 0x11, 0x0c, 0x11, 0x65, 0x11, 0xab, 0x11, + 0x29, 0x00, 0x28, 0x00, 0x0b, 0x11, 0x69, 0x11, + 0x12, 0x11, 0x6e, 0x11, 0x29, 0x00, 0x28, 0x00, + 0x29, 0x00, 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x4e, + 0xdb, 0x56, 0x94, 0x4e, 0x6d, 0x51, 0x03, 0x4e, + 0x6b, 0x51, 0x5d, 0x4e, 0x41, 0x53, 0x08, 0x67, + 0x6b, 0x70, 0x34, 0x6c, 0x28, 0x67, 0xd1, 0x91, + 0x1f, 0x57, 0xe5, 0x65, 0x2a, 0x68, 0x09, 0x67, + 0x3e, 0x79, 0x0d, 0x54, 0x79, 0x72, 0xa1, 0x8c, + 0x5d, 0x79, 0xb4, 0x52, 0xe3, 0x4e, 0x7c, 0x54, + 0x66, 0x5b, 0xe3, 0x76, 0x01, 0x4f, 0xc7, 0x8c, + 0x54, 0x53, 0x6d, 0x79, 0x11, 0x4f, 0xea, 0x81, + 0xf3, 0x81, 0x4f, 0x55, 0x7c, 0x5e, 0x87, 0x65, + 0x8f, 0x7b, 0x50, 0x54, 0x45, 0x32, 0x00, 0x31, + 0x00, 0x33, 0x00, 0x30, 0x00, 0x00, 0x11, 0x00, + 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x0c, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x00, 0x11, 0x00, + 0x61, 0x02, 0x61, 0x03, 0x61, 0x05, 0x61, 0x06, + 0x61, 0x07, 0x61, 0x09, 0x61, 0x0b, 0x61, 0x0c, + 0x61, 0x0e, 0x11, 0x61, 0x11, 0x00, 0x11, 0x0e, + 0x61, 0xb7, 0x00, 0x69, 0x0b, 0x11, 0x01, 0x63, + 0x00, 0x69, 0x0b, 0x11, 0x6e, 0x11, 0x00, 0x4e, + 0x8c, 0x4e, 0x09, 0x4e, 0xdb, 0x56, 0x94, 0x4e, + 0x6d, 0x51, 0x03, 0x4e, 0x6b, 0x51, 0x5d, 0x4e, + 0x41, 0x53, 0x08, 0x67, 0x6b, 0x70, 0x34, 0x6c, + 0x28, 0x67, 0xd1, 0x91, 0x1f, 0x57, 0xe5, 0x65, + 0x2a, 0x68, 0x09, 0x67, 0x3e, 0x79, 0x0d, 0x54, + 0x79, 0x72, 0xa1, 0x8c, 0x5d, 0x79, 0xb4, 0x52, + 0xd8, 0x79, 0x37, 0x75, 0x73, 0x59, 0x69, 0x90, + 0x2a, 0x51, 0x70, 0x53, 0xe8, 0x6c, 0x05, 0x98, + 0x11, 0x4f, 0x99, 0x51, 0x63, 0x6b, 0x0a, 0x4e, + 0x2d, 0x4e, 0x0b, 0x4e, 0xe6, 0x5d, 0xf3, 0x53, + 0x3b, 0x53, 0x97, 0x5b, 0x66, 0x5b, 0xe3, 0x76, + 0x01, 0x4f, 0xc7, 0x8c, 0x54, 0x53, 0x1c, 0x59, + 0x33, 0x00, 0x36, 0x00, 0x34, 0x00, 0x30, 0x00, + 0x35, 0x30, 0x31, 0x00, 0x08, 0x67, 0x31, 0x00, + 0x30, 0x00, 0x08, 0x67, 0x48, 0x67, 0x65, 0x72, + 0x67, 0x65, 0x56, 0x4c, 0x54, 0x44, 0xa2, 0x30, + 0x00, 0x02, 0x04, 0x06, 0x08, 0x09, 0x0b, 0x0d, + 0x0f, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, + 0x1f, 0x22, 0x24, 0x26, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x30, 0x33, 0x36, 0x39, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x42, 0x44, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0xe4, + 0x4e, 0x8c, 0x54, 0xa1, 0x30, 0x01, 0x30, 0x5b, + 0x27, 0x01, 0x4a, 0x34, 0x00, 0x01, 0x52, 0x39, + 0x01, 0xa2, 0x30, 0x00, 0x5a, 0x49, 0xa4, 0x30, + 0x00, 0x27, 0x4f, 0x0c, 0xa4, 0x30, 0x00, 0x4f, + 0x1d, 0x02, 0x05, 0x4f, 0xa8, 0x30, 0x00, 0x11, + 0x07, 0x54, 0x21, 0xa8, 0x30, 0x00, 0x54, 0x03, + 0x54, 0xa4, 0x30, 0x06, 0x4f, 0x15, 0x06, 0x58, + 0x3c, 0x07, 0x00, 0x46, 0xab, 0x30, 0x00, 0x3e, + 0x18, 0x1d, 0x00, 0x42, 0x3f, 0x51, 0xac, 0x30, + 0x00, 0x41, 0x47, 0x00, 0x47, 0x32, 0xae, 0x30, + 0xac, 0x30, 0xae, 0x30, 0x00, 0x1d, 0x4e, 0xad, + 0x30, 0x00, 0x38, 0x3d, 0x4f, 0x01, 0x3e, 0x13, + 0x4f, 0xad, 0x30, 0xed, 0x30, 0xad, 0x30, 0x00, + 0x40, 0x03, 0x3c, 0x33, 0xad, 0x30, 0x00, 0x40, + 0x34, 0x4f, 0x1b, 0x3e, 0xad, 0x30, 0x00, 0x40, + 0x42, 0x16, 0x1b, 0xb0, 0x30, 0x00, 0x39, 0x30, + 0xa4, 0x30, 0x0c, 0x45, 0x3c, 0x24, 0x4f, 0x0b, + 0x47, 0x18, 0x00, 0x49, 0xaf, 0x30, 0x00, 0x3e, + 0x4d, 0x1e, 0xb1, 0x30, 0x00, 0x4b, 0x08, 0x02, + 0x3a, 0x19, 0x02, 0x4b, 0x2c, 0xa4, 0x30, 0x11, + 0x00, 0x0b, 0x47, 0xb5, 0x30, 0x00, 0x3e, 0x0c, + 0x47, 0x2b, 0xb0, 0x30, 0x07, 0x3a, 0x43, 0x00, + 0xb9, 0x30, 0x02, 0x3a, 0x08, 0x02, 0x3a, 0x0f, + 0x07, 0x43, 0x00, 0xb7, 0x30, 0x10, 0x00, 0x12, + 0x34, 0x11, 0x3c, 0x13, 0x17, 0xa4, 0x30, 0x2a, + 0x1f, 0x24, 0x2b, 0x00, 0x20, 0xbb, 0x30, 0x16, + 0x41, 0x00, 0x38, 0x0d, 0xc4, 0x30, 0x0d, 0x38, + 0x00, 0xd0, 0x30, 0x00, 0x2c, 0x1c, 0x1b, 0xa2, + 0x30, 0x32, 0x00, 0x17, 0x26, 0x49, 0xaf, 0x30, + 0x25, 0x00, 0x3c, 0xb3, 0x30, 0x21, 0x00, 0x20, + 0x38, 0xa1, 0x30, 0x34, 0x00, 0x48, 0x22, 0x28, + 0xa3, 0x30, 0x32, 0x00, 0x59, 0x25, 0xa7, 0x30, + 0x2f, 0x1c, 0x10, 0x00, 0x44, 0xd5, 0x30, 0x00, + 0x14, 0x1e, 0xaf, 0x30, 0x29, 0x00, 0x10, 0x4d, + 0x3c, 0xda, 0x30, 0xbd, 0x30, 0xb8, 0x30, 0x22, + 0x13, 0x1a, 0x20, 0x33, 0x0c, 0x22, 0x3b, 0x01, + 0x22, 0x44, 0x00, 0x21, 0x44, 0x07, 0xa4, 0x30, + 0x39, 0x00, 0x4f, 0x24, 0xc8, 0x30, 0x14, 0x23, + 0x00, 0xdb, 0x30, 0xf3, 0x30, 0xc9, 0x30, 0x14, + 0x2a, 0x00, 0x12, 0x33, 0x22, 0x12, 0x33, 0x2a, + 0xa4, 0x30, 0x3a, 0x00, 0x0b, 0x49, 0xa4, 0x30, + 0x3a, 0x00, 0x47, 0x3a, 0x1f, 0x2b, 0x3a, 0x47, + 0x0b, 0xb7, 0x30, 0x27, 0x3c, 0x00, 0x30, 0x3c, + 0xaf, 0x30, 0x30, 0x00, 0x3e, 0x44, 0xdf, 0x30, + 0xea, 0x30, 0xd0, 0x30, 0x0f, 0x1a, 0x00, 0x2c, + 0x1b, 0xe1, 0x30, 0xac, 0x30, 0xac, 0x30, 0x35, + 0x00, 0x1c, 0x47, 0x35, 0x50, 0x1c, 0x3f, 0xa2, + 0x30, 0x42, 0x5a, 0x27, 0x42, 0x5a, 0x49, 0x44, + 0x00, 0x51, 0xc3, 0x30, 0x27, 0x00, 0x05, 0x28, + 0xea, 0x30, 0xe9, 0x30, 0xd4, 0x30, 0x17, 0x00, + 0x28, 0xd6, 0x30, 0x15, 0x26, 0x00, 0x15, 0xec, + 0x30, 0xe0, 0x30, 0xb2, 0x30, 0x3a, 0x41, 0x16, + 0x00, 0x41, 0xc3, 0x30, 0x2c, 0x00, 0x05, 0x30, + 0x00, 0xb9, 0x70, 0x31, 0x00, 0x30, 0x00, 0xb9, + 0x70, 0x32, 0x00, 0x30, 0x00, 0xb9, 0x70, 0x68, + 0x50, 0x61, 0x64, 0x61, 0x41, 0x55, 0x62, 0x61, + 0x72, 0x6f, 0x56, 0x70, 0x63, 0x64, 0x6d, 0x64, + 0x00, 0x6d, 0x00, 0xb2, 0x00, 0x49, 0x00, 0x55, + 0x00, 0x73, 0x5e, 0x10, 0x62, 0x2d, 0x66, 0x8c, + 0x54, 0x27, 0x59, 0x63, 0x6b, 0x0e, 0x66, 0xbb, + 0x6c, 0x2a, 0x68, 0x0f, 0x5f, 0x1a, 0x4f, 0x3e, + 0x79, 0x70, 0x00, 0x41, 0x6e, 0x00, 0x41, 0xbc, + 0x03, 0x41, 0x6d, 0x00, 0x41, 0x6b, 0x00, 0x41, + 0x4b, 0x00, 0x42, 0x4d, 0x00, 0x42, 0x47, 0x00, + 0x42, 0x63, 0x61, 0x6c, 0x6b, 0x63, 0x61, 0x6c, + 0x70, 0x00, 0x46, 0x6e, 0x00, 0x46, 0xbc, 0x03, + 0x46, 0xbc, 0x03, 0x67, 0x6d, 0x00, 0x67, 0x6b, + 0x00, 0x67, 0x48, 0x00, 0x7a, 0x6b, 0x48, 0x7a, + 0x4d, 0x48, 0x7a, 0x47, 0x48, 0x7a, 0x54, 0x48, + 0x7a, 0xbc, 0x03, 0x13, 0x21, 0x6d, 0x00, 0x13, + 0x21, 0x64, 0x00, 0x13, 0x21, 0x6b, 0x00, 0x13, + 0x21, 0x66, 0x00, 0x6d, 0x6e, 0x00, 0x6d, 0xbc, + 0x03, 0x6d, 0x6d, 0x00, 0x6d, 0x63, 0x00, 0x6d, + 0x6b, 0x00, 0x6d, 0x63, 0x00, 0x0a, 0x0a, 0x4f, + 0x00, 0x0a, 0x4f, 0x6d, 0x00, 0xb2, 0x00, 0x63, + 0x00, 0x08, 0x0a, 0x4f, 0x0a, 0x0a, 0x50, 0x00, + 0x0a, 0x50, 0x6d, 0x00, 0xb3, 0x00, 0x6b, 0x00, + 0x6d, 0x00, 0xb3, 0x00, 0x6d, 0x00, 0x15, 0x22, + 0x73, 0x00, 0x6d, 0x00, 0x15, 0x22, 0x73, 0x00, + 0xb2, 0x00, 0x50, 0x61, 0x6b, 0x50, 0x61, 0x4d, + 0x50, 0x61, 0x47, 0x50, 0x61, 0x72, 0x61, 0x64, + 0x72, 0x61, 0x64, 0xd1, 0x73, 0x72, 0x00, 0x61, + 0x00, 0x64, 0x00, 0x15, 0x22, 0x73, 0x00, 0xb2, + 0x00, 0x70, 0x00, 0x73, 0x6e, 0x00, 0x73, 0xbc, + 0x03, 0x73, 0x6d, 0x00, 0x73, 0x70, 0x00, 0x56, + 0x6e, 0x00, 0x56, 0xbc, 0x03, 0x56, 0x6d, 0x00, + 0x56, 0x6b, 0x00, 0x56, 0x4d, 0x00, 0x56, 0x70, + 0x00, 0x57, 0x6e, 0x00, 0x57, 0xbc, 0x03, 0x57, + 0x6d, 0x00, 0x57, 0x6b, 0x00, 0x57, 0x4d, 0x00, + 0x57, 0x6b, 0x00, 0xa9, 0x03, 0x4d, 0x00, 0xa9, + 0x03, 0x61, 0x2e, 0x6d, 0x2e, 0x42, 0x71, 0x63, + 0x63, 0x63, 0x64, 0x43, 0xd1, 0x6b, 0x67, 0x43, + 0x6f, 0x2e, 0x64, 0x42, 0x47, 0x79, 0x68, 0x61, + 0x48, 0x50, 0x69, 0x6e, 0x4b, 0x4b, 0x4b, 0x4d, + 0x6b, 0x74, 0x6c, 0x6d, 0x6c, 0x6e, 0x6c, 0x6f, + 0x67, 0x6c, 0x78, 0x6d, 0x62, 0x6d, 0x69, 0x6c, + 0x6d, 0x6f, 0x6c, 0x50, 0x48, 0x70, 0x2e, 0x6d, + 0x2e, 0x50, 0x50, 0x4d, 0x50, 0x52, 0x73, 0x72, + 0x53, 0x76, 0x57, 0x62, 0x56, 0xd1, 0x6d, 0x41, + 0xd1, 0x6d, 0x31, 0x00, 0xe5, 0x65, 0x31, 0x00, + 0x30, 0x00, 0xe5, 0x65, 0x32, 0x00, 0x30, 0x00, + 0xe5, 0x65, 0x33, 0x00, 0x30, 0x00, 0xe5, 0x65, + 0x67, 0x61, 0x6c, 0x4a, 0x04, 0x4c, 0x04, 0x53, + 0x43, 0x46, 0x51, 0x26, 0x01, 0x53, 0x01, 0x27, + 0xa7, 0x37, 0xab, 0x6b, 0x02, 0x52, 0xab, 0x48, + 0x8c, 0xf4, 0x66, 0xca, 0x8e, 0xc8, 0x8c, 0xd1, + 0x6e, 0x32, 0x4e, 0xe5, 0x53, 0x9c, 0x9f, 0x9c, + 0x9f, 0x51, 0x59, 0xd1, 0x91, 0x87, 0x55, 0x48, + 0x59, 0xf6, 0x61, 0x69, 0x76, 0x85, 0x7f, 0x3f, + 0x86, 0xba, 0x87, 0xf8, 0x88, 0x8f, 0x90, 0x02, + 0x6a, 0x1b, 0x6d, 0xd9, 0x70, 0xde, 0x73, 0x3d, + 0x84, 0x6a, 0x91, 0xf1, 0x99, 0x82, 0x4e, 0x75, + 0x53, 0x04, 0x6b, 0x1b, 0x72, 0x2d, 0x86, 0x1e, + 0x9e, 0x50, 0x5d, 0xeb, 0x6f, 0xcd, 0x85, 0x64, + 0x89, 0xc9, 0x62, 0xd8, 0x81, 0x1f, 0x88, 0xca, + 0x5e, 0x17, 0x67, 0x6a, 0x6d, 0xfc, 0x72, 0xce, + 0x90, 0x86, 0x4f, 0xb7, 0x51, 0xde, 0x52, 0xc4, + 0x64, 0xd3, 0x6a, 0x10, 0x72, 0xe7, 0x76, 0x01, + 0x80, 0x06, 0x86, 0x5c, 0x86, 0xef, 0x8d, 0x32, + 0x97, 0x6f, 0x9b, 0xfa, 0x9d, 0x8c, 0x78, 0x7f, + 0x79, 0xa0, 0x7d, 0xc9, 0x83, 0x04, 0x93, 0x7f, + 0x9e, 0xd6, 0x8a, 0xdf, 0x58, 0x04, 0x5f, 0x60, + 0x7c, 0x7e, 0x80, 0x62, 0x72, 0xca, 0x78, 0xc2, + 0x8c, 0xf7, 0x96, 0xd8, 0x58, 0x62, 0x5c, 0x13, + 0x6a, 0xda, 0x6d, 0x0f, 0x6f, 0x2f, 0x7d, 0x37, + 0x7e, 0x4b, 0x96, 0xd2, 0x52, 0x8b, 0x80, 0xdc, + 0x51, 0xcc, 0x51, 0x1c, 0x7a, 0xbe, 0x7d, 0xf1, + 0x83, 0x75, 0x96, 0x80, 0x8b, 0xcf, 0x62, 0x02, + 0x6a, 0xfe, 0x8a, 0x39, 0x4e, 0xe7, 0x5b, 0x12, + 0x60, 0x87, 0x73, 0x70, 0x75, 0x17, 0x53, 0xfb, + 0x78, 0xbf, 0x4f, 0xa9, 0x5f, 0x0d, 0x4e, 0xcc, + 0x6c, 0x78, 0x65, 0x22, 0x7d, 0xc3, 0x53, 0x5e, + 0x58, 0x01, 0x77, 0x49, 0x84, 0xaa, 0x8a, 0xba, + 0x6b, 0xb0, 0x8f, 0x88, 0x6c, 0xfe, 0x62, 0xe5, + 0x82, 0xa0, 0x63, 0x65, 0x75, 0xae, 0x4e, 0x69, + 0x51, 0xc9, 0x51, 0x81, 0x68, 0xe7, 0x7c, 0x6f, + 0x82, 0xd2, 0x8a, 0xcf, 0x91, 0xf5, 0x52, 0x42, + 0x54, 0x73, 0x59, 0xec, 0x5e, 0xc5, 0x65, 0xfe, + 0x6f, 0x2a, 0x79, 0xad, 0x95, 0x6a, 0x9a, 0x97, + 0x9e, 0xce, 0x9e, 0x9b, 0x52, 0xc6, 0x66, 0x77, + 0x6b, 0x62, 0x8f, 0x74, 0x5e, 0x90, 0x61, 0x00, + 0x62, 0x9a, 0x64, 0x23, 0x6f, 0x49, 0x71, 0x89, + 0x74, 0xca, 0x79, 0xf4, 0x7d, 0x6f, 0x80, 0x26, + 0x8f, 0xee, 0x84, 0x23, 0x90, 0x4a, 0x93, 0x17, + 0x52, 0xa3, 0x52, 0xbd, 0x54, 0xc8, 0x70, 0xc2, + 0x88, 0xaa, 0x8a, 0xc9, 0x5e, 0xf5, 0x5f, 0x7b, + 0x63, 0xae, 0x6b, 0x3e, 0x7c, 0x75, 0x73, 0xe4, + 0x4e, 0xf9, 0x56, 0xe7, 0x5b, 0xba, 0x5d, 0x1c, + 0x60, 0xb2, 0x73, 0x69, 0x74, 0x9a, 0x7f, 0x46, + 0x80, 0x34, 0x92, 0xf6, 0x96, 0x48, 0x97, 0x18, + 0x98, 0x8b, 0x4f, 0xae, 0x79, 0xb4, 0x91, 0xb8, + 0x96, 0xe1, 0x60, 0x86, 0x4e, 0xda, 0x50, 0xee, + 0x5b, 0x3f, 0x5c, 0x99, 0x65, 0x02, 0x6a, 0xce, + 0x71, 0x42, 0x76, 0xfc, 0x84, 0x7c, 0x90, 0x8d, + 0x9f, 0x88, 0x66, 0x2e, 0x96, 0x89, 0x52, 0x7b, + 0x67, 0xf3, 0x67, 0x41, 0x6d, 0x9c, 0x6e, 0x09, + 0x74, 0x59, 0x75, 0x6b, 0x78, 0x10, 0x7d, 0x5e, + 0x98, 0x6d, 0x51, 0x2e, 0x62, 0x78, 0x96, 0x2b, + 0x50, 0x19, 0x5d, 0xea, 0x6d, 0x2a, 0x8f, 0x8b, + 0x5f, 0x44, 0x61, 0x17, 0x68, 0x87, 0x73, 0x86, + 0x96, 0x29, 0x52, 0x0f, 0x54, 0x65, 0x5c, 0x13, + 0x66, 0x4e, 0x67, 0xa8, 0x68, 0xe5, 0x6c, 0x06, + 0x74, 0xe2, 0x75, 0x79, 0x7f, 0xcf, 0x88, 0xe1, + 0x88, 0xcc, 0x91, 0xe2, 0x96, 0x3f, 0x53, 0xba, + 0x6e, 0x1d, 0x54, 0xd0, 0x71, 0x98, 0x74, 0xfa, + 0x85, 0xa3, 0x96, 0x57, 0x9c, 0x9f, 0x9e, 0x97, + 0x67, 0xcb, 0x6d, 0xe8, 0x81, 0xcb, 0x7a, 0x20, + 0x7b, 0x92, 0x7c, 0xc0, 0x72, 0x99, 0x70, 0x58, + 0x8b, 0xc0, 0x4e, 0x36, 0x83, 0x3a, 0x52, 0x07, + 0x52, 0xa6, 0x5e, 0xd3, 0x62, 0xd6, 0x7c, 0x85, + 0x5b, 0x1e, 0x6d, 0xb4, 0x66, 0x3b, 0x8f, 0x4c, + 0x88, 0x4d, 0x96, 0x8b, 0x89, 0xd3, 0x5e, 0x40, + 0x51, 0xc0, 0x55, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x58, 0x00, 0x00, 0x74, 0x66, 0x00, 0x00, 0x00, + 0x00, 0xde, 0x51, 0x2a, 0x73, 0xca, 0x76, 0x3c, + 0x79, 0x5e, 0x79, 0x65, 0x79, 0x8f, 0x79, 0x56, + 0x97, 0xbe, 0x7c, 0xbd, 0x7f, 0x00, 0x00, 0x12, + 0x86, 0x00, 0x00, 0xf8, 0x8a, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x90, 0xfd, 0x90, 0xef, 0x98, 0xfc, + 0x98, 0x28, 0x99, 0xb4, 0x9d, 0xde, 0x90, 0xb7, + 0x96, 0xae, 0x4f, 0xe7, 0x50, 0x4d, 0x51, 0xc9, + 0x52, 0xe4, 0x52, 0x51, 0x53, 0x9d, 0x55, 0x06, + 0x56, 0x68, 0x56, 0x40, 0x58, 0xa8, 0x58, 0x64, + 0x5c, 0x6e, 0x5c, 0x94, 0x60, 0x68, 0x61, 0x8e, + 0x61, 0xf2, 0x61, 0x4f, 0x65, 0xe2, 0x65, 0x91, + 0x66, 0x85, 0x68, 0x77, 0x6d, 0x1a, 0x6e, 0x22, + 0x6f, 0x6e, 0x71, 0x2b, 0x72, 0x22, 0x74, 0x91, + 0x78, 0x3e, 0x79, 0x49, 0x79, 0x48, 0x79, 0x50, + 0x79, 0x56, 0x79, 0x5d, 0x79, 0x8d, 0x79, 0x8e, + 0x79, 0x40, 0x7a, 0x81, 0x7a, 0xc0, 0x7b, 0xf4, + 0x7d, 0x09, 0x7e, 0x41, 0x7e, 0x72, 0x7f, 0x05, + 0x80, 0xed, 0x81, 0x79, 0x82, 0x79, 0x82, 0x57, + 0x84, 0x10, 0x89, 0x96, 0x89, 0x01, 0x8b, 0x39, + 0x8b, 0xd3, 0x8c, 0x08, 0x8d, 0xb6, 0x8f, 0x38, + 0x90, 0xe3, 0x96, 0xff, 0x97, 0x3b, 0x98, 0x75, + 0x60, 0xee, 0x42, 0x18, 0x82, 0x02, 0x26, 0x4e, + 0xb5, 0x51, 0x68, 0x51, 0x80, 0x4f, 0x45, 0x51, + 0x80, 0x51, 0xc7, 0x52, 0xfa, 0x52, 0x9d, 0x55, + 0x55, 0x55, 0x99, 0x55, 0xe2, 0x55, 0x5a, 0x58, + 0xb3, 0x58, 0x44, 0x59, 0x54, 0x59, 0x62, 0x5a, + 0x28, 0x5b, 0xd2, 0x5e, 0xd9, 0x5e, 0x69, 0x5f, + 0xad, 0x5f, 0xd8, 0x60, 0x4e, 0x61, 0x08, 0x61, + 0x8e, 0x61, 0x60, 0x61, 0xf2, 0x61, 0x34, 0x62, + 0xc4, 0x63, 0x1c, 0x64, 0x52, 0x64, 0x56, 0x65, + 0x74, 0x66, 0x17, 0x67, 0x1b, 0x67, 0x56, 0x67, + 0x79, 0x6b, 0xba, 0x6b, 0x41, 0x6d, 0xdb, 0x6e, + 0xcb, 0x6e, 0x22, 0x6f, 0x1e, 0x70, 0x6e, 0x71, + 0xa7, 0x77, 0x35, 0x72, 0xaf, 0x72, 0x2a, 0x73, + 0x71, 0x74, 0x06, 0x75, 0x3b, 0x75, 0x1d, 0x76, + 0x1f, 0x76, 0xca, 0x76, 0xdb, 0x76, 0xf4, 0x76, + 0x4a, 0x77, 0x40, 0x77, 0xcc, 0x78, 0xb1, 0x7a, + 0xc0, 0x7b, 0x7b, 0x7c, 0x5b, 0x7d, 0xf4, 0x7d, + 0x3e, 0x7f, 0x05, 0x80, 0x52, 0x83, 0xef, 0x83, + 0x79, 0x87, 0x41, 0x89, 0x86, 0x89, 0x96, 0x89, + 0xbf, 0x8a, 0xf8, 0x8a, 0xcb, 0x8a, 0x01, 0x8b, + 0xfe, 0x8a, 0xed, 0x8a, 0x39, 0x8b, 0x8a, 0x8b, + 0x08, 0x8d, 0x38, 0x8f, 0x72, 0x90, 0x99, 0x91, + 0x76, 0x92, 0x7c, 0x96, 0xe3, 0x96, 0x56, 0x97, + 0xdb, 0x97, 0xff, 0x97, 0x0b, 0x98, 0x3b, 0x98, + 0x12, 0x9b, 0x9c, 0x9f, 0x4a, 0x28, 0x44, 0x28, + 0xd5, 0x33, 0x9d, 0x3b, 0x18, 0x40, 0x39, 0x40, + 0x49, 0x52, 0xd0, 0x5c, 0xd3, 0x7e, 0x43, 0x9f, + 0x8e, 0x9f, 0x2a, 0xa0, 0x02, 0x66, 0x66, 0x66, + 0x69, 0x66, 0x6c, 0x66, 0x66, 0x69, 0x66, 0x66, + 0x6c, 0x7f, 0x01, 0x74, 0x73, 0x00, 0x74, 0x65, + 0x05, 0x0f, 0x11, 0x0f, 0x00, 0x0f, 0x06, 0x19, + 0x11, 0x0f, 0x08, 0xd9, 0x05, 0xb4, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xf2, 0x05, 0xb7, 0x05, 0xd0, + 0x05, 0x12, 0x00, 0x03, 0x04, 0x0b, 0x0c, 0x0d, + 0x18, 0x1a, 0xe9, 0x05, 0xc1, 0x05, 0xe9, 0x05, + 0xc2, 0x05, 0x49, 0xfb, 0xc1, 0x05, 0x49, 0xfb, + 0xc2, 0x05, 0xd0, 0x05, 0xb7, 0x05, 0xd0, 0x05, + 0xb8, 0x05, 0xd0, 0x05, 0xbc, 0x05, 0xd8, 0x05, + 0xbc, 0x05, 0xde, 0x05, 0xbc, 0x05, 0xe0, 0x05, + 0xbc, 0x05, 0xe3, 0x05, 0xbc, 0x05, 0xb9, 0x05, + 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, + 0x31, 0x03, 0x1c, 0x00, 0x18, 0x06, 0x22, 0x06, + 0x2b, 0x06, 0xd0, 0x05, 0xdc, 0x05, 0x71, 0x06, + 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x09, 0x09, + 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x08, 0x08, + 0x08, 0x08, 0x33, 0x33, 0x33, 0x33, 0x35, 0x35, + 0x35, 0x35, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, + 0x12, 0x12, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, + 0x16, 0x16, 0x1c, 0x1c, 0x1b, 0x1b, 0x1d, 0x1d, + 0x17, 0x17, 0x27, 0x27, 0x20, 0x20, 0x38, 0x38, + 0x38, 0x38, 0x3e, 0x3e, 0x3e, 0x3e, 0x42, 0x42, + 0x42, 0x42, 0x40, 0x40, 0x40, 0x40, 0x49, 0x49, + 0x4a, 0x4a, 0x4a, 0x4a, 0x4f, 0x4f, 0x50, 0x50, + 0x50, 0x50, 0x4d, 0x4d, 0x4d, 0x4d, 0x61, 0x61, + 0x62, 0x62, 0x49, 0x06, 0x64, 0x64, 0x64, 0x64, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7f, 0x7f, 0x2e, 0x82, + 0x82, 0x7c, 0x7c, 0x80, 0x80, 0x87, 0x87, 0x87, + 0x87, 0x00, 0x00, 0x26, 0x06, 0x00, 0x01, 0x00, + 0x01, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x22, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xa0, 0x00, + 0xa0, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xaa, 0x00, + 0xaa, 0x00, 0xaa, 0x00, 0x23, 0x00, 0x23, 0x00, + 0x23, 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x26, + 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x1f, 0x00, + 0x23, 0x00, 0x24, 0x02, 0x06, 0x02, 0x07, 0x02, + 0x08, 0x02, 0x1f, 0x02, 0x23, 0x02, 0x24, 0x04, + 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x1f, 0x04, + 0x23, 0x04, 0x24, 0x05, 0x06, 0x05, 0x1f, 0x05, + 0x23, 0x05, 0x24, 0x06, 0x07, 0x06, 0x1f, 0x07, + 0x06, 0x07, 0x1f, 0x08, 0x06, 0x08, 0x07, 0x08, + 0x1f, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x08, 0x0d, + 0x1f, 0x0f, 0x07, 0x0f, 0x1f, 0x10, 0x06, 0x10, + 0x07, 0x10, 0x08, 0x10, 0x1f, 0x11, 0x07, 0x11, + 0x1f, 0x12, 0x1f, 0x13, 0x06, 0x13, 0x1f, 0x14, + 0x06, 0x14, 0x1f, 0x1b, 0x06, 0x1b, 0x07, 0x1b, + 0x08, 0x1b, 0x1f, 0x1b, 0x23, 0x1b, 0x24, 0x1c, + 0x07, 0x1c, 0x1f, 0x1c, 0x23, 0x1c, 0x24, 0x1d, + 0x01, 0x1d, 0x06, 0x1d, 0x07, 0x1d, 0x08, 0x1d, + 0x1e, 0x1d, 0x1f, 0x1d, 0x23, 0x1d, 0x24, 0x1e, + 0x06, 0x1e, 0x07, 0x1e, 0x08, 0x1e, 0x1f, 0x1e, + 0x23, 0x1e, 0x24, 0x1f, 0x06, 0x1f, 0x07, 0x1f, + 0x08, 0x1f, 0x1f, 0x1f, 0x23, 0x1f, 0x24, 0x20, + 0x06, 0x20, 0x07, 0x20, 0x08, 0x20, 0x1f, 0x20, + 0x23, 0x20, 0x24, 0x21, 0x06, 0x21, 0x1f, 0x21, + 0x23, 0x21, 0x24, 0x24, 0x06, 0x24, 0x07, 0x24, + 0x08, 0x24, 0x1f, 0x24, 0x23, 0x24, 0x24, 0x0a, + 0x4a, 0x0b, 0x4a, 0x23, 0x4a, 0x20, 0x00, 0x4c, + 0x06, 0x51, 0x06, 0x51, 0x06, 0xff, 0x00, 0x1f, + 0x26, 0x06, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x1f, + 0x00, 0x20, 0x00, 0x23, 0x00, 0x24, 0x02, 0x0b, + 0x02, 0x0c, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x23, + 0x02, 0x24, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x1f, + 0x26, 0x06, 0x04, 0x20, 0x04, 0x23, 0x04, 0x24, + 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x1f, 0x05, 0x20, + 0x05, 0x23, 0x05, 0x24, 0x1b, 0x23, 0x1b, 0x24, + 0x1c, 0x23, 0x1c, 0x24, 0x1d, 0x01, 0x1d, 0x1e, + 0x1d, 0x1f, 0x1d, 0x23, 0x1d, 0x24, 0x1e, 0x1f, + 0x1e, 0x23, 0x1e, 0x24, 0x1f, 0x01, 0x1f, 0x1f, + 0x20, 0x0b, 0x20, 0x0c, 0x20, 0x1f, 0x20, 0x20, + 0x20, 0x23, 0x20, 0x24, 0x23, 0x4a, 0x24, 0x0b, + 0x24, 0x0c, 0x24, 0x1f, 0x24, 0x20, 0x24, 0x23, + 0x24, 0x24, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, + 0x00, 0x1f, 0x00, 0x21, 0x02, 0x06, 0x02, 0x07, + 0x02, 0x08, 0x02, 0x1f, 0x02, 0x21, 0x04, 0x06, + 0x04, 0x07, 0x04, 0x08, 0x04, 0x1f, 0x04, 0x21, + 0x05, 0x1f, 0x06, 0x07, 0x06, 0x1f, 0x07, 0x06, + 0x07, 0x1f, 0x08, 0x06, 0x08, 0x1f, 0x0d, 0x06, + 0x0d, 0x07, 0x0d, 0x08, 0x0d, 0x1f, 0x0f, 0x07, + 0x0f, 0x08, 0x0f, 0x1f, 0x10, 0x06, 0x10, 0x07, + 0x10, 0x08, 0x10, 0x1f, 0x11, 0x07, 0x12, 0x1f, + 0x13, 0x06, 0x13, 0x1f, 0x14, 0x06, 0x14, 0x1f, + 0x1b, 0x06, 0x1b, 0x07, 0x1b, 0x08, 0x1b, 0x1f, + 0x1c, 0x07, 0x1c, 0x1f, 0x1d, 0x06, 0x1d, 0x07, + 0x1d, 0x08, 0x1d, 0x1e, 0x1d, 0x1f, 0x1e, 0x06, + 0x1e, 0x07, 0x1e, 0x08, 0x1e, 0x1f, 0x1e, 0x21, + 0x1f, 0x06, 0x1f, 0x07, 0x1f, 0x08, 0x1f, 0x1f, + 0x20, 0x06, 0x20, 0x07, 0x20, 0x08, 0x20, 0x1f, + 0x20, 0x21, 0x21, 0x06, 0x21, 0x1f, 0x21, 0x4a, + 0x24, 0x06, 0x24, 0x07, 0x24, 0x08, 0x24, 0x1f, + 0x24, 0x21, 0x00, 0x1f, 0x00, 0x21, 0x02, 0x1f, + 0x02, 0x21, 0x04, 0x1f, 0x04, 0x21, 0x05, 0x1f, + 0x05, 0x21, 0x0d, 0x1f, 0x0d, 0x21, 0x0e, 0x1f, + 0x0e, 0x21, 0x1d, 0x1e, 0x1d, 0x1f, 0x1e, 0x1f, + 0x20, 0x1f, 0x20, 0x21, 0x24, 0x1f, 0x24, 0x21, + 0x40, 0x06, 0x4e, 0x06, 0x51, 0x06, 0x27, 0x06, + 0x10, 0x22, 0x10, 0x23, 0x12, 0x22, 0x12, 0x23, + 0x13, 0x22, 0x13, 0x23, 0x0c, 0x22, 0x0c, 0x23, + 0x0d, 0x22, 0x0d, 0x23, 0x06, 0x22, 0x06, 0x23, + 0x05, 0x22, 0x05, 0x23, 0x07, 0x22, 0x07, 0x23, + 0x0e, 0x22, 0x0e, 0x23, 0x0f, 0x22, 0x0f, 0x23, + 0x0d, 0x05, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x1e, + 0x0d, 0x0a, 0x0c, 0x0a, 0x0e, 0x0a, 0x0f, 0x0a, + 0x10, 0x22, 0x10, 0x23, 0x12, 0x22, 0x12, 0x23, + 0x13, 0x22, 0x13, 0x23, 0x0c, 0x22, 0x0c, 0x23, + 0x0d, 0x22, 0x0d, 0x23, 0x06, 0x22, 0x06, 0x23, + 0x05, 0x22, 0x05, 0x23, 0x07, 0x22, 0x07, 0x23, + 0x0e, 0x22, 0x0e, 0x23, 0x0f, 0x22, 0x0f, 0x23, + 0x0d, 0x05, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x1e, + 0x0d, 0x0a, 0x0c, 0x0a, 0x0e, 0x0a, 0x0f, 0x0a, + 0x0d, 0x05, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x1e, + 0x0c, 0x20, 0x0d, 0x20, 0x10, 0x1e, 0x0c, 0x05, + 0x0c, 0x06, 0x0c, 0x07, 0x0d, 0x05, 0x0d, 0x06, + 0x0d, 0x07, 0x10, 0x1e, 0x11, 0x1e, 0x00, 0x24, + 0x00, 0x24, 0x2a, 0x06, 0x00, 0x02, 0x1b, 0x00, + 0x03, 0x02, 0x00, 0x03, 0x02, 0x00, 0x03, 0x1b, + 0x00, 0x04, 0x1b, 0x00, 0x1b, 0x02, 0x00, 0x1b, + 0x03, 0x00, 0x1b, 0x04, 0x02, 0x1b, 0x03, 0x02, + 0x1b, 0x03, 0x03, 0x1b, 0x20, 0x03, 0x1b, 0x1f, + 0x09, 0x03, 0x02, 0x09, 0x02, 0x03, 0x09, 0x02, + 0x1f, 0x09, 0x1b, 0x03, 0x09, 0x1b, 0x03, 0x09, + 0x1b, 0x02, 0x09, 0x1b, 0x1b, 0x09, 0x1b, 0x1b, + 0x0b, 0x03, 0x03, 0x0b, 0x03, 0x03, 0x0b, 0x1b, + 0x1b, 0x0a, 0x03, 0x1b, 0x0a, 0x03, 0x1b, 0x0a, + 0x02, 0x20, 0x0a, 0x1b, 0x04, 0x0a, 0x1b, 0x04, + 0x0a, 0x1b, 0x1b, 0x0a, 0x1b, 0x1b, 0x0c, 0x03, + 0x1f, 0x0c, 0x04, 0x1b, 0x0c, 0x04, 0x1b, 0x0d, + 0x1b, 0x03, 0x0d, 0x1b, 0x03, 0x0d, 0x1b, 0x1b, + 0x0d, 0x1b, 0x20, 0x0f, 0x02, 0x1b, 0x0f, 0x1b, + 0x1b, 0x0f, 0x1b, 0x1b, 0x0f, 0x1b, 0x1f, 0x10, + 0x1b, 0x1b, 0x10, 0x1b, 0x20, 0x10, 0x1b, 0x1f, + 0x17, 0x04, 0x1b, 0x17, 0x04, 0x1b, 0x18, 0x1b, + 0x03, 0x18, 0x1b, 0x1b, 0x1a, 0x03, 0x1b, 0x1a, + 0x03, 0x20, 0x1a, 0x03, 0x1f, 0x1a, 0x02, 0x02, + 0x1a, 0x02, 0x02, 0x1a, 0x04, 0x1b, 0x1a, 0x04, + 0x1b, 0x1a, 0x1b, 0x03, 0x1a, 0x1b, 0x03, 0x1b, + 0x03, 0x02, 0x1b, 0x03, 0x1b, 0x1b, 0x03, 0x20, + 0x1b, 0x02, 0x03, 0x1b, 0x02, 0x1b, 0x1b, 0x04, + 0x02, 0x1b, 0x04, 0x1b, 0x28, 0x06, 0x1d, 0x04, + 0x06, 0x1f, 0x1d, 0x04, 0x1f, 0x1d, 0x1d, 0x1e, + 0x05, 0x1d, 0x1e, 0x05, 0x21, 0x1e, 0x04, 0x1d, + 0x1e, 0x04, 0x1d, 0x1e, 0x04, 0x21, 0x1e, 0x1d, + 0x22, 0x1e, 0x1d, 0x21, 0x22, 0x1d, 0x1d, 0x22, + 0x1d, 0x1d, 0x00, 0x06, 0x22, 0x02, 0x04, 0x22, + 0x02, 0x04, 0x21, 0x02, 0x06, 0x22, 0x02, 0x06, + 0x21, 0x02, 0x1d, 0x22, 0x02, 0x1d, 0x21, 0x04, + 0x1d, 0x22, 0x04, 0x05, 0x21, 0x04, 0x1d, 0x21, + 0x0b, 0x06, 0x21, 0x0d, 0x05, 0x22, 0x0c, 0x05, + 0x22, 0x0e, 0x05, 0x22, 0x1c, 0x04, 0x22, 0x1c, + 0x1d, 0x22, 0x22, 0x05, 0x22, 0x22, 0x04, 0x22, + 0x22, 0x1d, 0x22, 0x1d, 0x1d, 0x22, 0x1a, 0x1d, + 0x22, 0x1e, 0x05, 0x22, 0x1a, 0x1d, 0x05, 0x1c, + 0x05, 0x1d, 0x11, 0x1d, 0x22, 0x1b, 0x1d, 0x22, + 0x1e, 0x04, 0x05, 0x1d, 0x06, 0x22, 0x1c, 0x04, + 0x1d, 0x1b, 0x1d, 0x1d, 0x1c, 0x04, 0x1d, 0x1e, + 0x04, 0x05, 0x04, 0x05, 0x22, 0x05, 0x04, 0x22, + 0x1d, 0x04, 0x22, 0x19, 0x1d, 0x22, 0x00, 0x05, + 0x22, 0x1b, 0x1d, 0x1d, 0x11, 0x04, 0x1d, 0x0d, + 0x1d, 0x1d, 0x0b, 0x06, 0x22, 0x1e, 0x04, 0x22, + 0x35, 0x06, 0x00, 0x0f, 0x9d, 0x0d, 0x0f, 0x9d, + 0x27, 0x06, 0x00, 0x1d, 0x1d, 0x20, 0x00, 0x1c, + 0x01, 0x0a, 0x1e, 0x06, 0x1e, 0x08, 0x0e, 0x1d, + 0x12, 0x1e, 0x0a, 0x0c, 0x21, 0x1d, 0x12, 0x1d, + 0x23, 0x20, 0x21, 0x0c, 0x1d, 0x1e, 0x35, 0x06, + 0x00, 0x0f, 0x14, 0x27, 0x06, 0x0e, 0x1d, 0x22, + 0xff, 0x00, 0x1d, 0x1d, 0x20, 0xff, 0x12, 0x1d, + 0x23, 0x20, 0xff, 0x21, 0x0c, 0x1d, 0x1e, 0x27, + 0x06, 0x05, 0x1d, 0xff, 0x05, 0x1d, 0x00, 0x1d, + 0x20, 0x27, 0x06, 0x0a, 0xa5, 0x00, 0x1d, 0x2c, + 0x00, 0x01, 0x30, 0x02, 0x30, 0x3a, 0x00, 0x3b, + 0x00, 0x21, 0x00, 0x3f, 0x00, 0x16, 0x30, 0x17, + 0x30, 0x26, 0x20, 0x13, 0x20, 0x12, 0x01, 0x00, + 0x5f, 0x5f, 0x28, 0x29, 0x7b, 0x7d, 0x08, 0x30, + 0x0c, 0x0d, 0x08, 0x09, 0x02, 0x03, 0x00, 0x01, + 0x04, 0x05, 0x06, 0x07, 0x5b, 0x00, 0x5d, 0x00, + 0x3e, 0x20, 0x3e, 0x20, 0x3e, 0x20, 0x3e, 0x20, + 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x2c, 0x00, + 0x01, 0x30, 0x2e, 0x00, 0x00, 0x00, 0x3b, 0x00, + 0x3a, 0x00, 0x3f, 0x00, 0x21, 0x00, 0x14, 0x20, + 0x28, 0x00, 0x29, 0x00, 0x7b, 0x00, 0x7d, 0x00, + 0x14, 0x30, 0x15, 0x30, 0x23, 0x26, 0x2a, 0x2b, + 0x2d, 0x3c, 0x3e, 0x3d, 0x00, 0x5c, 0x24, 0x25, + 0x40, 0x40, 0x06, 0xff, 0x0b, 0x00, 0x0b, 0xff, + 0x0c, 0x20, 0x00, 0x4d, 0x06, 0x40, 0x06, 0xff, + 0x0e, 0x00, 0x0e, 0xff, 0x0f, 0x00, 0x0f, 0xff, + 0x10, 0x00, 0x10, 0xff, 0x11, 0x00, 0x11, 0xff, + 0x12, 0x00, 0x12, 0x21, 0x06, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, + 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, + 0x0f, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, + 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, + 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, + 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, + 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, + 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, + 0x29, 0x29, 0x22, 0x06, 0x22, 0x00, 0x22, 0x00, + 0x22, 0x01, 0x22, 0x01, 0x22, 0x03, 0x22, 0x03, + 0x22, 0x05, 0x22, 0x05, 0x21, 0x00, 0x85, 0x29, + 0x01, 0x30, 0x01, 0x0b, 0x0c, 0x00, 0xfa, 0xf1, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xe2, 0xe4, 0xe6, + 0xc2, 0xfb, 0xa1, 0xa3, 0xa5, 0xa7, 0xa9, 0xaa, + 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, + 0xbc, 0xbe, 0xc0, 0xc3, 0xc5, 0xc7, 0xc9, 0xca, + 0xcb, 0xcc, 0xcd, 0xce, 0xd1, 0xd4, 0xd7, 0xda, + 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe3, 0xe5, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xee, 0xf2, 0x98, + 0x99, 0x31, 0x31, 0x4f, 0x31, 0x55, 0x31, 0x5b, + 0x31, 0x61, 0x31, 0xa2, 0x00, 0xa3, 0x00, 0xac, + 0x00, 0xaf, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa9, + 0x20, 0x00, 0x00, 0x02, 0x25, 0x90, 0x21, 0x91, + 0x21, 0x92, 0x21, 0x93, 0x21, 0xa0, 0x25, 0xcb, + 0x25, 0xd2, 0x05, 0x07, 0x03, 0x01, 0xda, 0x05, + 0x07, 0x03, 0x01, 0xd0, 0x02, 0xd1, 0x02, 0xe6, + 0x00, 0x99, 0x02, 0x53, 0x02, 0x00, 0x00, 0xa3, + 0x02, 0x66, 0xab, 0xa5, 0x02, 0xa4, 0x02, 0x56, + 0x02, 0x57, 0x02, 0x91, 0x1d, 0x58, 0x02, 0x5e, + 0x02, 0xa9, 0x02, 0x64, 0x02, 0x62, 0x02, 0x60, + 0x02, 0x9b, 0x02, 0x27, 0x01, 0x9c, 0x02, 0x67, + 0x02, 0x84, 0x02, 0xaa, 0x02, 0xab, 0x02, 0x6c, + 0x02, 0x04, 0xdf, 0x8e, 0xa7, 0x6e, 0x02, 0x05, + 0xdf, 0x8e, 0x02, 0x06, 0xdf, 0xf8, 0x00, 0x76, + 0x02, 0x77, 0x02, 0x71, 0x00, 0x7a, 0x02, 0x08, + 0xdf, 0x7d, 0x02, 0x7e, 0x02, 0x80, 0x02, 0xa8, + 0x02, 0xa6, 0x02, 0x67, 0xab, 0xa7, 0x02, 0x88, + 0x02, 0x71, 0x2c, 0x00, 0x00, 0x8f, 0x02, 0xa1, + 0x02, 0xa2, 0x02, 0x98, 0x02, 0xc0, 0x01, 0xc1, + 0x01, 0xc2, 0x01, 0x0a, 0xdf, 0x1e, 0xdf, 0x41, + 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x14, 0x99, + 0x10, 0xba, 0x10, 0x00, 0x00, 0x00, 0x00, 0x9b, + 0x10, 0xba, 0x10, 0x05, 0x05, 0xa5, 0x10, 0xba, + 0x10, 0x05, 0x31, 0x11, 0x27, 0x11, 0x32, 0x11, + 0x27, 0x11, 0x55, 0x47, 0x13, 0x3e, 0x13, 0x47, + 0x13, 0x57, 0x13, 0x55, 0x82, 0x13, 0xc9, 0x13, + 0x00, 0x00, 0x00, 0x00, 0x84, 0x13, 0xbb, 0x13, + 0x05, 0x05, 0x8b, 0x13, 0xc2, 0x13, 0x05, 0x90, + 0x13, 0xc9, 0x13, 0x05, 0xc2, 0x13, 0xc2, 0x13, + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x13, 0xb8, 0x13, + 0xc2, 0x13, 0xc9, 0x13, 0x05, 0x55, 0xb9, 0x14, + 0xba, 0x14, 0xb9, 0x14, 0xb0, 0x14, 0x00, 0x00, + 0x00, 0x00, 0xb9, 0x14, 0xbd, 0x14, 0x55, 0x50, + 0xb8, 0x15, 0xaf, 0x15, 0xb9, 0x15, 0xaf, 0x15, + 0x55, 0x35, 0x19, 0x30, 0x19, 0x05, 0x1e, 0x61, + 0x1e, 0x61, 0x1e, 0x61, 0x29, 0x61, 0x1e, 0x61, + 0x1f, 0x61, 0x29, 0x61, 0x1f, 0x61, 0x1e, 0x61, + 0x20, 0x61, 0x21, 0x61, 0x1f, 0x61, 0x22, 0x61, + 0x1f, 0x61, 0x21, 0x61, 0x20, 0x61, 0x55, 0x55, + 0x55, 0x55, 0x67, 0x6d, 0x67, 0x6d, 0x63, 0x6d, + 0x67, 0x6d, 0x69, 0x6d, 0x67, 0x6d, 0x55, 0x05, + 0x41, 0x00, 0x30, 0x00, 0x57, 0xd1, 0x65, 0xd1, + 0x58, 0xd1, 0x65, 0xd1, 0x5f, 0xd1, 0x6e, 0xd1, + 0x5f, 0xd1, 0x6f, 0xd1, 0x5f, 0xd1, 0x70, 0xd1, + 0x5f, 0xd1, 0x71, 0xd1, 0x5f, 0xd1, 0x72, 0xd1, + 0x55, 0x55, 0x55, 0x05, 0xb9, 0xd1, 0x65, 0xd1, + 0xba, 0xd1, 0x65, 0xd1, 0xbb, 0xd1, 0x6e, 0xd1, + 0xbc, 0xd1, 0x6e, 0xd1, 0xbb, 0xd1, 0x6f, 0xd1, + 0xbc, 0xd1, 0x6f, 0xd1, 0x55, 0x55, 0x55, 0x41, + 0x00, 0x61, 0x00, 0x41, 0x00, 0x61, 0x00, 0x69, + 0x00, 0x41, 0x00, 0x61, 0x00, 0x41, 0x00, 0x43, + 0x44, 0x00, 0x00, 0x47, 0x00, 0x00, 0x4a, 0x4b, + 0x00, 0x00, 0x4e, 0x4f, 0x50, 0x51, 0x00, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, + 0x62, 0x63, 0x64, 0x00, 0x66, 0x68, 0x00, 0x70, + 0x00, 0x41, 0x00, 0x61, 0x00, 0x41, 0x42, 0x00, + 0x44, 0x45, 0x46, 0x47, 0x4a, 0x00, 0x53, 0x00, + 0x61, 0x00, 0x41, 0x42, 0x00, 0x44, 0x45, 0x46, + 0x47, 0x00, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x00, + 0x4f, 0x53, 0x00, 0x61, 0x00, 0x41, 0x00, 0x61, + 0x00, 0x41, 0x00, 0x61, 0x00, 0x41, 0x00, 0x61, + 0x00, 0x41, 0x00, 0x61, 0x00, 0x41, 0x00, 0x61, + 0x00, 0x41, 0x00, 0x61, 0x00, 0x31, 0x01, 0x37, + 0x02, 0x91, 0x03, 0xa3, 0x03, 0xb1, 0x03, 0xd1, + 0x03, 0x24, 0x00, 0x1f, 0x04, 0x20, 0x05, 0x91, + 0x03, 0xa3, 0x03, 0xb1, 0x03, 0xd1, 0x03, 0x24, + 0x00, 0x1f, 0x04, 0x20, 0x05, 0x91, 0x03, 0xa3, + 0x03, 0xb1, 0x03, 0xd1, 0x03, 0x24, 0x00, 0x1f, + 0x04, 0x20, 0x05, 0x91, 0x03, 0xa3, 0x03, 0xb1, + 0x03, 0xd1, 0x03, 0x24, 0x00, 0x1f, 0x04, 0x20, + 0x05, 0x91, 0x03, 0xa3, 0x03, 0xb1, 0x03, 0xd1, + 0x03, 0x24, 0x00, 0x1f, 0x04, 0x20, 0x05, 0x0b, + 0x0c, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x30, 0x04, 0x3a, 0x04, 0x3e, + 0x04, 0x4b, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x89, + 0xa6, 0x30, 0x04, 0xa9, 0x26, 0x28, 0xb9, 0x7f, + 0x9f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x0a, 0x0b, 0x0e, 0x0f, 0x11, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x61, + 0x26, 0x25, 0x2f, 0x7b, 0x51, 0xa6, 0xb1, 0x04, + 0x27, 0x06, 0x00, 0x01, 0x05, 0x08, 0x2a, 0x06, + 0x1e, 0x08, 0x03, 0x0d, 0x20, 0x19, 0x1a, 0x1b, + 0x1c, 0x09, 0x0f, 0x17, 0x0b, 0x18, 0x07, 0x0a, + 0x00, 0x01, 0x04, 0x06, 0x0c, 0x0e, 0x10, 0x44, + 0x90, 0x77, 0x45, 0x28, 0x06, 0x2c, 0x06, 0x00, + 0x00, 0x47, 0x06, 0x33, 0x06, 0x17, 0x10, 0x11, + 0x12, 0x13, 0x00, 0x06, 0x0e, 0x02, 0x0f, 0x34, + 0x06, 0x2a, 0x06, 0x2b, 0x06, 0x2e, 0x06, 0x00, + 0x00, 0x36, 0x06, 0x00, 0x00, 0x3a, 0x06, 0x2d, + 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x44, + 0x06, 0x00, 0x00, 0x46, 0x06, 0x33, 0x06, 0x39, + 0x06, 0x00, 0x00, 0x35, 0x06, 0x42, 0x06, 0x00, + 0x00, 0x34, 0x06, 0x00, 0x00, 0x00, 0x00, 0x2e, + 0x06, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x3a, + 0x06, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0x6f, + 0x06, 0x00, 0x00, 0x28, 0x06, 0x2c, 0x06, 0x00, + 0x00, 0x47, 0x06, 0x00, 0x00, 0x00, 0x00, 0x2d, + 0x06, 0x37, 0x06, 0x4a, 0x06, 0x43, 0x06, 0x00, + 0x00, 0x45, 0x06, 0x46, 0x06, 0x33, 0x06, 0x39, + 0x06, 0x41, 0x06, 0x35, 0x06, 0x42, 0x06, 0x00, + 0x00, 0x34, 0x06, 0x2a, 0x06, 0x2b, 0x06, 0x2e, + 0x06, 0x00, 0x00, 0x36, 0x06, 0x38, 0x06, 0x3a, + 0x06, 0x6e, 0x06, 0x00, 0x00, 0xa1, 0x06, 0x27, + 0x06, 0x00, 0x01, 0x05, 0x08, 0x20, 0x21, 0x0b, + 0x06, 0x10, 0x23, 0x2a, 0x06, 0x1a, 0x1b, 0x1c, + 0x09, 0x0f, 0x17, 0x0b, 0x18, 0x07, 0x0a, 0x00, + 0x01, 0x04, 0x06, 0x0c, 0x0e, 0x10, 0x28, 0x06, + 0x2c, 0x06, 0x2f, 0x06, 0x00, 0x00, 0x48, 0x06, + 0x32, 0x06, 0x2d, 0x06, 0x37, 0x06, 0x4a, 0x06, + 0x2a, 0x06, 0x1a, 0x1b, 0x1c, 0x09, 0x0f, 0x17, + 0x0b, 0x18, 0x07, 0x0a, 0x00, 0x01, 0x04, 0x06, + 0x0c, 0x0e, 0x10, 0x30, 0x2e, 0x30, 0x00, 0x2c, + 0x00, 0x28, 0x00, 0x41, 0x00, 0x29, 0x00, 0x14, + 0x30, 0x53, 0x00, 0x15, 0x30, 0x43, 0x52, 0x43, + 0x44, 0x57, 0x5a, 0x41, 0x00, 0x48, 0x56, 0x4d, + 0x56, 0x53, 0x44, 0x53, 0x53, 0x50, 0x50, 0x56, + 0x57, 0x43, 0x4d, 0x43, 0x4d, 0x44, 0x4d, 0x52, + 0x44, 0x4a, 0x4b, 0x30, 0x30, 0x00, 0x68, 0x68, + 0x4b, 0x62, 0x57, 0x5b, 0xcc, 0x53, 0xc7, 0x30, + 0x8c, 0x4e, 0x1a, 0x59, 0xe3, 0x89, 0x29, 0x59, + 0xa4, 0x4e, 0x20, 0x66, 0x21, 0x71, 0x99, 0x65, + 0x4d, 0x52, 0x8c, 0x5f, 0x8d, 0x51, 0xb0, 0x65, + 0x1d, 0x52, 0x42, 0x7d, 0x1f, 0x75, 0xa9, 0x8c, + 0xf0, 0x58, 0x39, 0x54, 0x14, 0x6f, 0x95, 0x62, + 0x55, 0x63, 0x00, 0x4e, 0x09, 0x4e, 0x4a, 0x90, + 0xe6, 0x5d, 0x2d, 0x4e, 0xf3, 0x53, 0x07, 0x63, + 0x70, 0x8d, 0x53, 0x62, 0x81, 0x79, 0x7a, 0x7a, + 0x08, 0x54, 0x80, 0x6e, 0x09, 0x67, 0x08, 0x67, + 0x33, 0x75, 0x72, 0x52, 0xb6, 0x55, 0x4d, 0x91, + 0x14, 0x30, 0x15, 0x30, 0x2c, 0x67, 0x09, 0x4e, + 0x8c, 0x4e, 0x89, 0x5b, 0xb9, 0x70, 0x53, 0x62, + 0xd7, 0x76, 0xdd, 0x52, 0x57, 0x65, 0x97, 0x5f, + 0xef, 0x53, 0x30, 0x00, 0x38, 0x4e, 0x05, 0x00, + 0x09, 0x22, 0x01, 0x60, 0x4f, 0xae, 0x4f, 0xbb, + 0x4f, 0x02, 0x50, 0x7a, 0x50, 0x99, 0x50, 0xe7, + 0x50, 0xcf, 0x50, 0x9e, 0x34, 0x3a, 0x06, 0x4d, + 0x51, 0x54, 0x51, 0x64, 0x51, 0x77, 0x51, 0x1c, + 0x05, 0xb9, 0x34, 0x67, 0x51, 0x8d, 0x51, 0x4b, + 0x05, 0x97, 0x51, 0xa4, 0x51, 0xcc, 0x4e, 0xac, + 0x51, 0xb5, 0x51, 0xdf, 0x91, 0xf5, 0x51, 0x03, + 0x52, 0xdf, 0x34, 0x3b, 0x52, 0x46, 0x52, 0x72, + 0x52, 0x77, 0x52, 0x15, 0x35, 0x02, 0x00, 0x20, + 0x80, 0x80, 0x00, 0x08, 0x00, 0x00, 0xc7, 0x52, + 0x00, 0x02, 0x1d, 0x33, 0x3e, 0x3f, 0x50, 0x82, + 0x8a, 0x93, 0xac, 0xb6, 0xb8, 0xb8, 0xb8, 0x2c, + 0x0a, 0x70, 0x70, 0xca, 0x53, 0xdf, 0x53, 0x63, + 0x0b, 0xeb, 0x53, 0xf1, 0x53, 0x06, 0x54, 0x9e, + 0x54, 0x38, 0x54, 0x48, 0x54, 0x68, 0x54, 0xa2, + 0x54, 0xf6, 0x54, 0x10, 0x55, 0x53, 0x55, 0x63, + 0x55, 0x84, 0x55, 0x84, 0x55, 0x99, 0x55, 0xab, + 0x55, 0xb3, 0x55, 0xc2, 0x55, 0x16, 0x57, 0x06, + 0x56, 0x17, 0x57, 0x51, 0x56, 0x74, 0x56, 0x07, + 0x52, 0xee, 0x58, 0xce, 0x57, 0xf4, 0x57, 0x0d, + 0x58, 0x8b, 0x57, 0x32, 0x58, 0x31, 0x58, 0xac, + 0x58, 0xe4, 0x14, 0xf2, 0x58, 0xf7, 0x58, 0x06, + 0x59, 0x1a, 0x59, 0x22, 0x59, 0x62, 0x59, 0xa8, + 0x16, 0xea, 0x16, 0xec, 0x59, 0x1b, 0x5a, 0x27, + 0x5a, 0xd8, 0x59, 0x66, 0x5a, 0xee, 0x36, 0xfc, + 0x36, 0x08, 0x5b, 0x3e, 0x5b, 0x3e, 0x5b, 0xc8, + 0x19, 0xc3, 0x5b, 0xd8, 0x5b, 0xe7, 0x5b, 0xf3, + 0x5b, 0x18, 0x1b, 0xff, 0x5b, 0x06, 0x5c, 0x53, + 0x5f, 0x22, 0x5c, 0x81, 0x37, 0x60, 0x5c, 0x6e, + 0x5c, 0xc0, 0x5c, 0x8d, 0x5c, 0xe4, 0x1d, 0x43, + 0x5d, 0xe6, 0x1d, 0x6e, 0x5d, 0x6b, 0x5d, 0x7c, + 0x5d, 0xe1, 0x5d, 0xe2, 0x5d, 0x2f, 0x38, 0xfd, + 0x5d, 0x28, 0x5e, 0x3d, 0x5e, 0x69, 0x5e, 0x62, + 0x38, 0x83, 0x21, 0x7c, 0x38, 0xb0, 0x5e, 0xb3, + 0x5e, 0xb6, 0x5e, 0xca, 0x5e, 0x92, 0xa3, 0xfe, + 0x5e, 0x31, 0x23, 0x31, 0x23, 0x01, 0x82, 0x22, + 0x5f, 0x22, 0x5f, 0xc7, 0x38, 0xb8, 0x32, 0xda, + 0x61, 0x62, 0x5f, 0x6b, 0x5f, 0xe3, 0x38, 0x9a, + 0x5f, 0xcd, 0x5f, 0xd7, 0x5f, 0xf9, 0x5f, 0x81, + 0x60, 0x3a, 0x39, 0x1c, 0x39, 0x94, 0x60, 0xd4, + 0x26, 0xc7, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x08, 0x80, 0x28, 0x80, 0x02, 0x00, 0x00, 0x02, + 0x48, 0x61, 0x00, 0x04, 0x06, 0x04, 0x32, 0x46, + 0x6a, 0x5c, 0x67, 0x96, 0xaa, 0xae, 0xc8, 0xd3, + 0x5d, 0x62, 0x00, 0x54, 0x77, 0xf3, 0x0c, 0x2b, + 0x3d, 0x63, 0xfc, 0x62, 0x68, 0x63, 0x83, 0x63, + 0xe4, 0x63, 0xf1, 0x2b, 0x22, 0x64, 0xc5, 0x63, + 0xa9, 0x63, 0x2e, 0x3a, 0x69, 0x64, 0x7e, 0x64, + 0x9d, 0x64, 0x77, 0x64, 0x6c, 0x3a, 0x4f, 0x65, + 0x6c, 0x65, 0x0a, 0x30, 0xe3, 0x65, 0xf8, 0x66, + 0x49, 0x66, 0x19, 0x3b, 0x91, 0x66, 0x08, 0x3b, + 0xe4, 0x3a, 0x92, 0x51, 0x95, 0x51, 0x00, 0x67, + 0x9c, 0x66, 0xad, 0x80, 0xd9, 0x43, 0x17, 0x67, + 0x1b, 0x67, 0x21, 0x67, 0x5e, 0x67, 0x53, 0x67, + 0xc3, 0x33, 0x49, 0x3b, 0xfa, 0x67, 0x85, 0x67, + 0x52, 0x68, 0x85, 0x68, 0x6d, 0x34, 0x8e, 0x68, + 0x1f, 0x68, 0x14, 0x69, 0x9d, 0x3b, 0x42, 0x69, + 0xa3, 0x69, 0xea, 0x69, 0xa8, 0x6a, 0xa3, 0x36, + 0xdb, 0x6a, 0x18, 0x3c, 0x21, 0x6b, 0xa7, 0x38, + 0x54, 0x6b, 0x4e, 0x3c, 0x72, 0x6b, 0x9f, 0x6b, + 0xba, 0x6b, 0xbb, 0x6b, 0x8d, 0x3a, 0x0b, 0x1d, + 0xfa, 0x3a, 0x4e, 0x6c, 0xbc, 0x3c, 0xbf, 0x6c, + 0xcd, 0x6c, 0x67, 0x6c, 0x16, 0x6d, 0x3e, 0x6d, + 0x77, 0x6d, 0x41, 0x6d, 0x69, 0x6d, 0x78, 0x6d, + 0x85, 0x6d, 0x1e, 0x3d, 0x34, 0x6d, 0x2f, 0x6e, + 0x6e, 0x6e, 0x33, 0x3d, 0xcb, 0x6e, 0xc7, 0x6e, + 0xd1, 0x3e, 0xf9, 0x6d, 0x6e, 0x6f, 0x5e, 0x3f, + 0x8e, 0x3f, 0xc6, 0x6f, 0x39, 0x70, 0x1e, 0x70, + 0x1b, 0x70, 0x96, 0x3d, 0x4a, 0x70, 0x7d, 0x70, + 0x77, 0x70, 0xad, 0x70, 0x25, 0x05, 0x45, 0x71, + 0x63, 0x42, 0x9c, 0x71, 0xab, 0x43, 0x28, 0x72, + 0x35, 0x72, 0x50, 0x72, 0x08, 0x46, 0x80, 0x72, + 0x95, 0x72, 0x35, 0x47, 0x02, 0x20, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, + 0x00, 0x02, 0x02, 0x80, 0x8a, 0x00, 0x00, 0x20, + 0x00, 0x08, 0x0a, 0x00, 0x80, 0x88, 0x80, 0x20, + 0x14, 0x48, 0x7a, 0x73, 0x8b, 0x73, 0xac, 0x3e, + 0xa5, 0x73, 0xb8, 0x3e, 0xb8, 0x3e, 0x47, 0x74, + 0x5c, 0x74, 0x71, 0x74, 0x85, 0x74, 0xca, 0x74, + 0x1b, 0x3f, 0x24, 0x75, 0x36, 0x4c, 0x3e, 0x75, + 0x92, 0x4c, 0x70, 0x75, 0x9f, 0x21, 0x10, 0x76, + 0xa1, 0x4f, 0xb8, 0x4f, 0x44, 0x50, 0xfc, 0x3f, + 0x08, 0x40, 0xf4, 0x76, 0xf3, 0x50, 0xf2, 0x50, + 0x19, 0x51, 0x33, 0x51, 0x1e, 0x77, 0x1f, 0x77, + 0x1f, 0x77, 0x4a, 0x77, 0x39, 0x40, 0x8b, 0x77, + 0x46, 0x40, 0x96, 0x40, 0x1d, 0x54, 0x4e, 0x78, + 0x8c, 0x78, 0xcc, 0x78, 0xe3, 0x40, 0x26, 0x56, + 0x56, 0x79, 0x9a, 0x56, 0xc5, 0x56, 0x8f, 0x79, + 0xeb, 0x79, 0x2f, 0x41, 0x40, 0x7a, 0x4a, 0x7a, + 0x4f, 0x7a, 0x7c, 0x59, 0xa7, 0x5a, 0xa7, 0x5a, + 0xee, 0x7a, 0x02, 0x42, 0xab, 0x5b, 0xc6, 0x7b, + 0xc9, 0x7b, 0x27, 0x42, 0x80, 0x5c, 0xd2, 0x7c, + 0xa0, 0x42, 0xe8, 0x7c, 0xe3, 0x7c, 0x00, 0x7d, + 0x86, 0x5f, 0x63, 0x7d, 0x01, 0x43, 0xc7, 0x7d, + 0x02, 0x7e, 0x45, 0x7e, 0x34, 0x43, 0x28, 0x62, + 0x47, 0x62, 0x59, 0x43, 0xd9, 0x62, 0x7a, 0x7f, + 0x3e, 0x63, 0x95, 0x7f, 0xfa, 0x7f, 0x05, 0x80, + 0xda, 0x64, 0x23, 0x65, 0x60, 0x80, 0xa8, 0x65, + 0x70, 0x80, 0x5f, 0x33, 0xd5, 0x43, 0xb2, 0x80, + 0x03, 0x81, 0x0b, 0x44, 0x3e, 0x81, 0xb5, 0x5a, + 0xa7, 0x67, 0xb5, 0x67, 0x93, 0x33, 0x9c, 0x33, + 0x01, 0x82, 0x04, 0x82, 0x9e, 0x8f, 0x6b, 0x44, + 0x91, 0x82, 0x8b, 0x82, 0x9d, 0x82, 0xb3, 0x52, + 0xb1, 0x82, 0xb3, 0x82, 0xbd, 0x82, 0xe6, 0x82, + 0x3c, 0x6b, 0xe5, 0x82, 0x1d, 0x83, 0x63, 0x83, + 0xad, 0x83, 0x23, 0x83, 0xbd, 0x83, 0xe7, 0x83, + 0x57, 0x84, 0x53, 0x83, 0xca, 0x83, 0xcc, 0x83, + 0xdc, 0x83, 0x36, 0x6c, 0x6b, 0x6d, 0x02, 0x00, + 0x00, 0x20, 0x22, 0x2a, 0xa0, 0x0a, 0x00, 0x20, + 0x80, 0x28, 0x00, 0xa8, 0x20, 0x20, 0x00, 0x02, + 0x80, 0x22, 0x02, 0x8a, 0x08, 0x00, 0xaa, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x28, 0xd5, 0x6c, + 0x2b, 0x45, 0xf1, 0x84, 0xf3, 0x84, 0x16, 0x85, + 0xca, 0x73, 0x64, 0x85, 0x2c, 0x6f, 0x5d, 0x45, + 0x61, 0x45, 0xb1, 0x6f, 0xd2, 0x70, 0x6b, 0x45, + 0x50, 0x86, 0x5c, 0x86, 0x67, 0x86, 0x69, 0x86, + 0xa9, 0x86, 0x88, 0x86, 0x0e, 0x87, 0xe2, 0x86, + 0x79, 0x87, 0x28, 0x87, 0x6b, 0x87, 0x86, 0x87, + 0xd7, 0x45, 0xe1, 0x87, 0x01, 0x88, 0xf9, 0x45, + 0x60, 0x88, 0x63, 0x88, 0x67, 0x76, 0xd7, 0x88, + 0xde, 0x88, 0x35, 0x46, 0xfa, 0x88, 0xbb, 0x34, + 0xae, 0x78, 0x66, 0x79, 0xbe, 0x46, 0xc7, 0x46, + 0xa0, 0x8a, 0xed, 0x8a, 0x8a, 0x8b, 0x55, 0x8c, + 0xa8, 0x7c, 0xab, 0x8c, 0xc1, 0x8c, 0x1b, 0x8d, + 0x77, 0x8d, 0x2f, 0x7f, 0x04, 0x08, 0xcb, 0x8d, + 0xbc, 0x8d, 0xf0, 0x8d, 0xde, 0x08, 0xd4, 0x8e, + 0x38, 0x8f, 0xd2, 0x85, 0xed, 0x85, 0x94, 0x90, + 0xf1, 0x90, 0x11, 0x91, 0x2e, 0x87, 0x1b, 0x91, + 0x38, 0x92, 0xd7, 0x92, 0xd8, 0x92, 0x7c, 0x92, + 0xf9, 0x93, 0x15, 0x94, 0xfa, 0x8b, 0x8b, 0x95, + 0x95, 0x49, 0xb7, 0x95, 0x77, 0x8d, 0xe6, 0x49, + 0xc3, 0x96, 0xb2, 0x5d, 0x23, 0x97, 0x45, 0x91, + 0x1a, 0x92, 0x6e, 0x4a, 0x76, 0x4a, 0xe0, 0x97, + 0x0a, 0x94, 0xb2, 0x4a, 0x96, 0x94, 0x0b, 0x98, + 0x0b, 0x98, 0x29, 0x98, 0xb6, 0x95, 0xe2, 0x98, + 0x33, 0x4b, 0x29, 0x99, 0xa7, 0x99, 0xc2, 0x99, + 0xfe, 0x99, 0xce, 0x4b, 0x30, 0x9b, 0x12, 0x9b, + 0x40, 0x9c, 0xfd, 0x9c, 0xce, 0x4c, 0xed, 0x4c, + 0x67, 0x9d, 0xce, 0xa0, 0xf8, 0x4c, 0x05, 0xa1, + 0x0e, 0xa2, 0x91, 0xa2, 0xbb, 0x9e, 0x56, 0x4d, + 0xf9, 0x9e, 0xfe, 0x9e, 0x05, 0x9f, 0x0f, 0x9f, + 0x16, 0x9f, 0x3b, 0x9f, 0x00, 0xa6, 0x02, 0x88, + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x28, + 0x00, 0x08, 0xa0, 0x80, 0xa0, 0x80, 0x00, 0x80, + 0x80, 0x00, 0x0a, 0x88, 0x80, 0x00, 0x80, 0x00, + 0x20, 0x2a, 0x00, 0x80, +}; + +static const uint16_t unicode_comp_table[965] = { + 0x4a01, 0x49c0, 0x4a02, 0x0280, 0x0281, 0x0282, 0x0283, 0x02c0, + 0x02c2, 0x0a00, 0x0284, 0x2442, 0x0285, 0x07c0, 0x0980, 0x0982, + 0x2440, 0x2280, 0x02c4, 0x2282, 0x2284, 0x2286, 0x02c6, 0x02c8, + 0x02ca, 0x02cc, 0x0287, 0x228a, 0x02ce, 0x228c, 0x2290, 0x2292, + 0x228e, 0x0288, 0x0289, 0x028a, 0x2482, 0x0300, 0x0302, 0x0304, + 0x028b, 0x2480, 0x0308, 0x0984, 0x0986, 0x2458, 0x0a02, 0x0306, + 0x2298, 0x229a, 0x229e, 0x0900, 0x030a, 0x22a0, 0x030c, 0x030e, + 0x0840, 0x0310, 0x0312, 0x22a2, 0x22a6, 0x09c0, 0x22a4, 0x22a8, + 0x22aa, 0x028c, 0x028d, 0x028e, 0x0340, 0x0342, 0x0344, 0x0380, + 0x028f, 0x248e, 0x07c2, 0x0988, 0x098a, 0x2490, 0x0346, 0x22ac, + 0x0400, 0x22b0, 0x0842, 0x22b2, 0x0402, 0x22b4, 0x0440, 0x0444, + 0x22b6, 0x0442, 0x22c2, 0x22c0, 0x22c4, 0x22c6, 0x22c8, 0x0940, + 0x04c0, 0x0291, 0x22ca, 0x04c4, 0x22cc, 0x04c2, 0x22d0, 0x22ce, + 0x0292, 0x0293, 0x0294, 0x0295, 0x0540, 0x0542, 0x0a08, 0x0296, + 0x2494, 0x0544, 0x07c4, 0x098c, 0x098e, 0x06c0, 0x2492, 0x0844, + 0x2308, 0x230a, 0x0580, 0x230c, 0x0584, 0x0990, 0x0992, 0x230e, + 0x0582, 0x2312, 0x0586, 0x0588, 0x2314, 0x058c, 0x2316, 0x0998, + 0x058a, 0x231e, 0x0590, 0x2320, 0x099a, 0x058e, 0x2324, 0x2322, + 0x0299, 0x029a, 0x029b, 0x05c0, 0x05c2, 0x05c4, 0x029c, 0x24ac, + 0x05c6, 0x05c8, 0x07c6, 0x0994, 0x0996, 0x0700, 0x24aa, 0x2326, + 0x05ca, 0x232a, 0x2328, 0x2340, 0x2342, 0x2344, 0x2346, 0x05cc, + 0x234a, 0x2348, 0x234c, 0x234e, 0x2350, 0x24b8, 0x029d, 0x05ce, + 0x24be, 0x0a0c, 0x2352, 0x0600, 0x24bc, 0x24ba, 0x0640, 0x2354, + 0x0642, 0x0644, 0x2356, 0x2358, 0x02a0, 0x02a1, 0x02a2, 0x02a3, + 0x02c1, 0x02c3, 0x0a01, 0x02a4, 0x2443, 0x02a5, 0x07c1, 0x0981, + 0x0983, 0x2441, 0x2281, 0x02c5, 0x2283, 0x2285, 0x2287, 0x02c7, + 0x02c9, 0x02cb, 0x02cd, 0x02a7, 0x228b, 0x02cf, 0x228d, 0x2291, + 0x2293, 0x228f, 0x02a8, 0x02a9, 0x02aa, 0x2483, 0x0301, 0x0303, + 0x0305, 0x02ab, 0x2481, 0x0309, 0x0985, 0x0987, 0x2459, 0x0a03, + 0x0307, 0x2299, 0x229b, 0x229f, 0x0901, 0x030b, 0x22a1, 0x030d, + 0x030f, 0x0841, 0x0311, 0x0313, 0x22a3, 0x22a7, 0x09c1, 0x22a5, + 0x22a9, 0x22ab, 0x2380, 0x02ac, 0x02ad, 0x02ae, 0x0341, 0x0343, + 0x0345, 0x02af, 0x248f, 0x07c3, 0x0989, 0x098b, 0x2491, 0x0347, + 0x22ad, 0x0401, 0x0884, 0x22b1, 0x0843, 0x22b3, 0x0403, 0x22b5, + 0x0441, 0x0445, 0x22b7, 0x0443, 0x22c3, 0x22c1, 0x22c5, 0x22c7, + 0x22c9, 0x0941, 0x04c1, 0x02b1, 0x22cb, 0x04c5, 0x22cd, 0x04c3, + 0x22d1, 0x22cf, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x0541, 0x0543, + 0x0a09, 0x02b6, 0x2495, 0x0545, 0x07c5, 0x098d, 0x098f, 0x06c1, + 0x2493, 0x0845, 0x2309, 0x230b, 0x0581, 0x230d, 0x0585, 0x0991, + 0x0993, 0x230f, 0x0583, 0x2313, 0x0587, 0x0589, 0x2315, 0x058d, + 0x2317, 0x0999, 0x058b, 0x231f, 0x2381, 0x0591, 0x2321, 0x099b, + 0x058f, 0x2325, 0x2323, 0x02b9, 0x02ba, 0x02bb, 0x05c1, 0x05c3, + 0x05c5, 0x02bc, 0x24ad, 0x05c7, 0x05c9, 0x07c7, 0x0995, 0x0997, + 0x0701, 0x24ab, 0x2327, 0x05cb, 0x232b, 0x2329, 0x2341, 0x2343, + 0x2345, 0x2347, 0x05cd, 0x234b, 0x2349, 0x2382, 0x234d, 0x234f, + 0x2351, 0x24b9, 0x02bd, 0x05cf, 0x24bf, 0x0a0d, 0x2353, 0x02bf, + 0x24bd, 0x2383, 0x24bb, 0x0641, 0x2355, 0x0643, 0x0645, 0x2357, + 0x2359, 0x3101, 0x0c80, 0x2e00, 0x2446, 0x2444, 0x244a, 0x2448, + 0x0800, 0x0942, 0x0944, 0x0804, 0x2288, 0x2486, 0x2484, 0x248a, + 0x2488, 0x22ae, 0x2498, 0x2496, 0x249c, 0x249a, 0x2300, 0x0a06, + 0x2302, 0x0a04, 0x0946, 0x07ce, 0x07ca, 0x07c8, 0x07cc, 0x2447, + 0x2445, 0x244b, 0x2449, 0x0801, 0x0943, 0x0945, 0x0805, 0x2289, + 0x2487, 0x2485, 0x248b, 0x2489, 0x22af, 0x2499, 0x2497, 0x249d, + 0x249b, 0x2301, 0x0a07, 0x2303, 0x0a05, 0x0947, 0x07cf, 0x07cb, + 0x07c9, 0x07cd, 0x2450, 0x244e, 0x2454, 0x2452, 0x2451, 0x244f, + 0x2455, 0x2453, 0x2294, 0x2296, 0x2295, 0x2297, 0x2304, 0x2306, + 0x2305, 0x2307, 0x2318, 0x2319, 0x231a, 0x231b, 0x232c, 0x232d, + 0x232e, 0x232f, 0x2400, 0x24a2, 0x24a0, 0x24a6, 0x24a4, 0x24a8, + 0x24a3, 0x24a1, 0x24a7, 0x24a5, 0x24a9, 0x24b0, 0x24ae, 0x24b4, + 0x24b2, 0x24b6, 0x24b1, 0x24af, 0x24b5, 0x24b3, 0x24b7, 0x0882, + 0x0880, 0x0881, 0x0802, 0x0803, 0x229c, 0x229d, 0x0a0a, 0x0a0b, + 0x0883, 0x0b40, 0x2c8a, 0x0c81, 0x2c89, 0x2c88, 0x2540, 0x2541, + 0x2d00, 0x2e07, 0x0d00, 0x2640, 0x2641, 0x2e80, 0x0d01, 0x26c8, + 0x26c9, 0x2f00, 0x2f84, 0x0d02, 0x2f83, 0x2f82, 0x0d40, 0x26d8, + 0x26d9, 0x3186, 0x0d04, 0x2740, 0x2741, 0x3100, 0x3086, 0x0d06, + 0x3085, 0x3084, 0x0d41, 0x2840, 0x3200, 0x0d07, 0x284f, 0x2850, + 0x3280, 0x2c84, 0x2e03, 0x2857, 0x0d42, 0x2c81, 0x2c80, 0x24c0, + 0x24c1, 0x2c86, 0x2c83, 0x28c0, 0x0d43, 0x25c0, 0x25c1, 0x2940, + 0x0d44, 0x26c0, 0x26c1, 0x2e05, 0x2e02, 0x29c0, 0x0d45, 0x2f05, + 0x2f04, 0x0d80, 0x26d0, 0x26d1, 0x2f80, 0x2a40, 0x0d82, 0x26e0, + 0x26e1, 0x3080, 0x3081, 0x2ac0, 0x0d83, 0x3004, 0x3003, 0x0d81, + 0x27c0, 0x27c1, 0x3082, 0x2b40, 0x0d84, 0x2847, 0x2848, 0x3184, + 0x3181, 0x2f06, 0x0d08, 0x2f81, 0x3005, 0x0d46, 0x3083, 0x3182, + 0x0e00, 0x0e01, 0x0f40, 0x1180, 0x1182, 0x0f03, 0x0f00, 0x11c0, + 0x0f01, 0x1140, 0x1202, 0x1204, 0x0f81, 0x1240, 0x0fc0, 0x1242, + 0x0f80, 0x1244, 0x1284, 0x0f82, 0x1286, 0x1288, 0x128a, 0x12c0, + 0x1282, 0x1181, 0x1183, 0x1043, 0x1040, 0x11c1, 0x1041, 0x1141, + 0x1203, 0x1205, 0x10c1, 0x1241, 0x1000, 0x1243, 0x10c0, 0x1245, + 0x1285, 0x10c2, 0x1287, 0x1289, 0x128b, 0x12c1, 0x1283, 0x1080, + 0x1100, 0x1101, 0x1200, 0x1201, 0x1280, 0x1281, 0x1340, 0x1341, + 0x1343, 0x1342, 0x1344, 0x13c2, 0x1400, 0x13c0, 0x1440, 0x1480, + 0x14c0, 0x1540, 0x1541, 0x1740, 0x1700, 0x1741, 0x17c0, 0x1800, + 0x1802, 0x1801, 0x1840, 0x1880, 0x1900, 0x18c0, 0x18c1, 0x1901, + 0x1940, 0x1942, 0x1941, 0x1980, 0x19c0, 0x19c2, 0x19c1, 0x1c80, + 0x1cc0, 0x1dc0, 0x1f80, 0x2000, 0x2002, 0x2004, 0x2006, 0x2008, + 0x2040, 0x2080, 0x2082, 0x20c0, 0x20c1, 0x2100, 0x22b8, 0x22b9, + 0x2310, 0x2311, 0x231c, 0x231d, 0x244c, 0x2456, 0x244d, 0x2457, + 0x248c, 0x248d, 0x249e, 0x249f, 0x2500, 0x2502, 0x2504, 0x2bc0, + 0x2501, 0x2503, 0x2505, 0x2bc1, 0x2bc2, 0x2bc3, 0x2bc4, 0x2bc5, + 0x2bc6, 0x2bc7, 0x2580, 0x2582, 0x2584, 0x2bc8, 0x2581, 0x2583, + 0x2585, 0x2bc9, 0x2bca, 0x2bcb, 0x2bcc, 0x2bcd, 0x2bce, 0x2bcf, + 0x2600, 0x2602, 0x2601, 0x2603, 0x2680, 0x2682, 0x2681, 0x2683, + 0x26c2, 0x26c4, 0x26c6, 0x2c00, 0x26c3, 0x26c5, 0x26c7, 0x2c01, + 0x2c02, 0x2c03, 0x2c04, 0x2c05, 0x2c06, 0x2c07, 0x26ca, 0x26cc, + 0x26ce, 0x2c08, 0x26cb, 0x26cd, 0x26cf, 0x2c09, 0x2c0a, 0x2c0b, + 0x2c0c, 0x2c0d, 0x2c0e, 0x2c0f, 0x26d2, 0x26d4, 0x26d6, 0x26d3, + 0x26d5, 0x26d7, 0x26da, 0x26dc, 0x26de, 0x26db, 0x26dd, 0x26df, + 0x2700, 0x2702, 0x2701, 0x2703, 0x2780, 0x2782, 0x2781, 0x2783, + 0x2800, 0x2802, 0x2804, 0x2801, 0x2803, 0x2805, 0x2842, 0x2844, + 0x2846, 0x2849, 0x284b, 0x284d, 0x2c40, 0x284a, 0x284c, 0x284e, + 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2851, + 0x2853, 0x2855, 0x2c48, 0x2852, 0x2854, 0x2856, 0x2c49, 0x2c4a, + 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c82, 0x2e01, 0x3180, + 0x2c87, 0x2f01, 0x2f02, 0x2f03, 0x2e06, 0x3185, 0x3000, 0x3001, + 0x3002, 0x4640, 0x4641, 0x4680, 0x46c0, 0x46c2, 0x46c1, 0x4700, + 0x4740, 0x4780, 0x47c0, 0x47c2, 0x4900, 0x4940, 0x4980, 0x4982, + 0x4a00, 0x49c2, 0x4a03, 0x4a04, 0x4a40, 0x4a41, 0x4a80, 0x4a81, + 0x4ac0, 0x4ac1, 0x4bc0, 0x4bc1, 0x4b00, 0x4b01, 0x4b40, 0x4b41, + 0x4bc2, 0x4bc3, 0x4b80, 0x4b81, 0x4b82, 0x4b83, 0x4c00, 0x4c01, + 0x4c02, 0x4c03, 0x5600, 0x5440, 0x5442, 0x5444, 0x5446, 0x5448, + 0x544a, 0x544c, 0x544e, 0x5450, 0x5452, 0x5454, 0x5456, 0x5480, + 0x5482, 0x5484, 0x54c0, 0x54c1, 0x5500, 0x5501, 0x5540, 0x5541, + 0x5580, 0x5581, 0x55c0, 0x55c1, 0x5680, 0x58c0, 0x5700, 0x5702, + 0x5704, 0x5706, 0x5708, 0x570a, 0x570c, 0x570e, 0x5710, 0x5712, + 0x5714, 0x5716, 0x5740, 0x5742, 0x5744, 0x5780, 0x5781, 0x57c0, + 0x57c1, 0x5800, 0x5801, 0x5840, 0x5841, 0x5880, 0x5881, 0x5900, + 0x5901, 0x5902, 0x5903, 0x5940, 0x8ec0, 0x8f00, 0x8fc0, 0x8fc2, + 0x9000, 0x9040, 0x9041, 0x9080, 0x9081, 0x90c0, 0x90c2, 0x9100, + 0x9140, 0x9182, 0x9180, 0x9183, 0x91c1, 0x91c0, 0x91c3, 0x9200, + 0x9201, 0x9240, 0x9280, 0x9282, 0x9284, 0x9281, 0x9285, 0x9287, + 0x9286, 0x9283, 0x92c1, 0x92c0, 0x92c2, +}; + +typedef enum { + UNICODE_GC_Cn, + UNICODE_GC_Lu, + UNICODE_GC_Ll, + UNICODE_GC_Lt, + UNICODE_GC_Lm, + UNICODE_GC_Lo, + UNICODE_GC_Mn, + UNICODE_GC_Mc, + UNICODE_GC_Me, + UNICODE_GC_Nd, + UNICODE_GC_Nl, + UNICODE_GC_No, + UNICODE_GC_Sm, + UNICODE_GC_Sc, + UNICODE_GC_Sk, + UNICODE_GC_So, + UNICODE_GC_Pc, + UNICODE_GC_Pd, + UNICODE_GC_Ps, + UNICODE_GC_Pe, + UNICODE_GC_Pi, + UNICODE_GC_Pf, + UNICODE_GC_Po, + UNICODE_GC_Zs, + UNICODE_GC_Zl, + UNICODE_GC_Zp, + UNICODE_GC_Cc, + UNICODE_GC_Cf, + UNICODE_GC_Cs, + UNICODE_GC_Co, + UNICODE_GC_LC, + UNICODE_GC_L, + UNICODE_GC_M, + UNICODE_GC_N, + UNICODE_GC_S, + UNICODE_GC_P, + UNICODE_GC_Z, + UNICODE_GC_C, + UNICODE_GC_COUNT, +} UnicodeGCEnum; + +static const char unicode_gc_name_table[] = + "Cn,Unassigned" "\0" + "Lu,Uppercase_Letter" "\0" + "Ll,Lowercase_Letter" "\0" + "Lt,Titlecase_Letter" "\0" + "Lm,Modifier_Letter" "\0" + "Lo,Other_Letter" "\0" + "Mn,Nonspacing_Mark" "\0" + "Mc,Spacing_Mark" "\0" + "Me,Enclosing_Mark" "\0" + "Nd,Decimal_Number,digit" "\0" + "Nl,Letter_Number" "\0" + "No,Other_Number" "\0" + "Sm,Math_Symbol" "\0" + "Sc,Currency_Symbol" "\0" + "Sk,Modifier_Symbol" "\0" + "So,Other_Symbol" "\0" + "Pc,Connector_Punctuation" "\0" + "Pd,Dash_Punctuation" "\0" + "Ps,Open_Punctuation" "\0" + "Pe,Close_Punctuation" "\0" + "Pi,Initial_Punctuation" "\0" + "Pf,Final_Punctuation" "\0" + "Po,Other_Punctuation" "\0" + "Zs,Space_Separator" "\0" + "Zl,Line_Separator" "\0" + "Zp,Paragraph_Separator" "\0" + "Cc,Control,cntrl" "\0" + "Cf,Format" "\0" + "Cs,Surrogate" "\0" + "Co,Private_Use" "\0" + "LC,Cased_Letter" "\0" + "L,Letter" "\0" + "M,Mark,Combining_Mark" "\0" + "N,Number" "\0" + "S,Symbol" "\0" + "P,Punctuation,punct" "\0" + "Z,Separator" "\0" + "C,Other" "\0" +; + +static const uint8_t unicode_gc_table[4122] = { + 0xfa, 0x18, 0x17, 0x56, 0x0d, 0x56, 0x12, 0x13, + 0x16, 0x0c, 0x16, 0x11, 0x36, 0xe9, 0x02, 0x36, + 0x4c, 0x36, 0xe1, 0x12, 0x12, 0x16, 0x13, 0x0e, + 0x10, 0x0e, 0xe2, 0x12, 0x12, 0x0c, 0x13, 0x0c, + 0xfa, 0x19, 0x17, 0x16, 0x6d, 0x0f, 0x16, 0x0e, + 0x0f, 0x05, 0x14, 0x0c, 0x1b, 0x0f, 0x0e, 0x0f, + 0x0c, 0x2b, 0x0e, 0x02, 0x36, 0x0e, 0x0b, 0x05, + 0x15, 0x4b, 0x16, 0xe1, 0x0f, 0x0c, 0xc1, 0xe2, + 0x10, 0x0c, 0xe2, 0x00, 0xff, 0x30, 0x02, 0xff, + 0x08, 0x02, 0xff, 0x27, 0xbf, 0x22, 0x21, 0x02, + 0x5f, 0x5f, 0x21, 0x22, 0x61, 0x02, 0x21, 0x02, + 0x41, 0x42, 0x21, 0x02, 0x21, 0x02, 0x9f, 0x7f, + 0x02, 0x5f, 0x5f, 0x21, 0x02, 0x5f, 0x3f, 0x02, + 0x05, 0x3f, 0x22, 0x65, 0x01, 0x03, 0x02, 0x01, + 0x03, 0x02, 0x01, 0x03, 0x02, 0xff, 0x08, 0x02, + 0xff, 0x0a, 0x02, 0x01, 0x03, 0x02, 0x5f, 0x21, + 0x02, 0xff, 0x32, 0xa2, 0x21, 0x02, 0x21, 0x22, + 0x5f, 0x41, 0x02, 0xff, 0x00, 0xe2, 0x3c, 0x25, + 0xe2, 0x12, 0xe4, 0x0a, 0x6e, 0xe4, 0x04, 0xee, + 0x06, 0x84, 0xce, 0x04, 0x0e, 0x04, 0xee, 0x09, + 0xe6, 0x68, 0x7f, 0x04, 0x0e, 0x3f, 0x20, 0x04, + 0x42, 0x16, 0x01, 0x60, 0x2e, 0x01, 0x16, 0x41, + 0x00, 0x01, 0x00, 0x21, 0x02, 0xe1, 0x09, 0x00, + 0xe1, 0x01, 0xe2, 0x1b, 0x3f, 0x02, 0x41, 0x42, + 0xff, 0x10, 0x62, 0x3f, 0x0c, 0x5f, 0x3f, 0x02, + 0xe1, 0x2b, 0xe2, 0x28, 0xff, 0x1a, 0x0f, 0x86, + 0x28, 0xff, 0x2f, 0xff, 0x06, 0x02, 0xff, 0x58, + 0x00, 0xe1, 0x1e, 0x20, 0x04, 0xb6, 0xe2, 0x21, + 0x16, 0x11, 0x20, 0x2f, 0x0d, 0x00, 0xe6, 0x25, + 0x11, 0x06, 0x16, 0x26, 0x16, 0x26, 0x16, 0x06, + 0xe0, 0x00, 0xe5, 0x13, 0x60, 0x65, 0x36, 0xe0, + 0x03, 0xbb, 0x4c, 0x36, 0x0d, 0x36, 0x2f, 0xe6, + 0x03, 0x16, 0x1b, 0x56, 0xe5, 0x18, 0x04, 0xe5, + 0x02, 0xe6, 0x0d, 0xe9, 0x02, 0x76, 0x25, 0x06, + 0xe5, 0x5b, 0x16, 0x05, 0xc6, 0x1b, 0x0f, 0xa6, + 0x24, 0x26, 0x0f, 0x66, 0x25, 0xe9, 0x02, 0x45, + 0x2f, 0x05, 0xf6, 0x06, 0x00, 0x1b, 0x05, 0x06, + 0xe5, 0x16, 0xe6, 0x13, 0x20, 0xe5, 0x51, 0xe6, + 0x03, 0x05, 0xe0, 0x06, 0xe9, 0x02, 0xe5, 0x19, + 0xe6, 0x01, 0x24, 0x0f, 0x56, 0x04, 0x20, 0x06, + 0x2d, 0xe5, 0x0e, 0x66, 0x04, 0xe6, 0x01, 0x04, + 0x46, 0x04, 0x86, 0x20, 0xf6, 0x07, 0x00, 0xe5, + 0x11, 0x46, 0x20, 0x16, 0x00, 0xe5, 0x03, 0x80, + 0xe5, 0x10, 0x0e, 0xc5, 0x3b, 0x80, 0xe6, 0x01, + 0xe5, 0x21, 0x04, 0xe6, 0x10, 0x1b, 0xe6, 0x18, + 0x07, 0xe5, 0x2e, 0x06, 0x07, 0x06, 0x05, 0x47, + 0xe6, 0x00, 0x67, 0x06, 0x27, 0x05, 0xc6, 0xe5, + 0x02, 0x26, 0x36, 0xe9, 0x02, 0x16, 0x04, 0xe5, + 0x07, 0x06, 0x27, 0x00, 0xe5, 0x00, 0x20, 0x25, + 0x20, 0xe5, 0x0e, 0x00, 0xc5, 0x00, 0x05, 0x40, + 0x65, 0x20, 0x06, 0x05, 0x47, 0x66, 0x20, 0x27, + 0x20, 0x27, 0x06, 0x05, 0xe0, 0x00, 0x07, 0x60, + 0x25, 0x00, 0x45, 0x26, 0x20, 0xe9, 0x02, 0x25, + 0x2d, 0xab, 0x0f, 0x0d, 0x05, 0x16, 0x06, 0x20, + 0x26, 0x07, 0x00, 0xa5, 0x60, 0x25, 0x20, 0xe5, + 0x0e, 0x00, 0xc5, 0x00, 0x25, 0x00, 0x25, 0x00, + 0x25, 0x20, 0x06, 0x00, 0x47, 0x26, 0x60, 0x26, + 0x20, 0x46, 0x40, 0x06, 0xc0, 0x65, 0x00, 0x05, + 0xc0, 0xe9, 0x02, 0x26, 0x45, 0x06, 0x16, 0xe0, + 0x02, 0x26, 0x07, 0x00, 0xe5, 0x01, 0x00, 0x45, + 0x00, 0xe5, 0x0e, 0x00, 0xc5, 0x00, 0x25, 0x00, + 0x85, 0x20, 0x06, 0x05, 0x47, 0x86, 0x00, 0x26, + 0x07, 0x00, 0x27, 0x06, 0x20, 0x05, 0xe0, 0x07, + 0x25, 0x26, 0x20, 0xe9, 0x02, 0x16, 0x0d, 0xc0, + 0x05, 0xa6, 0x00, 0x06, 0x27, 0x00, 0xe5, 0x00, + 0x20, 0x25, 0x20, 0xe5, 0x0e, 0x00, 0xc5, 0x00, + 0x25, 0x00, 0x85, 0x20, 0x06, 0x05, 0x07, 0x06, + 0x07, 0x66, 0x20, 0x27, 0x20, 0x27, 0x06, 0xc0, + 0x26, 0x07, 0x60, 0x25, 0x00, 0x45, 0x26, 0x20, + 0xe9, 0x02, 0x0f, 0x05, 0xab, 0xe0, 0x02, 0x06, + 0x05, 0x00, 0xa5, 0x40, 0x45, 0x00, 0x65, 0x40, + 0x25, 0x00, 0x05, 0x00, 0x25, 0x40, 0x25, 0x40, + 0x45, 0x40, 0xe5, 0x04, 0x60, 0x27, 0x06, 0x27, + 0x40, 0x47, 0x00, 0x47, 0x06, 0x20, 0x05, 0xa0, + 0x07, 0xe0, 0x06, 0xe9, 0x02, 0x4b, 0xaf, 0x0d, + 0x0f, 0x80, 0x06, 0x47, 0x06, 0xe5, 0x00, 0x00, + 0x45, 0x00, 0xe5, 0x0f, 0x00, 0xe5, 0x08, 0x20, + 0x06, 0x05, 0x46, 0x67, 0x00, 0x46, 0x00, 0x66, + 0xc0, 0x26, 0x00, 0x45, 0x00, 0x25, 0x20, 0x25, + 0x26, 0x20, 0xe9, 0x02, 0xc0, 0x16, 0xcb, 0x0f, + 0x05, 0x06, 0x27, 0x16, 0xe5, 0x00, 0x00, 0x45, + 0x00, 0xe5, 0x0f, 0x00, 0xe5, 0x02, 0x00, 0x85, + 0x20, 0x06, 0x05, 0x07, 0x06, 0x87, 0x00, 0x06, + 0x27, 0x00, 0x27, 0x26, 0xc0, 0x27, 0x80, 0x45, + 0x00, 0x25, 0x26, 0x20, 0xe9, 0x02, 0x00, 0x25, + 0x07, 0xe0, 0x04, 0x26, 0x27, 0xe5, 0x01, 0x00, + 0x45, 0x00, 0xe5, 0x21, 0x26, 0x05, 0x47, 0x66, + 0x00, 0x47, 0x00, 0x47, 0x06, 0x05, 0x0f, 0x60, + 0x45, 0x07, 0xcb, 0x45, 0x26, 0x20, 0xe9, 0x02, + 0xeb, 0x01, 0x0f, 0xa5, 0x00, 0x06, 0x27, 0x00, + 0xe5, 0x0a, 0x40, 0xe5, 0x10, 0x00, 0xe5, 0x01, + 0x00, 0x05, 0x20, 0xc5, 0x40, 0x06, 0x60, 0x47, + 0x46, 0x00, 0x06, 0x00, 0xe7, 0x00, 0xa0, 0xe9, + 0x02, 0x20, 0x27, 0x16, 0xe0, 0x04, 0xe5, 0x28, + 0x06, 0x25, 0xc6, 0x60, 0x0d, 0xa5, 0x04, 0xe6, + 0x00, 0x16, 0xe9, 0x02, 0x36, 0xe0, 0x1d, 0x25, + 0x00, 0x05, 0x00, 0x85, 0x00, 0xe5, 0x10, 0x00, + 0x05, 0x00, 0xe5, 0x02, 0x06, 0x25, 0xe6, 0x01, + 0x05, 0x20, 0x85, 0x00, 0x04, 0x00, 0xc6, 0x00, + 0xe9, 0x02, 0x20, 0x65, 0xe0, 0x18, 0x05, 0x4f, + 0xf6, 0x07, 0x0f, 0x16, 0x4f, 0x26, 0xaf, 0xe9, + 0x02, 0xeb, 0x02, 0x0f, 0x06, 0x0f, 0x06, 0x0f, + 0x06, 0x12, 0x13, 0x12, 0x13, 0x27, 0xe5, 0x00, + 0x00, 0xe5, 0x1c, 0x60, 0xe6, 0x06, 0x07, 0x86, + 0x16, 0x26, 0x85, 0xe6, 0x03, 0x00, 0xe6, 0x1c, + 0x00, 0xef, 0x00, 0x06, 0xaf, 0x00, 0x2f, 0x96, + 0x6f, 0x36, 0xe0, 0x1d, 0xe5, 0x23, 0x27, 0x66, + 0x07, 0xa6, 0x07, 0x26, 0x27, 0x26, 0x05, 0xe9, + 0x02, 0xb6, 0xa5, 0x27, 0x26, 0x65, 0x46, 0x05, + 0x47, 0x25, 0xc7, 0x45, 0x66, 0xe5, 0x05, 0x06, + 0x27, 0x26, 0xa7, 0x06, 0x05, 0x07, 0xe9, 0x02, + 0x47, 0x06, 0x2f, 0xe1, 0x1e, 0x00, 0x01, 0x80, + 0x01, 0x20, 0xe2, 0x23, 0x16, 0x04, 0x42, 0xe5, + 0x80, 0xc1, 0x00, 0x65, 0x20, 0xc5, 0x00, 0x05, + 0x00, 0x65, 0x20, 0xe5, 0x21, 0x00, 0x65, 0x20, + 0xe5, 0x19, 0x00, 0x65, 0x20, 0xc5, 0x00, 0x05, + 0x00, 0x65, 0x20, 0xe5, 0x07, 0x00, 0xe5, 0x31, + 0x00, 0x65, 0x20, 0xe5, 0x3b, 0x20, 0x46, 0xf6, + 0x01, 0xeb, 0x0c, 0x40, 0xe5, 0x08, 0xef, 0x02, + 0xa0, 0xe1, 0x4e, 0x20, 0xa2, 0x20, 0x11, 0xe5, + 0x81, 0xe4, 0x0f, 0x16, 0xe5, 0x09, 0x17, 0xe5, + 0x12, 0x12, 0x13, 0x40, 0xe5, 0x43, 0x56, 0x4a, + 0xe5, 0x00, 0xc0, 0xe5, 0x0a, 0x46, 0x07, 0xe0, + 0x01, 0xe5, 0x0b, 0x26, 0x07, 0x36, 0xe0, 0x01, + 0xe5, 0x0a, 0x26, 0xe0, 0x04, 0xe5, 0x05, 0x00, + 0x45, 0x00, 0x26, 0xe0, 0x04, 0xe5, 0x2c, 0x26, + 0x07, 0xc6, 0xe7, 0x00, 0x06, 0x27, 0xe6, 0x03, + 0x56, 0x04, 0x56, 0x0d, 0x05, 0x06, 0x20, 0xe9, + 0x02, 0xa0, 0xeb, 0x02, 0xa0, 0xb6, 0x11, 0x76, + 0x46, 0x1b, 0x06, 0xe9, 0x02, 0xa0, 0xe5, 0x1b, + 0x04, 0xe5, 0x2d, 0xc0, 0x85, 0x26, 0xe5, 0x1a, + 0x06, 0x05, 0x80, 0xe5, 0x3e, 0xe0, 0x02, 0xe5, + 0x17, 0x00, 0x46, 0x67, 0x26, 0x47, 0x60, 0x27, + 0x06, 0xa7, 0x46, 0x60, 0x0f, 0x40, 0x36, 0xe9, + 0x02, 0xe5, 0x16, 0x20, 0x85, 0xe0, 0x03, 0xe5, + 0x24, 0x60, 0xe5, 0x12, 0xa0, 0xe9, 0x02, 0x0b, + 0x40, 0xef, 0x1a, 0xe5, 0x0f, 0x26, 0x27, 0x06, + 0x20, 0x36, 0xe5, 0x2d, 0x07, 0x06, 0x07, 0xc6, + 0x00, 0x06, 0x07, 0x06, 0x27, 0xe6, 0x00, 0xa7, + 0xe6, 0x02, 0x20, 0x06, 0xe9, 0x02, 0xa0, 0xe9, + 0x02, 0xa0, 0xd6, 0x04, 0xb6, 0x20, 0xe6, 0x06, + 0x08, 0xe6, 0x17, 0x20, 0xe6, 0x04, 0xe0, 0x0c, + 0x66, 0x07, 0xe5, 0x27, 0x06, 0x07, 0x86, 0x07, + 0x06, 0x87, 0x06, 0x27, 0xe5, 0x00, 0x00, 0x36, + 0xe9, 0x02, 0xd6, 0xef, 0x02, 0xe6, 0x01, 0xef, + 0x01, 0x56, 0x26, 0x07, 0xe5, 0x16, 0x07, 0x66, + 0x27, 0x26, 0x07, 0x46, 0x25, 0xe9, 0x02, 0xe5, + 0x24, 0x06, 0x07, 0x26, 0x47, 0x06, 0x07, 0x46, + 0x27, 0xe0, 0x00, 0x76, 0xe5, 0x1c, 0xe7, 0x00, + 0xe6, 0x00, 0x27, 0x26, 0x40, 0x96, 0xe9, 0x02, + 0x40, 0x45, 0xe9, 0x02, 0xe5, 0x16, 0xa4, 0x36, + 0xe2, 0x01, 0x3f, 0x80, 0xe1, 0x23, 0x20, 0x41, + 0xf6, 0x00, 0xe0, 0x00, 0x46, 0x16, 0xe6, 0x05, + 0x07, 0xc6, 0x65, 0x06, 0xa5, 0x06, 0x25, 0x07, + 0x26, 0x05, 0x80, 0xe2, 0x24, 0xe4, 0x37, 0xe2, + 0x05, 0x04, 0xe2, 0x1a, 0xe4, 0x1d, 0xe6, 0x38, + 0xff, 0x80, 0x0e, 0xe2, 0x00, 0xff, 0x5a, 0xe2, + 0x00, 0xe1, 0x00, 0xa2, 0x20, 0xa1, 0x20, 0xe2, + 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe1, 0x00, 0xa2, + 0x20, 0xa1, 0x20, 0xe2, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x3f, 0xc2, 0xe1, 0x00, + 0xe2, 0x06, 0x20, 0xe2, 0x00, 0xe3, 0x00, 0xe2, + 0x00, 0xe3, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0x82, + 0x00, 0x22, 0x61, 0x03, 0x0e, 0x02, 0x4e, 0x42, + 0x00, 0x22, 0x61, 0x03, 0x4e, 0x62, 0x20, 0x22, + 0x61, 0x00, 0x4e, 0xe2, 0x00, 0x81, 0x4e, 0x20, + 0x42, 0x00, 0x22, 0x61, 0x03, 0x2e, 0x00, 0xf7, + 0x03, 0x9b, 0xb1, 0x36, 0x14, 0x15, 0x12, 0x34, + 0x15, 0x12, 0x14, 0xf6, 0x00, 0x18, 0x19, 0x9b, + 0x17, 0xf6, 0x01, 0x14, 0x15, 0x76, 0x30, 0x56, + 0x0c, 0x12, 0x13, 0xf6, 0x03, 0x0c, 0x16, 0x10, + 0xf6, 0x02, 0x17, 0x9b, 0x00, 0xfb, 0x02, 0x0b, + 0x04, 0x20, 0xab, 0x4c, 0x12, 0x13, 0x04, 0xeb, + 0x02, 0x4c, 0x12, 0x13, 0x00, 0xe4, 0x05, 0x40, + 0xed, 0x1a, 0xe0, 0x06, 0xe6, 0x05, 0x68, 0x06, + 0x48, 0xe6, 0x04, 0xe0, 0x07, 0x2f, 0x01, 0x6f, + 0x01, 0x2f, 0x02, 0x41, 0x22, 0x41, 0x02, 0x0f, + 0x01, 0x2f, 0x0c, 0x81, 0xaf, 0x01, 0x0f, 0x01, + 0x0f, 0x01, 0x0f, 0x61, 0x0f, 0x02, 0x61, 0x02, + 0x65, 0x02, 0x2f, 0x22, 0x21, 0x8c, 0x3f, 0x42, + 0x0f, 0x0c, 0x2f, 0x02, 0x0f, 0xeb, 0x08, 0xea, + 0x1b, 0x3f, 0x6a, 0x0b, 0x2f, 0x60, 0x8c, 0x8f, + 0x2c, 0x6f, 0x0c, 0x2f, 0x0c, 0x2f, 0x0c, 0xcf, + 0x0c, 0xef, 0x17, 0x2c, 0x2f, 0x0c, 0x0f, 0x0c, + 0xef, 0x17, 0xec, 0x80, 0x84, 0xef, 0x00, 0x12, + 0x13, 0x12, 0x13, 0xef, 0x0c, 0x2c, 0xcf, 0x12, + 0x13, 0xef, 0x49, 0x0c, 0xef, 0x16, 0xec, 0x11, + 0xef, 0x20, 0xac, 0xef, 0x40, 0xe0, 0x0e, 0xef, + 0x03, 0xe0, 0x0d, 0xeb, 0x34, 0xef, 0x46, 0xeb, + 0x0e, 0xef, 0x80, 0x2f, 0x0c, 0xef, 0x01, 0x0c, + 0xef, 0x2e, 0xec, 0x00, 0xef, 0x67, 0x0c, 0xef, + 0x80, 0x70, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0xeb, 0x16, 0xef, 0x24, 0x8c, 0x12, 0x13, 0xec, + 0x17, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, + 0x13, 0x12, 0x13, 0xec, 0x08, 0xef, 0x80, 0x78, + 0xec, 0x7b, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0xec, 0x37, 0x12, 0x13, 0x12, 0x13, 0xec, 0x18, + 0x12, 0x13, 0xec, 0x80, 0x7a, 0xef, 0x28, 0xec, + 0x0d, 0x2f, 0xac, 0xef, 0x1f, 0x20, 0xef, 0x80, + 0x02, 0xe1, 0x28, 0xe2, 0x28, 0x5f, 0x21, 0x22, + 0xdf, 0x41, 0x02, 0x3f, 0x02, 0x3f, 0x82, 0x24, + 0x41, 0x02, 0xff, 0x5a, 0x02, 0xaf, 0x7f, 0x46, + 0x3f, 0x80, 0x76, 0x0b, 0x36, 0xe2, 0x1e, 0x00, + 0x02, 0x80, 0x02, 0x20, 0xe5, 0x30, 0xc0, 0x04, + 0x16, 0xe0, 0x06, 0x06, 0xe5, 0x0f, 0xe0, 0x01, + 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, + 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, + 0xe6, 0x18, 0x36, 0x14, 0x15, 0x14, 0x15, 0x56, + 0x14, 0x15, 0x16, 0x14, 0x15, 0xf6, 0x01, 0x11, + 0x36, 0x11, 0x16, 0x14, 0x15, 0x36, 0x14, 0x15, + 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, + 0x96, 0x04, 0xf6, 0x02, 0x31, 0x76, 0x11, 0x16, + 0x12, 0xf6, 0x05, 0x2f, 0x56, 0x12, 0x13, 0x12, + 0x13, 0x12, 0x13, 0x12, 0x13, 0x11, 0xe0, 0x1a, + 0xef, 0x12, 0x00, 0xef, 0x51, 0xe0, 0x04, 0xef, + 0x80, 0x4e, 0xe0, 0x12, 0xef, 0x08, 0x17, 0x56, + 0x0f, 0x04, 0x05, 0x0a, 0x12, 0x13, 0x12, 0x13, + 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x2f, 0x12, + 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x11, + 0x12, 0x33, 0x0f, 0xea, 0x01, 0x66, 0x27, 0x11, + 0x84, 0x2f, 0x4a, 0x04, 0x05, 0x16, 0x2f, 0x00, + 0xe5, 0x4e, 0x20, 0x26, 0x2e, 0x24, 0x05, 0x11, + 0xe5, 0x52, 0x16, 0x44, 0x05, 0x80, 0xe5, 0x23, + 0x00, 0xe5, 0x56, 0x00, 0x2f, 0x6b, 0xef, 0x02, + 0xe5, 0x18, 0xef, 0x1e, 0xe0, 0x01, 0x0f, 0xe5, + 0x08, 0xef, 0x17, 0x00, 0xeb, 0x02, 0xef, 0x16, + 0xeb, 0x00, 0x0f, 0xeb, 0x07, 0xef, 0x18, 0xeb, + 0x02, 0xef, 0x1f, 0xeb, 0x07, 0xef, 0x80, 0xb8, + 0xe5, 0x99, 0x38, 0xef, 0x38, 0xe5, 0xc0, 0x11, + 0x8d, 0x04, 0xe5, 0x83, 0xef, 0x40, 0xef, 0x2f, + 0xe0, 0x01, 0xe5, 0x20, 0xa4, 0x36, 0xe5, 0x80, + 0x84, 0x04, 0x56, 0xe5, 0x08, 0xe9, 0x02, 0x25, + 0xe0, 0x0c, 0xff, 0x26, 0x05, 0x06, 0x48, 0x16, + 0xe6, 0x02, 0x16, 0x04, 0xff, 0x14, 0x24, 0x26, + 0xe5, 0x3e, 0xea, 0x02, 0x26, 0xb6, 0xe0, 0x00, + 0xee, 0x0f, 0xe4, 0x01, 0x2e, 0xff, 0x06, 0x22, + 0xff, 0x36, 0x04, 0xe2, 0x00, 0x9f, 0xff, 0x02, + 0x04, 0x2e, 0x7f, 0x05, 0x7f, 0x22, 0xff, 0x0d, + 0x61, 0x02, 0x81, 0x02, 0xff, 0x07, 0x41, 0x02, + 0x5f, 0xff, 0x09, 0xe0, 0x0c, 0x64, 0x3f, 0x05, + 0x24, 0x02, 0xc5, 0x06, 0x45, 0x06, 0x65, 0x06, + 0xe5, 0x0f, 0x27, 0x26, 0x07, 0x6f, 0x06, 0x40, + 0xab, 0x2f, 0x0d, 0x0f, 0xa0, 0xe5, 0x2c, 0x76, + 0xe0, 0x00, 0x27, 0xe5, 0x2a, 0xe7, 0x08, 0x26, + 0xe0, 0x00, 0x36, 0xe9, 0x02, 0xa0, 0xe6, 0x0a, + 0xa5, 0x56, 0x05, 0x16, 0x25, 0x06, 0xe9, 0x02, + 0xe5, 0x14, 0xe6, 0x00, 0x36, 0xe5, 0x0f, 0xe6, + 0x03, 0x27, 0xe0, 0x03, 0x16, 0xe5, 0x15, 0x40, + 0x46, 0x07, 0xe5, 0x27, 0x06, 0x27, 0x66, 0x27, + 0x26, 0x47, 0xf6, 0x05, 0x00, 0x04, 0xe9, 0x02, + 0x60, 0x36, 0x85, 0x06, 0x04, 0xe5, 0x01, 0xe9, + 0x02, 0x85, 0x00, 0xe5, 0x21, 0xa6, 0x27, 0x26, + 0x27, 0x26, 0xe0, 0x01, 0x45, 0x06, 0xe5, 0x00, + 0x06, 0x07, 0x20, 0xe9, 0x02, 0x20, 0x76, 0xe5, + 0x08, 0x04, 0xa5, 0x4f, 0x05, 0x07, 0x06, 0x07, + 0xe5, 0x2a, 0x06, 0x05, 0x46, 0x25, 0x26, 0x85, + 0x26, 0x05, 0x06, 0x05, 0xe0, 0x10, 0x25, 0x04, + 0x36, 0xe5, 0x03, 0x07, 0x26, 0x27, 0x36, 0x05, + 0x24, 0x07, 0x06, 0xe0, 0x02, 0xa5, 0x20, 0xa5, + 0x20, 0xa5, 0xe0, 0x01, 0xc5, 0x00, 0xc5, 0x00, + 0xe2, 0x23, 0x0e, 0x64, 0xe2, 0x01, 0x04, 0x2e, + 0x60, 0xe2, 0x48, 0xe5, 0x1b, 0x27, 0x06, 0x27, + 0x06, 0x27, 0x16, 0x07, 0x06, 0x20, 0xe9, 0x02, + 0xa0, 0xe5, 0xab, 0x1c, 0xe0, 0x04, 0xe5, 0x0f, + 0x60, 0xe5, 0x29, 0x60, 0xfc, 0x87, 0x78, 0xfd, + 0x98, 0x78, 0xe5, 0x80, 0xe6, 0x20, 0xe5, 0x62, + 0xe0, 0x1e, 0xc2, 0xe0, 0x04, 0x82, 0x80, 0x05, + 0x06, 0xe5, 0x02, 0x0c, 0xe5, 0x05, 0x00, 0x85, + 0x00, 0x05, 0x00, 0x25, 0x00, 0x25, 0x00, 0xe5, + 0x64, 0xee, 0x09, 0xef, 0x08, 0xe5, 0x80, 0xe3, + 0x13, 0x12, 0xef, 0x08, 0xe5, 0x38, 0x2f, 0xe5, + 0x2e, 0xef, 0x00, 0xe0, 0x18, 0xe5, 0x04, 0x0d, + 0x4f, 0xe6, 0x08, 0xd6, 0x12, 0x13, 0x16, 0xa0, + 0xe6, 0x08, 0x16, 0x31, 0x30, 0x12, 0x13, 0x12, + 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, + 0x13, 0x12, 0x13, 0x12, 0x13, 0x36, 0x12, 0x13, + 0x76, 0x50, 0x56, 0x00, 0x76, 0x11, 0x12, 0x13, + 0x12, 0x13, 0x12, 0x13, 0x56, 0x0c, 0x11, 0x4c, + 0x00, 0x16, 0x0d, 0x36, 0x60, 0x85, 0x00, 0xe5, + 0x7f, 0x20, 0x1b, 0x00, 0x56, 0x0d, 0x56, 0x12, + 0x13, 0x16, 0x0c, 0x16, 0x11, 0x36, 0xe9, 0x02, + 0x36, 0x4c, 0x36, 0xe1, 0x12, 0x12, 0x16, 0x13, + 0x0e, 0x10, 0x0e, 0xe2, 0x12, 0x12, 0x0c, 0x13, + 0x0c, 0x12, 0x13, 0x16, 0x12, 0x13, 0x36, 0xe5, + 0x02, 0x04, 0xe5, 0x25, 0x24, 0xe5, 0x17, 0x40, + 0xa5, 0x20, 0xa5, 0x20, 0xa5, 0x20, 0x45, 0x40, + 0x2d, 0x0c, 0x0e, 0x0f, 0x2d, 0x00, 0x0f, 0x6c, + 0x2f, 0xe0, 0x02, 0x5b, 0x2f, 0x20, 0xe5, 0x04, + 0x00, 0xe5, 0x12, 0x00, 0xe5, 0x0b, 0x00, 0x25, + 0x00, 0xe5, 0x07, 0x20, 0xe5, 0x06, 0xe0, 0x1a, + 0xe5, 0x73, 0x80, 0x56, 0x60, 0xeb, 0x25, 0x40, + 0xef, 0x01, 0xea, 0x2d, 0x6b, 0xef, 0x09, 0x2b, + 0x4f, 0x00, 0xef, 0x05, 0x40, 0x0f, 0xe0, 0x27, + 0xef, 0x25, 0x06, 0xe0, 0x7a, 0xe5, 0x15, 0x40, + 0xe5, 0x29, 0xe0, 0x07, 0x06, 0xeb, 0x13, 0x60, + 0xe5, 0x18, 0x6b, 0xe0, 0x01, 0xe5, 0x0c, 0x0a, + 0xe5, 0x00, 0x0a, 0x80, 0xe5, 0x1e, 0x86, 0x80, + 0xe5, 0x16, 0x00, 0x16, 0xe5, 0x1c, 0x60, 0xe5, + 0x00, 0x16, 0x8a, 0xe0, 0x22, 0xe1, 0x20, 0xe2, + 0x20, 0xe5, 0x46, 0x20, 0xe9, 0x02, 0xa0, 0xe1, + 0x1c, 0x60, 0xe2, 0x1c, 0x60, 0xe5, 0x20, 0xe0, + 0x00, 0xe5, 0x2c, 0xe0, 0x03, 0x16, 0xe1, 0x03, + 0x00, 0xe1, 0x07, 0x00, 0xc1, 0x00, 0x21, 0x00, + 0xe2, 0x03, 0x00, 0xe2, 0x07, 0x00, 0xc2, 0x00, + 0x22, 0x40, 0xe5, 0x2c, 0xe0, 0x04, 0xe5, 0x80, + 0xaf, 0xe0, 0x01, 0xe5, 0x0e, 0xe0, 0x02, 0xe5, + 0x00, 0xe0, 0x10, 0xa4, 0x00, 0xe4, 0x22, 0x00, + 0xe4, 0x01, 0xe0, 0x3d, 0xa5, 0x20, 0x05, 0x00, + 0xe5, 0x24, 0x00, 0x25, 0x40, 0x05, 0x20, 0xe5, + 0x0f, 0x00, 0x16, 0xeb, 0x00, 0xe5, 0x0f, 0x2f, + 0xcb, 0xe5, 0x17, 0xe0, 0x00, 0xeb, 0x01, 0xe0, + 0x28, 0xe5, 0x0b, 0x00, 0x25, 0x80, 0x8b, 0xe5, + 0x0e, 0xab, 0x40, 0x16, 0xe5, 0x12, 0x80, 0x16, + 0xe5, 0x12, 0xe0, 0x1e, 0xe5, 0x30, 0x60, 0x2b, + 0x25, 0xeb, 0x08, 0x20, 0xeb, 0x26, 0x05, 0x46, + 0x00, 0x26, 0x80, 0x66, 0x65, 0x00, 0x45, 0x00, + 0xe5, 0x15, 0x20, 0x46, 0x60, 0x06, 0xeb, 0x01, + 0xc0, 0xf6, 0x01, 0xc0, 0xe5, 0x15, 0x2b, 0x16, + 0xe5, 0x15, 0x4b, 0xe0, 0x18, 0xe5, 0x00, 0x0f, + 0xe5, 0x14, 0x26, 0x60, 0x8b, 0xd6, 0xe0, 0x01, + 0xe5, 0x2e, 0x40, 0xd6, 0xe5, 0x0e, 0x20, 0xeb, + 0x00, 0xe5, 0x0b, 0x80, 0xeb, 0x00, 0xe5, 0x0a, + 0xc0, 0x76, 0xe0, 0x04, 0xcb, 0xe0, 0x48, 0xe5, + 0x41, 0xe0, 0x2f, 0xe1, 0x2b, 0xe0, 0x05, 0xe2, + 0x2b, 0xc0, 0xab, 0xe5, 0x1c, 0x66, 0xe0, 0x00, + 0xe9, 0x02, 0xa0, 0xe9, 0x02, 0x65, 0x04, 0x05, + 0xe1, 0x0e, 0x40, 0x86, 0x11, 0x04, 0xe2, 0x0e, + 0xe0, 0x00, 0x2c, 0xe0, 0x80, 0x48, 0xeb, 0x17, + 0x00, 0xe5, 0x22, 0x00, 0x26, 0x11, 0x20, 0x25, + 0xe0, 0x08, 0x45, 0x04, 0x25, 0xe0, 0x00, 0x16, + 0xef, 0x00, 0xe0, 0x19, 0xa6, 0xe5, 0x15, 0xeb, + 0x02, 0x05, 0xe0, 0x00, 0xe5, 0x0e, 0xe6, 0x03, + 0x6b, 0x96, 0xe0, 0x0e, 0xe5, 0x0a, 0x66, 0x76, + 0xe0, 0x1e, 0xe5, 0x0d, 0xcb, 0xe0, 0x0c, 0xe5, + 0x0f, 0xe0, 0x01, 0x07, 0x06, 0x07, 0xe5, 0x2d, + 0xe6, 0x07, 0xd6, 0x60, 0xeb, 0x0c, 0xe9, 0x02, + 0x06, 0x25, 0x26, 0x05, 0xe0, 0x01, 0x46, 0x07, + 0xe5, 0x25, 0x47, 0x66, 0x27, 0x26, 0x36, 0x1b, + 0x76, 0x06, 0xe0, 0x02, 0x1b, 0x20, 0xe5, 0x11, + 0xc0, 0xe9, 0x02, 0xa0, 0x46, 0xe5, 0x1c, 0x86, + 0x07, 0xe6, 0x00, 0x00, 0xe9, 0x02, 0x76, 0x05, + 0x27, 0x05, 0xe0, 0x00, 0xe5, 0x1b, 0x06, 0x36, + 0x05, 0xe0, 0x01, 0x26, 0x07, 0xe5, 0x28, 0x47, + 0xe6, 0x01, 0x27, 0x65, 0x76, 0x66, 0x16, 0x07, + 0x06, 0xe9, 0x02, 0x05, 0x16, 0x05, 0x56, 0x00, + 0xeb, 0x0c, 0xe0, 0x03, 0xe5, 0x0a, 0x00, 0xe5, + 0x11, 0x47, 0x46, 0x27, 0x06, 0x07, 0x26, 0xb6, + 0x06, 0x25, 0x06, 0xe0, 0x36, 0xc5, 0x00, 0x05, + 0x00, 0x65, 0x00, 0xe5, 0x07, 0x00, 0xe5, 0x02, + 0x16, 0xa0, 0xe5, 0x27, 0x06, 0x47, 0xe6, 0x00, + 0x80, 0xe9, 0x02, 0xa0, 0x26, 0x27, 0x00, 0xe5, + 0x00, 0x20, 0x25, 0x20, 0xe5, 0x0e, 0x00, 0xc5, + 0x00, 0x25, 0x00, 0x85, 0x00, 0x26, 0x05, 0x27, + 0x06, 0x67, 0x20, 0x27, 0x20, 0x47, 0x20, 0x05, + 0xa0, 0x07, 0x80, 0x85, 0x27, 0x20, 0xc6, 0x40, + 0x86, 0xe0, 0x03, 0xe5, 0x02, 0x00, 0x05, 0x20, + 0x05, 0x00, 0xe5, 0x1e, 0x00, 0x05, 0x47, 0xa6, + 0x00, 0x07, 0x20, 0x07, 0x00, 0x67, 0x00, 0x27, + 0x06, 0x07, 0x06, 0x05, 0x06, 0x05, 0x36, 0x00, + 0x36, 0xe0, 0x00, 0x26, 0xe0, 0x15, 0xe5, 0x2d, + 0x47, 0xe6, 0x00, 0x27, 0x46, 0x07, 0x06, 0x65, + 0x96, 0xe9, 0x02, 0x36, 0x00, 0x16, 0x06, 0x45, + 0xe0, 0x16, 0xe5, 0x28, 0x47, 0xa6, 0x07, 0x06, + 0x67, 0x26, 0x07, 0x26, 0x25, 0x16, 0x05, 0xe0, + 0x00, 0xe9, 0x02, 0xe0, 0x80, 0x1e, 0xe5, 0x27, + 0x47, 0x66, 0x20, 0x67, 0x26, 0x07, 0x26, 0xf6, + 0x0f, 0x65, 0x26, 0xe0, 0x1a, 0xe5, 0x28, 0x47, + 0xe6, 0x00, 0x27, 0x06, 0x07, 0x26, 0x56, 0x05, + 0xe0, 0x03, 0xe9, 0x02, 0xa0, 0xf6, 0x05, 0xe0, + 0x0b, 0xe5, 0x23, 0x06, 0x07, 0x06, 0x27, 0xa6, + 0x07, 0x06, 0x05, 0x16, 0xa0, 0xe9, 0x02, 0xa0, + 0xe9, 0x0c, 0xe0, 0x14, 0xe5, 0x13, 0x20, 0x06, + 0x07, 0x06, 0x27, 0x66, 0x07, 0x86, 0x60, 0xe9, + 0x02, 0x2b, 0x56, 0x0f, 0xc5, 0xe0, 0x80, 0x31, + 0xe5, 0x24, 0x47, 0xe6, 0x01, 0x07, 0x26, 0x16, + 0xe0, 0x5c, 0xe1, 0x18, 0xe2, 0x18, 0xe9, 0x02, + 0xeb, 0x01, 0xe0, 0x04, 0xe5, 0x00, 0x20, 0x05, + 0x20, 0xe5, 0x00, 0x00, 0x25, 0x00, 0xe5, 0x10, + 0xa7, 0x00, 0x27, 0x20, 0x26, 0x07, 0x06, 0x05, + 0x07, 0x05, 0x07, 0x06, 0x56, 0xe0, 0x01, 0xe9, + 0x02, 0xe0, 0x3e, 0xe5, 0x00, 0x20, 0xe5, 0x1f, + 0x47, 0x66, 0x20, 0x26, 0x67, 0x06, 0x05, 0x16, + 0x05, 0x07, 0xe0, 0x13, 0x05, 0xe6, 0x02, 0xe5, + 0x20, 0xa6, 0x07, 0x05, 0x66, 0xf6, 0x00, 0x06, + 0xe0, 0x00, 0x05, 0xa6, 0x27, 0x46, 0xe5, 0x26, + 0xe6, 0x05, 0x07, 0x26, 0x56, 0x05, 0x96, 0xe0, + 0x05, 0xe5, 0x41, 0xc0, 0xf6, 0x02, 0xe0, 0x4e, + 0x06, 0x07, 0x46, 0x07, 0x06, 0x07, 0xe0, 0x50, + 0xe5, 0x19, 0x16, 0xe0, 0x06, 0xe9, 0x02, 0xa0, + 0xe5, 0x01, 0x00, 0xe5, 0x1d, 0x07, 0xc6, 0x00, + 0xa6, 0x07, 0x06, 0x05, 0x96, 0xe0, 0x02, 0xe9, + 0x02, 0xeb, 0x0b, 0x40, 0x36, 0xe5, 0x16, 0x20, + 0xe6, 0x0e, 0x00, 0x07, 0xc6, 0x07, 0x26, 0x07, + 0x26, 0xe0, 0x41, 0xc5, 0x00, 0x25, 0x00, 0xe5, + 0x1e, 0xa6, 0x40, 0x06, 0x00, 0x26, 0x00, 0xc6, + 0x05, 0x06, 0xe0, 0x00, 0xe9, 0x02, 0xa0, 0xa5, + 0x00, 0x25, 0x00, 0xe5, 0x18, 0x87, 0x00, 0x26, + 0x00, 0x27, 0x06, 0x07, 0x06, 0x05, 0xc0, 0xe9, + 0x02, 0xa0, 0xe5, 0x21, 0x04, 0x25, 0x60, 0xe9, + 0x02, 0xe0, 0x80, 0x6e, 0xe5, 0x0b, 0x26, 0x27, + 0x36, 0xc0, 0x26, 0x05, 0x07, 0xe5, 0x05, 0x00, + 0xe5, 0x1a, 0x27, 0x86, 0x40, 0x27, 0x06, 0x07, + 0x06, 0xf6, 0x05, 0xe9, 0x02, 0x06, 0xe0, 0x4d, + 0x05, 0xe0, 0x07, 0xeb, 0x0d, 0xef, 0x00, 0x6d, + 0xef, 0x09, 0xe0, 0x05, 0x16, 0xe5, 0x83, 0x12, + 0xe0, 0x5e, 0xea, 0x67, 0x00, 0x96, 0xe0, 0x03, + 0xe5, 0x80, 0x3c, 0xe0, 0x89, 0xc4, 0xe5, 0x59, + 0x36, 0xe0, 0x05, 0xe5, 0x83, 0xa8, 0xfb, 0x08, + 0x06, 0xa5, 0xe6, 0x07, 0xe0, 0x02, 0xe5, 0x8f, + 0x13, 0x80, 0xe5, 0x81, 0xbf, 0xe0, 0x9a, 0x31, + 0xe5, 0x16, 0xe6, 0x04, 0x47, 0x46, 0xe9, 0x02, + 0xe0, 0x86, 0x3e, 0xe5, 0x81, 0xb1, 0xc0, 0xe5, + 0x17, 0x00, 0xe9, 0x02, 0x60, 0x36, 0xe5, 0x47, + 0x00, 0xe9, 0x02, 0xa0, 0xe5, 0x16, 0x20, 0x86, + 0x16, 0xe0, 0x02, 0xe5, 0x28, 0xc6, 0x96, 0x6f, + 0x64, 0x16, 0x0f, 0xe0, 0x02, 0xe9, 0x02, 0x00, + 0xcb, 0x00, 0xe5, 0x0d, 0x80, 0xe5, 0x0b, 0xe0, + 0x81, 0x28, 0x44, 0xe5, 0x20, 0x24, 0x56, 0xe9, + 0x02, 0xe0, 0x80, 0x3e, 0xe1, 0x18, 0xe2, 0x18, + 0xeb, 0x0f, 0x76, 0x80, 0xe1, 0x11, 0x20, 0xe2, + 0x11, 0xe0, 0x24, 0xe5, 0x43, 0x60, 0x06, 0x05, + 0xe7, 0x2f, 0xc0, 0x66, 0xe4, 0x05, 0xe0, 0x38, + 0x24, 0x16, 0x04, 0x06, 0xe0, 0x03, 0x27, 0x24, + 0x4a, 0xe0, 0x01, 0xe5, 0x9c, 0x4e, 0xe0, 0x21, + 0xe5, 0x18, 0xe0, 0x59, 0xe5, 0x6b, 0xe0, 0xa1, + 0x75, 0x64, 0x00, 0xc4, 0x00, 0x24, 0x00, 0xe5, + 0x80, 0x9b, 0xe0, 0x07, 0x05, 0xe0, 0x15, 0x45, + 0x20, 0x05, 0xe0, 0x06, 0x65, 0xe0, 0x00, 0xe5, + 0x81, 0x04, 0xe0, 0x88, 0x7c, 0xe5, 0x63, 0x80, + 0xe5, 0x05, 0x40, 0xe5, 0x01, 0xc0, 0xe5, 0x02, + 0x20, 0x0f, 0x26, 0x16, 0x7b, 0xe0, 0x8e, 0xd4, + 0xef, 0x80, 0x68, 0xe9, 0x02, 0x4f, 0x40, 0xef, + 0x81, 0x2c, 0xa0, 0xef, 0x0f, 0xe0, 0x07, 0xef, + 0x08, 0x0c, 0xe0, 0x07, 0xe6, 0x26, 0x20, 0xe6, + 0x0f, 0xe0, 0x01, 0xef, 0x6c, 0xe0, 0x34, 0xef, + 0x80, 0x6e, 0xe0, 0x02, 0xef, 0x1f, 0x20, 0xef, + 0x34, 0x27, 0x46, 0x4f, 0xa7, 0xfb, 0x00, 0xe6, + 0x00, 0x2f, 0xc6, 0xef, 0x16, 0x66, 0xef, 0x35, + 0xe0, 0x0d, 0xef, 0x3a, 0x46, 0x0f, 0xe0, 0x72, + 0xeb, 0x0c, 0xe0, 0x04, 0xeb, 0x0c, 0xe0, 0x04, + 0xef, 0x4f, 0xe0, 0x01, 0xeb, 0x11, 0xe0, 0x7f, + 0xe1, 0x12, 0xe2, 0x12, 0xe1, 0x12, 0xc2, 0x00, + 0xe2, 0x0a, 0xe1, 0x12, 0xe2, 0x12, 0x01, 0x00, + 0x21, 0x20, 0x01, 0x20, 0x21, 0x20, 0x61, 0x00, + 0xe1, 0x00, 0x62, 0x00, 0x02, 0x00, 0xc2, 0x00, + 0xe2, 0x03, 0xe1, 0x12, 0xe2, 0x12, 0x21, 0x00, + 0x61, 0x20, 0xe1, 0x00, 0x00, 0xc1, 0x00, 0xe2, + 0x12, 0x21, 0x00, 0x61, 0x00, 0x81, 0x00, 0x01, + 0x40, 0xc1, 0x00, 0xe2, 0x12, 0xe1, 0x12, 0xe2, + 0x12, 0xe1, 0x12, 0xe2, 0x12, 0xe1, 0x12, 0xe2, + 0x12, 0xe1, 0x12, 0xe2, 0x12, 0xe1, 0x12, 0xe2, + 0x12, 0xe1, 0x12, 0xe2, 0x14, 0x20, 0xe1, 0x11, + 0x0c, 0xe2, 0x11, 0x0c, 0xa2, 0xe1, 0x11, 0x0c, + 0xe2, 0x11, 0x0c, 0xa2, 0xe1, 0x11, 0x0c, 0xe2, + 0x11, 0x0c, 0xa2, 0xe1, 0x11, 0x0c, 0xe2, 0x11, + 0x0c, 0xa2, 0xe1, 0x11, 0x0c, 0xe2, 0x11, 0x0c, + 0xa2, 0x3f, 0x20, 0xe9, 0x2a, 0xef, 0x81, 0x78, + 0xe6, 0x2f, 0x6f, 0xe6, 0x2a, 0xef, 0x00, 0x06, + 0xef, 0x06, 0x06, 0x2f, 0x96, 0xe0, 0x07, 0x86, + 0x00, 0xe6, 0x07, 0xe0, 0x83, 0xc8, 0xe2, 0x02, + 0x05, 0xe2, 0x0c, 0xa0, 0xa2, 0xe0, 0x80, 0x4d, + 0xc6, 0x00, 0xe6, 0x09, 0x20, 0xc6, 0x00, 0x26, + 0x00, 0x86, 0x80, 0xe4, 0x36, 0xe0, 0x19, 0x06, + 0xe0, 0x68, 0xe5, 0x25, 0x40, 0xc6, 0xc4, 0x20, + 0xe9, 0x02, 0x60, 0x05, 0x0f, 0xe0, 0x80, 0xb8, + 0xe5, 0x16, 0x06, 0xe0, 0x09, 0xe5, 0x24, 0x66, + 0xe9, 0x02, 0x80, 0x0d, 0xe0, 0x81, 0x48, 0xe5, + 0x13, 0x04, 0x66, 0xe9, 0x02, 0xe0, 0x80, 0x4e, + 0xe5, 0x16, 0x26, 0x05, 0xe9, 0x02, 0x60, 0x16, + 0xe0, 0x80, 0x38, 0xe5, 0x17, 0x00, 0x45, 0x06, + 0x25, 0x06, 0xc5, 0x26, 0x85, 0x06, 0xe0, 0x00, + 0x05, 0x04, 0xe0, 0x80, 0x58, 0xc5, 0x00, 0x65, + 0x00, 0x25, 0x00, 0xe5, 0x07, 0x00, 0xe5, 0x80, + 0x3d, 0x20, 0xeb, 0x01, 0xc6, 0xe0, 0x21, 0xe1, + 0x1a, 0xe2, 0x1a, 0xc6, 0x04, 0x60, 0xe9, 0x02, + 0x60, 0x36, 0xe0, 0x82, 0x89, 0xeb, 0x33, 0x0f, + 0x4b, 0x0d, 0x6b, 0xe0, 0x44, 0xeb, 0x25, 0x0f, + 0xeb, 0x07, 0xe0, 0x80, 0x3a, 0x65, 0x00, 0xe5, + 0x13, 0x00, 0x25, 0x00, 0x05, 0x20, 0x05, 0x00, + 0xe5, 0x02, 0x00, 0x65, 0x00, 0x05, 0x00, 0x05, + 0xa0, 0x05, 0x60, 0x05, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x45, 0x00, 0x25, 0x00, 0x05, 0x20, 0x05, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x25, 0x00, 0x05, 0x20, 0x65, 0x00, 0xc5, + 0x00, 0x65, 0x00, 0x65, 0x00, 0x05, 0x00, 0xe5, + 0x02, 0x00, 0xe5, 0x09, 0x80, 0x45, 0x00, 0x85, + 0x00, 0xe5, 0x09, 0xe0, 0x2c, 0x2c, 0xe0, 0x80, + 0x86, 0xef, 0x24, 0x60, 0xef, 0x5c, 0xe0, 0x04, + 0xef, 0x07, 0x20, 0xef, 0x07, 0x00, 0xef, 0x07, + 0x00, 0xef, 0x1d, 0xe0, 0x02, 0xeb, 0x05, 0xef, + 0x80, 0x19, 0xe0, 0x30, 0xef, 0x15, 0xe0, 0x05, + 0xef, 0x24, 0x60, 0xef, 0x01, 0xc0, 0x2f, 0xe0, + 0x06, 0xaf, 0xe0, 0x80, 0x12, 0xef, 0x80, 0x73, + 0x8e, 0xef, 0x82, 0x51, 0x40, 0xef, 0x09, 0x40, + 0xef, 0x05, 0x40, 0xef, 0x80, 0x52, 0xa0, 0xef, + 0x04, 0x60, 0x0f, 0xe0, 0x07, 0xef, 0x04, 0x60, + 0xef, 0x30, 0xe0, 0x00, 0xef, 0x02, 0xa0, 0xef, + 0x20, 0xe0, 0x00, 0xef, 0x16, 0x20, 0xef, 0x04, + 0x60, 0x2f, 0xe0, 0x06, 0xec, 0x01, 0xe0, 0x1f, + 0xef, 0x80, 0xd0, 0xe0, 0x00, 0xef, 0x06, 0x20, + 0xef, 0x05, 0x40, 0xef, 0x03, 0x40, 0xef, 0x31, + 0x00, 0x0f, 0x60, 0xef, 0x08, 0x20, 0xef, 0x04, + 0x60, 0xef, 0x02, 0xc0, 0xef, 0x80, 0x0b, 0x00, + 0xef, 0x54, 0xe9, 0x02, 0x0f, 0xe0, 0x83, 0x7d, + 0xe5, 0xc0, 0x66, 0x58, 0xe0, 0x18, 0xe5, 0x90, + 0x96, 0x20, 0xe5, 0x96, 0x06, 0x20, 0xe5, 0x9c, + 0xa9, 0xe0, 0x07, 0xe5, 0x81, 0xe6, 0xe0, 0x89, + 0x1a, 0xe5, 0x81, 0x96, 0xe0, 0x85, 0x5a, 0xe5, + 0x92, 0xc3, 0x80, 0xe5, 0xa0, 0xa2, 0xe0, 0xca, + 0x8a, 0xff, 0x1b, 0xe0, 0x16, 0xfb, 0x58, 0xe0, + 0x78, 0xe6, 0x80, 0x68, 0xe0, 0xc0, 0xbd, 0x88, + 0xfd, 0xc0, 0xbf, 0x76, 0x20, 0xfd, 0xc0, 0xbf, + 0x76, 0x20, +}; + +typedef enum { + UNICODE_SCRIPT_Unknown, + UNICODE_SCRIPT_Adlam, + UNICODE_SCRIPT_Ahom, + UNICODE_SCRIPT_Anatolian_Hieroglyphs, + UNICODE_SCRIPT_Arabic, + UNICODE_SCRIPT_Armenian, + UNICODE_SCRIPT_Avestan, + UNICODE_SCRIPT_Balinese, + UNICODE_SCRIPT_Bamum, + UNICODE_SCRIPT_Bassa_Vah, + UNICODE_SCRIPT_Batak, + UNICODE_SCRIPT_Bengali, + UNICODE_SCRIPT_Beria_Erfe, + UNICODE_SCRIPT_Bhaiksuki, + UNICODE_SCRIPT_Bopomofo, + UNICODE_SCRIPT_Brahmi, + UNICODE_SCRIPT_Braille, + UNICODE_SCRIPT_Buginese, + UNICODE_SCRIPT_Buhid, + UNICODE_SCRIPT_Canadian_Aboriginal, + UNICODE_SCRIPT_Carian, + UNICODE_SCRIPT_Caucasian_Albanian, + UNICODE_SCRIPT_Chakma, + UNICODE_SCRIPT_Cham, + UNICODE_SCRIPT_Cherokee, + UNICODE_SCRIPT_Chorasmian, + UNICODE_SCRIPT_Common, + UNICODE_SCRIPT_Coptic, + UNICODE_SCRIPT_Cuneiform, + UNICODE_SCRIPT_Cypriot, + UNICODE_SCRIPT_Cyrillic, + UNICODE_SCRIPT_Cypro_Minoan, + UNICODE_SCRIPT_Deseret, + UNICODE_SCRIPT_Devanagari, + UNICODE_SCRIPT_Dives_Akuru, + UNICODE_SCRIPT_Dogra, + UNICODE_SCRIPT_Duployan, + UNICODE_SCRIPT_Egyptian_Hieroglyphs, + UNICODE_SCRIPT_Elbasan, + UNICODE_SCRIPT_Elymaic, + UNICODE_SCRIPT_Ethiopic, + UNICODE_SCRIPT_Georgian, + UNICODE_SCRIPT_Glagolitic, + UNICODE_SCRIPT_Gothic, + UNICODE_SCRIPT_Garay, + UNICODE_SCRIPT_Grantha, + UNICODE_SCRIPT_Greek, + UNICODE_SCRIPT_Gujarati, + UNICODE_SCRIPT_Gunjala_Gondi, + UNICODE_SCRIPT_Gurmukhi, + UNICODE_SCRIPT_Gurung_Khema, + UNICODE_SCRIPT_Han, + UNICODE_SCRIPT_Hangul, + UNICODE_SCRIPT_Hanifi_Rohingya, + UNICODE_SCRIPT_Hanunoo, + UNICODE_SCRIPT_Hatran, + UNICODE_SCRIPT_Hebrew, + UNICODE_SCRIPT_Hiragana, + UNICODE_SCRIPT_Imperial_Aramaic, + UNICODE_SCRIPT_Inherited, + UNICODE_SCRIPT_Inscriptional_Pahlavi, + UNICODE_SCRIPT_Inscriptional_Parthian, + UNICODE_SCRIPT_Javanese, + UNICODE_SCRIPT_Kaithi, + UNICODE_SCRIPT_Kannada, + UNICODE_SCRIPT_Katakana, + UNICODE_SCRIPT_Katakana_Or_Hiragana, + UNICODE_SCRIPT_Kawi, + UNICODE_SCRIPT_Kayah_Li, + UNICODE_SCRIPT_Kharoshthi, + UNICODE_SCRIPT_Khmer, + UNICODE_SCRIPT_Khojki, + UNICODE_SCRIPT_Khitan_Small_Script, + UNICODE_SCRIPT_Khudawadi, + UNICODE_SCRIPT_Kirat_Rai, + UNICODE_SCRIPT_Lao, + UNICODE_SCRIPT_Latin, + UNICODE_SCRIPT_Lepcha, + UNICODE_SCRIPT_Limbu, + UNICODE_SCRIPT_Linear_A, + UNICODE_SCRIPT_Linear_B, + UNICODE_SCRIPT_Lisu, + UNICODE_SCRIPT_Lycian, + UNICODE_SCRIPT_Lydian, + UNICODE_SCRIPT_Makasar, + UNICODE_SCRIPT_Mahajani, + UNICODE_SCRIPT_Malayalam, + UNICODE_SCRIPT_Mandaic, + UNICODE_SCRIPT_Manichaean, + UNICODE_SCRIPT_Marchen, + UNICODE_SCRIPT_Masaram_Gondi, + UNICODE_SCRIPT_Medefaidrin, + UNICODE_SCRIPT_Meetei_Mayek, + UNICODE_SCRIPT_Mende_Kikakui, + UNICODE_SCRIPT_Meroitic_Cursive, + UNICODE_SCRIPT_Meroitic_Hieroglyphs, + UNICODE_SCRIPT_Miao, + UNICODE_SCRIPT_Modi, + UNICODE_SCRIPT_Mongolian, + UNICODE_SCRIPT_Mro, + UNICODE_SCRIPT_Multani, + UNICODE_SCRIPT_Myanmar, + UNICODE_SCRIPT_Nabataean, + UNICODE_SCRIPT_Nag_Mundari, + UNICODE_SCRIPT_Nandinagari, + UNICODE_SCRIPT_New_Tai_Lue, + UNICODE_SCRIPT_Newa, + UNICODE_SCRIPT_Nko, + UNICODE_SCRIPT_Nushu, + UNICODE_SCRIPT_Nyiakeng_Puachue_Hmong, + UNICODE_SCRIPT_Ogham, + UNICODE_SCRIPT_Ol_Chiki, + UNICODE_SCRIPT_Ol_Onal, + UNICODE_SCRIPT_Old_Hungarian, + UNICODE_SCRIPT_Old_Italic, + UNICODE_SCRIPT_Old_North_Arabian, + UNICODE_SCRIPT_Old_Permic, + UNICODE_SCRIPT_Old_Persian, + UNICODE_SCRIPT_Old_Sogdian, + UNICODE_SCRIPT_Old_South_Arabian, + UNICODE_SCRIPT_Old_Turkic, + UNICODE_SCRIPT_Old_Uyghur, + UNICODE_SCRIPT_Oriya, + UNICODE_SCRIPT_Osage, + UNICODE_SCRIPT_Osmanya, + UNICODE_SCRIPT_Pahawh_Hmong, + UNICODE_SCRIPT_Palmyrene, + UNICODE_SCRIPT_Pau_Cin_Hau, + UNICODE_SCRIPT_Phags_Pa, + UNICODE_SCRIPT_Phoenician, + UNICODE_SCRIPT_Psalter_Pahlavi, + UNICODE_SCRIPT_Rejang, + UNICODE_SCRIPT_Runic, + UNICODE_SCRIPT_Samaritan, + UNICODE_SCRIPT_Saurashtra, + UNICODE_SCRIPT_Sharada, + UNICODE_SCRIPT_Shavian, + UNICODE_SCRIPT_Siddham, + UNICODE_SCRIPT_Sidetic, + UNICODE_SCRIPT_SignWriting, + UNICODE_SCRIPT_Sinhala, + UNICODE_SCRIPT_Sogdian, + UNICODE_SCRIPT_Sora_Sompeng, + UNICODE_SCRIPT_Soyombo, + UNICODE_SCRIPT_Sundanese, + UNICODE_SCRIPT_Sunuwar, + UNICODE_SCRIPT_Syloti_Nagri, + UNICODE_SCRIPT_Syriac, + UNICODE_SCRIPT_Tagalog, + UNICODE_SCRIPT_Tagbanwa, + UNICODE_SCRIPT_Tai_Le, + UNICODE_SCRIPT_Tai_Tham, + UNICODE_SCRIPT_Tai_Viet, + UNICODE_SCRIPT_Tai_Yo, + UNICODE_SCRIPT_Takri, + UNICODE_SCRIPT_Tamil, + UNICODE_SCRIPT_Tangut, + UNICODE_SCRIPT_Telugu, + UNICODE_SCRIPT_Thaana, + UNICODE_SCRIPT_Thai, + UNICODE_SCRIPT_Tibetan, + UNICODE_SCRIPT_Tifinagh, + UNICODE_SCRIPT_Tirhuta, + UNICODE_SCRIPT_Tangsa, + UNICODE_SCRIPT_Todhri, + UNICODE_SCRIPT_Tolong_Siki, + UNICODE_SCRIPT_Toto, + UNICODE_SCRIPT_Tulu_Tigalari, + UNICODE_SCRIPT_Ugaritic, + UNICODE_SCRIPT_Vai, + UNICODE_SCRIPT_Vithkuqi, + UNICODE_SCRIPT_Wancho, + UNICODE_SCRIPT_Warang_Citi, + UNICODE_SCRIPT_Yezidi, + UNICODE_SCRIPT_Yi, + UNICODE_SCRIPT_Zanabazar_Square, + UNICODE_SCRIPT_COUNT, +} UnicodeScriptEnum; + +static const char unicode_script_name_table[] = + "Adlam,Adlm" "\0" + "Ahom,Ahom" "\0" + "Anatolian_Hieroglyphs,Hluw" "\0" + "Arabic,Arab" "\0" + "Armenian,Armn" "\0" + "Avestan,Avst" "\0" + "Balinese,Bali" "\0" + "Bamum,Bamu" "\0" + "Bassa_Vah,Bass" "\0" + "Batak,Batk" "\0" + "Bengali,Beng" "\0" + "Beria_Erfe,Berf" "\0" + "Bhaiksuki,Bhks" "\0" + "Bopomofo,Bopo" "\0" + "Brahmi,Brah" "\0" + "Braille,Brai" "\0" + "Buginese,Bugi" "\0" + "Buhid,Buhd" "\0" + "Canadian_Aboriginal,Cans" "\0" + "Carian,Cari" "\0" + "Caucasian_Albanian,Aghb" "\0" + "Chakma,Cakm" "\0" + "Cham,Cham" "\0" + "Cherokee,Cher" "\0" + "Chorasmian,Chrs" "\0" + "Common,Zyyy" "\0" + "Coptic,Copt,Qaac" "\0" + "Cuneiform,Xsux" "\0" + "Cypriot,Cprt" "\0" + "Cyrillic,Cyrl" "\0" + "Cypro_Minoan,Cpmn" "\0" + "Deseret,Dsrt" "\0" + "Devanagari,Deva" "\0" + "Dives_Akuru,Diak" "\0" + "Dogra,Dogr" "\0" + "Duployan,Dupl" "\0" + "Egyptian_Hieroglyphs,Egyp" "\0" + "Elbasan,Elba" "\0" + "Elymaic,Elym" "\0" + "Ethiopic,Ethi" "\0" + "Georgian,Geor" "\0" + "Glagolitic,Glag" "\0" + "Gothic,Goth" "\0" + "Garay,Gara" "\0" + "Grantha,Gran" "\0" + "Greek,Grek" "\0" + "Gujarati,Gujr" "\0" + "Gunjala_Gondi,Gong" "\0" + "Gurmukhi,Guru" "\0" + "Gurung_Khema,Gukh" "\0" + "Han,Hani" "\0" + "Hangul,Hang" "\0" + "Hanifi_Rohingya,Rohg" "\0" + "Hanunoo,Hano" "\0" + "Hatran,Hatr" "\0" + "Hebrew,Hebr" "\0" + "Hiragana,Hira" "\0" + "Imperial_Aramaic,Armi" "\0" + "Inherited,Zinh,Qaai" "\0" + "Inscriptional_Pahlavi,Phli" "\0" + "Inscriptional_Parthian,Prti" "\0" + "Javanese,Java" "\0" + "Kaithi,Kthi" "\0" + "Kannada,Knda" "\0" + "Katakana,Kana" "\0" + "Katakana_Or_Hiragana,Hrkt" "\0" + "Kawi,Kawi" "\0" + "Kayah_Li,Kali" "\0" + "Kharoshthi,Khar" "\0" + "Khmer,Khmr" "\0" + "Khojki,Khoj" "\0" + "Khitan_Small_Script,Kits" "\0" + "Khudawadi,Sind" "\0" + "Kirat_Rai,Krai" "\0" + "Lao,Laoo" "\0" + "Latin,Latn" "\0" + "Lepcha,Lepc" "\0" + "Limbu,Limb" "\0" + "Linear_A,Lina" "\0" + "Linear_B,Linb" "\0" + "Lisu,Lisu" "\0" + "Lycian,Lyci" "\0" + "Lydian,Lydi" "\0" + "Makasar,Maka" "\0" + "Mahajani,Mahj" "\0" + "Malayalam,Mlym" "\0" + "Mandaic,Mand" "\0" + "Manichaean,Mani" "\0" + "Marchen,Marc" "\0" + "Masaram_Gondi,Gonm" "\0" + "Medefaidrin,Medf" "\0" + "Meetei_Mayek,Mtei" "\0" + "Mende_Kikakui,Mend" "\0" + "Meroitic_Cursive,Merc" "\0" + "Meroitic_Hieroglyphs,Mero" "\0" + "Miao,Plrd" "\0" + "Modi,Modi" "\0" + "Mongolian,Mong" "\0" + "Mro,Mroo" "\0" + "Multani,Mult" "\0" + "Myanmar,Mymr" "\0" + "Nabataean,Nbat" "\0" + "Nag_Mundari,Nagm" "\0" + "Nandinagari,Nand" "\0" + "New_Tai_Lue,Talu" "\0" + "Newa,Newa" "\0" + "Nko,Nkoo" "\0" + "Nushu,Nshu" "\0" + "Nyiakeng_Puachue_Hmong,Hmnp" "\0" + "Ogham,Ogam" "\0" + "Ol_Chiki,Olck" "\0" + "Ol_Onal,Onao" "\0" + "Old_Hungarian,Hung" "\0" + "Old_Italic,Ital" "\0" + "Old_North_Arabian,Narb" "\0" + "Old_Permic,Perm" "\0" + "Old_Persian,Xpeo" "\0" + "Old_Sogdian,Sogo" "\0" + "Old_South_Arabian,Sarb" "\0" + "Old_Turkic,Orkh" "\0" + "Old_Uyghur,Ougr" "\0" + "Oriya,Orya" "\0" + "Osage,Osge" "\0" + "Osmanya,Osma" "\0" + "Pahawh_Hmong,Hmng" "\0" + "Palmyrene,Palm" "\0" + "Pau_Cin_Hau,Pauc" "\0" + "Phags_Pa,Phag" "\0" + "Phoenician,Phnx" "\0" + "Psalter_Pahlavi,Phlp" "\0" + "Rejang,Rjng" "\0" + "Runic,Runr" "\0" + "Samaritan,Samr" "\0" + "Saurashtra,Saur" "\0" + "Sharada,Shrd" "\0" + "Shavian,Shaw" "\0" + "Siddham,Sidd" "\0" + "Sidetic,Sidt" "\0" + "SignWriting,Sgnw" "\0" + "Sinhala,Sinh" "\0" + "Sogdian,Sogd" "\0" + "Sora_Sompeng,Sora" "\0" + "Soyombo,Soyo" "\0" + "Sundanese,Sund" "\0" + "Sunuwar,Sunu" "\0" + "Syloti_Nagri,Sylo" "\0" + "Syriac,Syrc" "\0" + "Tagalog,Tglg" "\0" + "Tagbanwa,Tagb" "\0" + "Tai_Le,Tale" "\0" + "Tai_Tham,Lana" "\0" + "Tai_Viet,Tavt" "\0" + "Tai_Yo,Tayo" "\0" + "Takri,Takr" "\0" + "Tamil,Taml" "\0" + "Tangut,Tang" "\0" + "Telugu,Telu" "\0" + "Thaana,Thaa" "\0" + "Thai,Thai" "\0" + "Tibetan,Tibt" "\0" + "Tifinagh,Tfng" "\0" + "Tirhuta,Tirh" "\0" + "Tangsa,Tnsa" "\0" + "Todhri,Todr" "\0" + "Tolong_Siki,Tols" "\0" + "Toto,Toto" "\0" + "Tulu_Tigalari,Tutg" "\0" + "Ugaritic,Ugar" "\0" + "Vai,Vaii" "\0" + "Vithkuqi,Vith" "\0" + "Wancho,Wcho" "\0" + "Warang_Citi,Wara" "\0" + "Yezidi,Yezi" "\0" + "Yi,Yiii" "\0" + "Zanabazar_Square,Zanb" "\0" +; + +static const uint8_t unicode_script_table[2818] = { + 0xc0, 0x1a, 0x99, 0x4c, 0x85, 0x1a, 0x99, 0x4c, + 0xae, 0x1a, 0x80, 0x4c, 0x8e, 0x1a, 0x80, 0x4c, + 0x84, 0x1a, 0x96, 0x4c, 0x80, 0x1a, 0x9e, 0x4c, + 0x80, 0x1a, 0xe1, 0x60, 0x4c, 0xa6, 0x1a, 0x84, + 0x4c, 0x84, 0x1a, 0x81, 0x0e, 0x93, 0x1a, 0xe0, + 0x0f, 0x3b, 0x83, 0x2e, 0x80, 0x1a, 0x82, 0x2e, + 0x01, 0x83, 0x2e, 0x80, 0x1a, 0x80, 0x2e, 0x03, + 0x80, 0x2e, 0x80, 0x1a, 0x80, 0x2e, 0x80, 0x1a, + 0x82, 0x2e, 0x00, 0x80, 0x2e, 0x00, 0x93, 0x2e, + 0x00, 0xbe, 0x2e, 0x8d, 0x1b, 0x8f, 0x2e, 0xe0, + 0x24, 0x1e, 0x81, 0x3b, 0xe0, 0x48, 0x1e, 0x00, + 0xa5, 0x05, 0x01, 0xb1, 0x05, 0x01, 0x82, 0x05, + 0x00, 0xb6, 0x38, 0x07, 0x9a, 0x38, 0x03, 0x85, + 0x38, 0x0a, 0x84, 0x04, 0x80, 0x1a, 0x85, 0x04, + 0x80, 0x1a, 0x8d, 0x04, 0x80, 0x1a, 0x82, 0x04, + 0x80, 0x1a, 0x9f, 0x04, 0x80, 0x1a, 0x89, 0x04, + 0x8a, 0x3b, 0x99, 0x04, 0x80, 0x3b, 0xe0, 0x0b, + 0x04, 0x80, 0x1a, 0xa1, 0x04, 0x8d, 0x93, 0x00, + 0xbb, 0x93, 0x01, 0x82, 0x93, 0xaf, 0x04, 0xb1, + 0x9e, 0x0d, 0xba, 0x6b, 0x01, 0x82, 0x6b, 0xad, + 0x85, 0x01, 0x8e, 0x85, 0x00, 0x9b, 0x57, 0x01, + 0x80, 0x57, 0x00, 0x8a, 0x93, 0x04, 0xa1, 0x04, + 0x04, 0xca, 0x04, 0x80, 0x1a, 0x9c, 0x04, 0xd0, + 0x21, 0x83, 0x3b, 0x8e, 0x21, 0x81, 0x1a, 0x99, + 0x21, 0x83, 0x0b, 0x00, 0x87, 0x0b, 0x01, 0x81, + 0x0b, 0x01, 0x95, 0x0b, 0x00, 0x86, 0x0b, 0x00, + 0x80, 0x0b, 0x02, 0x83, 0x0b, 0x01, 0x88, 0x0b, + 0x01, 0x81, 0x0b, 0x01, 0x83, 0x0b, 0x07, 0x80, + 0x0b, 0x03, 0x81, 0x0b, 0x00, 0x84, 0x0b, 0x01, + 0x98, 0x0b, 0x01, 0x82, 0x31, 0x00, 0x85, 0x31, + 0x03, 0x81, 0x31, 0x01, 0x95, 0x31, 0x00, 0x86, + 0x31, 0x00, 0x81, 0x31, 0x00, 0x81, 0x31, 0x00, + 0x81, 0x31, 0x01, 0x80, 0x31, 0x00, 0x84, 0x31, + 0x03, 0x81, 0x31, 0x01, 0x82, 0x31, 0x02, 0x80, + 0x31, 0x06, 0x83, 0x31, 0x00, 0x80, 0x31, 0x06, + 0x90, 0x31, 0x09, 0x82, 0x2f, 0x00, 0x88, 0x2f, + 0x00, 0x82, 0x2f, 0x00, 0x95, 0x2f, 0x00, 0x86, + 0x2f, 0x00, 0x81, 0x2f, 0x00, 0x84, 0x2f, 0x01, + 0x89, 0x2f, 0x00, 0x82, 0x2f, 0x00, 0x82, 0x2f, + 0x01, 0x80, 0x2f, 0x0e, 0x83, 0x2f, 0x01, 0x8b, + 0x2f, 0x06, 0x86, 0x2f, 0x00, 0x82, 0x7a, 0x00, + 0x87, 0x7a, 0x01, 0x81, 0x7a, 0x01, 0x95, 0x7a, + 0x00, 0x86, 0x7a, 0x00, 0x81, 0x7a, 0x00, 0x84, + 0x7a, 0x01, 0x88, 0x7a, 0x01, 0x81, 0x7a, 0x01, + 0x82, 0x7a, 0x06, 0x82, 0x7a, 0x03, 0x81, 0x7a, + 0x00, 0x84, 0x7a, 0x01, 0x91, 0x7a, 0x09, 0x81, + 0x9b, 0x00, 0x85, 0x9b, 0x02, 0x82, 0x9b, 0x00, + 0x83, 0x9b, 0x02, 0x81, 0x9b, 0x00, 0x80, 0x9b, + 0x00, 0x81, 0x9b, 0x02, 0x81, 0x9b, 0x02, 0x82, + 0x9b, 0x02, 0x8b, 0x9b, 0x03, 0x84, 0x9b, 0x02, + 0x82, 0x9b, 0x00, 0x83, 0x9b, 0x01, 0x80, 0x9b, + 0x05, 0x80, 0x9b, 0x0d, 0x94, 0x9b, 0x04, 0x8c, + 0x9d, 0x00, 0x82, 0x9d, 0x00, 0x96, 0x9d, 0x00, + 0x8f, 0x9d, 0x01, 0x88, 0x9d, 0x00, 0x82, 0x9d, + 0x00, 0x83, 0x9d, 0x06, 0x81, 0x9d, 0x00, 0x82, + 0x9d, 0x00, 0x81, 0x9d, 0x01, 0x83, 0x9d, 0x01, + 0x89, 0x9d, 0x06, 0x88, 0x9d, 0x8c, 0x40, 0x00, + 0x82, 0x40, 0x00, 0x96, 0x40, 0x00, 0x89, 0x40, + 0x00, 0x84, 0x40, 0x01, 0x88, 0x40, 0x00, 0x82, + 0x40, 0x00, 0x83, 0x40, 0x06, 0x81, 0x40, 0x04, + 0x82, 0x40, 0x00, 0x83, 0x40, 0x01, 0x89, 0x40, + 0x00, 0x82, 0x40, 0x0b, 0x8c, 0x56, 0x00, 0x82, + 0x56, 0x00, 0xb2, 0x56, 0x00, 0x82, 0x56, 0x00, + 0x85, 0x56, 0x03, 0x8f, 0x56, 0x01, 0x99, 0x56, + 0x00, 0x82, 0x8c, 0x00, 0x91, 0x8c, 0x02, 0x97, + 0x8c, 0x00, 0x88, 0x8c, 0x00, 0x80, 0x8c, 0x01, + 0x86, 0x8c, 0x02, 0x80, 0x8c, 0x03, 0x85, 0x8c, + 0x00, 0x80, 0x8c, 0x00, 0x87, 0x8c, 0x05, 0x89, + 0x8c, 0x01, 0x82, 0x8c, 0x0b, 0xb9, 0x9f, 0x03, + 0x80, 0x1a, 0x9b, 0x9f, 0x24, 0x81, 0x4b, 0x00, + 0x80, 0x4b, 0x00, 0x84, 0x4b, 0x00, 0x97, 0x4b, + 0x00, 0x80, 0x4b, 0x00, 0x96, 0x4b, 0x01, 0x84, + 0x4b, 0x00, 0x80, 0x4b, 0x00, 0x86, 0x4b, 0x00, + 0x89, 0x4b, 0x01, 0x83, 0x4b, 0x1f, 0xc7, 0xa0, + 0x00, 0xa3, 0xa0, 0x03, 0xa6, 0xa0, 0x00, 0xa3, + 0xa0, 0x00, 0x8e, 0xa0, 0x00, 0x86, 0xa0, 0x83, + 0x1a, 0x81, 0xa0, 0x24, 0xe0, 0x3f, 0x65, 0xa5, + 0x29, 0x00, 0x80, 0x29, 0x04, 0x80, 0x29, 0x01, + 0xaa, 0x29, 0x80, 0x1a, 0x83, 0x29, 0xe0, 0x9f, + 0x34, 0xc8, 0x28, 0x00, 0x83, 0x28, 0x01, 0x86, + 0x28, 0x00, 0x80, 0x28, 0x00, 0x83, 0x28, 0x01, + 0xa8, 0x28, 0x00, 0x83, 0x28, 0x01, 0xa0, 0x28, + 0x00, 0x83, 0x28, 0x01, 0x86, 0x28, 0x00, 0x80, + 0x28, 0x00, 0x83, 0x28, 0x01, 0x8e, 0x28, 0x00, + 0xb8, 0x28, 0x00, 0x83, 0x28, 0x01, 0xc2, 0x28, + 0x01, 0x9f, 0x28, 0x02, 0x99, 0x28, 0x05, 0xd5, + 0x18, 0x01, 0x85, 0x18, 0x01, 0xe2, 0x1f, 0x13, + 0x9c, 0x6e, 0x02, 0xca, 0x84, 0x82, 0x1a, 0x8a, + 0x84, 0x06, 0x95, 0x94, 0x08, 0x80, 0x94, 0x94, + 0x36, 0x81, 0x1a, 0x08, 0x93, 0x12, 0x0b, 0x8c, + 0x95, 0x00, 0x82, 0x95, 0x00, 0x81, 0x95, 0x0b, + 0xdd, 0x46, 0x01, 0x89, 0x46, 0x05, 0x89, 0x46, + 0x05, 0x81, 0x62, 0x81, 0x1a, 0x80, 0x62, 0x80, + 0x1a, 0x93, 0x62, 0x05, 0xd8, 0x62, 0x06, 0xaa, + 0x62, 0x04, 0xc5, 0x13, 0x09, 0x9e, 0x4e, 0x00, + 0x8b, 0x4e, 0x03, 0x8b, 0x4e, 0x03, 0x80, 0x4e, + 0x02, 0x8b, 0x4e, 0x9d, 0x96, 0x01, 0x84, 0x96, + 0x0a, 0xab, 0x69, 0x03, 0x99, 0x69, 0x05, 0x8a, + 0x69, 0x02, 0x81, 0x69, 0x9f, 0x46, 0x9b, 0x11, + 0x01, 0x81, 0x11, 0xbe, 0x97, 0x00, 0x9c, 0x97, + 0x01, 0x8a, 0x97, 0x05, 0x89, 0x97, 0x05, 0x8d, + 0x97, 0x01, 0xad, 0x3b, 0x01, 0x8b, 0x3b, 0x13, + 0xcc, 0x07, 0x00, 0xb1, 0x07, 0xbf, 0x90, 0xb3, + 0x0a, 0x07, 0x83, 0x0a, 0xb7, 0x4d, 0x02, 0x8e, + 0x4d, 0x02, 0x82, 0x4d, 0xaf, 0x6f, 0x8a, 0x1e, + 0x04, 0xaa, 0x29, 0x01, 0x82, 0x29, 0x87, 0x90, + 0x07, 0x82, 0x3b, 0x80, 0x1a, 0x8c, 0x3b, 0x80, + 0x1a, 0x86, 0x3b, 0x83, 0x1a, 0x80, 0x3b, 0x85, + 0x1a, 0x80, 0x3b, 0x82, 0x1a, 0x81, 0x3b, 0x80, + 0x1a, 0x04, 0xa5, 0x4c, 0x84, 0x2e, 0x80, 0x1e, + 0xb0, 0x4c, 0x84, 0x2e, 0x83, 0x4c, 0x84, 0x2e, + 0x8c, 0x4c, 0x80, 0x1e, 0xc5, 0x4c, 0x80, 0x2e, + 0xbf, 0x3b, 0xe0, 0x9f, 0x4c, 0x95, 0x2e, 0x01, + 0x85, 0x2e, 0x01, 0xa5, 0x2e, 0x01, 0x85, 0x2e, + 0x01, 0x87, 0x2e, 0x00, 0x80, 0x2e, 0x00, 0x80, + 0x2e, 0x00, 0x80, 0x2e, 0x00, 0x9e, 0x2e, 0x01, + 0xb4, 0x2e, 0x00, 0x8e, 0x2e, 0x00, 0x8d, 0x2e, + 0x01, 0x85, 0x2e, 0x00, 0x92, 0x2e, 0x01, 0x82, + 0x2e, 0x00, 0x88, 0x2e, 0x00, 0x8b, 0x1a, 0x81, + 0x3b, 0xd6, 0x1a, 0x00, 0x8a, 0x1a, 0x80, 0x4c, + 0x01, 0x8a, 0x1a, 0x80, 0x4c, 0x8e, 0x1a, 0x00, + 0x8c, 0x4c, 0x02, 0xa1, 0x1a, 0x0d, 0xa0, 0x3b, + 0x0e, 0xa5, 0x1a, 0x80, 0x2e, 0x82, 0x1a, 0x81, + 0x4c, 0x85, 0x1a, 0x80, 0x4c, 0x9a, 0x1a, 0x80, + 0x4c, 0x90, 0x1a, 0xa8, 0x4c, 0x82, 0x1a, 0x03, + 0xe2, 0x39, 0x1a, 0x15, 0x8a, 0x1a, 0x14, 0xe3, + 0x3f, 0x1a, 0xe0, 0x9f, 0x10, 0xe2, 0x13, 0x1a, + 0x01, 0xe0, 0x29, 0x1a, 0xdf, 0x2a, 0x9f, 0x4c, + 0xe0, 0x13, 0x1b, 0x04, 0x86, 0x1b, 0xa5, 0x29, + 0x00, 0x80, 0x29, 0x04, 0x80, 0x29, 0x01, 0xb7, + 0xa1, 0x06, 0x81, 0xa1, 0x0d, 0x80, 0xa1, 0x96, + 0x28, 0x08, 0x86, 0x28, 0x00, 0x86, 0x28, 0x00, + 0x86, 0x28, 0x00, 0x86, 0x28, 0x00, 0x86, 0x28, + 0x00, 0x86, 0x28, 0x00, 0x86, 0x28, 0x00, 0x86, + 0x28, 0x00, 0x9f, 0x1e, 0xdd, 0x1a, 0x21, 0x99, + 0x33, 0x00, 0xd8, 0x33, 0x0b, 0xe0, 0x75, 0x33, + 0x19, 0x94, 0x1a, 0x80, 0x33, 0x80, 0x1a, 0x80, + 0x33, 0x98, 0x1a, 0x88, 0x33, 0x83, 0x3b, 0x81, + 0x34, 0x87, 0x1a, 0x83, 0x33, 0x83, 0x1a, 0x00, + 0xd5, 0x39, 0x01, 0x81, 0x3b, 0x81, 0x1a, 0x82, + 0x39, 0x80, 0x1a, 0xd9, 0x41, 0x81, 0x1a, 0x82, + 0x41, 0x04, 0xaa, 0x0e, 0x00, 0xdd, 0x34, 0x00, + 0x8f, 0x1a, 0x9f, 0x0e, 0xa5, 0x1a, 0x08, 0x80, + 0x1a, 0x8f, 0x41, 0x9e, 0x34, 0x00, 0xbf, 0x1a, + 0x9e, 0x34, 0xd0, 0x1a, 0xae, 0x41, 0x80, 0x1a, + 0xd7, 0x41, 0xe0, 0x47, 0x1a, 0xf0, 0x09, 0x5f, + 0x33, 0xbf, 0x1a, 0xf0, 0x41, 0x9f, 0x33, 0xe4, + 0x2c, 0xae, 0x02, 0xb6, 0xae, 0x08, 0xaf, 0x51, + 0xe0, 0xcb, 0xa9, 0x13, 0xdf, 0x1e, 0xd7, 0x08, + 0x07, 0xa1, 0x1a, 0xe0, 0x05, 0x4c, 0x82, 0x1a, + 0xd1, 0x4c, 0x13, 0x8e, 0x4c, 0xac, 0x92, 0x02, + 0x89, 0x1a, 0x05, 0xb7, 0x80, 0x07, 0xc5, 0x86, + 0x07, 0x8b, 0x86, 0x05, 0x9f, 0x21, 0xad, 0x44, + 0x80, 0x1a, 0x80, 0x44, 0xa3, 0x83, 0x0a, 0x80, + 0x83, 0x9c, 0x34, 0x02, 0xcd, 0x3e, 0x00, 0x80, + 0x1a, 0x89, 0x3e, 0x03, 0x81, 0x3e, 0x9e, 0x65, + 0x00, 0xb6, 0x17, 0x08, 0x8d, 0x17, 0x01, 0x89, + 0x17, 0x01, 0x83, 0x17, 0x9f, 0x65, 0xc2, 0x98, + 0x17, 0x84, 0x98, 0x96, 0x5c, 0x09, 0x85, 0x28, + 0x01, 0x85, 0x28, 0x01, 0x85, 0x28, 0x08, 0x86, + 0x28, 0x00, 0x86, 0x28, 0x00, 0xaa, 0x4c, 0x80, + 0x1a, 0x88, 0x4c, 0x80, 0x2e, 0x83, 0x4c, 0x81, + 0x1a, 0x03, 0xcf, 0x18, 0xad, 0x5c, 0x01, 0x89, + 0x5c, 0x05, 0xf0, 0x1b, 0x43, 0x34, 0x0b, 0x96, + 0x34, 0x03, 0xb0, 0x34, 0x70, 0x10, 0xa3, 0xe1, + 0x0d, 0x33, 0x01, 0xe0, 0x09, 0x33, 0x25, 0x86, + 0x4c, 0x0b, 0x84, 0x05, 0x04, 0x99, 0x38, 0x00, + 0x84, 0x38, 0x00, 0x80, 0x38, 0x00, 0x81, 0x38, + 0x00, 0x81, 0x38, 0x00, 0x89, 0x38, 0xe1, 0x8d, + 0x04, 0x81, 0x1a, 0xe0, 0x2f, 0x04, 0x1f, 0x8f, + 0x04, 0x8f, 0x3b, 0x89, 0x1a, 0x05, 0x8d, 0x3b, + 0x81, 0x1e, 0xa2, 0x1a, 0x00, 0x92, 0x1a, 0x00, + 0x83, 0x1a, 0x03, 0x84, 0x04, 0x00, 0xe0, 0x26, + 0x04, 0x01, 0x80, 0x1a, 0x00, 0x9f, 0x1a, 0x99, + 0x4c, 0x85, 0x1a, 0x99, 0x4c, 0x8a, 0x1a, 0x89, + 0x41, 0x80, 0x1a, 0xac, 0x41, 0x81, 0x1a, 0x9e, + 0x34, 0x02, 0x85, 0x34, 0x01, 0x85, 0x34, 0x01, + 0x85, 0x34, 0x01, 0x82, 0x34, 0x02, 0x86, 0x1a, + 0x00, 0x86, 0x1a, 0x09, 0x84, 0x1a, 0x01, 0x8b, + 0x50, 0x00, 0x99, 0x50, 0x00, 0x92, 0x50, 0x00, + 0x81, 0x50, 0x00, 0x8e, 0x50, 0x01, 0x8d, 0x50, + 0x21, 0xe0, 0x1a, 0x50, 0x04, 0x82, 0x1a, 0x03, + 0xac, 0x1a, 0x02, 0x88, 0x1a, 0xce, 0x2e, 0x00, + 0x8c, 0x1a, 0x02, 0x80, 0x2e, 0x2e, 0xac, 0x1a, + 0x80, 0x3b, 0x60, 0x21, 0x9c, 0x52, 0x02, 0xb0, + 0x14, 0x0e, 0x80, 0x3b, 0x9a, 0x1a, 0x03, 0xa3, + 0x72, 0x08, 0x82, 0x72, 0x9a, 0x2b, 0x04, 0xaa, + 0x74, 0x04, 0x9d, 0xa8, 0x00, 0x80, 0xa8, 0xa3, + 0x75, 0x03, 0x8d, 0x75, 0x29, 0xcf, 0x20, 0xaf, + 0x88, 0x9d, 0x7c, 0x01, 0x89, 0x7c, 0x05, 0xa3, + 0x7b, 0x03, 0xa3, 0x7b, 0x03, 0xa7, 0x26, 0x07, + 0xb3, 0x15, 0x0a, 0x80, 0x15, 0x8a, 0xaa, 0x00, + 0x8e, 0xaa, 0x00, 0x86, 0xaa, 0x00, 0x81, 0xaa, + 0x00, 0x8a, 0xaa, 0x00, 0x8e, 0xaa, 0x00, 0x86, + 0xaa, 0x00, 0x81, 0xaa, 0x02, 0xb3, 0xa4, 0x0b, + 0xe0, 0xd6, 0x4f, 0x08, 0x95, 0x4f, 0x09, 0x87, + 0x4f, 0x17, 0x85, 0x4c, 0x00, 0xa9, 0x4c, 0x00, + 0x88, 0x4c, 0x44, 0x85, 0x1d, 0x01, 0x80, 0x1d, + 0x00, 0xab, 0x1d, 0x00, 0x81, 0x1d, 0x02, 0x80, + 0x1d, 0x01, 0x80, 0x1d, 0x95, 0x3a, 0x00, 0x88, + 0x3a, 0x9f, 0x7e, 0x9e, 0x66, 0x07, 0x88, 0x66, + 0x2f, 0x92, 0x37, 0x00, 0x81, 0x37, 0x04, 0x84, + 0x37, 0x9b, 0x81, 0x02, 0x80, 0x81, 0x99, 0x53, + 0x04, 0x80, 0x53, 0x99, 0x8a, 0x25, 0x9f, 0x5f, + 0x97, 0x5e, 0x03, 0x93, 0x5e, 0x01, 0xad, 0x5e, + 0x83, 0x45, 0x00, 0x81, 0x45, 0x04, 0x87, 0x45, + 0x00, 0x82, 0x45, 0x00, 0x9c, 0x45, 0x01, 0x82, + 0x45, 0x03, 0x89, 0x45, 0x06, 0x88, 0x45, 0x06, + 0x9f, 0x77, 0x9f, 0x73, 0x1f, 0xa6, 0x58, 0x03, + 0x8b, 0x58, 0x08, 0xb5, 0x06, 0x02, 0x86, 0x06, + 0x95, 0x3d, 0x01, 0x87, 0x3d, 0x92, 0x3c, 0x04, + 0x87, 0x3c, 0x91, 0x82, 0x06, 0x83, 0x82, 0x0b, + 0x86, 0x82, 0x4f, 0xc8, 0x78, 0x36, 0xb2, 0x71, + 0x0c, 0xb2, 0x71, 0x06, 0x85, 0x71, 0xa7, 0x35, + 0x07, 0x89, 0x35, 0x05, 0xa5, 0x2c, 0x02, 0x9c, + 0x2c, 0x07, 0x81, 0x2c, 0x60, 0x6f, 0x9e, 0x04, + 0x00, 0xa9, 0xad, 0x00, 0x82, 0xad, 0x01, 0x81, + 0xad, 0x0f, 0x85, 0x04, 0x07, 0x88, 0x04, 0x20, + 0x85, 0x04, 0xa7, 0x76, 0x07, 0xa9, 0x8d, 0x15, + 0x99, 0x79, 0x25, 0x9b, 0x19, 0x13, 0x96, 0x27, + 0x08, 0xcd, 0x0f, 0x03, 0xa3, 0x0f, 0x08, 0x80, + 0x0f, 0xc2, 0x3f, 0x09, 0x80, 0x3f, 0x01, 0x98, + 0x8e, 0x06, 0x89, 0x8e, 0x05, 0xb4, 0x16, 0x00, + 0x91, 0x16, 0x07, 0xa6, 0x55, 0x08, 0xdf, 0x87, + 0x00, 0x93, 0x8c, 0x0a, 0x91, 0x47, 0x00, 0xae, + 0x47, 0x3d, 0x86, 0x64, 0x00, 0x80, 0x64, 0x00, + 0x83, 0x64, 0x00, 0x8e, 0x64, 0x00, 0x8a, 0x64, + 0x05, 0xba, 0x49, 0x04, 0x89, 0x49, 0x05, 0x83, + 0x2d, 0x00, 0x87, 0x2d, 0x01, 0x81, 0x2d, 0x01, + 0x95, 0x2d, 0x00, 0x86, 0x2d, 0x00, 0x81, 0x2d, + 0x00, 0x84, 0x2d, 0x00, 0x80, 0x3b, 0x88, 0x2d, + 0x01, 0x81, 0x2d, 0x01, 0x82, 0x2d, 0x01, 0x80, + 0x2d, 0x05, 0x80, 0x2d, 0x04, 0x86, 0x2d, 0x01, + 0x86, 0x2d, 0x02, 0x84, 0x2d, 0x0a, 0x89, 0xa7, + 0x00, 0x80, 0xa7, 0x01, 0x80, 0xa7, 0x00, 0xa5, + 0xa7, 0x00, 0x89, 0xa7, 0x00, 0x80, 0xa7, 0x01, + 0x80, 0xa7, 0x00, 0x83, 0xa7, 0x00, 0x89, 0xa7, + 0x00, 0x81, 0xa7, 0x07, 0x81, 0xa7, 0x1c, 0xdb, + 0x6a, 0x00, 0x84, 0x6a, 0x1d, 0xc7, 0xa2, 0x07, + 0x89, 0xa2, 0x60, 0x45, 0xb5, 0x89, 0x01, 0xa5, + 0x89, 0x21, 0xc4, 0x61, 0x0a, 0x89, 0x61, 0x05, + 0x8c, 0x62, 0x12, 0xb9, 0x9a, 0x05, 0x89, 0x9a, + 0x05, 0x93, 0x65, 0x1b, 0x9a, 0x02, 0x01, 0x8e, + 0x02, 0x03, 0x96, 0x02, 0x60, 0x58, 0xbb, 0x23, + 0x60, 0x03, 0xd2, 0xac, 0x0b, 0x80, 0xac, 0x86, + 0x22, 0x01, 0x80, 0x22, 0x01, 0x87, 0x22, 0x00, + 0x81, 0x22, 0x00, 0x9d, 0x22, 0x00, 0x81, 0x22, + 0x01, 0x8b, 0x22, 0x08, 0x89, 0x22, 0x45, 0x87, + 0x68, 0x01, 0xad, 0x68, 0x01, 0x8a, 0x68, 0x1a, + 0xc7, 0xaf, 0x07, 0xd2, 0x8f, 0x0c, 0x8f, 0x13, + 0xb8, 0x7f, 0x06, 0x89, 0x21, 0x55, 0x87, 0x87, + 0x57, 0xa1, 0x91, 0x0d, 0x89, 0x91, 0x05, 0x88, + 0x0d, 0x00, 0xac, 0x0d, 0x00, 0x8d, 0x0d, 0x09, + 0x9c, 0x0d, 0x02, 0x9f, 0x59, 0x01, 0x95, 0x59, + 0x00, 0x8d, 0x59, 0x48, 0x86, 0x5a, 0x00, 0x81, + 0x5a, 0x00, 0xab, 0x5a, 0x02, 0x80, 0x5a, 0x00, + 0x81, 0x5a, 0x00, 0x88, 0x5a, 0x07, 0x89, 0x5a, + 0x05, 0x85, 0x30, 0x00, 0x81, 0x30, 0x00, 0xa4, + 0x30, 0x00, 0x81, 0x30, 0x00, 0x85, 0x30, 0x06, + 0x89, 0x30, 0x05, 0xab, 0xa5, 0x03, 0x89, 0xa5, + 0x60, 0x95, 0x98, 0x54, 0x06, 0x90, 0x43, 0x00, + 0xa8, 0x43, 0x02, 0x9c, 0x43, 0x54, 0x80, 0x51, + 0x0e, 0xb1, 0x9b, 0x0c, 0x80, 0x9b, 0xe3, 0x39, + 0x1c, 0x60, 0x05, 0xe0, 0x0e, 0x1c, 0x00, 0x84, + 0x1c, 0x0a, 0xe0, 0x63, 0x1c, 0x69, 0xeb, 0xe0, + 0x02, 0x1f, 0x0c, 0xe3, 0xf5, 0x25, 0x09, 0xef, + 0x3a, 0x25, 0x04, 0xe1, 0xe6, 0x03, 0x70, 0x0a, + 0x58, 0xb9, 0x32, 0x66, 0x65, 0xe1, 0xd8, 0x08, + 0x06, 0x9e, 0x63, 0x00, 0x89, 0x63, 0x03, 0x81, + 0x63, 0xce, 0xa3, 0x00, 0x89, 0xa3, 0x05, 0x9d, + 0x09, 0x01, 0x85, 0x09, 0x09, 0xc5, 0x7d, 0x09, + 0x89, 0x7d, 0x00, 0x86, 0x7d, 0x00, 0x94, 0x7d, + 0x04, 0x92, 0x7d, 0x61, 0x4f, 0xb9, 0x4a, 0x60, + 0x65, 0xda, 0x5b, 0x04, 0x98, 0x0c, 0x01, 0x98, + 0x0c, 0x2b, 0xca, 0x60, 0x03, 0xb8, 0x60, 0x06, + 0x90, 0x60, 0x3f, 0x80, 0x9c, 0x80, 0x6c, 0x81, + 0x33, 0x80, 0x48, 0x0a, 0x86, 0x33, 0x08, 0xf0, + 0x0a, 0x9f, 0x9c, 0xe1, 0x75, 0x48, 0x28, 0x80, + 0x48, 0x9e, 0x9c, 0x60, 0x00, 0xe0, 0x12, 0x9c, + 0x70, 0x11, 0x9c, 0x83, 0x41, 0x00, 0x86, 0x41, + 0x00, 0x81, 0x41, 0x00, 0x80, 0x41, 0xe0, 0xbe, + 0x39, 0x82, 0x41, 0x0e, 0x80, 0x39, 0x1c, 0x82, + 0x39, 0x01, 0x80, 0x41, 0x0d, 0x83, 0x41, 0x07, + 0xe1, 0x2b, 0x6c, 0x68, 0xa3, 0xe0, 0x0a, 0x24, + 0x04, 0x8c, 0x24, 0x02, 0x88, 0x24, 0x06, 0x89, + 0x24, 0x01, 0x83, 0x24, 0x83, 0x1a, 0x6e, 0xfb, + 0xe0, 0x9c, 0x1a, 0x02, 0xe1, 0x53, 0x1a, 0x05, + 0x96, 0x1a, 0x0e, 0x90, 0x1a, 0x0e, 0xad, 0x3b, + 0x01, 0x96, 0x3b, 0x08, 0xe0, 0x13, 0x1a, 0x3b, + 0xe0, 0x95, 0x1a, 0x09, 0xa6, 0x1a, 0x01, 0xbd, + 0x1a, 0x82, 0x3b, 0x90, 0x1a, 0x87, 0x3b, 0x81, + 0x1a, 0x86, 0x3b, 0x9d, 0x1a, 0x83, 0x3b, 0xbc, + 0x1a, 0x14, 0xc5, 0x2e, 0x60, 0x19, 0x93, 0x1a, + 0x0b, 0x93, 0x1a, 0x0b, 0xd6, 0x1a, 0x08, 0x98, + 0x1a, 0x60, 0x26, 0xd4, 0x1a, 0x00, 0xc6, 0x1a, + 0x00, 0x81, 0x1a, 0x01, 0x80, 0x1a, 0x01, 0x81, + 0x1a, 0x01, 0x83, 0x1a, 0x00, 0x8b, 0x1a, 0x00, + 0x80, 0x1a, 0x00, 0x86, 0x1a, 0x00, 0xc0, 0x1a, + 0x00, 0x83, 0x1a, 0x01, 0x87, 0x1a, 0x00, 0x86, + 0x1a, 0x00, 0x9b, 0x1a, 0x00, 0x83, 0x1a, 0x00, + 0x84, 0x1a, 0x00, 0x80, 0x1a, 0x02, 0x86, 0x1a, + 0x00, 0xe0, 0xf3, 0x1a, 0x01, 0xe0, 0xc3, 0x1a, + 0x01, 0xb1, 0x1a, 0xe2, 0x2b, 0x8b, 0x0e, 0x84, + 0x8b, 0x00, 0x8e, 0x8b, 0x63, 0xef, 0x9e, 0x4c, + 0x05, 0x85, 0x4c, 0x60, 0x74, 0x86, 0x2a, 0x00, + 0x90, 0x2a, 0x01, 0x86, 0x2a, 0x00, 0x81, 0x2a, + 0x00, 0x84, 0x2a, 0x04, 0xbd, 0x1e, 0x20, 0x80, + 0x1e, 0x60, 0x0f, 0xac, 0x6d, 0x02, 0x8d, 0x6d, + 0x01, 0x89, 0x6d, 0x03, 0x81, 0x6d, 0x60, 0xdf, + 0x9e, 0xa6, 0x10, 0xb9, 0xab, 0x04, 0x80, 0xab, + 0x61, 0x6f, 0xa9, 0x67, 0x60, 0x75, 0xaa, 0x70, + 0x03, 0x80, 0x70, 0x60, 0x5f, 0x9e, 0x99, 0x00, + 0x95, 0x99, 0x07, 0x81, 0x99, 0x60, 0x7f, 0x86, + 0x28, 0x00, 0x83, 0x28, 0x00, 0x81, 0x28, 0x00, + 0x8e, 0x28, 0x00, 0xe0, 0x64, 0x5d, 0x01, 0x8f, + 0x5d, 0x28, 0xcb, 0x01, 0x03, 0x89, 0x01, 0x03, + 0x81, 0x01, 0x62, 0xb0, 0xc3, 0x1a, 0x4b, 0xbc, + 0x1a, 0x60, 0x61, 0x83, 0x04, 0x00, 0x9a, 0x04, + 0x00, 0x81, 0x04, 0x00, 0x80, 0x04, 0x01, 0x80, + 0x04, 0x00, 0x89, 0x04, 0x00, 0x83, 0x04, 0x00, + 0x80, 0x04, 0x00, 0x80, 0x04, 0x05, 0x80, 0x04, + 0x03, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, + 0x04, 0x00, 0x82, 0x04, 0x00, 0x81, 0x04, 0x00, + 0x80, 0x04, 0x01, 0x80, 0x04, 0x00, 0x80, 0x04, + 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, + 0x04, 0x00, 0x81, 0x04, 0x00, 0x80, 0x04, 0x01, + 0x83, 0x04, 0x00, 0x86, 0x04, 0x00, 0x83, 0x04, + 0x00, 0x83, 0x04, 0x00, 0x80, 0x04, 0x00, 0x89, + 0x04, 0x00, 0x90, 0x04, 0x04, 0x82, 0x04, 0x00, + 0x84, 0x04, 0x00, 0x90, 0x04, 0x33, 0x81, 0x04, + 0x60, 0xad, 0xab, 0x1a, 0x03, 0xe0, 0x03, 0x1a, + 0x0b, 0x8e, 0x1a, 0x01, 0x8e, 0x1a, 0x00, 0x8e, + 0x1a, 0x00, 0xa4, 0x1a, 0x09, 0xe0, 0x4d, 0x1a, + 0x37, 0x99, 0x1a, 0x80, 0x39, 0x81, 0x1a, 0x0c, + 0xab, 0x1a, 0x03, 0x88, 0x1a, 0x06, 0x81, 0x1a, + 0x0d, 0x85, 0x1a, 0x60, 0x39, 0xe3, 0x78, 0x1a, + 0x02, 0x90, 0x1a, 0x02, 0x8c, 0x1a, 0x02, 0xe0, + 0x79, 0x1a, 0x05, 0x8b, 0x1a, 0x03, 0x80, 0x1a, + 0x0e, 0x8b, 0x1a, 0x03, 0xb7, 0x1a, 0x07, 0x89, + 0x1a, 0x05, 0xa7, 0x1a, 0x07, 0x9d, 0x1a, 0x01, + 0x8b, 0x1a, 0x03, 0x81, 0x1a, 0x0d, 0x88, 0x1a, + 0x26, 0xe0, 0xf7, 0x1a, 0x07, 0x8d, 0x1a, 0x01, + 0x8c, 0x1a, 0x02, 0x8a, 0x1a, 0x02, 0xb8, 0x1a, + 0x00, 0x80, 0x1a, 0x03, 0x8f, 0x1a, 0x01, 0x8b, + 0x1a, 0x03, 0x89, 0x1a, 0x06, 0xe0, 0x32, 0x1a, + 0x00, 0xe0, 0x06, 0x1a, 0x63, 0xa4, 0xf0, 0x96, + 0x7f, 0x33, 0x1f, 0xf0, 0x00, 0xbd, 0x33, 0x01, + 0xf0, 0x06, 0x2d, 0x33, 0x01, 0xf0, 0x0c, 0xd0, + 0x33, 0x0e, 0xe2, 0x0d, 0x33, 0x69, 0x41, 0xe1, + 0xbd, 0x33, 0x65, 0x81, 0xf0, 0x02, 0xea, 0x33, + 0x04, 0xf0, 0x10, 0xc9, 0x33, 0x7a, 0xbb, 0x26, + 0x80, 0x1a, 0x1d, 0xdf, 0x1a, 0x60, 0x1f, 0xe0, + 0x8f, 0x3b, +}; + +static const uint8_t unicode_script_ext_table[1278] = { + 0x80, 0x36, 0x00, 0x00, 0x10, 0x06, 0x14, 0x1b, + 0x24, 0x26, 0x29, 0x2a, 0x30, 0x2b, 0x2e, 0x33, + 0x4c, 0x53, 0x55, 0x74, 0x88, 0x81, 0x83, 0x00, + 0x00, 0x07, 0x0b, 0x1e, 0x21, 0x4c, 0x51, 0x9f, + 0xa6, 0x09, 0x00, 0x00, 0x02, 0x0e, 0x4c, 0x00, + 0x00, 0x02, 0x02, 0x0e, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x4c, 0x51, 0x08, 0x00, 0x00, 0x02, 0x4c, + 0x9f, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x4c, 0x25, + 0x00, 0x00, 0x08, 0x18, 0x1b, 0x1e, 0x2e, 0x4c, + 0x74, 0x91, 0x96, 0x00, 0x08, 0x18, 0x1e, 0x2e, + 0x4c, 0x7b, 0x91, 0x96, 0xa4, 0x00, 0x04, 0x18, + 0x1e, 0x4c, 0xa1, 0x00, 0x05, 0x2a, 0x4c, 0x91, + 0x93, 0x9f, 0x00, 0x0b, 0x15, 0x18, 0x1b, 0x1e, + 0x2b, 0x2e, 0x4c, 0x7b, 0x93, 0xa1, 0xa4, 0x00, + 0x06, 0x1b, 0x26, 0x2a, 0x2b, 0x41, 0x4c, 0x00, + 0x05, 0x1e, 0x2e, 0x4c, 0x74, 0xa1, 0x00, 0x09, + 0x1b, 0x24, 0x38, 0x4c, 0x74, 0x93, 0x96, 0xa1, + 0xa4, 0x00, 0x0b, 0x05, 0x1e, 0x24, 0x2b, 0x2e, + 0x38, 0x4c, 0x74, 0x93, 0x96, 0xa1, 0x00, 0x02, + 0x4c, 0xa1, 0x00, 0x03, 0x24, 0x4c, 0x93, 0x00, + 0x04, 0x18, 0x1e, 0x4c, 0x7b, 0x00, 0x03, 0x18, + 0x4c, 0x96, 0x00, 0x02, 0x4c, 0x91, 0x00, 0x02, + 0x28, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x4c, 0x91, + 0x00, 0x03, 0x1e, 0x4c, 0xa4, 0x00, 0x00, 0x00, + 0x04, 0x2e, 0x4c, 0x74, 0xa4, 0x0e, 0x00, 0x00, + 0x06, 0x18, 0x24, 0x41, 0x4c, 0x93, 0xa1, 0x00, + 0x04, 0x18, 0x24, 0x4c, 0x93, 0x00, 0x02, 0x4c, + 0x93, 0x06, 0x00, 0x00, 0x03, 0x4c, 0x91, 0x93, + 0x00, 0x02, 0x4c, 0x93, 0x00, 0x00, 0x00, 0x03, + 0x18, 0x4c, 0x93, 0x00, 0x07, 0x15, 0x18, 0x2b, + 0x4c, 0x91, 0x93, 0x9f, 0x0f, 0x00, 0x00, 0x01, + 0x2e, 0x01, 0x00, 0x00, 0x01, 0x2e, 0x11, 0x00, + 0x00, 0x02, 0x4c, 0x7b, 0x04, 0x00, 0x00, 0x03, + 0x15, 0x4c, 0xa4, 0x03, 0x00, 0x0c, 0x01, 0x4c, + 0x03, 0x00, 0x01, 0x02, 0x1b, 0x2e, 0x80, 0x8c, + 0x00, 0x00, 0x02, 0x1e, 0x74, 0x00, 0x02, 0x1e, + 0x2a, 0x01, 0x02, 0x1e, 0x4c, 0x00, 0x02, 0x1e, + 0x2a, 0x80, 0x80, 0x00, 0x00, 0x03, 0x05, 0x29, + 0x2a, 0x80, 0x01, 0x00, 0x00, 0x07, 0x04, 0x2c, + 0x6b, 0x35, 0x93, 0x9e, 0xad, 0x0d, 0x00, 0x00, + 0x07, 0x04, 0x2c, 0x6b, 0x35, 0x93, 0x9e, 0xad, + 0x00, 0x03, 0x04, 0x93, 0x9e, 0x01, 0x00, 0x00, + 0x08, 0x01, 0x04, 0x2c, 0x6b, 0x35, 0x93, 0x9e, + 0xad, 0x1f, 0x00, 0x00, 0x09, 0x01, 0x04, 0x57, + 0x58, 0x79, 0x82, 0x35, 0x8d, 0x93, 0x09, 0x00, + 0x0a, 0x02, 0x04, 0x93, 0x09, 0x00, 0x09, 0x03, + 0x04, 0x9e, 0xad, 0x05, 0x00, 0x00, 0x02, 0x04, + 0x93, 0x62, 0x00, 0x00, 0x02, 0x04, 0x35, 0x81, + 0xfb, 0x00, 0x00, 0x0f, 0x0b, 0x21, 0x2d, 0x2f, + 0x31, 0x40, 0x4c, 0x56, 0x68, 0x6a, 0x7a, 0x87, + 0x9b, 0x9d, 0xa2, 0x00, 0x0d, 0x0b, 0x21, 0x2d, + 0x2f, 0x31, 0x40, 0x4c, 0x56, 0x6a, 0x7a, 0x9b, + 0x9d, 0xa2, 0x10, 0x00, 0x00, 0x15, 0x0b, 0x21, + 0x23, 0x30, 0x5a, 0x2d, 0x2f, 0x31, 0x40, 0x55, + 0x56, 0x68, 0x70, 0x7a, 0x49, 0x8c, 0x92, 0x9a, + 0x9b, 0x9d, 0xa2, 0x00, 0x17, 0x0b, 0x21, 0x23, + 0x30, 0x5a, 0x2d, 0x2f, 0x32, 0x31, 0x40, 0x4e, + 0x55, 0x56, 0x68, 0x70, 0x7a, 0x49, 0x8c, 0x92, + 0x9a, 0x9b, 0x9d, 0xa2, 0x09, 0x04, 0x21, 0x23, + 0x3f, 0x55, 0x75, 0x00, 0x09, 0x03, 0x0b, 0x16, + 0x92, 0x75, 0x00, 0x09, 0x02, 0x31, 0x64, 0x75, + 0x00, 0x09, 0x02, 0x2f, 0x47, 0x80, 0x75, 0x00, + 0x0d, 0x02, 0x2d, 0x9b, 0x80, 0x71, 0x00, 0x09, + 0x03, 0x40, 0x68, 0xa7, 0x82, 0xcf, 0x00, 0x09, + 0x03, 0x16, 0x65, 0x96, 0x80, 0x30, 0x00, 0x00, + 0x03, 0x29, 0x2a, 0x4c, 0x85, 0x6e, 0x00, 0x02, + 0x01, 0x84, 0x46, 0x00, 0x01, 0x04, 0x12, 0x36, + 0x95, 0x94, 0x80, 0x4a, 0x00, 0x01, 0x02, 0x62, + 0x80, 0x00, 0x00, 0x00, 0x02, 0x62, 0x80, 0x84, + 0x49, 0x00, 0x00, 0x04, 0x0b, 0x21, 0x2d, 0x40, + 0x00, 0x01, 0x21, 0x00, 0x04, 0x0b, 0x21, 0x2d, + 0x40, 0x00, 0x03, 0x21, 0x2d, 0x40, 0x00, 0x01, + 0x21, 0x00, 0x05, 0x0b, 0x21, 0x6a, 0x9d, 0xa2, + 0x00, 0x03, 0x0b, 0x21, 0x9d, 0x00, 0x03, 0x21, + 0x6a, 0x87, 0x00, 0x04, 0x0b, 0x21, 0x6a, 0x9d, + 0x00, 0x02, 0x21, 0x87, 0x00, 0x06, 0x21, 0x40, + 0x56, 0x7a, 0x9b, 0x9d, 0x00, 0x01, 0x21, 0x01, + 0x02, 0x21, 0x87, 0x01, 0x01, 0x21, 0x00, 0x02, + 0x21, 0x87, 0x00, 0x02, 0x0b, 0x21, 0x00, 0x03, + 0x21, 0x6a, 0xa2, 0x05, 0x01, 0x21, 0x00, 0x03, + 0x21, 0x68, 0x6a, 0x00, 0x03, 0x0b, 0x21, 0x87, + 0x00, 0x02, 0x21, 0x6a, 0x00, 0x01, 0x21, 0x00, + 0x04, 0x0b, 0x21, 0x6a, 0x87, 0x03, 0x01, 0x21, + 0x00, 0x0b, 0x0b, 0x21, 0x2d, 0x40, 0x56, 0x68, + 0x7a, 0x8c, 0x9d, 0xa2, 0xa7, 0x00, 0x02, 0x21, + 0x2d, 0x00, 0x04, 0x21, 0x2d, 0x40, 0xa7, 0x01, + 0x02, 0x0b, 0x21, 0x00, 0x01, 0x0b, 0x01, 0x02, + 0x21, 0x2d, 0x00, 0x01, 0x68, 0x80, 0x44, 0x00, + 0x01, 0x01, 0x2e, 0x35, 0x00, 0x00, 0x03, 0x1e, + 0x4c, 0x93, 0x00, 0x00, 0x00, 0x01, 0x93, 0x81, + 0xb3, 0x00, 0x00, 0x03, 0x4c, 0x62, 0x80, 0x1e, + 0x00, 0x00, 0x02, 0x01, 0x04, 0x09, 0x00, 0x00, + 0x06, 0x14, 0x29, 0x2a, 0x71, 0x52, 0x78, 0x01, + 0x00, 0x00, 0x04, 0x14, 0x2e, 0x71, 0x5f, 0x80, + 0x11, 0x00, 0x00, 0x03, 0x21, 0x2d, 0x4c, 0x8c, + 0xa5, 0x00, 0x00, 0x02, 0x1b, 0x4c, 0x17, 0x00, + 0x00, 0x02, 0x06, 0x78, 0x00, 0x07, 0x06, 0x14, + 0x29, 0x71, 0x3f, 0x53, 0x85, 0x09, 0x00, 0x00, + 0x01, 0x24, 0x03, 0x00, 0x00, 0x03, 0x01, 0x04, + 0x71, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x2a, 0x81, + 0x2b, 0x00, 0x0f, 0x02, 0x33, 0x9c, 0x00, 0x00, + 0x00, 0x07, 0x0e, 0x34, 0x33, 0x39, 0x41, 0x62, + 0xae, 0x00, 0x08, 0x0e, 0x34, 0x33, 0x39, 0x41, + 0x62, 0x80, 0xae, 0x00, 0x05, 0x0e, 0x34, 0x33, + 0x39, 0x41, 0x01, 0x00, 0x00, 0x01, 0x33, 0x00, + 0x00, 0x01, 0x08, 0x0e, 0x34, 0x33, 0x39, 0x41, + 0x62, 0xa0, 0xae, 0x01, 0x09, 0x0e, 0x34, 0x33, + 0x39, 0x41, 0x51, 0x62, 0xa0, 0xae, 0x05, 0x06, + 0x0e, 0x34, 0x33, 0x39, 0x41, 0xae, 0x00, 0x00, + 0x00, 0x05, 0x0e, 0x34, 0x33, 0x39, 0x41, 0x07, + 0x06, 0x0e, 0x34, 0x33, 0x39, 0x41, 0xae, 0x03, + 0x05, 0x0e, 0x34, 0x33, 0x39, 0x41, 0x09, 0x00, + 0x03, 0x02, 0x0e, 0x33, 0x01, 0x00, 0x00, 0x05, + 0x0e, 0x34, 0x33, 0x39, 0x41, 0x04, 0x02, 0x39, + 0x41, 0x00, 0x00, 0x00, 0x05, 0x0e, 0x34, 0x33, + 0x39, 0x41, 0x03, 0x00, 0x01, 0x03, 0x33, 0x39, + 0x41, 0x01, 0x01, 0x33, 0x58, 0x00, 0x03, 0x02, + 0x39, 0x41, 0x02, 0x00, 0x00, 0x02, 0x39, 0x41, + 0x59, 0x00, 0x00, 0x06, 0x0e, 0x34, 0x33, 0x39, + 0x41, 0xae, 0x00, 0x02, 0x39, 0x41, 0x80, 0x12, + 0x00, 0x0f, 0x01, 0x33, 0x1f, 0x00, 0x25, 0x01, + 0x33, 0x08, 0x00, 0x00, 0x02, 0x33, 0x9c, 0x2f, + 0x00, 0x27, 0x01, 0x33, 0x37, 0x00, 0x30, 0x01, + 0x33, 0x0e, 0x00, 0x0b, 0x01, 0x33, 0x32, 0x00, + 0x00, 0x01, 0x33, 0x57, 0x00, 0x18, 0x01, 0x33, + 0x09, 0x00, 0x04, 0x01, 0x33, 0x5f, 0x00, 0x1e, + 0x01, 0x33, 0xc0, 0x31, 0xef, 0x00, 0x00, 0x02, + 0x1e, 0x2a, 0x80, 0x0f, 0x00, 0x07, 0x02, 0x33, + 0x4c, 0x80, 0xa7, 0x00, 0x02, 0x10, 0x21, 0x23, + 0x2f, 0x31, 0x47, 0x40, 0x3f, 0x55, 0x56, 0x61, + 0x68, 0x87, 0x49, 0x9a, 0xa2, 0xa7, 0x02, 0x0f, + 0x21, 0x23, 0x2f, 0x31, 0x47, 0x40, 0x3f, 0x55, + 0x61, 0x68, 0x87, 0x49, 0x9a, 0xa2, 0xa7, 0x01, + 0x0b, 0x21, 0x23, 0x2f, 0x31, 0x47, 0x3f, 0x55, + 0x61, 0x49, 0x9a, 0xa2, 0x00, 0x0c, 0x21, 0x23, + 0x2f, 0x31, 0x47, 0x3f, 0x55, 0x61, 0x87, 0x49, + 0x9a, 0xa2, 0x00, 0x0b, 0x21, 0x23, 0x2f, 0x31, + 0x47, 0x3f, 0x55, 0x61, 0x49, 0x9a, 0xa2, 0x80, + 0x36, 0x00, 0x00, 0x03, 0x0b, 0x21, 0xa7, 0x00, + 0x00, 0x00, 0x02, 0x21, 0x9b, 0x39, 0x00, 0x00, + 0x03, 0x44, 0x4c, 0x65, 0x80, 0x1f, 0x00, 0x00, + 0x02, 0x11, 0x3e, 0xc0, 0x12, 0xed, 0x00, 0x01, + 0x02, 0x04, 0x6b, 0x80, 0x31, 0x00, 0x00, 0x02, + 0x04, 0x9e, 0x09, 0x00, 0x00, 0x02, 0x04, 0x9e, + 0x46, 0x00, 0x01, 0x05, 0x0e, 0x34, 0x33, 0x39, + 0x41, 0x80, 0x99, 0x00, 0x04, 0x06, 0x0e, 0x34, + 0x33, 0x39, 0x41, 0xae, 0x09, 0x00, 0x00, 0x02, + 0x39, 0x41, 0x2c, 0x00, 0x01, 0x02, 0x39, 0x41, + 0x80, 0xdf, 0x00, 0x01, 0x03, 0x1f, 0x1d, 0x50, + 0x00, 0x02, 0x1d, 0x50, 0x03, 0x00, 0x2c, 0x03, + 0x1d, 0x4f, 0x50, 0x02, 0x00, 0x08, 0x02, 0x1d, + 0x50, 0x81, 0x1f, 0x00, 0x1b, 0x02, 0x04, 0x1b, + 0x87, 0x75, 0x00, 0x00, 0x02, 0x58, 0x79, 0x87, + 0x8d, 0x00, 0x00, 0x02, 0x2d, 0x9b, 0x00, 0x00, + 0x00, 0x02, 0x2d, 0x9b, 0x36, 0x00, 0x01, 0x02, + 0x2d, 0x9b, 0x8c, 0x12, 0x00, 0x01, 0x02, 0x2d, + 0x9b, 0x00, 0x00, 0x00, 0x02, 0x2d, 0x9b, 0xc0, + 0x5c, 0x4b, 0x00, 0x03, 0x01, 0x24, 0x96, 0x3b, + 0x00, 0x11, 0x01, 0x33, 0x9e, 0x5d, 0x00, 0x01, + 0x01, 0x33, 0xce, 0xcd, 0x2d, 0x00, +}; + +static const uint8_t unicode_prop_Hyphen_table[28] = { + 0xac, 0x80, 0xfe, 0x80, 0x44, 0xdb, 0x80, 0x52, + 0x7a, 0x80, 0x48, 0x08, 0x81, 0x4e, 0x04, 0x80, + 0x42, 0xe2, 0x80, 0x60, 0xcd, 0x66, 0x80, 0x40, + 0xa8, 0x80, 0xd6, 0x80, +}; + +static const uint8_t unicode_prop_Other_Math_table[200] = { + 0xdd, 0x80, 0x43, 0x70, 0x11, 0x80, 0x99, 0x09, + 0x81, 0x5c, 0x1f, 0x80, 0x9a, 0x82, 0x8a, 0x80, + 0x9f, 0x83, 0x97, 0x81, 0x8d, 0x81, 0xc0, 0x8c, + 0x18, 0x11, 0x1c, 0x91, 0x03, 0x01, 0x89, 0x00, + 0x14, 0x28, 0x11, 0x09, 0x02, 0x05, 0x13, 0x24, + 0xca, 0x21, 0x18, 0x08, 0x08, 0x00, 0x21, 0x0b, + 0x0b, 0x91, 0x09, 0x00, 0x06, 0x00, 0x29, 0x41, + 0x21, 0x83, 0x40, 0xa7, 0x08, 0x80, 0x97, 0x80, + 0x90, 0x80, 0x41, 0xbc, 0x81, 0x8b, 0x88, 0x24, + 0x21, 0x09, 0x14, 0x8d, 0x00, 0x01, 0x85, 0x97, + 0x81, 0xb8, 0x00, 0x80, 0x9c, 0x83, 0x88, 0x81, + 0x41, 0x55, 0x81, 0x9e, 0x89, 0x41, 0x92, 0x95, + 0xbe, 0x83, 0x9f, 0x81, 0x60, 0xd4, 0x62, 0x00, + 0x03, 0x80, 0x40, 0xd2, 0x00, 0x80, 0x60, 0xd4, + 0xc0, 0xd4, 0x80, 0xc6, 0x01, 0x08, 0x09, 0x0b, + 0x80, 0x8b, 0x00, 0x06, 0x80, 0xc0, 0x03, 0x0f, + 0x06, 0x80, 0x9b, 0x03, 0x04, 0x00, 0x16, 0x80, + 0x41, 0x53, 0x81, 0x98, 0x80, 0x98, 0x80, 0x9e, + 0x80, 0x98, 0x80, 0x9e, 0x80, 0x98, 0x80, 0x9e, + 0x80, 0x98, 0x80, 0x9e, 0x80, 0x98, 0x07, 0x81, + 0xb1, 0x55, 0xff, 0x18, 0x9a, 0x01, 0x00, 0x08, + 0x80, 0x89, 0x03, 0x00, 0x00, 0x28, 0x18, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0b, 0x06, 0x03, 0x03, 0x00, + 0x80, 0x89, 0x80, 0x90, 0x22, 0x04, 0x80, 0x90, +}; + +static const uint8_t unicode_prop_Other_Alphabetic_table[452] = { + 0x43, 0x44, 0x80, 0x9c, 0x8c, 0x42, 0x3f, 0x8d, + 0x00, 0x01, 0x01, 0x00, 0xc7, 0x8a, 0xaf, 0x8c, + 0x06, 0x8f, 0x80, 0xe4, 0x33, 0x19, 0x0b, 0x80, + 0xa2, 0x80, 0x9d, 0x8f, 0xe5, 0x8a, 0xe4, 0x0a, + 0x88, 0x02, 0x03, 0xe9, 0x80, 0xbb, 0x8b, 0x16, + 0x85, 0x93, 0xb5, 0x09, 0x8e, 0x01, 0x22, 0x89, + 0x81, 0x9c, 0x82, 0xb9, 0x31, 0x09, 0x81, 0x89, + 0x80, 0x89, 0x81, 0x9c, 0x82, 0xb9, 0x23, 0x09, + 0x0b, 0x80, 0x9d, 0x0a, 0x80, 0x8a, 0x82, 0xb9, + 0x38, 0x10, 0x81, 0x94, 0x81, 0x95, 0x13, 0x82, + 0xb9, 0x31, 0x09, 0x81, 0x88, 0x81, 0x89, 0x81, + 0x9d, 0x80, 0xba, 0x22, 0x10, 0x82, 0x89, 0x80, + 0xa7, 0x84, 0xb8, 0x30, 0x10, 0x17, 0x81, 0x8a, + 0x81, 0x9c, 0x82, 0xb9, 0x30, 0x10, 0x17, 0x81, + 0x8a, 0x81, 0x8e, 0x80, 0x8b, 0x83, 0xb9, 0x30, + 0x10, 0x82, 0x89, 0x80, 0x89, 0x81, 0x9c, 0x82, + 0xca, 0x28, 0x00, 0x87, 0x91, 0x81, 0xbc, 0x01, + 0x86, 0x91, 0x80, 0xe2, 0x01, 0x28, 0x81, 0x8f, + 0x80, 0x40, 0xa2, 0x92, 0x88, 0x8a, 0x80, 0xa3, + 0xed, 0x8b, 0x00, 0x0b, 0x96, 0x1b, 0x10, 0x11, + 0x32, 0x83, 0x8c, 0x8b, 0x00, 0x89, 0x83, 0x46, + 0x73, 0x81, 0x9d, 0x81, 0x9d, 0x81, 0x9d, 0x81, + 0xc1, 0x92, 0x40, 0xbb, 0x81, 0xa1, 0x80, 0xf5, + 0x8b, 0x83, 0x88, 0x40, 0xdd, 0x84, 0xb8, 0x89, + 0x81, 0x93, 0xc9, 0x81, 0x8a, 0x82, 0xb0, 0x84, + 0xaf, 0x8e, 0xbb, 0x82, 0x9d, 0x88, 0x09, 0xb8, + 0x8a, 0xb1, 0x92, 0x41, 0x9b, 0xa1, 0x46, 0xc0, + 0xb3, 0x48, 0xf5, 0x9f, 0x60, 0x78, 0x73, 0x87, + 0xa1, 0x81, 0x41, 0x61, 0x07, 0x80, 0x96, 0x84, + 0xd7, 0x81, 0xb1, 0x8f, 0x00, 0xb8, 0x80, 0xa5, + 0x84, 0x9b, 0x8b, 0xac, 0x83, 0xaf, 0x8b, 0xa4, + 0x80, 0xc2, 0x8d, 0x8b, 0x07, 0x81, 0xac, 0x82, + 0xb1, 0x00, 0x11, 0x0c, 0x80, 0xab, 0x24, 0x80, + 0x40, 0xec, 0x87, 0x60, 0x4f, 0x32, 0x80, 0x48, + 0x56, 0x84, 0x46, 0x85, 0x10, 0x0c, 0x83, 0x43, + 0x13, 0x83, 0xc0, 0x80, 0x41, 0x40, 0x81, 0xcc, + 0x82, 0x41, 0x02, 0x82, 0xb4, 0x8d, 0xac, 0x81, + 0x8a, 0x82, 0xac, 0x88, 0x88, 0x80, 0xbc, 0x82, + 0xa3, 0x8b, 0x91, 0x81, 0xb8, 0x82, 0xaf, 0x8c, + 0x8d, 0x81, 0xdb, 0x88, 0x08, 0x28, 0x08, 0x40, + 0x9c, 0x89, 0x96, 0x83, 0xb9, 0x31, 0x09, 0x81, + 0x89, 0x80, 0x89, 0x81, 0xd3, 0x88, 0x00, 0x08, + 0x03, 0x01, 0xe6, 0x8c, 0x02, 0xe9, 0x91, 0x40, + 0xec, 0x31, 0x86, 0x9c, 0x81, 0xd1, 0x8e, 0x00, + 0xe9, 0x8a, 0xe6, 0x8d, 0x41, 0x00, 0x8c, 0x40, + 0xf6, 0x28, 0x09, 0x0a, 0x00, 0x80, 0x40, 0x8d, + 0x31, 0x2b, 0x80, 0x9b, 0x89, 0xa9, 0x20, 0x83, + 0x91, 0x8a, 0xad, 0x8d, 0x40, 0xc7, 0x87, 0x40, + 0xc6, 0x38, 0x86, 0xd2, 0x95, 0x80, 0x8d, 0xf9, + 0x2a, 0x00, 0x08, 0x10, 0x02, 0x80, 0xc1, 0x20, + 0x08, 0x83, 0x41, 0x5b, 0x83, 0x88, 0x08, 0x80, + 0xaf, 0x32, 0x82, 0x60, 0x41, 0xdc, 0x90, 0x4e, + 0x1f, 0x00, 0xb6, 0x33, 0xdc, 0x81, 0x60, 0x4c, + 0xab, 0x80, 0x60, 0x23, 0x60, 0x30, 0x90, 0x0e, + 0x01, 0x04, 0xe3, 0x80, 0x46, 0x52, 0x01, 0x06, + 0x0c, 0x80, 0x42, 0x50, 0x80, 0x47, 0xe7, 0x99, + 0x85, 0x99, 0x85, 0x99, +}; + +static const uint8_t unicode_prop_Other_Lowercase_table[68] = { + 0x40, 0xa9, 0x80, 0x8e, 0x80, 0x41, 0xf4, 0x88, + 0x31, 0x9d, 0x84, 0xdf, 0x80, 0xb3, 0x80, 0x4d, + 0x80, 0x80, 0x4c, 0x2e, 0xbe, 0x8c, 0x80, 0xa1, + 0xa4, 0x42, 0xb0, 0x80, 0x8c, 0x80, 0x8f, 0x8c, + 0x40, 0xd2, 0x8f, 0x43, 0x4f, 0x99, 0x47, 0x91, + 0x81, 0x60, 0x7a, 0x1d, 0x81, 0x40, 0xd1, 0x80, + 0xff, 0x1a, 0x81, 0x43, 0x61, 0x83, 0x88, 0x80, + 0x60, 0x5c, 0x15, 0x01, 0x10, 0xa9, 0x80, 0x88, + 0x60, 0xd8, 0x74, 0xbd, +}; + +static const uint8_t unicode_prop_Other_Uppercase_table[15] = { + 0x60, 0x21, 0x5f, 0x8f, 0x43, 0x45, 0x99, 0x61, + 0xcc, 0x5f, 0x99, 0x85, 0x99, 0x85, 0x99, +}; + +static const uint8_t unicode_prop_Other_Grapheme_Extend_table[112] = { + 0x49, 0xbd, 0x80, 0x97, 0x80, 0x41, 0x65, 0x80, + 0x97, 0x80, 0xe5, 0x80, 0x97, 0x80, 0x40, 0xe7, + 0x00, 0x03, 0x08, 0x81, 0x88, 0x81, 0xe6, 0x80, + 0x97, 0x80, 0xf6, 0x80, 0x8e, 0x80, 0x49, 0x34, + 0x80, 0x9d, 0x80, 0x43, 0xff, 0x04, 0x00, 0x04, + 0x81, 0xe4, 0x80, 0xc6, 0x81, 0x44, 0x17, 0x80, + 0x50, 0x20, 0x81, 0x60, 0x79, 0x22, 0x80, 0xeb, + 0x80, 0x60, 0x55, 0xdc, 0x81, 0x52, 0x1f, 0x80, + 0xf3, 0x80, 0x41, 0x07, 0x80, 0x8d, 0x80, 0x88, + 0x80, 0xdf, 0x80, 0x88, 0x01, 0x00, 0x14, 0x80, + 0x40, 0xdf, 0x80, 0x8b, 0x80, 0x40, 0xf0, 0x80, + 0x41, 0x05, 0x80, 0x42, 0x78, 0x80, 0x8b, 0x80, + 0x46, 0x02, 0x80, 0x60, 0x50, 0xad, 0x81, 0x60, + 0x61, 0x72, 0x0d, 0x85, 0x6c, 0x2e, 0xac, 0xdf, +}; + +static const uint8_t unicode_prop_Other_Default_Ignorable_Code_Point_table[32] = { + 0x43, 0x4e, 0x80, 0x4e, 0x0e, 0x81, 0x46, 0x52, + 0x81, 0x48, 0xae, 0x80, 0x50, 0xfd, 0x80, 0x60, + 0xce, 0x3a, 0x80, 0xce, 0x88, 0x6d, 0x00, 0x06, + 0x00, 0x9d, 0xdf, 0xff, 0x40, 0xef, 0x4e, 0x0f, +}; + +static const uint8_t unicode_prop_Other_ID_Start_table[11] = { + 0x58, 0x84, 0x81, 0x48, 0x90, 0x80, 0x94, 0x80, + 0x4f, 0x6b, 0x81, +}; + +static const uint8_t unicode_prop_Other_ID_Continue_table[22] = { + 0x40, 0xb6, 0x80, 0x42, 0xce, 0x80, 0x4f, 0xe0, + 0x88, 0x46, 0x67, 0x80, 0x46, 0x30, 0x81, 0x50, + 0xec, 0x80, 0x60, 0xce, 0x68, 0x80, +}; + +static const uint8_t unicode_prop_Prepended_Concatenation_Mark_table[19] = { + 0x45, 0xff, 0x85, 0x40, 0xd6, 0x80, 0xb0, 0x80, + 0x41, 0x7f, 0x81, 0xcf, 0x80, 0x61, 0x07, 0xd9, + 0x80, 0x8e, 0x80, +}; + +static const uint8_t unicode_prop_XID_Start1_table[31] = { + 0x43, 0x79, 0x80, 0x4a, 0xb7, 0x80, 0xfe, 0x80, + 0x60, 0x21, 0xe6, 0x81, 0x60, 0xcb, 0xc0, 0x85, + 0x41, 0x95, 0x81, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x41, 0x1e, 0x81, +}; + +static const uint8_t unicode_prop_XID_Continue1_table[23] = { + 0x43, 0x79, 0x80, 0x60, 0x2d, 0x1f, 0x81, 0x60, + 0xcb, 0xc0, 0x85, 0x41, 0x95, 0x81, 0xf3, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +}; + +static const uint8_t unicode_prop_Changes_When_Titlecased1_table[22] = { + 0x41, 0xc3, 0x08, 0x08, 0x81, 0xa4, 0x81, 0x4e, + 0xdc, 0xaa, 0x0a, 0x4e, 0x87, 0x3f, 0x3f, 0x87, + 0x8b, 0x80, 0x8e, 0x80, 0xae, 0x80, +}; + +static const uint8_t unicode_prop_Changes_When_Casefolded1_table[29] = { + 0x41, 0xef, 0x80, 0x41, 0x9e, 0x80, 0x9e, 0x80, + 0x5a, 0xe4, 0x83, 0x40, 0xb5, 0x00, 0x00, 0x00, + 0x80, 0xde, 0x06, 0x06, 0x80, 0x8a, 0x09, 0x81, + 0x89, 0x10, 0x81, 0x8d, 0x80, +}; + +static const uint8_t unicode_prop_Changes_When_NFKC_Casefolded1_table[449] = { + 0x40, 0x9f, 0x06, 0x00, 0x01, 0x00, 0x01, 0x12, + 0x10, 0x82, 0xf3, 0x80, 0x8b, 0x80, 0x40, 0x84, + 0x01, 0x01, 0x80, 0xa2, 0x01, 0x80, 0x40, 0xbb, + 0x88, 0x9e, 0x29, 0x84, 0xda, 0x08, 0x81, 0x89, + 0x80, 0xa3, 0x04, 0x02, 0x04, 0x08, 0x07, 0x80, + 0x9e, 0x80, 0xa0, 0x82, 0x9c, 0x80, 0x42, 0x28, + 0x80, 0xd7, 0x83, 0x42, 0xde, 0x87, 0xfb, 0x08, + 0x80, 0xd2, 0x01, 0x80, 0xa1, 0x11, 0x80, 0x40, + 0xfc, 0x81, 0x42, 0xd4, 0x80, 0xfe, 0x80, 0xa7, + 0x81, 0xad, 0x80, 0xb5, 0x80, 0x88, 0x03, 0x03, + 0x03, 0x80, 0x8b, 0x80, 0x88, 0x00, 0x26, 0x80, + 0x90, 0x80, 0x88, 0x03, 0x03, 0x03, 0x80, 0x8b, + 0x80, 0x41, 0x41, 0x80, 0xe1, 0x81, 0x46, 0x52, + 0x81, 0xd4, 0x84, 0x45, 0x1b, 0x10, 0x8a, 0x80, + 0x91, 0x80, 0x9b, 0x8c, 0x80, 0xa1, 0xa4, 0x40, + 0xd5, 0x83, 0x40, 0xb5, 0x00, 0x00, 0x00, 0x80, + 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xb7, 0x05, 0x00, 0x13, 0x05, 0x11, 0x02, 0x0c, + 0x11, 0x00, 0x00, 0x0c, 0x15, 0x05, 0x08, 0x8f, + 0x00, 0x20, 0x8b, 0x12, 0x2a, 0x08, 0x0b, 0x00, + 0x07, 0x82, 0x8c, 0x06, 0x92, 0x81, 0x9a, 0x80, + 0x8c, 0x8a, 0x80, 0xd6, 0x18, 0x10, 0x8a, 0x01, + 0x0c, 0x0a, 0x00, 0x10, 0x11, 0x02, 0x06, 0x05, + 0x1c, 0x85, 0x8f, 0x8f, 0x8f, 0x88, 0x80, 0x40, + 0xa1, 0x08, 0x81, 0x40, 0xf7, 0x81, 0x41, 0x34, + 0xd5, 0x99, 0x9a, 0x45, 0x20, 0x80, 0xe6, 0x82, + 0xe4, 0x80, 0x41, 0x9e, 0x81, 0x40, 0xf0, 0x80, + 0x41, 0x2e, 0x80, 0xd2, 0x80, 0x8b, 0x40, 0xd5, + 0xa9, 0x80, 0xb4, 0x00, 0x82, 0xdf, 0x09, 0x80, + 0xde, 0x80, 0xb0, 0xdd, 0x82, 0x8d, 0xdf, 0x9e, + 0x80, 0xa7, 0x87, 0xae, 0x80, 0x41, 0x7f, 0x60, + 0x72, 0x9b, 0x81, 0x40, 0xd1, 0x80, 0xff, 0x1a, + 0x81, 0x43, 0x61, 0x83, 0x88, 0x80, 0x60, 0x4d, + 0x95, 0x41, 0x0d, 0x08, 0x00, 0x81, 0x89, 0x00, + 0x00, 0x09, 0x82, 0xc3, 0x81, 0xe9, 0xc2, 0x00, + 0x97, 0x04, 0x00, 0x01, 0x01, 0x80, 0xeb, 0xa0, + 0x41, 0x6a, 0x91, 0xbf, 0x81, 0xb5, 0xa7, 0x8c, + 0x82, 0x99, 0x95, 0x94, 0x81, 0x8b, 0x80, 0x92, + 0x03, 0x1a, 0x00, 0x80, 0x40, 0x86, 0x08, 0x80, + 0x9f, 0x99, 0x40, 0x83, 0x15, 0x0d, 0x0d, 0x0a, + 0x16, 0x06, 0x80, 0x88, 0x47, 0x87, 0x20, 0xa9, + 0x80, 0x88, 0x60, 0xb4, 0xe4, 0x83, 0x50, 0x31, + 0xa3, 0x44, 0x63, 0x86, 0x8d, 0x87, 0xbf, 0x85, + 0x42, 0x3e, 0xd4, 0x80, 0xc6, 0x01, 0x08, 0x09, + 0x0b, 0x80, 0x8b, 0x00, 0x06, 0x80, 0xc0, 0x03, + 0x0f, 0x06, 0x80, 0x9b, 0x03, 0x04, 0x00, 0x16, + 0x80, 0x41, 0x53, 0x81, 0x41, 0x23, 0x81, 0xb1, + 0x48, 0x2f, 0xbd, 0x4d, 0x91, 0x18, 0x9a, 0x01, + 0x00, 0x08, 0x80, 0x89, 0x03, 0x00, 0x00, 0x28, + 0x18, 0x00, 0x00, 0x02, 0x01, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x06, 0x03, + 0x03, 0x00, 0x80, 0x89, 0x80, 0x90, 0x22, 0x04, + 0x80, 0x90, 0x42, 0x43, 0x8a, 0x84, 0x9e, 0x80, + 0x9f, 0x99, 0x82, 0xa2, 0x80, 0xee, 0x82, 0x8c, + 0xab, 0x83, 0x88, 0x31, 0x49, 0x9d, 0x89, 0x60, + 0xfc, 0x05, 0x42, 0x1d, 0x6b, 0x05, 0xe1, 0x4f, + 0xff, +}; + +static const uint8_t unicode_prop_ASCII_Hex_Digit_table[5] = { + 0xaf, 0x89, 0x35, 0x99, 0x85, +}; + +static const uint8_t unicode_prop_Bidi_Control_table[10] = { + 0x46, 0x1b, 0x80, 0x59, 0xf0, 0x81, 0x99, 0x84, + 0xb6, 0x83, +}; + +static const uint8_t unicode_prop_Dash_table[58] = { + 0xac, 0x80, 0x45, 0x5b, 0x80, 0xb2, 0x80, 0x4e, + 0x40, 0x80, 0x44, 0x04, 0x80, 0x48, 0x08, 0x85, + 0xbc, 0x80, 0xa6, 0x80, 0x8e, 0x80, 0x41, 0x85, + 0x80, 0x4c, 0x03, 0x01, 0x80, 0x9e, 0x0b, 0x80, + 0x9b, 0x80, 0x41, 0xbd, 0x80, 0x92, 0x80, 0xee, + 0x80, 0x60, 0xcd, 0x8f, 0x81, 0xa4, 0x80, 0x89, + 0x80, 0x40, 0xa8, 0x80, 0x4e, 0x5f, 0x80, 0x41, + 0x3d, 0x80, +}; + +static const uint8_t unicode_prop_Deprecated_table[23] = { + 0x41, 0x48, 0x80, 0x45, 0x28, 0x80, 0x49, 0x02, + 0x00, 0x80, 0x48, 0x28, 0x81, 0x48, 0xc4, 0x85, + 0x42, 0xb8, 0x81, 0x6d, 0xdc, 0xd5, 0x80, +}; + +static const uint8_t unicode_prop_Diacritic_table[447] = { + 0xdd, 0x00, 0x80, 0xc6, 0x05, 0x03, 0x01, 0x81, + 0x41, 0xf6, 0x40, 0x9e, 0x07, 0x25, 0x90, 0x0b, + 0x80, 0x88, 0x81, 0x40, 0xfc, 0x84, 0x40, 0xd0, + 0x80, 0xb6, 0xac, 0x00, 0x01, 0x01, 0x00, 0x40, + 0x82, 0x3b, 0x81, 0x40, 0x85, 0x0b, 0x0a, 0x82, + 0xc2, 0x9a, 0xda, 0x8a, 0xb9, 0x8a, 0xa1, 0x81, + 0xfd, 0x87, 0xa8, 0x89, 0x8f, 0x9b, 0xbc, 0x80, + 0x8f, 0x02, 0x83, 0x9b, 0x80, 0xc9, 0x80, 0x8f, + 0x80, 0xed, 0x80, 0x8f, 0x80, 0xed, 0x80, 0x8f, + 0x80, 0xae, 0x82, 0xbb, 0x80, 0x8f, 0x06, 0x80, + 0xf6, 0x80, 0xed, 0x80, 0x8f, 0x80, 0xed, 0x80, + 0x8f, 0x80, 0xec, 0x81, 0x8f, 0x80, 0xfb, 0x80, + 0xee, 0x80, 0x8b, 0x28, 0x80, 0xea, 0x80, 0x8c, + 0x84, 0xca, 0x81, 0x9a, 0x00, 0x00, 0x03, 0x81, + 0xc1, 0x10, 0x81, 0xbd, 0x80, 0xef, 0x00, 0x81, + 0xa7, 0x0b, 0x84, 0x98, 0x30, 0x80, 0x89, 0x81, + 0x42, 0xc0, 0x82, 0x43, 0xb3, 0x81, 0x9d, 0x80, + 0x40, 0x93, 0x8a, 0x88, 0x80, 0x41, 0x5a, 0x82, + 0x41, 0x23, 0x80, 0x93, 0x39, 0x80, 0xaf, 0x8e, + 0x81, 0x8a, 0x82, 0x8e, 0x81, 0x8b, 0xc7, 0x80, + 0x8e, 0x80, 0xa5, 0x88, 0xb5, 0x81, 0xb9, 0x80, + 0x8a, 0x81, 0xc1, 0x81, 0xbf, 0x85, 0xd1, 0x98, + 0x18, 0x28, 0x0a, 0xb1, 0xbe, 0xaf, 0xa3, 0x84, + 0x8b, 0xa4, 0x8a, 0x41, 0xbc, 0x00, 0x82, 0x8a, + 0x82, 0x8c, 0x82, 0x8c, 0x82, 0x8c, 0x81, 0x4c, + 0xef, 0x82, 0x41, 0x3c, 0x80, 0x41, 0xf9, 0x85, + 0xe8, 0x83, 0xde, 0x80, 0x60, 0x75, 0x71, 0x80, + 0x8b, 0x08, 0x80, 0x9b, 0x81, 0xd1, 0x81, 0x8d, + 0xa1, 0xe5, 0x82, 0xe5, 0x05, 0x81, 0x8b, 0x80, + 0xa4, 0x80, 0x40, 0x96, 0x80, 0x9a, 0x91, 0xb8, + 0x83, 0xa3, 0x80, 0xde, 0x80, 0x8b, 0x80, 0xa3, + 0x80, 0x40, 0x94, 0x82, 0xc0, 0x83, 0xb2, 0x80, + 0xe3, 0x84, 0x88, 0x82, 0xff, 0x81, 0x60, 0x4f, + 0x2f, 0x80, 0x43, 0x00, 0x8f, 0x41, 0x0d, 0x00, + 0x80, 0xae, 0x80, 0xac, 0x81, 0xc2, 0x80, 0x42, + 0xfb, 0x80, 0x44, 0x9e, 0x28, 0xa9, 0x80, 0x88, + 0x42, 0x7c, 0x13, 0x80, 0x40, 0xa4, 0x81, 0x42, + 0x3a, 0x85, 0xa5, 0x80, 0x99, 0x84, 0x41, 0x8b, + 0x01, 0x82, 0xc5, 0x8a, 0xb0, 0x83, 0x40, 0xbf, + 0x80, 0xa8, 0x80, 0xc7, 0x81, 0xf7, 0x81, 0xbd, + 0x80, 0xcb, 0x80, 0x88, 0x82, 0xe7, 0x81, 0x40, + 0xb1, 0x81, 0xcf, 0x81, 0x8f, 0x80, 0x97, 0x32, + 0x84, 0xd8, 0x10, 0x81, 0x8c, 0x81, 0xde, 0x02, + 0x80, 0xfa, 0x81, 0x40, 0xfa, 0x81, 0xfd, 0x80, + 0xf5, 0x81, 0xf2, 0x80, 0x41, 0x0c, 0x81, 0x41, + 0x01, 0x0b, 0x80, 0x40, 0x9b, 0x80, 0xd2, 0x80, + 0x91, 0x80, 0xd0, 0x80, 0x41, 0xa4, 0x80, 0x41, + 0x01, 0x00, 0x81, 0xd0, 0x80, 0xc0, 0x80, 0x41, + 0x66, 0x81, 0x96, 0x80, 0x54, 0xeb, 0x8e, 0x60, + 0x2c, 0xd8, 0x80, 0x49, 0xbf, 0x84, 0xba, 0x86, + 0x42, 0x33, 0x81, 0x42, 0x21, 0x90, 0xcf, 0x81, + 0x60, 0x3f, 0xfd, 0x18, 0x30, 0x81, 0x5f, 0x00, + 0xad, 0x81, 0x96, 0x42, 0x1f, 0x12, 0x2f, 0x39, + 0x86, 0x9d, 0x83, 0x4e, 0x81, 0xbd, 0x40, 0xc1, + 0x86, 0x41, 0x76, 0x80, 0xbc, 0x83, 0x42, 0xfd, + 0x81, 0x42, 0xdf, 0x86, 0xec, 0x10, 0x82, +}; + +static const uint8_t unicode_prop_Extender_table[116] = { + 0x40, 0xb6, 0x80, 0x42, 0x17, 0x81, 0x43, 0x6d, + 0x80, 0x41, 0xb8, 0x80, 0x42, 0x75, 0x80, 0x40, + 0x88, 0x80, 0xd8, 0x80, 0x42, 0xef, 0x80, 0xfe, + 0x80, 0x49, 0x42, 0x80, 0xb7, 0x80, 0x42, 0x62, + 0x80, 0x41, 0x8d, 0x80, 0xc3, 0x80, 0x53, 0x88, + 0x80, 0xaa, 0x84, 0xe6, 0x81, 0xdc, 0x82, 0x60, + 0x6f, 0x15, 0x80, 0x45, 0xf5, 0x80, 0x43, 0xc1, + 0x80, 0x95, 0x80, 0x40, 0x88, 0x80, 0xeb, 0x80, + 0x94, 0x81, 0x60, 0x54, 0x7a, 0x80, 0x48, 0x0f, + 0x81, 0x45, 0xca, 0x80, 0x9a, 0x03, 0x80, 0x44, + 0xc6, 0x80, 0x41, 0x24, 0x80, 0xf3, 0x81, 0x41, + 0xf1, 0x82, 0x44, 0xce, 0x80, 0x43, 0x3f, 0x80, + 0x60, 0x4d, 0x67, 0x81, 0x44, 0x9b, 0x08, 0x80, + 0x8d, 0x81, 0x60, 0x71, 0x47, 0x81, 0x44, 0xb0, + 0x80, 0x43, 0x53, 0x82, +}; + +static const uint8_t unicode_prop_Hex_Digit_table[12] = { + 0xaf, 0x89, 0x35, 0x99, 0x85, 0x60, 0xfe, 0xa8, + 0x89, 0x35, 0x99, 0x85, +}; + +static const uint8_t unicode_prop_IDS_Unary_Operator_table[4] = { + 0x60, 0x2f, 0xfd, 0x81, +}; + +static const uint8_t unicode_prop_IDS_Binary_Operator_table[8] = { + 0x60, 0x2f, 0xef, 0x09, 0x89, 0x41, 0xf0, 0x80, +}; + +static const uint8_t unicode_prop_IDS_Trinary_Operator_table[4] = { + 0x60, 0x2f, 0xf1, 0x81, +}; + +static const uint8_t unicode_prop_Ideographic_table[71] = { + 0x60, 0x30, 0x05, 0x81, 0x98, 0x88, 0x8d, 0x82, + 0x43, 0xc4, 0x59, 0xbf, 0xbf, 0x60, 0x51, 0xff, + 0x60, 0x58, 0xff, 0x41, 0x6d, 0x81, 0xe9, 0x60, + 0x75, 0x09, 0x80, 0x8c, 0x84, 0x88, 0x5c, 0xd5, + 0xa8, 0x9f, 0xe0, 0xf2, 0x60, 0x23, 0x7c, 0x41, + 0x8b, 0x60, 0x4d, 0x03, 0x60, 0xa6, 0xdf, 0x9f, + 0x51, 0x1d, 0x81, 0x56, 0x8d, 0x81, 0x5d, 0x30, + 0x8e, 0x42, 0x6d, 0x49, 0xa1, 0x42, 0x1d, 0x45, + 0xe1, 0x53, 0x4a, 0x84, 0x60, 0x21, 0x29, +}; + +static const uint8_t unicode_prop_Join_Control_table[4] = { + 0x60, 0x20, 0x0b, 0x81, +}; + +static const uint8_t unicode_prop_Logical_Order_Exception_table[15] = { + 0x4e, 0x3f, 0x84, 0xfa, 0x84, 0x4a, 0xef, 0x11, + 0x80, 0x60, 0x90, 0xf9, 0x09, 0x00, 0x81, +}; + +static const uint8_t unicode_prop_Modifier_Combining_Mark_table[16] = { + 0x46, 0x53, 0x09, 0x80, 0x40, 0x82, 0x05, 0x02, + 0x81, 0x41, 0xe0, 0x08, 0x12, 0x80, 0x9e, 0x80, +}; + +static const uint8_t unicode_prop_Noncharacter_Code_Point_table[71] = { + 0x60, 0xfd, 0xcf, 0x9f, 0x42, 0x0d, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, 0x60, + 0xff, 0xfd, 0x81, 0x60, 0xff, 0xfd, 0x81, +}; + +static const uint8_t unicode_prop_Pattern_Syntax_table[58] = { + 0xa0, 0x8e, 0x89, 0x86, 0x99, 0x18, 0x80, 0x99, + 0x83, 0xa1, 0x30, 0x00, 0x08, 0x00, 0x0b, 0x03, + 0x02, 0x80, 0x96, 0x80, 0x9e, 0x80, 0x5f, 0x17, + 0x97, 0x87, 0x8e, 0x81, 0x92, 0x80, 0x89, 0x41, + 0x30, 0x42, 0xcf, 0x40, 0x9f, 0x42, 0x75, 0x9d, + 0x44, 0x6b, 0x41, 0xff, 0xff, 0x41, 0x80, 0x13, + 0x98, 0x8e, 0x80, 0x60, 0xcd, 0x0c, 0x81, 0x41, + 0x04, 0x81, +}; + +static const uint8_t unicode_prop_Pattern_White_Space_table[11] = { + 0x88, 0x84, 0x91, 0x80, 0xe3, 0x80, 0x5f, 0x87, + 0x81, 0x97, 0x81, +}; + +static const uint8_t unicode_prop_Quotation_Mark_table[31] = { + 0xa1, 0x03, 0x80, 0x40, 0x82, 0x80, 0x8e, 0x80, + 0x5f, 0x5b, 0x87, 0x98, 0x81, 0x4e, 0x06, 0x80, + 0x41, 0xc8, 0x83, 0x8c, 0x82, 0x60, 0xce, 0x20, + 0x83, 0x40, 0xbc, 0x03, 0x80, 0xd9, 0x81, +}; + +static const uint8_t unicode_prop_Radical_table[9] = { + 0x60, 0x2e, 0x7f, 0x99, 0x80, 0xd8, 0x8b, 0x40, + 0xd5, +}; + +static const uint8_t unicode_prop_Regional_Indicator_table[4] = { + 0x61, 0xf1, 0xe5, 0x99, +}; + +static const uint8_t unicode_prop_Sentence_Terminal_table[213] = { + 0xa0, 0x80, 0x8b, 0x80, 0x8f, 0x80, 0x45, 0x48, + 0x80, 0x40, 0x92, 0x82, 0x40, 0xb3, 0x80, 0xaa, + 0x82, 0x40, 0xf5, 0x80, 0xbc, 0x00, 0x02, 0x81, + 0x41, 0x24, 0x81, 0x46, 0xe3, 0x81, 0x43, 0x15, + 0x03, 0x81, 0x43, 0x04, 0x80, 0x40, 0xc5, 0x81, + 0x40, 0x9c, 0x81, 0xac, 0x04, 0x80, 0x41, 0x39, + 0x81, 0x41, 0x61, 0x83, 0x40, 0xa1, 0x81, 0x89, + 0x09, 0x81, 0x9c, 0x82, 0x40, 0xba, 0x81, 0xc0, + 0x81, 0x43, 0xa3, 0x80, 0x96, 0x81, 0x88, 0x82, + 0x4c, 0xae, 0x82, 0x41, 0x31, 0x80, 0x8c, 0x80, + 0x95, 0x81, 0x41, 0xac, 0x80, 0x60, 0x74, 0xfb, + 0x80, 0x41, 0x0d, 0x81, 0x40, 0xe2, 0x02, 0x80, + 0x41, 0x7d, 0x81, 0xd5, 0x81, 0xde, 0x80, 0x40, + 0x97, 0x81, 0x40, 0x92, 0x82, 0x40, 0x8f, 0x81, + 0x40, 0xf8, 0x80, 0x60, 0x52, 0x25, 0x01, 0x81, + 0xba, 0x02, 0x81, 0x40, 0xa8, 0x80, 0x8b, 0x80, + 0x8f, 0x80, 0xc0, 0x80, 0x4a, 0xf3, 0x81, 0x44, + 0xfc, 0x84, 0xab, 0x83, 0x40, 0xbc, 0x81, 0xf4, + 0x83, 0xfe, 0x82, 0x40, 0x80, 0x0d, 0x80, 0x8f, + 0x81, 0xd7, 0x08, 0x81, 0xeb, 0x80, 0x41, 0x29, + 0x81, 0xf4, 0x81, 0x41, 0x74, 0x0c, 0x8e, 0xe8, + 0x81, 0x40, 0xf8, 0x82, 0x42, 0x04, 0x00, 0x80, + 0x40, 0xfa, 0x81, 0xd6, 0x81, 0x41, 0xa3, 0x81, + 0x42, 0xb3, 0x81, 0xc9, 0x81, 0x60, 0x4b, 0x28, + 0x81, 0x40, 0x84, 0x80, 0xc0, 0x81, 0x8a, 0x80, + 0x42, 0x28, 0x81, 0x41, 0x27, 0x80, 0x60, 0x4e, + 0x05, 0x80, 0x5d, 0xe7, 0x80, +}; + +static const uint8_t unicode_prop_Soft_Dotted_table[79] = { + 0xe8, 0x81, 0x40, 0xc3, 0x80, 0x41, 0x18, 0x80, + 0x9d, 0x80, 0xb3, 0x80, 0x93, 0x80, 0x41, 0x3f, + 0x80, 0xe1, 0x00, 0x80, 0x59, 0x08, 0x80, 0xb2, + 0x80, 0x8c, 0x02, 0x80, 0x40, 0x83, 0x80, 0x40, + 0x9c, 0x80, 0x41, 0xa4, 0x80, 0x40, 0xd5, 0x81, + 0x4b, 0x31, 0x80, 0x61, 0xa7, 0xa4, 0x81, 0xb1, + 0x81, 0xb1, 0x81, 0xb1, 0x81, 0xb1, 0x81, 0xb1, + 0x81, 0xb1, 0x81, 0xb1, 0x81, 0xb1, 0x81, 0xb1, + 0x81, 0xb1, 0x81, 0xb1, 0x81, 0xb1, 0x81, 0x48, + 0x85, 0x80, 0x41, 0x30, 0x81, 0x99, 0x80, +}; + +static const uint8_t unicode_prop_Terminal_Punctuation_table[264] = { + 0xa0, 0x80, 0x89, 0x00, 0x80, 0x8a, 0x0a, 0x80, + 0x43, 0x3d, 0x07, 0x80, 0x42, 0x00, 0x80, 0xb8, + 0x80, 0xc7, 0x80, 0x8d, 0x00, 0x82, 0x40, 0xb3, + 0x80, 0xaa, 0x8a, 0x00, 0x40, 0xea, 0x81, 0xb5, + 0x28, 0x87, 0x9e, 0x80, 0x41, 0x04, 0x81, 0x44, + 0xf3, 0x81, 0x40, 0xab, 0x03, 0x85, 0x41, 0x36, + 0x81, 0x43, 0x14, 0x87, 0x43, 0x04, 0x80, 0xfb, + 0x82, 0xc6, 0x81, 0x40, 0x9c, 0x12, 0x80, 0xa6, + 0x19, 0x81, 0x41, 0x39, 0x81, 0x41, 0x61, 0x83, + 0x40, 0xa1, 0x81, 0x89, 0x08, 0x82, 0x9c, 0x82, + 0x40, 0xba, 0x84, 0xbd, 0x81, 0x43, 0xa3, 0x80, + 0x96, 0x81, 0x88, 0x82, 0x4c, 0xae, 0x82, 0x41, + 0x31, 0x80, 0x8c, 0x03, 0x80, 0x89, 0x00, 0x0a, + 0x81, 0x41, 0xab, 0x81, 0x60, 0x74, 0xfa, 0x81, + 0x41, 0x0c, 0x82, 0x40, 0xe2, 0x84, 0x41, 0x7d, + 0x81, 0xd5, 0x81, 0xde, 0x80, 0x40, 0x96, 0x82, + 0x40, 0x92, 0x82, 0xfe, 0x80, 0x8f, 0x81, 0x40, + 0xf8, 0x80, 0x60, 0x52, 0x25, 0x01, 0x81, 0xb8, + 0x10, 0x83, 0x40, 0xa8, 0x80, 0x89, 0x00, 0x80, + 0x8a, 0x0a, 0x80, 0xc0, 0x01, 0x80, 0x44, 0x39, + 0x80, 0xaf, 0x80, 0x44, 0x85, 0x80, 0x40, 0xc6, + 0x80, 0x41, 0x35, 0x81, 0x40, 0x97, 0x85, 0xc3, + 0x85, 0xd8, 0x83, 0x43, 0xb7, 0x84, 0xab, 0x83, + 0x40, 0xbc, 0x86, 0xef, 0x83, 0xfe, 0x82, 0x40, + 0x80, 0x0d, 0x80, 0x8f, 0x81, 0xd7, 0x84, 0xeb, + 0x80, 0x41, 0x29, 0x81, 0xf4, 0x82, 0x8b, 0x81, + 0x41, 0x65, 0x1a, 0x8e, 0xe8, 0x81, 0x40, 0xf8, + 0x82, 0x42, 0x04, 0x00, 0x80, 0x40, 0xfa, 0x81, + 0xd6, 0x0b, 0x81, 0x41, 0x9d, 0x82, 0xac, 0x80, + 0x42, 0x84, 0x81, 0xc9, 0x81, 0x45, 0x2a, 0x84, + 0x60, 0x45, 0xf8, 0x81, 0x40, 0x84, 0x80, 0xc0, + 0x82, 0x89, 0x80, 0x42, 0x28, 0x81, 0x41, 0x26, + 0x81, 0x60, 0x4e, 0x05, 0x80, 0x5d, 0xe6, 0x83, +}; + +static const uint8_t unicode_prop_Unified_Ideograph_table[46] = { + 0x60, 0x33, 0xff, 0x59, 0xbf, 0xbf, 0x60, 0x51, + 0xff, 0x60, 0x5a, 0x0d, 0x08, 0x00, 0x81, 0x89, + 0x00, 0x00, 0x09, 0x82, 0x61, 0x05, 0xd5, 0x60, + 0xa6, 0xdf, 0x9f, 0x51, 0x1d, 0x81, 0x56, 0x8d, + 0x81, 0x5d, 0x30, 0x8e, 0x42, 0x6d, 0x51, 0xa1, + 0x53, 0x4a, 0x84, 0x60, 0x21, 0x29, +}; + +static const uint8_t unicode_prop_Variation_Selector_table[13] = { + 0x58, 0x0a, 0x10, 0x80, 0x60, 0xe5, 0xef, 0x8f, + 0x6d, 0x02, 0xef, 0x40, 0xef, +}; + +static const uint8_t unicode_prop_Bidi_Mirrored_table[173] = { + 0xa7, 0x81, 0x91, 0x00, 0x80, 0x9b, 0x00, 0x80, + 0x9c, 0x00, 0x80, 0xac, 0x80, 0x8e, 0x80, 0x4e, + 0x7d, 0x83, 0x47, 0x5c, 0x81, 0x49, 0x9b, 0x81, + 0x89, 0x81, 0xb5, 0x81, 0x8d, 0x81, 0x40, 0xb0, + 0x80, 0x40, 0xbf, 0x1a, 0x2a, 0x02, 0x0a, 0x18, + 0x18, 0x00, 0x03, 0x88, 0x20, 0x80, 0x91, 0x23, + 0x88, 0x08, 0x00, 0x38, 0x9f, 0x0b, 0x20, 0x88, + 0x09, 0x92, 0x21, 0x88, 0x21, 0x0b, 0x97, 0x81, + 0x8f, 0x3b, 0x93, 0x0e, 0x81, 0x44, 0x3c, 0x8d, + 0xc9, 0x01, 0x18, 0x08, 0x14, 0x1c, 0x12, 0x8d, + 0x41, 0x92, 0x95, 0x0d, 0x80, 0x8d, 0x38, 0x35, + 0x10, 0x1c, 0x01, 0x0c, 0x18, 0x02, 0x09, 0x89, + 0x29, 0x81, 0x8b, 0x92, 0x03, 0x08, 0x00, 0x08, + 0x03, 0x21, 0x2a, 0x97, 0x81, 0x8a, 0x0b, 0x18, + 0x09, 0x0b, 0xaa, 0x0f, 0x80, 0xa7, 0x20, 0x00, + 0x14, 0x22, 0x18, 0x14, 0x00, 0x40, 0xff, 0x80, + 0x42, 0x02, 0x1a, 0x08, 0x81, 0x8d, 0x09, 0x89, + 0xaa, 0x87, 0x41, 0xaa, 0x89, 0x0f, 0x60, 0xce, + 0x3c, 0x2c, 0x81, 0x40, 0xa1, 0x81, 0x91, 0x00, + 0x80, 0x9b, 0x00, 0x80, 0x9c, 0x00, 0x00, 0x08, + 0x81, 0x60, 0xd7, 0x76, 0x80, 0xb8, 0x80, 0xb8, + 0x80, 0xb8, 0x80, 0xb8, 0x80, +}; + +static const uint8_t unicode_prop_Emoji_table[239] = { + 0xa2, 0x05, 0x04, 0x89, 0xee, 0x03, 0x80, 0x5f, + 0x8c, 0x80, 0x8b, 0x80, 0x40, 0xd7, 0x80, 0x95, + 0x80, 0xd9, 0x85, 0x8e, 0x81, 0x41, 0x6e, 0x81, + 0x8b, 0x80, 0x40, 0xa5, 0x80, 0x98, 0x8a, 0x1a, + 0x40, 0xc6, 0x80, 0x40, 0xe6, 0x81, 0x89, 0x80, + 0x88, 0x80, 0xb9, 0x18, 0x84, 0x88, 0x01, 0x01, + 0x09, 0x03, 0x01, 0x00, 0x09, 0x02, 0x02, 0x0f, + 0x14, 0x00, 0x04, 0x8b, 0x8a, 0x09, 0x00, 0x08, + 0x80, 0x91, 0x01, 0x81, 0x91, 0x28, 0x00, 0x0a, + 0x0c, 0x01, 0x0b, 0x81, 0x8a, 0x0c, 0x09, 0x04, + 0x08, 0x00, 0x81, 0x93, 0x0c, 0x28, 0x19, 0x03, + 0x01, 0x01, 0x28, 0x01, 0x00, 0x00, 0x05, 0x02, + 0x05, 0x80, 0x89, 0x81, 0x8e, 0x01, 0x03, 0x00, + 0x03, 0x10, 0x80, 0x8a, 0x81, 0xaf, 0x82, 0x88, + 0x80, 0x8d, 0x80, 0x8d, 0x80, 0x41, 0x73, 0x81, + 0x41, 0xce, 0x82, 0x92, 0x81, 0xb2, 0x03, 0x80, + 0x44, 0xd9, 0x80, 0x8b, 0x80, 0x42, 0x58, 0x00, + 0x80, 0x61, 0xbd, 0x69, 0x80, 0x40, 0xc9, 0x80, + 0x40, 0x9f, 0x81, 0x8b, 0x81, 0x8d, 0x01, 0x89, + 0xca, 0x99, 0x01, 0x96, 0x80, 0x93, 0x01, 0x88, + 0x94, 0x81, 0x40, 0xad, 0xa1, 0x81, 0xef, 0x09, + 0x02, 0x81, 0xd2, 0x0a, 0x80, 0x41, 0x06, 0x80, + 0xbe, 0x8a, 0x28, 0x97, 0x31, 0x0f, 0x8b, 0x01, + 0x19, 0x03, 0x81, 0x8c, 0x09, 0x07, 0x81, 0x88, + 0x04, 0x82, 0x8b, 0x17, 0x11, 0x00, 0x03, 0x05, + 0x02, 0x05, 0xd5, 0xaf, 0xc5, 0x27, 0x0b, 0x82, + 0x89, 0x10, 0x01, 0x10, 0x81, 0x89, 0x40, 0xe2, + 0x8b, 0x18, 0x41, 0x1a, 0xae, 0x80, 0x89, 0x80, + 0x40, 0xb8, 0xef, 0x8c, 0x82, 0x8a, 0x82, 0xb8, + 0x00, 0x83, 0x8f, 0x81, 0x8b, 0x83, 0x89, +}; + +static const uint8_t unicode_prop_Emoji_Component_table[28] = { + 0xa2, 0x05, 0x04, 0x89, 0x5f, 0xd2, 0x80, 0x40, + 0xd4, 0x80, 0x60, 0xdd, 0x2a, 0x80, 0x60, 0xf3, + 0xd5, 0x99, 0x41, 0xfa, 0x84, 0x45, 0xaf, 0x83, + 0x6c, 0x06, 0x6b, 0xdf, +}; + +static const uint8_t unicode_prop_Emoji_Modifier_table[4] = { + 0x61, 0xf3, 0xfa, 0x84, +}; + +static const uint8_t unicode_prop_Emoji_Modifier_Base_table[71] = { + 0x60, 0x26, 0x1c, 0x80, 0x40, 0xda, 0x80, 0x8f, + 0x83, 0x61, 0xcc, 0x76, 0x80, 0xbb, 0x11, 0x01, + 0x82, 0xf4, 0x09, 0x8a, 0x94, 0x92, 0x10, 0x1a, + 0x02, 0x30, 0x00, 0x97, 0x80, 0x40, 0xc8, 0x0b, + 0x80, 0x94, 0x03, 0x81, 0x40, 0xad, 0x12, 0x84, + 0xd2, 0x80, 0x8f, 0x82, 0x88, 0x80, 0x8a, 0x80, + 0x42, 0x3e, 0x01, 0x07, 0x3d, 0x80, 0x88, 0x89, + 0x0a, 0xb7, 0x80, 0xbc, 0x08, 0x08, 0x80, 0x90, + 0x10, 0x8c, 0x40, 0xe4, 0x82, 0xa9, 0x88, +}; + +static const uint8_t unicode_prop_Emoji_Presentation_table[145] = { + 0x60, 0x23, 0x19, 0x81, 0x40, 0xcc, 0x1a, 0x01, + 0x80, 0x42, 0x08, 0x81, 0x94, 0x81, 0xb1, 0x8b, + 0xaa, 0x80, 0x92, 0x80, 0x8c, 0x07, 0x81, 0x90, + 0x0c, 0x0f, 0x04, 0x80, 0x94, 0x06, 0x08, 0x03, + 0x01, 0x06, 0x03, 0x81, 0x9b, 0x80, 0xa2, 0x00, + 0x03, 0x10, 0x80, 0xbc, 0x82, 0x97, 0x80, 0x8d, + 0x80, 0x43, 0x5a, 0x81, 0xb2, 0x03, 0x80, 0x61, + 0xc4, 0xad, 0x80, 0x40, 0xc9, 0x80, 0x40, 0xbd, + 0x01, 0x89, 0xca, 0x99, 0x00, 0x97, 0x80, 0x93, + 0x01, 0x20, 0x82, 0x94, 0x81, 0x40, 0xad, 0xa0, + 0x8b, 0x88, 0x80, 0xc5, 0x80, 0x95, 0x8b, 0xaa, + 0x1c, 0x8b, 0x90, 0x10, 0x82, 0xc6, 0x00, 0x80, + 0x40, 0xba, 0x81, 0xbe, 0x8c, 0x18, 0x97, 0x91, + 0x80, 0x99, 0x81, 0x8c, 0x80, 0xd5, 0xd4, 0xaf, + 0xc5, 0x28, 0x12, 0x0b, 0x13, 0x8a, 0x0e, 0x88, + 0x40, 0xe2, 0x8b, 0x18, 0x41, 0x1a, 0xae, 0x80, + 0x89, 0x80, 0x40, 0xb8, 0xef, 0x8c, 0x82, 0x8a, + 0x82, 0xb8, 0x00, 0x83, 0x8f, 0x81, 0x8b, 0x83, + 0x89, +}; + +static const uint8_t unicode_prop_Extended_Pictographic_table[254] = { + 0x40, 0xa8, 0x03, 0x80, 0x5f, 0x8c, 0x80, 0x8b, + 0x80, 0x40, 0xd7, 0x80, 0x95, 0x80, 0xd9, 0x85, + 0x8e, 0x81, 0x41, 0x6e, 0x81, 0x8b, 0x80, 0x40, + 0xa5, 0x80, 0x98, 0x8a, 0x1a, 0x40, 0xc6, 0x80, + 0x40, 0xe6, 0x81, 0x89, 0x80, 0x88, 0x80, 0xb9, + 0x18, 0x84, 0x88, 0x01, 0x01, 0x09, 0x03, 0x01, + 0x00, 0x09, 0x02, 0x02, 0x0f, 0x14, 0x00, 0x04, + 0x8b, 0x8a, 0x09, 0x00, 0x08, 0x80, 0x91, 0x01, + 0x81, 0x91, 0x28, 0x00, 0x0a, 0x0c, 0x01, 0x0b, + 0x81, 0x8a, 0x0c, 0x09, 0x04, 0x08, 0x00, 0x81, + 0x93, 0x0c, 0x28, 0x19, 0x03, 0x01, 0x01, 0x28, + 0x01, 0x00, 0x00, 0x05, 0x02, 0x05, 0x80, 0x89, + 0x81, 0x8e, 0x01, 0x03, 0x00, 0x03, 0x10, 0x80, + 0x8a, 0x81, 0xaf, 0x82, 0x88, 0x80, 0x8d, 0x80, + 0x8d, 0x80, 0x41, 0x73, 0x81, 0x41, 0xce, 0x82, + 0x92, 0x81, 0xb2, 0x03, 0x80, 0x44, 0xd9, 0x80, + 0x8b, 0x80, 0x42, 0x58, 0x00, 0x80, 0x61, 0xbd, + 0x69, 0x80, 0xa6, 0x83, 0xe3, 0x8b, 0x8e, 0x81, + 0x8e, 0x80, 0x8d, 0x81, 0xa4, 0x89, 0xef, 0x81, + 0x8b, 0x81, 0x8d, 0x01, 0x89, 0x92, 0xb7, 0x9a, + 0x8e, 0x89, 0x80, 0x93, 0x01, 0x88, 0x03, 0x88, + 0x96, 0x85, 0x40, 0xbb, 0x81, 0xef, 0x09, 0x02, + 0x81, 0xd2, 0x0a, 0x03, 0x84, 0x40, 0xfd, 0x80, + 0xbe, 0x8a, 0x28, 0x97, 0x31, 0x0f, 0x8b, 0x01, + 0x19, 0x03, 0x81, 0x8c, 0x09, 0x07, 0x81, 0x88, + 0x04, 0x82, 0x8b, 0x17, 0x11, 0x00, 0x03, 0x05, + 0x02, 0x05, 0xd5, 0xaf, 0xc5, 0x27, 0x81, 0x90, + 0x10, 0x05, 0x81, 0x8c, 0x40, 0xd9, 0xa5, 0x8b, + 0x83, 0xb7, 0x87, 0x89, 0x85, 0xa7, 0x87, 0x9d, + 0x81, 0x8b, 0x19, 0x8d, 0x88, 0xa6, 0x8b, 0xae, + 0x80, 0x89, 0x80, 0x40, 0xb8, 0xd7, 0x87, 0x8d, + 0x40, 0x91, 0x40, 0xff, 0x43, 0xfd, +}; + +static const uint8_t unicode_prop_Default_Ignorable_Code_Point_table[51] = { + 0x40, 0xac, 0x80, 0x42, 0xa0, 0x80, 0x42, 0xcb, + 0x80, 0x4b, 0x41, 0x81, 0x46, 0x52, 0x81, 0xd4, + 0x84, 0x47, 0xfa, 0x84, 0x99, 0x84, 0xb0, 0x8f, + 0x50, 0xf3, 0x80, 0x60, 0xcc, 0x9a, 0x8f, 0x40, + 0xee, 0x80, 0x40, 0x9f, 0x80, 0xce, 0x88, 0x60, + 0xbc, 0xa6, 0x83, 0x54, 0xce, 0x87, 0x6c, 0x2e, + 0x84, 0x4f, 0xff, +}; + +typedef enum { + UNICODE_PROP_Hyphen, + UNICODE_PROP_Other_Math, + UNICODE_PROP_Other_Alphabetic, + UNICODE_PROP_Other_Lowercase, + UNICODE_PROP_Other_Uppercase, + UNICODE_PROP_Other_Grapheme_Extend, + UNICODE_PROP_Other_Default_Ignorable_Code_Point, + UNICODE_PROP_Other_ID_Start, + UNICODE_PROP_Other_ID_Continue, + UNICODE_PROP_Prepended_Concatenation_Mark, + UNICODE_PROP_ID_Continue1, + UNICODE_PROP_XID_Start1, + UNICODE_PROP_XID_Continue1, + UNICODE_PROP_Changes_When_Titlecased1, + UNICODE_PROP_Changes_When_Casefolded1, + UNICODE_PROP_Changes_When_NFKC_Casefolded1, + UNICODE_PROP_ASCII_Hex_Digit, + UNICODE_PROP_Bidi_Control, + UNICODE_PROP_Dash, + UNICODE_PROP_Deprecated, + UNICODE_PROP_Diacritic, + UNICODE_PROP_Extender, + UNICODE_PROP_Hex_Digit, + UNICODE_PROP_IDS_Unary_Operator, + UNICODE_PROP_IDS_Binary_Operator, + UNICODE_PROP_IDS_Trinary_Operator, + UNICODE_PROP_Ideographic, + UNICODE_PROP_Join_Control, + UNICODE_PROP_Logical_Order_Exception, + UNICODE_PROP_Modifier_Combining_Mark, + UNICODE_PROP_Noncharacter_Code_Point, + UNICODE_PROP_Pattern_Syntax, + UNICODE_PROP_Pattern_White_Space, + UNICODE_PROP_Quotation_Mark, + UNICODE_PROP_Radical, + UNICODE_PROP_Regional_Indicator, + UNICODE_PROP_Sentence_Terminal, + UNICODE_PROP_Soft_Dotted, + UNICODE_PROP_Terminal_Punctuation, + UNICODE_PROP_Unified_Ideograph, + UNICODE_PROP_Variation_Selector, + UNICODE_PROP_White_Space, + UNICODE_PROP_Bidi_Mirrored, + UNICODE_PROP_Emoji, + UNICODE_PROP_Emoji_Component, + UNICODE_PROP_Emoji_Modifier, + UNICODE_PROP_Emoji_Modifier_Base, + UNICODE_PROP_Emoji_Presentation, + UNICODE_PROP_Extended_Pictographic, + UNICODE_PROP_Default_Ignorable_Code_Point, + UNICODE_PROP_ID_Start, + UNICODE_PROP_Case_Ignorable, + UNICODE_PROP_ASCII, + UNICODE_PROP_Alphabetic, + UNICODE_PROP_Any, + UNICODE_PROP_Assigned, + UNICODE_PROP_Cased, + UNICODE_PROP_Changes_When_Casefolded, + UNICODE_PROP_Changes_When_Casemapped, + UNICODE_PROP_Changes_When_Lowercased, + UNICODE_PROP_Changes_When_NFKC_Casefolded, + UNICODE_PROP_Changes_When_Titlecased, + UNICODE_PROP_Changes_When_Uppercased, + UNICODE_PROP_Grapheme_Base, + UNICODE_PROP_Grapheme_Extend, + UNICODE_PROP_ID_Continue, + UNICODE_PROP_ID_Compat_Math_Start, + UNICODE_PROP_ID_Compat_Math_Continue, + UNICODE_PROP_Lowercase, + UNICODE_PROP_Math, + UNICODE_PROP_Uppercase, + UNICODE_PROP_XID_Continue, + UNICODE_PROP_XID_Start, + UNICODE_PROP_Cased1, + UNICODE_PROP_InCB, + UNICODE_PROP_COUNT, +} UnicodePropertyEnum; + +static const char unicode_prop_name_table[] = + "ASCII_Hex_Digit,AHex" "\0" + "Bidi_Control,Bidi_C" "\0" + "Dash" "\0" + "Deprecated,Dep" "\0" + "Diacritic,Dia" "\0" + "Extender,Ext" "\0" + "Hex_Digit,Hex" "\0" + "IDS_Unary_Operator,IDSU" "\0" + "IDS_Binary_Operator,IDSB" "\0" + "IDS_Trinary_Operator,IDST" "\0" + "Ideographic,Ideo" "\0" + "Join_Control,Join_C" "\0" + "Logical_Order_Exception,LOE" "\0" + "Modifier_Combining_Mark,MCM" "\0" + "Noncharacter_Code_Point,NChar" "\0" + "Pattern_Syntax,Pat_Syn" "\0" + "Pattern_White_Space,Pat_WS" "\0" + "Quotation_Mark,QMark" "\0" + "Radical" "\0" + "Regional_Indicator,RI" "\0" + "Sentence_Terminal,STerm" "\0" + "Soft_Dotted,SD" "\0" + "Terminal_Punctuation,Term" "\0" + "Unified_Ideograph,UIdeo" "\0" + "Variation_Selector,VS" "\0" + "White_Space,space" "\0" + "Bidi_Mirrored,Bidi_M" "\0" + "Emoji" "\0" + "Emoji_Component,EComp" "\0" + "Emoji_Modifier,EMod" "\0" + "Emoji_Modifier_Base,EBase" "\0" + "Emoji_Presentation,EPres" "\0" + "Extended_Pictographic,ExtPict" "\0" + "Default_Ignorable_Code_Point,DI" "\0" + "ID_Start,IDS" "\0" + "Case_Ignorable,CI" "\0" + "ASCII" "\0" + "Alphabetic,Alpha" "\0" + "Any" "\0" + "Assigned" "\0" + "Cased" "\0" + "Changes_When_Casefolded,CWCF" "\0" + "Changes_When_Casemapped,CWCM" "\0" + "Changes_When_Lowercased,CWL" "\0" + "Changes_When_NFKC_Casefolded,CWKCF" "\0" + "Changes_When_Titlecased,CWT" "\0" + "Changes_When_Uppercased,CWU" "\0" + "Grapheme_Base,Gr_Base" "\0" + "Grapheme_Extend,Gr_Ext" "\0" + "ID_Continue,IDC" "\0" + "ID_Compat_Math_Start" "\0" + "ID_Compat_Math_Continue" "\0" + "Lowercase,Lower" "\0" + "Math" "\0" + "Uppercase,Upper" "\0" + "XID_Continue,XIDC" "\0" + "XID_Start,XIDS" "\0" +; + +static const uint8_t * const unicode_prop_table[] = { + unicode_prop_Hyphen_table, + unicode_prop_Other_Math_table, + unicode_prop_Other_Alphabetic_table, + unicode_prop_Other_Lowercase_table, + unicode_prop_Other_Uppercase_table, + unicode_prop_Other_Grapheme_Extend_table, + unicode_prop_Other_Default_Ignorable_Code_Point_table, + unicode_prop_Other_ID_Start_table, + unicode_prop_Other_ID_Continue_table, + unicode_prop_Prepended_Concatenation_Mark_table, + unicode_prop_ID_Continue1_table, + unicode_prop_XID_Start1_table, + unicode_prop_XID_Continue1_table, + unicode_prop_Changes_When_Titlecased1_table, + unicode_prop_Changes_When_Casefolded1_table, + unicode_prop_Changes_When_NFKC_Casefolded1_table, + unicode_prop_ASCII_Hex_Digit_table, + unicode_prop_Bidi_Control_table, + unicode_prop_Dash_table, + unicode_prop_Deprecated_table, + unicode_prop_Diacritic_table, + unicode_prop_Extender_table, + unicode_prop_Hex_Digit_table, + unicode_prop_IDS_Unary_Operator_table, + unicode_prop_IDS_Binary_Operator_table, + unicode_prop_IDS_Trinary_Operator_table, + unicode_prop_Ideographic_table, + unicode_prop_Join_Control_table, + unicode_prop_Logical_Order_Exception_table, + unicode_prop_Modifier_Combining_Mark_table, + unicode_prop_Noncharacter_Code_Point_table, + unicode_prop_Pattern_Syntax_table, + unicode_prop_Pattern_White_Space_table, + unicode_prop_Quotation_Mark_table, + unicode_prop_Radical_table, + unicode_prop_Regional_Indicator_table, + unicode_prop_Sentence_Terminal_table, + unicode_prop_Soft_Dotted_table, + unicode_prop_Terminal_Punctuation_table, + unicode_prop_Unified_Ideograph_table, + unicode_prop_Variation_Selector_table, + unicode_prop_White_Space_table, + unicode_prop_Bidi_Mirrored_table, + unicode_prop_Emoji_table, + unicode_prop_Emoji_Component_table, + unicode_prop_Emoji_Modifier_table, + unicode_prop_Emoji_Modifier_Base_table, + unicode_prop_Emoji_Presentation_table, + unicode_prop_Extended_Pictographic_table, + unicode_prop_Default_Ignorable_Code_Point_table, + unicode_prop_ID_Start_table, + unicode_prop_Case_Ignorable_table, +}; + +static const uint16_t unicode_prop_len_table[] = { + countof(unicode_prop_Hyphen_table), + countof(unicode_prop_Other_Math_table), + countof(unicode_prop_Other_Alphabetic_table), + countof(unicode_prop_Other_Lowercase_table), + countof(unicode_prop_Other_Uppercase_table), + countof(unicode_prop_Other_Grapheme_Extend_table), + countof(unicode_prop_Other_Default_Ignorable_Code_Point_table), + countof(unicode_prop_Other_ID_Start_table), + countof(unicode_prop_Other_ID_Continue_table), + countof(unicode_prop_Prepended_Concatenation_Mark_table), + countof(unicode_prop_ID_Continue1_table), + countof(unicode_prop_XID_Start1_table), + countof(unicode_prop_XID_Continue1_table), + countof(unicode_prop_Changes_When_Titlecased1_table), + countof(unicode_prop_Changes_When_Casefolded1_table), + countof(unicode_prop_Changes_When_NFKC_Casefolded1_table), + countof(unicode_prop_ASCII_Hex_Digit_table), + countof(unicode_prop_Bidi_Control_table), + countof(unicode_prop_Dash_table), + countof(unicode_prop_Deprecated_table), + countof(unicode_prop_Diacritic_table), + countof(unicode_prop_Extender_table), + countof(unicode_prop_Hex_Digit_table), + countof(unicode_prop_IDS_Unary_Operator_table), + countof(unicode_prop_IDS_Binary_Operator_table), + countof(unicode_prop_IDS_Trinary_Operator_table), + countof(unicode_prop_Ideographic_table), + countof(unicode_prop_Join_Control_table), + countof(unicode_prop_Logical_Order_Exception_table), + countof(unicode_prop_Modifier_Combining_Mark_table), + countof(unicode_prop_Noncharacter_Code_Point_table), + countof(unicode_prop_Pattern_Syntax_table), + countof(unicode_prop_Pattern_White_Space_table), + countof(unicode_prop_Quotation_Mark_table), + countof(unicode_prop_Radical_table), + countof(unicode_prop_Regional_Indicator_table), + countof(unicode_prop_Sentence_Terminal_table), + countof(unicode_prop_Soft_Dotted_table), + countof(unicode_prop_Terminal_Punctuation_table), + countof(unicode_prop_Unified_Ideograph_table), + countof(unicode_prop_Variation_Selector_table), + countof(unicode_prop_White_Space_table), + countof(unicode_prop_Bidi_Mirrored_table), + countof(unicode_prop_Emoji_table), + countof(unicode_prop_Emoji_Component_table), + countof(unicode_prop_Emoji_Modifier_table), + countof(unicode_prop_Emoji_Modifier_Base_table), + countof(unicode_prop_Emoji_Presentation_table), + countof(unicode_prop_Extended_Pictographic_table), + countof(unicode_prop_Default_Ignorable_Code_Point_table), + countof(unicode_prop_ID_Start_table), + countof(unicode_prop_Case_Ignorable_table), +}; + diff --git a/Plugins/Schema/external/quickjs/src/libunicode.c b/Plugins/Schema/external/quickjs/src/libunicode.c new file mode 100644 index 0000000000..a621c5235d --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libunicode.c @@ -0,0 +1,1746 @@ +/* + * Unicode utilities + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include + +#include "cutils.h" +#include "libunicode.h" +#include "libunicode-table.h" + +// note: stored as 4 bit tag, not much room left +enum { + RUN_TYPE_U, + RUN_TYPE_L, + RUN_TYPE_UF, + RUN_TYPE_LF, + RUN_TYPE_UL, + RUN_TYPE_LSU, + RUN_TYPE_U2L_399_EXT2, + RUN_TYPE_UF_D20, + RUN_TYPE_UF_D1_EXT, + RUN_TYPE_U_EXT, + RUN_TYPE_LF_EXT, + RUN_TYPE_UF_EXT2, + RUN_TYPE_LF_EXT2, + RUN_TYPE_UF_EXT3, +}; + +static int lre_case_conv1(uint32_t c, int conv_type) +{ + uint32_t res[LRE_CC_RES_LEN_MAX]; + lre_case_conv(res, c, conv_type); + return res[0]; +} + +/* case conversion using the table entry 'idx' with value 'v' */ +static int lre_case_conv_entry(uint32_t *res, uint32_t c, int conv_type, uint32_t idx, uint32_t v) +{ + uint32_t code, data, type, a, is_lower; + is_lower = (conv_type != 0); + type = (v >> (32 - 17 - 7 - 4)) & 0xf; + data = ((v & 0xf) << 8) | case_conv_table2[idx]; + code = v >> (32 - 17); + switch(type) { + case RUN_TYPE_U: + case RUN_TYPE_L: + case RUN_TYPE_UF: + case RUN_TYPE_LF: + if (conv_type == (type & 1) || + (type >= RUN_TYPE_UF && conv_type == 2)) { + c = c - code + (case_conv_table1[data] >> (32 - 17)); + } + break; + case RUN_TYPE_UL: + a = c - code; + if ((a & 1) != (1 - is_lower)) + break; + c = (a ^ 1) + code; + break; + case RUN_TYPE_LSU: + a = c - code; + if (a == 1) { + c += 2 * is_lower - 1; + } else if (a == (1 - is_lower) * 2) { + c += (2 * is_lower - 1) * 2; + } + break; + case RUN_TYPE_U2L_399_EXT2: + if (!is_lower) { + res[0] = c - code + case_conv_ext[data >> 6]; + res[1] = 0x399; + return 2; + } else { + c = c - code + case_conv_ext[data & 0x3f]; + } + break; + case RUN_TYPE_UF_D20: + if (conv_type == 1) + break; + c = data + (conv_type == 2) * 0x20; + break; + case RUN_TYPE_UF_D1_EXT: + if (conv_type == 1) + break; + c = case_conv_ext[data] + (conv_type == 2); + break; + case RUN_TYPE_U_EXT: + case RUN_TYPE_LF_EXT: + if (is_lower != (type - RUN_TYPE_U_EXT)) + break; + c = case_conv_ext[data]; + break; + case RUN_TYPE_LF_EXT2: + if (!is_lower) + break; + res[0] = c - code + case_conv_ext[data >> 6]; + res[1] = case_conv_ext[data & 0x3f]; + return 2; + case RUN_TYPE_UF_EXT2: + if (conv_type == 1) + break; + res[0] = c - code + case_conv_ext[data >> 6]; + res[1] = case_conv_ext[data & 0x3f]; + if (conv_type == 2) { + /* convert to lower */ + res[0] = lre_case_conv1(res[0], 1); + res[1] = lre_case_conv1(res[1], 1); + } + return 2; + default: + case RUN_TYPE_UF_EXT3: + if (conv_type == 1) + break; + res[0] = case_conv_ext[data >> 8]; + res[1] = case_conv_ext[(data >> 4) & 0xf]; + res[2] = case_conv_ext[data & 0xf]; + if (conv_type == 2) { + /* convert to lower */ + res[0] = lre_case_conv1(res[0], 1); + res[1] = lre_case_conv1(res[1], 1); + res[2] = lre_case_conv1(res[2], 1); + } + return 3; + } + res[0] = c; + return 1; +} + +/* conv_type: + 0 = to upper + 1 = to lower + 2 = case folding (= to lower with modifications) +*/ +int lre_case_conv(uint32_t *res, uint32_t c, int conv_type) +{ + if (c < 128) { + if (conv_type) { + if (c >= 'A' && c <= 'Z') { + c = c - 'A' + 'a'; + } + } else { + if (c >= 'a' && c <= 'z') { + c = c - 'a' + 'A'; + } + } + } else { + uint32_t v, code, len; + int idx, idx_min, idx_max; + + idx_min = 0; + idx_max = countof(case_conv_table1) - 1; + while (idx_min <= idx_max) { + idx = (unsigned)(idx_max + idx_min) / 2; + v = case_conv_table1[idx]; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + if (c < code) { + idx_max = idx - 1; + } else if (c >= code + len) { + idx_min = idx + 1; + } else { + return lre_case_conv_entry(res, c, conv_type, idx, v); + } + } + } + res[0] = c; + return 1; +} + +static int lre_case_folding_entry(uint32_t c, uint32_t idx, uint32_t v, bool is_unicode) +{ + uint32_t res[LRE_CC_RES_LEN_MAX]; + int len; + + if (is_unicode) { + len = lre_case_conv_entry(res, c, 2, idx, v); + if (len == 1) { + c = res[0]; + } else { + /* handle the few specific multi-character cases (see + unicode_gen.c:dump_case_folding_special_cases()) */ + if (c == 0xfb06) { + c = 0xfb05; + } else if (c == 0x01fd3) { + c = 0x390; + } else if (c == 0x01fe3) { + c = 0x3b0; + } + } + } else { + if (likely(c < 128)) { + if (c >= 'a' && c <= 'z') + c = c - 'a' + 'A'; + } else { + /* legacy regexp: to upper case if single char >= 128 */ + len = lre_case_conv_entry(res, c, false, idx, v); + if (len == 1 && res[0] >= 128) + c = res[0]; + } + } + return c; +} + +/* JS regexp specific rules for case folding */ +int lre_canonicalize(uint32_t c, bool is_unicode) +{ + if (c < 128) { + /* fast case */ + if (is_unicode) { + if (c >= 'A' && c <= 'Z') { + c = c - 'A' + 'a'; + } + } else { + if (c >= 'a' && c <= 'z') { + c = c - 'a' + 'A'; + } + } + } else { + uint32_t v, code, len; + int idx, idx_min, idx_max; + + idx_min = 0; + idx_max = countof(case_conv_table1) - 1; + while (idx_min <= idx_max) { + idx = (unsigned)(idx_max + idx_min) / 2; + v = case_conv_table1[idx]; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + if (c < code) { + idx_max = idx - 1; + } else if (c >= code + len) { + idx_min = idx + 1; + } else { + return lre_case_folding_entry(c, idx, v, is_unicode); + } + } + } + return c; +} + +static uint32_t get_le24(const uint8_t *ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16); +} + +#define UNICODE_INDEX_BLOCK_LEN 32 + +/* return -1 if not in table, otherwise the offset in the block */ +static int get_index_pos(uint32_t *pcode, uint32_t c, + const uint8_t *index_table, int index_table_len) +{ + uint32_t code, v; + int idx_min, idx_max, idx; + + idx_min = 0; + v = get_le24(index_table); + code = v & ((1 << 21) - 1); + if (c < code) { + *pcode = 0; + return 0; + } + idx_max = index_table_len - 1; + code = get_le24(index_table + idx_max * 3); + if (c >= code) + return -1; + /* invariant: tab[idx_min] <= c < tab2[idx_max] */ + while ((idx_max - idx_min) > 1) { + idx = (idx_max + idx_min) / 2; + v = get_le24(index_table + idx * 3); + code = v & ((1 << 21) - 1); + if (c < code) { + idx_max = idx; + } else { + idx_min = idx; + } + } + v = get_le24(index_table + idx_min * 3); + *pcode = v & ((1 << 21) - 1); + return (idx_min + 1) * UNICODE_INDEX_BLOCK_LEN + (v >> 21); +} + +static bool lre_is_in_table(uint32_t c, const uint8_t *table, + const uint8_t *index_table, int index_table_len) +{ + uint32_t code, b, bit; + int pos; + const uint8_t *p; + + pos = get_index_pos(&code, c, index_table, index_table_len); + if (pos < 0) + return false; /* outside the table */ + p = table + pos; + bit = 0; + for(;;) { + b = *p++; + if (b < 64) { + code += (b >> 3) + 1; + if (c < code) + return bit; + bit ^= 1; + code += (b & 7) + 1; + } else if (b >= 0x80) { + code += b - 0x80 + 1; + } else if (b < 0x60) { + code += (((b - 0x40) << 8) | p[0]) + 1; + p++; + } else { + code += (((b - 0x60) << 16) | (p[0] << 8) | p[1]) + 1; + p += 2; + } + if (c < code) + return bit; + bit ^= 1; + } +} + +bool lre_is_cased(uint32_t c) +{ + uint32_t v, code, len; + int idx, idx_min, idx_max; + + idx_min = 0; + idx_max = countof(case_conv_table1) - 1; + while (idx_min <= idx_max) { + idx = (unsigned)(idx_max + idx_min) / 2; + v = case_conv_table1[idx]; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + if (c < code) { + idx_max = idx - 1; + } else if (c >= code + len) { + idx_min = idx + 1; + } else { + return true; + } + } + return lre_is_in_table(c, unicode_prop_Cased1_table, + unicode_prop_Cased1_index, + sizeof(unicode_prop_Cased1_index) / 3); +} + +bool lre_is_case_ignorable(uint32_t c) +{ + return lre_is_in_table(c, unicode_prop_Case_Ignorable_table, + unicode_prop_Case_Ignorable_index, + sizeof(unicode_prop_Case_Ignorable_index) / 3); +} + +/* character range */ + +static __maybe_unused void cr_dump(CharRange *cr) +{ + int i; + for(i = 0; i < cr->len; i++) + printf("%d: 0x%04x\n", i, cr->points[i]); +} + +static void *cr_default_realloc(void *opaque, void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +void cr_init(CharRange *cr, void *mem_opaque, DynBufReallocFunc *realloc_func) +{ + cr->len = cr->size = 0; + cr->points = NULL; + cr->mem_opaque = mem_opaque; + cr->realloc_func = realloc_func ? realloc_func : cr_default_realloc; +} + +void cr_free(CharRange *cr) +{ + cr->realloc_func(cr->mem_opaque, cr->points, 0); +} + +int cr_realloc(CharRange *cr, int size) +{ + int new_size; + uint32_t *new_buf; + + if (size > cr->size) { + new_size = max_int(size, cr->size * 3 / 2); + new_buf = cr->realloc_func(cr->mem_opaque, cr->points, + new_size * sizeof(cr->points[0])); + if (!new_buf) + return -1; + cr->points = new_buf; + cr->size = new_size; + } + return 0; +} + +int cr_copy(CharRange *cr, const CharRange *cr1) +{ + if (cr_realloc(cr, cr1->len)) + return -1; + memcpy(cr->points, cr1->points, sizeof(cr->points[0]) * cr1->len); + cr->len = cr1->len; + return 0; +} + +/* merge consecutive intervals and remove empty intervals */ +static void cr_compress(CharRange *cr) +{ + int i, j, k, len; + uint32_t *pt; + + pt = cr->points; + len = cr->len; + i = 0; + j = 0; + k = 0; + while ((i + 1) < len) { + if (pt[i] == pt[i + 1]) { + /* empty interval */ + i += 2; + } else { + j = i; + while ((j + 3) < len && pt[j + 1] == pt[j + 2]) + j += 2; + /* just copy */ + pt[k] = pt[i]; + pt[k + 1] = pt[j + 1]; + k += 2; + i = j + 2; + } + } + cr->len = k; +} + +/* union or intersection */ +int cr_op(CharRange *cr, const uint32_t *a_pt, int a_len, + const uint32_t *b_pt, int b_len, int op) +{ + int a_idx, b_idx, is_in; + uint32_t v; + + a_idx = 0; + b_idx = 0; + for(;;) { + /* get one more point from a or b in increasing order */ + if (a_idx < a_len && b_idx < b_len) { + if (a_pt[a_idx] < b_pt[b_idx]) { + goto a_add; + } else if (a_pt[a_idx] == b_pt[b_idx]) { + v = a_pt[a_idx]; + a_idx++; + b_idx++; + } else { + goto b_add; + } + } else if (a_idx < a_len) { + a_add: + v = a_pt[a_idx++]; + } else if (b_idx < b_len) { + b_add: + v = b_pt[b_idx++]; + } else { + break; + } + /* add the point if the in/out status changes */ + switch(op) { + case CR_OP_UNION: + is_in = (a_idx & 1) | (b_idx & 1); + break; + case CR_OP_INTER: + is_in = (a_idx & 1) & (b_idx & 1); + break; + case CR_OP_XOR: + is_in = (a_idx & 1) ^ (b_idx & 1); + break; + default: + abort(); + } + if (is_in != (cr->len & 1)) { + if (cr_add_point(cr, v)) + return -1; + } + } + cr_compress(cr); + return 0; +} + +int cr_union1(CharRange *cr, const uint32_t *b_pt, int b_len) +{ + CharRange a = *cr; + int ret; + cr->len = 0; + cr->size = 0; + cr->points = NULL; + ret = cr_op(cr, a.points, a.len, b_pt, b_len, CR_OP_UNION); + cr_free(&a); + return ret; +} + +int cr_invert(CharRange *cr) +{ + int len; + len = cr->len; + if (cr_realloc(cr, len + 2)) + return -1; + memmove(cr->points + 1, cr->points, len * sizeof(cr->points[0])); + cr->points[0] = 0; + cr->points[len + 1] = UINT32_MAX; + cr->len = len + 2; + cr_compress(cr); + return 0; +} + +bool lre_is_id_start(uint32_t c) +{ + return lre_is_in_table(c, unicode_prop_ID_Start_table, + unicode_prop_ID_Start_index, + sizeof(unicode_prop_ID_Start_index) / 3); +} + +bool lre_is_id_continue(uint32_t c) +{ + return lre_is_id_start(c) || + lre_is_in_table(c, unicode_prop_ID_Continue1_table, + unicode_prop_ID_Continue1_index, + sizeof(unicode_prop_ID_Continue1_index) / 3); +} + +bool lre_is_white_space(uint32_t c) +{ + return lre_is_in_table(c, unicode_prop_White_Space_table, + unicode_prop_White_Space_index, + sizeof(unicode_prop_White_Space_index) / 3); +} + +#define UNICODE_DECOMP_LEN_MAX 18 + +typedef enum { + DECOMP_TYPE_C1, /* 16 bit char */ + DECOMP_TYPE_L1, /* 16 bit char table */ + DECOMP_TYPE_L2, + DECOMP_TYPE_L3, + DECOMP_TYPE_L4, + DECOMP_TYPE_L5, /* XXX: not used */ + DECOMP_TYPE_L6, /* XXX: could remove */ + DECOMP_TYPE_L7, /* XXX: could remove */ + DECOMP_TYPE_LL1, /* 18 bit char table */ + DECOMP_TYPE_LL2, + DECOMP_TYPE_S1, /* 8 bit char table */ + DECOMP_TYPE_S2, + DECOMP_TYPE_S3, + DECOMP_TYPE_S4, + DECOMP_TYPE_S5, + DECOMP_TYPE_I1, /* increment 16 bit char value */ + DECOMP_TYPE_I2_0, + DECOMP_TYPE_I2_1, + DECOMP_TYPE_I3_1, + DECOMP_TYPE_I3_2, + DECOMP_TYPE_I4_1, + DECOMP_TYPE_I4_2, + DECOMP_TYPE_B1, /* 16 bit base + 8 bit offset */ + DECOMP_TYPE_B2, + DECOMP_TYPE_B3, + DECOMP_TYPE_B4, + DECOMP_TYPE_B5, + DECOMP_TYPE_B6, + DECOMP_TYPE_B7, + DECOMP_TYPE_B8, + DECOMP_TYPE_B18, + DECOMP_TYPE_LS2, + DECOMP_TYPE_PAT3, + DECOMP_TYPE_S2_UL, + DECOMP_TYPE_LS2_UL, +} DecompTypeEnum; + +static uint32_t unicode_get_short_code(uint32_t c) +{ + static const uint16_t unicode_short_table[2] = { 0x2044, 0x2215 }; + + if (c < 0x80) + return c; + else if (c < 0x80 + 0x50) + return c - 0x80 + 0x300; + else + return unicode_short_table[c - 0x80 - 0x50]; +} + +static uint32_t unicode_get_lower_simple(uint32_t c) +{ + if (c < 0x100 || (c >= 0x410 && c <= 0x42f)) + c += 0x20; + else + c++; + return c; +} + +static uint16_t unicode_get16(const uint8_t *p) +{ + return p[0] | (p[1] << 8); +} + +static int unicode_decomp_entry(uint32_t *res, uint32_t c, + int idx, uint32_t code, uint32_t len, + uint32_t type) +{ + uint32_t c1; + int l, i, p; + const uint8_t *d; + + if (type == DECOMP_TYPE_C1) { + res[0] = unicode_decomp_table2[idx]; + return 1; + } else { + d = unicode_decomp_data + unicode_decomp_table2[idx]; + switch(type) { + case DECOMP_TYPE_L1: + case DECOMP_TYPE_L2: + case DECOMP_TYPE_L3: + case DECOMP_TYPE_L4: + case DECOMP_TYPE_L5: + case DECOMP_TYPE_L6: + case DECOMP_TYPE_L7: + l = type - DECOMP_TYPE_L1 + 1; + d += (c - code) * l * 2; + for(i = 0; i < l; i++) { + if ((res[i] = unicode_get16(d + 2 * i)) == 0) + return 0; + } + return l; + case DECOMP_TYPE_LL1: + case DECOMP_TYPE_LL2: + { + uint32_t k, p; + l = type - DECOMP_TYPE_LL1 + 1; + k = (c - code) * l; + p = len * l * 2; + for(i = 0; i < l; i++) { + c1 = unicode_get16(d + 2 * k) | + (((d[p + (k / 4)] >> ((k % 4) * 2)) & 3) << 16); + if (!c1) + return 0; + res[i] = c1; + k++; + } + } + return l; + case DECOMP_TYPE_S1: + case DECOMP_TYPE_S2: + case DECOMP_TYPE_S3: + case DECOMP_TYPE_S4: + case DECOMP_TYPE_S5: + l = type - DECOMP_TYPE_S1 + 1; + d += (c - code) * l; + for(i = 0; i < l; i++) { + if ((res[i] = unicode_get_short_code(d[i])) == 0) + return 0; + } + return l; + case DECOMP_TYPE_I1: + l = 1; + p = 0; + goto decomp_type_i; + case DECOMP_TYPE_I2_0: + case DECOMP_TYPE_I2_1: + case DECOMP_TYPE_I3_1: + case DECOMP_TYPE_I3_2: + case DECOMP_TYPE_I4_1: + case DECOMP_TYPE_I4_2: + l = 2 + ((type - DECOMP_TYPE_I2_0) >> 1); + p = ((type - DECOMP_TYPE_I2_0) & 1) + (l > 2); + decomp_type_i: + for(i = 0; i < l; i++) { + c1 = unicode_get16(d + 2 * i); + if (i == p) + c1 += c - code; + res[i] = c1; + } + return l; + case DECOMP_TYPE_B18: + l = 18; + goto decomp_type_b; + case DECOMP_TYPE_B1: + case DECOMP_TYPE_B2: + case DECOMP_TYPE_B3: + case DECOMP_TYPE_B4: + case DECOMP_TYPE_B5: + case DECOMP_TYPE_B6: + case DECOMP_TYPE_B7: + case DECOMP_TYPE_B8: + l = type - DECOMP_TYPE_B1 + 1; + decomp_type_b: + { + uint32_t c_min; + c_min = unicode_get16(d); + d += 2 + (c - code) * l; + for(i = 0; i < l; i++) { + c1 = d[i]; + if (c1 == 0xff) + c1 = 0x20; + else + c1 += c_min; + res[i] = c1; + } + } + return l; + case DECOMP_TYPE_LS2: + d += (c - code) * 3; + if (!(res[0] = unicode_get16(d))) + return 0; + res[1] = unicode_get_short_code(d[2]); + return 2; + case DECOMP_TYPE_PAT3: + res[0] = unicode_get16(d); + res[2] = unicode_get16(d + 2); + d += 4 + (c - code) * 2; + res[1] = unicode_get16(d); + return 3; + case DECOMP_TYPE_S2_UL: + case DECOMP_TYPE_LS2_UL: + c1 = c - code; + if (type == DECOMP_TYPE_S2_UL) { + d += c1 & ~1; + c = unicode_get_short_code(*d); + d++; + } else { + d += (c1 >> 1) * 3; + c = unicode_get16(d); + d += 2; + } + if (c1 & 1) + c = unicode_get_lower_simple(c); + res[0] = c; + res[1] = unicode_get_short_code(*d); + return 2; + } + } + return 0; +} + + +/* return the length of the decomposition (length <= + UNICODE_DECOMP_LEN_MAX) or 0 if no decomposition */ +static int unicode_decomp_char(uint32_t *res, uint32_t c, bool is_compat1) +{ + uint32_t v, type, is_compat, code, len; + int idx_min, idx_max, idx; + + idx_min = 0; + idx_max = countof(unicode_decomp_table1) - 1; + while (idx_min <= idx_max) { + idx = (idx_max + idx_min) / 2; + v = unicode_decomp_table1[idx]; + code = v >> (32 - 18); + len = (v >> (32 - 18 - 7)) & 0x7f; + // printf("idx=%d code=%05x len=%d\n", idx, code, len); + if (c < code) { + idx_max = idx - 1; + } else if (c >= code + len) { + idx_min = idx + 1; + } else { + is_compat = v & 1; + if (is_compat1 < is_compat) + break; + type = (v >> (32 - 18 - 7 - 6)) & 0x3f; + return unicode_decomp_entry(res, c, idx, code, len, type); + } + } + return 0; +} + +/* return 0 if no pair found */ +static int unicode_compose_pair(uint32_t c0, uint32_t c1) +{ + uint32_t code, len, type, v, idx1, d_idx, d_offset, ch; + int idx_min, idx_max, idx, d; + uint32_t pair[2]; + + idx_min = 0; + idx_max = countof(unicode_comp_table) - 1; + while (idx_min <= idx_max) { + idx = (idx_max + idx_min) / 2; + idx1 = unicode_comp_table[idx]; + + /* idx1 represent an entry of the decomposition table */ + d_idx = idx1 >> 6; + d_offset = idx1 & 0x3f; + v = unicode_decomp_table1[d_idx]; + code = v >> (32 - 18); + len = (v >> (32 - 18 - 7)) & 0x7f; + type = (v >> (32 - 18 - 7 - 6)) & 0x3f; + ch = code + d_offset; + unicode_decomp_entry(pair, ch, d_idx, code, len, type); + d = c0 - pair[0]; + if (d == 0) + d = c1 - pair[1]; + if (d < 0) { + idx_max = idx - 1; + } else if (d > 0) { + idx_min = idx + 1; + } else { + return ch; + } + } + return 0; +} + +/* return the combining class of character c (between 0 and 255) */ +static int unicode_get_cc(uint32_t c) +{ + uint32_t code, n, type, cc, c1, b; + int pos; + const uint8_t *p; + + pos = get_index_pos(&code, c, + unicode_cc_index, sizeof(unicode_cc_index) / 3); + if (pos < 0) + return 0; + p = unicode_cc_table + pos; + for(;;) { + b = *p++; + type = b >> 6; + n = b & 0x3f; + if (n < 48) { + } else if (n < 56) { + n = (n - 48) << 8; + n |= *p++; + n += 48; + } else { + n = (n - 56) << 8; + n |= *p++ << 8; + n |= *p++; + n += 48 + (1 << 11); + } + if (type <= 1) + p++; + c1 = code + n + 1; + if (c < c1) { + switch(type) { + case 0: + cc = p[-1]; + break; + case 1: + cc = p[-1] + c - code; + break; + case 2: + cc = 0; + break; + default: + case 3: + cc = 230; + break; + } + return cc; + } + code = c1; + } +} + +static void sort_cc(int *buf, int len) +{ + int i, j, k, cc, cc1, start, ch1; + + for(i = 0; i < len; i++) { + cc = unicode_get_cc(buf[i]); + if (cc != 0) { + start = i; + j = i + 1; + while (j < len) { + ch1 = buf[j]; + cc1 = unicode_get_cc(ch1); + if (cc1 == 0) + break; + k = j - 1; + while (k >= start) { + if (unicode_get_cc(buf[k]) <= cc1) + break; + buf[k + 1] = buf[k]; + k--; + } + buf[k + 1] = ch1; + j++; + } + i = j; + } + } +} + +static void to_nfd_rec(DynBuf *dbuf, + const int *src, int src_len, int is_compat) +{ + uint32_t c, v; + int i, l; + uint32_t res[UNICODE_DECOMP_LEN_MAX]; + + for(i = 0; i < src_len; i++) { + c = src[i]; + if (c >= 0xac00 && c < 0xd7a4) { + /* Hangul decomposition */ + c -= 0xac00; + dbuf_put_u32(dbuf, 0x1100 + c / 588); + dbuf_put_u32(dbuf, 0x1161 + (c % 588) / 28); + v = c % 28; + if (v != 0) + dbuf_put_u32(dbuf, 0x11a7 + v); + } else { + l = unicode_decomp_char(res, c, is_compat); + if (l) { + to_nfd_rec(dbuf, (int *)res, l, is_compat); + } else { + dbuf_put_u32(dbuf, c); + } + } + } +} + +/* return 0 if not found */ +static int compose_pair(uint32_t c0, uint32_t c1) +{ + /* Hangul composition */ + if (c0 >= 0x1100 && c0 < 0x1100 + 19 && + c1 >= 0x1161 && c1 < 0x1161 + 21) { + return 0xac00 + (c0 - 0x1100) * 588 + (c1 - 0x1161) * 28; + } else if (c0 >= 0xac00 && c0 < 0xac00 + 11172 && + (c0 - 0xac00) % 28 == 0 && + c1 >= 0x11a7 && c1 < 0x11a7 + 28) { + return c0 + c1 - 0x11a7; + } else { + return unicode_compose_pair(c0, c1); + } +} + +int unicode_normalize(uint32_t **pdst, const uint32_t *src, int src_len, + UnicodeNormalizationEnum n_type, + void *opaque, DynBufReallocFunc *realloc_func) +{ + int *buf, buf_len, i, p, starter_pos, cc, last_cc, out_len; + bool is_compat; + DynBuf dbuf_s, *dbuf = &dbuf_s; + + is_compat = n_type >> 1; + + dbuf_init2(dbuf, opaque, realloc_func); + if (dbuf_realloc(dbuf, sizeof(int) * src_len)) + goto fail; + + /* common case: latin1 is unaffected by NFC */ + if (n_type == UNICODE_NFC) { + for(i = 0; i < src_len; i++) { + if (src[i] >= 0x100) + goto not_latin1; + } + buf = (int *)dbuf->buf; + memcpy(buf, src, src_len * sizeof(int)); + *pdst = (uint32_t *)buf; + return src_len; + not_latin1: ; + } + + to_nfd_rec(dbuf, (const int *)src, src_len, is_compat); + if (dbuf_error(dbuf)) { + fail: + *pdst = NULL; + return -1; + } + buf = (int *)dbuf->buf; + buf_len = dbuf->size / sizeof(int); + + sort_cc(buf, buf_len); + + if (buf_len <= 1 || (n_type & 1) != 0) { + /* NFD / NFKD */ + *pdst = (uint32_t *)buf; + return buf_len; + } + + i = 1; + out_len = 1; + while (i < buf_len) { + /* find the starter character and test if it is blocked from + the character at 'i' */ + last_cc = unicode_get_cc(buf[i]); + starter_pos = out_len - 1; + while (starter_pos >= 0) { + cc = unicode_get_cc(buf[starter_pos]); + if (cc == 0) + break; + if (cc >= last_cc) + goto next; + last_cc = 256; + starter_pos--; + } + if (starter_pos >= 0 && + (p = compose_pair(buf[starter_pos], buf[i])) != 0) { + buf[starter_pos] = p; + i++; + } else { + next: + buf[out_len++] = buf[i++]; + } + } + *pdst = (uint32_t *)buf; + return out_len; +} + +/* char ranges for various unicode properties */ + +static int unicode_find_name(const char *name_table, const char *name) +{ + const char *p, *r; + int pos; + size_t name_len, len; + + p = name_table; + pos = 0; + name_len = strlen(name); + while (*p) { + for(;;) { + r = strchr(p, ','); + if (!r) + len = strlen(p); + else + len = r - p; + if (len == name_len && !memcmp(p, name, name_len)) + return pos; + p += len + 1; + if (!r) + break; + } + pos++; + } + return -1; +} + +/* 'cr' must be initialized and empty. Return 0 if OK, -1 if error, -2 + if not found */ +int unicode_script(CharRange *cr, + const char *script_name, bool is_ext) +{ + int script_idx; + const uint8_t *p, *p_end; + uint32_t c, c1, b, n, v, v_len, i, type; + CharRange cr1_s = { 0 }, *cr1 = NULL; + CharRange cr2_s = { 0 }, *cr2 = &cr2_s; + bool is_common; + + script_idx = unicode_find_name(unicode_script_name_table, script_name); + if (script_idx < 0) + return -2; + /* Note: we remove the "Unknown" Script */ + script_idx += UNICODE_SCRIPT_Unknown + 1; + + is_common = (script_idx == UNICODE_SCRIPT_Common || + script_idx == UNICODE_SCRIPT_Inherited); + if (is_ext) { + cr1 = &cr1_s; + cr_init(cr1, cr->mem_opaque, cr->realloc_func); + cr_init(cr2, cr->mem_opaque, cr->realloc_func); + } else { + cr1 = cr; + } + + p = unicode_script_table; + p_end = unicode_script_table + countof(unicode_script_table); + c = 0; + while (p < p_end) { + b = *p++; + type = b >> 7; + n = b & 0x7f; + if (n < 96) { + } else if (n < 112) { + n = (n - 96) << 8; + n |= *p++; + n += 96; + } else { + n = (n - 112) << 16; + n |= *p++ << 8; + n |= *p++; + n += 96 + (1 << 12); + } + if (type == 0) + v = 0; + else + v = *p++; + c1 = c + n + 1; + if (v == script_idx) { + if (cr_add_interval(cr1, c, c1)) + goto fail; + } + c = c1; + } + + if (is_ext) { + /* add the script extensions */ + p = unicode_script_ext_table; + p_end = unicode_script_ext_table + countof(unicode_script_ext_table); + c = 0; + while (p < p_end) { + b = *p++; + if (b < 128) { + n = b; + } else if (b < 128 + 64) { + n = (b - 128) << 8; + n |= *p++; + n += 128; + } else { + n = (b - 128 - 64) << 16; + n |= *p++ << 8; + n |= *p++; + n += 128 + (1 << 14); + } + c1 = c + n + 1; + v_len = *p++; + if (is_common) { + if (v_len != 0) { + if (cr_add_interval(cr2, c, c1)) + goto fail; + } + } else { + for(i = 0; i < v_len; i++) { + if (p[i] == script_idx) { + if (cr_add_interval(cr2, c, c1)) + goto fail; + break; + } + } + } + p += v_len; + c = c1; + } + if (is_common) { + /* remove all the characters with script extensions */ + if (cr_invert(cr2)) + goto fail; + if (cr_op(cr, cr1->points, cr1->len, cr2->points, cr2->len, + CR_OP_INTER)) + goto fail; + } else { + if (cr_op(cr, cr1->points, cr1->len, cr2->points, cr2->len, + CR_OP_UNION)) + goto fail; + } + cr_free(cr1); + cr_free(cr2); + } + return 0; + fail: + if (is_ext) { + cr_free(cr1); + cr_free(cr2); + } + goto fail; +} + +#define M(id) (1U << UNICODE_GC_ ## id) + +static int unicode_general_category1(CharRange *cr, uint32_t gc_mask) +{ + const uint8_t *p, *p_end; + uint32_t c, c0, b, n, v; + + p = unicode_gc_table; + p_end = unicode_gc_table + countof(unicode_gc_table); + c = 0; + while (p < p_end) { + b = *p++; + n = b >> 5; + v = b & 0x1f; + if (n == 7) { + n = *p++; + if (n < 128) { + n += 7; + } else if (n < 128 + 64) { + n = (n - 128) << 8; + n |= *p++; + n += 7 + 128; + } else { + n = (n - 128 - 64) << 16; + n |= *p++ << 8; + n |= *p++; + n += 7 + 128 + (1 << 14); + } + } + c0 = c; + c += n + 1; + if (v == 31) { + /* run of Lu / Ll */ + b = gc_mask & (M(Lu) | M(Ll)); + if (b != 0) { + if (b == (M(Lu) | M(Ll))) { + goto add_range; + } else { + c0 += ((gc_mask & M(Ll)) != 0); + for(; c0 < c; c0 += 2) { + if (cr_add_interval(cr, c0, c0 + 1)) + return -1; + } + } + } + } else if ((gc_mask >> v) & 1) { + add_range: + if (cr_add_interval(cr, c0, c)) + return -1; + } + } + return 0; +} + +static int unicode_prop1(CharRange *cr, int prop_idx) +{ + const uint8_t *p, *p_end; + uint32_t c, c0, b, bit; + + p = unicode_prop_table[prop_idx]; + p_end = p + unicode_prop_len_table[prop_idx]; + c = 0; + bit = 0; + while (p < p_end) { + c0 = c; + b = *p++; + if (b < 64) { + c += (b >> 3) + 1; + if (bit) { + if (cr_add_interval(cr, c0, c)) + return -1; + } + bit ^= 1; + c0 = c; + c += (b & 7) + 1; + } else if (b >= 0x80) { + c += b - 0x80 + 1; + } else if (b < 0x60) { + c += (((b - 0x40) << 8) | p[0]) + 1; + p++; + } else { + c += (((b - 0x60) << 16) | (p[0] << 8) | p[1]) + 1; + p += 2; + } + if (bit) { + if (cr_add_interval(cr, c0, c)) + return -1; + } + bit ^= 1; + } + return 0; +} + +#define CASE_U (1 << 0) +#define CASE_L (1 << 1) +#define CASE_F (1 << 2) + +/* use the case conversion table to generate range of characters. + CASE_U: set char if modified by uppercasing, + CASE_L: set char if modified by lowercasing, + CASE_F: set char if modified by case folding, + */ +static int unicode_case1(CharRange *cr, int case_mask) +{ +#define MR(x) (1 << RUN_TYPE_ ## x) + const uint32_t tab_run_mask[3] = { + MR(U) | MR(UF) | MR(UL) | MR(LSU) | MR(U2L_399_EXT2) | MR(UF_D20) | + MR(UF_D1_EXT) | MR(U_EXT) | MR(UF_EXT2) | MR(UF_EXT3), + + MR(L) | MR(LF) | MR(UL) | MR(LSU) | MR(U2L_399_EXT2) | MR(LF_EXT) | MR(LF_EXT2), + + MR(UF) | MR(LF) | MR(UL) | MR(LSU) | MR(U2L_399_EXT2) | MR(LF_EXT) | MR(LF_EXT2) | MR(UF_D20) | MR(UF_D1_EXT) | MR(LF_EXT) | MR(UF_EXT2) | MR(UF_EXT3), + }; +#undef MR + uint32_t mask, v, code, type, len, i, idx; + + if (case_mask == 0) + return 0; + mask = 0; + for(i = 0; i < 3; i++) { + if ((case_mask >> i) & 1) + mask |= tab_run_mask[i]; + } + for(idx = 0; idx < countof(case_conv_table1); idx++) { + v = case_conv_table1[idx]; + type = (v >> (32 - 17 - 7 - 4)) & 0xf; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + if ((mask >> type) & 1) { + // printf("%d: type=%d %04x %04x\n", idx, type, code, code + len - 1); + switch(type) { + case RUN_TYPE_UL: + if ((case_mask & CASE_U) && (case_mask & (CASE_L | CASE_F))) + goto def_case; + code += ((case_mask & CASE_U) != 0); + for(i = 0; i < len; i += 2) { + if (cr_add_interval(cr, code + i, code + i + 1)) + return -1; + } + break; + case RUN_TYPE_LSU: + if ((case_mask & CASE_U) && (case_mask & (CASE_L | CASE_F))) + goto def_case; + if (!(case_mask & CASE_U)) { + if (cr_add_interval(cr, code, code + 1)) + return -1; + } + if (cr_add_interval(cr, code + 1, code + 2)) + return -1; + if (case_mask & CASE_U) { + if (cr_add_interval(cr, code + 2, code + 3)) + return -1; + } + break; + default: + def_case: + if (cr_add_interval(cr, code, code + len)) + return -1; + break; + } + } + } + return 0; +} + +static int point_cmp(const void *p1, const void *p2, void *arg) +{ + uint32_t v1 = *(uint32_t *)p1; + uint32_t v2 = *(uint32_t *)p2; + return (v1 > v2) - (v1 < v2); +} + +static void cr_sort_and_remove_overlap(CharRange *cr) +{ + uint32_t start, end, start1, end1, i, j; + + /* the resulting ranges are not necessarily sorted and may overlap */ + rqsort(cr->points, cr->len / 2, sizeof(cr->points[0]) * 2, point_cmp, NULL); + j = 0; + for(i = 0; i < cr->len; ) { + start = cr->points[i]; + end = cr->points[i + 1]; + i += 2; + while (i < cr->len) { + start1 = cr->points[i]; + end1 = cr->points[i + 1]; + if (start1 > end) { + /* |------| + * |-------| */ + break; + } else if (end1 <= end) { + /* |------| + * |--| */ + i += 2; + } else { + /* |------| + * |-------| */ + end = end1; + i += 2; + } + } + cr->points[j] = start; + cr->points[j + 1] = end; + j += 2; + } + cr->len = j; +} + +/* canonicalize a character set using the JS regex case folding rules + (see lre_canonicalize()) */ +int cr_regexp_canonicalize(CharRange *cr, bool is_unicode) +{ + CharRange cr_inter, cr_mask, cr_result, cr_sub; + uint32_t v, code, len, i, idx, start, end, c, d_start, d_end, d; + + cr_init(&cr_mask, cr->mem_opaque, cr->realloc_func); + cr_init(&cr_inter, cr->mem_opaque, cr->realloc_func); + cr_init(&cr_result, cr->mem_opaque, cr->realloc_func); + cr_init(&cr_sub, cr->mem_opaque, cr->realloc_func); + + if (unicode_case1(&cr_mask, is_unicode ? CASE_F : CASE_U)) + goto fail; + if (cr_op(&cr_inter, cr_mask.points, cr_mask.len, cr->points, cr->len, CR_OP_INTER)) + goto fail; + + if (cr_invert(&cr_mask)) + goto fail; + if (cr_op(&cr_sub, cr_mask.points, cr_mask.len, cr->points, cr->len, CR_OP_INTER)) + goto fail; + + /* cr_inter = cr & cr_mask */ + /* cr_sub = cr & ~cr_mask */ + + /* use the case conversion table to compute the result */ + d_start = -1; + d_end = -1; + idx = 0; + v = case_conv_table1[idx]; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + for(i = 0; i < cr_inter.len; i += 2) { + start = cr_inter.points[i]; + end = cr_inter.points[i + 1]; + + for(c = start; c < end; c++) { + for(;;) { + if (c >= code && c < code + len) + break; + idx++; + assert(idx < countof(case_conv_table1)); + v = case_conv_table1[idx]; + code = v >> (32 - 17); + len = (v >> (32 - 17 - 7)) & 0x7f; + } + d = lre_case_folding_entry(c, idx, v, is_unicode); + /* try to merge with the current interval */ + if (d_start == -1) { + d_start = d; + d_end = d + 1; + } else if (d_end == d) { + d_end++; + } else { + cr_add_interval(&cr_result, d_start, d_end); + d_start = d; + d_end = d + 1; + } + } + } + if (d_start != -1) { + if (cr_add_interval(&cr_result, d_start, d_end)) + goto fail; + } + + /* the resulting ranges are not necessarily sorted and may overlap */ + cr_sort_and_remove_overlap(&cr_result); + + /* or with the character not affected by the case folding */ + cr->len = 0; + if (cr_op(cr, cr_result.points, cr_result.len, cr_sub.points, cr_sub.len, CR_OP_UNION)) + goto fail; + + cr_free(&cr_inter); + cr_free(&cr_mask); + cr_free(&cr_result); + cr_free(&cr_sub); + return 0; + fail: + cr_free(&cr_inter); + cr_free(&cr_mask); + cr_free(&cr_result); + cr_free(&cr_sub); + return -1; +} + +typedef enum { + POP_GC, + POP_PROP, + POP_CASE, + POP_UNION, + POP_INTER, + POP_XOR, + POP_INVERT, + POP_END, +} PropOPEnum; + +#define POP_STACK_LEN_MAX 4 + +static int unicode_prop_ops(CharRange *cr, ...) +{ + va_list ap; + CharRange stack[POP_STACK_LEN_MAX]; + int stack_len, op, ret, i; + uint32_t a; + + va_start(ap, cr); + stack_len = 0; + for(;;) { + op = va_arg(ap, int); + switch(op) { + case POP_GC: + assert(stack_len < POP_STACK_LEN_MAX); + a = va_arg(ap, int); + cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func); + if (unicode_general_category1(&stack[stack_len - 1], a)) + goto fail; + break; + case POP_PROP: + assert(stack_len < POP_STACK_LEN_MAX); + a = va_arg(ap, int); + cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func); + if (unicode_prop1(&stack[stack_len - 1], a)) + goto fail; + break; + case POP_CASE: + assert(stack_len < POP_STACK_LEN_MAX); + a = va_arg(ap, int); + cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func); + if (unicode_case1(&stack[stack_len - 1], a)) + goto fail; + break; + case POP_UNION: + case POP_INTER: + case POP_XOR: + { + CharRange *cr1, *cr2, *cr3; + assert(stack_len >= 2); + assert(stack_len < POP_STACK_LEN_MAX); + cr1 = &stack[stack_len - 2]; + cr2 = &stack[stack_len - 1]; + cr3 = &stack[stack_len++]; + cr_init(cr3, cr->mem_opaque, cr->realloc_func); + if (cr_op(cr3, cr1->points, cr1->len, + cr2->points, cr2->len, op - POP_UNION + CR_OP_UNION)) + goto fail; + cr_free(cr1); + cr_free(cr2); + *cr1 = *cr3; + stack_len -= 2; + } + break; + case POP_INVERT: + assert(stack_len >= 1); + if (cr_invert(&stack[stack_len - 1])) + goto fail; + break; + case POP_END: + goto done; + default: + abort(); + } + } + done: + va_end(ap); + assert(stack_len == 1); + ret = cr_copy(cr, &stack[0]); + cr_free(&stack[0]); + return ret; + fail: + va_end(ap); + for(i = 0; i < stack_len; i++) + cr_free(&stack[i]); + return -1; +} + +static const uint32_t unicode_gc_mask_table[] = { + M(Lu) | M(Ll) | M(Lt), /* LC */ + M(Lu) | M(Ll) | M(Lt) | M(Lm) | M(Lo), /* L */ + M(Mn) | M(Mc) | M(Me), /* M */ + M(Nd) | M(Nl) | M(No), /* N */ + M(Sm) | M(Sc) | M(Sk) | M(So), /* S */ + M(Pc) | M(Pd) | M(Ps) | M(Pe) | M(Pi) | M(Pf) | M(Po), /* P */ + M(Zs) | M(Zl) | M(Zp), /* Z */ + M(Cc) | M(Cf) | M(Cs) | M(Co) | M(Cn), /* C */ +}; + +/* 'cr' must be initialized and empty. Return 0 if OK, -1 if error, -2 + if not found */ +int unicode_general_category(CharRange *cr, const char *gc_name) +{ + int gc_idx; + uint32_t gc_mask; + + gc_idx = unicode_find_name(unicode_gc_name_table, gc_name); + if (gc_idx < 0) + return -2; + if (gc_idx <= UNICODE_GC_Co) { + gc_mask = (uint64_t)1 << gc_idx; + } else { + gc_mask = unicode_gc_mask_table[gc_idx - UNICODE_GC_LC]; + } + return unicode_general_category1(cr, gc_mask); +} + + +/* 'cr' must be initialized and empty. Return 0 if OK, -1 if error, -2 + if not found */ +int unicode_prop(CharRange *cr, const char *prop_name) +{ + int prop_idx, ret; + + prop_idx = unicode_find_name(unicode_prop_name_table, prop_name); + if (prop_idx < 0) + return -2; + prop_idx += UNICODE_PROP_ASCII_Hex_Digit; + + ret = 0; + switch(prop_idx) { + case UNICODE_PROP_ASCII: + if (cr_add_interval(cr, 0x00, 0x7f + 1)) + return -1; + break; + case UNICODE_PROP_Any: + if (cr_add_interval(cr, 0x00000, 0x10ffff + 1)) + return -1; + break; + case UNICODE_PROP_Assigned: + ret = unicode_prop_ops(cr, + POP_GC, M(Cn), + POP_INVERT, + POP_END); + break; + case UNICODE_PROP_Math: + ret = unicode_prop_ops(cr, + POP_GC, M(Sm), + POP_PROP, UNICODE_PROP_Other_Math, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_Lowercase: + ret = unicode_prop_ops(cr, + POP_GC, M(Ll), + POP_PROP, UNICODE_PROP_Other_Lowercase, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_Uppercase: + ret = unicode_prop_ops(cr, + POP_GC, M(Lu), + POP_PROP, UNICODE_PROP_Other_Uppercase, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_Cased: + ret = unicode_prop_ops(cr, + POP_GC, M(Lu) | M(Ll) | M(Lt), + POP_PROP, UNICODE_PROP_Other_Uppercase, + POP_UNION, + POP_PROP, UNICODE_PROP_Other_Lowercase, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_Alphabetic: + ret = unicode_prop_ops(cr, + POP_GC, M(Lu) | M(Ll) | M(Lt) | M(Lm) | M(Lo) | M(Nl), + POP_PROP, UNICODE_PROP_Other_Uppercase, + POP_UNION, + POP_PROP, UNICODE_PROP_Other_Lowercase, + POP_UNION, + POP_PROP, UNICODE_PROP_Other_Alphabetic, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_Grapheme_Base: + ret = unicode_prop_ops(cr, + POP_GC, M(Cc) | M(Cf) | M(Cs) | M(Co) | M(Cn) | M(Zl) | M(Zp) | M(Me) | M(Mn), + POP_PROP, UNICODE_PROP_Other_Grapheme_Extend, + POP_UNION, + POP_INVERT, + POP_END); + break; + case UNICODE_PROP_Grapheme_Extend: + ret = unicode_prop_ops(cr, + POP_GC, M(Me) | M(Mn), + POP_PROP, UNICODE_PROP_Other_Grapheme_Extend, + POP_UNION, + POP_END); + break; + case UNICODE_PROP_XID_Start: + ret = unicode_prop_ops(cr, + POP_GC, M(Lu) | M(Ll) | M(Lt) | M(Lm) | M(Lo) | M(Nl), + POP_PROP, UNICODE_PROP_Other_ID_Start, + POP_UNION, + POP_PROP, UNICODE_PROP_Pattern_Syntax, + POP_PROP, UNICODE_PROP_Pattern_White_Space, + POP_UNION, + POP_PROP, UNICODE_PROP_XID_Start1, + POP_UNION, + POP_INVERT, + POP_INTER, + POP_END); + break; + case UNICODE_PROP_XID_Continue: + ret = unicode_prop_ops(cr, + POP_GC, M(Lu) | M(Ll) | M(Lt) | M(Lm) | M(Lo) | M(Nl) | + M(Mn) | M(Mc) | M(Nd) | M(Pc), + POP_PROP, UNICODE_PROP_Other_ID_Start, + POP_UNION, + POP_PROP, UNICODE_PROP_Other_ID_Continue, + POP_UNION, + POP_PROP, UNICODE_PROP_Pattern_Syntax, + POP_PROP, UNICODE_PROP_Pattern_White_Space, + POP_UNION, + POP_PROP, UNICODE_PROP_XID_Continue1, + POP_UNION, + POP_INVERT, + POP_INTER, + POP_END); + break; + case UNICODE_PROP_Changes_When_Uppercased: + ret = unicode_case1(cr, CASE_U); + break; + case UNICODE_PROP_Changes_When_Lowercased: + ret = unicode_case1(cr, CASE_L); + break; + case UNICODE_PROP_Changes_When_Casemapped: + ret = unicode_case1(cr, CASE_U | CASE_L | CASE_F); + break; + case UNICODE_PROP_Changes_When_Titlecased: + ret = unicode_prop_ops(cr, + POP_CASE, CASE_U, + POP_PROP, UNICODE_PROP_Changes_When_Titlecased1, + POP_XOR, + POP_END); + break; + case UNICODE_PROP_Changes_When_Casefolded: + ret = unicode_prop_ops(cr, + POP_CASE, CASE_F, + POP_PROP, UNICODE_PROP_Changes_When_Casefolded1, + POP_XOR, + POP_END); + break; + case UNICODE_PROP_Changes_When_NFKC_Casefolded: + ret = unicode_prop_ops(cr, + POP_CASE, CASE_F, + POP_PROP, UNICODE_PROP_Changes_When_NFKC_Casefolded1, + POP_XOR, + POP_END); + break; + /* we use the existing tables */ + case UNICODE_PROP_ID_Continue: + ret = unicode_prop_ops(cr, + POP_PROP, UNICODE_PROP_ID_Start, + POP_PROP, UNICODE_PROP_ID_Continue1, + POP_XOR, + POP_END); + break; + default: + if (prop_idx >= countof(unicode_prop_table)) + return -2; + ret = unicode_prop1(cr, prop_idx); + break; + } + return ret; +} diff --git a/Plugins/Schema/external/quickjs/src/libunicode.h b/Plugins/Schema/external/quickjs/src/libunicode.h new file mode 100644 index 0000000000..8e6f2a01dc --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/libunicode.h @@ -0,0 +1,126 @@ +/* + * Unicode utilities + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef LIBUNICODE_H +#define LIBUNICODE_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define LRE_CC_RES_LEN_MAX 3 + +typedef enum { + UNICODE_NFC, + UNICODE_NFD, + UNICODE_NFKC, + UNICODE_NFKD, +} UnicodeNormalizationEnum; + +int lre_case_conv(uint32_t *res, uint32_t c, int conv_type); +int lre_canonicalize(uint32_t c, bool is_unicode); +bool lre_is_cased(uint32_t c); +bool lre_is_case_ignorable(uint32_t c); + +/* char ranges */ + +typedef struct { + int len; /* in points, always even */ + int size; + uint32_t *points; /* points sorted by increasing value */ + void *mem_opaque; + void *(*realloc_func)(void *opaque, void *ptr, size_t size); +} CharRange; + +typedef enum { + CR_OP_UNION, + CR_OP_INTER, + CR_OP_XOR, +} CharRangeOpEnum; + +void cr_init(CharRange *cr, void *mem_opaque, void *(*realloc_func)(void *opaque, void *ptr, size_t size)); +void cr_free(CharRange *cr); +int cr_realloc(CharRange *cr, int size); +int cr_copy(CharRange *cr, const CharRange *cr1); + +static inline int cr_add_point(CharRange *cr, uint32_t v) +{ + if (cr->len >= cr->size) { + if (cr_realloc(cr, cr->len + 1)) + return -1; + } + cr->points[cr->len++] = v; + return 0; +} + +static inline int cr_add_interval(CharRange *cr, uint32_t c1, uint32_t c2) +{ + if ((cr->len + 2) > cr->size) { + if (cr_realloc(cr, cr->len + 2)) + return -1; + } + cr->points[cr->len++] = c1; + cr->points[cr->len++] = c2; + return 0; +} + +int cr_union1(CharRange *cr, const uint32_t *b_pt, int b_len); + +static inline int cr_union_interval(CharRange *cr, uint32_t c1, uint32_t c2) +{ + uint32_t b_pt[2]; + b_pt[0] = c1; + b_pt[1] = c2 + 1; + return cr_union1(cr, b_pt, 2); +} + +int cr_op(CharRange *cr, const uint32_t *a_pt, int a_len, + const uint32_t *b_pt, int b_len, int op); + +int cr_invert(CharRange *cr); +int cr_regexp_canonicalize(CharRange *cr, bool is_unicode); + +bool lre_is_id_start(uint32_t c); +bool lre_is_id_continue(uint32_t c); +bool lre_is_white_space(uint32_t c); + +int unicode_normalize(uint32_t **pdst, const uint32_t *src, int src_len, + UnicodeNormalizationEnum n_type, + void *opaque, void *(*realloc_func)(void *opaque, void *ptr, size_t size)); + +/* Unicode character range functions */ + +int unicode_script(CharRange *cr, + const char *script_name, bool is_ext); +int unicode_general_category(CharRange *cr, const char *gc_name); +int unicode_prop(CharRange *cr, const char *prop_name); + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + +#endif /* LIBUNICODE_H */ diff --git a/Plugins/Schema/external/quickjs/src/list.h b/Plugins/Schema/external/quickjs/src/list.h new file mode 100644 index 0000000000..b8dd716814 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/list.h @@ -0,0 +1,107 @@ +/* + * Linux klist like system + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef LIST_H +#define LIST_H + +#ifndef NULL +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct list_head { + struct list_head *prev; + struct list_head *next; +}; + +#define LIST_HEAD_INIT(el) { &(el), &(el) } + +/* return the pointer of type 'type *' containing 'el' as field 'member' */ +#define list_entry(el, type, member) container_of(el, type, member) + +static inline void init_list_head(struct list_head *head) +{ + head->prev = head; + head->next = head; +} + +/* insert 'el' between 'prev' and 'next' */ +static inline void __list_add(struct list_head *el, + struct list_head *prev, struct list_head *next) +{ + prev->next = el; + el->prev = prev; + el->next = next; + next->prev = el; +} + +/* add 'el' at the head of the list 'head' (= after element head) */ +static inline void list_add(struct list_head *el, struct list_head *head) +{ + __list_add(el, head, head->next); +} + +/* add 'el' at the end of the list 'head' (= before element head) */ +static inline void list_add_tail(struct list_head *el, struct list_head *head) +{ + __list_add(el, head->prev, head); +} + +static inline void list_del(struct list_head *el) +{ + struct list_head *prev, *next; + prev = el->prev; + next = el->next; + prev->next = next; + next->prev = prev; + el->prev = NULL; /* fail safe */ + el->next = NULL; /* fail safe */ +} + +static inline int list_empty(struct list_head *el) +{ + return el->next == el; +} + +#define list_for_each(el, head) \ + for(el = (head)->next; el != (head); el = el->next) + +#define list_for_each_safe(el, el1, head) \ + for(el = (head)->next, el1 = el->next; el != (head); \ + el = el1, el1 = el->next) + +#define list_for_each_prev(el, head) \ + for(el = (head)->prev; el != (head); el = el->prev) + +#define list_for_each_prev_safe(el, el1, head) \ + for(el = (head)->prev, el1 = el->prev; el != (head); \ + el = el1, el1 = el->prev) + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + +#endif /* LIST_H */ diff --git a/Plugins/Schema/external/quickjs/src/qjs.c b/Plugins/Schema/external/quickjs/src/qjs.c new file mode 100644 index 0000000000..17ef54a082 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/qjs.c @@ -0,0 +1,748 @@ +/* + * QuickJS stand alone interpreter + * + * Copyright (c) 2017-2021 Fabrice Bellard + * Copyright (c) 2017-2021 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cutils.h" +#include "quickjs.h" +#include "quickjs-libc.h" + +#ifdef QJS_USE_MIMALLOC +#include +#endif + +extern const uint8_t qjsc_repl[]; +extern const uint32_t qjsc_repl_size; +extern const uint8_t qjsc_standalone[]; +extern const uint32_t qjsc_standalone_size; + +// Must match standalone.js +#define TRAILER_SIZE 12 +static const char trailer_magic[] = "quickjs2"; +static const int trailer_magic_size = sizeof(trailer_magic) - 1; +static const int trailer_size = TRAILER_SIZE; + +static int qjs__argc; +static char **qjs__argv; + + +static bool is_standalone(const char *exe) +{ + FILE *exe_f = fopen(exe, "rb"); + if (!exe_f) + return false; + if (fseek(exe_f, -trailer_size, SEEK_END) < 0) + goto fail; + uint8_t buf[TRAILER_SIZE]; + if (fread(buf, 1, trailer_size, exe_f) != trailer_size) + goto fail; + fclose(exe_f); + return !memcmp(buf, trailer_magic, trailer_magic_size); +fail: + fclose(exe_f); + return false; +} + +static JSValue load_standalone_module(JSContext *ctx) +{ + JSModuleDef *m; + JSValue obj, val; + obj = JS_ReadObject(ctx, qjsc_standalone, qjsc_standalone_size, JS_READ_OBJ_BYTECODE); + if (JS_IsException(obj)) + goto exception; + assert(JS_VALUE_GET_TAG(obj) == JS_TAG_MODULE); + if (JS_ResolveModule(ctx, obj) < 0) { + JS_FreeValue(ctx, obj); + goto exception; + } + if (js_module_set_import_meta(ctx, obj, false, true) < 0) { + JS_FreeValue(ctx, obj); + goto exception; + } + val = JS_EvalFunction(ctx, JS_DupValue(ctx, obj)); + val = js_std_await(ctx, val); + + if (JS_IsException(val)) { + JS_FreeValue(ctx, obj); + exception: + js_std_dump_error(ctx); + exit(1); + } + JS_FreeValue(ctx, val); + + m = JS_VALUE_GET_PTR(obj); + JS_FreeValue(ctx, obj); + return JS_GetModuleNamespace(ctx, m); +} + +static int eval_buf(JSContext *ctx, const void *buf, int buf_len, + const char *filename, int eval_flags) +{ + bool use_realpath; + JSValue val; + int ret; + + if ((eval_flags & JS_EVAL_TYPE_MASK) == JS_EVAL_TYPE_MODULE) { + /* for the modules, we compile then run to be able to set + import.meta */ + val = JS_Eval(ctx, buf, buf_len, filename, + eval_flags | JS_EVAL_FLAG_COMPILE_ONLY); + if (!JS_IsException(val)) { + // ex. "" pr "/dev/stdin" + use_realpath = + !(*filename == '<' || !strncmp(filename, "/dev/", 5)); + if (js_module_set_import_meta(ctx, val, use_realpath, true) < 0) { + js_std_dump_error(ctx); + ret = -1; + goto end; + } + val = JS_EvalFunction(ctx, val); + } + val = js_std_await(ctx, val); + } else { + val = JS_Eval(ctx, buf, buf_len, filename, eval_flags); + } + if (JS_IsException(val)) { + js_std_dump_error(ctx); + ret = -1; + } else { + ret = 0; + } +end: + JS_FreeValue(ctx, val); + return ret; +} + +static int eval_file(JSContext *ctx, const char *filename, int module) +{ + uint8_t *buf; + int ret, eval_flags; + size_t buf_len; + + buf = js_load_file(ctx, &buf_len, filename); + if (!buf) { + perror(filename); + exit(1); + } + + if (module < 0) { + module = (js__has_suffix(filename, ".mjs") || + JS_DetectModule((const char *)buf, buf_len)); + } + if (module) + eval_flags = JS_EVAL_TYPE_MODULE; + else + eval_flags = JS_EVAL_TYPE_GLOBAL; + ret = eval_buf(ctx, buf, buf_len, filename, eval_flags); + js_free(ctx, buf); + return ret; +} + +static int64_t parse_limit(const char *arg) { + char *p; + unsigned long unit = 1024; /* default to traditional KB */ + double d = strtod(arg, &p); + + if (p == arg) { + fprintf(stderr, "Invalid limit: %s\n", arg); + return -1; + } + + if (*p) { + switch (*p++) { + case 'b': case 'B': unit = 1UL << 0; break; + case 'k': case 'K': unit = 1UL << 10; break; /* IEC kibibytes */ + case 'm': case 'M': unit = 1UL << 20; break; /* IEC mebibytes */ + case 'g': case 'G': unit = 1UL << 30; break; /* IEC gigibytes */ + default: + fprintf(stderr, "Invalid limit: %s, unrecognized suffix, only k,m,g are allowed\n", arg); + return -1; + } + if (*p) { + fprintf(stderr, "Invalid limit: %s, only one suffix allowed\n", arg); + return -1; + } + } + + return (int64_t)(d * unit); +} + +static JSValue js_gc(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JS_RunGC(JS_GetRuntime(ctx)); + return JS_UNDEFINED; +} + +static JSValue js_navigator_get_userAgent(JSContext *ctx, JSValueConst this_val) +{ + char version[32]; + snprintf(version, sizeof(version), "quickjs-ng/%s", JS_GetVersion()); + return JS_NewString(ctx, version); +} + +static const JSCFunctionListEntry navigator_proto_funcs[] = { + JS_CGETSET_DEF2("userAgent", js_navigator_get_userAgent, NULL, JS_PROP_CONFIGURABLE | JS_PROP_ENUMERABLE), + JS_PROP_STRING_DEF("[Symbol.toStringTag]", "Navigator", JS_PROP_CONFIGURABLE), +}; + +static const JSCFunctionListEntry global_obj[] = { + JS_CFUNC_DEF("gc", 0, js_gc), +}; + +/* also used to initialize the worker context */ +static JSContext *JS_NewCustomContext(JSRuntime *rt) +{ + JSContext *ctx; + ctx = JS_NewContext(rt); + if (!ctx) + return NULL; + /* system modules */ + js_init_module_std(ctx, "qjs:std"); + js_init_module_os(ctx, "qjs:os"); + js_init_module_bjson(ctx, "qjs:bjson"); + + JSValue global = JS_GetGlobalObject(ctx); + JS_SetPropertyFunctionList(ctx, global, global_obj, countof(global_obj)); + JSValue args = JS_NewArray(ctx); + int i; + for(i = 0; i < qjs__argc; i++) { + JS_SetPropertyUint32(ctx, args, i, JS_NewString(ctx, qjs__argv[i])); + } + JS_SetPropertyStr(ctx, global, "execArgv", args); + JS_SetPropertyStr(ctx, global, "argv0", JS_NewString(ctx, qjs__argv[0])); + JSValue navigator_proto = JS_NewObject(ctx); + JS_SetPropertyFunctionList(ctx, navigator_proto, navigator_proto_funcs, countof(navigator_proto_funcs)); + JSValue navigator = JS_NewObjectProto(ctx, navigator_proto); + JS_DefinePropertyValueStr(ctx, global, "navigator", navigator, JS_PROP_CONFIGURABLE | JS_PROP_ENUMERABLE); + JS_FreeValue(ctx, global); + JS_FreeValue(ctx, navigator_proto); + + return ctx; +} + +struct trace_malloc_data { + uint8_t *base; +}; + +static inline unsigned long long js_trace_malloc_ptr_offset(uint8_t *ptr, + struct trace_malloc_data *dp) +{ + return ptr - dp->base; +} + +static void JS_PRINTF_FORMAT_ATTR(2, 3) js_trace_malloc_printf(void *opaque, JS_PRINTF_FORMAT const char *fmt, ...) +{ + va_list ap; + int c; + + va_start(ap, fmt); + while ((c = *fmt++) != '\0') { + if (c == '%') { + /* only handle %p and %zd */ + if (*fmt == 'p') { + uint8_t *ptr = va_arg(ap, void *); + if (ptr == NULL) { + printf("NULL"); + } else { + printf("H%+06lld.%zd", + js_trace_malloc_ptr_offset(ptr, opaque), + js__malloc_usable_size(ptr)); + } + fmt++; + continue; + } + if (fmt[0] == 'z' && fmt[1] == 'd') { + size_t sz = va_arg(ap, size_t); + printf("%zd", sz); + fmt += 2; + continue; + } + } + putc(c, stdout); + } + va_end(ap); +} + +static void js_trace_malloc_init(struct trace_malloc_data *s) +{ + free(s->base = malloc(8)); +} + +static void *js_trace_calloc(void *opaque, size_t count, size_t size) +{ + void *ptr; + ptr = calloc(count, size); + js_trace_malloc_printf(opaque, "C %zd %zd -> %p\n", count, size, ptr); + return ptr; +} + +static void *js_trace_malloc(void *opaque, size_t size) +{ + void *ptr; + ptr = malloc(size); + js_trace_malloc_printf(opaque, "A %zd -> %p\n", size, ptr); + return ptr; +} + +static void js_trace_free(void *opaque, void *ptr) +{ + if (!ptr) + return; + js_trace_malloc_printf(opaque, "F %p\n", ptr); + free(ptr); +} + +static void *js_trace_realloc(void *opaque, void *ptr, size_t size) +{ + js_trace_malloc_printf(opaque, "R %zd %p", size, ptr); + ptr = realloc(ptr, size); + js_trace_malloc_printf(opaque, " -> %p\n", ptr); + return ptr; +} + +static const JSMallocFunctions trace_mf = { + js_trace_calloc, + js_trace_malloc, + js_trace_free, + js_trace_realloc, + js__malloc_usable_size +}; + +#ifdef QJS_USE_MIMALLOC +static void *js_mi_calloc(void *opaque, size_t count, size_t size) +{ + return mi_calloc(count, size); +} + +static void *js_mi_malloc(void *opaque, size_t size) +{ + return mi_malloc(size); +} + +static void js_mi_free(void *opaque, void *ptr) +{ + if (!ptr) + return; + mi_free(ptr); +} + +static void *js_mi_realloc(void *opaque, void *ptr, size_t size) +{ + return mi_realloc(ptr, size); +} + +static const JSMallocFunctions mi_mf = { + js_mi_calloc, + js_mi_malloc, + js_mi_free, + js_mi_realloc, + mi_malloc_usable_size +}; +#endif + +#define PROG_NAME "qjs" + +void help(void) +{ + printf("QuickJS-ng version %s\n" + "usage: " PROG_NAME " [options] [file [args]]\n" + "-h --help list options\n" + "-e --eval EXPR evaluate EXPR\n" + "-i --interactive go to interactive mode\n" + "-C --script load as JS classic script (default=autodetect)\n" + "-m --module load as ES module (default=autodetect)\n" + "-I --include file include an additional file\n" + " --std make 'std', 'os' and 'bjson' available to script\n" + "-T --trace trace memory allocation\n" + "-d --dump dump the memory usage stats\n" + "-D --dump-flags flags for dumping debug data (see DUMP_* defines)\n" + "-c --compile FILE compile the given JS file as a standalone executable\n" + "-o --out FILE output file for standalone executables\n" + " --exe select the executable to use as the base, defaults to the current one\n" + " --memory-limit n limit the memory usage to 'n' Kbytes\n" + " --stack-size n limit the stack size to 'n' Kbytes\n" + "-q --quit just instantiate the interpreter and quit\n", JS_GetVersion()); + exit(1); +} + +int main(int argc, char **argv) +{ + JSRuntime *rt; + JSContext *ctx; + JSValue ret = JS_UNDEFINED; + 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; + char *dump_flags_str = NULL; + char *out = NULL; + int standalone = 0; + int interactive = 0; + int dump_memory = 0; + int dump_flags = 0; + int trace_memory = 0; + int empty_run = 0; + int module = -1; + int load_std = 0; + char *include_list[32]; + int i, include_count = 0; + int64_t memory_limit = -1; + int64_t stack_size = -1; + + /* save for later */ + qjs__argc = argc; + qjs__argv = argv; + + /* check if this is a standalone executable */ + + if (!js_exepath(exebuf, &exebuf_size) && is_standalone(exebuf)) { + standalone = 1; + goto start; + } + + dump_flags_str = getenv("QJS_DUMP_FLAGS"); + dump_flags = dump_flags_str ? strtol(dump_flags_str, NULL, 16) : 0; + + /* cannot use getopt because we want to pass the command line to + the script */ + while (optind < argc && *argv[optind] == '-') { + char *arg = argv[optind] + 1; + const char *longopt = ""; + char *optarg = NULL; + /* a single - is not an option, it also stops argument scanning */ + if (!*arg) + break; + optind++; + if (*arg == '-') { + longopt = arg + 1; + optarg = strchr(longopt, '='); + if (optarg) + *optarg++ = '\0'; + arg += strlen(arg); + /* -- stops argument scanning */ + if (!*longopt) + break; + } + for (; *arg || *longopt; longopt = "") { + char opt = *arg; + if (opt) { + arg++; + if (!optarg && *arg) + optarg = arg; + } + if (opt == 'h' || opt == '?' || !strcmp(longopt, "help")) { + help(); + continue; + } + if (opt == 'e' || !strcmp(longopt, "eval")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "qjs: missing expression for -e\n"); + exit(1); + } + optarg = argv[optind++]; + } + expr = optarg; + break; + } + if (opt == 'I' || !strcmp(longopt, "include")) { + if (optind >= argc) { + fprintf(stderr, "expecting filename"); + exit(1); + } + if (include_count >= countof(include_list)) { + fprintf(stderr, "too many included files"); + exit(1); + } + include_list[include_count++] = argv[optind++]; + continue; + } + if (opt == 'i' || !strcmp(longopt, "interactive")) { + interactive++; + continue; + } + if (opt == 'm' || !strcmp(longopt, "module")) { + module = 1; + continue; + } + if (opt == 'C' || !strcmp(longopt, "script")) { + module = 0; + continue; + } + if (opt == 'd' || !strcmp(longopt, "dump")) { + dump_memory++; + continue; + } + if (opt == 'D' || !strcmp(longopt, "dump-flags")) { + dump_flags = optarg ? strtol(optarg, NULL, 16) : 0; + break; + } + if (opt == 'T' || !strcmp(longopt, "trace")) { + trace_memory++; + continue; + } + if (!strcmp(longopt, "std")) { + load_std = 1; + continue; + } + if (opt == 'q' || !strcmp(longopt, "quit")) { + empty_run++; + continue; + } + if (!strcmp(longopt, "memory-limit")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "expecting memory limit"); + exit(1); + } + optarg = argv[optind++]; + } + memory_limit = parse_limit(optarg); + break; + } + if (!strcmp(longopt, "stack-size")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "expecting stack size"); + exit(1); + } + optarg = argv[optind++]; + } + stack_size = parse_limit(optarg); + break; + } + if (opt == 'c' || !strcmp(longopt, "compile")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "qjs: missing file for -c\n"); + exit(1); + } + optarg = argv[optind++]; + } + compile_file = optarg; + break; + } + if (opt == 'o' || !strcmp(longopt, "out")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "qjs: missing file for -o\n"); + exit(1); + } + optarg = argv[optind++]; + } + out = optarg; + break; + } + if (!strcmp(longopt, "exe")) { + if (!optarg) { + if (optind >= argc) { + fprintf(stderr, "qjs: missing file for --exe\n"); + exit(1); + } + optarg = argv[optind++]; + } + exe = optarg; + break; + } + if (opt) { + fprintf(stderr, "qjs: unknown option '-%c'\n", opt); + } else { + fprintf(stderr, "qjs: unknown option '--%s'\n", longopt); + } + help(); + } + } + + if (compile_file && !out) + help(); + +start: + + if (trace_memory) { + js_trace_malloc_init(&trace_data); + rt = JS_NewRuntime2(&trace_mf, &trace_data); + } else { +#ifdef QJS_USE_MIMALLOC + rt = JS_NewRuntime2(&mi_mf, NULL); +#else + rt = JS_NewRuntime(); +#endif + } + if (!rt) { + fprintf(stderr, "qjs: cannot allocate JS runtime\n"); + exit(2); + } + if (memory_limit >= 0) + JS_SetMemoryLimit(rt, (size_t)memory_limit); + if (stack_size >= 0) + JS_SetMaxStackSize(rt, (size_t)stack_size); + if (dump_flags != 0) + JS_SetDumpFlags(rt, dump_flags); + js_std_set_worker_new_context_func(JS_NewCustomContext); + js_std_init_handlers(rt); + ctx = JS_NewCustomContext(rt); + if (!ctx) { + fprintf(stderr, "qjs: cannot allocate JS context\n"); + exit(2); + } + + /* loader for ES6 modules */ + JS_SetModuleLoaderFunc2(rt, NULL, js_module_loader, js_module_check_attributes, NULL); + + /* exit on unhandled promise rejections */ + JS_SetHostPromiseRejectionTracker(rt, js_std_promise_rejection_tracker, NULL); + + if (!empty_run) { + js_std_add_helpers(ctx, argc - optind, argv + optind); + + /* make 'std' and 'os' visible to non module code */ + if (load_std) { + const char *str = + "import * as bjson from 'qjs:bjson';\n" + "import * as std from 'qjs:std';\n" + "import * as os from 'qjs:os';\n" + "globalThis.bjson = bjson;\n" + "globalThis.std = std;\n" + "globalThis.os = os;\n"; + eval_buf(ctx, str, strlen(str), "", JS_EVAL_TYPE_MODULE); + } + + for(i = 0; i < include_count; i++) { + if (eval_file(ctx, include_list[i], 0)) + goto fail; + } + + if (standalone) { + JSValue ns = load_standalone_module(ctx); + if (JS_IsException(ns)) + goto fail; + JSValue func = JS_GetPropertyStr(ctx, ns, "runStandalone"); + JS_FreeValue(ctx, ns); + if (JS_IsException(func)) + goto fail; + ret = JS_Call(ctx, func, JS_UNDEFINED, 0, NULL); + JS_FreeValue(ctx, func); + } else if (compile_file) { + JSValue ns = load_standalone_module(ctx); + if (JS_IsException(ns)) + goto fail; + JSValue func = JS_GetPropertyStr(ctx, ns, "compileStandalone"); + JS_FreeValue(ctx, ns); + if (JS_IsException(func)) + goto fail; + JSValue args[3]; + args[0] = JS_NewString(ctx, compile_file); + args[1] = JS_NewString(ctx, out); + 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]); + JS_FreeValue(ctx, args[1]); + JS_FreeValue(ctx, args[2]); + } else if (expr) { + int flags = module ? JS_EVAL_TYPE_MODULE : 0; + if (eval_buf(ctx, expr, strlen(expr), "", flags)) + goto fail; + } else if (optind >= argc) { + /* interactive mode */ + interactive = 1; + } else { + const char *filename; + filename = argv[optind]; + if (eval_file(ctx, filename, module)) + goto fail; + } + if (interactive) { + JS_SetHostPromiseRejectionTracker(rt, NULL, NULL); + js_std_eval_binary(ctx, qjsc_repl, qjsc_repl_size, 0); + } + if (standalone || compile_file) { + if (JS_IsException(ret)) { + r = 1; + } else { + JS_FreeValue(ctx, ret); + r = js_std_loop(ctx); + } + } else { + r = js_std_loop(ctx); + } + if (r) { + js_std_dump_error(ctx); + goto fail; + } + } + + if (dump_memory) { + JSMemoryUsage stats; + JS_ComputeMemoryUsage(rt, &stats); + JS_DumpMemoryUsage(stdout, &stats, rt); + } + js_std_free_handlers(rt); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + + if (empty_run && dump_memory) { + clock_t t[5]; + double best[5] = {0}; + int i, j; + for (i = 0; i < 100; i++) { + t[0] = clock(); + rt = JS_NewRuntime(); + t[1] = clock(); + ctx = JS_NewContext(rt); + t[2] = clock(); + JS_FreeContext(ctx); + t[3] = clock(); + JS_FreeRuntime(rt); + t[4] = clock(); + for (j = 4; j > 0; j--) { + double ms = 1000.0 * (t[j] - t[j - 1]) / CLOCKS_PER_SEC; + if (i == 0 || best[j] > ms) + best[j] = ms; + } + } + printf("\nInstantiation times (ms): %.3f = %.3f+%.3f+%.3f+%.3f\n", + best[1] + best[2] + best[3] + best[4], + best[1], best[2], best[3], best[4]); + } + return 0; + fail: + js_std_free_handlers(rt); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + return 1; +} diff --git a/Plugins/Schema/external/quickjs/src/qjsc.c b/Plugins/Schema/external/quickjs/src/qjsc.c new file mode 100644 index 0000000000..18678d0c34 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/qjsc.c @@ -0,0 +1,673 @@ +/* + * QuickJS command line compiler + * + * Copyright (c) 2018-2024 Fabrice Bellard + * Copyright (c) 2023-2025 Ben Noordhuis + * Copyright (c) 2023-2025 Saúl Ibarra Corretgé + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "cutils.h" +#include "quickjs-libc.h" + +typedef enum { + OUTPUT_C, + OUTPUT_C_MAIN, + OUTPUT_RAW, +} OutputTypeEnum; + +typedef struct { + char *name; + char *short_name; + int flags; +} namelist_entry_t; + +typedef struct namelist_t { + namelist_entry_t *array; + int count; + int size; +} namelist_t; + +static namelist_t cname_list; +static namelist_t cmodule_list; +static namelist_t init_module_list; +static OutputTypeEnum output_type; +static FILE *outfile; +static const char *c_ident_prefix = "qjsc_"; +static int strip; + +void namelist_add(namelist_t *lp, const char *name, const char *short_name, + int flags) +{ + namelist_entry_t *e; + if (lp->count == lp->size) { + size_t newsize = lp->size + (lp->size >> 1) + 4; + namelist_entry_t *a = + realloc(lp->array, sizeof(lp->array[0]) * newsize); + /* XXX: check for realloc failure */ + lp->array = a; + lp->size = newsize; + } + e = &lp->array[lp->count++]; + e->name = strdup(name); + if (short_name) + e->short_name = strdup(short_name); + else + e->short_name = NULL; + e->flags = flags; +} + +void namelist_free(namelist_t *lp) +{ + while (lp->count > 0) { + namelist_entry_t *e = &lp->array[--lp->count]; + free(e->name); + free(e->short_name); + } + free(lp->array); + lp->array = NULL; + lp->size = 0; +} + +namelist_entry_t *namelist_find(namelist_t *lp, const char *name) +{ + int i; + for(i = 0; i < lp->count; i++) { + namelist_entry_t *e = &lp->array[i]; + if (!strcmp(e->name, name)) + return e; + } + return NULL; +} + +static void get_c_name(char *buf, size_t buf_size, const char *file) +{ + const char *p, *r; + size_t len, i; + int c; + char *q; + + p = strrchr(file, '/'); + if (!p) + p = file; + else + p++; + r = strrchr(p, '.'); + if (!r) + len = strlen(p); + else + len = r - p; + js__pstrcpy(buf, buf_size, c_ident_prefix); + q = buf + strlen(buf); + for(i = 0; i < len; i++) { + c = p[i]; + if (!((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z'))) { + c = '_'; + } + if ((q - buf) < buf_size - 1) + *q++ = c; + } + *q = '\0'; +} + +static void dump_hex(FILE *f, const uint8_t *buf, size_t len) +{ + size_t i, col; + col = 0; + for(i = 0; i < len; i++) { + fprintf(f, " 0x%02x,", buf[i]); + if (++col == 8) { + fprintf(f, "\n"); + col = 0; + } + } + if (col != 0) + fprintf(f, "\n"); +} + +static void output_object_code(JSContext *ctx, + FILE *fo, JSValue obj, const char *c_name, + bool load_only) +{ + uint8_t *out_buf; + size_t out_buf_len; + int flags = JS_WRITE_OBJ_BYTECODE; + + if (strip) { + flags |= JS_WRITE_OBJ_STRIP_SOURCE; + if (strip > 1) + flags |= JS_WRITE_OBJ_STRIP_DEBUG; + } + + out_buf = JS_WriteObject(ctx, &out_buf_len, obj, flags); + if (!out_buf) { + js_std_dump_error(ctx); + exit(1); + } + + namelist_add(&cname_list, c_name, NULL, load_only); + + if (output_type == OUTPUT_RAW) { + fwrite(out_buf, 1, out_buf_len, fo); + } else { + fprintf(fo, "const uint32_t %s_size = %u;\n\n", + c_name, (unsigned int)out_buf_len); + fprintf(fo, "const uint8_t %s[%u] = {\n", + c_name, (unsigned int)out_buf_len); + dump_hex(fo, out_buf, out_buf_len); + fprintf(fo, "};\n\n"); + } + + js_free(ctx, out_buf); +} + +static int js_module_dummy_init(JSContext *ctx, JSModuleDef *m) +{ + /* should never be called when compiling JS code */ + abort(); + return -1; // pacify compiler +} + +static void find_unique_cname(char *cname, size_t cname_size) +{ + char cname1[1024]; + int suffix_num; + size_t len, max_len; + assert(cname_size >= 32); + /* find a C name not matching an existing module C name by + adding a numeric suffix */ + len = strlen(cname); + max_len = cname_size - 16; + if (len > max_len) + cname[max_len] = '\0'; + suffix_num = 1; + for(;;) { + snprintf(cname1, sizeof(cname1), "%s_%d", cname, suffix_num); + if (!namelist_find(&cname_list, cname1)) + break; + suffix_num++; + } + js__pstrcpy(cname, cname_size, cname1); +} + +JSModuleDef *jsc_module_loader(JSContext *ctx, + const char *module_name, void *opaque) +{ + JSModuleDef *m; + namelist_entry_t *e; + + /* check if it is a declared C or system module */ + e = namelist_find(&cmodule_list, module_name); + if (e) { + /* add in the static init module list */ + namelist_add(&init_module_list, e->name, e->short_name, 0); + /* create a dummy module */ + m = JS_NewCModule(ctx, module_name, js_module_dummy_init); + } else if (js__has_suffix(module_name, ".so")) { + JS_ThrowReferenceError(ctx, "%s: dynamically linking to shared libraries not supported", + module_name); + return NULL; + } else { + size_t buf_len; + uint8_t *buf; + JSValue func_val; + char cname[1000]; + + buf = js_load_file(ctx, &buf_len, module_name); + if (!buf) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s'", + module_name); + return NULL; + } + + /* compile the module */ + func_val = JS_Eval(ctx, (char *)buf, buf_len, module_name, + JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY); + js_free(ctx, buf); + if (JS_IsException(func_val)) + return NULL; + get_c_name(cname, sizeof(cname), module_name); + if (namelist_find(&cname_list, cname)) { + find_unique_cname(cname, sizeof(cname)); + } + output_object_code(ctx, outfile, func_val, cname, true); + + /* the module is already referenced, so we must free it */ + m = JS_VALUE_GET_PTR(func_val); + JS_FreeValue(ctx, func_val); + } + return m; +} + +static void compile_file(JSContext *ctx, FILE *fo, + const char *filename, + const char *script_name, + const char *c_name1, + int module) +{ + uint8_t *buf; + char c_name[1024]; + int eval_flags; + JSValue obj; + size_t buf_len; + + buf = js_load_file(ctx, &buf_len, filename); + if (!buf) { + fprintf(stderr, "Could not load '%s'\n", filename); + exit(1); + } + eval_flags = JS_EVAL_FLAG_COMPILE_ONLY; + if (module < 0) { + module = (js__has_suffix(filename, ".mjs") || + JS_DetectModule((const char *)buf, buf_len)); + } + if (module) + eval_flags |= JS_EVAL_TYPE_MODULE; + else + eval_flags |= JS_EVAL_TYPE_GLOBAL; + obj = JS_Eval(ctx, (const char *)buf, buf_len, script_name ? script_name : filename, eval_flags); + if (JS_IsException(obj)) { + js_std_dump_error(ctx); + exit(1); + } + js_free(ctx, buf); + if (c_name1) { + js__pstrcpy(c_name, sizeof(c_name), c_name1); + } else { + get_c_name(c_name, sizeof(c_name), filename); + } + output_object_code(ctx, fo, obj, c_name, false); + JS_FreeValue(ctx, obj); +} + +static const char main_c_template1[] = + "int main(int argc, char **argv)\n" + "{\n" + " int r;\n" + " JSRuntime *rt;\n" + " JSContext *ctx;\n" + " r = 0;\n" + " rt = JS_NewRuntime();\n" + " js_std_set_worker_new_context_func(JS_NewCustomContext);\n" + " js_std_init_handlers(rt);\n" + ; + +static const char main_c_template2[] = + " r = js_std_loop(ctx);\n" + " if (r) {\n" + " js_std_dump_error(ctx);\n" + " }\n" + " js_std_free_handlers(rt);\n" + " JS_FreeContext(ctx);\n" + " JS_FreeRuntime(rt);\n" + " return r;\n" + "}\n"; + +#define PROG_NAME "qjsc" + +void help(void) +{ + printf("QuickJS-ng Compiler version %s\n" + "usage: " PROG_NAME " [options] [files]\n" + "\n" + "options are:\n" + "-b output raw bytecode instead of C code\n" + "-e output main() and bytecode in a C file\n" + "-o output set the output filename\n" + "-n script_name set the script name (as used in stack traces)\n" + "-N cname set the C name of the generated data\n" + "-C compile as JS classic script (default=autodetect)\n" + "-m compile as ES module (default=autodetect)\n" + "-D module_name compile a dynamically loaded module or worker\n" + "-M module_name[,cname] add initialization code for an external C module\n" + "-p prefix set the prefix of the generated C names\n" + "-P do not add default system modules\n" + "-s strip the source code, specify twice to also strip debug info\n" + "-S n set the maximum stack size to 'n' bytes (default=%d)\n", + JS_GetVersion(), + JS_DEFAULT_STACK_SIZE); + exit(1); +} + +// TODO(bnoordhuis) share with qjs.c maybe +static int64_t parse_limit(const char *arg) { + char *p; + unsigned long unit = 1; // bytes for backcompat; qjs defaults to kilobytes + double d = strtod(arg, &p); + + if (p == arg) { + fprintf(stderr, "qjsc: invalid limit: %s\n", arg); + return -1; + } + + if (*p) { + switch (*p++) { + case 'b': case 'B': unit = 1UL << 0; break; + case 'k': case 'K': unit = 1UL << 10; break; /* IEC kibibytes */ + case 'm': case 'M': unit = 1UL << 20; break; /* IEC mebibytes */ + case 'g': case 'G': unit = 1UL << 30; break; /* IEC gigibytes */ + default: + fprintf(stderr, "qjsc: invalid limit: %s, unrecognized suffix, only k,m,g are allowed\n", arg); + return -1; + } + if (*p) { + fprintf(stderr, "qjsc: invalid limit: %s, only one suffix allowed\n", arg); + return -1; + } + } + + return (int64_t)(d * unit); +} + +static void check_hasarg(int optind, int argc, int opt) +{ + if (optind >= argc) { + fprintf(stderr, "qjsc: missing file for -%c\n", opt); + exit(1); + } +} + +int main(int argc, char **argv) +{ + int optind = 1; + int i; + const char *out_filename, *cname, *script_name; + char cfilename[1024]; + FILE *fo; + JSRuntime *rt; + JSContext *ctx; + int module; + size_t stack_size; + namelist_t dynamic_module_list; + bool load_system_modules = true; + + out_filename = NULL; + script_name = NULL; + output_type = OUTPUT_C; + cname = NULL; + module = -1; + strip = 0; + stack_size = 0; + memset(&dynamic_module_list, 0, sizeof(dynamic_module_list)); + + + while (optind < argc && *argv[optind] == '-') { + char *arg = argv[optind] + 1; + const char *longopt = ""; + char *optarg = NULL; + /* a single - is not an option, it also stops argument scanning */ + if (!*arg) + break; + optind++; + if (*arg == '-') { + longopt = arg + 1; + optarg = strchr(longopt, '='); + if (optarg) + *optarg++ = '\0'; + arg += strlen(arg); + /* -- stops argument scanning */ + if (!*longopt) + break; + } + for (; *arg || *longopt; longopt = "") { + char opt = *arg; + if (opt) { + arg++; + if (!optarg && *arg) + optarg = arg; + } + if (opt == 'h' || opt == '?' || !strcmp(longopt, "help")) { + help(); + continue; + } + if (opt == 'b') { + output_type = OUTPUT_RAW; + continue; + } + if (opt == 'o') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + out_filename = optarg; + continue; + } + if (opt == 'e') { + output_type = OUTPUT_C_MAIN; + continue; + } + if (opt == 'n') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + script_name = optarg; + continue; + } + if (opt == 'N') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + cname = optarg; + continue; + } + if (opt == 'C') { + module = 0; + continue; + } + if (opt == 'm') { + module = 1; + continue; + } + if (opt == 'M') { + char *p; + char path[1024]; + char cname[1024]; + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + js__pstrcpy(path, sizeof(path), optarg); + p = strchr(path, ','); + if (p) { + *p = '\0'; + js__pstrcpy(cname, sizeof(cname), p + 1); + } else { + get_c_name(cname, sizeof(cname), path); + } + namelist_add(&cmodule_list, path, cname, 0); + continue; + } + if (opt == 'D') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + namelist_add(&dynamic_module_list, optarg, NULL, 0); + continue; + } + if (opt == 'P') { + load_system_modules = false; + continue; + } + if (opt == 's') { + strip++; + continue; + } + if (opt == 'p') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + c_ident_prefix = optarg; + continue; + } + if (opt == 'S') { + if (!optarg) { + check_hasarg(optind, argc, opt); + optarg = argv[optind++]; + } + stack_size = parse_limit(optarg); + continue; + } + help(); + } + } + + if (load_system_modules) { + /* add system modules */ + namelist_add(&cmodule_list, "qjs:std", "std", 0); + namelist_add(&cmodule_list, "qjs:os", "os", 0); + namelist_add(&cmodule_list, "qjs:bjson", "bjson", 0); + namelist_add(&cmodule_list, "std", "std", 0); + namelist_add(&cmodule_list, "os", "os", 0); + namelist_add(&cmodule_list, "bjson", "bjson", 0); + } + + if (optind >= argc) + help(); + + if (!out_filename) + out_filename = "out.c"; + + js__pstrcpy(cfilename, sizeof(cfilename), out_filename); + + if (output_type == OUTPUT_RAW) + fo = fopen(cfilename, "wb"); + else + fo = fopen(cfilename, "w"); + + if (!fo) { + perror(cfilename); + exit(1); + } + outfile = fo; + + rt = JS_NewRuntime(); + ctx = JS_NewContext(rt); + + /* loader for ES6 modules */ + JS_SetModuleLoaderFunc(rt, NULL, jsc_module_loader, NULL); + + if (output_type != OUTPUT_RAW) { + fprintf(fo, "/* File generated automatically by the QuickJS-ng compiler. */\n" + "\n" + ); + } + + if (output_type == OUTPUT_C_MAIN) { + fprintf(fo, "#include \"quickjs-libc.h\"\n" + "\n" + ); + } else if (output_type == OUTPUT_C) { + fprintf(fo, "#include \n" + "\n" + ); + } + + for(i = optind; i < argc; i++) { + const char *filename = argv[i]; + compile_file(ctx, fo, filename, script_name, cname, module); + cname = NULL; + } + + for(i = 0; i < dynamic_module_list.count; i++) { + if (!jsc_module_loader(ctx, dynamic_module_list.array[i].name, NULL)) { + fprintf(stderr, "Could not load dynamic module '%s'\n", + dynamic_module_list.array[i].name); + exit(1); + } + } + + if (output_type == OUTPUT_C_MAIN) { + fprintf(fo, + "static JSContext *JS_NewCustomContext(JSRuntime *rt)\n" + "{\n" + " JSContext *ctx = JS_NewContext(rt);\n" + " if (!ctx)\n" + " return NULL;\n"); + /* add the precompiled modules (XXX: could modify the module + loader instead) */ + for(i = 0; i < init_module_list.count; i++) { + namelist_entry_t *e = &init_module_list.array[i]; + /* initialize the static C modules */ + + fprintf(fo, + " {\n" + " extern JSModuleDef *js_init_module_%s(JSContext *ctx, const char *name);\n" + " js_init_module_%s(ctx, \"%s\");\n" + " }\n", + e->short_name, e->short_name, e->name); + } + for(i = 0; i < cname_list.count; i++) { + namelist_entry_t *e = &cname_list.array[i]; + if (e->flags) { + fprintf(fo, " js_std_eval_binary(ctx, %s, %s_size, 1);\n", + e->name, e->name); + } + } + fprintf(fo, + " return ctx;\n" + "}\n\n"); + + fputs(main_c_template1, fo); + + if (stack_size != 0) { + fprintf(fo, " JS_SetMaxStackSize(rt, %u);\n", + (unsigned int)stack_size); + } + + /* add the module loader */ + fprintf(fo, " JS_SetModuleLoaderFunc2(rt, NULL, js_module_loader, js_module_check_attributes, NULL);\n"); + + fprintf(fo, + " ctx = JS_NewCustomContext(rt);\n" + " js_std_add_helpers(ctx, argc, argv);\n"); + + for(i = 0; i < cname_list.count; i++) { + namelist_entry_t *e = &cname_list.array[i]; + if (!e->flags) { + fprintf(fo, " js_std_eval_binary(ctx, %s, %s_size, 0);\n", + e->name, e->name); + } + } + fputs(main_c_template2, fo); + } + + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + + fclose(fo); + + namelist_free(&cname_list); + namelist_free(&cmodule_list); + namelist_free(&init_module_list); + return 0; +} diff --git a/Plugins/Schema/external/quickjs/src/quickjs-atom.h b/Plugins/Schema/external/quickjs/src/quickjs-atom.h new file mode 100644 index 0000000000..e1ac35b5c8 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs-atom.h @@ -0,0 +1,267 @@ +/* + * QuickJS atom definitions + * + * Copyright (c) 2017-2018 Fabrice Bellard + * Copyright (c) 2017-2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifdef DEF + +/* Note: first atoms are considered as keywords in the parser */ +DEF(null, "null") /* must be first */ +DEF(false, "false") +DEF(true, "true") +DEF(if, "if") +DEF(else, "else") +DEF(return, "return") +DEF(var, "var") +DEF(this, "this") +DEF(delete, "delete") +DEF(void, "void") +DEF(typeof, "typeof") +DEF(new, "new") +DEF(in, "in") +DEF(instanceof, "instanceof") +DEF(do, "do") +DEF(while, "while") +DEF(for, "for") +DEF(break, "break") +DEF(continue, "continue") +DEF(switch, "switch") +DEF(case, "case") +DEF(default, "default") +DEF(throw, "throw") +DEF(try, "try") +DEF(catch, "catch") +DEF(finally, "finally") +DEF(function, "function") +DEF(debugger, "debugger") +DEF(with, "with") +/* FutureReservedWord */ +DEF(class, "class") +DEF(const, "const") +DEF(enum, "enum") +DEF(export, "export") +DEF(extends, "extends") +DEF(import, "import") +DEF(super, "super") +/* FutureReservedWords when parsing strict mode code */ +DEF(implements, "implements") +DEF(interface, "interface") +DEF(let, "let") +DEF(package, "package") +DEF(private, "private") +DEF(protected, "protected") +DEF(public, "public") +DEF(static, "static") +DEF(yield, "yield") +DEF(await, "await") + +/* empty string */ +DEF(empty_string, "") +/* identifiers */ +DEF(keys, "keys") +DEF(size, "size") +DEF(length, "length") +DEF(message, "message") +DEF(cause, "cause") +DEF(errors, "errors") +DEF(stack, "stack") +DEF(name, "name") +DEF(toString, "toString") +DEF(toLocaleString, "toLocaleString") +DEF(valueOf, "valueOf") +DEF(eval, "eval") +DEF(prototype, "prototype") +DEF(constructor, "constructor") +DEF(configurable, "configurable") +DEF(writable, "writable") +DEF(enumerable, "enumerable") +DEF(value, "value") +DEF(get, "get") +DEF(set, "set") +DEF(of, "of") +DEF(__proto__, "__proto__") +DEF(undefined, "undefined") +DEF(number, "number") +DEF(boolean, "boolean") +DEF(string, "string") +DEF(object, "object") +DEF(symbol, "symbol") +DEF(integer, "integer") +DEF(unknown, "unknown") +DEF(arguments, "arguments") +DEF(callee, "callee") +DEF(caller, "caller") +DEF(_eval_, "") +DEF(_ret_, "") +DEF(_var_, "") +DEF(_arg_var_, "") +DEF(_with_, "") +DEF(lastIndex, "lastIndex") +DEF(target, "target") +DEF(index, "index") +DEF(input, "input") +DEF(defineProperties, "defineProperties") +DEF(apply, "apply") +DEF(join, "join") +DEF(concat, "concat") +DEF(split, "split") +DEF(construct, "construct") +DEF(getPrototypeOf, "getPrototypeOf") +DEF(setPrototypeOf, "setPrototypeOf") +DEF(isExtensible, "isExtensible") +DEF(preventExtensions, "preventExtensions") +DEF(has, "has") +DEF(deleteProperty, "deleteProperty") +DEF(defineProperty, "defineProperty") +DEF(getOwnPropertyDescriptor, "getOwnPropertyDescriptor") +DEF(ownKeys, "ownKeys") +DEF(add, "add") +DEF(done, "done") +DEF(next, "next") +DEF(values, "values") +DEF(source, "source") +DEF(flags, "flags") +DEF(global, "global") +DEF(unicode, "unicode") +DEF(raw, "raw") +DEF(new_target, "new.target") +DEF(this_active_func, "this.active_func") +DEF(home_object, "") +DEF(computed_field, "") +DEF(static_computed_field, "") /* must come after computed_fields */ +DEF(class_fields_init, "") +DEF(brand, "") +DEF(hash_constructor, "#constructor") +DEF(as, "as") +DEF(from, "from") +DEF(fromAsync, "fromAsync") +DEF(meta, "meta") +DEF(_default_, "*default*") +DEF(_star_, "*") +DEF(Module, "Module") +DEF(then, "then") +DEF(resolve, "resolve") +DEF(reject, "reject") +DEF(promise, "promise") +DEF(proxy, "proxy") +DEF(revoke, "revoke") +DEF(async, "async") +DEF(exec, "exec") +DEF(groups, "groups") +DEF(indices, "indices") +DEF(status, "status") +DEF(reason, "reason") +DEF(globalThis, "globalThis") +DEF(bigint, "bigint") +DEF(not_equal, "not-equal") +DEF(timed_out, "timed-out") +DEF(ok, "ok") +DEF(toJSON, "toJSON") +DEF(maxByteLength, "maxByteLength") +DEF(zip, "zip") +DEF(zipKeyed, "zipKeyed") +/* class names */ +DEF(Object, "Object") +DEF(Array, "Array") +DEF(Error, "Error") +DEF(Number, "Number") +DEF(String, "String") +DEF(Boolean, "Boolean") +DEF(Symbol, "Symbol") +DEF(Arguments, "Arguments") +DEF(Math, "Math") +DEF(JSON, "JSON") +DEF(Date, "Date") +DEF(Function, "Function") +DEF(GeneratorFunction, "GeneratorFunction") +DEF(ForInIterator, "ForInIterator") +DEF(RegExp, "RegExp") +DEF(ArrayBuffer, "ArrayBuffer") +DEF(SharedArrayBuffer, "SharedArrayBuffer") +/* must keep same order as class IDs for typed arrays */ +DEF(Uint8ClampedArray, "Uint8ClampedArray") +DEF(Int8Array, "Int8Array") +DEF(Uint8Array, "Uint8Array") +DEF(Int16Array, "Int16Array") +DEF(Uint16Array, "Uint16Array") +DEF(Int32Array, "Int32Array") +DEF(Uint32Array, "Uint32Array") +DEF(BigInt64Array, "BigInt64Array") +DEF(BigUint64Array, "BigUint64Array") +DEF(Float16Array, "Float16Array") +DEF(Float32Array, "Float32Array") +DEF(Float64Array, "Float64Array") +DEF(DataView, "DataView") +DEF(BigInt, "BigInt") +DEF(WeakRef, "WeakRef") +DEF(FinalizationRegistry, "FinalizationRegistry") +DEF(Map, "Map") +DEF(Set, "Set") /* Map + 1 */ +DEF(WeakMap, "WeakMap") /* Map + 2 */ +DEF(WeakSet, "WeakSet") /* Map + 3 */ +DEF(Iterator, "Iterator") +DEF(IteratorConcat, "Iterator Concat") +DEF(IteratorHelper, "Iterator Helper") +DEF(IteratorWrap, "Iterator Wrap") +DEF(Map_Iterator, "Map Iterator") +DEF(Set_Iterator, "Set Iterator") +DEF(Array_Iterator, "Array Iterator") +DEF(String_Iterator, "String Iterator") +DEF(RegExp_String_Iterator, "RegExp String Iterator") +DEF(Generator, "Generator") +DEF(Proxy, "Proxy") +DEF(Promise, "Promise") +DEF(PromiseResolveFunction, "PromiseResolveFunction") +DEF(PromiseRejectFunction, "PromiseRejectFunction") +DEF(AsyncFunction, "AsyncFunction") +DEF(AsyncFunctionResolve, "AsyncFunctionResolve") +DEF(AsyncFunctionReject, "AsyncFunctionReject") +DEF(AsyncGeneratorFunction, "AsyncGeneratorFunction") +DEF(AsyncGenerator, "AsyncGenerator") +DEF(EvalError, "EvalError") +DEF(RangeError, "RangeError") +DEF(ReferenceError, "ReferenceError") +DEF(SyntaxError, "SyntaxError") +DEF(TypeError, "TypeError") +DEF(URIError, "URIError") +DEF(InternalError, "InternalError") +DEF(DOMException, "DOMException") +DEF(CallSite, "CallSite") +/* private symbols */ +DEF(Private_brand, "") +/* symbols */ +DEF(Symbol_toPrimitive, "Symbol.toPrimitive") +DEF(Symbol_iterator, "Symbol.iterator") +DEF(Symbol_match, "Symbol.match") +DEF(Symbol_matchAll, "Symbol.matchAll") +DEF(Symbol_replace, "Symbol.replace") +DEF(Symbol_search, "Symbol.search") +DEF(Symbol_split, "Symbol.split") +DEF(Symbol_toStringTag, "Symbol.toStringTag") +DEF(Symbol_isConcatSpreadable, "Symbol.isConcatSpreadable") +DEF(Symbol_hasInstance, "Symbol.hasInstance") +DEF(Symbol_species, "Symbol.species") +DEF(Symbol_unscopables, "Symbol.unscopables") +DEF(Symbol_asyncIterator, "Symbol.asyncIterator") + +#endif /* DEF */ diff --git a/Plugins/Schema/external/quickjs/src/quickjs-c-atomics.h b/Plugins/Schema/external/quickjs/src/quickjs-c-atomics.h new file mode 100644 index 0000000000..8fc6b72030 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs-c-atomics.h @@ -0,0 +1,54 @@ +/* + * QuickJS C atomics definitions + * + * Copyright (c) 2023 Marcin Kolny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__) + // Use GCC builtins for version < 4.9 +# if((__GNUC__ << 16) + __GNUC_MINOR__ < ((4) << 16) + 9) +# define GCC_BUILTIN_ATOMICS +# endif +#endif + +#ifdef GCC_BUILTIN_ATOMICS +#define atomic_fetch_add(obj, arg) \ + __atomic_fetch_add(obj, arg, __ATOMIC_SEQ_CST) +#define atomic_compare_exchange_strong(obj, expected, desired) \ + __atomic_compare_exchange_n(obj, expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) +#define atomic_exchange(obj, desired) \ + __atomic_exchange_n (obj, desired, __ATOMIC_SEQ_CST) +#define atomic_load(obj) \ + __atomic_load_n(obj, __ATOMIC_SEQ_CST) +#define atomic_store(obj, desired) \ + __atomic_store_n(obj, desired, __ATOMIC_SEQ_CST) +#define atomic_fetch_or(obj, arg) \ + __atomic_fetch_or(obj, arg, __ATOMIC_SEQ_CST) +#define atomic_fetch_xor(obj, arg) \ + __atomic_fetch_xor(obj, arg, __ATOMIC_SEQ_CST) +#define atomic_fetch_and(obj, arg) \ + __atomic_fetch_and(obj, arg, __ATOMIC_SEQ_CST) +#define atomic_fetch_sub(obj, arg) \ + __atomic_fetch_sub(obj, arg, __ATOMIC_SEQ_CST) +#define _Atomic +#else +#include +#endif diff --git a/Plugins/Schema/external/quickjs/src/quickjs-libc.c b/Plugins/Schema/external/quickjs/src/quickjs-libc.c new file mode 100644 index 0000000000..9aa7e775ea --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs-libc.c @@ -0,0 +1,4810 @@ +/* + * QuickJS C library + * + * Copyright (c) 2017-2021 Fabrice Bellard + * Copyright (c) 2017-2021 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "quickjs.h" +#include +#include +#include +#include +#include +#include +#include +#include +#if !defined(_MSC_VER) +#include +#include +#endif +#include +#include +#include +#include +#if !defined(_MSC_VER) +#include +#endif +#if defined(_WIN32) +#include +#include +#include +#include +#include +#include +#include +#define popen _popen +#define pclose _pclose +#define rmdir _rmdir +#define getcwd _getcwd +#define chdir _chdir +#else +#include +#include +#if !defined(__wasi__) +#include +#include +#include +#include +#include +#endif + +#if defined(__APPLE__) +typedef sig_t sighandler_t; +#include +#include +#define environ (*_NSGetEnviron()) +#endif + +#ifdef __sun +typedef void (*sighandler_t)(int); +extern char **environ; +#endif + +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) +typedef sig_t sighandler_t; +extern char **environ; +#endif + +#endif /* _WIN32 */ + +#include "cutils.h" +#include "list.h" +#include "quickjs-libc.h" + +#if JS_HAVE_THREADS +#include "quickjs-c-atomics.h" +#define USE_WORKER // enable os.Worker +#endif + +#ifndef S_IFBLK +#define S_IFBLK 0 +#endif + +#ifndef S_IFIFO +#define S_IFIFO 0 +#endif + +#ifndef MAX_SAFE_INTEGER // already defined in amalgamation builds +#define MAX_SAFE_INTEGER (((int64_t) 1 << 53) - 1) +#endif + +#ifndef QJS_NATIVE_MODULE_SUFFIX +#ifdef _WIN32 +#define QJS_NATIVE_MODULE_SUFFIX ".dll" +#else +#define QJS_NATIVE_MODULE_SUFFIX ".so" +#endif +#endif + +/* TODO: + - add socket calls +*/ + +typedef struct { + struct list_head link; + int fd; + JSValue rw_func[2]; +} JSOSRWHandler; + +typedef struct { + struct list_head link; + int sig_num; + JSValue func; +} JSOSSignalHandler; + +typedef struct { + struct list_head link; + int64_t timer_id; + uint8_t repeats:1; + int64_t timeout; + int64_t delay; + JSValue func; +} JSOSTimer; + +typedef struct { + struct list_head link; + JSValue promise; + JSValue reason; +} JSRejectedPromiseEntry; + +#ifdef USE_WORKER + +typedef struct { + struct list_head link; + uint8_t *data; + size_t data_len; + /* list of SharedArrayBuffers, necessary to free the message */ + uint8_t **sab_tab; + size_t sab_tab_len; +} JSWorkerMessage; + +typedef struct JSWaker { +#ifdef _WIN32 + HANDLE handle; +#else + int read_fd; + int write_fd; +#endif +} JSWaker; + +typedef struct { + int ref_count; + js_mutex_t mutex; + struct list_head msg_queue; /* list of JSWorkerMessage.link */ + JSWaker waker; +} JSWorkerMessagePipe; + +typedef struct { + struct list_head link; + JSWorkerMessagePipe *recv_pipe; + JSValue on_message_func; +} JSWorkerMessageHandler; + +#endif // USE_WORKER + +typedef struct JSThreadState { + struct list_head os_rw_handlers; /* list of JSOSRWHandler.link */ + struct list_head os_signal_handlers; /* list JSOSSignalHandler.link */ + struct list_head os_timers; /* list of JSOSTimer.link */ + struct list_head port_list; /* list of JSWorkerMessageHandler.link */ + struct list_head rejected_promise_list; /* list of JSRejectedPromiseEntry.link */ + int eval_script_recurse; /* only used in the main thread */ + int64_t next_timer_id; /* for setTimeout / setInterval */ + bool can_js_os_poll; + /* not used in the main thread */ +#ifdef USE_WORKER + JSWorkerMessagePipe *recv_pipe, *send_pipe; +#else + void *recv_pipe; +#endif // USE_WORKER + JSClassID std_file_class_id; + JSClassID worker_class_id; +} JSThreadState; + +static uint64_t os_pending_signals; + +static void *js_std_dbuf_realloc(void *opaque, void *ptr, size_t size) +{ + JSRuntime *rt = opaque; + return js_realloc_rt(rt, ptr, size); +} + +static void js_std_dbuf_init(JSContext *ctx, DynBuf *s) +{ + dbuf_init2(s, JS_GetRuntime(ctx), js_std_dbuf_realloc); +} + +static bool my_isdigit(int c) +{ + return (c >= '0' && c <= '9'); +} + +static JSThreadState *js_get_thread_state(JSRuntime *rt) +{ + return (JSThreadState *)js_std_cmd(/*GetOpaque*/0, rt); +} + +static void js_set_thread_state(JSRuntime *rt, JSThreadState *ts) +{ + js_std_cmd(/*SetOpaque*/1, rt, ts); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif // __GNUC__ +static JSValue js_printf_internal(JSContext *ctx, + int argc, JSValueConst *argv, FILE *fp) +{ + char fmtbuf[32]; + uint8_t cbuf[UTF8_CHAR_LEN_MAX+1]; + JSValue res; + DynBuf dbuf; + const char *fmt_str = NULL; + const uint8_t *fmt, *fmt_end; + const uint8_t *p; + char *q; + int i, c, len, mod; + size_t fmt_len; + int32_t int32_arg; + int64_t int64_arg; + double double_arg; + const char *string_arg; + + js_std_dbuf_init(ctx, &dbuf); + + if (argc > 0) { + fmt_str = JS_ToCStringLen(ctx, &fmt_len, argv[0]); + if (!fmt_str) + goto fail; + + i = 1; + fmt = (const uint8_t *)fmt_str; + fmt_end = fmt + fmt_len; + while (fmt < fmt_end) { + for (p = fmt; fmt < fmt_end && *fmt != '%'; fmt++) + continue; + dbuf_put(&dbuf, p, fmt - p); + if (fmt >= fmt_end) + break; + q = fmtbuf; + *q++ = *fmt++; /* copy '%' */ + + /* flags */ + for(;;) { + c = *fmt; + if (c == '0' || c == '#' || c == '+' || c == '-' || c == ' ' || + c == '\'') { + if (q >= fmtbuf + sizeof(fmtbuf) - 1) + goto invalid; + *q++ = c; + fmt++; + } else { + break; + } + } + /* width */ + if (*fmt == '*') { + if (i >= argc) + goto missing; + if (JS_ToInt32(ctx, &int32_arg, argv[i++])) + goto fail; + q += snprintf(q, fmtbuf + sizeof(fmtbuf) - q, "%d", int32_arg); + fmt++; + } else { + while (my_isdigit(*fmt)) { + if (q >= fmtbuf + sizeof(fmtbuf) - 1) + goto invalid; + *q++ = *fmt++; + } + } + if (*fmt == '.') { + if (q >= fmtbuf + sizeof(fmtbuf) - 1) + goto invalid; + *q++ = *fmt++; + if (*fmt == '*') { + if (i >= argc) + goto missing; + if (JS_ToInt32(ctx, &int32_arg, argv[i++])) + goto fail; + q += snprintf(q, fmtbuf + sizeof(fmtbuf) - q, "%d", int32_arg); + fmt++; + } else { + while (my_isdigit(*fmt)) { + if (q >= fmtbuf + sizeof(fmtbuf) - 1) + goto invalid; + *q++ = *fmt++; + } + } + } + + /* we only support the "l" modifier for 64 bit numbers */ + mod = ' '; + if (*fmt == 'l') { + mod = *fmt++; + } + + /* type */ + c = *fmt++; + if (q >= fmtbuf + sizeof(fmtbuf) - 1) + goto invalid; + *q++ = c; + *q = '\0'; + + switch (c) { + case 'c': + if (i >= argc) + goto missing; + if (JS_IsString(argv[i])) { + // TODO(chqrlie) need an API to wrap charCodeAt and codePointAt */ + string_arg = JS_ToCString(ctx, argv[i++]); + if (!string_arg) + goto fail; + int32_arg = utf8_decode((const uint8_t *)string_arg, &p); + JS_FreeCString(ctx, string_arg); + } else { + if (JS_ToInt32(ctx, &int32_arg, argv[i++])) + goto fail; + } + // XXX: throw an exception? + if ((unsigned)int32_arg > 0x10FFFF) + int32_arg = 0xFFFD; + /* ignore conversion flags, width and precision */ + len = utf8_encode(cbuf, int32_arg); + dbuf_put(&dbuf, cbuf, len); + break; + + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + if (i >= argc) + goto missing; + if (JS_ToInt64Ext(ctx, &int64_arg, argv[i++])) + goto fail; + if (mod == 'l') { + /* 64 bit number */ +#if defined(_WIN32) + if (q >= fmtbuf + sizeof(fmtbuf) - 3) + goto invalid; + q[2] = q[-1]; + q[-1] = 'I'; + q[0] = '6'; + q[1] = '4'; + q[3] = '\0'; + dbuf_printf(&dbuf, fmtbuf, (int64_t)int64_arg); +#else + if (q >= fmtbuf + sizeof(fmtbuf) - 2) + goto invalid; + q[1] = q[-1]; + q[-1] = q[0] = 'l'; + q[2] = '\0'; + dbuf_printf(&dbuf, fmtbuf, (long long)int64_arg); +#endif + } else { + dbuf_printf(&dbuf, fmtbuf, (int)int64_arg); + } + break; + + case 's': + if (i >= argc) + goto missing; + /* XXX: handle strings containing null characters */ + string_arg = JS_ToCString(ctx, argv[i++]); + if (!string_arg) + goto fail; + dbuf_printf(&dbuf, fmtbuf, string_arg); + JS_FreeCString(ctx, string_arg); + break; + + case 'e': + case 'f': + case 'g': + case 'a': + case 'E': + case 'F': + case 'G': + case 'A': + if (i >= argc) + goto missing; + if (JS_ToFloat64(ctx, &double_arg, argv[i++])) + goto fail; + dbuf_printf(&dbuf, fmtbuf, double_arg); + break; + + case '%': + dbuf_putc(&dbuf, '%'); + break; + + default: + /* XXX: should support an extension mechanism */ + invalid: + JS_ThrowTypeError(ctx, "invalid conversion specifier in format string"); + goto fail; + missing: + JS_ThrowReferenceError(ctx, "missing argument for conversion specifier"); + goto fail; + } + } + JS_FreeCString(ctx, fmt_str); + } + if (dbuf.error) { + res = JS_ThrowOutOfMemory(ctx); + } else { + if (fp) { + len = fwrite(dbuf.buf, 1, dbuf.size, fp); + res = JS_NewInt32(ctx, len); + } else { + res = JS_NewStringLen(ctx, (char *)dbuf.buf, dbuf.size); + } + } + dbuf_free(&dbuf); + return res; + +fail: + JS_FreeCString(ctx, fmt_str); + dbuf_free(&dbuf); + return JS_EXCEPTION; +} +#ifdef __GNUC__ +#pragma GCC diagnostic pop // ignored "-Wformat-nonliteral" +#endif // __GNUC__ + +uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename) +{ + FILE *f; + size_t n, len; + uint8_t *p, *buf, tmp[8192]; + + f = fopen(filename, "rb"); + if (!f) + return NULL; + buf = NULL; + len = 0; + do { + n = fread(tmp, 1, sizeof(tmp), f); + if (ctx) { + p = js_realloc(ctx, buf, len + n + 1); + } else { + p = realloc(buf, len + n + 1); + } + if (!p) { + if (ctx) { + js_free(ctx, buf); + } else { + free(buf); + } + fclose(f); + return NULL; + } + memcpy(&p[len], tmp, n); + buf = p; + len += n; + buf[len] = '\0'; + } while (n == sizeof(tmp)); + fclose(f); + *pbuf_len = len; + return buf; +} + +/* load and evaluate a file */ +static JSValue js_loadScript(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + uint8_t *buf; + const char *filename; + JSValue ret; + size_t buf_len; + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + return JS_EXCEPTION; + buf = js_load_file(ctx, &buf_len, filename); + if (!buf) { + JS_ThrowReferenceError(ctx, "could not load '%s'", filename); + JS_FreeCString(ctx, filename); + return JS_EXCEPTION; + } + ret = JS_Eval(ctx, (char *)buf, buf_len, filename, + JS_EVAL_TYPE_GLOBAL); + js_free(ctx, buf); + JS_FreeCString(ctx, filename); + return ret; +} + +static int get_bool_option(JSContext *ctx, bool *pbool, + JSValueConst obj, + const char *option) +{ + JSValue val; + val = JS_GetPropertyStr(ctx, obj, option); + if (JS_IsException(val)) + return -1; + if (!JS_IsUndefined(val)) { + *pbool = JS_ToBool(ctx, val); + } + JS_FreeValue(ctx, val); + return 0; +} + +static void free_buf(JSRuntime *rt, void *opaque, void *ptr) { + js_free_rt(rt, ptr); +} + +/* load a file as a UTF-8 encoded string or Uint8Array */ +static JSValue js_std_loadFile(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + uint8_t *buf; + const char *filename; + JSValueConst options_obj; + JSValue ret; + size_t buf_len; + bool binary = false; + + if (argc >= 2) { + options_obj = argv[1]; + if (get_bool_option(ctx, &binary, options_obj, + "binary")) + return JS_EXCEPTION; + } + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + return JS_EXCEPTION; + buf = js_load_file(ctx, &buf_len, filename); + JS_FreeCString(ctx, filename); + if (!buf) + return JS_NULL; + if (binary) { + ret = JS_NewUint8Array(ctx, buf, buf_len, free_buf, NULL, false); + } else { + ret = JS_NewStringLen(ctx, (char *)buf, buf_len); + js_free(ctx, buf); + } + + return ret; +} + +static JSValue js_std_writeFile(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *filename; + const char *mode; + const void *buf; + size_t len, n; + JSValueConst data; + JSValue val, ret, unref; + bool release; + FILE *fp; + + ret = JS_EXCEPTION; + len = 0; + buf = ""; + mode = "w"; + data = argv[1]; + unref = JS_UNDEFINED; + release = false; + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + return JS_EXCEPTION; + if (JS_IsObject(data)) { + val = JS_GetPropertyStr(ctx, data, "buffer"); + if (JS_IsException(val)) + goto exception; + if (JS_IsArrayBuffer(val)) { + data = unref = val; + } else { + JS_FreeValue(ctx, val); + } + } + if (JS_IsArrayBuffer(data)) { + buf = JS_GetArrayBuffer(ctx, &len, data); + mode = "wb"; + } else if (!JS_IsUndefined(data)) { + buf = JS_ToCStringLen(ctx, &len, data); + release = true; + } + if (!buf) + goto exception; + fp = fopen(filename, mode); + if (!fp) { + JS_ThrowPlainError(ctx, "error opening %s for writing", filename); + goto exception; + } + n = fwrite(buf, len, 1, fp); + fclose(fp); + if (n != 1) { + JS_ThrowPlainError(ctx, "error writing to %s", filename); + goto exception; + } + ret = JS_UNDEFINED; +exception: + JS_FreeCString(ctx, filename); + if (release) + JS_FreeCString(ctx, buf); + JS_FreeValue(ctx, unref); + return ret; +} + +typedef JSModuleDef *(JSInitModuleFunc)(JSContext *ctx, + const char *module_name); + + +#if defined(_WIN32) +static JSModuleDef *js_module_loader_so(JSContext *ctx, + const char *module_name) +{ + JSModuleDef *m; + HINSTANCE hd; + JSInitModuleFunc *init; + char *filename = NULL; + size_t len = strlen(module_name); + bool is_absolute = len > 2 && ((module_name[0] >= 'A' && module_name[0] <= 'Z') || + (module_name[0] >= 'a' && module_name[0] <= 'z')) && module_name[1] == ':'; + bool is_relative = len > 2 && module_name[0] == '.' && (module_name[1] == '/' || module_name[1] == '\\'); + if (is_absolute || is_relative) { + filename = (char *)module_name; + } else { + filename = js_malloc(ctx, len + 2 + 1); + if (!filename) + return NULL; + strcpy(filename, "./"); + strcpy(filename + 2, module_name); + } + hd = LoadLibraryA(filename); + if (filename != module_name) + js_free(ctx, filename); + if (hd == NULL) { + JS_ThrowReferenceError(ctx, "js_load_module '%s' error: %lu", + module_name, GetLastError()); + goto fail; + } + init = (JSInitModuleFunc *)(uintptr_t)GetProcAddress(hd, "js_init_module"); + if (!init) { + JS_ThrowReferenceError(ctx, "js_init_module '%s' not found: %lu", + module_name, GetLastError()); + goto fail; + } + m = init(ctx, module_name); + if (!m) { + JS_ThrowReferenceError(ctx, "js_call_module '%s' initialization error", + module_name); + fail: + if (hd != NULL) + FreeLibrary(hd); + return NULL; + } + return m; +} +#elif defined(__wasi__) +static JSModuleDef *js_module_loader_so(JSContext *ctx, + const char *module_name) +{ + JS_ThrowReferenceError(ctx, "shared library modules are not supported yet"); + return NULL; +} +#else +static JSModuleDef *js_module_loader_so(JSContext *ctx, + const char *module_name) +{ + JSModuleDef *m; + void *hd; + JSInitModuleFunc *init; + char *filename; + + if (!strchr(module_name, '/')) { + /* must add a '/' so that the DLL is not searched in the + system library paths */ + filename = js_malloc(ctx, strlen(module_name) + 2 + 1); + if (!filename) + return NULL; + strcpy(filename, "./"); + strcpy(filename + 2, module_name); + } else { + filename = (char *)module_name; + } + + /* C module */ + hd = dlopen(filename, RTLD_NOW | RTLD_LOCAL); + if (filename != module_name) + js_free(ctx, filename); + if (!hd) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s' as shared library: %s", + module_name, dlerror()); + goto fail; + } + + *(void **) (&init) = dlsym(hd, "js_init_module"); + if (!init) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s': js_init_module not found", + module_name); + goto fail; + } + + m = init(ctx, module_name); + if (!m) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s': initialization error", + module_name); + fail: + if (hd) + dlclose(hd); + return NULL; + } + return m; +} +#endif /* !_WIN32 */ + +int js_module_set_import_meta(JSContext *ctx, JSValueConst func_val, + bool use_realpath, bool is_main) +{ + JSModuleDef *m; + char buf[JS__PATH_MAX + 16]; + JSValue meta_obj; + JSAtom module_name_atom; + const char *module_name; + + assert(JS_VALUE_GET_TAG(func_val) == JS_TAG_MODULE); + m = JS_VALUE_GET_PTR(func_val); + + module_name_atom = JS_GetModuleName(ctx, m); + module_name = JS_AtomToCString(ctx, module_name_atom); + JS_FreeAtom(ctx, module_name_atom); + if (!module_name) + return -1; + if (!strchr(module_name, ':')) { + strcpy(buf, "file://"); +#if !defined(_WIN32) && !defined(__wasi__) + /* realpath() cannot be used with modules compiled with qjsc + because the corresponding module source code is not + necessarily present */ + if (use_realpath) { + char *res = realpath(module_name, buf + strlen(buf)); + if (!res) { + JS_ThrowTypeError(ctx, "realpath failure"); + JS_FreeCString(ctx, module_name); + return -1; + } + } else +#endif + { + js__pstrcat(buf, sizeof(buf), module_name); + } + } else { + js__pstrcpy(buf, sizeof(buf), module_name); + } + JS_FreeCString(ctx, module_name); + + meta_obj = JS_GetImportMeta(ctx, m); + if (JS_IsException(meta_obj)) + return -1; + JS_DefinePropertyValueStr(ctx, meta_obj, "url", + JS_NewString(ctx, buf), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, meta_obj, "main", + JS_NewBool(ctx, is_main), + JS_PROP_C_W_E); + JS_FreeValue(ctx, meta_obj); + return 0; +} + +static int json_module_init(JSContext *ctx, JSModuleDef *m) +{ + JSValue val; + val = JS_GetModulePrivateValue(ctx, m); + JS_SetModuleExport(ctx, m, "default", val); + return 0; +} + +static JSModuleDef *create_json_module(JSContext *ctx, const char *module_name, JSValue val) +{ + JSModuleDef *m; + m = JS_NewCModule(ctx, module_name, json_module_init); + if (!m) { + JS_FreeValue(ctx, val); + return NULL; + } + /* only export the "default" symbol which will contain the JSON object */ + JS_AddModuleExport(ctx, m, "default"); + JS_SetModulePrivateValue(ctx, m, val); + return m; +} + +/* in order to conform with the specification, only the keys should be + tested and not the associated values. */ +int js_module_check_attributes(JSContext *ctx, void *opaque, + JSValueConst attributes) +{ + JSPropertyEnum *tab; + uint32_t i, len; + int ret; + const char *cstr; + size_t cstr_len; + + if (JS_GetOwnPropertyNames(ctx, &tab, &len, attributes, JS_GPN_ENUM_ONLY | JS_GPN_STRING_MASK)) + return -1; + ret = 0; + for(i = 0; i < len; i++) { + cstr = JS_AtomToCStringLen(ctx, &cstr_len, tab[i].atom); + if (!cstr) { + ret = -1; + break; + } + if (!(cstr_len == 4 && !memcmp(cstr, "type", cstr_len))) { + JS_ThrowTypeError(ctx, "import attribute '%s' is not supported", cstr); + ret = -1; + } + JS_FreeCString(ctx, cstr); + if (ret) + break; + } + JS_FreePropertyEnum(ctx, tab, len); + return ret; +} + +/* return > 0 if the attributes indicate a JSON module, 0 otherwise, -1 on error */ +int js_module_test_json(JSContext *ctx, JSValueConst attributes) +{ + JSValue str; + const char *cstr; + size_t len; + int res; + + if (JS_IsUndefined(attributes)) + return 0; + str = JS_GetPropertyStr(ctx, attributes, "type"); + if (JS_IsException(str)) + return -1; + if (!JS_IsString(str)) { + JS_FreeValue(ctx, str); + return 0; + } + cstr = JS_ToCStringLen(ctx, &len, str); + JS_FreeValue(ctx, str); + if (!cstr) + return -1; + if (len == 4 && !memcmp(cstr, "json", len)) { + res = 1; + } else { + /* unknown type - throw error */ + JS_ThrowTypeError(ctx, "unsupported module type: '%s'", cstr); + JS_FreeCString(ctx, cstr); + return -1; + } + JS_FreeCString(ctx, cstr); + return res; +} + +JSModuleDef *js_module_loader(JSContext *ctx, + const char *module_name, void *opaque, + JSValueConst attributes) +{ + JSModuleDef *m; + + if (js__has_suffix(module_name, QJS_NATIVE_MODULE_SUFFIX)) { + m = js_module_loader_so(ctx, module_name); + } else { + int res; + size_t buf_len; + uint8_t *buf; + + res = js_module_test_json(ctx, attributes); + if (res < 0) + return NULL; + buf = js_load_file(ctx, &buf_len, module_name); + if (!buf) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s'", + module_name); + return NULL; + } + if (js__has_suffix(module_name, ".json") || res > 0) { + /* compile as JSON */ + JSValue val; + val = JS_ParseJSON(ctx, (char *)buf, buf_len, module_name); + js_free(ctx, buf); + if (JS_IsException(val)) + return NULL; + m = create_json_module(ctx, module_name, val); + if (!m) + return NULL; + } else { + JSValue func_val; + /* compile the module */ + func_val = JS_Eval(ctx, (char *)buf, buf_len, module_name, + JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY); + js_free(ctx, buf); + if (JS_IsException(func_val)) + return NULL; + if (js_module_set_import_meta(ctx, func_val, true, false) < 0) { + JS_FreeValue(ctx, func_val); + return NULL; + } + /* the module is already referenced, so we must free it */ + m = JS_VALUE_GET_PTR(func_val); + JS_FreeValue(ctx, func_val); + } + } + return m; +} + +static JSValue js_std_exit(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int status; + if (JS_ToInt32(ctx, &status, argv[0])) + status = -1; + exit(status); + return JS_UNDEFINED; +} + +static JSValue js_std_getenv(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *name, *str; + name = JS_ToCString(ctx, argv[0]); + if (!name) + return JS_EXCEPTION; + str = getenv(name); + JS_FreeCString(ctx, name); + if (!str) + return JS_UNDEFINED; + else + return JS_NewString(ctx, str); +} + +#if defined(_WIN32) +static void setenv(const char *name, const char *value, int overwrite) +{ + char *str; + size_t name_len, value_len; + name_len = strlen(name); + value_len = strlen(value); + str = malloc(name_len + 1 + value_len + 1); + memcpy(str, name, name_len); + str[name_len] = '='; + memcpy(str + name_len + 1, value, value_len); + str[name_len + 1 + value_len] = '\0'; + _putenv(str); + free(str); +} + +static void unsetenv(const char *name) +{ + setenv(name, "", true); +} +#endif /* _WIN32 */ + +static JSValue js_std_setenv(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *name, *value; + name = JS_ToCString(ctx, argv[0]); + if (!name) + return JS_EXCEPTION; + value = JS_ToCString(ctx, argv[1]); + if (!value) { + JS_FreeCString(ctx, name); + return JS_EXCEPTION; + } + setenv(name, value, true); + JS_FreeCString(ctx, name); + JS_FreeCString(ctx, value); + return JS_UNDEFINED; +} + +static JSValue js_std_unsetenv(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *name; + name = JS_ToCString(ctx, argv[0]); + if (!name) + return JS_EXCEPTION; + unsetenv(name); + JS_FreeCString(ctx, name); + return JS_UNDEFINED; +} + +/* return an object containing the list of the available environment + variables. */ +static JSValue js_std_getenviron(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + char **envp; + const char *name, *p, *value; + JSValue obj; + uint32_t idx; + size_t name_len; + JSAtom atom; + int ret; + + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) + return JS_EXCEPTION; + envp = environ; + for(idx = 0; envp[idx] != NULL; idx++) { + name = envp[idx]; + p = strchr(name, '='); + name_len = p - name; + if (!p) + continue; + value = p + 1; + atom = JS_NewAtomLen(ctx, name, name_len); + if (atom == JS_ATOM_NULL) + goto fail; + ret = JS_DefinePropertyValue(ctx, obj, atom, JS_NewString(ctx, value), + JS_PROP_C_W_E); + JS_FreeAtom(ctx, atom); + if (ret < 0) + goto fail; + } + return obj; + fail: + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; +} + +static JSValue js_std_gc(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JS_RunGC(JS_GetRuntime(ctx)); + return JS_UNDEFINED; +} + +static int interrupt_handler(JSRuntime *rt, void *opaque) +{ + return (os_pending_signals >> SIGINT) & 1; +} + +static JSValue js_evalScript(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + const char *str = NULL; + size_t len; + JSValue ret, obj; + JSValueConst options_obj, arg; + bool backtrace_barrier = false; + bool eval_function = false; + bool eval_module = false; + bool compile_only = false; + bool compile_module = false; + bool is_async = false; + int flags; + + if (argc >= 2) { + options_obj = argv[1]; + if (get_bool_option(ctx, &backtrace_barrier, options_obj, + "backtrace_barrier")) + return JS_EXCEPTION; + if (get_bool_option(ctx, &eval_function, options_obj, + "eval_function")) + return JS_EXCEPTION; + if (get_bool_option(ctx, &eval_module, options_obj, + "eval_module")) + return JS_EXCEPTION; + if (get_bool_option(ctx, &compile_only, options_obj, + "compile_only")) + return JS_EXCEPTION; + if (get_bool_option(ctx, &compile_module, options_obj, + "compile_module")) + return JS_EXCEPTION; + if (get_bool_option(ctx, &is_async, options_obj, + "async")) + return JS_EXCEPTION; + } + + if (eval_module) { + arg = argv[0]; + if (JS_VALUE_GET_TAG(arg) != JS_TAG_MODULE) + return JS_ThrowTypeError(ctx, "not a module"); + + if (JS_ResolveModule(ctx, arg) < 0) + return JS_EXCEPTION; + + if (js_module_set_import_meta(ctx, arg, false, false) < 0) + return JS_EXCEPTION; + + return JS_EvalFunction(ctx, JS_DupValue(ctx, arg)); + } + + if (!eval_function) { + str = JS_ToCStringLen(ctx, &len, argv[0]); + if (!str) + return JS_EXCEPTION; + } + if (!ts->recv_pipe && ++ts->eval_script_recurse == 1) { + /* install the interrupt handler */ + JS_SetInterruptHandler(JS_GetRuntime(ctx), interrupt_handler, NULL); + } + flags = compile_module ? JS_EVAL_TYPE_MODULE : JS_EVAL_TYPE_GLOBAL; + if (backtrace_barrier) + flags |= JS_EVAL_FLAG_BACKTRACE_BARRIER; + if (compile_only) + flags |= JS_EVAL_FLAG_COMPILE_ONLY; + if (is_async) + flags |= JS_EVAL_FLAG_ASYNC; + if (eval_function) { + obj = JS_DupValue(ctx, argv[0]); + ret = JS_EvalFunction(ctx, obj); // takes ownership of |obj| + } else { + ret = JS_Eval(ctx, str, len, "", flags); + } + JS_FreeCString(ctx, str); + if (!ts->recv_pipe && --ts->eval_script_recurse == 0) { + /* remove the interrupt handler */ + JS_SetInterruptHandler(JS_GetRuntime(ctx), NULL, NULL); + os_pending_signals &= ~((uint64_t)1 << SIGINT); + /* convert the uncatchable "interrupted" error into a normal error + so that it can be caught by the REPL */ + if (JS_IsException(ret)) + JS_ResetUncatchableError(ctx); + } + return ret; +} + +typedef struct { + FILE *f; + bool is_popen; +} JSSTDFile; + +static bool is_stdio(FILE *f) +{ + return f == stdin || f == stdout || f == stderr; +} + +static void js_std_file_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSThreadState *ts = js_get_thread_state(rt); + JSSTDFile *s = JS_GetOpaque(val, ts->std_file_class_id); + if (s) { + if (s->f && !is_stdio(s->f)) { +#if !defined(__wasi__) + if (s->is_popen) + pclose(s->f); + else +#endif + fclose(s->f); + } + js_free_rt(rt, s); + } +} + +static ssize_t js_get_errno(ssize_t ret) +{ + if (ret == -1) + ret = -errno; + return ret; +} + +static JSValue js_std_strerror(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int err; + if (JS_ToInt32(ctx, &err, argv[0])) + return JS_EXCEPTION; + return JS_NewString(ctx, strerror(err)); +} + +static JSValue js_new_std_file(JSContext *ctx, FILE *f, bool is_popen) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSSTDFile *s; + JSValue obj; + obj = JS_NewObjectClass(ctx, ts->std_file_class_id); + if (JS_IsException(obj)) + return obj; + s = js_mallocz(ctx, sizeof(*s)); + if (!s) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + s->is_popen = is_popen; + s->f = f; + JS_SetOpaque(obj, s); + return obj; +} + +static void js_set_error_object(JSContext *ctx, JSValueConst obj, int err) +{ + if (!JS_IsUndefined(obj)) { + JS_SetPropertyStr(ctx, obj, "errno", JS_NewInt32(ctx, err)); + } +} + +static JSValue js_std_open(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *filename, *mode = NULL; + FILE *f; + int err; + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + goto fail; + mode = JS_ToCString(ctx, argv[1]); + if (!mode) + goto fail; + if (mode[strspn(mode, "rwa+bx")] != '\0') { + JS_ThrowTypeError(ctx, "invalid file mode"); + goto fail; + } + + f = fopen(filename, mode); + if (!f) + err = errno; + else + err = 0; + if (argc >= 3) + js_set_error_object(ctx, argv[2], err); + JS_FreeCString(ctx, filename); + JS_FreeCString(ctx, mode); + if (!f) + return JS_NULL; + return js_new_std_file(ctx, f, false); + fail: + JS_FreeCString(ctx, filename); + JS_FreeCString(ctx, mode); + return JS_EXCEPTION; +} + +#if !defined(__wasi__) +static JSValue js_std_popen(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *filename, *mode = NULL; + FILE *f; + int err; + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + goto fail; + mode = JS_ToCString(ctx, argv[1]); + if (!mode) + goto fail; + if (strcmp(mode, "r") && strcmp(mode, "w")) { + JS_ThrowTypeError(ctx, "invalid file mode"); + goto fail; + } + + f = popen(filename, mode); + if (!f) + err = errno; + else + err = 0; + if (argc >= 3) + js_set_error_object(ctx, argv[2], err); + JS_FreeCString(ctx, filename); + JS_FreeCString(ctx, mode); + if (!f) + return JS_NULL; + return js_new_std_file(ctx, f, true); + fail: + JS_FreeCString(ctx, filename); + JS_FreeCString(ctx, mode); + return JS_EXCEPTION; +} +#endif // !defined(__wasi__) + +static JSValue js_std_fdopen(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *mode; + FILE *f; + int fd, err; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + mode = JS_ToCString(ctx, argv[1]); + if (!mode) + goto fail; + if (mode[strspn(mode, "rwa+")] != '\0') { + JS_ThrowTypeError(ctx, "invalid file mode"); + goto fail; + } + + f = fdopen(fd, mode); + if (!f) + err = errno; + else + err = 0; + if (argc >= 3) + js_set_error_object(ctx, argv[2], err); + JS_FreeCString(ctx, mode); + if (!f) + return JS_NULL; + return js_new_std_file(ctx, f, false); + fail: + JS_FreeCString(ctx, mode); + return JS_EXCEPTION; +} + +#if !defined(__wasi__) +static JSValue js_std_tmpfile(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f; + f = tmpfile(); + if (argc >= 1) + js_set_error_object(ctx, argv[0], f ? 0 : errno); + if (!f) + return JS_NULL; + return js_new_std_file(ctx, f, false); +} +#endif + +static JSValue js_std_sprintf(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + return js_printf_internal(ctx, argc, argv, NULL); +} + +static JSValue js_std_printf(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + return js_printf_internal(ctx, argc, argv, stdout); +} + +static FILE *js_std_file_get(JSContext *ctx, JSValueConst obj) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSSTDFile *s = JS_GetOpaque2(ctx, obj, ts->std_file_class_id); + if (!s) + return NULL; + if (!s->f) { + JS_ThrowTypeError(ctx, "invalid file handle"); + return NULL; + } + return s->f; +} + +static JSValue js_std_file_puts(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + FILE *f; + int i; + const char *str; + size_t len; + + if (magic == 0) { + f = stdout; + } else { + f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + } + + for(i = 0; i < argc; i++) { + str = JS_ToCStringLen(ctx, &len, argv[i]); + if (!str) + return JS_EXCEPTION; + fwrite(str, 1, len, f); + JS_FreeCString(ctx, str); + } + return JS_UNDEFINED; +} + +static JSValue js_std_file_close(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSSTDFile *s = JS_GetOpaque2(ctx, this_val, ts->std_file_class_id); + int err; + if (!s) + return JS_EXCEPTION; + if (!s->f) + return JS_ThrowTypeError(ctx, "invalid file handle"); + if (is_stdio(s->f)) + return JS_ThrowTypeError(ctx, "cannot close stdio"); +#if !defined(__wasi__) + if (s->is_popen) + err = js_get_errno(pclose(s->f)); + else +#endif + err = js_get_errno(fclose(s->f)); + s->f = NULL; + return JS_NewInt32(ctx, err); +} + +static JSValue js_std_file_printf(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + return js_printf_internal(ctx, argc, argv, f); +} + +static JSValue js_std_file_flush(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + fflush(f); + return JS_UNDEFINED; +} + +static JSValue js_std_file_tell(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int is_bigint) +{ + FILE *f = js_std_file_get(ctx, this_val); + int64_t pos; + if (!f) + return JS_EXCEPTION; +#if defined(__linux__) || defined(__GLIBC__) + pos = ftello(f); +#else + pos = ftell(f); +#endif + if (is_bigint) + return JS_NewBigInt64(ctx, pos); + else + return JS_NewInt64(ctx, pos); +} + +static JSValue js_std_file_seek(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + int64_t pos; + int whence, ret; + if (!f) + return JS_EXCEPTION; + if (JS_ToInt64Ext(ctx, &pos, argv[0])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &whence, argv[1])) + return JS_EXCEPTION; +#if defined(__linux__) || defined(__GLIBC__) + ret = fseeko(f, pos, whence); +#else + ret = fseek(f, pos, whence); +#endif + if (ret < 0) + ret = -errno; + return JS_NewInt32(ctx, ret); +} + +static JSValue js_std_file_eof(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + return JS_NewBool(ctx, feof(f)); +} + +static JSValue js_std_file_error(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + return JS_NewBool(ctx, ferror(f)); +} + +static JSValue js_std_file_clearerr(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + clearerr(f); + return JS_UNDEFINED; +} + +static JSValue js_std_file_fileno(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + return JS_NewInt32(ctx, fileno(f)); +} + +static JSValue js_std_file_read_write(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + FILE *f = js_std_file_get(ctx, this_val); + uint64_t pos, len; + size_t size, ret; + uint8_t *buf; + + if (!f) + return JS_EXCEPTION; + if (JS_ToIndex(ctx, &pos, argv[1])) + return JS_EXCEPTION; + if (JS_ToIndex(ctx, &len, argv[2])) + return JS_EXCEPTION; + buf = JS_GetArrayBuffer(ctx, &size, argv[0]); + if (!buf) + return JS_EXCEPTION; + if (pos + len > size) + return JS_ThrowRangeError(ctx, "read/write array buffer overflow"); + if (magic) + ret = fwrite(buf + pos, 1, len, f); + else + ret = fread(buf + pos, 1, len, f); + return JS_NewInt64(ctx, ret); +} + +/* XXX: could use less memory and go faster */ +static JSValue js_std_file_getline(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + int c; + DynBuf dbuf; + JSValue obj; + + if (!f) + return JS_EXCEPTION; + + js_std_dbuf_init(ctx, &dbuf); + for(;;) { + c = fgetc(f); + if (c == EOF) { + if (dbuf.size == 0) { + /* EOF */ + dbuf_free(&dbuf); + return JS_NULL; + } else { + break; + } + } + if (c == '\n') + break; + if (dbuf_putc(&dbuf, c)) { + dbuf_free(&dbuf); + return JS_ThrowOutOfMemory(ctx); + } + } + obj = JS_NewStringLen(ctx, (const char *)dbuf.buf, dbuf.size); + dbuf_free(&dbuf); + return obj; +} + +/* XXX: could use less memory and go faster */ +static JSValue js_std_file_readAs(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + FILE *f = js_std_file_get(ctx, this_val); + int c; + DynBuf dbuf; + JSValue obj; + uint64_t max_size64; + size_t max_size; + JSValueConst max_size_val; + + if (!f) + return JS_EXCEPTION; + + if (argc >= 1) + max_size_val = argv[0]; + else + max_size_val = JS_UNDEFINED; + max_size = (size_t)-1; + if (!JS_IsUndefined(max_size_val)) { + if (JS_ToIndex(ctx, &max_size64, max_size_val)) + return JS_EXCEPTION; + if (max_size64 < max_size) + max_size = max_size64; + } + + js_std_dbuf_init(ctx, &dbuf); + while (max_size != 0) { + c = fgetc(f); + if (c == EOF) + break; + if (dbuf_putc(&dbuf, c)) { + dbuf_free(&dbuf); + return JS_EXCEPTION; + } + max_size--; + } + if (magic) { + obj = JS_NewStringLen(ctx, (const char *)dbuf.buf, dbuf.size); + } else { + obj = JS_NewArrayBufferCopy(ctx, dbuf.buf, dbuf.size); + } + dbuf_free(&dbuf); + return obj; +} + +static JSValue js_std_file_getByte(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + if (!f) + return JS_EXCEPTION; + return JS_NewInt32(ctx, fgetc(f)); +} + +static JSValue js_std_file_putByte(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + FILE *f = js_std_file_get(ctx, this_val); + int c; + if (!f) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &c, argv[0])) + return JS_EXCEPTION; + c = fputc(c, f); + return JS_NewInt32(ctx, c); +} + +/* urlGet */ +#if !defined(__wasi__) + +#define URL_GET_PROGRAM "curl -s -i --" +#define URL_GET_BUF_SIZE 4096 + +static int http_get_header_line(FILE *f, char *buf, size_t buf_size, + DynBuf *dbuf) +{ + int c; + char *p; + + p = buf; + for(;;) { + c = fgetc(f); + if (c < 0) + return -1; + if ((p - buf) < buf_size - 1) + *p++ = c; + if (dbuf) + dbuf_putc(dbuf, c); + if (c == '\n') + break; + } + *p = '\0'; + return 0; +} + +static int http_get_status(const char *buf) +{ + const char *p = buf; + while (*p != ' ' && *p != '\0') + p++; + if (*p != ' ') + return 0; + while (*p == ' ') + p++; + return atoi(p); +} + +static JSValue js_std_urlGet(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *url; + DynBuf cmd_buf; + DynBuf data_buf_s, *data_buf = &data_buf_s; + DynBuf header_buf_s, *header_buf = &header_buf_s; + char *buf; + size_t i, len; + int status; + JSValue response = JS_UNDEFINED, ret_obj; + JSValueConst options_obj; + FILE *f; + bool binary_flag, full_flag; + + url = JS_ToCString(ctx, argv[0]); + if (!url) + return JS_EXCEPTION; + + binary_flag = false; + full_flag = false; + + if (argc >= 2) { + options_obj = argv[1]; + + if (get_bool_option(ctx, &binary_flag, options_obj, "binary")) + goto fail_obj; + + if (get_bool_option(ctx, &full_flag, options_obj, "full")) { + fail_obj: + JS_FreeCString(ctx, url); + return JS_EXCEPTION; + } + } + + js_std_dbuf_init(ctx, &cmd_buf); + dbuf_printf(&cmd_buf, "%s '", URL_GET_PROGRAM); + for(i = 0; url[i] != '\0'; i++) { + unsigned char c = url[i]; + switch (c) { + case '\'': + /* shell single quoted string does not support \' */ + dbuf_putstr(&cmd_buf, "'\\''"); + break; + case '[': case ']': case '{': case '}': case '\\': + /* prevent interpretation by curl as range or set specification */ + dbuf_putc(&cmd_buf, '\\'); + /* FALLTHROUGH */ + default: + dbuf_putc(&cmd_buf, c); + break; + } + } + JS_FreeCString(ctx, url); + dbuf_putstr(&cmd_buf, "'"); + dbuf_putc(&cmd_buf, '\0'); + if (dbuf_error(&cmd_buf)) { + dbuf_free(&cmd_buf); + return JS_EXCEPTION; + } + // printf("%s\n", (char *)cmd_buf.buf); + f = popen((char *)cmd_buf.buf, "r"); + dbuf_free(&cmd_buf); + if (!f) { + return JS_ThrowTypeError(ctx, "could not start curl"); + } + + js_std_dbuf_init(ctx, data_buf); + js_std_dbuf_init(ctx, header_buf); + + buf = js_malloc(ctx, URL_GET_BUF_SIZE); + if (!buf) + goto fail; + + /* get the HTTP status */ + if (http_get_header_line(f, buf, URL_GET_BUF_SIZE, NULL) < 0) { + status = 0; + goto bad_header; + } + status = http_get_status(buf); + if (!full_flag && !(status >= 200 && status <= 299)) { + goto bad_header; + } + + /* wait until there is an empty line */ + for(;;) { + if (http_get_header_line(f, buf, URL_GET_BUF_SIZE, header_buf) < 0) { + bad_header: + response = JS_NULL; + goto done; + } + if (!strcmp(buf, "\r\n")) + break; + } + if (dbuf_error(header_buf)) + goto fail; + header_buf->size -= 2; /* remove the trailing CRLF */ + + /* download the data */ + for(;;) { + len = fread(buf, 1, URL_GET_BUF_SIZE, f); + if (len == 0) + break; + dbuf_put(data_buf, (uint8_t *)buf, len); + } + if (dbuf_error(data_buf)) + goto fail; + if (binary_flag) { + response = JS_NewArrayBufferCopy(ctx, + data_buf->buf, data_buf->size); + } else { + response = JS_NewStringLen(ctx, (char *)data_buf->buf, data_buf->size); + } + if (JS_IsException(response)) + goto fail; + done: + js_free(ctx, buf); + buf = NULL; + pclose(f); + f = NULL; + dbuf_free(data_buf); + data_buf = NULL; + + if (full_flag) { + ret_obj = JS_NewObject(ctx); + if (JS_IsException(ret_obj)) + goto fail; + JS_DefinePropertyValueStr(ctx, ret_obj, "response", + response, + JS_PROP_C_W_E); + if (!JS_IsNull(response)) { + JS_DefinePropertyValueStr(ctx, ret_obj, "responseHeaders", + JS_NewStringLen(ctx, (char *)header_buf->buf, + header_buf->size), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, ret_obj, "status", + JS_NewInt32(ctx, status), + JS_PROP_C_W_E); + } + } else { + ret_obj = response; + } + dbuf_free(header_buf); + return ret_obj; + fail: + if (f) + pclose(f); + js_free(ctx, buf); + if (data_buf) + dbuf_free(data_buf); + if (header_buf) + dbuf_free(header_buf); + JS_FreeValue(ctx, response); + return JS_EXCEPTION; +} +#endif // !defined(__wasi__) + +static JSClassDef js_std_file_class = { + "FILE", + .finalizer = js_std_file_finalizer, +}; + +static const JSCFunctionListEntry js_std_error_props[] = { + /* various errno values */ +#define DEF(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE ) + DEF(EINVAL), + DEF(EIO), + DEF(EACCES), + DEF(EEXIST), + DEF(ENOSPC), + DEF(ENOSYS), + DEF(EBUSY), + DEF(ENOENT), + DEF(EPERM), + DEF(EPIPE), + DEF(EBADF), +#undef DEF +}; + +static const JSCFunctionListEntry js_std_funcs[] = { + JS_CFUNC_DEF("exit", 1, js_std_exit ), + JS_CFUNC_DEF("gc", 0, js_std_gc ), + JS_CFUNC_DEF("evalScript", 1, js_evalScript ), + JS_CFUNC_DEF("loadScript", 1, js_loadScript ), + JS_CFUNC_DEF("getenv", 1, js_std_getenv ), + JS_CFUNC_DEF("setenv", 1, js_std_setenv ), + JS_CFUNC_DEF("unsetenv", 1, js_std_unsetenv ), + JS_CFUNC_DEF("getenviron", 1, js_std_getenviron ), +#if !defined(__wasi__) + JS_CFUNC_DEF("urlGet", 1, js_std_urlGet ), +#endif + JS_CFUNC_DEF("loadFile", 1, js_std_loadFile ), + JS_CFUNC_DEF("writeFile", 2, js_std_writeFile ), + JS_CFUNC_DEF("strerror", 1, js_std_strerror ), + + /* FILE I/O */ + JS_CFUNC_DEF("open", 2, js_std_open ), +#if !defined(__wasi__) + JS_CFUNC_DEF("popen", 2, js_std_popen ), + JS_CFUNC_DEF("tmpfile", 0, js_std_tmpfile ), +#endif + JS_CFUNC_DEF("fdopen", 2, js_std_fdopen ), + JS_CFUNC_MAGIC_DEF("puts", 1, js_std_file_puts, 0 ), + JS_CFUNC_DEF("printf", 1, js_std_printf ), + JS_CFUNC_DEF("sprintf", 1, js_std_sprintf ), + JS_PROP_INT32_DEF("SEEK_SET", SEEK_SET, JS_PROP_CONFIGURABLE ), + JS_PROP_INT32_DEF("SEEK_CUR", SEEK_CUR, JS_PROP_CONFIGURABLE ), + JS_PROP_INT32_DEF("SEEK_END", SEEK_END, JS_PROP_CONFIGURABLE ), + JS_OBJECT_DEF("Error", js_std_error_props, countof(js_std_error_props), JS_PROP_CONFIGURABLE), +}; + +static const JSCFunctionListEntry js_std_file_proto_funcs[] = { + JS_CFUNC_DEF("close", 0, js_std_file_close ), + JS_CFUNC_MAGIC_DEF("puts", 1, js_std_file_puts, 1 ), + JS_CFUNC_DEF("printf", 1, js_std_file_printf ), + JS_CFUNC_DEF("flush", 0, js_std_file_flush ), + JS_CFUNC_MAGIC_DEF("tell", 0, js_std_file_tell, 0 ), + JS_CFUNC_MAGIC_DEF("tello", 0, js_std_file_tell, 1 ), + JS_CFUNC_DEF("seek", 2, js_std_file_seek ), + JS_CFUNC_DEF("eof", 0, js_std_file_eof ), + JS_CFUNC_DEF("fileno", 0, js_std_file_fileno ), + JS_CFUNC_DEF("error", 0, js_std_file_error ), + JS_CFUNC_DEF("clearerr", 0, js_std_file_clearerr ), + JS_CFUNC_MAGIC_DEF("read", 3, js_std_file_read_write, 0 ), + JS_CFUNC_MAGIC_DEF("write", 3, js_std_file_read_write, 1 ), + JS_CFUNC_DEF("getline", 0, js_std_file_getline ), + JS_CFUNC_MAGIC_DEF("readAsArrayBuffer", 0, js_std_file_readAs, 0 ), + JS_CFUNC_MAGIC_DEF("readAsString", 0, js_std_file_readAs, 1 ), + JS_CFUNC_DEF("getByte", 0, js_std_file_getByte ), + JS_CFUNC_DEF("putByte", 1, js_std_file_putByte ), + /* setvbuf, ... */ +}; + +static int js_std_init(JSContext *ctx, JSModuleDef *m) +{ + JSValue proto; + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + + /* FILE class */ + /* the class ID is created once */ + JS_NewClassID(rt, &ts->std_file_class_id); + /* the class is created once per runtime */ + JS_NewClass(rt, ts->std_file_class_id, &js_std_file_class); + proto = JS_NewObject(ctx); + JS_SetPropertyFunctionList(ctx, proto, js_std_file_proto_funcs, + countof(js_std_file_proto_funcs)); + JS_SetClassProto(ctx, ts->std_file_class_id, proto); + + JS_SetModuleExportList(ctx, m, js_std_funcs, + countof(js_std_funcs)); + JS_SetModuleExport(ctx, m, "in", js_new_std_file(ctx, stdin, false)); + JS_SetModuleExport(ctx, m, "out", js_new_std_file(ctx, stdout, false)); + JS_SetModuleExport(ctx, m, "err", js_new_std_file(ctx, stderr, false)); + return 0; +} + +JSModuleDef *js_init_module_std(JSContext *ctx, const char *module_name) +{ + JSModuleDef *m; + m = JS_NewCModule(ctx, module_name, js_std_init); + if (!m) + return NULL; + JS_AddModuleExportList(ctx, m, js_std_funcs, countof(js_std_funcs)); + JS_AddModuleExport(ctx, m, "in"); + JS_AddModuleExport(ctx, m, "out"); + JS_AddModuleExport(ctx, m, "err"); + return m; +} + +/**********************************************************/ +/* 'os' object */ + +static JSValue js_os_open(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *filename; + int flags, mode, ret; + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &flags, argv[1])) + goto fail; + if (argc >= 3 && !JS_IsUndefined(argv[2])) { + if (JS_ToInt32(ctx, &mode, argv[2])) { + fail: + JS_FreeCString(ctx, filename); + return JS_EXCEPTION; + } + } else { + mode = 0666; + } +#if defined(_WIN32) + /* force binary mode by default */ + if (!(flags & O_TEXT)) + flags |= O_BINARY; +#endif + ret = js_get_errno(open(filename, flags, mode)); + JS_FreeCString(ctx, filename); + return JS_NewInt32(ctx, ret); +} + +static JSValue js_os_close(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd, ret; + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + ret = js_get_errno(close(fd)); + return JS_NewInt32(ctx, ret); +} + +static JSValue js_os_seek(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd, whence; + int64_t pos, ret; + bool is_bigint; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + is_bigint = JS_IsBigInt(argv[1]); + if (JS_ToInt64Ext(ctx, &pos, argv[1])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &whence, argv[2])) + return JS_EXCEPTION; + ret = lseek(fd, pos, whence); + if (ret == -1) + ret = -errno; + if (is_bigint) + return JS_NewBigInt64(ctx, ret); + else + return JS_NewInt64(ctx, ret); +} + +static JSValue js_os_read_write(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + int fd; + uint64_t pos, len; + size_t size; + ssize_t ret; + uint8_t *buf; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + if (JS_ToIndex(ctx, &pos, argv[2])) + return JS_EXCEPTION; + if (JS_ToIndex(ctx, &len, argv[3])) + return JS_EXCEPTION; + buf = JS_GetArrayBuffer(ctx, &size, argv[1]); + if (!buf) + return JS_EXCEPTION; + if (pos + len > size) + return JS_ThrowRangeError(ctx, "read/write array buffer overflow"); + if (magic) + ret = js_get_errno(write(fd, buf + pos, len)); + else + ret = js_get_errno(read(fd, buf + pos, len)); + return JS_NewInt64(ctx, ret); +} + +static JSValue js_os_isatty(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd; + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + return JS_NewBool(ctx, (isatty(fd) != 0)); +} + +#if defined(_WIN32) +static JSValue js_os_ttyGetWinSize(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd; + HANDLE handle; + CONSOLE_SCREEN_BUFFER_INFO info; + JSValue obj; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + handle = (HANDLE)_get_osfhandle(fd); + + if (!GetConsoleScreenBufferInfo(handle, &info)) + return JS_NULL; + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) + return obj; + JS_DefinePropertyValueUint32(ctx, obj, 0, JS_NewInt32(ctx, info.dwSize.X), JS_PROP_C_W_E); + JS_DefinePropertyValueUint32(ctx, obj, 1, JS_NewInt32(ctx, info.dwSize.Y), JS_PROP_C_W_E); + return obj; +} + +/* Windows 10 built-in VT100 emulation */ +#define __ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#define __ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 + +static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd; + HANDLE handle; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + handle = (HANDLE)_get_osfhandle(fd); + SetConsoleMode(handle, ENABLE_WINDOW_INPUT | __ENABLE_VIRTUAL_TERMINAL_INPUT); + _setmode(fd, _O_BINARY); + if (fd == 0) { + handle = (HANDLE)_get_osfhandle(1); /* corresponding output */ + SetConsoleMode(handle, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT | __ENABLE_VIRTUAL_TERMINAL_PROCESSING); + } + return JS_UNDEFINED; +} +#elif !defined(__wasi__) +static JSValue js_os_ttyGetWinSize(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd; + struct winsize ws; + JSValue obj; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + if (ioctl(fd, TIOCGWINSZ, &ws) == 0 && + ws.ws_col >= 4 && ws.ws_row >= 4) { + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) + return obj; + JS_DefinePropertyValueUint32(ctx, obj, 0, JS_NewInt32(ctx, ws.ws_col), JS_PROP_C_W_E); + JS_DefinePropertyValueUint32(ctx, obj, 1, JS_NewInt32(ctx, ws.ws_row), JS_PROP_C_W_E); + return obj; + } else { + return JS_NULL; + } +} + +static struct termios oldtty; + +static void term_exit(void) +{ + tcsetattr(0, TCSANOW, &oldtty); +} + +/* XXX: should add a way to go back to normal mode */ +static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + struct termios tty; + int fd; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + + memset(&tty, 0, sizeof(tty)); + tcgetattr(fd, &tty); + oldtty = tty; + + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP + |INLCR|IGNCR|ICRNL|IXON); + tty.c_oflag |= OPOST; + tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN); + tty.c_cflag &= ~(CSIZE|PARENB); + tty.c_cflag |= CS8; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + + tcsetattr(fd, TCSANOW, &tty); + + atexit(term_exit); + return JS_UNDEFINED; +} + +#endif /* !_WIN32 && !__wasi__ */ + +static JSValue js_os_remove(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *filename; + int ret; + + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + return JS_EXCEPTION; +#if defined(_WIN32) + { + struct stat st; + if (stat(filename, &st) == 0 && (st.st_mode & _S_IFDIR)) { + ret = rmdir(filename); + } else { + ret = unlink(filename); + } + } +#else + ret = remove(filename); +#endif + ret = js_get_errno(ret); + JS_FreeCString(ctx, filename); + return JS_NewInt32(ctx, ret); +} + +static JSValue js_os_rename(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *oldpath, *newpath; + int ret; + + oldpath = JS_ToCString(ctx, argv[0]); + if (!oldpath) + return JS_EXCEPTION; + newpath = JS_ToCString(ctx, argv[1]); + if (!newpath) { + JS_FreeCString(ctx, oldpath); + return JS_EXCEPTION; + } + ret = js_get_errno(rename(oldpath, newpath)); + JS_FreeCString(ctx, oldpath); + JS_FreeCString(ctx, newpath); + return JS_NewInt32(ctx, ret); +} + +static bool is_main_thread(JSRuntime *rt) +{ + JSThreadState *ts = js_get_thread_state(rt); + return !ts->recv_pipe; +} + +static JSOSRWHandler *find_rh(JSThreadState *ts, int fd) +{ + JSOSRWHandler *rh; + struct list_head *el; + + list_for_each(el, &ts->os_rw_handlers) { + rh = list_entry(el, JSOSRWHandler, link); + if (rh->fd == fd) + return rh; + } + return NULL; +} + +static void free_rw_handler(JSRuntime *rt, JSOSRWHandler *rh) +{ + int i; + list_del(&rh->link); + for(i = 0; i < 2; i++) { + JS_FreeValueRT(rt, rh->rw_func[i]); + } + js_free_rt(rt, rh); +} + +static JSValue js_os_setReadHandler(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSOSRWHandler *rh; + int fd; + JSValueConst func; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + func = argv[1]; + if (JS_IsNull(func)) { + rh = find_rh(ts, fd); + if (rh) { + JS_FreeValue(ctx, rh->rw_func[magic]); + rh->rw_func[magic] = JS_NULL; + if (JS_IsNull(rh->rw_func[0]) && + JS_IsNull(rh->rw_func[1])) { + /* remove the entry */ + free_rw_handler(JS_GetRuntime(ctx), rh); + } + } + } else { + if (!JS_IsFunction(ctx, func)) + return JS_ThrowTypeError(ctx, "not a function"); + rh = find_rh(ts, fd); + if (!rh) { + rh = js_mallocz(ctx, sizeof(*rh)); + if (!rh) + return JS_EXCEPTION; + rh->fd = fd; + rh->rw_func[0] = JS_NULL; + rh->rw_func[1] = JS_NULL; + list_add_tail(&rh->link, &ts->os_rw_handlers); + } + JS_FreeValue(ctx, rh->rw_func[magic]); + rh->rw_func[magic] = JS_DupValue(ctx, func); + } + return JS_UNDEFINED; +} + +static JSOSSignalHandler *find_sh(JSThreadState *ts, int sig_num) +{ + JSOSSignalHandler *sh; + struct list_head *el; + list_for_each(el, &ts->os_signal_handlers) { + sh = list_entry(el, JSOSSignalHandler, link); + if (sh->sig_num == sig_num) + return sh; + } + return NULL; +} + +static void free_sh(JSRuntime *rt, JSOSSignalHandler *sh) +{ + list_del(&sh->link); + JS_FreeValueRT(rt, sh->func); + js_free_rt(rt, sh); +} + +static void os_signal_handler(int sig_num) +{ + os_pending_signals |= ((uint64_t)1 << sig_num); +} + +#if defined(_WIN32) +typedef void (*sighandler_t)(int sig_num); +#endif + +static JSValue js_os_signal(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSOSSignalHandler *sh; + uint32_t sig_num; + JSValueConst func; + sighandler_t handler; + + if (!is_main_thread(rt)) + return JS_ThrowTypeError(ctx, "signal handler can only be set in the main thread"); + + if (JS_ToUint32(ctx, &sig_num, argv[0])) + return JS_EXCEPTION; + if (sig_num >= 64) + return JS_ThrowRangeError(ctx, "invalid signal number"); + func = argv[1]; + /* func = null: SIG_DFL, func = undefined, SIG_IGN */ + if (JS_IsNull(func) || JS_IsUndefined(func)) { + sh = find_sh(ts, sig_num); + if (sh) { + free_sh(JS_GetRuntime(ctx), sh); + } + if (JS_IsNull(func)) + handler = SIG_DFL; + else + handler = SIG_IGN; + signal(sig_num, handler); + } else { + if (!JS_IsFunction(ctx, func)) + return JS_ThrowTypeError(ctx, "not a function"); + sh = find_sh(ts, sig_num); + if (!sh) { + sh = js_mallocz(ctx, sizeof(*sh)); + if (!sh) + return JS_EXCEPTION; + sh->sig_num = sig_num; + list_add_tail(&sh->link, &ts->os_signal_handlers); + } + JS_FreeValue(ctx, sh->func); + sh->func = JS_DupValue(ctx, func); + signal(sig_num, os_signal_handler); + } + return JS_UNDEFINED; +} + +#if !defined(_WIN32) && !defined(__wasi__) +static JSValue js_os_cputime(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + struct rusage ru; + int64_t cputime; + + cputime = 0; + if (!getrusage(RUSAGE_SELF, &ru)) + cputime = (int64_t)ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec; + + return JS_NewInt64(ctx, cputime); +} +#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) +{ + return JS_NewInt64(ctx, js__hrtime_ns() / 1000); +} + +static uint64_t js__hrtime_ms(void) +{ + return js__hrtime_ns() / (1000 * 1000); +} + +static void free_timer(JSRuntime *rt, JSOSTimer *th) +{ + list_del(&th->link); + JS_FreeValueRT(rt, th->func); + js_free_rt(rt, th); +} + +// TODO(bnoordhuis) accept string as first arg and eval at timer expiry +// TODO(bnoordhuis) retain argv[2..] as args for callback if argc > 2 +static JSValue js_os_setTimeout(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + int64_t delay; + JSValueConst func; + JSOSTimer *th; + + func = argv[0]; + if (!JS_IsFunction(ctx, func)) + return JS_ThrowTypeError(ctx, "not a function"); + if (JS_ToInt64(ctx, &delay, argv[1])) + return JS_EXCEPTION; + if (delay < 1) + delay = 1; + th = js_mallocz(ctx, sizeof(*th)); + if (!th) + return JS_EXCEPTION; + th->timer_id = ts->next_timer_id++; + if (ts->next_timer_id > MAX_SAFE_INTEGER) + ts->next_timer_id = 1; + th->repeats = (magic > 0); + th->timeout = js__hrtime_ms() + delay; + th->delay = delay; + th->func = JS_DupValue(ctx, func); + list_add_tail(&th->link, &ts->os_timers); + return JS_NewInt64(ctx, th->timer_id); +} + +static JSOSTimer *find_timer_by_id(JSThreadState *ts, int timer_id) +{ + struct list_head *el; + if (timer_id <= 0) + return NULL; + list_for_each(el, &ts->os_timers) { + JSOSTimer *th = list_entry(el, JSOSTimer, link); + if (th->timer_id == timer_id) + return th; + } + return NULL; +} + +static JSValue js_os_clearTimeout(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSOSTimer *th; + int64_t timer_id; + + if (JS_ToInt64(ctx, &timer_id, argv[0])) + return JS_EXCEPTION; + th = find_timer_by_id(ts, timer_id); + if (!th) + return JS_UNDEFINED; + free_timer(rt, th); + return JS_UNDEFINED; +} + +/* return a promise */ +static JSValue js_os_sleepAsync(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + int64_t delay; + JSOSTimer *th; + JSValue promise, resolving_funcs[2]; + + if (JS_ToInt64(ctx, &delay, argv[0])) + return JS_EXCEPTION; + promise = JS_NewPromiseCapability(ctx, resolving_funcs); + if (JS_IsException(promise)) + return JS_EXCEPTION; + + th = js_mallocz(ctx, sizeof(*th)); + if (!th) { + JS_FreeValue(ctx, promise); + JS_FreeValue(ctx, resolving_funcs[0]); + JS_FreeValue(ctx, resolving_funcs[1]); + return JS_EXCEPTION; + } + th->timer_id = -1; + th->timeout = js__hrtime_ms() + delay; + th->func = JS_DupValue(ctx, resolving_funcs[0]); + list_add_tail(&th->link, &ts->os_timers); + JS_FreeValue(ctx, resolving_funcs[0]); + JS_FreeValue(ctx, resolving_funcs[1]); + return promise; +} + +static int call_handler(JSContext *ctx, JSValue func) +{ + int r; + JSValue ret, func1; + /* 'func' might be destroyed when calling itself (if it frees the + handler), so must take extra care */ + func1 = JS_DupValue(ctx, func); + ret = JS_Call(ctx, func1, JS_UNDEFINED, 0, NULL); + JS_FreeValue(ctx, func1); + r = 0; + if (JS_IsException(ret)) + r = -1; + JS_FreeValue(ctx, ret); + return r; +} + +static int js_os_run_timers(JSRuntime *rt, JSContext *ctx, JSThreadState *ts, int *min_delay) +{ + JSValue func; + JSOSTimer *th; + int64_t cur_time, delay; + struct list_head *el; + int r; + + if (list_empty(&ts->os_timers)) { + *min_delay = -1; + return 0; + } + + cur_time = js__hrtime_ms(); + *min_delay = INT32_MAX; + + list_for_each(el, &ts->os_timers) { + th = list_entry(el, JSOSTimer, link); + delay = th->timeout - cur_time; + if (delay > 0) { + *min_delay = min_int(*min_delay, delay); + } else { + *min_delay = 0; + func = JS_DupValueRT(rt, th->func); + if (th->repeats) + th->timeout = cur_time + th->delay; + else + free_timer(rt, th); + r = call_handler(ctx, func); + JS_FreeValueRT(rt, func); + return r; + } + } + + return 0; +} + +#ifdef USE_WORKER + +#ifdef _WIN32 + +static int js_waker_init(JSWaker *w) +{ + w->handle = CreateEvent(NULL, TRUE, FALSE, NULL); + return w->handle ? 0 : -1; +} + +static void js_waker_signal(JSWaker *w) +{ + SetEvent(w->handle); +} + +static void js_waker_clear(JSWaker *w) +{ + ResetEvent(w->handle); +} + +static void js_waker_close(JSWaker *w) +{ + CloseHandle(w->handle); + w->handle = INVALID_HANDLE_VALUE; +} + +#else // !_WIN32 + +static int js_waker_init(JSWaker *w) +{ + int fds[2]; + + if (pipe(fds) < 0) + return -1; + w->read_fd = fds[0]; + w->write_fd = fds[1]; + return 0; +} + +static void js_waker_signal(JSWaker *w) +{ + int ret; + + for(;;) { + ret = write(w->write_fd, "", 1); + if (ret == 1) + break; + if (ret < 0 && (errno != EAGAIN || errno != EINTR)) + break; + } +} + +static void js_waker_clear(JSWaker *w) +{ + uint8_t buf[16]; + int ret; + + for(;;) { + ret = read(w->read_fd, buf, sizeof(buf)); + if (ret >= 0) + break; + if (errno != EAGAIN && errno != EINTR) + break; + } +} + +static void js_waker_close(JSWaker *w) +{ + close(w->read_fd); + close(w->write_fd); + w->read_fd = -1; + w->write_fd = -1; +} + +#endif // _WIN32 + +static void js_free_message(JSWorkerMessage *msg); + +/* return 1 if a message was handled, 0 if no message */ +static int handle_posted_message(JSRuntime *rt, JSContext *ctx, + JSWorkerMessageHandler *port) +{ + JSWorkerMessagePipe *ps = port->recv_pipe; + int ret; + struct list_head *el; + JSWorkerMessage *msg; + JSValue obj, data_obj, func, retval; + + js_mutex_lock(&ps->mutex); + if (!list_empty(&ps->msg_queue)) { + el = ps->msg_queue.next; + msg = list_entry(el, JSWorkerMessage, link); + + /* remove the message from the queue */ + list_del(&msg->link); + + // drain read end of pipe + if (list_empty(&ps->msg_queue)) + js_waker_clear(&ps->waker); + + js_mutex_unlock(&ps->mutex); + + data_obj = JS_ReadObject(ctx, msg->data, msg->data_len, + JS_READ_OBJ_SAB | JS_READ_OBJ_REFERENCE); + + js_free_message(msg); + + if (JS_IsException(data_obj)) + goto fail; + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) { + JS_FreeValue(ctx, data_obj); + goto fail; + } + JS_DefinePropertyValueStr(ctx, obj, "data", data_obj, JS_PROP_C_W_E); + + /* 'func' might be destroyed when calling itself (if it frees the + handler), so must take extra care */ + func = JS_DupValue(ctx, port->on_message_func); + retval = JS_Call(ctx, func, JS_UNDEFINED, 1, (JSValueConst *)&obj); + JS_FreeValue(ctx, obj); + JS_FreeValue(ctx, func); + if (JS_IsException(retval)) { + fail: + js_std_dump_error(ctx); + } else { + JS_FreeValue(ctx, retval); + } + ret = 1; + } else { + js_mutex_unlock(&ps->mutex); + ret = 0; + } + return ret; +} + +#endif // USE_WORKER + +#if defined(_WIN32) +static int js_os_poll(JSContext *ctx) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + int min_delay, count; + JSOSRWHandler *rh; + struct list_head *el; + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; // 64 + + /* XXX: handle signals if useful */ + + if (js_os_run_timers(rt, ctx, ts, &min_delay)) + return -1; + if (min_delay == 0) + return 0; // expired timer + if (min_delay < 0) + if (list_empty(&ts->os_rw_handlers) && list_empty(&ts->port_list)) + return -1; /* no more events */ + + count = 0; + list_for_each(el, &ts->os_rw_handlers) { + rh = list_entry(el, JSOSRWHandler, link); + if (rh->fd == 0 && !JS_IsNull(rh->rw_func[0])) + handles[count++] = (HANDLE)_get_osfhandle(rh->fd); // stdin + if (count == (int)countof(handles)) + break; + } + + list_for_each(el, &ts->port_list) { + JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link); + if (JS_IsNull(port->on_message_func)) + continue; + handles[count++] = port->recv_pipe->waker.handle; + if (count == (int)countof(handles)) + break; + } + + if (count > 0) { + DWORD ret, timeout = INFINITE; + if (min_delay != -1) + timeout = min_delay; + ret = WaitForMultipleObjects(count, handles, FALSE, timeout); + if (ret < count) { + list_for_each(el, &ts->os_rw_handlers) { + rh = list_entry(el, JSOSRWHandler, link); + if (rh->fd == 0 && !JS_IsNull(rh->rw_func[0])) { + return call_handler(ctx, rh->rw_func[0]); + /* must stop because the list may have been modified */ + } + } + + list_for_each(el, &ts->port_list) { + JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link); + if (!JS_IsNull(port->on_message_func)) { + JSWorkerMessagePipe *ps = port->recv_pipe; + if (ps->waker.handle == handles[ret]) { + if (handle_posted_message(rt, ctx, port)) + goto done; + } + } + } + } + } else { + Sleep(min_delay); + } +done: + return 0; +} +#else // !defined(_WIN32) +static int js_os_poll(JSContext *ctx) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + int r, w, ret, nfds, min_delay; + JSOSRWHandler *rh; + struct list_head *el; + struct pollfd *pfd, *pfds, pfds_local[64]; + + /* only check signals in the main thread */ + if (!ts->recv_pipe && + unlikely(os_pending_signals != 0)) { + JSOSSignalHandler *sh; + uint64_t mask; + + list_for_each(el, &ts->os_signal_handlers) { + sh = list_entry(el, JSOSSignalHandler, link); + mask = (uint64_t)1 << sh->sig_num; + if (os_pending_signals & mask) { + os_pending_signals &= ~mask; + return call_handler(ctx, sh->func); + } + } + } + + if (js_os_run_timers(rt, ctx, ts, &min_delay)) + return -1; + if (min_delay == 0) + return 0; // expired timer + if (min_delay < 0) + if (list_empty(&ts->os_rw_handlers) && list_empty(&ts->port_list)) + return -1; /* no more events */ + + nfds = 0; + list_for_each(el, &ts->os_rw_handlers) { + rh = list_entry(el, JSOSRWHandler, link); + nfds += (!JS_IsNull(rh->rw_func[0]) || !JS_IsNull(rh->rw_func[1])); + } + +#ifdef USE_WORKER + list_for_each(el, &ts->port_list) { + JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link); + nfds += !JS_IsNull(port->on_message_func); + } +#endif // USE_WORKER + + pfd = pfds = pfds_local; + if (nfds > (int)countof(pfds_local)) { + pfd = pfds = js_malloc(ctx, nfds * sizeof(*pfd)); + if (!pfd) + return -1; + } + + list_for_each(el, &ts->os_rw_handlers) { + rh = list_entry(el, JSOSRWHandler, link); + r = POLLIN * !JS_IsNull(rh->rw_func[0]); + w = POLLOUT * !JS_IsNull(rh->rw_func[1]); + if (r || w) + *pfd++ = (struct pollfd){rh->fd, r|w, 0}; + } + +#ifdef USE_WORKER + list_for_each(el, &ts->port_list) { + JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link); + if (!JS_IsNull(port->on_message_func)) { + JSWorkerMessagePipe *ps = port->recv_pipe; + *pfd++ = (struct pollfd){ps->waker.read_fd, POLLIN, 0}; + } + } +#endif // USE_WORKER + + // FIXME(bnoordhuis) the loop below is quadratic in theory but + // linear-ish in practice because we bail out on the first hit, + // i.e., it's probably good enough for now + ret = 0; + nfds = poll(pfds, nfds, min_delay); + for (pfd = pfds; nfds-- > 0; pfd++) { + rh = find_rh(ts, pfd->fd); + if (rh) { + r = (POLLERR|POLLHUP|POLLNVAL|POLLIN) * !JS_IsNull(rh->rw_func[0]); + w = (POLLERR|POLLHUP|POLLNVAL|POLLOUT) * !JS_IsNull(rh->rw_func[1]); + if (r & pfd->revents) { + ret = call_handler(ctx, rh->rw_func[0]); + goto done; + /* must stop because the list may have been modified */ + } + if (w & pfd->revents) { + ret = call_handler(ctx, rh->rw_func[1]); + goto done; + /* must stop because the list may have been modified */ + } + } else { +#ifdef USE_WORKER + list_for_each(el, &ts->port_list) { + JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link); + if (!JS_IsNull(port->on_message_func)) { + JSWorkerMessagePipe *ps = port->recv_pipe; + if (pfd->fd == ps->waker.read_fd) { + if (handle_posted_message(rt, ctx, port)) + goto done; + } + } + } +#endif // USE_WORKER + } + } +done: + if (pfds != pfds_local) + js_free(ctx, pfds); + return ret; +} +#endif // defined(_WIN32) + + +static JSValue make_obj_error(JSContext *ctx, + JSValue obj, + int err) +{ + JSValue arr; + if (JS_IsException(obj)) + return obj; + arr = JS_NewArray(ctx); + if (JS_IsException(arr)) + return JS_EXCEPTION; + JS_DefinePropertyValueUint32(ctx, arr, 0, obj, + JS_PROP_C_W_E); + JS_DefinePropertyValueUint32(ctx, arr, 1, JS_NewInt32(ctx, err), + JS_PROP_C_W_E); + return arr; +} + +static JSValue make_string_error(JSContext *ctx, + const char *buf, + int err) +{ + return make_obj_error(ctx, JS_NewString(ctx, buf), err); +} + +/* return [cwd, errorcode] */ +static JSValue js_os_getcwd(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + char buf[JS__PATH_MAX]; + int err; + + if (!getcwd(buf, sizeof(buf))) { + buf[0] = '\0'; + err = errno; + } else { + err = 0; + } + return make_string_error(ctx, buf, err); +} + +static JSValue js_os_chdir(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *target; + int err; + + target = JS_ToCString(ctx, argv[0]); + if (!target) + return JS_EXCEPTION; + err = js_get_errno(chdir(target)); + JS_FreeCString(ctx, target); + return JS_NewInt32(ctx, err); +} + +static JSValue js_os_mkdir(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int mode, ret; + const char *path; + + if (argc >= 2) { + if (JS_ToInt32(ctx, &mode, argv[1])) + return JS_EXCEPTION; + } else { + mode = 0777; + } + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; +#if defined(_WIN32) + (void)mode; + ret = js_get_errno(mkdir(path)); +#else + ret = js_get_errno(mkdir(path, mode)); +#endif + JS_FreeCString(ctx, path); + return JS_NewInt32(ctx, ret); +} + +/* return [array, errorcode] */ +static JSValue js_os_readdir(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ +#ifdef _WIN32 + const char *path; + JSValue obj; + int err; + uint32_t len; + HANDLE h; + WIN32_FIND_DATAA d; + char s[1024]; + + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) { + JS_FreeCString(ctx, path); + return JS_EXCEPTION; + } + snprintf(s, sizeof(s), "%s/*", path); + JS_FreeCString(ctx, path); + err = 0; + h = FindFirstFileA(s, &d); + if (h == INVALID_HANDLE_VALUE) + err = GetLastError(); + if (err) + goto done; + JS_DefinePropertyValueUint32(ctx, obj, 0, JS_NewString(ctx, "."), + JS_PROP_C_W_E); + for (len = 1; FindNextFileA(h, &d); len++) { + JS_DefinePropertyValueUint32(ctx, obj, len, + JS_NewString(ctx, d.cFileName), + JS_PROP_C_W_E); + } + FindClose(h); +done: + return make_obj_error(ctx, obj, err); +#else + const char *path; + DIR *f; + struct dirent *d; + JSValue obj; + int err; + uint32_t len; + + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) { + JS_FreeCString(ctx, path); + return JS_EXCEPTION; + } + f = opendir(path); + if (!f) + err = errno; + else + err = 0; + JS_FreeCString(ctx, path); + if (!f) + goto done; + len = 0; + for(;;) { + errno = 0; + d = readdir(f); + if (!d) { + err = errno; + break; + } + JS_DefinePropertyValueUint32(ctx, obj, len++, + JS_NewString(ctx, d->d_name), + JS_PROP_C_W_E); + } + closedir(f); + done: + return make_obj_error(ctx, obj, err); +#endif +} + +#if !defined(_WIN32) +static int64_t timespec_to_ms(const struct timespec *tv) +{ + return (int64_t)tv->tv_sec * 1000 + (tv->tv_nsec / 1000000); +} +#endif + +/* return [obj, errcode] */ +static JSValue js_os_stat(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int is_lstat) +{ + const char *path; + int err, res; + struct stat st; + JSValue obj; + + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; +#if defined(_WIN32) + res = stat(path, &st); +#else + if (is_lstat) + res = lstat(path, &st); + else + res = stat(path, &st); +#endif + err = (res < 0) ? errno : 0; + JS_FreeCString(ctx, path); + if (res < 0) { + obj = JS_NULL; + } else { + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) + return JS_EXCEPTION; + JS_DefinePropertyValueStr(ctx, obj, "dev", + JS_NewInt64(ctx, st.st_dev), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "ino", + JS_NewInt64(ctx, st.st_ino), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "mode", + JS_NewInt32(ctx, st.st_mode), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "nlink", + JS_NewInt64(ctx, st.st_nlink), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "uid", + JS_NewInt64(ctx, st.st_uid), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "gid", + JS_NewInt64(ctx, st.st_gid), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "rdev", + JS_NewInt64(ctx, st.st_rdev), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "size", + JS_NewInt64(ctx, st.st_size), + JS_PROP_C_W_E); +#if !defined(_WIN32) + JS_DefinePropertyValueStr(ctx, obj, "blocks", + JS_NewInt64(ctx, st.st_blocks), + JS_PROP_C_W_E); +#endif +#if defined(_WIN32) + JS_DefinePropertyValueStr(ctx, obj, "atime", + JS_NewInt64(ctx, (int64_t)st.st_atime * 1000), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "mtime", + JS_NewInt64(ctx, (int64_t)st.st_mtime * 1000), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "ctime", + JS_NewInt64(ctx, (int64_t)st.st_ctime * 1000), + JS_PROP_C_W_E); +#elif defined(__APPLE__) + JS_DefinePropertyValueStr(ctx, obj, "atime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_atimespec)), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "mtime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_mtimespec)), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "ctime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_ctimespec)), + JS_PROP_C_W_E); +#else + JS_DefinePropertyValueStr(ctx, obj, "atime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_atim)), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "mtime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_mtim)), + JS_PROP_C_W_E); + JS_DefinePropertyValueStr(ctx, obj, "ctime", + JS_NewInt64(ctx, timespec_to_ms(&st.st_ctim)), + JS_PROP_C_W_E); +#endif + } + return make_obj_error(ctx, obj, err); +} + +#if !defined(_WIN32) +static void ms_to_timeval(struct timeval *tv, uint64_t v) +{ + tv->tv_sec = v / 1000; + tv->tv_usec = (v % 1000) * 1000; +} +#endif + +static JSValue js_os_utimes(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *path; + int64_t atime, mtime; + int ret; + + if (JS_ToInt64(ctx, &atime, argv[1])) + return JS_EXCEPTION; + if (JS_ToInt64(ctx, &mtime, argv[2])) + return JS_EXCEPTION; + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; +#if defined(_WIN32) + { + struct _utimbuf times; + times.actime = atime / 1000; + times.modtime = mtime / 1000; + ret = js_get_errno(_utime(path, ×)); + } +#else + { + struct timeval times[2]; + ms_to_timeval(×[0], atime); + ms_to_timeval(×[1], mtime); + ret = js_get_errno(utimes(path, times)); + } +#endif + JS_FreeCString(ctx, path); + return JS_NewInt32(ctx, ret); +} + +/* sleep(delay_ms) */ +static JSValue js_os_sleep(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int64_t delay; + int ret; + + if (JS_ToInt64(ctx, &delay, argv[0])) + return JS_EXCEPTION; + if (delay < 0) + delay = 0; +#if defined(_WIN32) + { + if (delay > INT32_MAX) + delay = INT32_MAX; + Sleep(delay); + ret = 0; + } +#else + { + struct timespec ts; + + ts.tv_sec = delay / 1000; + ts.tv_nsec = (delay % 1000) * 1000000; + ret = js_get_errno(nanosleep(&ts, NULL)); + } +#endif + return JS_NewInt32(ctx, ret); +} + +#if defined(_WIN32) +static char *realpath(const char *path, char *buf) +{ + if (!_fullpath(buf, path, JS__PATH_MAX)) { + errno = ENOENT; + return NULL; + } else { + return buf; + } +} +#endif + +#if !defined(__wasi__) +/* return [path, errorcode] */ +static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *path; + char buf[JS__PATH_MAX], *res; + int err; + + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; + res = realpath(path, buf); + JS_FreeCString(ctx, path); + if (!res) { + buf[0] = '\0'; + err = errno; + } else { + err = 0; + } + return make_string_error(ctx, buf, err); +} +#endif + +#if !defined(_WIN32) && !defined(__wasi__) && !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) +static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *target, *linkpath; + int err; + + target = JS_ToCString(ctx, argv[0]); + if (!target) + return JS_EXCEPTION; + linkpath = JS_ToCString(ctx, argv[1]); + if (!linkpath) { + JS_FreeCString(ctx, target); + return JS_EXCEPTION; + } + err = js_get_errno(symlink(target, linkpath)); + JS_FreeCString(ctx, target); + JS_FreeCString(ctx, linkpath); + return JS_NewInt32(ctx, err); +} + +/* return [path, errorcode] */ +static JSValue js_os_readlink(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + const char *path; + char buf[JS__PATH_MAX]; + int err; + ssize_t res; + + path = JS_ToCString(ctx, argv[0]); + if (!path) + return JS_EXCEPTION; + res = readlink(path, buf, sizeof(buf) - 1); + if (res < 0) { + buf[0] = '\0'; + err = errno; + } else { + buf[res] = '\0'; + err = 0; + } + JS_FreeCString(ctx, path); + return make_string_error(ctx, buf, err); +} + +static char **build_envp(JSContext *ctx, JSValue obj) +{ + uint32_t len, i; + JSPropertyEnum *tab; + char **envp, *pair; + const char *key, *str; + JSValue val; + size_t key_len, str_len; + + if (JS_GetOwnPropertyNames(ctx, &tab, &len, obj, + JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY) < 0) + return NULL; + envp = js_mallocz(ctx, sizeof(envp[0]) * ((size_t)len + 1)); + if (!envp) + goto fail; + for(i = 0; i < len; i++) { + val = JS_GetProperty(ctx, obj, tab[i].atom); + if (JS_IsException(val)) + goto fail; + str = JS_ToCString(ctx, val); + JS_FreeValue(ctx, val); + if (!str) + goto fail; + key = JS_AtomToCString(ctx, tab[i].atom); + if (!key) { + JS_FreeCString(ctx, str); + goto fail; + } + key_len = strlen(key); + str_len = strlen(str); + pair = js_malloc(ctx, key_len + str_len + 2); + if (!pair) { + JS_FreeCString(ctx, key); + JS_FreeCString(ctx, str); + goto fail; + } + memcpy(pair, key, key_len); + pair[key_len] = '='; + memcpy(pair + key_len + 1, str, str_len); + pair[key_len + 1 + str_len] = '\0'; + envp[i] = pair; + JS_FreeCString(ctx, key); + JS_FreeCString(ctx, str); + } + done: + for(i = 0; i < len; i++) + JS_FreeAtom(ctx, tab[i].atom); + js_free(ctx, tab); + return envp; + fail: + if (envp) { + for(i = 0; i < len; i++) + js_free(ctx, envp[i]); + js_free(ctx, envp); + envp = NULL; + } + goto done; +} + +/* execvpe is not available on non GNU systems */ +static int my_execvpe(const char *filename, char **argv, char **envp) +{ + char *path, *p, *p_next, *p1; + char buf[JS__PATH_MAX]; + size_t filename_len, path_len; + bool eacces_error; + + filename_len = strlen(filename); + if (filename_len == 0) { + errno = ENOENT; + return -1; + } + if (strchr(filename, '/')) + return execve(filename, argv, envp); + + path = getenv("PATH"); + if (!path) + path = (char *)"/bin:/usr/bin"; + eacces_error = false; + p = path; + for(p = path; p != NULL; p = p_next) { + p1 = strchr(p, ':'); + if (!p1) { + p_next = NULL; + path_len = strlen(p); + } else { + p_next = p1 + 1; + path_len = p1 - p; + } + /* path too long */ + if ((path_len + 1 + filename_len + 1) > JS__PATH_MAX) + continue; + memcpy(buf, p, path_len); + buf[path_len] = '/'; + memcpy(buf + path_len + 1, filename, filename_len); + buf[path_len + 1 + filename_len] = '\0'; + + execve(buf, argv, envp); + + switch(errno) { + case EACCES: + eacces_error = true; + break; + case ENOENT: + case ENOTDIR: + break; + default: + return -1; + } + } + if (eacces_error) + errno = EACCES; + return -1; +} + +static void (*js_os_exec_closefrom)(int); + +#if !defined(EMSCRIPTEN) && !defined(__wasi__) + +static js_once_t js_os_exec_once = JS_ONCE_INIT; + +static void js_os_exec_once_init(void) +{ + *(void **) (&js_os_exec_closefrom) = dlsym(RTLD_DEFAULT, "closefrom"); +} + +#endif + +/* exec(args[, options]) -> exitcode */ +static JSValue js_os_exec(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSValueConst options, args = argv[0]; + JSValue val, ret_val; + const char **exec_argv, *file = NULL, *str, *cwd = NULL; + char **envp = environ; + uint32_t exec_argc, i; + int ret, pid, status; + bool block_flag = true, use_path = true; + static const char *std_name[3] = { "stdin", "stdout", "stderr" }; + int std_fds[3]; + uint32_t uid = -1, gid = -1; + int ngroups = -1; + gid_t groups[64]; + + val = JS_GetPropertyStr(ctx, args, "length"); + if (JS_IsException(val)) + return JS_EXCEPTION; + ret = JS_ToUint32(ctx, &exec_argc, val); + JS_FreeValue(ctx, val); + if (ret) + return JS_EXCEPTION; + /* arbitrary limit to avoid overflow */ + if (exec_argc < 1 || exec_argc > 65535) { + return JS_ThrowTypeError(ctx, "invalid number of arguments"); + } + exec_argv = js_mallocz(ctx, sizeof(exec_argv[0]) * (exec_argc + 1)); + if (!exec_argv) + return JS_EXCEPTION; + for(i = 0; i < exec_argc; i++) { + val = JS_GetPropertyUint32(ctx, args, i); + if (JS_IsException(val)) + goto exception; + str = JS_ToCString(ctx, val); + JS_FreeValue(ctx, val); + if (!str) + goto exception; + exec_argv[i] = str; + } + exec_argv[exec_argc] = NULL; + + for(i = 0; i < 3; i++) + std_fds[i] = i; + + /* get the options, if any */ + if (argc >= 2) { + options = argv[1]; + + if (get_bool_option(ctx, &block_flag, options, "block")) + goto exception; + if (get_bool_option(ctx, &use_path, options, "usePath")) + goto exception; + + val = JS_GetPropertyStr(ctx, options, "file"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + file = JS_ToCString(ctx, val); + JS_FreeValue(ctx, val); + if (!file) + goto exception; + } + + val = JS_GetPropertyStr(ctx, options, "cwd"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + cwd = JS_ToCString(ctx, val); + JS_FreeValue(ctx, val); + if (!cwd) + goto exception; + } + + /* stdin/stdout/stderr handles */ + for(i = 0; i < 3; i++) { + val = JS_GetPropertyStr(ctx, options, std_name[i]); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + int fd; + ret = JS_ToInt32(ctx, &fd, val); + JS_FreeValue(ctx, val); + if (ret) + goto exception; + std_fds[i] = fd; + } + } + + val = JS_GetPropertyStr(ctx, options, "env"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + envp = build_envp(ctx, val); + JS_FreeValue(ctx, val); + if (!envp) + goto exception; + } + + val = JS_GetPropertyStr(ctx, options, "uid"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + ret = JS_ToUint32(ctx, &uid, val); + JS_FreeValue(ctx, val); + if (ret) + goto exception; + } + + val = JS_GetPropertyStr(ctx, options, "gid"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + ret = JS_ToUint32(ctx, &gid, val); + JS_FreeValue(ctx, val); + if (ret) + goto exception; + } + + val = JS_GetPropertyStr(ctx, options, "groups"); + if (JS_IsException(val)) + goto exception; + if (!JS_IsUndefined(val)) { + int64_t idx, len; + JSValue prop; + uint32_t id; + ngroups = 0; + if (JS_GetLength(ctx, val, &len)) { + JS_FreeValue(ctx, val); + goto exception; + } + for (idx = 0; idx < len; idx++) { + prop = JS_GetPropertyInt64(ctx, val, idx); + if (JS_IsException(prop)) + break; + if (JS_IsUndefined(prop)) + continue; + ret = JS_ToUint32(ctx, &id, prop); + JS_FreeValue(ctx, prop); + if (ret) + break; + if (ngroups == countof(groups)) { + JS_ThrowRangeError(ctx, "too many groups"); + break; + } + groups[ngroups++] = id; + } + JS_FreeValue(ctx, val); + if (idx < len) + goto exception; + } + + } + +#if !defined(EMSCRIPTEN) && !defined(__wasi__) + // should happen pre-fork because it calls dlsym() + // and that's not an async-signal-safe function + js_once(&js_os_exec_once, js_os_exec_once_init); +#endif + + pid = fork(); + if (pid < 0) { + JS_ThrowTypeError(ctx, "fork error"); + goto exception; + } + if (pid == 0) { + /* child */ + /* remap the stdin/stdout/stderr handles if necessary */ + for(i = 0; i < 3; i++) { + if (std_fds[i] != i) { + if (dup2(std_fds[i], i) < 0) + _exit(127); + } + } + + if (js_os_exec_closefrom) { + js_os_exec_closefrom(3); + } else { + int fd_max = sysconf(_SC_OPEN_MAX); + for(i = 3; i < fd_max; i++) + close(i); + } + + if (cwd) { + if (chdir(cwd) < 0) + _exit(127); + } + if (ngroups != -1) { + if (setgroups(ngroups, groups) < 0) + _exit(127); + } + if (uid != -1) { + if (setuid(uid) < 0) + _exit(127); + } + if (gid != -1) { + if (setgid(gid) < 0) + _exit(127); + } + + if (!file) + file = exec_argv[0]; + if (use_path) + ret = my_execvpe(file, (char **)exec_argv, envp); + else + ret = execve(file, (char **)exec_argv, envp); + _exit(127); + } + /* parent */ + if (block_flag) { + for(;;) { + ret = waitpid(pid, &status, 0); + if (ret == pid) { + if (WIFEXITED(status)) { + ret = WEXITSTATUS(status); + break; + } else if (WIFSIGNALED(status)) { + ret = -WTERMSIG(status); + break; + } + } + } + } else { + ret = pid; + } + ret_val = JS_NewInt32(ctx, ret); + done: + JS_FreeCString(ctx, file); + JS_FreeCString(ctx, cwd); + for(i = 0; i < exec_argc; i++) + JS_FreeCString(ctx, exec_argv[i]); + js_free(ctx, exec_argv); + if (envp != environ) { + char **p; + p = envp; + while (*p != NULL) { + js_free(ctx, *p); + p++; + } + js_free(ctx, envp); + } + return ret_val; + exception: + ret_val = JS_EXCEPTION; + goto done; +} + +/* getpid() -> pid */ +static JSValue js_os_getpid(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + return JS_NewInt32(ctx, getpid()); +} + +/* waitpid(pid, block) -> [pid, status] */ +static JSValue js_os_waitpid(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int pid, status, options, ret; + JSValue obj; + + if (JS_ToInt32(ctx, &pid, argv[0])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &options, argv[1])) + return JS_EXCEPTION; + + ret = waitpid(pid, &status, options); + if (ret < 0) { + ret = -errno; + status = 0; + } + + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) + return obj; + JS_DefinePropertyValueUint32(ctx, obj, 0, JS_NewInt32(ctx, ret), + JS_PROP_C_W_E); + JS_DefinePropertyValueUint32(ctx, obj, 1, JS_NewInt32(ctx, status), + JS_PROP_C_W_E); + return obj; +} + +/* pipe() -> [read_fd, write_fd] or null if error */ +static JSValue js_os_pipe(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int pipe_fds[2], ret; + JSValue obj; + + ret = pipe(pipe_fds); + if (ret < 0) + return JS_NULL; + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) + return obj; + JS_DefinePropertyValueUint32(ctx, obj, 0, JS_NewInt32(ctx, pipe_fds[0]), + JS_PROP_C_W_E); + JS_DefinePropertyValueUint32(ctx, obj, 1, JS_NewInt32(ctx, pipe_fds[1]), + JS_PROP_C_W_E); + return obj; +} + +/* kill(pid, sig) */ +static JSValue js_os_kill(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int pid, sig, ret; + + if (JS_ToInt32(ctx, &pid, argv[0])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &sig, argv[1])) + return JS_EXCEPTION; + ret = js_get_errno(kill(pid, sig)); + return JS_NewInt32(ctx, ret); +} + +/* dup(fd) */ +static JSValue js_os_dup(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd, ret; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + ret = js_get_errno(dup(fd)); + return JS_NewInt32(ctx, ret); +} + +/* dup2(fd) */ +static JSValue js_os_dup2(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int fd, fd2, ret; + + if (JS_ToInt32(ctx, &fd, argv[0])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &fd2, argv[1])) + return JS_EXCEPTION; + ret = js_get_errno(dup2(fd, fd2)); + return JS_NewInt32(ctx, ret); +} + +#endif /* !_WIN32 */ + +#ifdef USE_WORKER + +/* Worker */ + +typedef struct { + JSWorkerMessagePipe *recv_pipe; + JSWorkerMessagePipe *send_pipe; + JSWorkerMessageHandler *msg_handler; +} JSWorkerData; + +typedef struct { + char *filename; /* module filename */ + char *basename; /* module base name */ + JSWorkerMessagePipe *recv_pipe, *send_pipe; +} WorkerFuncArgs; + +typedef struct { + int ref_count; + uint64_t buf[]; +} JSSABHeader; + +static JSRuntime *(*js_worker_new_runtime_func)(void); +static JSContext *(*js_worker_new_context_func)(JSRuntime *rt); + +static int atomic_add_int(int *ptr, int v) +{ + return atomic_fetch_add((_Atomic uint32_t*)ptr, v) + v; +} + +/* shared array buffer allocator */ +static void *js_sab_alloc(void *opaque, size_t size) +{ + JSSABHeader *sab; + sab = malloc(sizeof(JSSABHeader) + size); + if (!sab) + return NULL; + sab->ref_count = 1; + return sab->buf; +} + +static void js_sab_free(void *opaque, void *ptr) +{ + JSSABHeader *sab; + int ref_count; + sab = (JSSABHeader *)((uint8_t *)ptr - sizeof(JSSABHeader)); + ref_count = atomic_add_int(&sab->ref_count, -1); + assert(ref_count >= 0); + if (ref_count == 0) { + free(sab); + } +} + +static void js_sab_dup(void *opaque, void *ptr) +{ + JSSABHeader *sab; + sab = (JSSABHeader *)((uint8_t *)ptr - sizeof(JSSABHeader)); + atomic_add_int(&sab->ref_count, 1); +} + +static JSWorkerMessagePipe *js_new_message_pipe(void) +{ + JSWorkerMessagePipe *ps; + + ps = malloc(sizeof(*ps)); + if (!ps) + return NULL; + if (js_waker_init(&ps->waker)) { + free(ps); + return NULL; + } + ps->ref_count = 1; + init_list_head(&ps->msg_queue); + js_mutex_init(&ps->mutex); + return ps; +} + +static JSWorkerMessagePipe *js_dup_message_pipe(JSWorkerMessagePipe *ps) +{ + atomic_add_int(&ps->ref_count, 1); + return ps; +} + +static void js_free_message(JSWorkerMessage *msg) +{ + size_t i; + /* free the SAB */ + for(i = 0; i < msg->sab_tab_len; i++) { + js_sab_free(NULL, msg->sab_tab[i]); + } + free(msg->sab_tab); + free(msg->data); + free(msg); +} + +static void js_free_message_pipe(JSWorkerMessagePipe *ps) +{ + struct list_head *el, *el1; + JSWorkerMessage *msg; + int ref_count; + + if (!ps) + return; + + ref_count = atomic_add_int(&ps->ref_count, -1); + assert(ref_count >= 0); + if (ref_count == 0) { + list_for_each_safe(el, el1, &ps->msg_queue) { + msg = list_entry(el, JSWorkerMessage, link); + js_free_message(msg); + } + js_mutex_destroy(&ps->mutex); + js_waker_close(&ps->waker); + free(ps); + } +} + +static void js_free_port(JSRuntime *rt, JSWorkerMessageHandler *port) +{ + if (port) { + js_free_message_pipe(port->recv_pipe); + JS_FreeValueRT(rt, port->on_message_func); + list_del(&port->link); + js_free_rt(rt, port); + } +} + +static void js_worker_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSThreadState *ts = js_get_thread_state(rt); + JSWorkerData *worker = JS_GetOpaque(val, ts->worker_class_id); + if (worker) { + js_free_message_pipe(worker->recv_pipe); + js_free_message_pipe(worker->send_pipe); + js_free_port(rt, worker->msg_handler); + js_free_rt(rt, worker); + } +} + +static JSClassDef js_worker_class = { + "Worker", + .finalizer = js_worker_finalizer, +}; + +static void worker_func(void *opaque) +{ + JSRuntime *(*new_runtime_func)(void); + JSContext *(*new_context_func)(JSRuntime *); + WorkerFuncArgs *args = opaque; + JSRuntime *rt; + JSThreadState *ts; + JSContext *ctx; + JSValue val; + + new_runtime_func = js_worker_new_runtime_func; + if (!new_runtime_func) + new_runtime_func = JS_NewRuntime; + rt = new_runtime_func(); + if (rt == NULL) { + fprintf(stderr, "JS_NewRuntime failure"); + exit(1); + } + js_std_init_handlers(rt); + + JS_SetModuleLoaderFunc2(rt, NULL, js_module_loader, js_module_check_attributes, NULL); + + /* set the pipe to communicate with the parent */ + ts = js_get_thread_state(rt); + ts->recv_pipe = args->recv_pipe; + ts->send_pipe = args->send_pipe; + + /* function pointer to avoid linking the whole JS_NewContext() if + not needed */ + new_context_func = js_worker_new_context_func; + if (!new_context_func) + new_context_func = JS_NewContext; + ctx = new_context_func(rt); + if (ctx == NULL) { + fprintf(stderr, "JS_NewContext failure"); + exit(1); + } + + JS_SetCanBlock(rt, true); + + js_std_add_helpers(ctx, -1, NULL); + + val = JS_LoadModule(ctx, args->basename, args->filename); + free(args->filename); + free(args->basename); + free(args); + val = js_std_await(ctx, val); + if (JS_IsException(val)) + js_std_dump_error(ctx); + JS_FreeValue(ctx, val); + + js_std_loop(ctx); + + js_std_free_handlers(rt); + JS_FreeContext(ctx); + JS_FreeRuntime(rt); +} + +static JSValue js_worker_ctor_internal(JSContext *ctx, JSValueConst new_target, + JSWorkerMessagePipe *recv_pipe, + JSWorkerMessagePipe *send_pipe) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSValue obj = JS_UNDEFINED, proto; + JSWorkerData *s; + + /* create the object */ + if (JS_IsUndefined(new_target)) { + proto = JS_GetClassProto(ctx, ts->worker_class_id); + } else { + proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + if (JS_IsException(proto)) + goto fail; + } + obj = JS_NewObjectProtoClass(ctx, proto, ts->worker_class_id); + JS_FreeValue(ctx, proto); + if (JS_IsException(obj)) + goto fail; + s = js_mallocz(ctx, sizeof(*s)); + if (!s) + goto fail; + s->recv_pipe = js_dup_message_pipe(recv_pipe); + s->send_pipe = js_dup_message_pipe(send_pipe); + + JS_SetOpaque(obj, s); + return obj; + fail: + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; +} + +static JSValue js_worker_ctor(JSContext *ctx, JSValueConst new_target, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + WorkerFuncArgs *args = NULL; + js_thread_t thr; + JSValue obj = JS_UNDEFINED; + int ret; + const char *filename = NULL, *basename; + JSAtom basename_atom; + + /* XXX: in order to avoid problems with resource liberation, we + don't support creating workers inside workers */ + if (!is_main_thread(rt)) + return JS_ThrowTypeError(ctx, "cannot create a worker inside a worker"); + + /* base name, assuming the calling function is a normal JS + function */ + basename_atom = JS_GetScriptOrModuleName(ctx, 1); + if (basename_atom == JS_ATOM_NULL) { + return JS_ThrowTypeError(ctx, "could not determine calling script or module name"); + } + basename = JS_AtomToCString(ctx, basename_atom); + JS_FreeAtom(ctx, basename_atom); + if (!basename) + goto fail; + + /* module name */ + filename = JS_ToCString(ctx, argv[0]); + if (!filename) + goto fail; + + args = malloc(sizeof(*args)); + if (!args) + goto oom_fail; + memset(args, 0, sizeof(*args)); + args->filename = strdup(filename); + args->basename = strdup(basename); + + /* ports */ + args->recv_pipe = js_new_message_pipe(); + if (!args->recv_pipe) + goto oom_fail; + args->send_pipe = js_new_message_pipe(); + if (!args->send_pipe) + goto oom_fail; + + obj = js_worker_ctor_internal(ctx, new_target, + args->send_pipe, args->recv_pipe); + if (JS_IsException(obj)) + goto fail; + + ret = js_thread_create(&thr, worker_func, args, JS_THREAD_CREATE_DETACHED); + if (ret != 0) { + JS_ThrowTypeError(ctx, "could not create worker"); + goto fail; + } + JS_FreeCString(ctx, basename); + JS_FreeCString(ctx, filename); + return obj; + oom_fail: + JS_ThrowOutOfMemory(ctx); + fail: + JS_FreeCString(ctx, basename); + JS_FreeCString(ctx, filename); + if (args) { + free(args->filename); + free(args->basename); + js_free_message_pipe(args->recv_pipe); + js_free_message_pipe(args->send_pipe); + free(args); + } + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; +} + +static JSValue js_worker_postMessage(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSWorkerData *worker = JS_GetOpaque2(ctx, this_val, ts->worker_class_id); + JSWorkerMessagePipe *ps; + size_t data_len, i; + uint8_t *data; + JSWorkerMessage *msg; + JSSABTab sab_tab; + + if (!worker) + return JS_EXCEPTION; + + data = JS_WriteObject2(ctx, &data_len, argv[0], + JS_WRITE_OBJ_SAB | JS_WRITE_OBJ_REFERENCE, + &sab_tab); + if (!data) + return JS_EXCEPTION; + + msg = malloc(sizeof(*msg)); + if (!msg) + goto fail; + msg->data = NULL; + msg->sab_tab = NULL; + + /* must reallocate because the allocator may be different */ + msg->data = malloc(data_len); + if (!msg->data) + goto fail; + memcpy(msg->data, data, data_len); + msg->data_len = data_len; + + if (sab_tab.len > 0) { + msg->sab_tab = malloc(sizeof(msg->sab_tab[0]) * sab_tab.len); + if (!msg->sab_tab) + goto fail; + memcpy(msg->sab_tab, sab_tab.tab, sizeof(msg->sab_tab[0]) * sab_tab.len); + } + msg->sab_tab_len = sab_tab.len; + + js_free(ctx, data); + js_free(ctx, sab_tab.tab); + + /* increment the SAB reference counts */ + for(i = 0; i < msg->sab_tab_len; i++) { + js_sab_dup(NULL, msg->sab_tab[i]); + } + + ps = worker->send_pipe; + js_mutex_lock(&ps->mutex); + /* indicate that data is present */ + if (list_empty(&ps->msg_queue)) + js_waker_signal(&ps->waker); + list_add_tail(&msg->link, &ps->msg_queue); + js_mutex_unlock(&ps->mutex); + return JS_UNDEFINED; + fail: + if (msg) { + free(msg->data); + free(msg->sab_tab); + free(msg); + } + js_free(ctx, data); + js_free(ctx, sab_tab.tab); + return JS_EXCEPTION; + +} + +static JSValue js_worker_set_onmessage(JSContext *ctx, JSValueConst this_val, + JSValueConst func) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSWorkerData *worker = JS_GetOpaque2(ctx, this_val, ts->worker_class_id); + JSWorkerMessageHandler *port; + + if (!worker) + return JS_EXCEPTION; + + port = worker->msg_handler; + if (JS_IsNull(func)) { + if (port) { + js_free_port(rt, port); + worker->msg_handler = NULL; + } + } else { + if (!JS_IsFunction(ctx, func)) + return JS_ThrowTypeError(ctx, "not a function"); + if (!port) { + port = js_mallocz(ctx, sizeof(*port)); + if (!port) + return JS_EXCEPTION; + port->recv_pipe = js_dup_message_pipe(worker->recv_pipe); + port->on_message_func = JS_NULL; + list_add_tail(&port->link, &ts->port_list); + worker->msg_handler = port; + } + JS_FreeValue(ctx, port->on_message_func); + port->on_message_func = JS_DupValue(ctx, func); + } + return JS_UNDEFINED; +} + +static JSValue js_worker_get_onmessage(JSContext *ctx, JSValueConst this_val) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSWorkerData *worker = JS_GetOpaque2(ctx, this_val, ts->worker_class_id); + JSWorkerMessageHandler *port; + if (!worker) + return JS_EXCEPTION; + port = worker->msg_handler; + if (port) { + return JS_DupValue(ctx, port->on_message_func); + } else { + return JS_NULL; + } +} + +static const JSCFunctionListEntry js_worker_proto_funcs[] = { + JS_CFUNC_DEF("postMessage", 1, js_worker_postMessage ), + JS_CGETSET_DEF("onmessage", js_worker_get_onmessage, js_worker_set_onmessage ), +}; + +#endif /* USE_WORKER */ + +void js_std_set_worker_new_runtime_func(JSRuntime *(*func)(void)) +{ +#ifdef USE_WORKER + js_worker_new_runtime_func = func; +#endif +} + +void js_std_set_worker_new_context_func(JSContext *(*func)(JSRuntime *rt)) +{ +#ifdef USE_WORKER + js_worker_new_context_func = func; +#endif +} + +#if defined(_WIN32) +#define OS_PLATFORM "win32" +#elif defined(__APPLE__) +#define OS_PLATFORM "darwin" +#elif defined(EMSCRIPTEN) +#define OS_PLATFORM "js" +#elif defined(__CYGWIN__) +#define OS_PLATFORM "cygwin" +#elif defined(__linux__) +#define OS_PLATFORM "linux" +#elif defined(__OpenBSD__) +#define OS_PLATFORM "openbsd" +#elif defined(__NetBSD__) +#define OS_PLATFORM "netbsd" +#elif defined(__FreeBSD__) +#define OS_PLATFORM "freebsd" +#elif defined(__wasi__) +#define OS_PLATFORM "wasi" +#elif defined(__GNU__) +#define OS_PLATFORM "hurd" +#else +#define OS_PLATFORM "unknown" +#endif + +#define OS_FLAG(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE ) + +static const JSCFunctionListEntry js_os_funcs[] = { + JS_CFUNC_DEF("open", 2, js_os_open ), + OS_FLAG(O_RDONLY), + OS_FLAG(O_WRONLY), + OS_FLAG(O_RDWR), + OS_FLAG(O_APPEND), + OS_FLAG(O_CREAT), + OS_FLAG(O_EXCL), + OS_FLAG(O_TRUNC), +#if defined(_WIN32) + OS_FLAG(O_BINARY), + OS_FLAG(O_TEXT), +#endif + JS_CFUNC_DEF("close", 1, js_os_close ), + JS_CFUNC_DEF("seek", 3, js_os_seek ), + JS_CFUNC_MAGIC_DEF("read", 4, js_os_read_write, 0 ), + JS_CFUNC_MAGIC_DEF("write", 4, js_os_read_write, 1 ), + JS_CFUNC_DEF("isatty", 1, js_os_isatty ), +#if !defined(__wasi__) + JS_CFUNC_DEF("ttyGetWinSize", 1, js_os_ttyGetWinSize ), + JS_CFUNC_DEF("ttySetRaw", 1, js_os_ttySetRaw ), +#endif + JS_CFUNC_DEF("remove", 1, js_os_remove ), + JS_CFUNC_DEF("rename", 2, js_os_rename ), + JS_CFUNC_MAGIC_DEF("setReadHandler", 2, js_os_setReadHandler, 0 ), + JS_CFUNC_MAGIC_DEF("setWriteHandler", 2, js_os_setReadHandler, 1 ), + JS_CFUNC_DEF("signal", 2, js_os_signal ), + OS_FLAG(SIGINT), + OS_FLAG(SIGABRT), + OS_FLAG(SIGFPE), + OS_FLAG(SIGILL), + OS_FLAG(SIGSEGV), + OS_FLAG(SIGTERM), +#if !defined(_WIN32) && !defined(__wasi__) + OS_FLAG(SIGQUIT), + OS_FLAG(SIGPIPE), + OS_FLAG(SIGALRM), + OS_FLAG(SIGUSR1), + OS_FLAG(SIGUSR2), + OS_FLAG(SIGCHLD), + OS_FLAG(SIGCONT), + OS_FLAG(SIGSTOP), + OS_FLAG(SIGTSTP), + OS_FLAG(SIGTTIN), + 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 ), + // per spec: both functions can cancel timeouts and intervals + JS_CFUNC_DEF("clearTimeout", 1, js_os_clearTimeout ), + JS_CFUNC_DEF("clearInterval", 1, js_os_clearTimeout ), + JS_CFUNC_DEF("sleepAsync", 1, js_os_sleepAsync ), + JS_PROP_STRING_DEF("platform", OS_PLATFORM, 0 ), + JS_CFUNC_DEF("getcwd", 0, js_os_getcwd ), + JS_CFUNC_DEF("chdir", 0, js_os_chdir ), + JS_CFUNC_DEF("mkdir", 1, js_os_mkdir ), + JS_CFUNC_DEF("readdir", 1, js_os_readdir ), + /* st_mode constants */ + OS_FLAG(S_IFMT), + OS_FLAG(S_IFIFO), + OS_FLAG(S_IFCHR), + OS_FLAG(S_IFDIR), + OS_FLAG(S_IFBLK), + OS_FLAG(S_IFREG), +#if !defined(_WIN32) + OS_FLAG(S_IFSOCK), + OS_FLAG(S_IFLNK), + OS_FLAG(S_ISGID), + OS_FLAG(S_ISUID), +#endif + JS_CFUNC_MAGIC_DEF("stat", 1, js_os_stat, 0 ), + JS_CFUNC_DEF("utimes", 3, js_os_utimes ), + JS_CFUNC_DEF("sleep", 1, js_os_sleep ), +#if !defined(__wasi__) + JS_CFUNC_DEF("realpath", 1, js_os_realpath ), +#endif +#if !defined(_WIN32) && !defined(__wasi__) && !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) + JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ), + JS_CFUNC_DEF("symlink", 2, js_os_symlink ), + JS_CFUNC_DEF("readlink", 1, js_os_readlink ), + JS_CFUNC_DEF("exec", 1, js_os_exec ), + JS_CFUNC_DEF("getpid", 0, js_os_getpid ), + JS_CFUNC_DEF("waitpid", 2, js_os_waitpid ), + OS_FLAG(WNOHANG), + JS_CFUNC_DEF("pipe", 0, js_os_pipe ), + JS_CFUNC_DEF("kill", 2, js_os_kill ), + JS_CFUNC_DEF("dup", 1, js_os_dup ), + JS_CFUNC_DEF("dup2", 2, js_os_dup2 ), +#endif +}; + +static int js_os_init(JSContext *ctx, JSModuleDef *m) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + + ts->can_js_os_poll = true; + +#ifdef USE_WORKER + { + JSValue proto, obj; + /* Worker class */ + JS_NewClassID(rt, &ts->worker_class_id); + JS_NewClass(rt, ts->worker_class_id, &js_worker_class); + proto = JS_NewObject(ctx); + JS_SetPropertyFunctionList(ctx, proto, js_worker_proto_funcs, countof(js_worker_proto_funcs)); + + obj = JS_NewCFunction2(ctx, js_worker_ctor, "Worker", 1, + JS_CFUNC_constructor, 0); + JS_SetConstructor(ctx, obj, proto); + + JS_SetClassProto(ctx, ts->worker_class_id, proto); + + /* set 'Worker.parent' if necessary */ + if (ts->recv_pipe && ts->send_pipe) { + JS_DefinePropertyValueStr(ctx, obj, "parent", + js_worker_ctor_internal(ctx, JS_UNDEFINED, ts->recv_pipe, ts->send_pipe), + JS_PROP_C_W_E); + } + + JS_SetModuleExport(ctx, m, "Worker", obj); + } +#endif /* USE_WORKER */ + + return JS_SetModuleExportList(ctx, m, js_os_funcs, countof(js_os_funcs)); +} + +JSModuleDef *js_init_module_os(JSContext *ctx, const char *module_name) +{ + JSModuleDef *m; + m = JS_NewCModule(ctx, module_name, js_os_init); + if (!m) + return NULL; + JS_AddModuleExportList(ctx, m, js_os_funcs, countof(js_os_funcs)); +#ifdef USE_WORKER + JS_AddModuleExport(ctx, m, "Worker"); +#endif + return m; +} + +/**********************************************************/ + +static JSValue js_print(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ +#ifdef _WIN32 + HANDLE handle; + DWORD mode; +#endif + const char *s; + JSValueConst v; + DynBuf b; + int i; + + dbuf_init(&b); + for(i = 0; i < argc; i++) { + v = argv[i]; + s = JS_ToCString(ctx, v); + if (!s && JS_IsObject(v)) { + JS_FreeValue(ctx, JS_GetException(ctx)); + JSValue t = JS_ToObjectString(ctx, v); + s = JS_ToCString(ctx, t); + JS_FreeValue(ctx, t); + } + if (s) { + dbuf_printf(&b, "%s%s", &" "[!i], s); + JS_FreeCString(ctx, s); + } else { + dbuf_printf(&b, "%s", &" "[!i]); + JS_FreeValue(ctx, JS_GetException(ctx)); + } + } + dbuf_putc(&b, '\n'); +#ifdef _WIN32 + // use WriteConsoleA with CP_UTF8 for better Unicode handling vis-a-vis + // the mangling that happens when going through msvcrt's stdio layer, + // *except* when stdout is redirected to something that is not a console + handle = (HANDLE)_get_osfhandle(/*STDOUT_FILENO*/1); // don't CloseHandle + if (GetFileType(handle) != FILE_TYPE_CHAR) + goto fallback; + if (!GetConsoleMode(handle, &mode)) + goto fallback; + handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (handle == INVALID_HANDLE_VALUE) + goto fallback; + mode = GetConsoleOutputCP(); + SetConsoleOutputCP(CP_UTF8); + WriteConsoleA(handle, b.buf, b.size, NULL, NULL); + SetConsoleOutputCP(mode); + FlushFileBuffers(handle); + goto done; +fallback: +#endif + fwrite(b.buf, 1, b.size, stdout); + fflush(stdout); + goto done; // avoid unused label warning +done: + dbuf_free(&b); + return JS_UNDEFINED; +} + +void js_std_add_helpers(JSContext *ctx, int argc, char **argv) +{ + JSValue global_obj, console, args; + int i; + + /* XXX: should these global definitions be enumerable? */ + global_obj = JS_GetGlobalObject(ctx); + + console = JS_NewObject(ctx); + JS_SetPropertyStr(ctx, console, "log", + JS_NewCFunction(ctx, js_print, "log", 1)); + JS_SetPropertyStr(ctx, global_obj, "console", console); + + /* same methods as the mozilla JS shell */ + if (argc >= 0) { + args = JS_NewArray(ctx); + for(i = 0; i < argc; i++) { + JS_SetPropertyUint32(ctx, args, i, JS_NewString(ctx, argv[i])); + } + JS_SetPropertyStr(ctx, global_obj, "scriptArgs", args); + } + + JS_SetPropertyStr(ctx, global_obj, "print", + JS_NewCFunction(ctx, js_print, "print", 1)); + + JS_FreeValue(ctx, global_obj); +} + +static void js_std_finalize(JSRuntime *rt, void *arg) +{ + JSThreadState *ts = arg; + js_set_thread_state(rt, NULL); + js_free_rt(rt, ts); +} + +void js_std_init_handlers(JSRuntime *rt) +{ + JSThreadState *ts; + + ts = js_mallocz_rt(rt, sizeof(*ts)); + if (!ts) { + fprintf(stderr, "Could not allocate memory for the worker"); + exit(1); + } + init_list_head(&ts->os_rw_handlers); + init_list_head(&ts->os_signal_handlers); + init_list_head(&ts->os_timers); + init_list_head(&ts->port_list); + init_list_head(&ts->rejected_promise_list); + + ts->next_timer_id = 1; + + js_set_thread_state(rt, ts); + JS_AddRuntimeFinalizer(rt, js_std_finalize, ts); + +#ifdef USE_WORKER + /* set the SharedArrayBuffer memory handlers */ + { + JSSharedArrayBufferFunctions sf; + memset(&sf, 0, sizeof(sf)); + sf.sab_alloc = js_sab_alloc; + sf.sab_free = js_sab_free; + sf.sab_dup = js_sab_dup; + JS_SetSharedArrayBufferFunctions(rt, &sf); + } +#endif +} + +static void free_rp(JSRuntime *rt, JSRejectedPromiseEntry *rp) +{ + list_del(&rp->link); + JS_FreeValueRT(rt, rp->promise); + JS_FreeValueRT(rt, rp->reason); + js_free_rt(rt, rp); +} + +void js_std_free_handlers(JSRuntime *rt) +{ + JSThreadState *ts = js_get_thread_state(rt); + struct list_head *el, *el1; + + list_for_each_safe(el, el1, &ts->os_rw_handlers) { + JSOSRWHandler *rh = list_entry(el, JSOSRWHandler, link); + free_rw_handler(rt, rh); + } + + list_for_each_safe(el, el1, &ts->os_signal_handlers) { + JSOSSignalHandler *sh = list_entry(el, JSOSSignalHandler, link); + free_sh(rt, sh); + } + + list_for_each_safe(el, el1, &ts->os_timers) { + JSOSTimer *th = list_entry(el, JSOSTimer, link); + free_timer(rt, th); + } + + list_for_each_safe(el, el1, &ts->rejected_promise_list) { + JSRejectedPromiseEntry *rp = list_entry(el, JSRejectedPromiseEntry, link); + free_rp(rt, rp); + } + +#ifdef USE_WORKER + /* XXX: free port_list ? */ + js_free_message_pipe(ts->recv_pipe); + js_free_message_pipe(ts->send_pipe); +#endif +} + +static void js_dump_obj(JSContext *ctx, FILE *f, JSValueConst val) +{ + const char *str; + + str = JS_ToCString(ctx, val); + if (str) { + fprintf(f, "%s\n", str); + JS_FreeCString(ctx, str); + } else { + fprintf(f, "[exception]\n"); + } +} + +static void js_std_dump_error1(JSContext *ctx, JSValueConst exception_val) +{ + JSValue val; + bool is_error; + + is_error = JS_IsError(exception_val); + js_dump_obj(ctx, stderr, exception_val); + if (is_error) { + val = JS_GetPropertyStr(ctx, exception_val, "stack"); + } else { + js_std_cmd(/*ErrorBackTrace*/2, ctx, &val); + } + if (!JS_IsUndefined(val)) { + js_dump_obj(ctx, stderr, val); + JS_FreeValue(ctx, val); + } +} + +void js_std_dump_error(JSContext *ctx) +{ + JSValue exception_val; + + exception_val = JS_GetException(ctx); + js_std_dump_error1(ctx, exception_val); + JS_FreeValue(ctx, exception_val); +} + +static JSRejectedPromiseEntry *find_rejected_promise(JSContext *ctx, JSThreadState *ts, + JSValueConst promise) +{ + struct list_head *el; + + list_for_each(el, &ts->rejected_promise_list) { + JSRejectedPromiseEntry *rp = list_entry(el, JSRejectedPromiseEntry, link); + if (JS_IsSameValue(ctx, rp->promise, promise)) + return rp; + } + return NULL; +} + +void js_std_promise_rejection_tracker(JSContext *ctx, JSValueConst promise, + JSValueConst reason, + bool is_handled, void *opaque) +{ + + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSRejectedPromiseEntry *rp = find_rejected_promise(ctx, ts, promise); + + if (is_handled) { + /* the rejection is handled, so the entry can be removed if present */ + if (rp) + free_rp(rt, rp); + } else { + /* add a new entry if needed */ + if (!rp) { + rp = js_malloc_rt(rt, sizeof(*rp)); + if (rp) { + rp->promise = JS_DupValue(ctx, promise); + rp->reason = JS_DupValue(ctx, reason); + list_add_tail(&rp->link, &ts->rejected_promise_list); + } + } + } +} + +/* check if there are pending promise rejections. It must be done + asynchrously in case a rejected promise is handled later. Currently + we do it once the application is about to sleep. It could be done + more often if needed. */ +static void js_std_promise_rejection_check(JSContext *ctx) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + struct list_head *el; + + if (unlikely(!list_empty(&ts->rejected_promise_list))) { + list_for_each(el, &ts->rejected_promise_list) { + JSRejectedPromiseEntry *rp = list_entry(el, JSRejectedPromiseEntry, link); + fprintf(stderr, "Possibly unhandled promise rejection: "); + js_std_dump_error1(ctx, rp->reason); + fflush(stderr); + } + exit(1); + } +} + +/* main loop which calls the user JS callbacks */ +int js_std_loop(JSContext *ctx) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSContext *ctx1; + int err; + + for(;;) { + /* execute the pending jobs */ + for(;;) { + err = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1); + if (err <= 0) { + if (err < 0) + goto done; + break; + } + } + + js_std_promise_rejection_check(ctx); + + if (!ts->can_js_os_poll || js_os_poll(ctx)) + break; + } +done: + return JS_HasException(ctx); +} + +/* Wait for a promise and execute pending jobs while waiting for + it. Return the promise result or JS_EXCEPTION in case of promise + rejection. */ +JSValue js_std_await(JSContext *ctx, JSValue obj) +{ + JSRuntime *rt = JS_GetRuntime(ctx); + JSThreadState *ts = js_get_thread_state(rt); + JSValue ret; + int state; + + for(;;) { + state = JS_PromiseState(ctx, obj); + if (state == JS_PROMISE_FULFILLED) { + ret = JS_PromiseResult(ctx, obj); + JS_FreeValue(ctx, obj); + break; + } else if (state == JS_PROMISE_REJECTED) { + ret = JS_Throw(ctx, JS_PromiseResult(ctx, obj)); + JS_FreeValue(ctx, obj); + break; + } else if (state == JS_PROMISE_PENDING) { + JSContext *ctx1; + int err; + err = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1); + if (err < 0) { + js_std_dump_error(ctx1); + } + if (err == 0) + js_std_promise_rejection_check(ctx); + if (ts->can_js_os_poll) + js_os_poll(ctx); + } else { + /* not a promise */ + ret = obj; + break; + } + } + return ret; +} + +void js_std_eval_binary(JSContext *ctx, const uint8_t *buf, size_t buf_len, + int load_only) +{ + JSValue obj, val; + obj = JS_ReadObject(ctx, buf, buf_len, JS_READ_OBJ_BYTECODE); + if (JS_IsException(obj)) + goto exception; + if (load_only) { + if (JS_VALUE_GET_TAG(obj) == JS_TAG_MODULE) { + if (js_module_set_import_meta(ctx, obj, false, false) < 0) + goto exception; + } + JS_FreeValue(ctx, obj); + } else { + if (JS_VALUE_GET_TAG(obj) == JS_TAG_MODULE) { + if (JS_ResolveModule(ctx, obj) < 0) { + JS_FreeValue(ctx, obj); + goto exception; + } + if (js_module_set_import_meta(ctx, obj, false, true) < 0) + goto exception; + val = JS_EvalFunction(ctx, obj); + val = js_std_await(ctx, val); + } else { + val = JS_EvalFunction(ctx, obj); + } + if (JS_IsException(val)) { + exception: + js_std_dump_error(ctx); + exit(1); + } + JS_FreeValue(ctx, val); + } +} + +static JSValue js_bjson_read(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + uint8_t *buf; + uint64_t pos, len; + JSValue obj; + size_t size; + int flags; + + if (JS_ToIndex(ctx, &pos, argv[1])) + return JS_EXCEPTION; + if (JS_ToIndex(ctx, &len, argv[2])) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &flags, argv[3])) + return JS_EXCEPTION; + buf = JS_GetArrayBuffer(ctx, &size, argv[0]); + if (!buf) + return JS_EXCEPTION; + if (pos + len > size) + return JS_ThrowRangeError(ctx, "array buffer overflow"); + obj = JS_ReadObject(ctx, buf + pos, len, flags); + return obj; +} + +static JSValue js_bjson_write(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + size_t len; + uint8_t *buf; + JSValue array; + int flags; + + if (JS_ToInt32(ctx, &flags, argv[1])) + return JS_EXCEPTION; + buf = JS_WriteObject(ctx, &len, argv[0], flags); + if (!buf) + return JS_EXCEPTION; + array = JS_NewArrayBufferCopy(ctx, buf, len); + js_free(ctx, buf); + return array; +} + + +static const JSCFunctionListEntry js_bjson_funcs[] = { + JS_CFUNC_DEF("read", 4, js_bjson_read ), + JS_CFUNC_DEF("write", 2, js_bjson_write ), +#define DEF(x) JS_PROP_INT32_DEF(#x, JS_##x, JS_PROP_CONFIGURABLE) + DEF(READ_OBJ_BYTECODE), + DEF(READ_OBJ_REFERENCE), + DEF(READ_OBJ_SAB), + DEF(WRITE_OBJ_BYTECODE), + DEF(WRITE_OBJ_REFERENCE), + DEF(WRITE_OBJ_SAB), + DEF(WRITE_OBJ_STRIP_DEBUG), + DEF(WRITE_OBJ_STRIP_SOURCE), +#undef DEF +}; + +static int js_bjson_init(JSContext *ctx, JSModuleDef *m) +{ + return JS_SetModuleExportList(ctx, m, js_bjson_funcs, + countof(js_bjson_funcs)); +} + +JSModuleDef *js_init_module_bjson(JSContext *ctx, const char *module_name) +{ + JSModuleDef *m; + m = JS_NewCModule(ctx, module_name, js_bjson_init); + if (!m) + return NULL; + JS_AddModuleExportList(ctx, m, js_bjson_funcs, countof(js_bjson_funcs)); + return m; +} diff --git a/Plugins/Schema/external/quickjs/src/quickjs-libc.h b/Plugins/Schema/external/quickjs/src/quickjs-libc.h new file mode 100644 index 0000000000..58c2525bcf --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs-libc.h @@ -0,0 +1,85 @@ +/* + * QuickJS C library + * + * Copyright (c) 2017-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef QUICKJS_LIBC_H +#define QUICKJS_LIBC_H + +#include +#include +#include + +#include "quickjs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__GNUC__) || defined(__clang__) +#define JS_EXTERN __attribute__((visibility("default"))) +#else +#define JS_EXTERN /* nothing */ +#endif + +JS_EXTERN JSModuleDef *js_init_module_std(JSContext *ctx, + const char *module_name); +JS_EXTERN JSModuleDef *js_init_module_os(JSContext *ctx, + const char *module_name); +JS_EXTERN JSModuleDef *js_init_module_bjson(JSContext *ctx, + const char *module_name); +JS_EXTERN void js_std_add_helpers(JSContext *ctx, int argc, char **argv); +JS_EXTERN int js_std_loop(JSContext *ctx); +JS_EXTERN JSValue js_std_await(JSContext *ctx, JSValue obj); +JS_EXTERN void js_std_init_handlers(JSRuntime *rt); +JS_EXTERN void js_std_free_handlers(JSRuntime *rt); +JS_EXTERN void js_std_dump_error(JSContext *ctx); +JS_EXTERN uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, + const char *filename); +JS_EXTERN int js_module_set_import_meta(JSContext *ctx, JSValueConst func_val, + bool use_realpath, bool is_main); +JS_EXTERN JSModuleDef *js_module_loader(JSContext *ctx, + const char *module_name, void *opaque, + JSValueConst attributes); +JS_EXTERN int js_module_check_attributes(JSContext *ctx, void *opaque, + JSValueConst attributes); +JS_EXTERN int js_module_test_json(JSContext *ctx, JSValueConst attributes); +JS_EXTERN void js_std_eval_binary(JSContext *ctx, const uint8_t *buf, + size_t buf_len, int flags); +JS_EXTERN void js_std_promise_rejection_tracker(JSContext *ctx, + JSValueConst promise, + JSValueConst reason, + bool is_handled, + void *opaque); +// Defaults to JS_NewRuntime, no-op if compiled without worker support. +// Call before creating the first worker thread. +JS_EXTERN void js_std_set_worker_new_runtime_func(JSRuntime *(*func)(void)); +// Defaults to JS_NewContext, no-op if compiled without worker support. +// Call before creating the first worker thread. +JS_EXTERN void js_std_set_worker_new_context_func(JSContext *(*func)(JSRuntime *rt)); + +#undef JS_EXTERN + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + +#endif /* QUICKJS_LIBC_H */ diff --git a/Plugins/Schema/external/quickjs/src/quickjs-opcode.h b/Plugins/Schema/external/quickjs/src/quickjs-opcode.h new file mode 100644 index 0000000000..8ea427a464 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs-opcode.h @@ -0,0 +1,371 @@ +/* + * QuickJS opcode definitions + * + * Copyright (c) 2017-2018 Fabrice Bellard + * Copyright (c) 2017-2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifdef FMT +FMT(none) +FMT(none_int) +FMT(none_loc) +FMT(none_arg) +FMT(none_var_ref) +FMT(u8) +FMT(i8) +FMT(loc8) +FMT(const8) +FMT(label8) +FMT(u16) +FMT(i16) +FMT(label16) +FMT(npop) +FMT(npopx) +FMT(npop_u16) +FMT(loc) +FMT(arg) +FMT(var_ref) +FMT(u32) +FMT(u32x2) +FMT(i32) +FMT(const) +FMT(label) +FMT(atom) +FMT(atom_u8) +FMT(atom_u16) +FMT(atom_label_u8) +FMT(atom_label_u16) +FMT(label_u16) +#undef FMT +#endif /* FMT */ + +#ifdef DEF + +#ifndef def +#define def(id, size, n_pop, n_push, f) DEF(id, size, n_pop, n_push, f) +#endif + +DEF(invalid, 1, 0, 0, none) /* never emitted */ + +/* push values */ +DEF( push_i32, 5, 0, 1, i32) +DEF( push_const, 5, 0, 1, const) +DEF( fclosure, 5, 0, 1, const) /* must follow push_const */ +DEF(push_atom_value, 5, 0, 1, atom) +DEF( private_symbol, 5, 0, 1, atom) +DEF( undefined, 1, 0, 1, none) +DEF( null, 1, 0, 1, none) +DEF( push_this, 1, 0, 1, none) /* only used at the start of a function */ +DEF( push_false, 1, 0, 1, none) +DEF( push_true, 1, 0, 1, none) +DEF( object, 1, 0, 1, none) +DEF( special_object, 2, 0, 1, u8) /* only used at the start of a function */ +DEF( rest, 3, 0, 1, u16) /* only used at the start of a function */ + +DEF( drop, 1, 1, 0, none) /* a -> */ +DEF( nip, 1, 2, 1, none) /* a b -> b */ +DEF( nip1, 1, 3, 2, none) /* a b c -> b c */ +DEF( dup, 1, 1, 2, none) /* a -> a a */ +DEF( dup1, 1, 2, 3, none) /* a b -> a a b */ +DEF( dup2, 1, 2, 4, none) /* a b -> a b a b */ +DEF( dup3, 1, 3, 6, none) /* a b c -> a b c a b c */ +DEF( insert2, 1, 2, 3, none) /* obj a -> a obj a (dup_x1) */ +DEF( insert3, 1, 3, 4, none) /* obj prop a -> a obj prop a (dup_x2) */ +DEF( insert4, 1, 4, 5, none) /* this obj prop a -> a this obj prop a */ +DEF( perm3, 1, 3, 3, none) /* obj a b -> a obj b */ +DEF( perm4, 1, 4, 4, none) /* obj prop a b -> a obj prop b */ +DEF( perm5, 1, 5, 5, none) /* this obj prop a b -> a this obj prop b */ +DEF( swap, 1, 2, 2, none) /* a b -> b a */ +DEF( swap2, 1, 4, 4, none) /* a b c d -> c d a b */ +DEF( rot3l, 1, 3, 3, none) /* x a b -> a b x */ +DEF( rot3r, 1, 3, 3, none) /* a b x -> x a b */ +DEF( rot4l, 1, 4, 4, none) /* x a b c -> a b c x */ +DEF( rot5l, 1, 5, 5, none) /* x a b c d -> a b c d x */ + +DEF(call_constructor, 3, 2, 1, npop) /* func new.target args -> ret. arguments are not counted in n_pop */ +DEF( call, 3, 1, 1, npop) /* arguments are not counted in n_pop */ +DEF( tail_call, 3, 1, 0, npop) /* arguments are not counted in n_pop */ +DEF( call_method, 3, 2, 1, npop) /* arguments are not counted in n_pop */ +DEF(tail_call_method, 3, 2, 0, npop) /* arguments are not counted in n_pop */ +DEF( array_from, 3, 0, 1, npop) /* arguments are not counted in n_pop */ +DEF( apply, 3, 3, 1, u16) +DEF( return, 1, 1, 0, none) +DEF( return_undef, 1, 0, 0, none) +DEF(check_ctor_return, 1, 1, 2, none) +DEF( check_ctor, 1, 0, 0, none) +DEF( init_ctor, 1, 0, 1, none) +DEF( check_brand, 1, 2, 2, none) /* this_obj func -> this_obj func */ +DEF( add_brand, 1, 2, 0, none) /* this_obj home_obj -> */ +DEF( return_async, 1, 1, 0, none) +DEF( throw, 1, 1, 0, none) +DEF( throw_error, 6, 0, 0, atom_u8) +DEF( eval, 5, 1, 1, npop_u16) /* func args... -> ret_val */ +DEF( apply_eval, 3, 2, 1, u16) /* func array -> ret_eval */ +DEF( regexp, 1, 2, 1, none) /* create a RegExp object from the pattern and a + bytecode string */ +DEF( get_super, 1, 1, 1, none) +DEF( import, 1, 2, 1, none) /* dynamic module import */ + +DEF( check_var, 5, 0, 1, atom) /* check if a variable exists */ +DEF( get_var_undef, 5, 0, 1, atom) /* push undefined if the variable does not exist */ +DEF( get_var, 5, 0, 1, atom) /* throw an exception if the variable does not exist */ +DEF( put_var, 5, 1, 0, atom) /* must come after get_var */ +DEF( put_var_init, 5, 1, 0, atom) /* must come after put_var. Used to initialize a global lexical variable */ +DEF( put_var_strict, 5, 2, 0, atom) /* for strict mode variable write */ + +DEF( get_ref_value, 1, 2, 3, none) +DEF( put_ref_value, 1, 3, 0, none) + +DEF( define_var, 6, 0, 0, atom_u8) +DEF(check_define_var, 6, 0, 0, atom_u8) +DEF( define_func, 6, 1, 0, atom_u8) + +// order matters, see IC counterparts +DEF( get_field, 5, 1, 1, atom) +DEF( get_field2, 5, 1, 2, atom) +DEF( put_field, 5, 2, 0, atom) + +DEF( get_private_field, 1, 2, 1, none) /* obj prop -> value */ +DEF( put_private_field, 1, 3, 0, none) /* obj value prop -> */ +DEF(define_private_field, 1, 3, 1, none) /* obj prop value -> obj */ +DEF( get_array_el, 1, 2, 1, none) +DEF( get_array_el2, 1, 2, 2, none) /* obj prop -> obj value */ +DEF( put_array_el, 1, 3, 0, none) +DEF(get_super_value, 1, 3, 1, none) /* this obj prop -> value */ +DEF(put_super_value, 1, 4, 0, none) /* this obj prop value -> */ +DEF( define_field, 5, 2, 1, atom) +DEF( set_name, 5, 1, 1, atom) +DEF(set_name_computed, 1, 2, 2, none) +DEF( set_proto, 1, 2, 1, none) +DEF(set_home_object, 1, 2, 2, none) +DEF(define_array_el, 1, 3, 2, none) +DEF( append, 1, 3, 2, none) /* append enumerated object, update length */ +DEF(copy_data_properties, 2, 3, 3, u8) +DEF( define_method, 6, 2, 1, atom_u8) +DEF(define_method_computed, 2, 3, 1, u8) /* must come after define_method */ +DEF( define_class, 6, 2, 2, atom_u8) /* parent ctor -> ctor proto */ +DEF( define_class_computed, 6, 3, 3, atom_u8) /* field_name parent ctor -> field_name ctor proto (class with computed name) */ + +DEF( get_loc, 3, 0, 1, loc) +DEF( put_loc, 3, 1, 0, loc) /* must come after get_loc */ +DEF( set_loc, 3, 1, 1, loc) /* must come after put_loc */ +DEF( get_arg, 3, 0, 1, arg) +DEF( put_arg, 3, 1, 0, arg) /* must come after get_arg */ +DEF( set_arg, 3, 1, 1, arg) /* must come after put_arg */ +DEF( get_var_ref, 3, 0, 1, var_ref) +DEF( put_var_ref, 3, 1, 0, var_ref) /* must come after get_var_ref */ +DEF( set_var_ref, 3, 1, 1, var_ref) /* must come after put_var_ref */ +DEF(set_loc_uninitialized, 3, 0, 0, loc) +DEF( get_loc_check, 3, 0, 1, loc) +DEF( put_loc_check, 3, 1, 0, loc) /* must come after get_loc_check */ +DEF( put_loc_check_init, 3, 1, 0, loc) +DEF(get_var_ref_check, 3, 0, 1, var_ref) +DEF(put_var_ref_check, 3, 1, 0, var_ref) /* must come after get_var_ref_check */ +DEF(put_var_ref_check_init, 3, 1, 0, var_ref) +DEF( close_loc, 3, 0, 0, loc) +DEF( if_false, 5, 1, 0, label) +DEF( if_true, 5, 1, 0, label) /* must come after if_false */ +DEF( goto, 5, 0, 0, label) /* must come after if_true */ +DEF( catch, 5, 0, 1, label) +DEF( gosub, 5, 0, 0, label) /* used to execute the finally block */ +DEF( ret, 1, 1, 0, none) /* used to return from the finally block */ +DEF( nip_catch, 1, 2, 1, none) /* catch ... a -> a */ + +DEF( to_object, 1, 1, 1, none) +//DEF( to_string, 1, 1, 1, none) +DEF( to_propkey, 1, 1, 1, none) +DEF( to_propkey2, 1, 2, 2, none) + +DEF( with_get_var, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ +DEF( with_put_var, 10, 2, 1, atom_label_u8) /* must be in the same order as scope_xxx */ +DEF(with_delete_var, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ +DEF( with_make_ref, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ +DEF( with_get_ref, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ +DEF(with_get_ref_undef, 10, 1, 0, atom_label_u8) + +DEF( make_loc_ref, 7, 0, 2, atom_u16) +DEF( make_arg_ref, 7, 0, 2, atom_u16) +DEF(make_var_ref_ref, 7, 0, 2, atom_u16) +DEF( make_var_ref, 5, 0, 2, atom) + +DEF( for_in_start, 1, 1, 1, none) +DEF( for_of_start, 1, 1, 3, none) +DEF(for_await_of_start, 1, 1, 3, none) +DEF( for_in_next, 1, 1, 3, none) +DEF( for_of_next, 2, 3, 5, u8) +DEF(iterator_check_object, 1, 1, 1, none) +DEF(iterator_get_value_done, 1, 1, 2, none) +DEF( iterator_close, 1, 3, 0, none) +DEF( iterator_next, 1, 4, 4, none) +DEF( iterator_call, 2, 4, 5, u8) +DEF( initial_yield, 1, 0, 0, none) +DEF( yield, 1, 1, 2, none) +DEF( yield_star, 1, 1, 2, none) +DEF(async_yield_star, 1, 1, 2, none) +DEF( await, 1, 1, 1, none) + +/* arithmetic/logic operations */ +DEF( neg, 1, 1, 1, none) +DEF( plus, 1, 1, 1, none) +DEF( dec, 1, 1, 1, none) +DEF( inc, 1, 1, 1, none) +DEF( post_dec, 1, 1, 2, none) +DEF( post_inc, 1, 1, 2, none) +DEF( dec_loc, 2, 0, 0, loc8) +DEF( inc_loc, 2, 0, 0, loc8) +DEF( add_loc, 2, 1, 0, loc8) +DEF( not, 1, 1, 1, none) +DEF( lnot, 1, 1, 1, none) +DEF( typeof, 1, 1, 1, none) +DEF( delete, 1, 2, 1, none) +DEF( delete_var, 5, 0, 1, atom) + +/* warning: order matters (see js_parse_assign_expr) */ +DEF( mul, 1, 2, 1, none) +DEF( div, 1, 2, 1, none) +DEF( mod, 1, 2, 1, none) +DEF( add, 1, 2, 1, none) +DEF( sub, 1, 2, 1, none) +DEF( shl, 1, 2, 1, none) +DEF( sar, 1, 2, 1, none) +DEF( shr, 1, 2, 1, none) +DEF( and, 1, 2, 1, none) +DEF( xor, 1, 2, 1, none) +DEF( or, 1, 2, 1, none) +DEF( pow, 1, 2, 1, none) + +DEF( lt, 1, 2, 1, none) +DEF( lte, 1, 2, 1, none) +DEF( gt, 1, 2, 1, none) +DEF( gte, 1, 2, 1, none) +DEF( instanceof, 1, 2, 1, none) +DEF( in, 1, 2, 1, none) +DEF( eq, 1, 2, 1, none) +DEF( neq, 1, 2, 1, none) +DEF( strict_eq, 1, 2, 1, none) +DEF( strict_neq, 1, 2, 1, none) +DEF(is_undefined_or_null, 1, 1, 1, none) +DEF( private_in, 1, 2, 1, none) +DEF(push_bigint_i32, 5, 0, 1, i32) +/* must be the last non short and non temporary opcode */ +DEF( nop, 1, 0, 0, none) + +/* temporary opcodes: never emitted in the final bytecode */ + +def( enter_scope, 3, 0, 0, u16) /* emitted in phase 1, removed in phase 2 */ +def( leave_scope, 3, 0, 0, u16) /* emitted in phase 1, removed in phase 2 */ + +def( label, 5, 0, 0, label) /* emitted in phase 1, removed in phase 3 */ + +def(scope_get_var_undef, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def( scope_get_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def( scope_put_var, 7, 1, 0, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def(scope_delete_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def( scope_make_ref, 11, 0, 2, atom_label_u16) /* emitted in phase 1, removed in phase 2 */ +def( scope_get_ref, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def(scope_put_var_init, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */ +def(scope_get_private_field, 7, 1, 1, atom_u16) /* obj -> value, emitted in phase 1, removed in phase 2 */ +def(scope_get_private_field2, 7, 1, 2, atom_u16) /* obj -> obj value, emitted in phase 1, removed in phase 2 */ +def(scope_put_private_field, 7, 2, 0, atom_u16) /* obj value ->, emitted in phase 1, removed in phase 2 */ +def(scope_in_private_field, 7, 1, 1, atom_u16) /* obj -> res emitted in phase 1, removed in phase 2 */ +def(get_field_opt_chain, 5, 1, 1, atom) /* emitted in phase 1, removed in phase 2 */ +def(get_array_el_opt_chain, 1, 2, 1, none) /* emitted in phase 1, removed in phase 2 */ +def( set_class_name, 5, 1, 1, u32) /* emitted in phase 1, removed in phase 2 */ + +def( source_loc, 9, 0, 0, u32x2) /* emitted in phase 1, removed in phase 3 */ + +DEF( push_minus1, 1, 0, 1, none_int) +DEF( push_0, 1, 0, 1, none_int) +DEF( push_1, 1, 0, 1, none_int) +DEF( push_2, 1, 0, 1, none_int) +DEF( push_3, 1, 0, 1, none_int) +DEF( push_4, 1, 0, 1, none_int) +DEF( push_5, 1, 0, 1, none_int) +DEF( push_6, 1, 0, 1, none_int) +DEF( push_7, 1, 0, 1, none_int) +DEF( push_i8, 2, 0, 1, i8) +DEF( push_i16, 3, 0, 1, i16) +DEF( push_const8, 2, 0, 1, const8) +DEF( fclosure8, 2, 0, 1, const8) /* must follow push_const8 */ +DEF(push_empty_string, 1, 0, 1, none) + +DEF( get_loc8, 2, 0, 1, loc8) +DEF( put_loc8, 2, 1, 0, loc8) +DEF( set_loc8, 2, 1, 1, loc8) + +DEF( get_loc0_loc1, 1, 0, 2, none_loc) +DEF( get_loc0, 1, 0, 1, none_loc) +DEF( get_loc1, 1, 0, 1, none_loc) +DEF( get_loc2, 1, 0, 1, none_loc) +DEF( get_loc3, 1, 0, 1, none_loc) +DEF( put_loc0, 1, 1, 0, none_loc) +DEF( put_loc1, 1, 1, 0, none_loc) +DEF( put_loc2, 1, 1, 0, none_loc) +DEF( put_loc3, 1, 1, 0, none_loc) +DEF( set_loc0, 1, 1, 1, none_loc) +DEF( set_loc1, 1, 1, 1, none_loc) +DEF( set_loc2, 1, 1, 1, none_loc) +DEF( set_loc3, 1, 1, 1, none_loc) +DEF( get_arg0, 1, 0, 1, none_arg) +DEF( get_arg1, 1, 0, 1, none_arg) +DEF( get_arg2, 1, 0, 1, none_arg) +DEF( get_arg3, 1, 0, 1, none_arg) +DEF( put_arg0, 1, 1, 0, none_arg) +DEF( put_arg1, 1, 1, 0, none_arg) +DEF( put_arg2, 1, 1, 0, none_arg) +DEF( put_arg3, 1, 1, 0, none_arg) +DEF( set_arg0, 1, 1, 1, none_arg) +DEF( set_arg1, 1, 1, 1, none_arg) +DEF( set_arg2, 1, 1, 1, none_arg) +DEF( set_arg3, 1, 1, 1, none_arg) +DEF( get_var_ref0, 1, 0, 1, none_var_ref) +DEF( get_var_ref1, 1, 0, 1, none_var_ref) +DEF( get_var_ref2, 1, 0, 1, none_var_ref) +DEF( get_var_ref3, 1, 0, 1, none_var_ref) +DEF( put_var_ref0, 1, 1, 0, none_var_ref) +DEF( put_var_ref1, 1, 1, 0, none_var_ref) +DEF( put_var_ref2, 1, 1, 0, none_var_ref) +DEF( put_var_ref3, 1, 1, 0, none_var_ref) +DEF( set_var_ref0, 1, 1, 1, none_var_ref) +DEF( set_var_ref1, 1, 1, 1, none_var_ref) +DEF( set_var_ref2, 1, 1, 1, none_var_ref) +DEF( set_var_ref3, 1, 1, 1, none_var_ref) + +DEF( get_length, 1, 1, 1, none) + +DEF( if_false8, 2, 1, 0, label8) +DEF( if_true8, 2, 1, 0, label8) /* must come after if_false8 */ +DEF( goto8, 2, 0, 0, label8) /* must come after if_true8 */ +DEF( goto16, 3, 0, 0, label16) + +DEF( call0, 1, 1, 1, npopx) +DEF( call1, 1, 1, 1, npopx) +DEF( call2, 1, 1, 1, npopx) +DEF( call3, 1, 1, 1, npopx) + +DEF( is_undefined, 1, 1, 1, none) +DEF( is_null, 1, 1, 1, none) +DEF(typeof_is_undefined, 1, 1, 1, none) +DEF( typeof_is_function, 1, 1, 1, none) + +#undef DEF +#undef def +#endif /* DEF */ diff --git a/Plugins/Schema/external/quickjs/src/quickjs.c b/Plugins/Schema/external/quickjs/src/quickjs.c new file mode 100644 index 0000000000..db317ce919 --- /dev/null +++ b/Plugins/Schema/external/quickjs/src/quickjs.c @@ -0,0 +1,58948 @@ +/* + * QuickJS Javascript Engine + * + * Copyright (c) 2017-2025 Fabrice Bellard + * Copyright (c) 2017-2025 Charlie Gordon + * Copyright (c) 2023-2025 Ben Noordhuis + * Copyright (c) 2023-2025 Saúl Ibarra Corretgé + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#if !defined(_MSC_VER) +#include +#if defined(_WIN32) +#include +#endif +#endif +#if defined(_WIN32) +#include +#endif +#include +#include + +#include "cutils.h" +#include "list.h" +#include "quickjs.h" +#include "libregexp.h" +#include "dtoa.h" + +#if defined(EMSCRIPTEN) || defined(_MSC_VER) +#define DIRECT_DISPATCH 0 +#else +#define DIRECT_DISPATCH 1 +#endif + +#if defined(__APPLE__) +#define MALLOC_OVERHEAD 0 +#else +#define MALLOC_OVERHEAD 8 +#endif + +#if defined(__NEWLIB__) +#define NO_TM_GMTOFF +#endif + +#if defined(__sun) +#include +#define NO_TM_GMTOFF +#endif + +// atomic_store etc. are completely busted in recent versions of tcc; +// somehow the compiler forgets to load |ptr| into %rdi when calling +// the __atomic_*() helpers in its lib/stdatomic.c and lib/atomic.S +#if !defined(__TINYC__) && !defined(EMSCRIPTEN) && !defined(__wasi__) && !__STDC_NO_ATOMICS__ && !defined(__DJGPP) +#include "quickjs-c-atomics.h" +#define CONFIG_ATOMICS +#endif + +#ifndef __GNUC__ +#define __extension__ +#endif + +#ifndef NDEBUG +#define ENABLE_DUMPS +#endif + +//#define FORCE_GC_AT_MALLOC /* test the GC by forcing it before each object allocation */ + +#define check_dump_flag(rt, flag) ((rt->dump_flags & (flag +0)) == (flag +0)) + +#define STRINGIFY_(x) #x +#define STRINGIFY(x) STRINGIFY_(x) + +#define QJS_VERSION_STRING \ + STRINGIFY(QJS_VERSION_MAJOR) "." STRINGIFY(QJS_VERSION_MINOR) "." STRINGIFY(QJS_VERSION_PATCH) QJS_VERSION_SUFFIX + +const char* JS_GetVersion(void) { + return QJS_VERSION_STRING; +} + +#undef STRINFIGY_ +#undef STRINGIFY + +static inline JSValueConst *vc(JSValue *vals) +{ + return (JSValueConst *)vals; +} + +static inline JSValue unsafe_unconst(JSValueConst v) +{ +#ifdef JS_CHECK_JSVALUE + return (JSValue)v; +#else + return v; +#endif +} + +static inline JSValueConst safe_const(JSValue v) +{ +#ifdef JS_CHECK_JSVALUE + return (JSValueConst)v; +#else + return v; +#endif +} + +enum { + /* classid tag */ /* union usage | properties */ + JS_CLASS_OBJECT = 1, /* must be first */ + JS_CLASS_ARRAY, /* u.array | length */ + JS_CLASS_ERROR, + JS_CLASS_NUMBER, /* u.object_data */ + JS_CLASS_STRING, /* u.object_data */ + JS_CLASS_BOOLEAN, /* u.object_data */ + JS_CLASS_SYMBOL, /* u.object_data */ + JS_CLASS_ARGUMENTS, /* u.array | length */ + JS_CLASS_MAPPED_ARGUMENTS, /* | length */ + JS_CLASS_DATE, /* u.object_data */ + JS_CLASS_MODULE_NS, + JS_CLASS_C_FUNCTION, /* u.cfunc */ + JS_CLASS_BYTECODE_FUNCTION, /* u.func */ + JS_CLASS_BOUND_FUNCTION, /* u.bound_function */ + JS_CLASS_C_FUNCTION_DATA, /* u.c_function_data_record */ + JS_CLASS_C_CLOSURE, /* u.c_closure_record */ + JS_CLASS_GENERATOR_FUNCTION, /* u.func */ + JS_CLASS_FOR_IN_ITERATOR, /* u.for_in_iterator */ + JS_CLASS_REGEXP, /* u.regexp */ + JS_CLASS_ARRAY_BUFFER, /* u.array_buffer */ + JS_CLASS_SHARED_ARRAY_BUFFER, /* u.array_buffer */ + JS_CLASS_UINT8C_ARRAY, /* u.array (typed_array) */ + JS_CLASS_INT8_ARRAY, /* u.array (typed_array) */ + JS_CLASS_UINT8_ARRAY, /* u.array (typed_array) */ + JS_CLASS_INT16_ARRAY, /* u.array (typed_array) */ + JS_CLASS_UINT16_ARRAY, /* u.array (typed_array) */ + JS_CLASS_INT32_ARRAY, /* u.array (typed_array) */ + JS_CLASS_UINT32_ARRAY, /* u.array (typed_array) */ + JS_CLASS_BIG_INT64_ARRAY, /* u.array (typed_array) */ + JS_CLASS_BIG_UINT64_ARRAY, /* u.array (typed_array) */ + JS_CLASS_FLOAT16_ARRAY, /* u.array (typed_array) */ + JS_CLASS_FLOAT32_ARRAY, /* u.array (typed_array) */ + JS_CLASS_FLOAT64_ARRAY, /* u.array (typed_array) */ + JS_CLASS_DATAVIEW, /* u.typed_array */ + JS_CLASS_BIG_INT, /* u.object_data */ + JS_CLASS_MAP, /* u.map_state */ + JS_CLASS_SET, /* u.map_state */ + JS_CLASS_WEAKMAP, /* u.map_state */ + JS_CLASS_WEAKSET, /* u.map_state */ + JS_CLASS_ITERATOR, + JS_CLASS_ITERATOR_CONCAT, /* u.iterator_concat_data */ + JS_CLASS_ITERATOR_HELPER, /* u.iterator_helper_data */ + JS_CLASS_ITERATOR_WRAP, /* u.iterator_wrap_data */ + JS_CLASS_MAP_ITERATOR, /* u.map_iterator_data */ + JS_CLASS_SET_ITERATOR, /* u.map_iterator_data */ + JS_CLASS_ARRAY_ITERATOR, /* u.array_iterator_data */ + JS_CLASS_STRING_ITERATOR, /* u.array_iterator_data */ + JS_CLASS_REGEXP_STRING_ITERATOR, /* u.regexp_string_iterator_data */ + JS_CLASS_GENERATOR, /* u.generator_data */ + JS_CLASS_PROXY, /* u.proxy_data */ + JS_CLASS_PROMISE, /* u.promise_data */ + JS_CLASS_PROMISE_RESOLVE_FUNCTION, /* u.promise_function_data */ + JS_CLASS_PROMISE_REJECT_FUNCTION, /* u.promise_function_data */ + JS_CLASS_ASYNC_FUNCTION, /* u.func */ + JS_CLASS_ASYNC_FUNCTION_RESOLVE, /* u.async_function_data */ + JS_CLASS_ASYNC_FUNCTION_REJECT, /* u.async_function_data */ + JS_CLASS_ASYNC_FROM_SYNC_ITERATOR, /* u.async_from_sync_iterator_data */ + JS_CLASS_ASYNC_GENERATOR_FUNCTION, /* u.func */ + JS_CLASS_ASYNC_GENERATOR, /* u.async_generator_data */ + JS_CLASS_WEAK_REF, + JS_CLASS_FINALIZATION_REGISTRY, + JS_CLASS_DOM_EXCEPTION, + JS_CLASS_CALL_SITE, + + JS_CLASS_INIT_COUNT, /* last entry for predefined classes */ +}; + +/* number of typed array types */ +#define JS_TYPED_ARRAY_COUNT (JS_CLASS_FLOAT64_ARRAY - JS_CLASS_UINT8C_ARRAY + 1) +static uint8_t const typed_array_size_log2[JS_TYPED_ARRAY_COUNT]; +#define typed_array_size_log2(classid) (typed_array_size_log2[(classid)- JS_CLASS_UINT8C_ARRAY]) + +typedef enum JSErrorEnum { + JS_EVAL_ERROR, + JS_RANGE_ERROR, + JS_REFERENCE_ERROR, + JS_SYNTAX_ERROR, + JS_TYPE_ERROR, + JS_URI_ERROR, + JS_INTERNAL_ERROR, + JS_AGGREGATE_ERROR, + + JS_NATIVE_ERROR_COUNT, /* number of different NativeError objects */ + JS_PLAIN_ERROR = JS_NATIVE_ERROR_COUNT +} JSErrorEnum; + +#define JS_MAX_LOCAL_VARS 65535 +#define JS_STACK_SIZE_MAX 65534 +#define JS_STRING_LEN_MAX ((1 << 30) - 1) +// 1,024 bytes is about the cutoff point where it starts getting +// more profitable to ref slice than to copy +#define JS_STRING_SLICE_LEN_MAX 1024 // in bytes + +#define __exception __attribute__((warn_unused_result)) + +typedef struct JSShape JSShape; +typedef struct JSString JSString; +typedef struct JSString JSAtomStruct; + +#define JS_VALUE_GET_STRING(v) ((JSString *)JS_VALUE_GET_PTR(v)) + +typedef enum { + JS_GC_PHASE_NONE, + JS_GC_PHASE_DECREF, + JS_GC_PHASE_REMOVE_CYCLES, +} JSGCPhaseEnum; + +typedef struct JSMallocState { + size_t malloc_count; + size_t malloc_size; + size_t malloc_limit; + void *opaque; /* user opaque */ +} JSMallocState; + +typedef struct JSRuntimeFinalizerState { + struct JSRuntimeFinalizerState *next; + JSRuntimeFinalizer *finalizer; + void *arg; +} JSRuntimeFinalizerState; + +typedef struct JSValueLink { + struct JSValueLink *next; + JSValueConst value; +} JSValueLink; + +struct JSRuntime { + JSMallocFunctions mf; + JSMallocState malloc_state; + const char *rt_info; + + int atom_hash_size; /* power of two */ + int atom_count; + int atom_size; + int atom_count_resize; /* resize hash table at this count */ + uint32_t *atom_hash; + JSAtomStruct **atom_array; + int atom_free_index; /* 0 = none */ + + JSClassID js_class_id_alloc; /* counter for user defined classes */ + int class_count; /* size of class_array */ + JSClass *class_array; + + struct list_head context_list; /* list of JSContext.link */ + /* list of JSGCObjectHeader.link. List of allocated GC objects (used + by the garbage collector) */ + struct list_head gc_obj_list; + /* list of JSGCObjectHeader.link. Used during JS_FreeValueRT() */ + struct list_head gc_zero_ref_count_list; + struct list_head tmp_obj_list; /* used during GC */ + JSGCPhaseEnum gc_phase : 8; + size_t malloc_gc_threshold; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + struct list_head string_list; /* list of JSString.link */ +#endif + /* stack limitation */ + uintptr_t stack_size; /* in bytes, 0 if no limit */ + uintptr_t stack_top; + uintptr_t stack_limit; /* lower stack limit */ + + JSValue current_exception; + /* true if inside an out of memory error, to avoid recursing */ + bool in_out_of_memory; + /* true if inside build_backtrace, to avoid recursing */ + bool in_build_stack_trace; + /* true if inside JS_FreeRuntime */ + bool in_free; + + struct JSStackFrame *current_stack_frame; + + JSInterruptHandler *interrupt_handler; + void *interrupt_opaque; + + JSPromiseHook *promise_hook; + void *promise_hook_opaque; + // for smuggling the parent promise from js_promise_then + // to js_promise_constructor + JSValueLink *parent_promise; + + JSHostPromiseRejectionTracker *host_promise_rejection_tracker; + void *host_promise_rejection_tracker_opaque; + + struct list_head job_list; /* list of JSJobEntry.link */ + + JSModuleNormalizeFunc *module_normalize_func; + bool module_loader_has_attr; + union { + JSModuleLoaderFunc *module_loader_func; + JSModuleLoaderFunc2 *module_loader_func2; + } u; + JSModuleCheckSupportedImportAttributes *module_check_attrs; + void *module_loader_opaque; + /* timestamp for internal use in module evaluation */ + int64_t module_async_evaluation_next_timestamp; + + /* used to allocate, free and clone SharedArrayBuffers */ + JSSharedArrayBufferFunctions sab_funcs; + + bool can_block; /* true if Atomics.wait can block */ + uint32_t dump_flags : 24; + + /* Shape hash table */ + int shape_hash_bits; + int shape_hash_size; + int shape_hash_count; /* number of hashed shapes */ + JSShape **shape_hash; + void *user_opaque; + void *libc_opaque; + JSRuntimeFinalizerState *finalizers; +}; + +struct JSClass { + uint32_t class_id; /* 0 means free entry */ + JSAtom class_name; + JSClassFinalizer *finalizer; + JSClassGCMark *gc_mark; + JSClassCall *call; + /* pointers for exotic behavior, can be NULL if none are present */ + const JSClassExoticMethods *exotic; +}; + +typedef struct JSStackFrame { + struct JSStackFrame *prev_frame; /* NULL if first stack frame */ + JSValue cur_func; /* current function, JS_UNDEFINED if the frame is detached */ + JSValue *arg_buf; /* arguments */ + JSValue *var_buf; /* variables */ + struct JSVarRef **var_refs; /* references to arguments or local variables */ + uint8_t *cur_pc; /* only used in bytecode functions : PC of the + instruction after the call */ + uint16_t var_ref_count; /* number of var refs */ + uint16_t arg_count; + bool is_strict_mode; + /* only used in generators. Current stack pointer value. NULL if + the function is running. */ + JSValue *cur_sp; +} JSStackFrame; + +typedef enum { + JS_GC_OBJ_TYPE_JS_OBJECT, + JS_GC_OBJ_TYPE_FUNCTION_BYTECODE, + JS_GC_OBJ_TYPE_SHAPE, + JS_GC_OBJ_TYPE_VAR_REF, + JS_GC_OBJ_TYPE_ASYNC_FUNCTION, + JS_GC_OBJ_TYPE_JS_CONTEXT, +} JSGCObjectTypeEnum; + +/* header for GC objects. GC objects are C data structures with a + reference count that can reference other GC objects. JS Objects are + a particular type of GC object. */ +struct JSGCObjectHeader { + int ref_count; /* must come first, 32-bit */ + JSGCObjectTypeEnum gc_obj_type : 4; + uint8_t mark : 4; /* used by the GC */ + uint8_t dummy1; /* not used by the GC */ + uint16_t dummy2; /* not used by the GC */ + struct list_head link; +}; + +typedef struct JSVarRef { + union { + JSGCObjectHeader header; /* must come first */ + struct { + int __gc_ref_count; /* corresponds to header.ref_count */ + uint8_t __gc_mark; /* corresponds to header.mark/gc_obj_type */ + uint8_t is_detached; + }; + }; + JSValue *pvalue; /* pointer to the value, either on the stack or + to 'value' */ + union { + JSValue value; /* used when is_detached = true */ + struct { + uint16_t var_ref_idx; /* index in JSStackFrame.var_refs[] */ + JSStackFrame *stack_frame; + }; /* used when is_detached = false */ + }; +} JSVarRef; + +typedef struct JSRefCountHeader { + int ref_count; +} JSRefCountHeader; + +/* bigint */ +typedef int32_t js_slimb_t; +typedef uint32_t js_limb_t; +typedef int64_t js_sdlimb_t; +typedef uint64_t js_dlimb_t; + +#define JS_LIMB_DIGITS 9 + +/* Must match the size of short_big_int in JSValueUnion */ +#define JS_LIMB_BITS 32 +#define JS_SHORT_BIG_INT_BITS JS_LIMB_BITS +#define JS_BIGINT_MAX_SIZE ((1024 * 1024) / JS_LIMB_BITS) /* in limbs */ +#define JS_SHORT_BIG_INT_MIN INT32_MIN +#define JS_SHORT_BIG_INT_MAX INT32_MAX + + +typedef struct JSBigInt { + JSRefCountHeader header; /* must come first, 32-bit */ + uint32_t len; /* number of limbs, >= 1 */ + js_limb_t tab[]; /* two's complement representation, always + normalized so that 'len' is the minimum + possible length >= 1 */ +} JSBigInt; + +/* this bigint structure can hold a 64 bit integer */ +typedef struct { + js_limb_t big_int_buf[sizeof(JSBigInt) / sizeof(js_limb_t)]; /* for JSBigInt */ + /* must come just after */ + js_limb_t tab[(64 + JS_LIMB_BITS - 1) / JS_LIMB_BITS]; +} JSBigIntBuf; + +typedef enum { + JS_AUTOINIT_ID_PROTOTYPE, + JS_AUTOINIT_ID_MODULE_NS, + JS_AUTOINIT_ID_PROP, + JS_AUTOINIT_ID_BYTECODE, +} JSAutoInitIDEnum; + +enum { + JS_BUILTIN_ARRAY_FROMASYNC = 1, + JS_BUILTIN_ITERATOR_ZIP, + JS_BUILTIN_ITERATOR_ZIP_KEYED, +}; + +/* must be large enough to have a negligible runtime cost and small + enough to call the interrupt callback often. */ +#define JS_INTERRUPT_COUNTER_INIT 10000 + +struct JSContext { + JSGCObjectHeader header; /* must come first */ + JSRuntime *rt; + struct list_head link; + + uint16_t binary_object_count; + int binary_object_size; + + JSShape *array_shape; /* initial shape for Array objects */ + + JSValue *class_proto; + JSValue function_proto; + JSValue function_ctor; + JSValue array_ctor; + JSValue regexp_ctor; + JSValue promise_ctor; + JSValue native_error_proto[JS_NATIVE_ERROR_COUNT]; + JSValue error_ctor; + JSValue error_back_trace; + JSValue error_prepare_stack; + JSValue error_stack_trace_limit; + JSValue iterator_ctor; + JSValue iterator_ctor_getset; + JSValue iterator_proto; + JSValue async_iterator_proto; + JSValue array_proto_values; + JSValue throw_type_error; + JSValue eval_obj; + + JSValue global_obj; /* global object */ + JSValue global_var_obj; /* contains the global let/const definitions */ + + double time_origin; + + uint64_t random_state; + + /* when the counter reaches zero, JSRutime.interrupt_handler is called */ + int interrupt_counter; + + struct list_head loaded_modules; /* list of JSModuleDef.link */ + + /* if NULL, RegExp compilation is not supported */ + JSValue (*compile_regexp)(JSContext *ctx, JSValueConst pattern, + JSValueConst flags); + /* if NULL, eval is not supported */ + JSValue (*eval_internal)(JSContext *ctx, JSValueConst this_obj, + const char *input, size_t input_len, + const char *filename, int line, int flags, int scope_idx); + void *user_opaque; +}; + +typedef union JSFloat64Union { + double d; + uint64_t u64; + uint32_t u32[2]; +} JSFloat64Union; + +typedef enum { + JS_WEAK_REF_KIND_MAP, + JS_WEAK_REF_KIND_WEAK_REF, + JS_WEAK_REF_KIND_FINALIZATION_REGISTRY_ENTRY, +} JSWeakRefKindEnum; + +typedef struct JSWeakRefRecord { + JSWeakRefKindEnum kind; + struct JSWeakRefRecord *next_weak_ref; + union { + struct JSMapRecord *map_record; + struct JSWeakRefData *weak_ref_data; + struct JSFinRecEntry *fin_rec_entry; + } u; +} JSWeakRefRecord; + +typedef struct JSMapRecord { + int ref_count; /* used during enumeration to avoid freeing the record */ + bool empty; /* true if the record is deleted */ + struct JSMapState *map; + struct list_head link; + struct list_head hash_link; + JSValue key; + JSValue value; +} JSMapRecord; + +typedef struct JSMapState { + bool is_weak; /* true if WeakSet/WeakMap */ + struct list_head records; /* list of JSMapRecord.link */ + uint32_t record_count; + struct list_head *hash_table; + uint32_t hash_size; /* must be a power of two */ + uint32_t record_count_threshold; /* count at which a hash table + resize is needed */ +} JSMapState; + +enum +{ + JS_TO_STRING_IS_PROPERTY_KEY = 1 << 0, + JS_TO_STRING_NO_SIDE_EFFECTS = 1 << 1, +}; + +enum { + JS_ATOM_TYPE_STRING = 1, + JS_ATOM_TYPE_GLOBAL_SYMBOL, + JS_ATOM_TYPE_SYMBOL, + JS_ATOM_TYPE_PRIVATE, +}; + +enum { + JS_ATOM_HASH_SYMBOL, + JS_ATOM_HASH_PRIVATE, +}; + +typedef enum { + JS_ATOM_KIND_STRING, + JS_ATOM_KIND_SYMBOL, + JS_ATOM_KIND_PRIVATE, +} JSAtomKindEnum; + +typedef enum { + JS_STRING_KIND_NORMAL, + JS_STRING_KIND_SLICE, +} JSStringKind; + +#define JS_ATOM_HASH_MASK ((1 << 29) - 1) + +struct JSString { + JSRefCountHeader header; /* must come first, 32-bit */ + uint32_t len : 31; + uint32_t is_wide_char : 1; /* 0 = 8 bits, 1 = 16 bits characters */ + /* for JS_ATOM_TYPE_SYMBOL: hash = 0, atom_type = 3, + for JS_ATOM_TYPE_PRIVATE: hash = 1, atom_type = 3 + XXX: could change encoding to have one more bit in hash */ + uint32_t hash : 29; + uint32_t kind : 1; + uint32_t atom_type : 2; /* != 0 if atom, JS_ATOM_TYPE_x */ + uint32_t hash_next; /* atom_index for JS_ATOM_TYPE_SYMBOL */ + JSWeakRefRecord *first_weak_ref; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + struct list_head link; /* string list */ +#endif +}; + +typedef struct JSStringSlice { + JSString *parent; + uint32_t start; // in bytes, not characters +} JSStringSlice; + +static inline void *strv(JSString *p) +{ + JSStringSlice *slice; + + switch (p->kind) { + case JS_STRING_KIND_NORMAL: + return (void *)&p[1]; + case JS_STRING_KIND_SLICE: + slice = (void *)&p[1]; + return (char *)&slice->parent[1] + slice->start; + } + abort(); + return NULL; +} + +static inline uint8_t *str8(JSString *p) +{ + return strv(p); +} + +static inline uint16_t *str16(JSString *p) +{ + return strv(p); +} + +typedef struct JSClosureVar { + uint8_t is_local : 1; + uint8_t is_arg : 1; + uint8_t is_const : 1; + uint8_t is_lexical : 1; + uint8_t var_kind : 4; /* see JSVarKindEnum */ + /* 8 bits available */ + uint16_t var_idx; /* is_local = true: index to a normal variable of the + parent function. otherwise: index to a closure + variable of the parent function */ + JSAtom var_name; +} JSClosureVar; + +#define ARG_SCOPE_INDEX 1 +#define ARG_SCOPE_END (-2) + +typedef struct JSVarScope { + int parent; /* index into fd->scopes of the enclosing scope */ + int first; /* index into fd->vars of the last variable in this scope */ +} JSVarScope; + +typedef enum { + /* XXX: add more variable kinds here instead of using bit fields */ + JS_VAR_NORMAL, + JS_VAR_FUNCTION_DECL, /* lexical var with function declaration */ + JS_VAR_NEW_FUNCTION_DECL, /* lexical var with async/generator + function declaration */ + JS_VAR_CATCH, + JS_VAR_FUNCTION_NAME, /* function expression name */ + JS_VAR_PRIVATE_FIELD, + JS_VAR_PRIVATE_METHOD, + JS_VAR_PRIVATE_GETTER, + JS_VAR_PRIVATE_SETTER, /* must come after JS_VAR_PRIVATE_GETTER */ + JS_VAR_PRIVATE_GETTER_SETTER, /* must come after JS_VAR_PRIVATE_SETTER */ +} JSVarKindEnum; + +/* XXX: could use a different structure in bytecode functions to save + memory */ +typedef struct JSVarDef { + JSAtom var_name; + /* index into fd->scopes of this variable lexical scope */ + int scope_level; + /* during compilation: + - if scope_level = 0: scope in which the variable is defined + - if scope_level != 0: index into fd->vars of the next + variable in the same or enclosing lexical scope + in a bytecode function: + index into fd->vars of the next + variable in the same or enclosing lexical scope + */ + int scope_next; + uint8_t is_const : 1; + uint8_t is_lexical : 1; + uint8_t is_captured : 1; + uint8_t is_static_private : 1; /* only used during private class field parsing */ + uint8_t var_kind : 4; /* see JSVarKindEnum */ + /* if is_captured = true, provides the index of the corresponding + JSVarRef on stack */ + uint16_t var_ref_idx; + /* only used during compilation: function pool index for lexical + variables with var_kind = + JS_VAR_FUNCTION_DECL/JS_VAR_NEW_FUNCTION_DECL or scope level of + the definition of the 'var' variables (they have scope_level = + 0) */ + int func_pool_idx; /* only used during compilation : index in + the constant pool for hoisted function + definition */ +} JSVarDef; + +/* for the encoding of the pc2line table */ +#define PC2LINE_BASE (-1) +#define PC2LINE_RANGE 5 +#define PC2LINE_OP_FIRST 1 +#define PC2LINE_DIFF_PC_MAX ((255 - PC2LINE_OP_FIRST) / PC2LINE_RANGE) + +typedef enum JSFunctionKindEnum { + JS_FUNC_NORMAL = 0, + JS_FUNC_GENERATOR = (1 << 0), + JS_FUNC_ASYNC = (1 << 1), + JS_FUNC_ASYNC_GENERATOR = (JS_FUNC_GENERATOR | JS_FUNC_ASYNC), +} JSFunctionKindEnum; + +typedef struct JSFunctionBytecode { + JSGCObjectHeader header; /* must come first */ + uint8_t is_strict_mode : 1; + uint8_t has_prototype : 1; /* true if a prototype field is necessary */ + uint8_t has_simple_parameter_list : 1; + uint8_t is_derived_class_constructor : 1; + /* true if home_object needs to be initialized */ + uint8_t need_home_object : 1; + uint8_t func_kind : 2; + uint8_t new_target_allowed : 1; + uint8_t super_call_allowed : 1; + uint8_t super_allowed : 1; + uint8_t arguments_allowed : 1; + uint8_t backtrace_barrier : 1; /* stop backtrace on this function */ + /* XXX: 5 bits available */ + uint8_t *byte_code_buf; /* (self pointer) */ + int byte_code_len; + JSAtom func_name; + JSVarDef *vardefs; /* arguments + local variables (arg_count + var_count) (self pointer) */ + JSClosureVar *closure_var; /* list of variables in the closure (self pointer) */ + uint16_t arg_count; + uint16_t var_count; + uint16_t defined_arg_count; /* for length function property */ + uint16_t stack_size; /* maximum stack size */ + uint16_t var_ref_count; /* number of local variable references */ + uint16_t closure_var_count; + int cpool_count; + JSContext *realm; /* function realm */ + JSValue *cpool; /* constant pool (self pointer) */ + JSAtom filename; + int line_num; + int col_num; + int source_len; + int pc2line_len; + uint8_t *pc2line_buf; + char *source; +} JSFunctionBytecode; + +typedef struct JSBoundFunction { + JSValue func_obj; + JSValue this_val; + int argc; + JSValue argv[]; +} JSBoundFunction; + +typedef enum JSIteratorKindEnum { + JS_ITERATOR_KIND_KEY, + JS_ITERATOR_KIND_VALUE, + JS_ITERATOR_KIND_KEY_AND_VALUE, +} JSIteratorKindEnum; + +typedef enum JSIteratorHelperKindEnum { + JS_ITERATOR_HELPER_KIND_DROP, + JS_ITERATOR_HELPER_KIND_EVERY, + JS_ITERATOR_HELPER_KIND_FILTER, + JS_ITERATOR_HELPER_KIND_FIND, + JS_ITERATOR_HELPER_KIND_FLAT_MAP, + JS_ITERATOR_HELPER_KIND_FOR_EACH, + JS_ITERATOR_HELPER_KIND_MAP, + JS_ITERATOR_HELPER_KIND_SOME, + JS_ITERATOR_HELPER_KIND_TAKE, +} JSIteratorHelperKindEnum; + +typedef struct JSForInIterator { + JSValue obj; + bool is_array; + uint32_t array_length; + uint32_t idx; +} JSForInIterator; + +typedef struct JSRegExp { + JSString *pattern; + JSString *bytecode; /* also contains the flags */ +} JSRegExp; + +typedef struct JSProxyData { + JSValue target; + JSValue handler; + uint8_t is_func; + uint8_t is_revoked; +} JSProxyData; + +typedef struct JSArrayBuffer { + int byte_length; /* 0 if detached */ + int max_byte_length; /* -1 if not resizable; >= byte_length otherwise */ + uint8_t detached; + uint8_t shared; /* if shared, the array buffer cannot be detached */ + uint8_t *data; /* NULL if detached */ + struct list_head array_list; + void *opaque; + JSFreeArrayBufferDataFunc *free_func; +} JSArrayBuffer; + +typedef struct JSTypedArray { + struct list_head link; /* link to arraybuffer */ + JSObject *obj; /* back pointer to the TypedArray/DataView object */ + JSObject *buffer; /* based array buffer */ + uint32_t offset; /* byte offset in the array buffer */ + uint32_t length; /* byte length in the array buffer */ + bool track_rab; /* auto-track length of backing array buffer */ +} JSTypedArray; + +typedef struct JSAsyncFunctionState { + JSValue this_val; /* 'this' generator argument */ + int argc; /* number of function arguments */ + bool throw_flag; /* used to throw an exception in JS_CallInternal() */ + JSStackFrame frame; +} JSAsyncFunctionState; + +/* XXX: could use an object instead to avoid the + JS_TAG_ASYNC_FUNCTION tag for the GC */ +typedef struct JSAsyncFunctionData { + JSGCObjectHeader header; /* must come first */ + JSValue resolving_funcs[2]; + bool is_active; /* true if the async function state is valid */ + JSAsyncFunctionState func_state; +} JSAsyncFunctionData; + +typedef struct JSReqModuleEntry { + JSAtom module_name; + JSModuleDef *module; /* used using resolution */ + JSValue attributes; /* JS_UNDEFINED or an object containing the attributes as key/value */ +} JSReqModuleEntry; + +typedef enum JSExportTypeEnum { + JS_EXPORT_TYPE_LOCAL, + JS_EXPORT_TYPE_INDIRECT, +} JSExportTypeEnum; + +typedef struct JSExportEntry { + union { + struct { + int var_idx; /* closure variable index */ + JSVarRef *var_ref; /* if != NULL, reference to the variable */ + } local; /* for local export */ + int req_module_idx; /* module for indirect export */ + } u; + JSExportTypeEnum export_type; + JSAtom local_name; /* '*' if export ns from. not used for local + export after compilation */ + JSAtom export_name; /* exported variable name */ +} JSExportEntry; + +typedef struct JSStarExportEntry { + int req_module_idx; /* in req_module_entries */ +} JSStarExportEntry; + +typedef struct JSImportEntry { + int var_idx; /* closure variable index */ + JSAtom import_name; + int req_module_idx; /* in req_module_entries */ +} JSImportEntry; + +typedef enum { + JS_MODULE_STATUS_UNLINKED, + JS_MODULE_STATUS_LINKING, + JS_MODULE_STATUS_LINKED, + JS_MODULE_STATUS_EVALUATING, + JS_MODULE_STATUS_EVALUATING_ASYNC, + JS_MODULE_STATUS_EVALUATED, +} JSModuleStatus; + +struct JSModuleDef { + JSRefCountHeader header; /* must come first, 32-bit */ + JSAtom module_name; + struct list_head link; + + JSReqModuleEntry *req_module_entries; + int req_module_entries_count; + int req_module_entries_size; + + JSExportEntry *export_entries; + int export_entries_count; + int export_entries_size; + + JSStarExportEntry *star_export_entries; + int star_export_entries_count; + int star_export_entries_size; + + JSImportEntry *import_entries; + int import_entries_count; + int import_entries_size; + + JSValue module_ns; + JSValue func_obj; /* only used for JS modules */ + JSModuleInitFunc *init_func; /* only used for C modules */ + bool has_tla; /* true if func_obj contains await */ + bool resolved; + bool func_created; + JSModuleStatus status : 8; + /* temp use during js_module_link() & js_module_evaluate() */ + int dfs_index, dfs_ancestor_index; + JSModuleDef *stack_prev; + /* temp use during js_module_evaluate() */ + JSModuleDef **async_parent_modules; + int async_parent_modules_count; + int async_parent_modules_size; + int pending_async_dependencies; + bool async_evaluation; + int64_t async_evaluation_timestamp; + JSModuleDef *cycle_root; + JSValue promise; /* corresponds to spec field: capability */ + JSValue resolving_funcs[2]; /* corresponds to spec field: capability */ + /* true if evaluation yielded an exception. It is saved in + eval_exception */ + bool eval_has_exception; + JSValue eval_exception; + JSValue meta_obj; /* for import.meta */ + JSValue private_value; /* private value for C modules */ +}; + +typedef struct JSJobEntry { + struct list_head link; + JSContext *ctx; + JSJobFunc *job_func; + int argc; + JSValue argv[]; +} JSJobEntry; + +typedef struct JSProperty { + union { + JSValue value; /* JS_PROP_NORMAL */ + struct { /* JS_PROP_GETSET */ + JSObject *getter; /* NULL if undefined */ + JSObject *setter; /* NULL if undefined */ + } getset; + JSVarRef *var_ref; /* JS_PROP_VARREF */ + struct { /* JS_PROP_AUTOINIT */ + /* in order to use only 2 pointers, we compress the realm + and the init function pointer */ + uintptr_t realm_and_id; /* realm and init_id (JS_AUTOINIT_ID_x) + in the 2 low bits */ + void *opaque; + } init; + } u; +} JSProperty; + +#define JS_PROP_INITIAL_SIZE 2 +#define JS_PROP_INITIAL_HASH_SIZE 4 /* must be a power of two */ +#define JS_ARRAY_INITIAL_SIZE 2 + +typedef struct JSShapeProperty { + uint32_t hash_next : 26; /* 0 if last in list */ + uint32_t flags : 6; /* JS_PROP_XXX */ + JSAtom atom; /* JS_ATOM_NULL = free property entry */ +} JSShapeProperty; + +struct JSShape { + /* hash table of size hash_mask + 1 before the start of the + structure (see prop_hash_end()). */ + JSGCObjectHeader header; + /* true if the shape is inserted in the shape hash table. If not, + JSShape.hash is not valid */ + uint8_t is_hashed; + /* If true, the shape may have small array index properties 'n' with 0 + <= n <= 2^31-1. If false, the shape is guaranteed not to have + small array index properties */ + uint8_t has_small_array_index; + uint32_t hash; /* current hash value */ + uint32_t prop_hash_mask; + int prop_size; /* allocated properties */ + int prop_count; /* include deleted properties */ + int deleted_prop_count; + JSShape *shape_hash_next; /* in JSRuntime.shape_hash[h] list */ + JSObject *proto; + JSShapeProperty prop[]; /* prop_size elements */ +}; + +struct JSObject { + union { + JSGCObjectHeader header; + struct { + int __gc_ref_count; /* corresponds to header.ref_count */ + uint8_t __gc_mark; /* corresponds to header.mark/gc_obj_type */ + + uint8_t extensible : 1; + uint8_t free_mark : 1; /* only used when freeing objects with cycles */ + uint8_t is_exotic : 1; /* true if object has exotic property handlers */ + uint8_t fast_array : 1; /* true if u.array is used for get/put (for JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS and typed arrays) */ + uint8_t is_constructor : 1; /* true if object is a constructor function */ + uint8_t is_uncatchable_error : 1; /* if true, error is not catchable */ + uint8_t tmp_mark : 1; /* used in JS_WriteObjectRec() */ + uint8_t is_HTMLDDA : 1; /* specific annex B IsHtmlDDA behavior */ + uint16_t class_id; /* see JS_CLASS_x */ + }; + }; + /* byte offsets: 16/24 */ + JSShape *shape; /* prototype and property names + flag */ + JSProperty *prop; /* array of properties */ + /* byte offsets: 24/40 */ + JSWeakRefRecord *first_weak_ref; + /* byte offsets: 28/48 */ + union { + void *opaque; + struct JSBoundFunction *bound_function; /* JS_CLASS_BOUND_FUNCTION */ + struct JSCFunctionDataRecord *c_function_data_record; /* JS_CLASS_C_FUNCTION_DATA */ + struct JSCClosureRecord *c_closure_record; /* JS_CLASS_C_CLOSURE */ + struct JSForInIterator *for_in_iterator; /* JS_CLASS_FOR_IN_ITERATOR */ + struct JSArrayBuffer *array_buffer; /* JS_CLASS_ARRAY_BUFFER, JS_CLASS_SHARED_ARRAY_BUFFER */ + struct JSTypedArray *typed_array; /* JS_CLASS_UINT8C_ARRAY..JS_CLASS_DATAVIEW */ + struct JSMapState *map_state; /* JS_CLASS_MAP..JS_CLASS_WEAKSET */ + struct JSMapIteratorData *map_iterator_data; /* JS_CLASS_MAP_ITERATOR, JS_CLASS_SET_ITERATOR */ + struct JSArrayIteratorData *array_iterator_data; /* JS_CLASS_ARRAY_ITERATOR, JS_CLASS_STRING_ITERATOR */ + struct JSRegExpStringIteratorData *regexp_string_iterator_data; /* JS_CLASS_REGEXP_STRING_ITERATOR */ + struct JSGeneratorData *generator_data; /* JS_CLASS_GENERATOR */ + struct JSIteratorConcatData *iterator_concat_data; /* JS_CLASS_ITERATOR_CONCAT */ + struct JSIteratorHelperData *iterator_helper_data; /* JS_CLASS_ITERATOR_HELPER */ + struct JSIteratorWrapData *iterator_wrap_data; /* JS_CLASS_ITERATOR_WRAP */ + struct JSProxyData *proxy_data; /* JS_CLASS_PROXY */ + struct JSPromiseData *promise_data; /* JS_CLASS_PROMISE */ + struct JSPromiseFunctionData *promise_function_data; /* JS_CLASS_PROMISE_RESOLVE_FUNCTION, JS_CLASS_PROMISE_REJECT_FUNCTION */ + struct JSAsyncFunctionData *async_function_data; /* JS_CLASS_ASYNC_FUNCTION_RESOLVE, JS_CLASS_ASYNC_FUNCTION_REJECT */ + struct JSAsyncFromSyncIteratorData *async_from_sync_iterator_data; /* JS_CLASS_ASYNC_FROM_SYNC_ITERATOR */ + struct JSAsyncGeneratorData *async_generator_data; /* JS_CLASS_ASYNC_GENERATOR */ + struct { /* JS_CLASS_BYTECODE_FUNCTION: 12/24 bytes */ + /* also used by JS_CLASS_GENERATOR_FUNCTION, JS_CLASS_ASYNC_FUNCTION and JS_CLASS_ASYNC_GENERATOR_FUNCTION */ + struct JSFunctionBytecode *function_bytecode; + JSVarRef **var_refs; + JSObject *home_object; /* for 'super' access */ + } func; + struct { /* JS_CLASS_C_FUNCTION: 12/20 bytes */ + JSContext *realm; + JSCFunctionType c_function; + uint8_t length; + uint8_t cproto; + int16_t magic; + } cfunc; + /* array part for fast arrays and typed arrays */ + struct { /* JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS, JS_CLASS_UINT8C_ARRAY..JS_CLASS_FLOAT64_ARRAY */ + union { + uint32_t size; /* JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS */ + struct JSTypedArray *typed_array; /* JS_CLASS_UINT8C_ARRAY..JS_CLASS_FLOAT64_ARRAY */ + } u1; + union { + JSValue *values; /* JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS */ + void *ptr; /* JS_CLASS_UINT8C_ARRAY..JS_CLASS_FLOAT64_ARRAY */ + int8_t *int8_ptr; /* JS_CLASS_INT8_ARRAY */ + uint8_t *uint8_ptr; /* JS_CLASS_UINT8_ARRAY, JS_CLASS_UINT8C_ARRAY */ + int16_t *int16_ptr; /* JS_CLASS_INT16_ARRAY */ + uint16_t *uint16_ptr; /* JS_CLASS_UINT16_ARRAY */ + int32_t *int32_ptr; /* JS_CLASS_INT32_ARRAY */ + uint32_t *uint32_ptr; /* JS_CLASS_UINT32_ARRAY */ + int64_t *int64_ptr; /* JS_CLASS_INT64_ARRAY */ + uint64_t *uint64_ptr; /* JS_CLASS_UINT64_ARRAY */ + uint16_t *fp16_ptr; /* JS_CLASS_FLOAT16_ARRAY */ + float *float_ptr; /* JS_CLASS_FLOAT32_ARRAY */ + double *double_ptr; /* JS_CLASS_FLOAT64_ARRAY */ + } u; + uint32_t count; /* <= 2^31-1. 0 for a detached typed array */ + } array; /* 12/20 bytes */ + JSRegExp regexp; /* JS_CLASS_REGEXP: 8/16 bytes */ + JSValue object_data; /* for JS_SetObjectData(): 8/16/16 bytes */ + } u; + /* byte sizes: 40/48/72 */ +}; + +typedef struct JSCallSiteData { + JSValue filename; + JSValue func; + JSValue func_name; + bool native; + int line_num; + int col_num; +} JSCallSiteData; + +enum { + __JS_ATOM_NULL = JS_ATOM_NULL, +#define DEF(name, str) JS_ATOM_ ## name, +#include "quickjs-atom.h" +#undef DEF + JS_ATOM_END, +}; +#define JS_ATOM_LAST_KEYWORD JS_ATOM_super +#define JS_ATOM_LAST_STRICT_KEYWORD JS_ATOM_yield + +static const char js_atom_init[] = +#define DEF(name, str) str "\0" +#include "quickjs-atom.h" +#undef DEF +; + +typedef enum OPCodeFormat { +#define FMT(f) OP_FMT_ ## f, +#define DEF(id, size, n_pop, n_push, f) +#include "quickjs-opcode.h" +#undef DEF +#undef FMT +} OPCodeFormat; + +typedef enum OPCodeEnum { +#define FMT(f) +#define DEF(id, size, n_pop, n_push, f) OP_ ## id, +#define def(id, size, n_pop, n_push, f) +#include "quickjs-opcode.h" +#undef def +#undef DEF +#undef FMT + OP_COUNT, /* excluding temporary opcodes */ + /* temporary opcodes : overlap with the short opcodes */ + OP_TEMP_START = OP_nop + 1, + OP___dummy = OP_TEMP_START - 1, +#define FMT(f) +#define DEF(id, size, n_pop, n_push, f) +#define def(id, size, n_pop, n_push, f) OP_ ## id, +#include "quickjs-opcode.h" +#undef def +#undef DEF +#undef FMT + OP_TEMP_END, +} OPCodeEnum; + +static int JS_InitAtoms(JSRuntime *rt); +static JSAtom __JS_NewAtomInit(JSRuntime *rt, const char *str, int len, + int atom_type); +static void JS_FreeAtomStruct(JSRuntime *rt, JSAtomStruct *p); +static void free_function_bytecode(JSRuntime *rt, JSFunctionBytecode *b); +static JSValue js_call_c_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, int flags); +static JSValue js_call_bound_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, int flags); +static JSValue JS_CallInternal(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, JSValueConst new_target, + int argc, JSValueConst *argv, int flags); +static JSValue JS_CallConstructorInternal(JSContext *ctx, + JSValueConst func_obj, + JSValueConst new_target, + int argc, JSValueConst *argv, int flags); +static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValueConst this_obj, + int argc, JSValueConst *argv); +static JSValue JS_InvokeFree(JSContext *ctx, JSValue this_val, JSAtom atom, + int argc, JSValueConst *argv); +static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen, + JSValue val, bool is_array_ctor); +static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj, + JSValueConst val, int flags, int scope_idx); +static __maybe_unused void JS_DumpString(JSRuntime *rt, JSString *p); +static __maybe_unused void JS_DumpObjectHeader(JSRuntime *rt); +static __maybe_unused void JS_DumpObject(JSRuntime *rt, JSObject *p); +static __maybe_unused void JS_DumpGCObject(JSRuntime *rt, JSGCObjectHeader *p); +static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValueConst val); +static __maybe_unused void JS_DumpAtoms(JSRuntime *rt); +static __maybe_unused void JS_DumpShapes(JSRuntime *rt); + +static JSValue js_function_apply(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic); +static void js_array_finalizer(JSRuntime *rt, JSValueConst val); +static void js_array_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_object_data_finalizer(JSRuntime *rt, JSValueConst val); +static void js_object_data_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_c_function_finalizer(JSRuntime *rt, JSValueConst val); +static void js_c_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_bytecode_function_finalizer(JSRuntime *rt, JSValueConst val); +static void js_bytecode_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_bound_function_finalizer(JSRuntime *rt, JSValueConst val); +static void js_bound_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValueConst val); +static void js_for_in_iterator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_regexp_finalizer(JSRuntime *rt, JSValueConst val); +static void js_array_buffer_finalizer(JSRuntime *rt, JSValueConst val); +static void js_typed_array_finalizer(JSRuntime *rt, JSValueConst val); +static void js_typed_array_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_proxy_finalizer(JSRuntime *rt, JSValueConst val); +static void js_proxy_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_map_finalizer(JSRuntime *rt, JSValueConst val); +static void js_map_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_map_iterator_finalizer(JSRuntime *rt, JSValueConst val); +static void js_map_iterator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_array_iterator_finalizer(JSRuntime *rt, JSValueConst val); +static void js_array_iterator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_iterator_concat_finalizer(JSRuntime *rt, JSValueConst val); +static void js_iterator_concat_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_iterator_helper_finalizer(JSRuntime *rt, JSValueConst val); +static void js_iterator_helper_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValueConst val); +static void js_iterator_wrap_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_regexp_string_iterator_finalizer(JSRuntime *rt, + JSValueConst val); +static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_generator_finalizer(JSRuntime *rt, JSValueConst val); +static void js_generator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_promise_finalizer(JSRuntime *rt, JSValueConst val); +static void js_promise_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static void js_promise_resolve_function_finalizer(JSRuntime *rt, JSValueConst val); +static void js_promise_resolve_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); + +#define HINT_STRING 0 +#define HINT_NUMBER 1 +#define HINT_NONE 2 +#define HINT_FORCE_ORDINARY (1 << 4) // don't try Symbol.toPrimitive +static JSValue JS_ToPrimitiveFree(JSContext *ctx, JSValue val, int hint); +static JSValue JS_ToStringFree(JSContext *ctx, JSValue val); +static int JS_ToBoolFree(JSContext *ctx, JSValue val); +static int JS_ToInt32Free(JSContext *ctx, int32_t *pres, JSValue val); +static int JS_ToFloat64Free(JSContext *ctx, double *pres, JSValue val); +static int JS_ToUint8ClampFree(JSContext *ctx, int32_t *pres, JSValue val); +static JSValue JS_ToPropertyKeyInternal(JSContext *ctx, JSValueConst val, + int flags); +static JSValue js_new_string8_len(JSContext *ctx, const char *buf, int len); +static JSValue js_compile_regexp(JSContext *ctx, JSValueConst pattern, + JSValueConst flags); +static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValueConst ctor, + JSValue pattern, JSValue bc); +static void gc_decref(JSRuntime *rt); +static int JS_NewClass1(JSRuntime *rt, JSClassID class_id, + const JSClassDef *class_def, JSAtom name); +static JSValue js_array_push(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int unshift); +static JSValue js_array_constructor(JSContext *ctx, JSValueConst new_target, + int argc, JSValueConst *argv); +static JSValue js_error_constructor(JSContext *ctx, JSValueConst new_target, + int argc, JSValueConst *argv, int magic); +static JSValue js_object_defineProperty(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic); + +typedef enum JSStrictEqModeEnum { + JS_EQ_STRICT, + JS_EQ_SAME_VALUE, + JS_EQ_SAME_VALUE_ZERO, +} JSStrictEqModeEnum; + +static bool js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2, + JSStrictEqModeEnum eq_mode); +static bool js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2); +static bool js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2); +static bool js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2); +static JSValue JS_ToObjectFree(JSContext *ctx, JSValue val); +static JSProperty *add_property(JSContext *ctx, + JSObject *p, JSAtom prop, int prop_flags); +static int JS_ToBigInt64Free(JSContext *ctx, int64_t *pres, JSValue val); +static JSValue JS_ThrowStackOverflow(JSContext *ctx); +static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx); +static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj); +static int js_proxy_setPrototypeOf(JSContext *ctx, JSValueConst obj, + JSValueConst proto_val, bool throw_flag); +static int js_proxy_isExtensible(JSContext *ctx, JSValueConst obj); +static int js_proxy_preventExtensions(JSContext *ctx, JSValueConst obj); +static int js_proxy_isArray(JSContext *ctx, JSValueConst obj); +static int JS_CreateProperty(JSContext *ctx, JSObject *p, + JSAtom prop, JSValueConst val, + JSValueConst getter, JSValueConst setter, + int flags); +static int js_string_memcmp(JSString *p1, JSString *p2, int len); +static void reset_weak_ref(JSRuntime *rt, JSWeakRefRecord **first_weak_ref); +static bool is_valid_weakref_target(JSValueConst val); +static void insert_weakref_record(JSValueConst target, + struct JSWeakRefRecord *wr); +static JSValue js_array_buffer_constructor3(JSContext *ctx, + JSValueConst new_target, + uint64_t len, uint64_t *max_len, + JSClassID class_id, + uint8_t *buf, + JSFreeArrayBufferDataFunc *free_func, + void *opaque, bool alloc_flag); +static void js_array_buffer_free(JSRuntime *rt, void *opaque, void *ptr); +static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValueConst obj); +static bool array_buffer_is_resizable(const JSArrayBuffer *abuf); +static JSValue js_typed_array_constructor(JSContext *ctx, + JSValueConst this_val, + int argc, JSValueConst *argv, + int classid); +static JSValue js_typed_array_constructor_ta(JSContext *ctx, + JSValueConst new_target, + JSValueConst src_obj, + int classid, uint32_t len); +static bool is_typed_array(JSClassID class_id); +static bool typed_array_is_oob(JSObject *p); +static uint32_t typed_array_length(JSObject *p); +static JSValue JS_ThrowTypeErrorDetachedArrayBuffer(JSContext *ctx); +static JSValue JS_ThrowTypeErrorArrayBufferOOB(JSContext *ctx); +static JSVarRef *get_var_ref(JSContext *ctx, JSStackFrame *sf, int var_idx, + bool is_arg); +static JSValue js_call_generator_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int flags); +static void js_async_function_resolve_finalizer(JSRuntime *rt, + JSValueConst val); +static void js_async_function_resolve_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static JSValue JS_EvalInternal(JSContext *ctx, JSValueConst this_obj, + const char *input, size_t input_len, + const char *filename, int line, int flags, int scope_idx); +static void js_free_module_def(JSContext *ctx, JSModuleDef *m); +static void js_mark_module_def(JSRuntime *rt, JSModuleDef *m, + JS_MarkFunc *mark_func); +static JSValue js_import_meta(JSContext *ctx); +static JSValue js_dynamic_import(JSContext *ctx, JSValueConst specifier, + JSValueConst options); +static void free_var_ref(JSRuntime *rt, JSVarRef *var_ref); +static JSValue js_new_promise_capability(JSContext *ctx, + JSValue *resolving_funcs, + JSValueConst ctor); +static __exception int perform_promise_then(JSContext *ctx, + JSValueConst promise, + JSValueConst *resolve_reject, + JSValueConst *cap_resolving_funcs); +static JSValue js_promise_resolve(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic); +static JSValue js_promise_then(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv); +static JSValue js_promise_resolve_thenable_job(JSContext *ctx, + int argc, JSValueConst *argv); +static bool js_string_eq(JSString *p1, JSString *p2); +static int js_string_compare(JSString *p1, JSString *p2); +static int JS_SetPropertyValue(JSContext *ctx, JSValueConst this_obj, + JSValue prop, JSValue val, int flags); +static int JS_NumberIsInteger(JSContext *ctx, JSValueConst val); +static bool JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValueConst val); +static JSValue JS_ToNumberFree(JSContext *ctx, JSValue val); +static int JS_GetOwnPropertyInternal(JSContext *ctx, JSPropertyDescriptor *desc, + JSObject *p, JSAtom prop); +static JSValue JS_GetOwnPropertyNames2(JSContext *ctx, JSValueConst obj1, + int flags, int kind); +static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc); +static void async_func_mark(JSRuntime *rt, JSAsyncFunctionState *s, + JS_MarkFunc *mark_func); +static void JS_AddIntrinsicBasicObjects(JSContext *ctx); +static void js_free_shape(JSRuntime *rt, JSShape *sh); +static void js_free_shape_null(JSRuntime *rt, JSShape *sh); +static int js_shape_prepare_update(JSContext *ctx, JSObject *p, + JSShapeProperty **pprs); +static int init_shape_hash(JSRuntime *rt); +static __exception int js_get_length32(JSContext *ctx, uint32_t *pres, + JSValueConst obj); +static __exception int js_get_length64(JSContext *ctx, int64_t *pres, + JSValueConst obj); +static __exception int js_set_length64(JSContext *ctx, JSValueConst obj, + int64_t len); +static void free_arg_list(JSContext *ctx, JSValue *tab, uint32_t len); +static JSValue *build_arg_list(JSContext *ctx, uint32_t *plen, + JSValueConst array_arg); +static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab); +static bool js_get_fast_array(JSContext *ctx, JSValue obj, + JSValue **arrpp, uint32_t *countp); +static int expand_fast_array(JSContext *ctx, JSObject *p, uint32_t new_len); +static JSValue JS_CreateAsyncFromSyncIterator(JSContext *ctx, + JSValue sync_iter); +static void js_c_function_data_finalizer(JSRuntime *rt, JSValueConst val); +static void js_c_function_data_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func); +static JSValue js_call_c_function_data(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_val, + int argc, JSValueConst *argv, int flags); +static void js_c_closure_finalizer(JSRuntime *rt, JSValueConst val); +static JSValue js_call_c_closure(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_val, + int argc, JSValueConst *argv, int flags); +static JSAtom JS_ValueToAtomInternal(JSContext *ctx, JSValueConst val, + int flags); +static JSAtom js_symbol_to_atom(JSContext *ctx, JSValueConst val); +static void add_gc_object(JSRuntime *rt, JSGCObjectHeader *h, + JSGCObjectTypeEnum type); +static void remove_gc_object(JSGCObjectHeader *h); +static void js_async_function_free0(JSRuntime *rt, JSAsyncFunctionData *s); +static JSValue js_instantiate_prototype(JSContext *ctx, JSObject *p, JSAtom atom, void *opaque); +static JSValue js_module_ns_autoinit(JSContext *ctx, JSObject *p, JSAtom atom, + void *opaque); +static JSValue JS_InstantiateFunctionListItem2(JSContext *ctx, JSObject *p, + JSAtom atom, void *opaque); + +static void js_set_uncatchable_error(JSContext *ctx, JSValueConst val, + bool flag); + +static JSValue js_new_callsite(JSContext *ctx, JSCallSiteData *csd); +static void js_new_callsite_data(JSContext *ctx, JSCallSiteData *csd, JSStackFrame *sf); +static void js_new_callsite_data2(JSContext *ctx, JSCallSiteData *csd, const char *filename, int line_num, int col_num); +static void _JS_AddIntrinsicCallSite(JSContext *ctx); + +static void JS_SetOpaqueInternal(JSValueConst obj, void *opaque); + +static const JSClassExoticMethods js_arguments_exotic_methods; +static const JSClassExoticMethods js_string_exotic_methods; +static const JSClassExoticMethods js_proxy_exotic_methods; +static const JSClassExoticMethods js_module_ns_exotic_methods; + +static inline bool double_is_int32(double d) +{ + uint64_t u, e; + JSFloat64Union t; + + t.d = d; + u = t.u64; + + e = ((u >> 52) & 0x7FF) - 1023; + if (e > 30) { + // accept 0, INT32_MIN, reject too large, too small, nan, inf, -0 + return !u || (u == 0xc1e0000000000000); + } else { + // shift out sign, exponent and whole part bits + // value is fractional if remaining low bits are non-zero + return !(u << 12 << e); + } +} + +static JSValue js_float64(double d) +{ + return __JS_NewFloat64(d); +} + +static int compare_u32(uint32_t a, uint32_t b) +{ + return -(a < b) + (b < a); // -1, 0 or 1 +} + +static JSValue js_int32(int32_t v) +{ + return JS_MKVAL(JS_TAG_INT, v); +} + +static JSValue js_uint32(uint32_t v) +{ + if (v <= INT32_MAX) + return js_int32(v); + else + return js_float64(v); +} + +static JSValue js_int64(int64_t v) +{ + if (v >= INT32_MIN && v <= INT32_MAX) + return js_int32(v); + else + return js_float64(v); +} + +static JSValue js_number(double d) +{ + if (double_is_int32(d)) + return js_int32((int32_t)d); + else + return js_float64(d); +} + +JSValue JS_NewNumber(JSContext *ctx, double d) +{ + return js_number(d); +} + +static JSValue js_bool(bool v) +{ + return JS_MKVAL(JS_TAG_BOOL, (v != 0)); +} + +static JSValue js_dup(JSValueConst v) +{ + if (JS_VALUE_HAS_REF_COUNT(v)) { + JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); + p->ref_count++; + } + return unsafe_unconst(v); +} + +JSValue JS_DupValue(JSContext *ctx, JSValueConst v) +{ + return js_dup(v); +} + +JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v) +{ + return js_dup(v); +} + +static void js_trigger_gc(JSRuntime *rt, size_t size) +{ + bool force_gc; +#ifdef FORCE_GC_AT_MALLOC + force_gc = true; +#else + force_gc = ((rt->malloc_state.malloc_size + size) > + rt->malloc_gc_threshold); +#endif + if (force_gc) { +#ifdef ENABLE_DUMPS // JS_DUMP_GC + if (check_dump_flag(rt, JS_DUMP_GC)) { + printf("GC: size=%zd\n", rt->malloc_state.malloc_size); + } +#endif + JS_RunGC(rt); + rt->malloc_gc_threshold = rt->malloc_state.malloc_size + + (rt->malloc_state.malloc_size >> 1); + } +} + +static size_t js_malloc_usable_size_unknown(const void *ptr) +{ + return 0; +} + +void *js_calloc_rt(JSRuntime *rt, size_t count, size_t size) +{ + void *ptr; + JSMallocState *s; + + /* Do not allocate zero bytes: behavior is platform dependent */ + assert(count != 0 && size != 0); + + if (size > 0) + if (unlikely(count != (count * size) / size)) + return NULL; + + s = &rt->malloc_state; + /* When malloc_limit is 0 (unlimited), malloc_limit - 1 will be SIZE_MAX. */ + if (unlikely(s->malloc_size + (count * size) > s->malloc_limit - 1)) + return NULL; + + ptr = rt->mf.js_calloc(s->opaque, count, size); + if (!ptr) + return NULL; + + s->malloc_count++; + s->malloc_size += rt->mf.js_malloc_usable_size(ptr) + MALLOC_OVERHEAD; + return ptr; +} + +void *js_malloc_rt(JSRuntime *rt, size_t size) +{ + void *ptr; + JSMallocState *s; + + /* Do not allocate zero bytes: behavior is platform dependent */ + assert(size != 0); + + s = &rt->malloc_state; + /* When malloc_limit is 0 (unlimited), malloc_limit - 1 will be SIZE_MAX. */ + if (unlikely(s->malloc_size + size > s->malloc_limit - 1)) + return NULL; + + ptr = rt->mf.js_malloc(s->opaque, size); + if (!ptr) + return NULL; + + s->malloc_count++; + s->malloc_size += rt->mf.js_malloc_usable_size(ptr) + MALLOC_OVERHEAD; + return ptr; +} + +void js_free_rt(JSRuntime *rt, void *ptr) +{ + JSMallocState *s; + + if (!ptr) + return; + + s = &rt->malloc_state; + s->malloc_count--; + s->malloc_size -= rt->mf.js_malloc_usable_size(ptr) + MALLOC_OVERHEAD; + rt->mf.js_free(s->opaque, ptr); +} + +void *js_realloc_rt(JSRuntime *rt, void *ptr, size_t size) +{ + size_t old_size; + JSMallocState *s; + + if (!ptr) { + if (size == 0) + return NULL; + return js_malloc_rt(rt, size); + } + if (unlikely(size == 0)) { + js_free_rt(rt, ptr); + return NULL; + } + old_size = rt->mf.js_malloc_usable_size(ptr); + s = &rt->malloc_state; + /* When malloc_limit is 0 (unlimited), malloc_limit - 1 will be SIZE_MAX. */ + if (s->malloc_size + size - old_size > s->malloc_limit - 1) + return NULL; + + ptr = rt->mf.js_realloc(s->opaque, ptr, size); + if (!ptr) + return NULL; + + s->malloc_size += rt->mf.js_malloc_usable_size(ptr) - old_size; + return ptr; +} + +size_t js_malloc_usable_size_rt(JSRuntime *rt, const void *ptr) +{ + return rt->mf.js_malloc_usable_size(ptr); +} + +/** + * This used to be implemented as malloc + memset, but using calloc + * yields better performance in initial, bursty allocations, something useful + * for QuickJS. + * + * More information: https://github.com/quickjs-ng/quickjs/pull/519 + */ +void *js_mallocz_rt(JSRuntime *rt, size_t size) +{ + return js_calloc_rt(rt, 1, size); +} + +/* Throw out of memory in case of error */ +void *js_calloc(JSContext *ctx, size_t count, size_t size) +{ + void *ptr; + ptr = js_calloc_rt(ctx->rt, count, size); + if (unlikely(!ptr)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + return ptr; +} + +/* Throw out of memory in case of error */ +void *js_malloc(JSContext *ctx, size_t size) +{ + void *ptr; + ptr = js_malloc_rt(ctx->rt, size); + if (unlikely(!ptr)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + return ptr; +} + +/* Throw out of memory in case of error */ +void *js_mallocz(JSContext *ctx, size_t size) +{ + void *ptr; + ptr = js_mallocz_rt(ctx->rt, size); + if (unlikely(!ptr)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + return ptr; +} + +void js_free(JSContext *ctx, void *ptr) +{ + js_free_rt(ctx->rt, ptr); +} + +/* Throw out of memory in case of error */ +void *js_realloc(JSContext *ctx, void *ptr, size_t size) +{ + void *ret; + ret = js_realloc_rt(ctx->rt, ptr, size); + if (unlikely(!ret && size != 0)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + return ret; +} + +/* store extra allocated size in *pslack if successful */ +void *js_realloc2(JSContext *ctx, void *ptr, size_t size, size_t *pslack) +{ + void *ret; + ret = js_realloc_rt(ctx->rt, ptr, size); + if (unlikely(!ret && size != 0)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + if (pslack) { + size_t new_size = js_malloc_usable_size_rt(ctx->rt, ret); + *pslack = (new_size > size) ? new_size - size : 0; + } + return ret; +} + +size_t js_malloc_usable_size(JSContext *ctx, const void *ptr) +{ + return js_malloc_usable_size_rt(ctx->rt, ptr); +} + +/* Throw out of memory exception in case of error */ +char *js_strndup(JSContext *ctx, const char *s, size_t n) +{ + char *ptr; + ptr = js_malloc(ctx, n + 1); + if (ptr) { + memcpy(ptr, s, n); + ptr[n] = '\0'; + } + return ptr; +} + +char *js_strdup(JSContext *ctx, const char *str) +{ + return js_strndup(ctx, str, strlen(str)); +} + +static no_inline int js_realloc_array(JSContext *ctx, void **parray, + int elem_size, int *psize, int req_size) +{ + int new_size; + size_t slack; + void *new_array; + /* XXX: potential arithmetic overflow */ + new_size = max_int(req_size, *psize * 3 / 2); + new_array = js_realloc2(ctx, *parray, new_size * elem_size, &slack); + if (!new_array) + return -1; + new_size += slack / elem_size; + *psize = new_size; + *parray = new_array; + return 0; +} + +/* resize the array and update its size if req_size > *psize */ +static inline int js_resize_array(JSContext *ctx, void **parray, int elem_size, + int *psize, int req_size) +{ + if (unlikely(req_size > *psize)) + return js_realloc_array(ctx, parray, elem_size, psize, req_size); + else + return 0; +} + +static void *js_dbuf_realloc(void *ctx, void *ptr, size_t size) +{ + return js_realloc(ctx, ptr, size); +} + +static inline void js_dbuf_init(JSContext *ctx, DynBuf *s) +{ + dbuf_init2(s, ctx, js_dbuf_realloc); +} + +static inline int is_digit(int c) { + return c >= '0' && c <= '9'; +} + +static inline int string_get(JSString *p, int idx) { + return p->is_wide_char ? str16(p)[idx] : str8(p)[idx]; +} + +typedef struct JSClassShortDef { + JSAtom class_name; + JSClassFinalizer *finalizer; + JSClassGCMark *gc_mark; +} JSClassShortDef; + +static JSClassShortDef const js_std_class_def[] = { + { JS_ATOM_Object, NULL, NULL }, /* JS_CLASS_OBJECT */ + { JS_ATOM_Array, js_array_finalizer, js_array_mark }, /* JS_CLASS_ARRAY */ + { JS_ATOM_Error, NULL, NULL }, /* JS_CLASS_ERROR */ + { JS_ATOM_Number, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_NUMBER */ + { JS_ATOM_String, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_STRING */ + { JS_ATOM_Boolean, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_BOOLEAN */ + { JS_ATOM_Symbol, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_SYMBOL */ + { JS_ATOM_Arguments, js_array_finalizer, js_array_mark }, /* JS_CLASS_ARGUMENTS */ + { JS_ATOM_Arguments, NULL, NULL }, /* JS_CLASS_MAPPED_ARGUMENTS */ + { JS_ATOM_Date, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_DATE */ + { JS_ATOM_Object, NULL, NULL }, /* JS_CLASS_MODULE_NS */ + { JS_ATOM_Function, js_c_function_finalizer, js_c_function_mark }, /* JS_CLASS_C_FUNCTION */ + { JS_ATOM_Function, js_bytecode_function_finalizer, js_bytecode_function_mark }, /* JS_CLASS_BYTECODE_FUNCTION */ + { JS_ATOM_Function, js_bound_function_finalizer, js_bound_function_mark }, /* JS_CLASS_BOUND_FUNCTION */ + { JS_ATOM_Function, js_c_function_data_finalizer, js_c_function_data_mark }, /* JS_CLASS_C_FUNCTION_DATA */ + { JS_ATOM_Function, js_c_closure_finalizer, NULL}, /* JS_CLASS_C_CLOSURE */ + { JS_ATOM_GeneratorFunction, js_bytecode_function_finalizer, js_bytecode_function_mark }, /* JS_CLASS_GENERATOR_FUNCTION */ + { JS_ATOM_ForInIterator, js_for_in_iterator_finalizer, js_for_in_iterator_mark }, /* JS_CLASS_FOR_IN_ITERATOR */ + { JS_ATOM_RegExp, js_regexp_finalizer, NULL }, /* JS_CLASS_REGEXP */ + { JS_ATOM_ArrayBuffer, js_array_buffer_finalizer, NULL }, /* JS_CLASS_ARRAY_BUFFER */ + { JS_ATOM_SharedArrayBuffer, js_array_buffer_finalizer, NULL }, /* JS_CLASS_SHARED_ARRAY_BUFFER */ + { JS_ATOM_Uint8ClampedArray, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_UINT8C_ARRAY */ + { JS_ATOM_Int8Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_INT8_ARRAY */ + { JS_ATOM_Uint8Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_UINT8_ARRAY */ + { JS_ATOM_Int16Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_INT16_ARRAY */ + { JS_ATOM_Uint16Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_UINT16_ARRAY */ + { JS_ATOM_Int32Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_INT32_ARRAY */ + { JS_ATOM_Uint32Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_UINT32_ARRAY */ + { JS_ATOM_BigInt64Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_BIG_INT64_ARRAY */ + { JS_ATOM_BigUint64Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_BIG_UINT64_ARRAY */ + { JS_ATOM_Float16Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_FLOAT16_ARRAY */ + { JS_ATOM_Float32Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_FLOAT32_ARRAY */ + { JS_ATOM_Float64Array, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_FLOAT64_ARRAY */ + { JS_ATOM_DataView, js_typed_array_finalizer, js_typed_array_mark }, /* JS_CLASS_DATAVIEW */ + { JS_ATOM_BigInt, js_object_data_finalizer, js_object_data_mark }, /* JS_CLASS_BIG_INT */ + { JS_ATOM_Map, js_map_finalizer, js_map_mark }, /* JS_CLASS_MAP */ + { JS_ATOM_Set, js_map_finalizer, js_map_mark }, /* JS_CLASS_SET */ + { JS_ATOM_WeakMap, js_map_finalizer, NULL }, /* JS_CLASS_WEAKMAP */ + { JS_ATOM_WeakSet, js_map_finalizer, NULL }, /* JS_CLASS_WEAKSET */ + { JS_ATOM_Iterator, NULL, NULL }, /* JS_CLASS_ITERATOR */ + { JS_ATOM_IteratorConcat, js_iterator_concat_finalizer, js_iterator_concat_mark }, /* JS_CLASS_ITERATOR_CONCAT */ + { JS_ATOM_IteratorHelper, js_iterator_helper_finalizer, js_iterator_helper_mark }, /* JS_CLASS_ITERATOR_HELPER */ + { JS_ATOM_IteratorWrap, js_iterator_wrap_finalizer, js_iterator_wrap_mark }, /* JS_CLASS_ITERATOR_WRAP */ + { JS_ATOM_Map_Iterator, js_map_iterator_finalizer, js_map_iterator_mark }, /* JS_CLASS_MAP_ITERATOR */ + { JS_ATOM_Set_Iterator, js_map_iterator_finalizer, js_map_iterator_mark }, /* JS_CLASS_SET_ITERATOR */ + { JS_ATOM_Array_Iterator, js_array_iterator_finalizer, js_array_iterator_mark }, /* JS_CLASS_ARRAY_ITERATOR */ + { JS_ATOM_String_Iterator, js_array_iterator_finalizer, js_array_iterator_mark }, /* JS_CLASS_STRING_ITERATOR */ + { JS_ATOM_RegExp_String_Iterator, js_regexp_string_iterator_finalizer, js_regexp_string_iterator_mark }, /* JS_CLASS_REGEXP_STRING_ITERATOR */ + { JS_ATOM_Generator, js_generator_finalizer, js_generator_mark }, /* JS_CLASS_GENERATOR */ +}; + +static int init_class_range(JSRuntime *rt, JSClassShortDef const *tab, + int start, int count) +{ + JSClassDef cm_s, *cm = &cm_s; + int i, class_id; + + for(i = 0; i < count; i++) { + class_id = i + start; + memset(cm, 0, sizeof(*cm)); + cm->finalizer = tab[i].finalizer; + cm->gc_mark = tab[i].gc_mark; + if (JS_NewClass1(rt, class_id, cm, tab[i].class_name) < 0) + return -1; + } + return 0; +} + +/* Uses code from LLVM project. */ +static inline uintptr_t js_get_stack_pointer(void) +{ +#if defined(__clang__) || defined(__GNUC__) + return (uintptr_t)__builtin_frame_address(0); +#elif defined(_MSC_VER) + return (uintptr_t)_AddressOfReturnAddress(); +#else + char CharOnStack = 0; + // The volatile store here is intended to escape the local variable, to + // prevent the compiler from optimizing CharOnStack into anything other + // than a char on the stack. + // + // Tested on: MSVC 2015 - 2019, GCC 4.9 - 9, Clang 3.2 - 9, ICC 13 - 19. + char *volatile Ptr = &CharOnStack; + return (uintptr_t) Ptr; +#endif +} + +static inline bool js_check_stack_overflow(JSRuntime *rt, size_t alloca_size) +{ + uintptr_t sp; + sp = js_get_stack_pointer() - alloca_size; + return unlikely(sp < rt->stack_limit); +} + +JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque) +{ + JSRuntime *rt; + JSMallocState ms; + + memset(&ms, 0, sizeof(ms)); + ms.opaque = opaque; + ms.malloc_limit = 0; + + rt = mf->js_calloc(opaque, 1, sizeof(JSRuntime)); + if (!rt) + return NULL; + rt->mf = *mf; + if (!rt->mf.js_malloc_usable_size) { + /* use dummy function if none provided */ + rt->mf.js_malloc_usable_size = js_malloc_usable_size_unknown; + } + /* Inline what js_malloc_rt does since we cannot use it here. */ + ms.malloc_count++; + ms.malloc_size += rt->mf.js_malloc_usable_size(rt) + MALLOC_OVERHEAD; + rt->malloc_state = ms; + rt->malloc_gc_threshold = 256 * 1024; + + init_list_head(&rt->context_list); + init_list_head(&rt->gc_obj_list); + init_list_head(&rt->gc_zero_ref_count_list); + rt->gc_phase = JS_GC_PHASE_NONE; + +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + init_list_head(&rt->string_list); +#endif + init_list_head(&rt->job_list); + + if (JS_InitAtoms(rt)) + goto fail; + + /* create the object, array and function classes */ + if (init_class_range(rt, js_std_class_def, JS_CLASS_OBJECT, + countof(js_std_class_def)) < 0) + goto fail; + rt->class_array[JS_CLASS_ARGUMENTS].exotic = &js_arguments_exotic_methods; + rt->class_array[JS_CLASS_STRING].exotic = &js_string_exotic_methods; + rt->class_array[JS_CLASS_MODULE_NS].exotic = &js_module_ns_exotic_methods; + + rt->class_array[JS_CLASS_C_FUNCTION].call = js_call_c_function; + rt->class_array[JS_CLASS_C_FUNCTION_DATA].call = js_call_c_function_data; + rt->class_array[JS_CLASS_C_CLOSURE].call = js_call_c_closure; + rt->class_array[JS_CLASS_BOUND_FUNCTION].call = js_call_bound_function; + rt->class_array[JS_CLASS_GENERATOR_FUNCTION].call = js_call_generator_function; + if (init_shape_hash(rt)) + goto fail; + + rt->js_class_id_alloc = JS_CLASS_INIT_COUNT; + + rt->stack_size = JS_DEFAULT_STACK_SIZE; +#ifdef __wasi__ + rt->stack_size = 0; +#endif + + JS_UpdateStackTop(rt); + + rt->current_exception = JS_UNINITIALIZED; + + return rt; + fail: + JS_FreeRuntime(rt); + return NULL; +} + +void *JS_GetRuntimeOpaque(JSRuntime *rt) +{ + return rt->user_opaque; +} + +void JS_SetRuntimeOpaque(JSRuntime *rt, void *opaque) +{ + rt->user_opaque = opaque; +} + +int JS_AddRuntimeFinalizer(JSRuntime *rt, JSRuntimeFinalizer *finalizer, + void *arg) +{ + JSRuntimeFinalizerState *fs = js_malloc_rt(rt, sizeof(*fs)); + if (!fs) + return -1; + fs->next = rt->finalizers; + fs->finalizer = finalizer; + fs->arg = arg; + rt->finalizers = fs; + return 0; +} + +static void *js_def_calloc(void *opaque, size_t count, size_t size) +{ + return calloc(count, size); +} + +static void *js_def_malloc(void *opaque, size_t size) +{ + return malloc(size); +} + +static void js_def_free(void *opaque, void *ptr) +{ + free(ptr); +} + +static void *js_def_realloc(void *opaque, void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +static const JSMallocFunctions def_malloc_funcs = { + js_def_calloc, + js_def_malloc, + js_def_free, + js_def_realloc, + js__malloc_usable_size +}; + +JSRuntime *JS_NewRuntime(void) +{ + return JS_NewRuntime2(&def_malloc_funcs, NULL); +} + +void JS_SetMemoryLimit(JSRuntime *rt, size_t limit) +{ + rt->malloc_state.malloc_limit = limit; +} + +void JS_SetDumpFlags(JSRuntime *rt, uint64_t flags) +{ +#ifdef ENABLE_DUMPS + rt->dump_flags = flags; +#endif +} + +uint64_t JS_GetDumpFlags(JSRuntime *rt) +{ +#ifdef ENABLE_DUMPS + return rt->dump_flags; +#else + return 0; +#endif +} + +size_t JS_GetGCThreshold(JSRuntime *rt) { + return rt->malloc_gc_threshold; +} + +/* use -1 to disable automatic GC */ +void JS_SetGCThreshold(JSRuntime *rt, size_t gc_threshold) +{ + rt->malloc_gc_threshold = gc_threshold; +} + +#define malloc(s) malloc_is_forbidden(s) +#define free(p) free_is_forbidden(p) +#define realloc(p,s) realloc_is_forbidden(p,s) + +void JS_SetInterruptHandler(JSRuntime *rt, JSInterruptHandler *cb, void *opaque) +{ + rt->interrupt_handler = cb; + rt->interrupt_opaque = opaque; +} + +void JS_SetCanBlock(JSRuntime *rt, bool can_block) +{ + rt->can_block = can_block; +} + +void JS_SetSharedArrayBufferFunctions(JSRuntime *rt, + const JSSharedArrayBufferFunctions *sf) +{ + rt->sab_funcs = *sf; +} + +/* return 0 if OK, < 0 if exception */ +int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func, + int argc, JSValueConst *argv) +{ + JSRuntime *rt = ctx->rt; + JSJobEntry *e; + int i; + + assert(!rt->in_free); + + e = js_malloc(ctx, sizeof(*e) + argc * sizeof(JSValue)); + if (!e) + return -1; + e->ctx = ctx; + e->job_func = job_func; + e->argc = argc; + for(i = 0; i < argc; i++) { + e->argv[i] = js_dup(argv[i]); + } + list_add_tail(&e->link, &rt->job_list); + return 0; +} + +bool JS_IsJobPending(JSRuntime *rt) +{ + return !list_empty(&rt->job_list); +} + +/* return < 0 if exception, 0 if no job pending, 1 if a job was + executed successfully. the context of the job is stored in '*pctx' */ +int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx) +{ + JSContext *ctx; + JSJobEntry *e; + JSValue res; + int i, ret; + + if (list_empty(&rt->job_list)) { + *pctx = NULL; + return 0; + } + + /* get the first pending job and execute it */ + e = list_entry(rt->job_list.next, JSJobEntry, link); + list_del(&e->link); + ctx = e->ctx; + res = e->job_func(e->ctx, e->argc, vc(e->argv)); + for(i = 0; i < e->argc; i++) + JS_FreeValue(ctx, e->argv[i]); + if (JS_IsException(res)) + ret = -1; + else + ret = 1; + JS_FreeValue(ctx, res); + js_free(ctx, e); + *pctx = ctx; + return ret; +} + +static inline uint32_t atom_get_free(const JSAtomStruct *p) +{ + return (uintptr_t)p >> 1; +} + +static inline bool atom_is_free(const JSAtomStruct *p) +{ + return (uintptr_t)p & 1; +} + +static inline JSAtomStruct *atom_set_free(uint32_t v) +{ + return (JSAtomStruct *)(((uintptr_t)v << 1) | 1); +} + +/* Note: the string contents are uninitialized */ +static JSString *js_alloc_string_rt(JSRuntime *rt, int max_len, int is_wide_char) +{ + JSString *str; + str = js_malloc_rt(rt, sizeof(JSString) + (max_len << is_wide_char) + 1 - is_wide_char); + if (unlikely(!str)) + return NULL; + str->header.ref_count = 1; + str->is_wide_char = is_wide_char; + str->len = max_len; + str->kind = JS_STRING_KIND_NORMAL; + str->atom_type = 0; + str->hash = 0; /* optional but costless */ + str->hash_next = 0; /* optional */ +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_add_tail(&str->link, &rt->string_list); +#endif + return str; +} + +static JSString *js_alloc_string(JSContext *ctx, int max_len, int is_wide_char) +{ + JSString *p; + p = js_alloc_string_rt(ctx->rt, max_len, is_wide_char); + if (unlikely(!p)) { + JS_ThrowOutOfMemory(ctx); + return NULL; + } + return p; +} + +static inline void js_free_string0(JSRuntime *rt, JSString *str); + +/* same as JS_FreeValueRT() but faster */ +static inline void js_free_string(JSRuntime *rt, JSString *str) +{ + if (--str->header.ref_count <= 0) + js_free_string0(rt, str); +} + +static inline void js_free_string0(JSRuntime *rt, JSString *str) +{ + if (str->atom_type) { + JS_FreeAtomStruct(rt, str); + } else { +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_del(&str->link); +#endif + if (str->kind == JS_STRING_KIND_SLICE) { + JSStringSlice *slice = (void *)&str[1]; + js_free_string(rt, slice->parent); // safe, recurses only 1 level + } + js_free_rt(rt, str); + } +} + +void JS_SetRuntimeInfo(JSRuntime *rt, const char *s) +{ + if (rt) + rt->rt_info = s; +} + +void JS_FreeRuntime(JSRuntime *rt) +{ + struct list_head *el, *el1; + int i; + + rt->in_free = true; + JS_FreeValueRT(rt, rt->current_exception); + + list_for_each_safe(el, el1, &rt->job_list) { + JSJobEntry *e = list_entry(el, JSJobEntry, link); + for(i = 0; i < e->argc; i++) + JS_FreeValueRT(rt, e->argv[i]); + js_free_rt(rt, e); + } + init_list_head(&rt->job_list); + + JS_RunGC(rt); + +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + /* leaking objects */ + if (check_dump_flag(rt, JS_DUMP_LEAKS)) { + bool header_done; + JSGCObjectHeader *p; + int count; + + /* remove the internal refcounts to display only the object + referenced externally */ + list_for_each(el, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + p->mark = 0; + } + gc_decref(rt); + + header_done = false; + list_for_each(el, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + if (p->ref_count != 0) { + if (!header_done) { + printf("Object leaks:\n"); + JS_DumpObjectHeader(rt); + header_done = true; + } + JS_DumpGCObject(rt, p); + } + } + + count = 0; + list_for_each(el, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + if (p->ref_count == 0) { + count++; + } + } + if (count != 0) + printf("Secondary object leaks: %d\n", count); + } +#endif + + assert(list_empty(&rt->gc_obj_list)); + + /* free the classes */ + for(i = 0; i < rt->class_count; i++) { + JSClass *cl = &rt->class_array[i]; + if (cl->class_id != 0) { + JS_FreeAtomRT(rt, cl->class_name); + } + } + js_free_rt(rt, rt->class_array); + +#ifdef ENABLE_DUMPS // JS_DUMP_ATOM_LEAKS + /* only the atoms defined in JS_InitAtoms() should be left */ + if (check_dump_flag(rt, JS_DUMP_ATOM_LEAKS)) { + bool header_done = false; + + for(i = 0; i < rt->atom_size; i++) { + JSAtomStruct *p = rt->atom_array[i]; + if (!atom_is_free(p) /* && p->str*/) { + if (i >= JS_ATOM_END || p->header.ref_count != 1) { + if (!header_done) { + header_done = true; + if (rt->rt_info) { + printf("%s:1: atom leakage:", rt->rt_info); + } else { + printf("Atom leaks:\n" + " %6s %6s %s\n", + "ID", "REFCNT", "NAME"); + } + } + if (rt->rt_info) { + printf(" "); + } else { + printf(" %6u %6u ", i, p->header.ref_count); + } + switch (p->atom_type) { + case JS_ATOM_TYPE_STRING: + JS_DumpString(rt, p); + break; + case JS_ATOM_TYPE_GLOBAL_SYMBOL: + printf("Symbol.for("); + JS_DumpString(rt, p); + printf(")"); + break; + case JS_ATOM_TYPE_SYMBOL: + if (p->hash == JS_ATOM_HASH_SYMBOL) { + printf("Symbol("); + JS_DumpString(rt, p); + printf(")"); + } else { + printf("Private("); + JS_DumpString(rt, p); + printf(")"); + } + break; + } + if (rt->rt_info) { + printf(":%u", p->header.ref_count); + } else { + printf("\n"); + } + } + } + } + if (rt->rt_info && header_done) + printf("\n"); + } +#endif + + /* free the atoms */ + for(i = 0; i < rt->atom_size; i++) { + JSAtomStruct *p = rt->atom_array[i]; + if (!atom_is_free(p)) { +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_del(&p->link); +#endif + js_free_rt(rt, p); + } + } + js_free_rt(rt, rt->atom_array); + js_free_rt(rt, rt->atom_hash); + js_free_rt(rt, rt->shape_hash); +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + if (check_dump_flag(rt, JS_DUMP_LEAKS) && !list_empty(&rt->string_list)) { + if (rt->rt_info) { + printf("%s:1: string leakage:", rt->rt_info); + } else { + printf("String leaks:\n" + " %6s %s\n", + "REFCNT", "VALUE"); + } + list_for_each_safe(el, el1, &rt->string_list) { + JSString *str = list_entry(el, JSString, link); + if (rt->rt_info) { + printf(" "); + } else { + printf(" %6u ", str->header.ref_count); + } + JS_DumpString(rt, str); + if (rt->rt_info) { + printf(":%u", str->header.ref_count); + } else { + printf("\n"); + } + list_del(&str->link); + js_free_rt(rt, str); + } + if (rt->rt_info) + printf("\n"); + } +#endif + + while (rt->finalizers) { + JSRuntimeFinalizerState *fs = rt->finalizers; + rt->finalizers = fs->next; + fs->finalizer(rt, fs->arg); + js_free_rt(rt, fs); + } + +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + if (check_dump_flag(rt, JS_DUMP_LEAKS)) { + JSMallocState *s = &rt->malloc_state; + if (s->malloc_count > 1) { + if (rt->rt_info) + printf("%s:1: ", rt->rt_info); + printf("Memory leak: %zd bytes lost in %zd block%s\n", + s->malloc_size - sizeof(JSRuntime), + s->malloc_count - 1, &"s"[s->malloc_count == 2]); + } + } +#endif + + { + JSMallocState *ms = &rt->malloc_state; + rt->mf.js_free(ms->opaque, rt); + } +} + +JSContext *JS_NewContextRaw(JSRuntime *rt) +{ + JSContext *ctx; + int i; + + ctx = js_mallocz_rt(rt, sizeof(JSContext)); + if (!ctx) + return NULL; + ctx->header.ref_count = 1; + add_gc_object(rt, &ctx->header, JS_GC_OBJ_TYPE_JS_CONTEXT); + + ctx->class_proto = js_malloc_rt(rt, sizeof(ctx->class_proto[0]) * + rt->class_count); + if (!ctx->class_proto) { + js_free_rt(rt, ctx); + return NULL; + } + ctx->rt = rt; + list_add_tail(&ctx->link, &rt->context_list); + for(i = 0; i < rt->class_count; i++) + ctx->class_proto[i] = JS_NULL; + ctx->array_ctor = JS_NULL; + ctx->iterator_ctor = JS_NULL; + ctx->iterator_ctor_getset = JS_NULL; + ctx->regexp_ctor = JS_NULL; + ctx->promise_ctor = JS_NULL; + ctx->error_ctor = JS_NULL; + ctx->error_back_trace = JS_UNDEFINED; + ctx->error_prepare_stack = JS_UNDEFINED; + ctx->error_stack_trace_limit = js_int32(10); + init_list_head(&ctx->loaded_modules); + + JS_AddIntrinsicBasicObjects(ctx); + return ctx; +} + +JSContext *JS_NewContext(JSRuntime *rt) +{ + JSContext *ctx; + + ctx = JS_NewContextRaw(rt); + if (!ctx) + return NULL; + + JS_AddIntrinsicBaseObjects(ctx); + JS_AddIntrinsicDate(ctx); + JS_AddIntrinsicEval(ctx); + JS_AddIntrinsicRegExp(ctx); + JS_AddIntrinsicJSON(ctx); + JS_AddIntrinsicProxy(ctx); + JS_AddIntrinsicMapSet(ctx); + JS_AddIntrinsicTypedArrays(ctx); + JS_AddIntrinsicPromise(ctx); + JS_AddIntrinsicBigInt(ctx); + JS_AddIntrinsicWeakRef(ctx); + JS_AddIntrinsicDOMException(ctx); + + JS_AddPerformance(ctx); + + return ctx; +} + +void *JS_GetContextOpaque(JSContext *ctx) +{ + return ctx->user_opaque; +} + +void JS_SetContextOpaque(JSContext *ctx, void *opaque) +{ + ctx->user_opaque = opaque; +} + +/* set the new value and free the old value after (freeing the value + can reallocate the object data) */ +static inline void set_value(JSContext *ctx, JSValue *pval, JSValue new_val) +{ + JSValue old_val; + old_val = *pval; + *pval = new_val; + JS_FreeValue(ctx, old_val); +} + +void JS_SetClassProto(JSContext *ctx, JSClassID class_id, JSValue obj) +{ + assert(class_id < ctx->rt->class_count); + set_value(ctx, &ctx->class_proto[class_id], obj); +} + +JSValue JS_GetClassProto(JSContext *ctx, JSClassID class_id) +{ + assert(class_id < ctx->rt->class_count); + return js_dup(ctx->class_proto[class_id]); +} + +JSValue JS_GetFunctionProto(JSContext *ctx) +{ + return js_dup(ctx->function_proto); +} + +typedef enum JSFreeModuleEnum { + JS_FREE_MODULE_ALL, + JS_FREE_MODULE_NOT_RESOLVED, +} JSFreeModuleEnum; + +/* XXX: would be more efficient with separate module lists */ +static void js_free_modules(JSContext *ctx, JSFreeModuleEnum flag) +{ + struct list_head *el, *el1; + list_for_each_safe(el, el1, &ctx->loaded_modules) { + JSModuleDef *m = list_entry(el, JSModuleDef, link); + if (flag == JS_FREE_MODULE_ALL || + (flag == JS_FREE_MODULE_NOT_RESOLVED && !m->resolved)) { + js_free_module_def(ctx, m); + } + } +} + +JSContext *JS_DupContext(JSContext *ctx) +{ + ctx->header.ref_count++; + return ctx; +} + +/* used by the GC */ +static void JS_MarkContext(JSRuntime *rt, JSContext *ctx, + JS_MarkFunc *mark_func) +{ + int i; + struct list_head *el; + + /* modules are not seen by the GC, so we directly mark the objects + referenced by each module */ + list_for_each(el, &ctx->loaded_modules) { + JSModuleDef *m = list_entry(el, JSModuleDef, link); + js_mark_module_def(rt, m, mark_func); + } + + JS_MarkValue(rt, ctx->global_obj, mark_func); + JS_MarkValue(rt, ctx->global_var_obj, mark_func); + + JS_MarkValue(rt, ctx->throw_type_error, mark_func); + JS_MarkValue(rt, ctx->eval_obj, mark_func); + + JS_MarkValue(rt, ctx->array_proto_values, mark_func); + for(i = 0; i < JS_NATIVE_ERROR_COUNT; i++) { + JS_MarkValue(rt, ctx->native_error_proto[i], mark_func); + } + JS_MarkValue(rt, ctx->error_ctor, mark_func); + JS_MarkValue(rt, ctx->error_back_trace, mark_func); + JS_MarkValue(rt, ctx->error_prepare_stack, mark_func); + JS_MarkValue(rt, ctx->error_stack_trace_limit, mark_func); + for(i = 0; i < rt->class_count; i++) { + JS_MarkValue(rt, ctx->class_proto[i], mark_func); + } + JS_MarkValue(rt, ctx->iterator_ctor, mark_func); + JS_MarkValue(rt, ctx->iterator_ctor_getset, mark_func); + JS_MarkValue(rt, ctx->async_iterator_proto, mark_func); + JS_MarkValue(rt, ctx->promise_ctor, mark_func); + JS_MarkValue(rt, ctx->array_ctor, mark_func); + JS_MarkValue(rt, ctx->regexp_ctor, mark_func); + JS_MarkValue(rt, ctx->function_ctor, mark_func); + JS_MarkValue(rt, ctx->function_proto, mark_func); + + if (ctx->array_shape) + mark_func(rt, &ctx->array_shape->header); +} + +void JS_FreeContext(JSContext *ctx) +{ + JSRuntime *rt = ctx->rt; + int i; + + if (--ctx->header.ref_count > 0) + return; + assert(ctx->header.ref_count == 0); + +#ifdef ENABLE_DUMPS // JS_DUMP_ATOMS + if (check_dump_flag(rt, JS_DUMP_ATOMS)) + JS_DumpAtoms(ctx->rt); +#endif +#ifdef ENABLE_DUMPS // JS_DUMP_SHAPES + if (check_dump_flag(rt, JS_DUMP_SHAPES)) + JS_DumpShapes(ctx->rt); +#endif +#ifdef ENABLE_DUMPS // JS_DUMP_OBJECTS + if (check_dump_flag(rt, JS_DUMP_OBJECTS)) { + struct list_head *el; + JSGCObjectHeader *p; + printf("JSObjects: {\n"); + JS_DumpObjectHeader(ctx->rt); + list_for_each(el, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + JS_DumpGCObject(rt, p); + } + printf("}\n"); + } +#endif +#ifdef ENABLE_DUMPS // JS_DUMP_MEM + if (check_dump_flag(rt, JS_DUMP_MEM)) { + JSMemoryUsage stats; + JS_ComputeMemoryUsage(rt, &stats); + JS_DumpMemoryUsage(stdout, &stats, rt); + } +#endif + + js_free_modules(ctx, JS_FREE_MODULE_ALL); + + JS_FreeValue(ctx, ctx->global_obj); + JS_FreeValue(ctx, ctx->global_var_obj); + + JS_FreeValue(ctx, ctx->throw_type_error); + JS_FreeValue(ctx, ctx->eval_obj); + + JS_FreeValue(ctx, ctx->array_proto_values); + for(i = 0; i < JS_NATIVE_ERROR_COUNT; i++) { + JS_FreeValue(ctx, ctx->native_error_proto[i]); + } + JS_FreeValue(ctx, ctx->error_ctor); + JS_FreeValue(ctx, ctx->error_back_trace); + JS_FreeValue(ctx, ctx->error_prepare_stack); + JS_FreeValue(ctx, ctx->error_stack_trace_limit); + for(i = 0; i < rt->class_count; i++) { + JS_FreeValue(ctx, ctx->class_proto[i]); + } + js_free_rt(rt, ctx->class_proto); + JS_FreeValue(ctx, ctx->iterator_ctor); + JS_FreeValue(ctx, ctx->iterator_ctor_getset); + JS_FreeValue(ctx, ctx->async_iterator_proto); + JS_FreeValue(ctx, ctx->promise_ctor); + JS_FreeValue(ctx, ctx->array_ctor); + JS_FreeValue(ctx, ctx->regexp_ctor); + JS_FreeValue(ctx, ctx->function_ctor); + JS_FreeValue(ctx, ctx->function_proto); + + js_free_shape_null(ctx->rt, ctx->array_shape); + + list_del(&ctx->link); + remove_gc_object(&ctx->header); + js_free_rt(ctx->rt, ctx); +} + +JSRuntime *JS_GetRuntime(JSContext *ctx) +{ + return ctx->rt; +} + +static void update_stack_limit(JSRuntime *rt) +{ +#if defined(__wasi__) + rt->stack_limit = 0; /* no limit */ +#else + if (rt->stack_size == 0) { + rt->stack_limit = 0; /* no limit */ + } else { + rt->stack_limit = rt->stack_top - rt->stack_size; + } +#endif +} + +void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size) +{ + rt->stack_size = stack_size; + update_stack_limit(rt); +} + +void JS_UpdateStackTop(JSRuntime *rt) +{ + rt->stack_top = js_get_stack_pointer(); + update_stack_limit(rt); +} + +static inline bool is_strict_mode(JSContext *ctx) +{ + JSStackFrame *sf = ctx->rt->current_stack_frame; + return sf && sf->is_strict_mode; +} + +/* JSAtom support */ + +#define JS_ATOM_TAG_INT (1U << 31) +#define JS_ATOM_MAX_INT (JS_ATOM_TAG_INT - 1) +#define JS_ATOM_MAX ((1U << 30) - 1) + +/* return the max count from the hash size */ +#define JS_ATOM_COUNT_RESIZE(n) ((n) * 2) + +static inline bool __JS_AtomIsConst(JSAtom v) +{ + return (int32_t)v < JS_ATOM_END; +} + +static inline bool __JS_AtomIsTaggedInt(JSAtom v) +{ + return (v & JS_ATOM_TAG_INT) != 0; +} + +static inline JSAtom __JS_AtomFromUInt32(uint32_t v) +{ + return v | JS_ATOM_TAG_INT; +} + +static inline uint32_t __JS_AtomToUInt32(JSAtom atom) +{ + return atom & ~JS_ATOM_TAG_INT; +} + +static inline int is_num(int c) +{ + return c >= '0' && c <= '9'; +} + +/* return true if the string is a number n with 0 <= n <= 2^32-1 */ +static inline bool is_num_string(uint32_t *pval, JSString *p) +{ + uint32_t n; + uint64_t n64; + int c, i, len; + + len = p->len; + if (len == 0 || len > 10) + return false; + c = string_get(p, 0); + if (is_num(c)) { + if (c == '0') { + if (len != 1) + return false; + n = 0; + } else { + n = c - '0'; + for(i = 1; i < len; i++) { + c = string_get(p, i); + if (!is_num(c)) + return false; + n64 = (uint64_t)n * 10 + (c - '0'); + if ((n64 >> 32) != 0) + return false; + n = n64; + } + } + *pval = n; + return true; + } else { + return false; + } +} + +/* XXX: could use faster version ? */ +static inline uint32_t hash_string8(const uint8_t *str, size_t len, uint32_t h) +{ + size_t i; + + for(i = 0; i < len; i++) + h = h * 263 + str[i]; + return h; +} + +static inline uint32_t hash_string16(const uint16_t *str, + size_t len, uint32_t h) +{ + size_t i; + + for(i = 0; i < len; i++) + h = h * 263 + str[i]; + return h; +} + +static uint32_t hash_string(JSString *str, uint32_t h) +{ + if (str->is_wide_char) + h = hash_string16(str16(str), str->len, h); + else + h = hash_string8(str8(str), str->len, h); + return h; +} + +static __maybe_unused void JS_DumpString(JSRuntime *rt, JSString *p) +{ + int i, c, sep; + + if (p == NULL) { + printf(""); + return; + } + if (p->header.ref_count != 1) + printf("%d", p->header.ref_count); + if (p->is_wide_char) + putchar('L'); + sep = '\"'; + putchar(sep); + for(i = 0; i < p->len; i++) { + c = string_get(p, i); + if (c == sep || c == '\\') { + putchar('\\'); + putchar(c); + } else if (c >= ' ' && c <= 126) { + putchar(c); + } else if (c == '\n') { + putchar('\\'); + putchar('n'); + } else { + printf("\\u%04x", c); + } + } + putchar(sep); +} + +static __maybe_unused void JS_DumpAtoms(JSRuntime *rt) +{ + JSAtomStruct *p; + int h, i; + /* This only dumps hashed atoms, not JS_ATOM_TYPE_SYMBOL atoms */ + printf("JSAtom count=%d size=%d hash_size=%d:\n", + rt->atom_count, rt->atom_size, rt->atom_hash_size); + printf("JSAtom hash table: {\n"); + for(i = 0; i < rt->atom_hash_size; i++) { + h = rt->atom_hash[i]; + if (h) { + printf(" %d:", i); + while (h) { + p = rt->atom_array[h]; + printf(" "); + JS_DumpString(rt, p); + h = p->hash_next; + } + printf("\n"); + } + } + printf("}\n"); + printf("JSAtom table: {\n"); + for(i = 0; i < rt->atom_size; i++) { + p = rt->atom_array[i]; + if (!atom_is_free(p)) { + printf(" %d: { %d %08x ", i, p->atom_type, p->hash); + if (!(p->len == 0 && p->is_wide_char != 0)) + JS_DumpString(rt, p); + printf(" %d }\n", p->hash_next); + } + } + printf("}\n"); +} + +static int JS_ResizeAtomHash(JSRuntime *rt, int new_hash_size) +{ + JSAtomStruct *p; + uint32_t new_hash_mask, h, i, hash_next1, j, *new_hash; + + assert((new_hash_size & (new_hash_size - 1)) == 0); /* power of two */ + new_hash_mask = new_hash_size - 1; + new_hash = js_mallocz_rt(rt, sizeof(rt->atom_hash[0]) * new_hash_size); + if (!new_hash) + return -1; + for(i = 0; i < rt->atom_hash_size; i++) { + h = rt->atom_hash[i]; + while (h != 0) { + p = rt->atom_array[h]; + hash_next1 = p->hash_next; + /* add in new hash table */ + j = p->hash & new_hash_mask; + p->hash_next = new_hash[j]; + new_hash[j] = h; + h = hash_next1; + } + } + js_free_rt(rt, rt->atom_hash); + rt->atom_hash = new_hash; + rt->atom_hash_size = new_hash_size; + rt->atom_count_resize = JS_ATOM_COUNT_RESIZE(new_hash_size); + // JS_DumpAtoms(rt); + return 0; +} + +static int JS_InitAtoms(JSRuntime *rt) +{ + int i, len, atom_type; + const char *p; + + rt->atom_hash_size = 0; + rt->atom_hash = NULL; + rt->atom_count = 0; + rt->atom_size = 0; + rt->atom_free_index = 0; + if (JS_ResizeAtomHash(rt, 256)) /* there are at least 195 predefined atoms */ + return -1; + + p = js_atom_init; + for(i = 1; i < JS_ATOM_END; i++) { + if (i == JS_ATOM_Private_brand) + atom_type = JS_ATOM_TYPE_PRIVATE; + else if (i >= JS_ATOM_Symbol_toPrimitive) + atom_type = JS_ATOM_TYPE_SYMBOL; + else + atom_type = JS_ATOM_TYPE_STRING; + len = strlen(p); + if (__JS_NewAtomInit(rt, p, len, atom_type) == JS_ATOM_NULL) + return -1; + p = p + len + 1; + } + return 0; +} + +JSAtom JS_DupAtomRT(JSRuntime *rt, JSAtom v) +{ + JSAtomStruct *p; + + if (!__JS_AtomIsConst(v)) { + p = rt->atom_array[v]; + p->header.ref_count++; + } + return v; +} + +JSAtom JS_DupAtom(JSContext *ctx, JSAtom v) +{ + JSRuntime *rt; + JSAtomStruct *p; + + if (!__JS_AtomIsConst(v)) { + rt = ctx->rt; + p = rt->atom_array[v]; + p->header.ref_count++; + } + return v; +} + +static JSAtomKindEnum JS_AtomGetKind(JSContext *ctx, JSAtom v) +{ + JSRuntime *rt; + JSAtomStruct *p; + + rt = ctx->rt; + if (__JS_AtomIsTaggedInt(v)) + return JS_ATOM_KIND_STRING; + p = rt->atom_array[v]; + switch(p->atom_type) { + case JS_ATOM_TYPE_STRING: + return JS_ATOM_KIND_STRING; + case JS_ATOM_TYPE_GLOBAL_SYMBOL: + return JS_ATOM_KIND_SYMBOL; + case JS_ATOM_TYPE_SYMBOL: + switch(p->hash) { + case JS_ATOM_HASH_SYMBOL: + return JS_ATOM_KIND_SYMBOL; + case JS_ATOM_HASH_PRIVATE: + return JS_ATOM_KIND_PRIVATE; + default: + abort(); + } + default: + abort(); + } + return (JSAtomKindEnum){-1}; // pacify compiler +} + +static JSAtom js_get_atom_index(JSRuntime *rt, JSAtomStruct *p) +{ + uint32_t i = p->hash_next; /* atom_index */ + if (p->atom_type != JS_ATOM_TYPE_SYMBOL) { + JSAtomStruct *p1; + + i = rt->atom_hash[p->hash & (rt->atom_hash_size - 1)]; + p1 = rt->atom_array[i]; + while (p1 != p) { + assert(i != 0); + i = p1->hash_next; + p1 = rt->atom_array[i]; + } + } + return i; +} + +/* string case (internal). Return JS_ATOM_NULL if error. 'str' is + freed. */ +static JSAtom __JS_NewAtom(JSRuntime *rt, JSString *str, int atom_type) +{ + uint32_t h, h1, i; + JSAtomStruct *p; + int len; + + if (atom_type < JS_ATOM_TYPE_SYMBOL) { + /* str is not NULL */ + if (str->atom_type == atom_type) { + /* str is the atom, return its index */ + i = js_get_atom_index(rt, str); + /* reduce string refcount and increase atom's unless constant */ + if (__JS_AtomIsConst(i)) + str->header.ref_count--; + return i; + } + /* try and locate an already registered atom */ + len = str->len; + h = hash_string(str, atom_type); + h &= JS_ATOM_HASH_MASK; + h1 = h & (rt->atom_hash_size - 1); + i = rt->atom_hash[h1]; + while (i != 0) { + p = rt->atom_array[i]; + if (p->hash == h && + p->atom_type == atom_type && + p->len == len && + js_string_memcmp(p, str, len) == 0) { + if (!__JS_AtomIsConst(i)) + p->header.ref_count++; + goto done; + } + i = p->hash_next; + } + } else { + h1 = 0; /* avoid warning */ + if (atom_type == JS_ATOM_TYPE_SYMBOL) { + h = JS_ATOM_HASH_SYMBOL; + } else { + h = JS_ATOM_HASH_PRIVATE; + atom_type = JS_ATOM_TYPE_SYMBOL; + } + } + + if (rt->atom_free_index == 0) { + /* allow new atom entries */ + uint32_t new_size, start; + JSAtomStruct **new_array; + + /* alloc new with size progression 3/2: + 4 6 9 13 19 28 42 63 94 141 211 316 474 711 1066 1599 2398 3597 5395 8092 + preallocating space for predefined atoms (at least 195). + */ + new_size = max_int(211, rt->atom_size * 3 / 2); + if (new_size > JS_ATOM_MAX) + goto fail; + /* XXX: should use realloc2 to use slack space */ + new_array = js_realloc_rt(rt, rt->atom_array, sizeof(*new_array) * new_size); + if (!new_array) + goto fail; + /* Note: the atom 0 is not used */ + start = rt->atom_size; + if (start == 0) { + /* JS_ATOM_NULL entry */ + p = js_mallocz_rt(rt, sizeof(JSAtomStruct)); + if (!p) { + js_free_rt(rt, new_array); + goto fail; + } + p->header.ref_count = 1; /* not refcounted */ + p->atom_type = JS_ATOM_TYPE_SYMBOL; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_add_tail(&p->link, &rt->string_list); +#endif + new_array[0] = p; + rt->atom_count++; + start = 1; + } + rt->atom_size = new_size; + rt->atom_array = new_array; + rt->atom_free_index = start; + for(i = start; i < new_size; i++) { + uint32_t next; + if (i == (new_size - 1)) + next = 0; + else + next = i + 1; + rt->atom_array[i] = atom_set_free(next); + } + } + + if (str) { + if (str->atom_type == 0) { + p = str; + p->atom_type = atom_type; + } else { + p = js_malloc_rt(rt, sizeof(JSString) + + (str->len << str->is_wide_char) + + 1 - str->is_wide_char); + if (unlikely(!p)) + goto fail; + p->header.ref_count = 1; + p->is_wide_char = str->is_wide_char; + p->len = str->len; + p->kind = JS_STRING_KIND_NORMAL; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_add_tail(&p->link, &rt->string_list); +#endif + memcpy(str8(p), str8(str), (str->len << str->is_wide_char) + + 1 - str->is_wide_char); + js_free_string(rt, str); + } + } else { + p = js_malloc_rt(rt, sizeof(JSAtomStruct)); /* empty wide string */ + if (!p) + return JS_ATOM_NULL; + p->header.ref_count = 1; + p->is_wide_char = 1; /* Hack to represent NULL as a JSString */ + p->len = 0; + p->kind = JS_STRING_KIND_NORMAL; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_add_tail(&p->link, &rt->string_list); +#endif + } + + /* use an already free entry */ + i = rt->atom_free_index; + rt->atom_free_index = atom_get_free(rt->atom_array[i]); + rt->atom_array[i] = p; + + p->hash = h; + p->hash_next = i; /* atom_index */ + p->atom_type = atom_type; + p->first_weak_ref = NULL; + + rt->atom_count++; + + if (atom_type != JS_ATOM_TYPE_SYMBOL) { + p->hash_next = rt->atom_hash[h1]; + rt->atom_hash[h1] = i; + if (unlikely(rt->atom_count >= rt->atom_count_resize)) + JS_ResizeAtomHash(rt, rt->atom_hash_size * 2); + } + + // JS_DumpAtoms(rt); + return i; + + fail: + i = JS_ATOM_NULL; + done: + if (str) + js_free_string(rt, str); + return i; +} + +// XXX: `str` must be pure ASCII. No UTF-8 encoded strings +// XXX: `str` must not be the string representation of a small integer +static JSAtom __JS_NewAtomInit(JSRuntime *rt, const char *str, int len, + int atom_type) +{ + JSString *p; + p = js_alloc_string_rt(rt, len, 0); + if (!p) + return JS_ATOM_NULL; + memcpy(str8(p), str, len); + str8(p)[len] = '\0'; + return __JS_NewAtom(rt, p, atom_type); +} + +// XXX: `str` must be raw 8-bit contents. No UTF-8 encoded strings +static JSAtom __JS_FindAtom(JSRuntime *rt, const char *str, size_t len, + int atom_type) +{ + uint32_t h, h1, i; + JSAtomStruct *p; + + h = hash_string8((const uint8_t *)str, len, JS_ATOM_TYPE_STRING); + h &= JS_ATOM_HASH_MASK; + h1 = h & (rt->atom_hash_size - 1); + i = rt->atom_hash[h1]; + while (i != 0) { + p = rt->atom_array[i]; + if (p->hash == h && + p->atom_type == JS_ATOM_TYPE_STRING && + p->len == len && + p->is_wide_char == 0 && + memcmp(str8(p), str, len) == 0) { + if (!__JS_AtomIsConst(i)) + p->header.ref_count++; + return i; + } + i = p->hash_next; + } + return JS_ATOM_NULL; +} + +static void JS_FreeAtomStruct(JSRuntime *rt, JSAtomStruct *p) +{ + uint32_t i = p->hash_next; /* atom_index */ + if (p->atom_type != JS_ATOM_TYPE_SYMBOL) { + JSAtomStruct *p0, *p1; + uint32_t h0; + + h0 = p->hash & (rt->atom_hash_size - 1); + i = rt->atom_hash[h0]; + p1 = rt->atom_array[i]; + if (p1 == p) { + rt->atom_hash[h0] = p1->hash_next; + } else { + for(;;) { + assert(i != 0); + p0 = p1; + i = p1->hash_next; + p1 = rt->atom_array[i]; + if (p1 == p) { + p0->hash_next = p1->hash_next; + break; + } + } + } + } + /* insert in free atom list */ + rt->atom_array[i] = atom_set_free(rt->atom_free_index); + rt->atom_free_index = i; + if (unlikely(p->first_weak_ref)) { + reset_weak_ref(rt, &p->first_weak_ref); + } + /* free the string structure */ +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_del(&p->link); +#endif + js_free_rt(rt, p); + rt->atom_count--; + assert(rt->atom_count >= 0); +} + +static void __JS_FreeAtom(JSRuntime *rt, uint32_t i) +{ + JSAtomStruct *p; + + p = rt->atom_array[i]; + if (--p->header.ref_count > 0) + return; + JS_FreeAtomStruct(rt, p); +} + +/* Warning: 'p' is freed */ +static JSAtom JS_NewAtomStr(JSContext *ctx, JSString *p) +{ + JSRuntime *rt = ctx->rt; + uint32_t n; + if (is_num_string(&n, p)) { + if (n <= JS_ATOM_MAX_INT) { + js_free_string(rt, p); + return __JS_AtomFromUInt32(n); + } + } + /* XXX: should generate an exception */ + return __JS_NewAtom(rt, p, JS_ATOM_TYPE_STRING); +} + +/* `str` may be pure ASCII or UTF-8 encoded */ +JSAtom JS_NewAtomLen(JSContext *ctx, const char *str, size_t len) +{ + JSValue val; + + if (len == 0 || !is_digit(*str)) { + // TODO(chqrlie): this does not work if `str` has UTF-8 encoded contents + // bug example: `({ "\u00c3\u00a9": 1 }).\u00e9` evaluates to `1`. + JSAtom atom = __JS_FindAtom(ctx->rt, str, len, JS_ATOM_TYPE_STRING); + if (atom) + return atom; + } + val = JS_NewStringLen(ctx, str, len); + if (JS_IsException(val)) + return JS_ATOM_NULL; + return JS_NewAtomStr(ctx, JS_VALUE_GET_STRING(val)); +} + +/* `str` may be pure ASCII or UTF-8 encoded */ +JSAtom JS_NewAtom(JSContext *ctx, const char *str) +{ + return JS_NewAtomLen(ctx, str, strlen(str)); +} + +JSAtom JS_NewAtomUInt32(JSContext *ctx, uint32_t n) +{ + if (n <= JS_ATOM_MAX_INT) { + return __JS_AtomFromUInt32(n); + } else { + char buf[16]; + size_t len = u32toa(buf, n); + JSValue val = js_new_string8_len(ctx, buf, len); + if (JS_IsException(val)) + return JS_ATOM_NULL; + return __JS_NewAtom(ctx->rt, JS_VALUE_GET_STRING(val), + JS_ATOM_TYPE_STRING); + } +} + +static JSAtom JS_NewAtomInt64(JSContext *ctx, int64_t n) +{ + if ((uint64_t)n <= JS_ATOM_MAX_INT) { + return __JS_AtomFromUInt32((uint32_t)n); + } else { + char buf[24]; + size_t len = i64toa(buf, n); + JSValue val = js_new_string8_len(ctx, buf, len); + if (JS_IsException(val)) + return JS_ATOM_NULL; + return __JS_NewAtom(ctx->rt, JS_VALUE_GET_STRING(val), + JS_ATOM_TYPE_STRING); + } +} + +/* 'p' is freed */ +static JSValue JS_NewSymbolInternal(JSContext *ctx, JSString *p, int atom_type) +{ + JSRuntime *rt = ctx->rt; + JSAtom atom; + atom = __JS_NewAtom(rt, p, atom_type); + if (atom == JS_ATOM_NULL) + return JS_ThrowOutOfMemory(ctx); + return JS_MKPTR(JS_TAG_SYMBOL, rt->atom_array[atom]); +} + +/* descr must be a non-numeric string atom */ +static JSValue JS_NewSymbolFromAtom(JSContext *ctx, JSAtom descr, + int atom_type) +{ + JSRuntime *rt = ctx->rt; + JSString *p; + + assert(!__JS_AtomIsTaggedInt(descr)); + assert(descr < rt->atom_size); + p = rt->atom_array[descr]; + js_dup(JS_MKPTR(JS_TAG_STRING, p)); + return JS_NewSymbolInternal(ctx, p, atom_type); +} + +/* `description` may be pure ASCII or UTF-8 encoded */ +JSValue JS_NewSymbol(JSContext *ctx, const char *description, bool is_global) +{ + JSAtom atom = JS_NewAtom(ctx, description); + if (atom == JS_ATOM_NULL) + return JS_EXCEPTION; + return JS_NewSymbolFromAtom(ctx, atom, is_global ? JS_ATOM_TYPE_GLOBAL_SYMBOL : JS_ATOM_TYPE_SYMBOL); +} + +#define ATOM_GET_STR_BUF_SIZE 64 + +static const char *JS_AtomGetStrRT(JSRuntime *rt, char *buf, int buf_size, + JSAtom atom) +{ + if (__JS_AtomIsTaggedInt(atom)) { + snprintf(buf, buf_size, "%u", __JS_AtomToUInt32(atom)); + } else if (atom == JS_ATOM_NULL) { + snprintf(buf, buf_size, ""); + } else if (atom >= rt->atom_size) { + assert(atom < rt->atom_size); + snprintf(buf, buf_size, "", atom); + } else { + JSAtomStruct *p = rt->atom_array[atom]; + *buf = '\0'; + if (atom_is_free(p)) { + snprintf(buf, buf_size, "", atom); + } else if (p != NULL) { + JSString *str = p; + if (str->is_wide_char) { + /* encode surrogates correctly */ + utf8_encode_buf16(buf, buf_size, str16(str), str->len); + } else { + utf8_encode_buf8(buf, buf_size, str8(str), str->len); + } + } + } + return buf; +} + +static const char *JS_AtomGetStr(JSContext *ctx, char *buf, int buf_size, JSAtom atom) +{ + return JS_AtomGetStrRT(ctx->rt, buf, buf_size, atom); +} + +static JSValue __JS_AtomToValue(JSContext *ctx, JSAtom atom, bool force_string) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + + if (__JS_AtomIsTaggedInt(atom)) { + size_t len = u32toa(buf, __JS_AtomToUInt32(atom)); + return js_new_string8_len(ctx, buf, len); + } else { + JSRuntime *rt = ctx->rt; + JSAtomStruct *p; + assert(atom < rt->atom_size); + p = rt->atom_array[atom]; + if (p->atom_type == JS_ATOM_TYPE_STRING) { + goto ret_string; + } else if (force_string) { + if (p->len == 0 && p->is_wide_char != 0) { + /* no description string */ + p = rt->atom_array[JS_ATOM_empty_string]; + } + ret_string: + return js_dup(JS_MKPTR(JS_TAG_STRING, p)); + } else { + return js_dup(JS_MKPTR(JS_TAG_SYMBOL, p)); + } + } +} + +JSValue JS_AtomToValue(JSContext *ctx, JSAtom atom) +{ + return __JS_AtomToValue(ctx, atom, false); +} + +JSValue JS_AtomToString(JSContext *ctx, JSAtom atom) +{ + return __JS_AtomToValue(ctx, atom, true); +} + +/* return true if the atom is an array index (i.e. 0 <= index <= + 2^32-2 and return its value */ +static bool JS_AtomIsArrayIndex(JSContext *ctx, uint32_t *pval, JSAtom atom) +{ + if (__JS_AtomIsTaggedInt(atom)) { + *pval = __JS_AtomToUInt32(atom); + return true; + } else { + JSRuntime *rt = ctx->rt; + JSAtomStruct *p; + uint32_t val; + + assert(atom < rt->atom_size); + p = rt->atom_array[atom]; + if (p->atom_type == JS_ATOM_TYPE_STRING && + is_num_string(&val, p) && val != -1) { + *pval = val; + return true; + } else { + *pval = 0; + return false; + } + } +} + +/* This test must be fast if atom is not a numeric index (e.g. a + method name). Return JS_UNDEFINED if not a numeric + index. JS_EXCEPTION can also be returned. */ +static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom) +{ + JSRuntime *rt = ctx->rt; + JSAtomStruct *p1; + JSString *p; + int c, len, ret; + JSValue num, str; + + if (__JS_AtomIsTaggedInt(atom)) + return js_int32(__JS_AtomToUInt32(atom)); + assert(atom < rt->atom_size); + p1 = rt->atom_array[atom]; + if (p1->atom_type != JS_ATOM_TYPE_STRING) + return JS_UNDEFINED; + p = p1; + len = p->len; + if (p->is_wide_char) { + const uint16_t *r = str16(p), *r_end = str16(p) + len; + if (r >= r_end) + return JS_UNDEFINED; + c = *r; + if (c == '-') { + if (r >= r_end) + return JS_UNDEFINED; + r++; + c = *r; + /* -0 case is specific */ + if (c == '0' && len == 2) + goto minus_zero; + } + /* XXX: should test NaN, but the tests do not check it */ + if (!is_num(c)) { + /* XXX: String should be normalized, therefore 8-bit only */ + const uint16_t nfinity16[7] = { 'n', 'f', 'i', 'n', 'i', 't', 'y' }; + if (!(c =='I' && (r_end - r) == 8 && + !memcmp(r + 1, nfinity16, sizeof(nfinity16)))) + return JS_UNDEFINED; + } + } else { + const uint8_t *r = str8(p), *r_end = str8(p) + len; + if (r >= r_end) + return JS_UNDEFINED; + c = *r; + if (c == '-') { + if (r >= r_end) + return JS_UNDEFINED; + r++; + c = *r; + /* -0 case is specific */ + if (c == '0' && len == 2) { + minus_zero: + return js_float64(-0.0); + } + } + if (!is_num(c)) { + if (!(c =='I' && (r_end - r) == 8 && + !memcmp(r + 1, "nfinity", 7))) + return JS_UNDEFINED; + } + } + /* this is ECMA CanonicalNumericIndexString primitive */ + num = JS_ToNumber(ctx, JS_MKPTR(JS_TAG_STRING, p)); + if (JS_IsException(num)) + return num; + str = JS_ToString(ctx, num); + if (JS_IsException(str)) { + JS_FreeValue(ctx, num); + return str; + } + ret = js_string_eq(p, JS_VALUE_GET_STRING(str)); + JS_FreeValue(ctx, str); + if (ret) { + return num; + } else { + JS_FreeValue(ctx, num); + return JS_UNDEFINED; + } +} + +/* return -1 if exception or true/false */ +static int JS_AtomIsNumericIndex(JSContext *ctx, JSAtom atom) +{ + JSValue num; + num = JS_AtomIsNumericIndex1(ctx, atom); + if (likely(JS_IsUndefined(num))) + return false; + if (JS_IsException(num)) + return -1; + JS_FreeValue(ctx, num); + return true; +} + +void JS_FreeAtom(JSContext *ctx, JSAtom v) +{ + if (!__JS_AtomIsConst(v)) + __JS_FreeAtom(ctx->rt, v); +} + +void JS_FreeAtomRT(JSRuntime *rt, JSAtom v) +{ + if (!__JS_AtomIsConst(v)) + __JS_FreeAtom(rt, v); +} + +/* return true if 'v' is a symbol with a string description */ +static bool JS_AtomSymbolHasDescription(JSContext *ctx, JSAtom v) +{ + JSRuntime *rt; + JSAtomStruct *p; + + rt = ctx->rt; + if (__JS_AtomIsTaggedInt(v)) + return false; + p = rt->atom_array[v]; + return (((p->atom_type == JS_ATOM_TYPE_SYMBOL && + p->hash == JS_ATOM_HASH_SYMBOL) || + p->atom_type == JS_ATOM_TYPE_GLOBAL_SYMBOL) && + !(p->len == 0 && p->is_wide_char != 0)); +} + +static __maybe_unused void print_atom(JSContext *ctx, JSAtom atom) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + const char *p; + int i; + + /* XXX: should handle embedded null characters */ + /* XXX: should move encoding code to JS_AtomGetStr */ + p = JS_AtomGetStr(ctx, buf, sizeof(buf), atom); + for (i = 0; p[i]; i++) { + int c = (unsigned char)p[i]; + if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c == '_' || c == '$') || (c >= '0' && c <= '9' && i > 0))) + break; + } + if (i > 0 && p[i] == '\0') { + printf("%s", p); + } else { + putchar('"'); + printf("%.*s", i, p); + for (; p[i]; i++) { + int c = (unsigned char)p[i]; + if (c == '\"' || c == '\\') { + putchar('\\'); + putchar(c); + } else if (c >= ' ' && c <= 126) { + putchar(c); + } else if (c == '\n') { + putchar('\\'); + putchar('n'); + } else { + printf("\\u%04x", c); + } + } + putchar('\"'); + } +} + +/* free with JS_FreeCString() */ +const char *JS_AtomToCStringLen(JSContext *ctx, size_t *plen, JSAtom atom) +{ + JSValue str; + const char *cstr; + + str = JS_AtomToString(ctx, atom); + if (JS_IsException(str)) { + if (plen) + *plen = 0; + return NULL; + } + cstr = JS_ToCStringLen(ctx, plen, str); + JS_FreeValue(ctx, str); + return cstr; +} + +#ifndef QJS_DISABLE_PARSER + +/* return a string atom containing name concatenated with str1 */ +/* `str1` may be pure ASCII or UTF-8 encoded */ +// TODO(chqrlie): use string concatenation instead of UTF-8 conversion +static JSAtom js_atom_concat_str(JSContext *ctx, JSAtom name, const char *str1) +{ + JSValue str; + JSAtom atom; + const char *cstr; + char *cstr2; + size_t len, len1; + + str = JS_AtomToString(ctx, name); + if (JS_IsException(str)) + return JS_ATOM_NULL; + cstr = JS_ToCStringLen(ctx, &len, str); + if (!cstr) + goto fail; + len1 = strlen(str1); + cstr2 = js_malloc(ctx, len + len1 + 1); + if (!cstr2) + goto fail; + memcpy(cstr2, cstr, len); + memcpy(cstr2 + len, str1, len1); + cstr2[len + len1] = '\0'; + atom = JS_NewAtomLen(ctx, cstr2, len + len1); + js_free(ctx, cstr2); + JS_FreeCString(ctx, cstr); + JS_FreeValue(ctx, str); + return atom; + fail: + JS_FreeCString(ctx, cstr); + JS_FreeValue(ctx, str); + return JS_ATOM_NULL; +} + +static JSAtom js_atom_concat_num(JSContext *ctx, JSAtom name, uint32_t n) +{ + char buf[16]; + size_t len; + + len = u32toa(buf, n); + buf[len] = '\0'; + return js_atom_concat_str(ctx, name, buf); +} + +#endif // QJS_DISABLE_PARSER + +static inline bool JS_IsEmptyString(JSValueConst v) +{ + return JS_VALUE_GET_TAG(v) == JS_TAG_STRING && JS_VALUE_GET_STRING(v)->len == 0; +} + +/* JSClass support */ + +/* a new class ID is allocated if *pclass_id == 0, otherwise *pclass_id is left unchanged */ +JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id) +{ + JSClassID class_id = *pclass_id; + if (class_id == 0) { + class_id = rt->js_class_id_alloc++; + *pclass_id = class_id; + } + return class_id; +} + +JSClassID JS_GetClassID(JSValueConst v) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(v) != JS_TAG_OBJECT) + return JS_INVALID_CLASS_ID; + p = JS_VALUE_GET_OBJ(v); + return p->class_id; +} + +bool JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id) +{ + return (class_id < rt->class_count && + rt->class_array[class_id].class_id != 0); +} + +JSAtom JS_GetClassName(JSRuntime *rt, JSClassID class_id) +{ + if (JS_IsRegisteredClass(rt, class_id)) { + return JS_DupAtomRT(rt, rt->class_array[class_id].class_id); + } else { + return JS_ATOM_NULL; + } +} + +/* create a new object internal class. Return -1 if error, 0 if + OK. The finalizer can be NULL if none is needed. */ +static int JS_NewClass1(JSRuntime *rt, JSClassID class_id, + const JSClassDef *class_def, JSAtom name) +{ + int new_size, i; + JSClass *cl, *new_class_array; + struct list_head *el; + + if (class_id >= (1 << 16)) + return -1; + if (class_id < rt->class_count && + rt->class_array[class_id].class_id != 0) + return -1; + + if (class_id >= rt->class_count) { + new_size = max_int(JS_CLASS_INIT_COUNT, + max_int(class_id + 1, rt->class_count * 3 / 2)); + + /* reallocate the context class prototype array, if any */ + list_for_each(el, &rt->context_list) { + JSContext *ctx = list_entry(el, JSContext, link); + JSValue *new_tab; + new_tab = js_realloc_rt(rt, ctx->class_proto, + sizeof(ctx->class_proto[0]) * new_size); + if (!new_tab) + return -1; + for(i = rt->class_count; i < new_size; i++) + new_tab[i] = JS_NULL; + ctx->class_proto = new_tab; + } + /* reallocate the class array */ + new_class_array = js_realloc_rt(rt, rt->class_array, + sizeof(JSClass) * new_size); + if (!new_class_array) + return -1; + memset(new_class_array + rt->class_count, 0, + (new_size - rt->class_count) * sizeof(JSClass)); + rt->class_array = new_class_array; + rt->class_count = new_size; + } + cl = &rt->class_array[class_id]; + cl->class_id = class_id; + cl->class_name = JS_DupAtomRT(rt, name); + cl->finalizer = class_def->finalizer; + cl->gc_mark = class_def->gc_mark; + cl->call = class_def->call; + cl->exotic = class_def->exotic; + return 0; +} + +int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def) +{ + int ret, len; + JSAtom name; + + // XXX: class_def->class_name must be raw 8-bit contents. No UTF-8 encoded strings + len = strlen(class_def->class_name); + name = __JS_FindAtom(rt, class_def->class_name, len, JS_ATOM_TYPE_STRING); + if (name == JS_ATOM_NULL) { + name = __JS_NewAtomInit(rt, class_def->class_name, len, JS_ATOM_TYPE_STRING); + if (name == JS_ATOM_NULL) + return -1; + } + ret = JS_NewClass1(rt, class_id, class_def, name); + JS_FreeAtomRT(rt, name); + return ret; +} + +static inline JSValue js_empty_string(JSRuntime *rt) +{ + JSAtomStruct *p = rt->atom_array[JS_ATOM_empty_string]; + return js_dup(JS_MKPTR(JS_TAG_STRING, p)); +} + +// XXX: `buf` contains raw 8-bit data, no UTF-8 decoding is performed +// XXX: no special case for len == 0 +static JSValue js_new_string8_len(JSContext *ctx, const char *buf, int len) +{ + JSString *str; + str = js_alloc_string(ctx, len, 0); + if (!str) + return JS_EXCEPTION; + memcpy(str8(str), buf, len); + str8(str)[len] = '\0'; + return JS_MKPTR(JS_TAG_STRING, str); +} + +// XXX: `buf` contains raw 8-bit data, no UTF-8 decoding is performed +// XXX: no special case for the empty string +static inline JSValue js_new_string8(JSContext *ctx, const char *str) +{ + return js_new_string8_len(ctx, str, strlen(str)); +} + +static JSValue js_new_string16_len(JSContext *ctx, const uint16_t *buf, int len) +{ + JSString *str; + str = js_alloc_string(ctx, len, 1); + if (!str) + return JS_EXCEPTION; + memcpy(str16(str), buf, len * 2); + return JS_MKPTR(JS_TAG_STRING, str); +} + +static JSValue js_new_string_char(JSContext *ctx, uint16_t c) +{ + if (c < 0x100) { + char ch8 = c; + return js_new_string8_len(ctx, &ch8, 1); + } else { + uint16_t ch16 = c; + return js_new_string16_len(ctx, &ch16, 1); + } +} + +static JSValue js_sub_string(JSContext *ctx, JSString *p, int start, int end) +{ + JSStringSlice *slice; + JSString *q; + int len; + + len = end - start; + if (start == 0 && end == p->len) { + return js_dup(JS_MKPTR(JS_TAG_STRING, p)); + } + if (len <= 0) { + return js_empty_string(ctx->rt); + } + if (len > (JS_STRING_SLICE_LEN_MAX >> p->is_wide_char)) { + if (p->kind == JS_STRING_KIND_SLICE) { + slice = (void *)&p[1]; + p = slice->parent; + start += slice->start >> p->is_wide_char; // bytes -> chars + } + // allocate as 16 bit wide string to avoid wastage; + // js_alloc_string allocates 1 byte extra for 8 bit strings; + q = js_alloc_string(ctx, sizeof(*slice)/2, /*is_wide_char*/true); + if (!q) + return JS_EXCEPTION; + q->is_wide_char = p->is_wide_char; + q->kind = JS_STRING_KIND_SLICE; + q->len = len; + slice = (void *)&q[1]; + slice->parent = p; + slice->start = start << p->is_wide_char; // chars -> bytes + p->header.ref_count++; + return JS_MKPTR(JS_TAG_STRING, q); + } + if (p->is_wide_char) { + JSString *str; + int i; + uint16_t c = 0; + for (i = start; i < end; i++) { + c |= str16(p)[i]; + } + if (c > 0xFF) + return js_new_string16_len(ctx, str16(p) + start, len); + + str = js_alloc_string(ctx, len, 0); + if (!str) + return JS_EXCEPTION; + for (i = 0; i < len; i++) { + str8(str)[i] = str16(p)[start + i]; + } + str8(str)[len] = '\0'; + return JS_MKPTR(JS_TAG_STRING, str); + } else { + return js_new_string8_len(ctx, (const char *)(str8(p) + start), len); + } +} + +typedef struct StringBuffer { + JSContext *ctx; + JSString *str; + int len; + int size; + int is_wide_char; + int error_status; +} StringBuffer; + +/* It is valid to call string_buffer_end() and all string_buffer functions even + if string_buffer_init() or another string_buffer function returns an error. + If the error_status is set, string_buffer_end() returns JS_EXCEPTION. + */ +static int string_buffer_init2(JSContext *ctx, StringBuffer *s, int size, + int is_wide) +{ + s->ctx = ctx; + s->size = size; + s->len = 0; + s->is_wide_char = is_wide; + s->error_status = 0; + s->str = js_alloc_string(ctx, size, is_wide); + if (unlikely(!s->str)) { + s->size = 0; + return s->error_status = -1; + } +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + /* the StringBuffer may reallocate the JSString, only link it at the end */ + list_del(&s->str->link); +#endif + return 0; +} + +static inline int string_buffer_init(JSContext *ctx, StringBuffer *s, int size) +{ + return string_buffer_init2(ctx, s, size, 0); +} + +static void string_buffer_free(StringBuffer *s) +{ + js_free(s->ctx, s->str); + s->str = NULL; +} + +static int string_buffer_set_error(StringBuffer *s) +{ + js_free(s->ctx, s->str); + s->str = NULL; + s->size = 0; + s->len = 0; + return s->error_status = -1; +} + +static no_inline int string_buffer_widen(StringBuffer *s, int size) +{ + JSString *str; + size_t slack; + int i; + + if (s->error_status) + return -1; + + str = js_realloc2(s->ctx, s->str, sizeof(JSString) + (size << 1), &slack); + if (!str) + return string_buffer_set_error(s); + size += slack >> 1; + for(i = s->len; i-- > 0;) { + str16(str)[i] = str8(str)[i]; + } + s->is_wide_char = 1; + s->size = size; + s->str = str; + return 0; +} + +static no_inline int string_buffer_realloc(StringBuffer *s, int new_len, int c) +{ + JSString *new_str; + int new_size; + size_t new_size_bytes, slack; + + if (s->error_status) + return -1; + + if (new_len > JS_STRING_LEN_MAX) { + JS_ThrowRangeError(s->ctx, "invalid string length"); + return string_buffer_set_error(s); + } + new_size = min_int(max_int(new_len, s->size * 3 / 2), JS_STRING_LEN_MAX); + if (!s->is_wide_char && c >= 0x100) { + return string_buffer_widen(s, new_size); + } + new_size_bytes = sizeof(JSString) + (new_size << s->is_wide_char) + 1 - s->is_wide_char; + new_str = js_realloc2(s->ctx, s->str, new_size_bytes, &slack); + if (!new_str) + return string_buffer_set_error(s); + new_size = min_int(new_size + (slack >> s->is_wide_char), JS_STRING_LEN_MAX); + s->size = new_size; + s->str = new_str; + return 0; +} + +static no_inline int string_buffer_putc_slow(StringBuffer *s, uint32_t c) +{ + if (unlikely(s->len >= s->size)) { + if (string_buffer_realloc(s, s->len + 1, c)) + return -1; + } + if (s->is_wide_char) { + str16(s->str)[s->len++] = c; + } else if (c < 0x100) { + str8(s->str)[s->len++] = c; + } else { + if (string_buffer_widen(s, s->size)) + return -1; + str16(s->str)[s->len++] = c; + } + return 0; +} + +/* 0 <= c <= 0xff */ +static int string_buffer_putc8(StringBuffer *s, uint32_t c) +{ + if (unlikely(s->len >= s->size)) { + if (string_buffer_realloc(s, s->len + 1, c)) + return -1; + } + if (s->is_wide_char) { + str16(s->str)[s->len++] = c; + } else { + str8(s->str)[s->len++] = c; + } + return 0; +} + +/* 0 <= c <= 0xffff */ +static int string_buffer_putc16(StringBuffer *s, uint32_t c) +{ + if (likely(s->len < s->size)) { + if (s->is_wide_char) { + str16(s->str)[s->len++] = c; + return 0; + } else if (c < 0x100) { + str8(s->str)[s->len++] = c; + return 0; + } + } + return string_buffer_putc_slow(s, c); +} + +/* 0 <= c <= 0x10ffff */ +static int string_buffer_putc(StringBuffer *s, uint32_t c) +{ + if (unlikely(c >= 0x10000)) { + /* surrogate pair */ + if (string_buffer_putc16(s, get_hi_surrogate(c))) + return -1; + c = get_lo_surrogate(c); + } + return string_buffer_putc16(s, c); +} + +static int string_getc(JSString *p, int *pidx) +{ + int idx, c, c1; + idx = *pidx; + if (p->is_wide_char) { + c = str16(p)[idx++]; + if (is_hi_surrogate(c) && idx < p->len) { + c1 = str16(p)[idx]; + if (is_lo_surrogate(c1)) { + c = from_surrogate(c, c1); + idx++; + } + } + } else { + c = str8(p)[idx++]; + } + *pidx = idx; + return c; +} + +static int string_buffer_write8(StringBuffer *s, const uint8_t *p, int len) +{ + int i; + + if (s->len + len > s->size) { + if (string_buffer_realloc(s, s->len + len, 0)) + return -1; + } + if (s->is_wide_char) { + for (i = 0; i < len; i++) { + str16(s->str)[s->len + i] = p[i]; + } + s->len += len; + } else { + memcpy(&str8(s->str)[s->len], p, len); + s->len += len; + } + return 0; +} + +static int string_buffer_write16(StringBuffer *s, const uint16_t *p, int len) +{ + int c = 0, i; + + for (i = 0; i < len; i++) { + c |= p[i]; + } + if (s->len + len > s->size) { + if (string_buffer_realloc(s, s->len + len, c)) + return -1; + } else if (!s->is_wide_char && c >= 0x100) { + if (string_buffer_widen(s, s->size)) + return -1; + } + if (s->is_wide_char) { + memcpy(&str16(s->str)[s->len], p, len << 1); + s->len += len; + } else { + for (i = 0; i < len; i++) { + str8(s->str)[s->len + i] = p[i]; + } + s->len += len; + } + return 0; +} + +/* appending an ASCII string */ +static int string_buffer_puts8(StringBuffer *s, const char *str) +{ + return string_buffer_write8(s, (const uint8_t *)str, strlen(str)); +} + +static int string_buffer_concat(StringBuffer *s, JSString *p, + uint32_t from, uint32_t to) +{ + if (to <= from) + return 0; + if (p->is_wide_char) + return string_buffer_write16(s, str16(p) + from, to - from); + else + return string_buffer_write8(s, str8(p) + from, to - from); +} + +static int string_buffer_concat_value(StringBuffer *s, JSValueConst v) +{ + JSString *p; + JSValue v1; + int res; + + if (s->error_status) { + /* prevent exception overload */ + return -1; + } + if (unlikely(JS_VALUE_GET_TAG(v) != JS_TAG_STRING)) { + v1 = JS_ToString(s->ctx, v); + if (JS_IsException(v1)) + return string_buffer_set_error(s); + p = JS_VALUE_GET_STRING(v1); + res = string_buffer_concat(s, p, 0, p->len); + JS_FreeValue(s->ctx, v1); + return res; + } + p = JS_VALUE_GET_STRING(v); + return string_buffer_concat(s, p, 0, p->len); +} + +static int string_buffer_concat_value_free(StringBuffer *s, JSValue v) +{ + JSString *p; + int res; + + if (s->error_status) { + /* prevent exception overload */ + JS_FreeValue(s->ctx, v); + return -1; + } + if (unlikely(JS_VALUE_GET_TAG(v) != JS_TAG_STRING)) { + v = JS_ToStringFree(s->ctx, v); + if (JS_IsException(v)) + return string_buffer_set_error(s); + } + p = JS_VALUE_GET_STRING(v); + res = string_buffer_concat(s, p, 0, p->len); + JS_FreeValue(s->ctx, v); + return res; +} + +static int string_buffer_fill(StringBuffer *s, int c, int count) +{ + /* XXX: optimize */ + if (s->len + count > s->size) { + if (string_buffer_realloc(s, s->len + count, c)) + return -1; + } + while (count-- > 0) { + if (string_buffer_putc16(s, c)) + return -1; + } + return 0; +} + +static JSValue string_buffer_end(StringBuffer *s) +{ + JSString *str; + str = s->str; + if (s->error_status) + return JS_EXCEPTION; + if (s->len == 0) { + js_free(s->ctx, str); + s->str = NULL; + return js_empty_string(s->ctx->rt); + } + if (s->len < s->size) { + /* smaller size so js_realloc should not fail, but OK if it does */ + /* XXX: should add some slack to avoid unnecessary calls */ + /* XXX: might need to use malloc+free to ensure smaller size */ + str = js_realloc_rt(s->ctx->rt, str, sizeof(JSString) + + (s->len << s->is_wide_char) + 1 - s->is_wide_char); + if (str == NULL) + str = s->str; + s->str = str; + } + if (!s->is_wide_char) + str8(str)[s->len] = 0; +#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS + list_add_tail(&str->link, &s->ctx->rt->string_list); +#endif + str->is_wide_char = s->is_wide_char; + str->len = s->len; + s->str = NULL; + return JS_MKPTR(JS_TAG_STRING, str); +} + +/* create a string from a UTF-8 buffer */ +JSValue JS_NewStringLen(JSContext *ctx, const char *buf, size_t buf_len) +{ + JSString *str; + size_t len; + int kind; + + if (buf_len <= 0) { + return js_empty_string(ctx->rt); + } + /* Compute string kind and length: 7-bit, 8-bit, 16-bit, 16-bit UTF-16 */ + kind = utf8_scan(buf, buf_len, &len); + if (len > JS_STRING_LEN_MAX) + return JS_ThrowRangeError(ctx, "invalid string length"); + + switch (kind) { + case UTF8_PLAIN_ASCII: + str = js_alloc_string(ctx, len, 0); + if (!str) + return JS_EXCEPTION; + memcpy(str8(str), buf, len); + str8(str)[len] = '\0'; + break; + case UTF8_NON_ASCII: + /* buf contains non-ASCII code-points, but limited to 8-bit values */ + str = js_alloc_string(ctx, len, 0); + if (!str) + return JS_EXCEPTION; + utf8_decode_buf8(str8(str), len + 1, buf, buf_len); + break; + default: + // This causes a potential problem in JS_ThrowError if message is invalid + //if (kind & UTF8_HAS_ERRORS) + // return JS_ThrowRangeError(ctx, "invalid UTF-8 sequence"); + str = js_alloc_string(ctx, len, 1); + if (!str) + return JS_EXCEPTION; + utf8_decode_buf16(str16(str), len, buf, buf_len); + break; + } + return JS_MKPTR(JS_TAG_STRING, str); +} + +JSValue JS_NewStringUTF16(JSContext *ctx, const uint16_t *buf, size_t len) +{ + JSString *str; + + if (!len) + return js_empty_string(ctx->rt); + str = js_alloc_string(ctx, len, 1); + if (!str) + return JS_EXCEPTION; + memcpy(str16(str), buf, len * sizeof(*buf)); + return JS_MKPTR(JS_TAG_STRING, str); +} + +static JSValue JS_ConcatString3(JSContext *ctx, const char *str1, + JSValue str2, const char *str3) +{ + StringBuffer b_s, *b = &b_s; + int len1, len3; + JSString *p; + + if (unlikely(JS_VALUE_GET_TAG(str2) != JS_TAG_STRING)) { + str2 = JS_ToStringFree(ctx, str2); + if (JS_IsException(str2)) + goto fail; + } + p = JS_VALUE_GET_STRING(str2); + len1 = strlen(str1); + len3 = strlen(str3); + + if (string_buffer_init2(ctx, b, len1 + p->len + len3, p->is_wide_char)) + goto fail; + + string_buffer_write8(b, (const uint8_t *)str1, len1); + string_buffer_concat(b, p, 0, p->len); + string_buffer_write8(b, (const uint8_t *)str3, len3); + + JS_FreeValue(ctx, str2); + return string_buffer_end(b); + + fail: + JS_FreeValue(ctx, str2); + return JS_EXCEPTION; +} + +/* `str` may be pure ASCII or UTF-8 encoded */ +JSValue JS_NewAtomString(JSContext *ctx, const char *str) +{ + JSAtom atom = JS_NewAtom(ctx, str); + if (atom == JS_ATOM_NULL) + return JS_EXCEPTION; + JSValue val = JS_AtomToString(ctx, atom); + JS_FreeAtom(ctx, atom); + return val; +} + +static JSValue js_force_tostring(JSContext *ctx, JSValueConst val1) +{ + JSObject *p; + JSValue val; + + if (JS_VALUE_GET_TAG(val1) == JS_TAG_STRING) + return js_dup(val1); + val = JS_ToString(ctx, val1); + if (!JS_IsException(val)) + return val; + // Stringification can fail when there is an exception pending, + // e.g. a stack overflow InternalError. Special-case exception + // objects to make debugging easier, look up the .message property + // and stringify that. + if (JS_VALUE_GET_TAG(val1) != JS_TAG_OBJECT) + return JS_EXCEPTION; + p = JS_VALUE_GET_OBJ(val1); + if (p->class_id != JS_CLASS_ERROR) + return JS_EXCEPTION; + val = JS_GetProperty(ctx, val1, JS_ATOM_message); + if (JS_VALUE_GET_TAG(val) != JS_TAG_STRING) { + JS_FreeValue(ctx, val); + return JS_EXCEPTION; + } + return val; +} + +/* return (NULL, 0) if exception. */ +/* return pointer into a JSString with a live ref_count */ +/* cesu8 determines if non-BMP1 codepoints are encoded as 1 or 2 utf-8 sequences */ +const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValueConst val1, + bool cesu8) +{ + JSValue val; + JSString *str, *str_new; + int pos, len, c, c1; + uint8_t *q; + + val = js_force_tostring(ctx, val1); + if (JS_IsException(val)) + goto fail; + str = JS_VALUE_GET_STRING(val); + len = str->len; + if (!str->is_wide_char) { + const uint8_t *src = str8(str); + int count; + + /* count the number of non-ASCII characters */ + /* Scanning the whole string is required for ASCII strings, + and computing the number of non-ASCII bytes is less expensive + than testing each byte, hence this method is faster for ASCII + strings, which is the most common case. + */ + count = 0; + for (pos = 0; pos < len; pos++) { + count += src[pos] >> 7; + } + if (count == 0 && str->kind == JS_STRING_KIND_NORMAL) { + if (plen) + *plen = len; + return (const char *)src; + } + str_new = js_alloc_string(ctx, len + count, 0); + if (!str_new) + goto fail; + q = str8(str_new); + for (pos = 0; pos < len; pos++) { + c = src[pos]; + if (c < 0x80) { + *q++ = c; + } else { + *q++ = (c >> 6) | 0xc0; + *q++ = (c & 0x3f) | 0x80; + } + } + } else { + const uint16_t *src = str16(str); + /* Allocate 3 bytes per 16 bit code point. Surrogate pairs may + produce 4 bytes but use 2 code points. + */ + str_new = js_alloc_string(ctx, len * 3, 0); + if (!str_new) + goto fail; + q = str8(str_new); + pos = 0; + while (pos < len) { + c = src[pos++]; + if (c < 0x80) { + *q++ = c; + } else { + if (is_hi_surrogate(c)) { + if (pos < len && !cesu8) { + c1 = src[pos]; + if (is_lo_surrogate(c1)) { + pos++; + c = from_surrogate(c, c1); + } else { + /* Keep unmatched surrogate code points */ + /* c = 0xfffd; */ /* error */ + } + } else { + /* Keep unmatched surrogate code points */ + /* c = 0xfffd; */ /* error */ + } + } + q += utf8_encode(q, c); + } + } + } + + *q = '\0'; + str_new->len = q - str8(str_new); + JS_FreeValue(ctx, val); + if (plen) + *plen = str_new->len; + return (const char *)str8(str_new); +fail: + if (plen) + *plen = 0; + return NULL; +} + +const uint16_t *JS_ToCStringLenUTF16(JSContext *ctx, size_t *plen, + JSValueConst val1) +{ + JSString *p, *q; + uint32_t i; + JSValue v; + + v = js_force_tostring(ctx, val1); + if (JS_IsException(v)) + goto fail; + p = JS_VALUE_GET_STRING(v); + if (!p->is_wide_char) { + q = js_alloc_string(ctx, p->len, /*is_wide_char*/true); + if (!q) + goto fail; + for (i = 0; i < p->len; i++) + str16(q)[i] = str8(p)[i]; + JS_FreeValue(ctx, v); + p = q; + } + if (plen) + *plen = p->len; + return str16(p); +fail: + JS_FreeValue(ctx, v); + if (plen) + *plen = 0; + return NULL; +} + +static void js_free_cstring(JSRuntime *rt, const void *ptr) +{ + if (!ptr) + return; + /* purposely removing constness */ + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_STRING, (JSString *)ptr - 1)); +} + +void JS_FreeCString(JSContext *ctx, const char *ptr) +{ + return js_free_cstring(ctx->rt, ptr); +} + +void JS_FreeCStringRT(JSRuntime *rt, const char *ptr) +{ + return js_free_cstring(rt, ptr); +} + +void JS_FreeCStringUTF16(JSContext *ctx, const uint16_t *ptr) +{ + return js_free_cstring(ctx->rt, ptr); +} + +void JS_FreeCStringRT_UTF16(JSRuntime *rt, const uint16_t *ptr) +{ + return js_free_cstring(rt, ptr); +} + +static int memcmp16_8(const uint16_t *src1, const uint8_t *src2, int len) +{ + int c, i; + for(i = 0; i < len; i++) { + c = src1[i] - src2[i]; + if (c != 0) + return c; + } + return 0; +} + +static int memcmp16(const uint16_t *src1, const uint16_t *src2, int len) +{ + int c, i; + for(i = 0; i < len; i++) { + c = src1[i] - src2[i]; + if (c != 0) + return c; + } + return 0; +} + +static int js_string_memcmp(JSString *p1, JSString *p2, int len) +{ + int res; + + if (likely(!p1->is_wide_char)) { + if (likely(!p2->is_wide_char)) + res = memcmp(str8(p1), str8(p2), len); + else + res = -memcmp16_8(str16(p2), str8(p1), len); + } else { + if (!p2->is_wide_char) + res = memcmp16_8(str16(p1), str8(p2), len); + else + res = memcmp16(str16(p1), str16(p2), len); + } + return res; +} + +static bool js_string_eq(JSString *p1, JSString *p2) { + if (p1->len != p2->len) + return false; + return js_string_memcmp(p1, p2, p1->len) == 0; +} + +/* return < 0, 0 or > 0 */ +static int js_string_compare(JSString *p1, JSString *p2) +{ + int res, len; + len = min_int(p1->len, p2->len); + res = js_string_memcmp(p1, p2, len); + if (res == 0) + res = compare_u32(p1->len, p2->len); + return res; +} + +static void copy_str16(uint16_t *dst, JSString *p, int offset, int len) +{ + if (p->is_wide_char) { + memcpy(dst, str16(p) + offset, len * 2); + } else { + const uint8_t *src1 = str8(p) + offset; + int i; + + for(i = 0; i < len; i++) + dst[i] = src1[i]; + } +} + +static JSValue JS_ConcatString1(JSContext *ctx, JSString *p1, JSString *p2) +{ + JSString *p; + uint32_t len; + int is_wide_char; + + len = p1->len + p2->len; + if (len > JS_STRING_LEN_MAX) + return JS_ThrowRangeError(ctx, "invalid string length"); + is_wide_char = p1->is_wide_char | p2->is_wide_char; + p = js_alloc_string(ctx, len, is_wide_char); + if (!p) + return JS_EXCEPTION; + if (!is_wide_char) { + memcpy(str8(p), str8(p1), p1->len); + memcpy(str8(p) + p1->len, str8(p2), p2->len); + str8(p)[len] = '\0'; + } else { + copy_str16(str16(p), p1, 0, p1->len); + copy_str16(str16(p) + p1->len, p2, 0, p2->len); + } + return JS_MKPTR(JS_TAG_STRING, p); +} + +/* op1 and op2 are converted to strings. For convience, op1 or op2 = + JS_EXCEPTION are accepted and return JS_EXCEPTION. */ +static JSValue JS_ConcatString(JSContext *ctx, JSValue op1, JSValue op2) +{ + JSValue ret; + JSString *p1, *p2; + + if (unlikely(JS_VALUE_GET_TAG(op1) != JS_TAG_STRING)) { + op1 = JS_ToStringFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + return JS_EXCEPTION; + } + } + if (unlikely(JS_VALUE_GET_TAG(op2) != JS_TAG_STRING)) { + op2 = JS_ToStringFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + return JS_EXCEPTION; + } + } + p1 = JS_VALUE_GET_STRING(op1); + p2 = JS_VALUE_GET_STRING(op2); + + /* XXX: could also check if p1 is empty */ + if (p2->len == 0) { + goto ret_op1; + } + if (p1->header.ref_count == 1 && p1->is_wide_char == p2->is_wide_char + && js_malloc_usable_size(ctx, p1) >= sizeof(*p1) + ((p1->len + p2->len) << p2->is_wide_char) + 1 - p1->is_wide_char) { + /* Concatenate in place in available space at the end of p1 */ + if (p1->is_wide_char) { + memcpy(str16(p1) + p1->len, str16(p2), p2->len << 1); + p1->len += p2->len; + } else { + memcpy(str8(p1) + p1->len, str8(p2), p2->len); + p1->len += p2->len; + str8(p1)[p1->len] = '\0'; + } + ret_op1: + JS_FreeValue(ctx, op2); + return op1; + } + ret = JS_ConcatString1(ctx, p1, p2); + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + return ret; +} + +/* Shape support */ + +static inline size_t get_shape_size(size_t hash_size, size_t prop_size) +{ + return hash_size * sizeof(uint32_t) + sizeof(JSShape) + + prop_size * sizeof(JSShapeProperty); +} + +static inline JSShape *get_shape_from_alloc(void *sh_alloc, size_t hash_size) +{ + return (JSShape *)(void *)((uint32_t *)sh_alloc + hash_size); +} + +static inline uint32_t *prop_hash_end(JSShape *sh) +{ + return (uint32_t *)sh; +} + +static inline void *get_alloc_from_shape(JSShape *sh) +{ + return prop_hash_end(sh) - ((intptr_t)sh->prop_hash_mask + 1); +} + +static inline JSShapeProperty *get_shape_prop(JSShape *sh) +{ + return sh->prop; +} + +static int init_shape_hash(JSRuntime *rt) +{ + rt->shape_hash_bits = 6; /* 64 shapes */ + rt->shape_hash_size = 1 << rt->shape_hash_bits; + rt->shape_hash_count = 0; + rt->shape_hash = js_mallocz_rt(rt, sizeof(rt->shape_hash[0]) * + rt->shape_hash_size); + if (!rt->shape_hash) + return -1; + return 0; +} + +/* same magic hash multiplier as the Linux kernel */ +static uint32_t shape_hash(uint32_t h, uint32_t val) +{ + return (h + val) * 0x9e370001; +} + +/* truncate the shape hash to 'hash_bits' bits */ +static uint32_t get_shape_hash(uint32_t h, int hash_bits) +{ + return h >> (32 - hash_bits); +} + +static uint32_t shape_initial_hash(JSObject *proto) +{ + uint32_t h; + h = shape_hash(1, (uintptr_t)proto); + if (sizeof(proto) > 4) + h = shape_hash(h, (uint64_t)(uintptr_t)proto >> 32); + return h; +} + +static int resize_shape_hash(JSRuntime *rt, int new_shape_hash_bits) +{ + int new_shape_hash_size, i; + uint32_t h; + JSShape **new_shape_hash, *sh, *sh_next; + + new_shape_hash_size = 1 << new_shape_hash_bits; + new_shape_hash = js_mallocz_rt(rt, sizeof(rt->shape_hash[0]) * + new_shape_hash_size); + if (!new_shape_hash) + return -1; + for(i = 0; i < rt->shape_hash_size; i++) { + for(sh = rt->shape_hash[i]; sh != NULL; sh = sh_next) { + sh_next = sh->shape_hash_next; + h = get_shape_hash(sh->hash, new_shape_hash_bits); + sh->shape_hash_next = new_shape_hash[h]; + new_shape_hash[h] = sh; + } + } + js_free_rt(rt, rt->shape_hash); + rt->shape_hash_bits = new_shape_hash_bits; + rt->shape_hash_size = new_shape_hash_size; + rt->shape_hash = new_shape_hash; + return 0; +} + +static void js_shape_hash_link(JSRuntime *rt, JSShape *sh) +{ + uint32_t h; + h = get_shape_hash(sh->hash, rt->shape_hash_bits); + sh->shape_hash_next = rt->shape_hash[h]; + rt->shape_hash[h] = sh; + rt->shape_hash_count++; +} + +static void js_shape_hash_unlink(JSRuntime *rt, JSShape *sh) +{ + uint32_t h; + JSShape **psh; + + h = get_shape_hash(sh->hash, rt->shape_hash_bits); + psh = &rt->shape_hash[h]; + while (*psh != sh) + psh = &(*psh)->shape_hash_next; + *psh = sh->shape_hash_next; + rt->shape_hash_count--; +} + +/* create a new empty shape with prototype 'proto' */ +static no_inline JSShape *js_new_shape2(JSContext *ctx, JSObject *proto, + int hash_size, int prop_size) +{ + JSRuntime *rt = ctx->rt; + void *sh_alloc; + JSShape *sh; + + /* resize the shape hash table if necessary */ + if (2 * (rt->shape_hash_count + 1) > rt->shape_hash_size) { + resize_shape_hash(rt, rt->shape_hash_bits + 1); + } + + sh_alloc = js_malloc(ctx, get_shape_size(hash_size, prop_size)); + if (!sh_alloc) + return NULL; + sh = get_shape_from_alloc(sh_alloc, hash_size); + sh->header.ref_count = 1; + add_gc_object(rt, &sh->header, JS_GC_OBJ_TYPE_SHAPE); + if (proto) + js_dup(JS_MKPTR(JS_TAG_OBJECT, proto)); + sh->proto = proto; + memset(prop_hash_end(sh) - hash_size, 0, sizeof(prop_hash_end(sh)[0]) * + hash_size); + sh->prop_hash_mask = hash_size - 1; + sh->prop_size = prop_size; + sh->prop_count = 0; + sh->deleted_prop_count = 0; + + /* insert in the hash table */ + sh->hash = shape_initial_hash(proto); + sh->is_hashed = true; + sh->has_small_array_index = false; + js_shape_hash_link(ctx->rt, sh); + return sh; +} + +static JSShape *js_new_shape(JSContext *ctx, JSObject *proto) +{ + return js_new_shape2(ctx, proto, JS_PROP_INITIAL_HASH_SIZE, + JS_PROP_INITIAL_SIZE); +} + +/* The shape is cloned. The new shape is not inserted in the shape + hash table */ +static JSShape *js_clone_shape(JSContext *ctx, JSShape *sh1) +{ + JSShape *sh; + void *sh_alloc, *sh_alloc1; + size_t size; + JSShapeProperty *pr; + uint32_t i, hash_size; + + hash_size = sh1->prop_hash_mask + 1; + size = get_shape_size(hash_size, sh1->prop_size); + sh_alloc = js_malloc(ctx, size); + if (!sh_alloc) + return NULL; + sh_alloc1 = get_alloc_from_shape(sh1); + memcpy(sh_alloc, sh_alloc1, size); + sh = get_shape_from_alloc(sh_alloc, hash_size); + sh->header.ref_count = 1; + add_gc_object(ctx->rt, &sh->header, JS_GC_OBJ_TYPE_SHAPE); + sh->is_hashed = false; + if (sh->proto) { + js_dup(JS_MKPTR(JS_TAG_OBJECT, sh->proto)); + } + for(i = 0, pr = get_shape_prop(sh); i < sh->prop_count; i++, pr++) { + JS_DupAtom(ctx, pr->atom); + } + return sh; +} + +static JSShape *js_dup_shape(JSShape *sh) +{ + sh->header.ref_count++; + return sh; +} + +static void js_free_shape0(JSRuntime *rt, JSShape *sh) +{ + uint32_t i; + JSShapeProperty *pr; + + assert(sh->header.ref_count == 0); + if (sh->is_hashed) + js_shape_hash_unlink(rt, sh); + if (sh->proto != NULL) { + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_OBJECT, sh->proto)); + } + pr = get_shape_prop(sh); + for(i = 0; i < sh->prop_count; i++) { + JS_FreeAtomRT(rt, pr->atom); + pr++; + } + remove_gc_object(&sh->header); + js_free_rt(rt, get_alloc_from_shape(sh)); +} + +static void js_free_shape(JSRuntime *rt, JSShape *sh) +{ + if (unlikely(--sh->header.ref_count <= 0)) { + js_free_shape0(rt, sh); + } +} + +static void js_free_shape_null(JSRuntime *rt, JSShape *sh) +{ + if (sh) + js_free_shape(rt, sh); +} + +/* make space to hold at least 'count' properties */ +static no_inline int resize_properties(JSContext *ctx, JSShape **psh, + JSObject *p, uint32_t count) +{ + JSShape *sh; + uint32_t new_size, new_hash_size, new_hash_mask, i; + JSShapeProperty *pr; + void *sh_alloc; + intptr_t h; + + sh = *psh; + new_size = max_int(count, sh->prop_size * 3 / 2); + /* Reallocate prop array first to avoid crash or size inconsistency + in case of memory allocation failure */ + if (p) { + JSProperty *new_prop; + new_prop = js_realloc(ctx, p->prop, sizeof(new_prop[0]) * new_size); + if (unlikely(!new_prop)) + return -1; + p->prop = new_prop; + } + new_hash_size = sh->prop_hash_mask + 1; + while (new_hash_size < new_size) + new_hash_size = 2 * new_hash_size; + if (new_hash_size != (sh->prop_hash_mask + 1)) { + JSShape *old_sh; + /* resize the hash table and the properties */ + old_sh = sh; + sh_alloc = js_malloc(ctx, get_shape_size(new_hash_size, new_size)); + if (!sh_alloc) + return -1; + sh = get_shape_from_alloc(sh_alloc, new_hash_size); + list_del(&old_sh->header.link); + /* copy all the fields and the properties */ + memcpy(sh, old_sh, + sizeof(JSShape) + sizeof(sh->prop[0]) * old_sh->prop_count); + list_add_tail(&sh->header.link, &ctx->rt->gc_obj_list); + new_hash_mask = new_hash_size - 1; + sh->prop_hash_mask = new_hash_mask; + memset(prop_hash_end(sh) - new_hash_size, 0, + sizeof(prop_hash_end(sh)[0]) * new_hash_size); + for(i = 0, pr = sh->prop; i < sh->prop_count; i++, pr++) { + if (pr->atom != JS_ATOM_NULL) { + h = ((uintptr_t)pr->atom & new_hash_mask); + pr->hash_next = prop_hash_end(sh)[-h - 1]; + prop_hash_end(sh)[-h - 1] = i + 1; + } + } + js_free(ctx, get_alloc_from_shape(old_sh)); + } else { + /* only resize the properties */ + list_del(&sh->header.link); + sh_alloc = js_realloc(ctx, get_alloc_from_shape(sh), + get_shape_size(new_hash_size, new_size)); + if (unlikely(!sh_alloc)) { + /* insert again in the GC list */ + list_add_tail(&sh->header.link, &ctx->rt->gc_obj_list); + return -1; + } + sh = get_shape_from_alloc(sh_alloc, new_hash_size); + list_add_tail(&sh->header.link, &ctx->rt->gc_obj_list); + } + *psh = sh; + sh->prop_size = new_size; + return 0; +} + +/* remove the deleted properties. */ +static int compact_properties(JSContext *ctx, JSObject *p) +{ + JSShape *sh, *old_sh; + void *sh_alloc; + intptr_t h; + uint32_t new_hash_size, i, j, new_hash_mask, new_size; + JSShapeProperty *old_pr, *pr; + JSProperty *prop, *new_prop; + + sh = p->shape; + assert(!sh->is_hashed); + + new_size = max_int(JS_PROP_INITIAL_SIZE, + sh->prop_count - sh->deleted_prop_count); + assert(new_size <= sh->prop_size); + + new_hash_size = sh->prop_hash_mask + 1; + while ((new_hash_size / 2) >= new_size) + new_hash_size = new_hash_size / 2; + new_hash_mask = new_hash_size - 1; + + /* resize the hash table and the properties */ + old_sh = sh; + sh_alloc = js_malloc(ctx, get_shape_size(new_hash_size, new_size)); + if (!sh_alloc) + return -1; + sh = get_shape_from_alloc(sh_alloc, new_hash_size); + list_del(&old_sh->header.link); + memcpy(sh, old_sh, sizeof(JSShape)); + list_add_tail(&sh->header.link, &ctx->rt->gc_obj_list); + + memset(prop_hash_end(sh) - new_hash_size, 0, + sizeof(prop_hash_end(sh)[0]) * new_hash_size); + + j = 0; + old_pr = old_sh->prop; + pr = sh->prop; + prop = p->prop; + for(i = 0; i < sh->prop_count; i++) { + if (old_pr->atom != JS_ATOM_NULL) { + pr->atom = old_pr->atom; + pr->flags = old_pr->flags; + h = ((uintptr_t)old_pr->atom & new_hash_mask); + pr->hash_next = prop_hash_end(sh)[-h - 1]; + prop_hash_end(sh)[-h - 1] = j + 1; + prop[j] = prop[i]; + j++; + pr++; + } + old_pr++; + } + assert(j == (sh->prop_count - sh->deleted_prop_count)); + sh->prop_hash_mask = new_hash_mask; + sh->prop_size = new_size; + sh->deleted_prop_count = 0; + sh->prop_count = j; + + p->shape = sh; + js_free(ctx, get_alloc_from_shape(old_sh)); + + /* reduce the size of the object properties */ + new_prop = js_realloc(ctx, p->prop, sizeof(new_prop[0]) * new_size); + if (new_prop) + p->prop = new_prop; + return 0; +} + +static int add_shape_property(JSContext *ctx, JSShape **psh, + JSObject *p, JSAtom atom, int prop_flags) +{ + JSRuntime *rt = ctx->rt; + JSShape *sh = *psh; + JSShapeProperty *pr, *prop; + uint32_t hash_mask, new_shape_hash = 0; + intptr_t h; + + /* update the shape hash */ + if (sh->is_hashed) { + js_shape_hash_unlink(rt, sh); + new_shape_hash = shape_hash(shape_hash(sh->hash, atom), prop_flags); + } + + if (unlikely(sh->prop_count >= sh->prop_size)) { + if (resize_properties(ctx, psh, p, sh->prop_count + 1)) { + /* in case of error, reinsert in the hash table. + sh is still valid if resize_properties() failed */ + if (sh->is_hashed) + js_shape_hash_link(rt, sh); + return -1; + } + sh = *psh; + } + if (sh->is_hashed) { + sh->hash = new_shape_hash; + js_shape_hash_link(rt, sh); + } + /* Initialize the new shape property. + The object property at p->prop[sh->prop_count] is uninitialized */ + prop = get_shape_prop(sh); + pr = &prop[sh->prop_count++]; + pr->atom = JS_DupAtom(ctx, atom); + pr->flags = prop_flags; + sh->has_small_array_index |= __JS_AtomIsTaggedInt(atom); + /* add in hash table */ + hash_mask = sh->prop_hash_mask; + h = atom & hash_mask; + pr->hash_next = prop_hash_end(sh)[-h - 1]; + prop_hash_end(sh)[-h - 1] = sh->prop_count; + return 0; +} + +/* find a hashed empty shape matching the prototype. Return NULL if + not found */ +static JSShape *find_hashed_shape_proto(JSRuntime *rt, JSObject *proto) +{ + JSShape *sh1; + uint32_t h, h1; + + h = shape_initial_hash(proto); + h1 = get_shape_hash(h, rt->shape_hash_bits); + for(sh1 = rt->shape_hash[h1]; sh1 != NULL; sh1 = sh1->shape_hash_next) { + if (sh1->hash == h && + sh1->proto == proto && + sh1->prop_count == 0) { + return sh1; + } + } + return NULL; +} + +/* find a hashed shape matching sh + (prop, prop_flags). Return NULL if + not found */ +static JSShape *find_hashed_shape_prop(JSRuntime *rt, JSShape *sh, + JSAtom atom, int prop_flags) +{ + JSShape *sh1; + uint32_t h, h1, i, n; + + h = sh->hash; + h = shape_hash(h, atom); + h = shape_hash(h, prop_flags); + h1 = get_shape_hash(h, rt->shape_hash_bits); + for(sh1 = rt->shape_hash[h1]; sh1 != NULL; sh1 = sh1->shape_hash_next) { + /* we test the hash first so that the rest is done only if the + shapes really match */ + if (sh1->hash == h && + sh1->proto == sh->proto && + sh1->prop_count == ((n = sh->prop_count) + 1)) { + for(i = 0; i < n; i++) { + if (unlikely(sh1->prop[i].atom != sh->prop[i].atom) || + unlikely(sh1->prop[i].flags != sh->prop[i].flags)) + goto next; + } + if (unlikely(sh1->prop[n].atom != atom) || + unlikely(sh1->prop[n].flags != prop_flags)) + goto next; + return sh1; + } + next: ; + } + return NULL; +} + +static __maybe_unused void JS_DumpShape(JSRuntime *rt, int i, JSShape *sh) +{ + char atom_buf[ATOM_GET_STR_BUF_SIZE]; + int j; + + /* XXX: should output readable class prototype */ + printf("%5d %3d%c %14p %5d %5d", i, + sh->header.ref_count, " *"[sh->is_hashed], + (void *)sh->proto, sh->prop_size, sh->prop_count); + for(j = 0; j < sh->prop_count; j++) { + printf(" %s", JS_AtomGetStrRT(rt, atom_buf, sizeof(atom_buf), + sh->prop[j].atom)); + } + printf("\n"); +} + +static __maybe_unused void JS_DumpShapes(JSRuntime *rt) +{ + int i; + JSShape *sh; + struct list_head *el; + JSObject *p; + JSGCObjectHeader *gp; + + printf("JSShapes: {\n"); + printf("%5s %4s %14s %5s %5s %s\n", "SLOT", "REFS", "PROTO", "SIZE", "COUNT", "PROPS"); + for(i = 0; i < rt->shape_hash_size; i++) { + for(sh = rt->shape_hash[i]; sh != NULL; sh = sh->shape_hash_next) { + JS_DumpShape(rt, i, sh); + assert(sh->is_hashed); + } + } + /* dump non-hashed shapes */ + list_for_each(el, &rt->gc_obj_list) { + gp = list_entry(el, JSGCObjectHeader, link); + if (gp->gc_obj_type == JS_GC_OBJ_TYPE_JS_OBJECT) { + p = (JSObject *)gp; + if (!p->shape->is_hashed) { + JS_DumpShape(rt, -1, p->shape); + } + } + } + printf("}\n"); +} + +static JSValue JS_NewObjectFromShape(JSContext *ctx, JSShape *sh, JSClassID class_id) +{ + JSObject *p; + + js_trigger_gc(ctx->rt, sizeof(JSObject)); + p = js_malloc(ctx, sizeof(JSObject)); + if (unlikely(!p)) + goto fail; + p->class_id = class_id; + p->extensible = true; + p->free_mark = 0; + p->is_exotic = 0; + p->fast_array = 0; + p->is_constructor = 0; + p->is_uncatchable_error = 0; + p->tmp_mark = 0; + p->is_HTMLDDA = 0; + p->first_weak_ref = NULL; + p->u.opaque = NULL; + p->shape = sh; + p->prop = js_malloc(ctx, sizeof(JSProperty) * sh->prop_size); + if (unlikely(!p->prop)) { + js_free(ctx, p); + fail: + js_free_shape(ctx->rt, sh); + return JS_EXCEPTION; + } + + switch(class_id) { + case JS_CLASS_OBJECT: + break; + case JS_CLASS_ARRAY: + { + JSProperty *pr; + p->is_exotic = 1; + p->fast_array = 1; + p->u.array.u.values = NULL; + p->u.array.count = 0; + p->u.array.u1.size = 0; + /* the length property is always the first one */ + if (likely(sh == ctx->array_shape)) { + pr = &p->prop[0]; + } else { + /* only used for the first array */ + /* cannot fail */ + pr = add_property(ctx, p, JS_ATOM_length, + JS_PROP_WRITABLE | JS_PROP_LENGTH); + } + pr->u.value = js_int32(0); + } + break; + case JS_CLASS_C_FUNCTION: + p->prop[0].u.value = JS_UNDEFINED; + break; + case JS_CLASS_ARGUMENTS: + case JS_CLASS_UINT8C_ARRAY: + case JS_CLASS_INT8_ARRAY: + case JS_CLASS_UINT8_ARRAY: + case JS_CLASS_INT16_ARRAY: + case JS_CLASS_UINT16_ARRAY: + case JS_CLASS_INT32_ARRAY: + case JS_CLASS_UINT32_ARRAY: + case JS_CLASS_BIG_INT64_ARRAY: + case JS_CLASS_BIG_UINT64_ARRAY: + case JS_CLASS_FLOAT16_ARRAY: + case JS_CLASS_FLOAT32_ARRAY: + case JS_CLASS_FLOAT64_ARRAY: + p->is_exotic = 1; + p->fast_array = 1; + p->u.array.u.ptr = NULL; + p->u.array.count = 0; + break; + case JS_CLASS_DATAVIEW: + p->u.array.u.ptr = NULL; + p->u.array.count = 0; + break; + case JS_CLASS_NUMBER: + case JS_CLASS_STRING: + case JS_CLASS_BOOLEAN: + case JS_CLASS_SYMBOL: + case JS_CLASS_DATE: + case JS_CLASS_BIG_INT: + p->u.object_data = JS_UNDEFINED; + goto set_exotic; + case JS_CLASS_REGEXP: + p->u.regexp.pattern = NULL; + p->u.regexp.bytecode = NULL; + goto set_exotic; + default: + set_exotic: + if (ctx->rt->class_array[class_id].exotic) { + p->is_exotic = 1; + } + break; + } + p->header.ref_count = 1; + add_gc_object(ctx->rt, &p->header, JS_GC_OBJ_TYPE_JS_OBJECT); + return JS_MKPTR(JS_TAG_OBJECT, p); +} + +static JSObject *get_proto_obj(JSValueConst proto_val) +{ + if (JS_VALUE_GET_TAG(proto_val) != JS_TAG_OBJECT) + return NULL; + else + return JS_VALUE_GET_OBJ(proto_val); +} + +/* WARNING: proto must be an object or JS_NULL */ +JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValueConst proto_val, + JSClassID class_id) +{ + JSShape *sh; + JSObject *proto; + + proto = get_proto_obj(proto_val); + sh = find_hashed_shape_proto(ctx->rt, proto); + if (likely(sh)) { + sh = js_dup_shape(sh); + } else { + sh = js_new_shape(ctx, proto); + if (!sh) + return JS_EXCEPTION; + } + return JS_NewObjectFromShape(ctx, sh, class_id); +} + +static int JS_SetObjectData(JSContext *ctx, JSValueConst obj, JSValue val) +{ + JSObject *p; + + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + p = JS_VALUE_GET_OBJ(obj); + switch(p->class_id) { + case JS_CLASS_NUMBER: + case JS_CLASS_STRING: + case JS_CLASS_BOOLEAN: + case JS_CLASS_SYMBOL: + case JS_CLASS_DATE: + case JS_CLASS_BIG_INT: + JS_FreeValue(ctx, p->u.object_data); + p->u.object_data = val; + return 0; + } + } + JS_FreeValue(ctx, val); + if (!JS_IsException(obj)) + JS_ThrowTypeError(ctx, "invalid object type"); + return -1; +} + +JSValue JS_NewObjectClass(JSContext *ctx, JSClassID class_id) +{ + return JS_NewObjectProtoClass(ctx, ctx->class_proto[class_id], class_id); +} + +JSValue JS_NewObjectProto(JSContext *ctx, JSValueConst proto) +{ + return JS_NewObjectProtoClass(ctx, proto, JS_CLASS_OBJECT); +} + +JSValue JS_NewObjectFrom(JSContext *ctx, int count, const JSAtom *props, + const JSValue *values) +{ + JSShapeProperty *pr; + uint32_t *hash; + JSRuntime *rt; + JSObject *p; + JSShape *sh; + JSValue obj; + JSAtom atom; + intptr_t h; + int i; + + rt = ctx->rt; + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) + return JS_EXCEPTION; + if (count > 0) { + p = JS_VALUE_GET_OBJ(obj); + sh = p->shape; + assert(sh->is_hashed); + assert(sh->header.ref_count == 1); + js_shape_hash_unlink(rt, sh); + if (resize_properties(ctx, &sh, p, count)) { + js_shape_hash_link(rt, sh); + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + p->shape = sh; + for (i = 0; i < count; i++) { + atom = props[i]; + pr = &sh->prop[i]; + sh->hash = shape_hash(shape_hash(sh->hash, atom), JS_PROP_C_W_E); + sh->has_small_array_index |= __JS_AtomIsTaggedInt(atom); + h = atom & sh->prop_hash_mask; + hash = &prop_hash_end(sh)[-h - 1]; + pr->hash_next = *hash; + *hash = i + 1; + pr->atom = JS_DupAtom(ctx, atom); + pr->flags = JS_PROP_C_W_E; + p->prop[i].u.value = values[i]; + } + js_shape_hash_link(rt, sh); + sh->prop_count = count; + } + return obj; +} + +JSValue JS_NewObjectFromStr(JSContext *ctx, int count, const char **props, + const JSValue *values) +{ + JSAtom atoms_s[16], *atoms = atoms_s; + JSValue ret; + int i; + + i = 0; + ret = JS_EXCEPTION; + if (count < 1) + goto out; + if (count > (int)countof(atoms_s)) { + atoms = js_malloc(ctx, count * sizeof(*atoms)); + if (!atoms) + return JS_EXCEPTION; + } + for (i = 0; i < count; i++) { + atoms[i] = JS_NewAtom(ctx, props[i]); + if (atoms[i] == JS_ATOM_NULL) + goto out; + } + ret = JS_NewObjectFrom(ctx, count, atoms, values); +out: + while (i-- > 0) + JS_FreeAtom(ctx, atoms[i]); + if (atoms != atoms_s) + js_free(ctx, atoms); + return ret; +} + +JSValue JS_NewArray(JSContext *ctx) +{ + return JS_NewObjectFromShape(ctx, js_dup_shape(ctx->array_shape), + JS_CLASS_ARRAY); +} + +// note: takes ownership of |values|, unlike js_create_array +JSValue JS_NewArrayFrom(JSContext *ctx, int count, const JSValue *values) +{ + JSObject *p; + JSValue obj; + int i; + + obj = JS_NewArray(ctx); + if (JS_IsException(obj)) + goto exception; + if (count > 0) { + p = JS_VALUE_GET_OBJ(obj); + if (expand_fast_array(ctx, p, count)) { + JS_FreeValue(ctx, obj); + goto exception; + } + p->u.array.count = count; + p->prop[0].u.value = js_int32(count); + memcpy(p->u.array.u.values, values, count * sizeof(*values)); + } + return obj; +exception: + for (i = 0; i < count; i++) + JS_FreeValue(ctx, values[i]); + return JS_EXCEPTION; +} + +JSValue JS_NewObject(JSContext *ctx) +{ + /* inline JS_NewObjectClass(ctx, JS_CLASS_OBJECT); */ + return JS_NewObjectProtoClass(ctx, ctx->class_proto[JS_CLASS_OBJECT], JS_CLASS_OBJECT); +} + +static void js_function_set_properties(JSContext *ctx, JSValue func_obj, + JSAtom name, int len) +{ + /* ES6 feature non compatible with ES5.1: length is configurable */ + JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_length, js_int32(len), + JS_PROP_CONFIGURABLE); + JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, + JS_AtomToString(ctx, name), JS_PROP_CONFIGURABLE); +} + +static bool js_class_has_bytecode(JSClassID class_id) +{ + return (class_id == JS_CLASS_BYTECODE_FUNCTION || + class_id == JS_CLASS_GENERATOR_FUNCTION || + class_id == JS_CLASS_ASYNC_FUNCTION || + class_id == JS_CLASS_ASYNC_GENERATOR_FUNCTION); +} + +/* return NULL without exception if not a function or no bytecode */ +static JSFunctionBytecode *JS_GetFunctionBytecode(JSValueConst val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return NULL; + p = JS_VALUE_GET_OBJ(val); + if (!js_class_has_bytecode(p->class_id)) + return NULL; + return p->u.func.function_bytecode; +} + +static void js_method_set_home_object(JSContext *ctx, JSValue func_obj, + JSValue home_obj) +{ + JSObject *p, *p1; + JSFunctionBytecode *b; + + if (JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT) + return; + p = JS_VALUE_GET_OBJ(func_obj); + if (!js_class_has_bytecode(p->class_id)) + return; + b = p->u.func.function_bytecode; + if (b->need_home_object) { + p1 = p->u.func.home_object; + if (p1) { + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, p1)); + } + if (JS_VALUE_GET_TAG(home_obj) == JS_TAG_OBJECT) + p1 = JS_VALUE_GET_OBJ(js_dup(home_obj)); + else + p1 = NULL; + p->u.func.home_object = p1; + } +} + +static JSValue js_get_function_name(JSContext *ctx, JSAtom name) +{ + JSValue name_str; + + name_str = JS_AtomToString(ctx, name); + if (JS_AtomSymbolHasDescription(ctx, name)) { + name_str = JS_ConcatString3(ctx, "[", name_str, "]"); + } + return name_str; +} + +/* Modify the name of a method according to the atom and + 'flags'. 'flags' is a bitmask of JS_PROP_HAS_GET and + JS_PROP_HAS_SET. Also set the home object of the method. + Return < 0 if exception. */ +static int js_method_set_properties(JSContext *ctx, JSValue func_obj, + JSAtom name, int flags, JSValue home_obj) +{ + JSValue name_str; + + name_str = js_get_function_name(ctx, name); + if (flags & JS_PROP_HAS_GET) { + name_str = JS_ConcatString3(ctx, "get ", name_str, ""); + } else if (flags & JS_PROP_HAS_SET) { + name_str = JS_ConcatString3(ctx, "set ", name_str, ""); + } + if (JS_IsException(name_str)) + return -1; + if (JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, name_str, + JS_PROP_CONFIGURABLE) < 0) + return -1; + js_method_set_home_object(ctx, func_obj, home_obj); + return 0; +} + +/* Note: at least 'length' arguments will be readable in 'argv' */ +/* `name` may be NULL, pure ASCII or UTF-8 encoded */ +JSValue JS_NewCFunction3(JSContext *ctx, JSCFunction *func, + const char *name, + int length, JSCFunctionEnum cproto, int magic, + JSValueConst proto_val) +{ + JSValue func_obj; + JSObject *p; + JSAtom name_atom; + + func_obj = JS_NewObjectProtoClass(ctx, proto_val, JS_CLASS_C_FUNCTION); + if (JS_IsException(func_obj)) + return func_obj; + p = JS_VALUE_GET_OBJ(func_obj); + p->u.cfunc.realm = JS_DupContext(ctx); + p->u.cfunc.c_function.generic = func; + p->u.cfunc.length = length; + p->u.cfunc.cproto = cproto; + p->u.cfunc.magic = magic; + p->is_constructor = (cproto == JS_CFUNC_constructor || + cproto == JS_CFUNC_constructor_magic || + cproto == JS_CFUNC_constructor_or_func || + cproto == JS_CFUNC_constructor_or_func_magic); + name_atom = JS_ATOM_empty_string; + if (name && *name) { + name_atom = JS_NewAtom(ctx, name); + if (name_atom == JS_ATOM_NULL) { + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; + } + } + js_function_set_properties(ctx, func_obj, name_atom, length); + JS_FreeAtom(ctx, name_atom); + return func_obj; +} + +/* Note: at least 'length' arguments will be readable in 'argv' */ +JSValue JS_NewCFunction2(JSContext *ctx, JSCFunction *func, + const char *name, + int length, JSCFunctionEnum cproto, int magic) +{ + return JS_NewCFunction3(ctx, func, name, length, cproto, magic, + ctx->function_proto); +} + +typedef struct JSCFunctionDataRecord { + JSCFunctionData *func; + uint8_t length; + uint8_t data_len; + uint16_t magic; + JSValue data[]; +} JSCFunctionDataRecord; + +static void js_c_function_data_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSCFunctionDataRecord *s = JS_GetOpaque(val, JS_CLASS_C_FUNCTION_DATA); + int i; + + if (s) { + for(i = 0; i < s->data_len; i++) { + JS_FreeValueRT(rt, s->data[i]); + } + js_free_rt(rt, s); + } +} + +static void js_c_function_data_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSCFunctionDataRecord *s = JS_GetOpaque(val, JS_CLASS_C_FUNCTION_DATA); + int i; + + if (s) { + for(i = 0; i < s->data_len; i++) { + JS_MarkValue(rt, s->data[i], mark_func); + } + } +} + +static JSValue js_call_c_function_data(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_val, + int argc, JSValueConst *argv, int flags) +{ + JSRuntime *rt = ctx->rt; + JSStackFrame sf_s, *sf = &sf_s, *prev_sf; + JSCFunctionDataRecord *s; + JSValueConst *arg_buf; + JSValue ret; + size_t stack_size; + int arg_count; + int i; + + s = JS_GetOpaque(func_obj, JS_CLASS_C_FUNCTION_DATA); + if (!s) + return JS_EXCEPTION; // can't really happen + arg_buf = argv; + arg_count = s->length; + if (unlikely(argc < arg_count)) { + stack_size = arg_count * sizeof(arg_buf[0]); + if (js_check_stack_overflow(rt, stack_size)) + return JS_ThrowStackOverflow(ctx); + arg_buf = alloca(stack_size); + for(i = 0; i < argc; i++) + arg_buf[i] = argv[i]; + for(i = argc; i < arg_count; i++) + arg_buf[i] = JS_UNDEFINED; + } + prev_sf = rt->current_stack_frame; + sf->prev_frame = prev_sf; + rt->current_stack_frame = sf; + // TODO(bnoordhuis) switch realms like js_call_c_function does + sf->is_strict_mode = false; + sf->cur_func = unsafe_unconst(func_obj); + sf->arg_count = argc; + ret = s->func(ctx, this_val, argc, arg_buf, s->magic, vc(s->data)); + rt->current_stack_frame = sf->prev_frame; + return ret; +} + +JSValue JS_NewCFunctionData2(JSContext *ctx, JSCFunctionData *func, + const char *name, + int length, int magic, int data_len, + JSValueConst *data) +{ + JSCFunctionDataRecord *s; + JSAtom name_atom; + JSValue func_obj; + int i; + + func_obj = JS_NewObjectProtoClass(ctx, ctx->function_proto, + JS_CLASS_C_FUNCTION_DATA); + if (JS_IsException(func_obj)) + return func_obj; + s = js_malloc(ctx, sizeof(*s) + data_len * sizeof(JSValue)); + if (!s) { + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; + } + s->func = func; + s->length = length; + s->data_len = data_len; + s->magic = magic; + for(i = 0; i < data_len; i++) + s->data[i] = js_dup(data[i]); + JS_SetOpaqueInternal(func_obj, s); + name_atom = JS_ATOM_empty_string; + if (name && *name) { + name_atom = JS_NewAtom(ctx, name); + if (name_atom == JS_ATOM_NULL) { + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; + } + } + js_function_set_properties(ctx, func_obj, name_atom, length); + JS_FreeAtom(ctx, name_atom); + return func_obj; +} + +JSValue JS_NewCFunctionData(JSContext *ctx, JSCFunctionData *func, + int length, int magic, int data_len, + JSValueConst *data) +{ + return JS_NewCFunctionData2(ctx, func, NULL, length, magic, data_len, data); +} + +static JSContext *js_autoinit_get_realm(JSProperty *pr) +{ + return (JSContext *)(pr->u.init.realm_and_id & ~3); +} + +static JSAutoInitIDEnum js_autoinit_get_id(JSProperty *pr) +{ + return pr->u.init.realm_and_id & 3; +} + +static void js_autoinit_free(JSRuntime *rt, JSProperty *pr) +{ + JS_FreeContext(js_autoinit_get_realm(pr)); +} + +static void js_autoinit_mark(JSRuntime *rt, JSProperty *pr, + JS_MarkFunc *mark_func) +{ + mark_func(rt, &js_autoinit_get_realm(pr)->header); +} + +typedef struct JSCClosureRecord { + JSCClosure *func; + uint16_t length; + uint16_t magic; + void *opaque; + void (*opaque_finalize)(void *opaque); +} JSCClosureRecord; + +static void js_c_closure_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSCClosureRecord *s = JS_GetOpaque(val, JS_CLASS_C_CLOSURE); + + if (s) { + if (s->opaque_finalize) + s->opaque_finalize(s->opaque); + + js_free_rt(rt, s); + } +} + +static JSValue js_call_c_closure(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_val, + int argc, JSValueConst *argv, int flags) +{ + JSRuntime *rt = ctx->rt; + JSStackFrame sf_s, *sf = &sf_s, *prev_sf; + JSCClosureRecord *s = JS_GetOpaque(func_obj, JS_CLASS_C_CLOSURE); + JSValueConst *arg_buf; + JSValue ret; + int arg_count; + int i; + size_t stack_size; + + arg_buf = argv; + arg_count = s->length; + if (unlikely(argc < arg_count)) { + stack_size = arg_count * sizeof(arg_buf[0]); + if (js_check_stack_overflow(rt, stack_size)) + return JS_ThrowStackOverflow(ctx); + arg_buf = alloca(stack_size); + for (i = 0; i < argc; i++) + arg_buf[i] = argv[i]; + for (i = argc; i < arg_count; i++) + arg_buf[i] = JS_UNDEFINED; + } + + prev_sf = rt->current_stack_frame; + sf->prev_frame = prev_sf; + rt->current_stack_frame = sf; + // TODO(bnoordhuis) switch realms like js_call_c_function does + sf->is_strict_mode = false; + sf->cur_func = unsafe_unconst(func_obj); + sf->arg_count = argc; + ret = s->func(ctx, this_val, argc, arg_buf, s->magic, s->opaque); + rt->current_stack_frame = sf->prev_frame; + + return ret; +} + +JSValue JS_NewCClosure(JSContext *ctx, JSCClosure *func, const char *name, + JSCClosureFinalizerFunc *opaque_finalize, + int length, int magic, void *opaque) +{ + JSCClosureRecord *s; + JSAtom name_atom; + JSValue func_obj; + + func_obj = JS_NewObjectProtoClass(ctx, ctx->function_proto, + JS_CLASS_C_CLOSURE); + if (JS_IsException(func_obj)) + return func_obj; + s = js_malloc(ctx, sizeof(*s)); + if (!s) { + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; + } + s->func = func; + s->length = length; + s->magic = magic; + s->opaque = opaque; + s->opaque_finalize = opaque_finalize; + JS_SetOpaqueInternal(func_obj, s); + name_atom = JS_ATOM_empty_string; + if (name && *name) { + name_atom = JS_NewAtom(ctx, name); + if (name_atom == JS_ATOM_NULL) { + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; + } + } + js_function_set_properties(ctx, func_obj, name_atom, length); + JS_FreeAtom(ctx, name_atom); + return func_obj; +} + +static void free_property(JSRuntime *rt, JSProperty *pr, int prop_flags) +{ + if (unlikely(prop_flags & JS_PROP_TMASK)) { + if ((prop_flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + if (pr->u.getset.getter) + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.getter)); + if (pr->u.getset.setter) + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.setter)); + } else if ((prop_flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + free_var_ref(rt, pr->u.var_ref); + } else if ((prop_flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + js_autoinit_free(rt, pr); + } + } else { + JS_FreeValueRT(rt, pr->u.value); + } +} + +static force_inline JSShapeProperty *find_own_property1(JSObject *p, + JSAtom atom) +{ + JSShape *sh; + JSShapeProperty *pr, *prop; + intptr_t h; + sh = p->shape; + h = (uintptr_t)atom & sh->prop_hash_mask; + h = prop_hash_end(sh)[-h - 1]; + prop = get_shape_prop(sh); + while (h) { + pr = &prop[h - 1]; + if (likely(pr->atom == atom)) { + return pr; + } + h = pr->hash_next; + } + return NULL; +} + +static force_inline JSShapeProperty *find_own_property(JSProperty **ppr, + JSObject *p, + JSAtom atom) +{ + JSShape *sh; + JSShapeProperty *pr, *prop; + intptr_t h; + sh = p->shape; + h = (uintptr_t)atom & sh->prop_hash_mask; + h = prop_hash_end(sh)[-h - 1]; + prop = get_shape_prop(sh); + while (h) { + pr = &prop[h - 1]; + if (likely(pr->atom == atom)) { + *ppr = &p->prop[h - 1]; + /* the compiler should be able to assume that pr != NULL here */ + return pr; + } + h = pr->hash_next; + } + *ppr = NULL; + return NULL; +} + +static void free_var_ref(JSRuntime *rt, JSVarRef *var_ref) +{ + if (var_ref) { + assert(var_ref->header.ref_count > 0); + if (--var_ref->header.ref_count == 0) { + if (var_ref->is_detached) { + JS_FreeValueRT(rt, var_ref->value); + remove_gc_object(&var_ref->header); + } else { + JSStackFrame *sf = var_ref->stack_frame; + assert(sf->var_refs[var_ref->var_ref_idx] == var_ref); + sf->var_refs[var_ref->var_ref_idx] = NULL; + } + js_free_rt(rt, var_ref); + } + } +} + +static void js_array_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + int i; + + for(i = 0; i < p->u.array.count; i++) { + JS_FreeValueRT(rt, p->u.array.u.values[i]); + } + js_free_rt(rt, p->u.array.u.values); +} + +static void js_array_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + int i; + + for(i = 0; i < p->u.array.count; i++) { + JS_MarkValue(rt, p->u.array.u.values[i], mark_func); + } +} + +static void js_object_data_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JS_FreeValueRT(rt, p->u.object_data); + p->u.object_data = JS_UNDEFINED; +} + +static void js_object_data_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JS_MarkValue(rt, p->u.object_data, mark_func); +} + +static void js_c_function_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + + if (p->u.cfunc.realm) + JS_FreeContext(p->u.cfunc.realm); +} + +static void js_c_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + + if (p->u.cfunc.realm) + mark_func(rt, &p->u.cfunc.realm->header); +} + +static void js_bytecode_function_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p1, *p = JS_VALUE_GET_OBJ(val); + JSFunctionBytecode *b; + JSVarRef **var_refs; + int i; + + p1 = p->u.func.home_object; + if (p1) { + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_OBJECT, p1)); + } + b = p->u.func.function_bytecode; + if (b) { + var_refs = p->u.func.var_refs; + if (var_refs) { + for(i = 0; i < b->closure_var_count; i++) + free_var_ref(rt, var_refs[i]); + js_free_rt(rt, var_refs); + } + JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_FUNCTION_BYTECODE, b)); + } +} + +static void js_bytecode_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSVarRef **var_refs = p->u.func.var_refs; + JSFunctionBytecode *b = p->u.func.function_bytecode; + int i; + + if (p->u.func.home_object) { + JS_MarkValue(rt, JS_MKPTR(JS_TAG_OBJECT, p->u.func.home_object), + mark_func); + } + if (b) { + if (var_refs) { + for(i = 0; i < b->closure_var_count; i++) { + JSVarRef *var_ref = var_refs[i]; + if (var_ref && var_ref->is_detached) { + mark_func(rt, &var_ref->header); + } + } + } + /* must mark the function bytecode because template objects may be + part of a cycle */ + JS_MarkValue(rt, JS_MKPTR(JS_TAG_FUNCTION_BYTECODE, b), mark_func); + } +} + +static void js_bound_function_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSBoundFunction *bf = p->u.bound_function; + int i; + + JS_FreeValueRT(rt, bf->func_obj); + JS_FreeValueRT(rt, bf->this_val); + for(i = 0; i < bf->argc; i++) { + JS_FreeValueRT(rt, bf->argv[i]); + } + js_free_rt(rt, bf); +} + +static void js_bound_function_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSBoundFunction *bf = p->u.bound_function; + int i; + + JS_MarkValue(rt, bf->func_obj, mark_func); + JS_MarkValue(rt, bf->this_val, mark_func); + for(i = 0; i < bf->argc; i++) + JS_MarkValue(rt, bf->argv[i], mark_func); +} + +static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSForInIterator *it = p->u.for_in_iterator; + JS_FreeValueRT(rt, it->obj); + js_free_rt(rt, it); +} + +static void js_for_in_iterator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSForInIterator *it = p->u.for_in_iterator; + JS_MarkValue(rt, it->obj, mark_func); +} + +static void free_object(JSRuntime *rt, JSObject *p) +{ + int i; + JSClassFinalizer *finalizer; + JSShape *sh; + JSShapeProperty *pr; + + p->free_mark = 1; /* used to tell the object is invalid when + freeing cycles */ + /* free all the fields */ + sh = p->shape; + pr = get_shape_prop(sh); + for(i = 0; i < sh->prop_count; i++) { + free_property(rt, &p->prop[i], pr->flags); + pr++; + } + js_free_rt(rt, p->prop); + /* as an optimization we destroy the shape immediately without + putting it in gc_zero_ref_count_list */ + js_free_shape(rt, sh); + + /* fail safe */ + p->shape = NULL; + p->prop = NULL; + + if (unlikely(p->first_weak_ref)) { + reset_weak_ref(rt, &p->first_weak_ref); + } + + finalizer = rt->class_array[p->class_id].finalizer; + if (finalizer) + (*finalizer)(rt, JS_MKPTR(JS_TAG_OBJECT, p)); + + /* fail safe */ + p->class_id = 0; + p->u.opaque = NULL; + p->u.func.var_refs = NULL; + p->u.func.home_object = NULL; + + remove_gc_object(&p->header); + if (rt->gc_phase == JS_GC_PHASE_REMOVE_CYCLES && p->header.ref_count != 0) { + list_add_tail(&p->header.link, &rt->gc_zero_ref_count_list); + } else { + js_free_rt(rt, p); + } +} + +static void free_gc_object(JSRuntime *rt, JSGCObjectHeader *gp) +{ + switch(gp->gc_obj_type) { + case JS_GC_OBJ_TYPE_JS_OBJECT: + free_object(rt, (JSObject *)gp); + break; + case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE: + free_function_bytecode(rt, (JSFunctionBytecode *)gp); + break; + default: + abort(); + } +} + +static void free_zero_refcount(JSRuntime *rt) +{ + struct list_head *el; + JSGCObjectHeader *p; + + rt->gc_phase = JS_GC_PHASE_DECREF; + for(;;) { + el = rt->gc_zero_ref_count_list.next; + if (el == &rt->gc_zero_ref_count_list) + break; + p = list_entry(el, JSGCObjectHeader, link); + assert(p->ref_count == 0); + free_gc_object(rt, p); + } + rt->gc_phase = JS_GC_PHASE_NONE; +} + +/* called with the ref_count of 'v' reaches zero. */ +static void js_free_value_rt(JSRuntime *rt, JSValue v) +{ + uint32_t tag = JS_VALUE_GET_TAG(v); + +#ifdef ENABLE_DUMPS // JS_DUMP_FREE + if (check_dump_flag(rt, JS_DUMP_FREE)) { + /* Prevent invalid object access during GC */ + if ((rt->gc_phase != JS_GC_PHASE_REMOVE_CYCLES) + || (tag != JS_TAG_OBJECT && tag != JS_TAG_FUNCTION_BYTECODE)) { + printf("Freeing "); + if (tag == JS_TAG_OBJECT) { + JS_DumpObject(rt, JS_VALUE_GET_OBJ(v)); + } else { + JS_DumpValue(rt, v); + printf("\n"); + } + } + } +#endif + + switch(tag) { + case JS_TAG_STRING: + js_free_string0(rt, JS_VALUE_GET_STRING(v)); + break; + case JS_TAG_OBJECT: + case JS_TAG_FUNCTION_BYTECODE: + { + JSGCObjectHeader *p = JS_VALUE_GET_PTR(v); + if (rt->gc_phase != JS_GC_PHASE_REMOVE_CYCLES) { + list_del(&p->link); + list_add(&p->link, &rt->gc_zero_ref_count_list); + if (rt->gc_phase == JS_GC_PHASE_NONE) { + free_zero_refcount(rt); + } + } + } + break; + case JS_TAG_MODULE: + abort(); /* never freed here */ + break; + case JS_TAG_BIG_INT: + { + JSBigInt *p = JS_VALUE_GET_PTR(v); + js_free_rt(rt, p); + } + break; + case JS_TAG_SYMBOL: + { + JSAtomStruct *p = JS_VALUE_GET_PTR(v); + JS_FreeAtomStruct(rt, p); + } + break; + default: + printf("js_free_value_rt: unknown tag=%d\n", tag); + abort(); + } +} + +void JS_FreeValueRT(JSRuntime *rt, JSValue v) +{ + if (JS_VALUE_HAS_REF_COUNT(v)) { + JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); + if (--p->ref_count <= 0) { + js_free_value_rt(rt, v); + } + } +} + +void JS_FreeValue(JSContext *ctx, JSValue v) +{ + JS_FreeValueRT(ctx->rt, v); +} + +/* garbage collection */ + +static void add_gc_object(JSRuntime *rt, JSGCObjectHeader *h, + JSGCObjectTypeEnum type) +{ + h->mark = 0; + h->gc_obj_type = type; + list_add_tail(&h->link, &rt->gc_obj_list); +} + +static void remove_gc_object(JSGCObjectHeader *h) +{ + list_del(&h->link); +} + +void JS_MarkValue(JSRuntime *rt, JSValueConst val, JS_MarkFunc *mark_func) +{ + if (JS_VALUE_HAS_REF_COUNT(val)) { + switch(JS_VALUE_GET_TAG(val)) { + case JS_TAG_OBJECT: + case JS_TAG_FUNCTION_BYTECODE: + mark_func(rt, JS_VALUE_GET_PTR(val)); + break; + default: + break; + } + } +} + +static void mark_weak_map_value(JSRuntime *rt, JSWeakRefRecord *first_weak_ref, JS_MarkFunc *mark_func) { + JSWeakRefRecord *wr; + JSMapRecord *mr; + JSMapState *s; + + for (wr = first_weak_ref; wr != NULL; wr = wr->next_weak_ref) { + if (wr->kind == JS_WEAK_REF_KIND_MAP) { + mr = wr->u.map_record; + s = mr->map; + assert(s->is_weak); + assert(!mr->empty); /* no iterator on WeakMap/WeakSet */ + JS_MarkValue(rt, mr->value, mark_func); + } + } +} + +static void mark_children(JSRuntime *rt, JSGCObjectHeader *gp, + JS_MarkFunc *mark_func) +{ + switch(gp->gc_obj_type) { + case JS_GC_OBJ_TYPE_JS_OBJECT: + { + JSObject *p = (JSObject *)gp; + JSShapeProperty *prs; + JSShape *sh; + int i; + sh = p->shape; + mark_func(rt, &sh->header); + /* mark all the fields */ + prs = get_shape_prop(sh); + for(i = 0; i < sh->prop_count; i++) { + JSProperty *pr = &p->prop[i]; + if (prs->atom != JS_ATOM_NULL) { + if (prs->flags & JS_PROP_TMASK) { + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + if (pr->u.getset.getter) + mark_func(rt, &pr->u.getset.getter->header); + if (pr->u.getset.setter) + mark_func(rt, &pr->u.getset.setter->header); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + if (pr->u.var_ref->is_detached) { + /* Note: the tag does not matter + provided it is a GC object */ + mark_func(rt, &pr->u.var_ref->header); + } + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + js_autoinit_mark(rt, pr, mark_func); + } + } else { + JS_MarkValue(rt, pr->u.value, mark_func); + } + } + prs++; + } + + if (unlikely(p->first_weak_ref)) { + mark_weak_map_value(rt, p->first_weak_ref, mark_func); + } + + if (p->class_id != JS_CLASS_OBJECT) { + JSClassGCMark *gc_mark; + gc_mark = rt->class_array[p->class_id].gc_mark; + if (gc_mark) + gc_mark(rt, JS_MKPTR(JS_TAG_OBJECT, p), mark_func); + } + } + break; + case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE: + /* the template objects can be part of a cycle */ + { + JSFunctionBytecode *b = (JSFunctionBytecode *)gp; + int i; + for(i = 0; i < b->cpool_count; i++) { + JS_MarkValue(rt, b->cpool[i], mark_func); + } + if (b->realm) + mark_func(rt, &b->realm->header); + } + break; + case JS_GC_OBJ_TYPE_VAR_REF: + { + JSVarRef *var_ref = (JSVarRef *)gp; + /* only detached variable referenced are taken into account */ + assert(var_ref->is_detached); + JS_MarkValue(rt, *var_ref->pvalue, mark_func); + } + break; + case JS_GC_OBJ_TYPE_ASYNC_FUNCTION: + { + JSAsyncFunctionData *s = (JSAsyncFunctionData *)gp; + if (s->is_active) + async_func_mark(rt, &s->func_state, mark_func); + JS_MarkValue(rt, s->resolving_funcs[0], mark_func); + JS_MarkValue(rt, s->resolving_funcs[1], mark_func); + } + break; + case JS_GC_OBJ_TYPE_SHAPE: + { + JSShape *sh = (JSShape *)gp; + if (sh->proto != NULL) { + mark_func(rt, &sh->proto->header); + } + } + break; + case JS_GC_OBJ_TYPE_JS_CONTEXT: + { + JSContext *ctx = (JSContext *)gp; + JS_MarkContext(rt, ctx, mark_func); + } + break; + default: + abort(); + } +} + +static void gc_decref_child(JSRuntime *rt, JSGCObjectHeader *p) +{ + assert(p->ref_count > 0); + p->ref_count--; + if (p->ref_count == 0 && p->mark == 1) { + list_del(&p->link); + list_add_tail(&p->link, &rt->tmp_obj_list); + } +} + +static void gc_decref(JSRuntime *rt) +{ + struct list_head *el, *el1; + JSGCObjectHeader *p; + + init_list_head(&rt->tmp_obj_list); + + /* decrement the refcount of all the children of all the GC + objects and move the GC objects with zero refcount to + tmp_obj_list */ + list_for_each_safe(el, el1, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + assert(p->mark == 0); + mark_children(rt, p, gc_decref_child); + p->mark = 1; + if (p->ref_count == 0) { + list_del(&p->link); + list_add_tail(&p->link, &rt->tmp_obj_list); + } + } +} + +static void gc_scan_incref_child(JSRuntime *rt, JSGCObjectHeader *p) +{ + p->ref_count++; + if (p->ref_count == 1) { + /* ref_count was 0: remove from tmp_obj_list and add at the + end of gc_obj_list */ + list_del(&p->link); + list_add_tail(&p->link, &rt->gc_obj_list); + p->mark = 0; /* reset the mark for the next GC call */ + } +} + +static void gc_scan_incref_child2(JSRuntime *rt, JSGCObjectHeader *p) +{ + p->ref_count++; +} + +static void gc_scan(JSRuntime *rt) +{ + struct list_head *el; + JSGCObjectHeader *p; + + /* keep the objects with a refcount > 0 and their children. */ + list_for_each(el, &rt->gc_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + assert(p->ref_count > 0); + p->mark = 0; /* reset the mark for the next GC call */ + mark_children(rt, p, gc_scan_incref_child); + } + + /* restore the refcount of the objects to be deleted. */ + list_for_each(el, &rt->tmp_obj_list) { + p = list_entry(el, JSGCObjectHeader, link); + mark_children(rt, p, gc_scan_incref_child2); + } +} + +static void gc_free_cycles(JSRuntime *rt) +{ + struct list_head *el, *el1; + JSGCObjectHeader *p; +#ifdef ENABLE_DUMPS // JS_DUMP_GC_FREE + bool header_done = false; +#endif + + rt->gc_phase = JS_GC_PHASE_REMOVE_CYCLES; + + for(;;) { + el = rt->tmp_obj_list.next; + if (el == &rt->tmp_obj_list) + break; + p = list_entry(el, JSGCObjectHeader, link); + /* Only need to free the GC object associated with JS + values. The rest will be automatically removed because they + must be referenced by them. */ + switch(p->gc_obj_type) { + case JS_GC_OBJ_TYPE_JS_OBJECT: + case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE: +#ifdef ENABLE_DUMPS // JS_DUMP_GC_FREE + if (check_dump_flag(rt, JS_DUMP_GC_FREE)) { + if (!header_done) { + printf("Freeing cycles:\n"); + JS_DumpObjectHeader(rt); + header_done = true; + } + JS_DumpGCObject(rt, p); + } +#endif + free_gc_object(rt, p); + break; + default: + list_del(&p->link); + list_add_tail(&p->link, &rt->gc_zero_ref_count_list); + break; + } + } + rt->gc_phase = JS_GC_PHASE_NONE; + + list_for_each_safe(el, el1, &rt->gc_zero_ref_count_list) { + p = list_entry(el, JSGCObjectHeader, link); + assert(p->gc_obj_type == JS_GC_OBJ_TYPE_JS_OBJECT || + p->gc_obj_type == JS_GC_OBJ_TYPE_FUNCTION_BYTECODE); + js_free_rt(rt, p); + } + + init_list_head(&rt->gc_zero_ref_count_list); +} + +void JS_RunGC(JSRuntime *rt) +{ + /* decrement the reference of the children of each object. mark = + 1 after this pass. */ + gc_decref(rt); + + /* keep the GC objects with a non zero refcount and their childs */ + gc_scan(rt); + + /* free the GC objects in a cycle */ + gc_free_cycles(rt); +} + +/* Return false if not an object or if the object has already been + freed (zombie objects are visible in finalizers when freeing + cycles). */ +bool JS_IsLiveObject(JSRuntime *rt, JSValueConst obj) +{ + JSObject *p; + if (!JS_IsObject(obj)) + return false; + p = JS_VALUE_GET_OBJ(obj); + return !p->free_mark; +} + +/* Compute memory used by various object types */ +/* XXX: poor man's approach to handling multiply referenced objects */ +typedef struct JSMemoryUsage_helper { + double memory_used_count; + double str_count; + double str_size; + int64_t js_func_count; + double js_func_size; + int64_t js_func_code_size; + int64_t js_func_pc2line_count; + int64_t js_func_pc2line_size; +} JSMemoryUsage_helper; + +static void compute_value_size(JSValue val, JSMemoryUsage_helper *hp); + +static void compute_jsstring_size(JSString *str, JSMemoryUsage_helper *hp) +{ + if (!str->atom_type) { /* atoms are handled separately */ + double s_ref_count = str->header.ref_count; + hp->str_count += 1 / s_ref_count; + hp->str_size += ((sizeof(*str) + (str->len << str->is_wide_char) + + 1 - str->is_wide_char) / s_ref_count); + } +} + +static void compute_bytecode_size(JSFunctionBytecode *b, JSMemoryUsage_helper *hp) +{ + int memory_used_count, js_func_size, i; + + memory_used_count = 0; + js_func_size = sizeof(*b); + if (b->vardefs) { + js_func_size += (b->arg_count + b->var_count) * sizeof(*b->vardefs); + } + if (b->cpool) { + js_func_size += b->cpool_count * sizeof(*b->cpool); + for (i = 0; i < b->cpool_count; i++) { + JSValue val = b->cpool[i]; + compute_value_size(val, hp); + } + } + if (b->closure_var) { + js_func_size += b->closure_var_count * sizeof(*b->closure_var); + } + if (b->byte_code_buf) { + hp->js_func_code_size += b->byte_code_len; + } + memory_used_count++; + js_func_size += b->source_len + 1; + if (b->pc2line_len) { + memory_used_count++; + hp->js_func_pc2line_count += 1; + hp->js_func_pc2line_size += b->pc2line_len; + } + hp->js_func_size += js_func_size; + hp->js_func_count += 1; + hp->memory_used_count += memory_used_count; +} + +static void compute_value_size(JSValue val, JSMemoryUsage_helper *hp) +{ + switch(JS_VALUE_GET_TAG(val)) { + case JS_TAG_STRING: + compute_jsstring_size(JS_VALUE_GET_STRING(val), hp); + break; + case JS_TAG_BIG_INT: + /* should track JSBigInt usage */ + break; + } +} + +void JS_ComputeMemoryUsage(JSRuntime *rt, JSMemoryUsage *s) +{ + struct list_head *el, *el1; + int i; + JSMemoryUsage_helper mem = { 0 }, *hp = &mem; + + memset(s, 0, sizeof(*s)); + s->malloc_count = rt->malloc_state.malloc_count; + s->malloc_size = rt->malloc_state.malloc_size; + s->malloc_limit = rt->malloc_state.malloc_limit; + + s->memory_used_count = 2; /* rt + rt->class_array */ + s->memory_used_size = sizeof(JSRuntime) + sizeof(JSClass) * rt->class_count; + + list_for_each(el, &rt->context_list) { + JSContext *ctx = list_entry(el, JSContext, link); + JSShape *sh = ctx->array_shape; + s->memory_used_count += 2; /* ctx + ctx->class_proto */ + s->memory_used_size += sizeof(JSContext) + + sizeof(JSValue) * rt->class_count; + s->binary_object_count += ctx->binary_object_count; + s->binary_object_size += ctx->binary_object_size; + + /* the hashed shapes are counted separately */ + if (sh && !sh->is_hashed) { + int hash_size = sh->prop_hash_mask + 1; + s->shape_count++; + s->shape_size += get_shape_size(hash_size, sh->prop_size); + } + list_for_each(el1, &ctx->loaded_modules) { + JSModuleDef *m = list_entry(el1, JSModuleDef, link); + s->memory_used_count += 1; + s->memory_used_size += sizeof(*m); + if (m->req_module_entries) { + s->memory_used_count += 1; + s->memory_used_size += m->req_module_entries_count * sizeof(*m->req_module_entries); + } + if (m->export_entries) { + s->memory_used_count += 1; + s->memory_used_size += m->export_entries_count * sizeof(*m->export_entries); + for (i = 0; i < m->export_entries_count; i++) { + JSExportEntry *me = &m->export_entries[i]; + if (me->export_type == JS_EXPORT_TYPE_LOCAL && me->u.local.var_ref) { + /* potential multiple count */ + s->memory_used_count += 1; + compute_value_size(me->u.local.var_ref->value, hp); + } + } + } + if (m->star_export_entries) { + s->memory_used_count += 1; + s->memory_used_size += m->star_export_entries_count * sizeof(*m->star_export_entries); + } + if (m->import_entries) { + s->memory_used_count += 1; + s->memory_used_size += m->import_entries_count * sizeof(*m->import_entries); + } + compute_value_size(m->module_ns, hp); + compute_value_size(m->func_obj, hp); + } + } + + list_for_each(el, &rt->gc_obj_list) { + JSGCObjectHeader *gp = list_entry(el, JSGCObjectHeader, link); + JSObject *p; + JSShape *sh; + JSShapeProperty *prs; + + /* XXX: could count the other GC object types too */ + if (gp->gc_obj_type == JS_GC_OBJ_TYPE_FUNCTION_BYTECODE) { + compute_bytecode_size((JSFunctionBytecode *)gp, hp); + continue; + } else if (gp->gc_obj_type != JS_GC_OBJ_TYPE_JS_OBJECT) { + continue; + } + p = (JSObject *)gp; + sh = p->shape; + s->obj_count++; + if (p->prop) { + s->memory_used_count++; + s->prop_size += sh->prop_size * sizeof(*p->prop); + s->prop_count += sh->prop_count; + prs = get_shape_prop(sh); + for(i = 0; i < sh->prop_count; i++) { + JSProperty *pr = &p->prop[i]; + if (prs->atom != JS_ATOM_NULL && !(prs->flags & JS_PROP_TMASK)) { + compute_value_size(pr->u.value, hp); + } + prs++; + } + } + /* the hashed shapes are counted separately */ + if (!sh->is_hashed) { + int hash_size = sh->prop_hash_mask + 1; + s->shape_count++; + s->shape_size += get_shape_size(hash_size, sh->prop_size); + } + + switch(p->class_id) { + case JS_CLASS_ARRAY: /* u.array | length */ + case JS_CLASS_ARGUMENTS: /* u.array | length */ + s->array_count++; + if (p->fast_array) { + s->fast_array_count++; + if (p->u.array.u.values) { + s->memory_used_count++; + s->memory_used_size += p->u.array.count * + sizeof(*p->u.array.u.values); + s->fast_array_elements += p->u.array.count; + for (i = 0; i < p->u.array.count; i++) { + compute_value_size(p->u.array.u.values[i], hp); + } + } + } + break; + case JS_CLASS_NUMBER: /* u.object_data */ + case JS_CLASS_STRING: /* u.object_data */ + case JS_CLASS_BOOLEAN: /* u.object_data */ + case JS_CLASS_SYMBOL: /* u.object_data */ + case JS_CLASS_DATE: /* u.object_data */ + case JS_CLASS_BIG_INT: /* u.object_data */ + compute_value_size(p->u.object_data, hp); + break; + case JS_CLASS_C_FUNCTION: /* u.cfunc */ + s->c_func_count++; + break; + case JS_CLASS_BYTECODE_FUNCTION: /* u.func */ + { + JSFunctionBytecode *b = p->u.func.function_bytecode; + JSVarRef **var_refs = p->u.func.var_refs; + /* home_object: object will be accounted for in list scan */ + if (var_refs) { + s->memory_used_count++; + s->js_func_size += b->closure_var_count * sizeof(*var_refs); + for (i = 0; i < b->closure_var_count; i++) { + if (var_refs[i]) { + double ref_count = var_refs[i]->header.ref_count; + s->memory_used_count += 1 / ref_count; + s->js_func_size += sizeof(*var_refs[i]) / ref_count; + /* handle non object closed values */ + if (var_refs[i]->pvalue == &var_refs[i]->value) { + /* potential multiple count */ + compute_value_size(var_refs[i]->value, hp); + } + } + } + } + } + break; + case JS_CLASS_BOUND_FUNCTION: /* u.bound_function */ + { + JSBoundFunction *bf = p->u.bound_function; + /* func_obj and this_val are objects */ + for (i = 0; i < bf->argc; i++) { + compute_value_size(bf->argv[i], hp); + } + s->memory_used_count += 1; + s->memory_used_size += sizeof(*bf) + bf->argc * sizeof(*bf->argv); + } + break; + case JS_CLASS_C_FUNCTION_DATA: /* u.c_function_data_record */ + { + JSCFunctionDataRecord *fd = p->u.c_function_data_record; + if (fd) { + for (i = 0; i < fd->data_len; i++) { + compute_value_size(fd->data[i], hp); + } + s->memory_used_count += 1; + s->memory_used_size += sizeof(*fd) + fd->data_len * sizeof(*fd->data); + } + } + break; + case JS_CLASS_C_CLOSURE: /* u.c_closure_record */ + { + JSCClosureRecord *c = p->u.c_closure_record; + if (c) { + s->memory_used_count += 1; + s->memory_used_size += sizeof(*c); + } + } + break; + case JS_CLASS_REGEXP: /* u.regexp */ + compute_jsstring_size(p->u.regexp.pattern, hp); + compute_jsstring_size(p->u.regexp.bytecode, hp); + break; + + case JS_CLASS_FOR_IN_ITERATOR: /* u.for_in_iterator */ + { + JSForInIterator *it = p->u.for_in_iterator; + if (it) { + compute_value_size(it->obj, hp); + s->memory_used_count += 1; + s->memory_used_size += sizeof(*it); + } + } + break; + case JS_CLASS_ARRAY_BUFFER: /* u.array_buffer */ + case JS_CLASS_SHARED_ARRAY_BUFFER: /* u.array_buffer */ + { + JSArrayBuffer *abuf = p->u.array_buffer; + if (abuf) { + s->memory_used_count += 1; + s->memory_used_size += sizeof(*abuf); + if (abuf->data) { + s->memory_used_count += 1; + s->memory_used_size += abuf->byte_length; + } + } + } + break; + case JS_CLASS_GENERATOR: /* u.generator_data */ + case JS_CLASS_UINT8C_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_INT8_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_UINT8_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_INT16_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_UINT16_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_INT32_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_UINT32_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_BIG_INT64_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_BIG_UINT64_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_FLOAT16_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_FLOAT32_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_FLOAT64_ARRAY: /* u.typed_array / u.array */ + case JS_CLASS_DATAVIEW: /* u.typed_array */ + case JS_CLASS_MAP: /* u.map_state */ + case JS_CLASS_SET: /* u.map_state */ + case JS_CLASS_WEAKMAP: /* u.map_state */ + case JS_CLASS_WEAKSET: /* u.map_state */ + case JS_CLASS_MAP_ITERATOR: /* u.map_iterator_data */ + case JS_CLASS_SET_ITERATOR: /* u.map_iterator_data */ + case JS_CLASS_ARRAY_ITERATOR: /* u.array_iterator_data */ + case JS_CLASS_STRING_ITERATOR: /* u.array_iterator_data */ + case JS_CLASS_PROXY: /* u.proxy_data */ + case JS_CLASS_PROMISE: /* u.promise_data */ + case JS_CLASS_PROMISE_RESOLVE_FUNCTION: /* u.promise_function_data */ + case JS_CLASS_PROMISE_REJECT_FUNCTION: /* u.promise_function_data */ + case JS_CLASS_ASYNC_FUNCTION_RESOLVE: /* u.async_function_data */ + case JS_CLASS_ASYNC_FUNCTION_REJECT: /* u.async_function_data */ + case JS_CLASS_ASYNC_FROM_SYNC_ITERATOR: /* u.async_from_sync_iterator_data */ + case JS_CLASS_ASYNC_GENERATOR: /* u.async_generator_data */ + /* TODO */ + default: + /* XXX: class definition should have an opaque block size */ + if (p->u.opaque) { + s->memory_used_count += 1; + } + break; + } + } + s->obj_size += s->obj_count * sizeof(JSObject); + + /* hashed shapes */ + s->memory_used_count++; /* rt->shape_hash */ + s->memory_used_size += sizeof(rt->shape_hash[0]) * rt->shape_hash_size; + for(i = 0; i < rt->shape_hash_size; i++) { + JSShape *sh; + for(sh = rt->shape_hash[i]; sh != NULL; sh = sh->shape_hash_next) { + int hash_size = sh->prop_hash_mask + 1; + s->shape_count++; + s->shape_size += get_shape_size(hash_size, sh->prop_size); + } + } + + /* atoms */ + s->memory_used_count += 2; /* rt->atom_array, rt->atom_hash */ + s->atom_count = rt->atom_count; + s->atom_size = sizeof(rt->atom_array[0]) * rt->atom_size + + sizeof(rt->atom_hash[0]) * rt->atom_hash_size; + for(i = 0; i < rt->atom_size; i++) { + JSAtomStruct *p = rt->atom_array[i]; + if (!atom_is_free(p)) { + s->atom_size += (sizeof(*p) + (p->len << p->is_wide_char) + + 1 - p->is_wide_char); + } + } + s->str_count = round(mem.str_count); + s->str_size = round(mem.str_size); + s->js_func_count = mem.js_func_count; + s->js_func_size = round(mem.js_func_size); + s->js_func_code_size = mem.js_func_code_size; + s->js_func_pc2line_count = mem.js_func_pc2line_count; + s->js_func_pc2line_size = mem.js_func_pc2line_size; + s->memory_used_count += round(mem.memory_used_count) + + s->atom_count + s->str_count + + s->obj_count + s->shape_count + + s->js_func_count + s->js_func_pc2line_count; + s->memory_used_size += s->atom_size + s->str_size + + s->obj_size + s->prop_size + s->shape_size + + s->js_func_size + s->js_func_code_size + s->js_func_pc2line_size; +} + +void JS_DumpMemoryUsage(FILE *fp, const JSMemoryUsage *s, JSRuntime *rt) +{ + fprintf(fp, "QuickJS-ng memory usage -- %s version, %d-bit, %s Endian, malloc limit: %"PRId64"\n\n", + JS_GetVersion(), (int)sizeof(void *) * 8, is_be() ? "Big" : "Little", s->malloc_limit); + if (rt) { + static const struct { + const char *name; + size_t size; + } object_types[] = { + { "JSRuntime", sizeof(JSRuntime) }, + { "JSContext", sizeof(JSContext) }, + { "JSObject", sizeof(JSObject) }, + { "JSString", sizeof(JSString) }, + { "JSFunctionBytecode", sizeof(JSFunctionBytecode) }, + }; + int i, usage_size_ok = 0; + for(i = 0; i < countof(object_types); i++) { + unsigned int size = object_types[i].size; + void *p = js_malloc_rt(rt, size); + if (p) { + unsigned int size1 = js_malloc_usable_size_rt(rt, p); + if (size1 >= size) { + usage_size_ok = 1; + fprintf(fp, " %3u + %-2u %s\n", + size, size1 - size, object_types[i].name); + } + js_free_rt(rt, p); + } + } + if (!usage_size_ok) { + fprintf(fp, " malloc_usable_size unavailable\n"); + } + { + int obj_classes[JS_CLASS_INIT_COUNT + 1] = { 0 }; + int class_id; + struct list_head *el; + list_for_each(el, &rt->gc_obj_list) { + JSGCObjectHeader *gp = list_entry(el, JSGCObjectHeader, link); + JSObject *p; + if (gp->gc_obj_type == JS_GC_OBJ_TYPE_JS_OBJECT) { + p = (JSObject *)gp; + obj_classes[min_uint32(p->class_id, JS_CLASS_INIT_COUNT)]++; + } + } + fprintf(fp, "\n" "JSObject classes\n"); + if (obj_classes[0]) + fprintf(fp, " %5d %2.0d %s\n", obj_classes[0], 0, "none"); + for (class_id = 1; class_id < JS_CLASS_INIT_COUNT; class_id++) { + if (obj_classes[class_id] && class_id < rt->class_count) { + char buf[ATOM_GET_STR_BUF_SIZE]; + fprintf(fp, " %5d %2.0d %s\n", obj_classes[class_id], class_id, + JS_AtomGetStrRT(rt, buf, sizeof(buf), rt->class_array[class_id].class_name)); + } + } + if (obj_classes[JS_CLASS_INIT_COUNT]) + fprintf(fp, " %5d %2.0d %s\n", obj_classes[JS_CLASS_INIT_COUNT], 0, "other"); + } + fprintf(fp, "\n"); + } + fprintf(fp, "%-20s %8s %8s\n", "NAME", "COUNT", "SIZE"); + + if (s->malloc_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per block)\n", + "memory allocated", s->malloc_count, s->malloc_size, + (double)s->malloc_size / s->malloc_count); + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%d overhead, %0.1f average slack)\n", + "memory used", s->memory_used_count, s->memory_used_size, + MALLOC_OVERHEAD, ((double)(s->malloc_size - s->memory_used_size) / + s->memory_used_count)); + } + if (s->atom_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per atom)\n", + "atoms", s->atom_count, s->atom_size, + (double)s->atom_size / s->atom_count); + } + if (s->str_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per string)\n", + "strings", s->str_count, s->str_size, + (double)s->str_size / s->str_count); + } + if (s->obj_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per object)\n", + "objects", s->obj_count, s->obj_size, + (double)s->obj_size / s->obj_count); + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per object)\n", + " properties", s->prop_count, s->prop_size, + (double)s->prop_count / s->obj_count); + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per shape)\n", + " shapes", s->shape_count, s->shape_size, + (double)s->shape_size / s->shape_count); + } + if (s->js_func_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64"\n", + "bytecode functions", s->js_func_count, s->js_func_size); + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per function)\n", + " bytecode", s->js_func_count, s->js_func_code_size, + (double)s->js_func_code_size / s->js_func_count); + if (s->js_func_pc2line_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per function)\n", + " pc2line", s->js_func_pc2line_count, + s->js_func_pc2line_size, + (double)s->js_func_pc2line_size / s->js_func_pc2line_count); + } + } + if (s->c_func_count) { + fprintf(fp, "%-20s %8"PRId64"\n", "C functions", s->c_func_count); + } + if (s->array_count) { + fprintf(fp, "%-20s %8"PRId64"\n", "arrays", s->array_count); + if (s->fast_array_count) { + fprintf(fp, "%-20s %8"PRId64"\n", " fast arrays", s->fast_array_count); + fprintf(fp, "%-20s %8"PRId64" %8"PRId64" (%0.1f per fast array)\n", + " elements", s->fast_array_elements, + s->fast_array_elements * (int)sizeof(JSValue), + (double)s->fast_array_elements / s->fast_array_count); + } + } + if (s->binary_object_count) { + fprintf(fp, "%-20s %8"PRId64" %8"PRId64"\n", + "binary objects", s->binary_object_count, s->binary_object_size); + } +} + +JSValue JS_GetGlobalObject(JSContext *ctx) +{ + return js_dup(ctx->global_obj); +} + +/* WARNING: obj is freed */ +JSValue JS_Throw(JSContext *ctx, JSValue obj) +{ + JSRuntime *rt = ctx->rt; + JS_FreeValue(ctx, rt->current_exception); + rt->current_exception = obj; + return JS_EXCEPTION; +} + +/* return the pending exception (cannot be called twice). */ +JSValue JS_GetException(JSContext *ctx) +{ + JSValue val; + JSRuntime *rt = ctx->rt; + val = rt->current_exception; + rt->current_exception = JS_UNINITIALIZED; + return val; +} + +bool JS_HasException(JSContext *ctx) +{ + return !JS_IsUninitialized(ctx->rt->current_exception); +} + +static void dbuf_put_leb128(DynBuf *s, uint32_t v) +{ + uint32_t a; + for(;;) { + a = v & 0x7f; + v >>= 7; + if (v != 0) { + dbuf_putc(s, a | 0x80); + } else { + dbuf_putc(s, a); + break; + } + } +} + +static void dbuf_put_sleb128(DynBuf *s, int32_t v1) +{ + uint32_t v = v1; + dbuf_put_leb128(s, (2 * v) ^ -(v >> 31)); +} + +static int get_leb128(uint32_t *pval, const uint8_t *buf, + const uint8_t *buf_end) +{ + const uint8_t *ptr = buf; + uint32_t v, a, i; + v = 0; + for(i = 0; i < 5; i++) { + if (unlikely(ptr >= buf_end)) + break; + a = *ptr++; + v |= (a & 0x7f) << (i * 7); + if (!(a & 0x80)) { + *pval = v; + return ptr - buf; + } + } + *pval = 0; + return -1; +} + +static int get_sleb128(int32_t *pval, const uint8_t *buf, + const uint8_t *buf_end) +{ + int ret; + uint32_t val; + ret = get_leb128(&val, buf, buf_end); + if (ret < 0) { + *pval = 0; + return -1; + } + *pval = (val >> 1) ^ -(val & 1); + return ret; +} + +static int find_line_num(JSContext *ctx, JSFunctionBytecode *b, + uint32_t pc_value, int *col) +{ + const uint8_t *p_end, *p; + int new_line_num, new_col_num, line_num, col_num, pc, v, ret; + unsigned int op; + + *col = 1; + p = b->pc2line_buf; + if (!p) + goto fail; + p_end = p + b->pc2line_len; + pc = 0; + line_num = b->line_num; + col_num = b->col_num; + while (p < p_end) { + op = *p++; + if (op == 0) { + uint32_t val; + ret = get_leb128(&val, p, p_end); + if (ret < 0) + goto fail; + pc += val; + p += ret; + ret = get_sleb128(&v, p, p_end); + if (ret < 0) + goto fail; + p += ret; + new_line_num = line_num + v; + } else { + op -= PC2LINE_OP_FIRST; + pc += (op / PC2LINE_RANGE); + new_line_num = line_num + (op % PC2LINE_RANGE) + PC2LINE_BASE; + } + ret = get_sleb128(&v, p, p_end); + if (ret < 0) + goto fail; + p += ret; + new_col_num = col_num + v; + if (pc_value < pc) + break; + line_num = new_line_num; + col_num = new_col_num; + } + *col = col_num; + return line_num; +fail: + /* should never happen */ + return b->line_num; +} + +/* in order to avoid executing arbitrary code during the stack trace + generation, we only look at simple 'name' properties containing a + string. */ +static const char *get_func_name(JSContext *ctx, JSValueConst func) +{ + JSProperty *pr; + JSShapeProperty *prs; + JSValue val; + + if (JS_VALUE_GET_TAG(func) != JS_TAG_OBJECT) + return NULL; + prs = find_own_property(&pr, JS_VALUE_GET_OBJ(func), JS_ATOM_name); + if (!prs) + return NULL; + if ((prs->flags & JS_PROP_TMASK) != JS_PROP_NORMAL) + return NULL; + val = pr->u.value; + if (JS_VALUE_GET_TAG(val) != JS_TAG_STRING) + return NULL; + return JS_ToCString(ctx, val); +} + +/* Note: it is important that no exception is returned by this function */ +static bool can_add_backtrace(JSValueConst obj) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(obj); + if (p->class_id != JS_CLASS_ERROR && p->class_id != JS_CLASS_DOM_EXCEPTION) + return false; + if (find_own_property1(p, JS_ATOM_stack)) + return false; + return true; +} + +#define JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL (1 << 0) +/* only taken into account if filename is provided */ +#define JS_BACKTRACE_FLAG_SINGLE_LEVEL (1 << 1) +#define JS_BACKTRACE_FLAG_FILTER_FUNC (1 << 2) + +/* if filename != NULL, an additional level is added with the filename + and line number information (used for parse error). */ +static void build_backtrace(JSContext *ctx, JSValueConst error_val, + JSValueConst filter_func, const char *filename, + int line_num, int col_num, int backtrace_flags) +{ + JSStackFrame *sf, *sf_start; + JSValue stack, prepare, saved_exception; + DynBuf dbuf; + const char *func_name_str; + const char *str1; + JSObject *p; + JSFunctionBytecode *b; + bool backtrace_barrier, has_prepare, has_filter_func; + JSRuntime *rt; + JSCallSiteData csd[64]; + uint32_t i; + double d; + int stack_trace_limit; + + rt = ctx->rt; + if (rt->in_build_stack_trace) + return; + rt->in_build_stack_trace = true; + + // Save exception because conversion to double may fail. + saved_exception = JS_GetException(ctx); + + // Extract stack trace limit. + // Ignore error since it sets d to NAN anyway. + // coverity[check_return] + JS_ToFloat64(ctx, &d, ctx->error_stack_trace_limit); + if (isnan(d) || d < 0.0) + stack_trace_limit = 0; + else if (d > INT32_MAX) + stack_trace_limit = INT32_MAX; + else + stack_trace_limit = fabs(d); + + // Restore current exception. + JS_Throw(ctx, saved_exception); + saved_exception = JS_UNINITIALIZED; + + stack_trace_limit = min_int(stack_trace_limit, countof(csd)); + stack_trace_limit = max_int(stack_trace_limit, 0); + has_prepare = false; + has_filter_func = backtrace_flags & JS_BACKTRACE_FLAG_FILTER_FUNC; + i = 0; + + if (!JS_IsNull(ctx->error_ctor)) { + prepare = js_dup(ctx->error_prepare_stack); + has_prepare = JS_IsFunction(ctx, prepare); + } + + if (has_prepare) { + saved_exception = JS_GetException(ctx); + if (stack_trace_limit == 0) + goto done; + if (filename) + js_new_callsite_data2(ctx, &csd[i++], filename, line_num, col_num); + } else { + js_dbuf_init(ctx, &dbuf); + if (stack_trace_limit == 0) + goto done; + if (filename) { + i++; + dbuf_printf(&dbuf, " at %s", filename); + if (line_num != -1) + dbuf_printf(&dbuf, ":%d:%d", line_num, col_num); + dbuf_putc(&dbuf, '\n'); + } + } + + if (filename && (backtrace_flags & JS_BACKTRACE_FLAG_SINGLE_LEVEL)) + goto done; + + sf_start = rt->current_stack_frame; + + /* Find the frame we want to start from. Note that when a filter is used the filter + function will be the first, but we also specify we want to skip the first one. */ + if (has_filter_func) { + for (sf = sf_start; sf != NULL && i < stack_trace_limit; sf = sf->prev_frame) { + if (js_same_value(ctx, sf->cur_func, filter_func)) { + sf_start = sf; + break; + } + } + } + + for (sf = sf_start; sf != NULL && i < stack_trace_limit; sf = sf->prev_frame) { + if (backtrace_flags & JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL) { + backtrace_flags &= ~JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL; + continue; + } + + p = JS_VALUE_GET_OBJ(sf->cur_func); + b = NULL; + backtrace_barrier = false; + + if (js_class_has_bytecode(p->class_id)) { + b = p->u.func.function_bytecode; + backtrace_barrier = b->backtrace_barrier; + } + + if (has_prepare) { + js_new_callsite_data(ctx, &csd[i], sf); + } else { + /* func_name_str is UTF-8 encoded if needed */ + func_name_str = get_func_name(ctx, sf->cur_func); + if (!func_name_str || func_name_str[0] == '\0') + str1 = ""; + else + str1 = func_name_str; + dbuf_printf(&dbuf, " at %s", str1); + JS_FreeCString(ctx, func_name_str); + + if (b && sf->cur_pc) { + const char *atom_str; + int line_num1, col_num1; + uint32_t pc; + + pc = sf->cur_pc - b->byte_code_buf - 1; + line_num1 = find_line_num(ctx, b, pc, &col_num1); + atom_str = b->filename ? JS_AtomToCString(ctx, b->filename) : NULL; + dbuf_printf(&dbuf, " (%s", atom_str ? atom_str : ""); + JS_FreeCString(ctx, atom_str); + if (line_num1 != -1) + dbuf_printf(&dbuf, ":%d:%d", line_num1, col_num1); + dbuf_putc(&dbuf, ')'); + } else if (b) { + // FIXME(bnoordhuis) Missing `sf->cur_pc = pc` in bytecode + // handler in JS_CallInternal. Almost never user observable + // except with intercepting JS proxies that throw exceptions. + dbuf_printf(&dbuf, " (missing)"); + } else { + dbuf_printf(&dbuf, " (native)"); + } + dbuf_putc(&dbuf, '\n'); + } + i++; + + /* stop backtrace if JS_EVAL_FLAG_BACKTRACE_BARRIER was used */ + if (backtrace_barrier) + break; + } + done: + if (has_prepare) { + int j = 0, k; + stack = JS_NewArray(ctx); + if (JS_IsException(stack)) { + stack = JS_NULL; + } else { + for (; j < i; j++) { + JSValue v = js_new_callsite(ctx, &csd[j]); + if (JS_IsException(v)) + break; + if (JS_DefinePropertyValueUint32(ctx, stack, j, v, JS_PROP_C_W_E) < 0) { + JS_FreeValue(ctx, v); + break; + } + } + } + // Clear the csd's we didn't use in case of error. + for (k = j; k < i; k++) { + JS_FreeValue(ctx, csd[k].filename); + JS_FreeValue(ctx, csd[k].func); + JS_FreeValue(ctx, csd[k].func_name); + } + JSValueConst args[] = { + error_val, + stack, + }; + JSValue stack2 = JS_Call(ctx, prepare, ctx->error_ctor, countof(args), args); + JS_FreeValue(ctx, stack); + if (JS_IsException(stack2)) + stack = JS_NULL; + else + stack = stack2; + JS_FreeValue(ctx, prepare); + JS_Throw(ctx, saved_exception); + } else { + if (dbuf_error(&dbuf)) + stack = JS_NULL; + else + stack = JS_NewStringLen(ctx, (char *)dbuf.buf, dbuf.size); + dbuf_free(&dbuf); + } + + if (JS_IsUndefined(ctx->error_back_trace)) + ctx->error_back_trace = js_dup(stack); + if (has_filter_func || can_add_backtrace(error_val)) { + JS_DefinePropertyValue(ctx, error_val, JS_ATOM_stack, stack, + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + } else { + JS_FreeValue(ctx, stack); + } + + rt->in_build_stack_trace = false; +} + +JSValue JS_NewError(JSContext *ctx) +{ + JSValue obj = JS_NewObjectClass(ctx, JS_CLASS_ERROR); + if (JS_IsException(obj)) + return JS_EXCEPTION; + build_backtrace(ctx, obj, JS_UNDEFINED, NULL, 0, 0, 0); + return obj; +} + +static JSValue JS_MakeError2(JSContext *ctx, JSErrorEnum error_num, + bool add_backtrace, const char *message) +{ + JSValue obj, msg; + + if (error_num == JS_PLAIN_ERROR) { + obj = JS_NewObjectClass(ctx, JS_CLASS_ERROR); + } else { + obj = JS_NewObjectProtoClass(ctx, ctx->native_error_proto[error_num], + JS_CLASS_ERROR); + } + if (JS_IsException(obj)) + return JS_EXCEPTION; + msg = JS_NewString(ctx, message); + if (JS_IsException(msg)) + msg = JS_NewString(ctx, "Invalid error message"); + if (!JS_IsException(msg)) { + JS_DefinePropertyValue(ctx, obj, JS_ATOM_message, msg, + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + } + if (add_backtrace) + build_backtrace(ctx, obj, JS_UNDEFINED, NULL, 0, 0, 0); + return obj; +} + +static JSValue JS_PRINTF_FORMAT_ATTR(4, 0) +JS_MakeError(JSContext *ctx, JSErrorEnum error_num, bool add_backtrace, + JS_PRINTF_FORMAT const char *fmt, va_list ap) +{ + char buf[256]; + + vsnprintf(buf, sizeof(buf), fmt, ap); + return JS_MakeError2(ctx, error_num, add_backtrace, buf); +} + +/* fmt and arguments may be pure ASCII or UTF-8 encoded contents */ +static JSValue JS_PRINTF_FORMAT_ATTR(4, 0) +JS_ThrowError2(JSContext *ctx, JSErrorEnum error_num, bool add_backtrace, + JS_PRINTF_FORMAT const char *fmt, va_list ap) +{ + JSValue obj; + + obj = JS_MakeError(ctx, error_num, add_backtrace, fmt, ap); + if (unlikely(JS_IsException(obj))) { + /* out of memory: throw JS_NULL to avoid recursing */ + obj = JS_NULL; + } + return JS_Throw(ctx, obj); +} + +static JSValue JS_PRINTF_FORMAT_ATTR(3, 0) +JS_ThrowError(JSContext *ctx, JSErrorEnum error_num, + JS_PRINTF_FORMAT const char *fmt, va_list ap) +{ + JSRuntime *rt = ctx->rt; + JSStackFrame *sf; + bool add_backtrace; + + /* the backtrace is added later if called from a bytecode function */ + sf = rt->current_stack_frame; + add_backtrace = !rt->in_out_of_memory && + (!sf || (JS_GetFunctionBytecode(sf->cur_func) == NULL)); + return JS_ThrowError2(ctx, error_num, add_backtrace, fmt, ap); +} + +#define JS_ERROR_MAP(X) \ + X(Internal, INTERNAL) \ + X(Plain, PLAIN) \ + X(Range, RANGE) \ + X(Reference, REFERENCE) \ + X(Syntax, SYNTAX) \ + X(Type, TYPE) \ + +#define X(lc, uc) \ + JSValue JS_PRINTF_FORMAT_ATTR(2, 3) \ + JS_New##lc##Error(JSContext *ctx, \ + JS_PRINTF_FORMAT const char *fmt, ...) \ + { \ + JSValue val; \ + va_list ap; \ + \ + va_start(ap, fmt); \ + val = JS_MakeError(ctx, JS_##uc##_ERROR, \ + /*add_backtrace*/true, fmt, ap); \ + va_end(ap); \ + return val; \ + } \ + JSValue JS_PRINTF_FORMAT_ATTR(2, 3) \ + JS_Throw##lc##Error(JSContext *ctx, \ + JS_PRINTF_FORMAT const char *fmt, ...) \ + { \ + JSValue val; \ + va_list ap; \ + \ + va_start(ap, fmt); \ + val = JS_ThrowError(ctx, JS_##uc##_ERROR, fmt, ap); \ + va_end(ap); \ + return val; \ + } \ + +JS_ERROR_MAP(X) + +#undef X +#undef JS_ERROR_MAP + +static int JS_PRINTF_FORMAT_ATTR(3, 4) JS_ThrowTypeErrorOrFalse(JSContext *ctx, int flags, JS_PRINTF_FORMAT const char *fmt, ...) +{ + va_list ap; + + if ((flags & JS_PROP_THROW) || + ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) { + va_start(ap, fmt); + JS_ThrowError(ctx, JS_TYPE_ERROR, fmt, ap); + va_end(ap); + return -1; + } else { + return false; + } +} + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif // __GNUC__ +static JSValue JS_ThrowTypeErrorAtom(JSContext *ctx, const char *fmt, JSAtom atom) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + JS_AtomGetStr(ctx, buf, sizeof(buf), atom); + return JS_ThrowTypeError(ctx, fmt, buf); +} + +static JSValue JS_ThrowSyntaxErrorAtom(JSContext *ctx, const char *fmt, JSAtom atom) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + JS_AtomGetStr(ctx, buf, sizeof(buf), atom); + return JS_ThrowSyntaxError(ctx, fmt, buf); +} +#ifdef __GNUC__ +#pragma GCC diagnostic pop // ignored "-Wformat-nonliteral" +#endif // __GNUC__ + +static int JS_ThrowTypeErrorReadOnly(JSContext *ctx, int flags, JSAtom atom) +{ + if ((flags & JS_PROP_THROW) || + ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) { + JS_ThrowTypeErrorAtom(ctx, "'%s' is read-only", atom); + return -1; + } else { + return false; + } +} + +JSValue JS_ThrowOutOfMemory(JSContext *ctx) +{ + JSRuntime *rt = ctx->rt; + if (!rt->in_out_of_memory) { + rt->in_out_of_memory = true; + JS_ThrowInternalError(ctx, "out of memory"); + rt->in_out_of_memory = false; + } + return JS_EXCEPTION; +} + +static JSValue JS_ThrowStackOverflow(JSContext *ctx) +{ + return JS_ThrowRangeError(ctx, "Maximum call stack size exceeded"); +} + +static JSValue JS_ThrowTypeErrorNotAConstructor(JSContext *ctx, + JSValueConst func_obj) +{ + JSObject *p; + JSAtom name; + + if (JS_TAG_OBJECT != JS_VALUE_GET_TAG(func_obj)) + goto fini; + p = JS_VALUE_GET_OBJ(func_obj); + if (!js_class_has_bytecode(p->class_id)) + goto fini; + name = p->u.func.function_bytecode->func_name; + if (name == JS_ATOM_NULL) + goto fini; + return JS_ThrowTypeErrorAtom(ctx, "%s is not a constructor", name); +fini: + return JS_ThrowTypeError(ctx, "not a constructor"); +} + +static JSValue JS_ThrowTypeErrorNotAFunction(JSContext *ctx) +{ + return JS_ThrowTypeError(ctx, "not a function"); +} + +static JSValue JS_ThrowTypeErrorNotAnObject(JSContext *ctx) +{ + return JS_ThrowTypeError(ctx, "not an object"); +} + +static JSValue JS_ThrowTypeErrorNotASymbol(JSContext *ctx) +{ + return JS_ThrowTypeError(ctx, "not a symbol"); +} + +static JSValue JS_ThrowReferenceErrorNotDefined(JSContext *ctx, JSAtom name) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + return JS_ThrowReferenceError(ctx, "%s is not defined", + JS_AtomGetStr(ctx, buf, sizeof(buf), name)); +} + +static JSValue JS_ThrowReferenceErrorUninitialized(JSContext *ctx, JSAtom name) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + return JS_ThrowReferenceError(ctx, "%s is not initialized", + name == JS_ATOM_NULL ? "lexical variable" : + JS_AtomGetStr(ctx, buf, sizeof(buf), name)); +} + +static JSValue JS_ThrowReferenceErrorUninitialized2(JSContext *ctx, + JSFunctionBytecode *b, + int idx, bool is_ref) +{ + JSAtom atom = JS_ATOM_NULL; + if (is_ref) { + atom = b->closure_var[idx].var_name; + } else { + /* not present if the function is stripped and contains no eval() */ + if (b->vardefs) + atom = b->vardefs[b->arg_count + idx].var_name; + } + return JS_ThrowReferenceErrorUninitialized(ctx, atom); +} + +static JSValue JS_ThrowTypeErrorInvalidClass(JSContext *ctx, int class_id) +{ + JSRuntime *rt = ctx->rt; + JSAtom name; + name = rt->class_array[class_id].class_name; + return JS_ThrowTypeErrorAtom(ctx, "%s object expected", name); +} + +static void JS_ThrowInterrupted(JSContext *ctx) +{ + JS_ThrowInternalError(ctx, "interrupted"); + JS_SetUncatchableError(ctx, ctx->rt->current_exception); +} + +static no_inline __exception int __js_poll_interrupts(JSContext *ctx) +{ + JSRuntime *rt = ctx->rt; + ctx->interrupt_counter = JS_INTERRUPT_COUNTER_INIT; + if (rt->interrupt_handler) { + if (rt->interrupt_handler(rt, rt->interrupt_opaque)) { + JS_ThrowInterrupted(ctx); + return -1; + } + } + return 0; +} + +static inline __exception int js_poll_interrupts(JSContext *ctx) +{ + if (unlikely(--ctx->interrupt_counter <= 0)) { + return __js_poll_interrupts(ctx); + } else { + return 0; + } +} + +/* return -1 (exception) or true/false */ +static int JS_SetPrototypeInternal(JSContext *ctx, JSValueConst obj, + JSValueConst proto_val, bool throw_flag) +{ + JSObject *proto, *p, *p1; + JSShape *sh; + + if (throw_flag) { + if (JS_VALUE_GET_TAG(obj) == JS_TAG_NULL || + JS_VALUE_GET_TAG(obj) == JS_TAG_UNDEFINED) + goto not_obj; + } else { + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + goto not_obj; + } + p = JS_VALUE_GET_OBJ(obj); + if (JS_VALUE_GET_TAG(proto_val) != JS_TAG_OBJECT) { + if (JS_VALUE_GET_TAG(proto_val) != JS_TAG_NULL) { + not_obj: + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + proto = NULL; + } else { + proto = JS_VALUE_GET_OBJ(proto_val); + } + + if (throw_flag && JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return true; + + if (unlikely(p->class_id == JS_CLASS_PROXY)) + return js_proxy_setPrototypeOf(ctx, obj, proto_val, throw_flag); + sh = p->shape; + if (sh->proto == proto) + return true; + if (p == JS_VALUE_GET_OBJ(ctx->class_proto[JS_CLASS_OBJECT])) { + if (throw_flag) { + JS_ThrowTypeError(ctx, "'Immutable prototype object \'Object.prototype\' cannot have their prototype set'"); + return -1; + } + return false; + } + if (!p->extensible) { + if (throw_flag) { + JS_ThrowTypeError(ctx, "object is not extensible"); + return -1; + } else { + return false; + } + } + if (proto) { + /* check if there is a cycle */ + p1 = proto; + do { + if (p1 == p) { + if (throw_flag) { + JS_ThrowTypeError(ctx, "circular prototype chain"); + return -1; + } else { + return false; + } + } + /* Note: for Proxy objects, proto is NULL */ + p1 = p1->shape->proto; + } while (p1 != NULL); + js_dup(proto_val); + } + + if (js_shape_prepare_update(ctx, p, NULL)) + return -1; + sh = p->shape; + if (sh->proto) + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, sh->proto)); + sh->proto = proto; + return true; +} + +/* return -1 (exception) or true/false */ +int JS_SetPrototype(JSContext *ctx, JSValueConst obj, JSValueConst proto_val) +{ + return JS_SetPrototypeInternal(ctx, obj, proto_val, true); +} + +/* Only works for primitive types, otherwise return JS_NULL. */ +static JSValueConst JS_GetPrototypePrimitive(JSContext *ctx, JSValueConst val) +{ + JSValue ret; + switch(JS_VALUE_GET_NORM_TAG(val)) { + case JS_TAG_SHORT_BIG_INT: + case JS_TAG_BIG_INT: + ret = ctx->class_proto[JS_CLASS_BIG_INT]; + break; + case JS_TAG_INT: + case JS_TAG_FLOAT64: + ret = ctx->class_proto[JS_CLASS_NUMBER]; + break; + case JS_TAG_BOOL: + ret = ctx->class_proto[JS_CLASS_BOOLEAN]; + break; + case JS_TAG_STRING: + ret = ctx->class_proto[JS_CLASS_STRING]; + break; + case JS_TAG_SYMBOL: + ret = ctx->class_proto[JS_CLASS_SYMBOL]; + break; + case JS_TAG_OBJECT: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + default: + ret = JS_NULL; + break; + } + return ret; +} + +/* Return an Object, JS_NULL or JS_EXCEPTION in case of Proxy object. */ +JSValue JS_GetPrototype(JSContext *ctx, JSValueConst obj) +{ + JSValue val; + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + JSObject *p; + p = JS_VALUE_GET_OBJ(obj); + if (unlikely(p->class_id == JS_CLASS_PROXY)) { + val = js_proxy_getPrototypeOf(ctx, obj); + } else { + p = p->shape->proto; + if (!p) + val = JS_NULL; + else + val = js_dup(JS_MKPTR(JS_TAG_OBJECT, p)); + } + } else { + val = js_dup(JS_GetPrototypePrimitive(ctx, obj)); + } + return val; +} + +static JSValue JS_GetPrototypeFree(JSContext *ctx, JSValue obj) +{ + JSValue obj1; + obj1 = JS_GetPrototype(ctx, obj); + JS_FreeValue(ctx, obj); + return obj1; +} + +int JS_GetLength(JSContext *ctx, JSValueConst obj, int64_t *pres) { + return js_get_length64(ctx, pres, obj); +} + +int JS_SetLength(JSContext *ctx, JSValueConst obj, int64_t len) { + return js_set_length64(ctx, obj, len); +} + +/* return true, false or (-1) in case of exception */ +static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValueConst val, + JSValueConst obj) +{ + JSValue obj_proto; + JSObject *proto; + const JSObject *p, *proto1; + int ret; + + if (!JS_IsFunction(ctx, obj)) + return false; + p = JS_VALUE_GET_OBJ(obj); + if (p->class_id == JS_CLASS_BOUND_FUNCTION) { + JSBoundFunction *s = p->u.bound_function; + return JS_IsInstanceOf(ctx, val, s->func_obj); + } + + /* Only explicitly boxed values are instances of constructors */ + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return false; + obj_proto = JS_GetProperty(ctx, obj, JS_ATOM_prototype); + if (JS_VALUE_GET_TAG(obj_proto) != JS_TAG_OBJECT) { + if (!JS_IsException(obj_proto)) + JS_ThrowTypeError(ctx, "operand 'prototype' property is not an object"); + ret = -1; + goto done; + } + proto = JS_VALUE_GET_OBJ(obj_proto); + p = JS_VALUE_GET_OBJ(val); + for(;;) { + proto1 = p->shape->proto; + if (!proto1) { + /* slow case if proxy in the prototype chain */ + if (unlikely(p->class_id == JS_CLASS_PROXY)) { + JSValue obj1; + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, (JSObject *)p)); + for(;;) { + obj1 = JS_GetPrototypeFree(ctx, obj1); + if (JS_IsException(obj1)) { + ret = -1; + break; + } + if (JS_IsNull(obj1)) { + ret = false; + break; + } + if (proto == JS_VALUE_GET_OBJ(obj1)) { + JS_FreeValue(ctx, obj1); + ret = true; + break; + } + /* must check for timeout to avoid infinite loop */ + if (js_poll_interrupts(ctx)) { + JS_FreeValue(ctx, obj1); + ret = -1; + break; + } + } + } else { + ret = false; + } + break; + } + p = proto1; + if (proto == p) { + ret = true; + break; + } + } +done: + JS_FreeValue(ctx, obj_proto); + return ret; +} + +/* return true, false or (-1) in case of exception */ +int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj) +{ + JSValue method; + + if (!JS_IsObject(obj)) + goto fail; + method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_hasInstance); + if (JS_IsException(method)) + return -1; + if (!JS_IsNull(method) && !JS_IsUndefined(method)) { + JSValue ret; + ret = JS_CallFree(ctx, method, obj, 1, &val); + return JS_ToBoolFree(ctx, ret); + } + + /* legacy case */ + if (!JS_IsFunction(ctx, obj)) { + fail: + JS_ThrowTypeError(ctx, "invalid 'instanceof' right operand"); + return -1; + } + return JS_OrdinaryIsInstanceOf(ctx, val, obj); +} + +#include "builtin-array-fromasync.h" +#include "builtin-iterator-zip-keyed.h" +#include "builtin-iterator-zip.h" + +// like Function.prototype.call but monkey patch-proof +static JSValue js_call_function(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + return JS_Call(ctx, argv[1], argv[0], argc-2, argv+2); +} + +// returns enumerable and non-enumerable strings *and* symbols +static JSValue js_getOwnPropertyKeys(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int flags = JS_GPN_STRING_MASK|JS_GPN_SYMBOL_MASK; + return JS_GetOwnPropertyNames2(ctx, argv[0], flags, JS_ITERATOR_KIND_KEY); +} + +static JSValue js_hasOwnEnumProperty(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSPropertyDescriptor d; + JSObject *p; + JSAtom key; + int flags, res; + + if (JS_TAG_OBJECT != JS_VALUE_GET_TAG(argv[0])) + return JS_ThrowTypeErrorNotAnObject(ctx); + p = JS_VALUE_GET_OBJ(argv[0]); + key = JS_ValueToAtomInternal(ctx, argv[1], JS_TO_STRING_NO_SIDE_EFFECTS); + if (key == JS_ATOM_NULL) + return JS_EXCEPTION; + res = JS_GetOwnPropertyInternal(ctx, &d, p, key); + JS_FreeAtom(ctx, key); + if (res < 0) + return JS_EXCEPTION; + flags = 0; + if (res > 0) { + flags = d.flags; + js_free_desc(ctx, &d); + } + if (flags & JS_PROP_ENUMERABLE) + return JS_TRUE; + return JS_FALSE; +} + +// note: takes ownership of |argv| +static JSValue js_bytecode_eval(JSContext *ctx, const uint8_t *bytecode, + size_t len, int argc, JSValue *argv) +{ + JSValue obj, fun, result; + int i; + + obj = JS_ReadObject(ctx, bytecode, len, JS_READ_OBJ_BYTECODE); + if (JS_IsException(obj)) + return JS_EXCEPTION; + fun = JS_EvalFunction(ctx, obj); + if (JS_IsException(fun)) + return JS_EXCEPTION; + assert(JS_IsFunction(ctx, fun)); + result = JS_Call(ctx, fun, JS_UNDEFINED, argc, vc(argv)); + for (i = 0; i < argc; i++) + JS_FreeValue(ctx, argv[i]); + JS_FreeValue(ctx, fun); + if (JS_SetPrototypeInternal(ctx, result, ctx->function_proto, + /*throw_flag*/true) < 0) { + JS_FreeValue(ctx, result); + return JS_EXCEPTION; + } + return result; +} + +static JSValue js_bytecode_autoinit(JSContext *ctx, JSObject *p, JSAtom atom, + void *opaque) +{ + switch ((uintptr_t)opaque) { + default: + abort(); + case JS_BUILTIN_ARRAY_FROMASYNC: + { + JSValue argv[] = { + JS_NewCFunction(ctx, js_array_constructor, "Array", 0), + JS_NewCFunctionMagic(ctx, js_error_constructor, "TypeError", + 1, JS_CFUNC_constructor_or_func_magic, + JS_TYPE_ERROR), + JS_AtomToValue(ctx, JS_ATOM_Symbol_asyncIterator), + JS_NewCFunctionMagic(ctx, js_object_defineProperty, + "Object.defineProperty", 3, + JS_CFUNC_generic_magic, 0), + JS_AtomToValue(ctx, JS_ATOM_Symbol_iterator), + }; + return js_bytecode_eval(ctx, qjsc_builtin_array_fromasync, + sizeof(qjsc_builtin_array_fromasync), + countof(argv), argv); + } + case JS_BUILTIN_ITERATOR_ZIP: + { + JSValue argv[] = { + js_dup(ctx->class_proto[JS_CLASS_ITERATOR_HELPER]), + JS_NewCFunctionMagic(ctx, js_error_constructor, "InternalError", + 1, JS_CFUNC_constructor_or_func_magic, + JS_INTERNAL_ERROR), + JS_NewCFunctionMagic(ctx, js_error_constructor, "TypeError", + 1, JS_CFUNC_constructor_or_func_magic, + JS_TYPE_ERROR), + JS_NewCFunction(ctx, js_call_function, "call", 2), + JS_AtomToValue(ctx, JS_ATOM_Symbol_iterator), + }; + JSValue result = js_bytecode_eval(ctx, qjsc_builtin_iterator_zip, + sizeof(qjsc_builtin_iterator_zip), + countof(argv), argv); + JS_SetConstructorBit(ctx, result, false); + return result; + } + case JS_BUILTIN_ITERATOR_ZIP_KEYED: + { + JSValue argv[] = { + js_dup(ctx->class_proto[JS_CLASS_ITERATOR_HELPER]), + JS_NewCFunctionMagic(ctx, js_error_constructor, "InternalError", + 1, JS_CFUNC_constructor_or_func_magic, + JS_INTERNAL_ERROR), + JS_NewCFunctionMagic(ctx, js_error_constructor, "TypeError", + 1, JS_CFUNC_constructor_or_func_magic, + JS_TYPE_ERROR), + JS_NewCFunction(ctx, js_call_function, "call", 2), + JS_NewCFunction(ctx, js_hasOwnEnumProperty, + "hasOwnEnumProperty", 2), + JS_NewCFunction(ctx, js_getOwnPropertyKeys, + "getOwnPropertyKeys", 1), + JS_AtomToValue(ctx, JS_ATOM_Symbol_iterator), + }; + JSValue result = js_bytecode_eval(ctx, qjsc_builtin_iterator_zip_keyed, + sizeof(qjsc_builtin_iterator_zip_keyed), + countof(argv), argv); + JS_SetConstructorBit(ctx, result, false); + return result; + } + } + return JS_UNDEFINED; +} + +/* return the value associated to the autoinit property or an exception */ +typedef JSValue JSAutoInitFunc(JSContext *ctx, JSObject *p, JSAtom atom, void *opaque); + +static JSAutoInitFunc *const js_autoinit_func_table[] = { + js_instantiate_prototype, /* JS_AUTOINIT_ID_PROTOTYPE */ + js_module_ns_autoinit, /* JS_AUTOINIT_ID_MODULE_NS */ + JS_InstantiateFunctionListItem2, /* JS_AUTOINIT_ID_PROP */ + js_bytecode_autoinit, /* JS_AUTOINIT_ID_BYTECODE */ +}; + +/* warning: 'prs' is reallocated after it */ +static int JS_AutoInitProperty(JSContext *ctx, JSObject *p, JSAtom prop, + JSProperty *pr, JSShapeProperty *prs) +{ + JSValue val; + JSContext *realm; + JSAutoInitFunc *func; + + if (js_shape_prepare_update(ctx, p, &prs)) + return -1; + + realm = js_autoinit_get_realm(pr); + func = js_autoinit_func_table[js_autoinit_get_id(pr)]; + /* 'func' shall not modify the object properties 'pr' */ + val = func(realm, p, prop, pr->u.init.opaque); + js_autoinit_free(ctx->rt, pr); + prs->flags &= ~JS_PROP_TMASK; + pr->u.value = JS_UNDEFINED; + if (JS_IsException(val)) + return -1; + pr->u.value = val; + return 0; +} + +static JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj, + JSAtom prop, JSValueConst this_obj, + bool throw_ref_error) +{ + JSObject *p; + JSProperty *pr; + JSShapeProperty *prs; + uint32_t tag; + + tag = JS_VALUE_GET_TAG(obj); + if (unlikely(tag != JS_TAG_OBJECT)) { + switch(tag) { + case JS_TAG_NULL: + return JS_ThrowTypeErrorAtom(ctx, "cannot read property '%s' of null", prop); + case JS_TAG_UNDEFINED: + return JS_ThrowTypeErrorAtom(ctx, "cannot read property '%s' of undefined", prop); + case JS_TAG_EXCEPTION: + return JS_EXCEPTION; + case JS_TAG_STRING: + { + JSString *p1 = JS_VALUE_GET_STRING(obj); + if (__JS_AtomIsTaggedInt(prop)) { + uint32_t idx, ch; + idx = __JS_AtomToUInt32(prop); + if (idx < p1->len) { + ch = string_get(p1, idx); + return js_new_string_char(ctx, ch); + } + } else if (prop == JS_ATOM_length) { + return js_int32(p1->len); + } + } + break; + default: + break; + } + /* cannot raise an exception */ + p = JS_VALUE_GET_OBJ(JS_GetPrototypePrimitive(ctx, obj)); + if (!p) + return JS_UNDEFINED; + } else { + p = JS_VALUE_GET_OBJ(obj); + } + + for(;;) { + prs = find_own_property(&pr, p, prop); + if (prs) { + /* found */ + if (unlikely(prs->flags & JS_PROP_TMASK)) { + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + if (unlikely(!pr->u.getset.getter)) { + return JS_UNDEFINED; + } else { + JSValue func = JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.getter); + /* Note: the field could be removed in the getter */ + func = js_dup(func); + return JS_CallFree(ctx, func, this_obj, 0, NULL); + } + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + JSValue val = *pr->u.var_ref->pvalue; + if (unlikely(JS_IsUninitialized(val))) + return JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return js_dup(val); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* Instantiate property and retry */ + if (JS_AutoInitProperty(ctx, p, prop, pr, prs)) + return JS_EXCEPTION; + continue; + } + } else { + return js_dup(pr->u.value); + } + } + if (unlikely(p->is_exotic)) { + /* exotic behaviors */ + if (p->fast_array) { + if (__JS_AtomIsTaggedInt(prop)) { + uint32_t idx = __JS_AtomToUInt32(prop); + if (idx < p->u.array.count) { + /* we avoid duplicating the code */ + return JS_GetPropertyUint32(ctx, JS_MKPTR(JS_TAG_OBJECT, p), idx); + } else if (is_typed_array(p->class_id)) { + return JS_UNDEFINED; + } + } else if (is_typed_array(p->class_id)) { + int ret; + ret = JS_AtomIsNumericIndex(ctx, prop); + if (ret != 0) { + if (ret < 0) + return JS_EXCEPTION; + return JS_UNDEFINED; + } + } + } else { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em) { + if (em->get_property) { + JSValue obj1, retval; + /* XXX: should pass throw_ref_error */ + /* Note: if 'p' is a prototype, it can be + freed in the called function */ + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, p)); + retval = em->get_property(ctx, obj1, prop, this_obj); + JS_FreeValue(ctx, obj1); + return retval; + } + if (em->get_own_property) { + JSPropertyDescriptor desc; + int ret; + JSValue obj1; + + /* Note: if 'p' is a prototype, it can be + freed in the called function */ + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, p)); + ret = em->get_own_property(ctx, &desc, obj1, prop); + JS_FreeValue(ctx, obj1); + if (ret < 0) + return JS_EXCEPTION; + if (ret) { + if (desc.flags & JS_PROP_GETSET) { + JS_FreeValue(ctx, desc.setter); + return JS_CallFree(ctx, desc.getter, this_obj, 0, NULL); + } else { + return desc.value; + } + } + } + } + } + } + p = p->shape->proto; + if (!p) + break; + } + if (unlikely(throw_ref_error)) { + return JS_ThrowReferenceErrorNotDefined(ctx, prop); + } else { + return JS_UNDEFINED; + } +} + +JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop) +{ + return JS_GetPropertyInternal(ctx, this_obj, prop, this_obj, false); +} + +static JSValue JS_ThrowTypeErrorPrivateNotFound(JSContext *ctx, JSAtom atom) +{ + return JS_ThrowTypeErrorAtom(ctx, "private class field '%s' does not exist", + atom); +} + +/* Private fields can be added even on non extensible objects or + Proxies */ +static int JS_DefinePrivateField(JSContext *ctx, JSValueConst obj, + JSValue name, JSValue val) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + JSAtom prop; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) { + JS_ThrowTypeErrorNotAnObject(ctx); + goto fail; + } + /* safety check */ + if (unlikely(JS_VALUE_GET_TAG(name) != JS_TAG_SYMBOL)) { + JS_ThrowTypeErrorNotASymbol(ctx); + goto fail; + } + prop = js_symbol_to_atom(ctx, name); + p = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p, prop); + if (prs) { + JS_ThrowTypeErrorAtom(ctx, "private class field '%s' already exists", + prop); + goto fail; + } + pr = add_property(ctx, p, prop, JS_PROP_C_W_E); + if (unlikely(!pr)) { + fail: + JS_FreeValue(ctx, val); + return -1; + } + pr->u.value = val; + return 0; +} + +static JSValue JS_GetPrivateField(JSContext *ctx, JSValueConst obj, + JSValueConst name) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + JSAtom prop; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) + return JS_ThrowTypeErrorNotAnObject(ctx); + /* safety check */ + if (unlikely(JS_VALUE_GET_TAG(name) != JS_TAG_SYMBOL)) + return JS_ThrowTypeErrorNotASymbol(ctx); + prop = js_symbol_to_atom(ctx, name); + p = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p, prop); + if (!prs) { + JS_ThrowTypeErrorPrivateNotFound(ctx, prop); + return JS_EXCEPTION; + } + return js_dup(pr->u.value); +} + +static int JS_SetPrivateField(JSContext *ctx, JSValueConst obj, + JSValueConst name, JSValue val) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + JSAtom prop; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) { + JS_ThrowTypeErrorNotAnObject(ctx); + goto fail; + } + /* safety check */ + if (unlikely(JS_VALUE_GET_TAG(name) != JS_TAG_SYMBOL)) { + JS_ThrowTypeErrorNotASymbol(ctx); + goto fail; + } + prop = js_symbol_to_atom(ctx, name); + p = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p, prop); + if (!prs) { + JS_ThrowTypeErrorPrivateNotFound(ctx, prop); + fail: + JS_FreeValue(ctx, val); + return -1; + } + set_value(ctx, &pr->u.value, val); + return 0; +} + +/* add a private brand field to 'home_obj' if not already present and + if obj is != null add a private brand to it */ +static int JS_AddBrand(JSContext *ctx, JSValueConst obj, JSValueConst home_obj) +{ + JSObject *p, *p1; + JSShapeProperty *prs; + JSProperty *pr; + JSValue brand; + JSAtom brand_atom; + + if (unlikely(JS_VALUE_GET_TAG(home_obj) != JS_TAG_OBJECT)) { + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + p = JS_VALUE_GET_OBJ(home_obj); + prs = find_own_property(&pr, p, JS_ATOM_Private_brand); + if (!prs) { + /* if the brand is not present, add it */ + brand = JS_NewSymbolFromAtom(ctx, JS_ATOM_brand, JS_ATOM_TYPE_PRIVATE); + if (JS_IsException(brand)) + return -1; + pr = add_property(ctx, p, JS_ATOM_Private_brand, JS_PROP_C_W_E); + if (!pr) { + JS_FreeValue(ctx, brand); + return -1; + } + pr->u.value = js_dup(brand); + } else { + brand = js_dup(pr->u.value); + } + brand_atom = js_symbol_to_atom(ctx, brand); + + if (JS_IsObject(obj)) { + p1 = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p1, brand_atom); + if (unlikely(prs)) { + JS_FreeAtom(ctx, brand_atom); + JS_ThrowTypeError(ctx, "private method is already present"); + return -1; + } + pr = add_property(ctx, p1, brand_atom, JS_PROP_C_W_E); + JS_FreeAtom(ctx, brand_atom); + if (!pr) + return -1; + pr->u.value = JS_UNDEFINED; + } else { + JS_FreeAtom(ctx, brand_atom); + } + + return 0; +} + +/* return a boolean telling if the brand of the home object of 'func' + is present on 'obj' or -1 in case of exception */ +static int JS_CheckBrand(JSContext *ctx, JSValue obj, JSValue func) +{ + JSObject *p, *p1, *home_obj; + JSShapeProperty *prs; + JSProperty *pr; + JSValue brand; + + /* get the home object of 'func' */ + if (unlikely(JS_VALUE_GET_TAG(func) != JS_TAG_OBJECT)) + goto not_obj; + p1 = JS_VALUE_GET_OBJ(func); + if (!js_class_has_bytecode(p1->class_id)) + goto not_obj; + home_obj = p1->u.func.home_object; + if (!home_obj) + goto not_obj; + prs = find_own_property(&pr, home_obj, JS_ATOM_Private_brand); + if (!prs) { + JS_ThrowTypeError(ctx, "expecting private field"); + return -1; + } + brand = pr->u.value; + /* safety check */ + if (unlikely(JS_VALUE_GET_TAG(brand) != JS_TAG_SYMBOL)) + goto not_obj; + + /* get the brand array of 'obj' */ + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) { + not_obj: + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + p = JS_VALUE_GET_OBJ(obj); + prs = find_own_property(&pr, p, js_symbol_to_atom(ctx, brand)); + return (prs != NULL); +} + +static uint32_t js_string_obj_get_length(JSContext *ctx, JSValueConst obj) +{ + JSObject *p; + JSString *p1; + uint32_t len = 0; + + /* This is a class exotic method: obj class_id is JS_CLASS_STRING */ + p = JS_VALUE_GET_OBJ(obj); + if (JS_VALUE_GET_TAG(p->u.object_data) == JS_TAG_STRING) { + p1 = JS_VALUE_GET_STRING(p->u.object_data); + len = p1->len; + } + return len; +} + +static int num_keys_cmp(const void *p1, const void *p2, void *opaque) +{ + JSContext *ctx = opaque; + JSAtom atom1 = ((const JSPropertyEnum *)p1)->atom; + JSAtom atom2 = ((const JSPropertyEnum *)p2)->atom; + uint32_t v1, v2; + bool atom1_is_integer, atom2_is_integer; + + atom1_is_integer = JS_AtomIsArrayIndex(ctx, &v1, atom1); + atom2_is_integer = JS_AtomIsArrayIndex(ctx, &v2, atom2); + assert(atom1_is_integer && atom2_is_integer); + if (v1 < v2) + return -1; + else if (v1 == v2) + return 0; + else + return 1; +} + +static void js_free_prop_enum(JSContext *ctx, JSPropertyEnum *tab, uint32_t len) +{ + uint32_t i; + if (tab) { + for(i = 0; i < len; i++) + JS_FreeAtom(ctx, tab[i].atom); + js_free(ctx, tab); + } +} + +/* return < 0 in case if exception, 0 if OK. ptab and its atoms must + be freed by the user. */ +static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx, + JSPropertyEnum **ptab, + uint32_t *plen, + JSObject *p, int flags) +{ + int i, j; + JSShape *sh; + JSShapeProperty *prs; + JSPropertyEnum *tab_atom, *tab_exotic; + JSAtom atom; + uint32_t num_keys_count, str_keys_count, sym_keys_count, atom_count; + uint32_t num_index, str_index, sym_index, exotic_count, exotic_keys_count; + bool is_enumerable, num_sorted; + uint32_t num_key; + JSAtomKindEnum kind; + + /* clear pointer for consistency in case of failure */ + *ptab = NULL; + *plen = 0; + + /* compute the number of returned properties */ + num_keys_count = 0; + str_keys_count = 0; + sym_keys_count = 0; + exotic_keys_count = 0; + exotic_count = 0; + tab_exotic = NULL; + sh = p->shape; + for(i = 0, prs = get_shape_prop(sh); i < sh->prop_count; i++, prs++) { + atom = prs->atom; + if (atom != JS_ATOM_NULL) { + is_enumerable = ((prs->flags & JS_PROP_ENUMERABLE) != 0); + kind = JS_AtomGetKind(ctx, atom); + if ((!(flags & JS_GPN_ENUM_ONLY) || is_enumerable) && + ((flags >> kind) & 1) != 0) { + /* need to raise an exception in case of the module + name space (implicit GetOwnProperty) */ + if (unlikely((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) && + (flags & (JS_GPN_SET_ENUM | JS_GPN_ENUM_ONLY))) { + JSVarRef *var_ref = p->prop[i].u.var_ref; + if (unlikely(JS_IsUninitialized(*var_ref->pvalue))) { + JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return -1; + } + } + if (JS_AtomIsArrayIndex(ctx, &num_key, atom)) { + num_keys_count++; + } else if (kind == JS_ATOM_KIND_STRING) { + str_keys_count++; + } else { + sym_keys_count++; + } + } + } + } + + if (p->is_exotic) { + if (p->fast_array) { + if (flags & JS_GPN_STRING_MASK) { + num_keys_count += p->u.array.count; + } + } else if (p->class_id == JS_CLASS_STRING) { + if (flags & JS_GPN_STRING_MASK) { + num_keys_count += js_string_obj_get_length(ctx, JS_MKPTR(JS_TAG_OBJECT, p)); + } + } else { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em && em->get_own_property_names) { + if (em->get_own_property_names(ctx, &tab_exotic, &exotic_count, + JS_MKPTR(JS_TAG_OBJECT, p))) + return -1; + for(i = 0; i < exotic_count; i++) { + atom = tab_exotic[i].atom; + kind = JS_AtomGetKind(ctx, atom); + if (((flags >> kind) & 1) != 0) { + is_enumerable = false; + if (flags & (JS_GPN_SET_ENUM | JS_GPN_ENUM_ONLY)) { + JSPropertyDescriptor desc; + int res; + /* set the "is_enumerable" field if necessary */ + res = JS_GetOwnPropertyInternal(ctx, &desc, p, atom); + if (res < 0) { + js_free_prop_enum(ctx, tab_exotic, exotic_count); + return -1; + } + if (res) { + is_enumerable = + ((desc.flags & JS_PROP_ENUMERABLE) != 0); + js_free_desc(ctx, &desc); + } + tab_exotic[i].is_enumerable = is_enumerable; + } + if (!(flags & JS_GPN_ENUM_ONLY) || is_enumerable) { + exotic_keys_count++; + } + } + } + } + } + } + + /* fill them */ + + atom_count = num_keys_count + str_keys_count + sym_keys_count + exotic_keys_count; + /* avoid allocating 0 bytes */ + tab_atom = js_malloc(ctx, sizeof(tab_atom[0]) * max_int(atom_count, 1)); + if (!tab_atom) { + js_free_prop_enum(ctx, tab_exotic, exotic_count); + return -1; + } + + num_index = 0; + str_index = num_keys_count; + sym_index = str_index + str_keys_count; + + num_sorted = true; + sh = p->shape; + for(i = 0, prs = get_shape_prop(sh); i < sh->prop_count; i++, prs++) { + atom = prs->atom; + if (atom != JS_ATOM_NULL) { + is_enumerable = ((prs->flags & JS_PROP_ENUMERABLE) != 0); + kind = JS_AtomGetKind(ctx, atom); + if ((!(flags & JS_GPN_ENUM_ONLY) || is_enumerable) && + ((flags >> kind) & 1) != 0) { + if (JS_AtomIsArrayIndex(ctx, &num_key, atom)) { + j = num_index++; + num_sorted = false; + } else if (kind == JS_ATOM_KIND_STRING) { + j = str_index++; + } else { + j = sym_index++; + } + tab_atom[j].atom = JS_DupAtom(ctx, atom); + tab_atom[j].is_enumerable = is_enumerable; + } + } + } + + if (p->is_exotic) { + int len; + if (p->fast_array) { + if (flags & JS_GPN_STRING_MASK) { + len = p->u.array.count; + goto add_array_keys; + } + } else if (p->class_id == JS_CLASS_STRING) { + if (flags & JS_GPN_STRING_MASK) { + len = js_string_obj_get_length(ctx, JS_MKPTR(JS_TAG_OBJECT, p)); + add_array_keys: + for(i = 0; i < len; i++) { + tab_atom[num_index].atom = __JS_AtomFromUInt32(i); + if (tab_atom[num_index].atom == JS_ATOM_NULL) { + js_free_prop_enum(ctx, tab_atom, num_index); + return -1; + } + tab_atom[num_index].is_enumerable = true; + num_index++; + } + } + } else { + /* Note: exotic keys are not reordered and comes after the object own properties. */ + for(i = 0; i < exotic_count; i++) { + atom = tab_exotic[i].atom; + is_enumerable = tab_exotic[i].is_enumerable; + kind = JS_AtomGetKind(ctx, atom); + if ((!(flags & JS_GPN_ENUM_ONLY) || is_enumerable) && + ((flags >> kind) & 1) != 0) { + tab_atom[sym_index].atom = atom; + tab_atom[sym_index].is_enumerable = is_enumerable; + sym_index++; + } else { + JS_FreeAtom(ctx, atom); + } + } + js_free(ctx, tab_exotic); + } + } + + assert(num_index == num_keys_count); + assert(str_index == num_keys_count + str_keys_count); + assert(sym_index == atom_count); + + if (num_keys_count != 0 && !num_sorted) { + rqsort(tab_atom, num_keys_count, sizeof(tab_atom[0]), num_keys_cmp, + ctx); + } + *ptab = tab_atom; + *plen = atom_count; + return 0; +} + +int JS_GetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab, + uint32_t *plen, JSValueConst obj, int flags) +{ + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) { + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + return JS_GetOwnPropertyNamesInternal(ctx, ptab, plen, + JS_VALUE_GET_OBJ(obj), flags); +} + +/* Return -1 if exception, + false if the property does not exist, true if it exists. If true is + returned, the property descriptor 'desc' is filled present. */ +static int JS_GetOwnPropertyInternal(JSContext *ctx, JSPropertyDescriptor *desc, + JSObject *p, JSAtom prop) +{ + JSShapeProperty *prs; + JSProperty *pr; + +retry: + prs = find_own_property(&pr, p, prop); + if (prs) { + if (desc) { + desc->flags = prs->flags & JS_PROP_C_W_E; + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + desc->value = JS_UNDEFINED; + if (unlikely(prs->flags & JS_PROP_TMASK)) { + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + desc->flags |= JS_PROP_GETSET; + if (pr->u.getset.getter) + desc->getter = js_dup(JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.getter)); + if (pr->u.getset.setter) + desc->setter = js_dup(JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.setter)); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + JSValue val = *pr->u.var_ref->pvalue; + if (unlikely(JS_IsUninitialized(val))) { + JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return -1; + } + desc->value = js_dup(val); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* Instantiate property and retry */ + if (JS_AutoInitProperty(ctx, p, prop, pr, prs)) + return -1; + goto retry; + } + } else { + desc->value = js_dup(pr->u.value); + } + } else { + /* for consistency, send the exception even if desc is NULL */ + if (unlikely((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF)) { + if (unlikely(JS_IsUninitialized(*pr->u.var_ref->pvalue))) { + JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return -1; + } + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* nothing to do: delay instantiation until actual value and/or attributes are read */ + } + } + return true; + } + if (p->is_exotic) { + if (p->fast_array) { + /* specific case for fast arrays */ + if (__JS_AtomIsTaggedInt(prop)) { + uint32_t idx; + idx = __JS_AtomToUInt32(prop); + if (idx < p->u.array.count) { + if (desc) { + desc->flags = JS_PROP_WRITABLE | JS_PROP_ENUMERABLE | + JS_PROP_CONFIGURABLE; + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + desc->value = JS_GetPropertyUint32(ctx, JS_MKPTR(JS_TAG_OBJECT, p), idx); + } + return true; + } + } + } else { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em && em->get_own_property) { + return em->get_own_property(ctx, desc, + JS_MKPTR(JS_TAG_OBJECT, p), prop); + } + } + } + return false; +} + +int JS_GetOwnProperty(JSContext *ctx, JSPropertyDescriptor *desc, + JSValueConst obj, JSAtom prop) +{ + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) { + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + return JS_GetOwnPropertyInternal(ctx, desc, JS_VALUE_GET_OBJ(obj), prop); +} + +void JS_FreePropertyEnum(JSContext *ctx, JSPropertyEnum *tab, + uint32_t len) +{ + js_free_prop_enum(ctx, tab, len); +} + +/* return -1 if exception (Proxy object only) or true/false */ +int JS_IsExtensible(JSContext *ctx, JSValueConst obj) +{ + JSObject *p; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) + return false; + p = JS_VALUE_GET_OBJ(obj); + if (unlikely(p->class_id == JS_CLASS_PROXY)) + return js_proxy_isExtensible(ctx, obj); + else + return p->extensible; +} + +/* return -1 if exception (Proxy object only) or true/false */ +int JS_PreventExtensions(JSContext *ctx, JSValueConst obj) +{ + JSObject *p; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) + return false; + p = JS_VALUE_GET_OBJ(obj); + if (unlikely(p->class_id == JS_CLASS_PROXY)) + return js_proxy_preventExtensions(ctx, obj); + p->extensible = false; + return true; +} + +/* return -1 if exception otherwise true or false */ +int JS_HasProperty(JSContext *ctx, JSValueConst obj, JSAtom prop) +{ + JSObject *p; + int ret; + JSValue obj1; + + if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)) + return false; + p = JS_VALUE_GET_OBJ(obj); + for(;;) { + if (p->is_exotic) { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em && em->has_property) { + /* has_property can free the prototype */ + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, p)); + ret = em->has_property(ctx, obj1, prop); + JS_FreeValue(ctx, obj1); + return ret; + } + } + /* JS_GetOwnPropertyInternal can free the prototype */ + js_dup(JS_MKPTR(JS_TAG_OBJECT, p)); + ret = JS_GetOwnPropertyInternal(ctx, NULL, p, prop); + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, p)); + if (ret != 0) + return ret; + if (is_typed_array(p->class_id)) { + ret = JS_AtomIsNumericIndex(ctx, prop); + if (ret != 0) { + if (ret < 0) + return -1; + return false; + } + } + p = p->shape->proto; + if (!p) + break; + } + return false; +} + +/* val must be a symbol */ +static JSAtom js_symbol_to_atom(JSContext *ctx, JSValueConst val) +{ + JSAtomStruct *p = JS_VALUE_GET_PTR(val); + return js_get_atom_index(ctx->rt, p); +} + +/* return JS_ATOM_NULL in case of exception */ +static JSAtom JS_ValueToAtomInternal(JSContext *ctx, JSValueConst val, + int flags) +{ + JSAtom atom; + uint32_t tag; + tag = JS_VALUE_GET_TAG(val); + if (tag == JS_TAG_INT && + (uint32_t)JS_VALUE_GET_INT(val) <= JS_ATOM_MAX_INT) { + /* fast path for integer values */ + atom = __JS_AtomFromUInt32(JS_VALUE_GET_INT(val)); + } else if (tag == JS_TAG_SYMBOL) { + JSAtomStruct *p = JS_VALUE_GET_PTR(val); + atom = JS_DupAtom(ctx, js_get_atom_index(ctx->rt, p)); + } else { + JSValue str; + str = JS_ToPropertyKeyInternal(ctx, val, flags); + if (JS_IsException(str)) + return JS_ATOM_NULL; + if (JS_VALUE_GET_TAG(str) == JS_TAG_SYMBOL) { + atom = js_symbol_to_atom(ctx, str); + } else { + atom = JS_NewAtomStr(ctx, JS_VALUE_GET_STRING(str)); + } + } + return atom; +} + +JSAtom JS_ValueToAtom(JSContext *ctx, JSValueConst val) +{ + return JS_ValueToAtomInternal(ctx, val, /*flags*/0); +} + +static bool js_get_fast_array_element(JSContext *ctx, JSObject *p, + uint32_t idx, JSValue *pval) +{ + switch(p->class_id) { + case JS_CLASS_ARRAY: + case JS_CLASS_ARGUMENTS: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_dup(p->u.array.u.values[idx]); + return true; + case JS_CLASS_INT8_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_int32(p->u.array.u.int8_ptr[idx]); + return true; + case JS_CLASS_UINT8C_ARRAY: + case JS_CLASS_UINT8_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_int32(p->u.array.u.uint8_ptr[idx]); + return true; + case JS_CLASS_INT16_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_int32(p->u.array.u.int16_ptr[idx]); + return true; + case JS_CLASS_UINT16_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_int32(p->u.array.u.uint16_ptr[idx]); + return true; + case JS_CLASS_INT32_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_int32(p->u.array.u.int32_ptr[idx]); + return true; + case JS_CLASS_UINT32_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_uint32(p->u.array.u.uint32_ptr[idx]); + return true; + case JS_CLASS_BIG_INT64_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = JS_NewBigInt64(ctx, p->u.array.u.int64_ptr[idx]); + return true; + case JS_CLASS_BIG_UINT64_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = JS_NewBigUint64(ctx, p->u.array.u.uint64_ptr[idx]); + return true; + case JS_CLASS_FLOAT16_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_float64(fromfp16(p->u.array.u.fp16_ptr[idx])); + return true; + case JS_CLASS_FLOAT32_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_float64(p->u.array.u.float_ptr[idx]); + return true; + case JS_CLASS_FLOAT64_ARRAY: + if (unlikely(idx >= p->u.array.count)) return false; + *pval = js_float64(p->u.array.u.double_ptr[idx]); + return true; + default: + return false; + } +} + +static JSValue JS_GetPropertyValue(JSContext *ctx, JSValueConst this_obj, + JSValue prop) +{ + JSAtom atom; + JSValue ret; + uint32_t tag; + + tag = JS_VALUE_GET_TAG(this_obj); + if (likely(tag == JS_TAG_OBJECT)) { + if (JS_VALUE_GET_TAG(prop) == JS_TAG_INT) { + JSObject *p = JS_VALUE_GET_OBJ(this_obj); + uint32_t idx = JS_VALUE_GET_INT(prop); + JSValue val; + /* fast path for array and typed array access */ + if (js_get_fast_array_element(ctx, p, idx, &val)) + return val; + } + } else if (unlikely(tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED)) { + // per spec: not allowed to call ToPropertyKey before ToObject + // so we must ensure to not invoke JS anything that's observable + // from JS code + atom = JS_ValueToAtomInternal(ctx, prop, JS_TO_STRING_NO_SIDE_EFFECTS); + JS_FreeValue(ctx, prop); + if (unlikely(atom == JS_ATOM_NULL)) + return JS_EXCEPTION; + if (tag == JS_TAG_NULL) { + JS_ThrowTypeErrorAtom(ctx, "cannot read property '%s' of null", atom); + } else { + JS_ThrowTypeErrorAtom(ctx, "cannot read property '%s' of undefined", atom); + } + JS_FreeAtom(ctx, atom); + return JS_EXCEPTION; + } + atom = JS_ValueToAtom(ctx, prop); + JS_FreeValue(ctx, prop); + if (unlikely(atom == JS_ATOM_NULL)) + return JS_EXCEPTION; + ret = JS_GetProperty(ctx, this_obj, atom); + JS_FreeAtom(ctx, atom); + return ret; +} + +JSValue JS_GetPropertyUint32(JSContext *ctx, JSValueConst this_obj, + uint32_t idx) +{ + return JS_GetPropertyInt64(ctx, this_obj, idx); +} + +/* Check if an object has a generalized numeric property. Return value: + -1 for exception, *pval set to JS_EXCEPTION + true if property exists, stored into *pval, + false if property does not exist. *pval set to JS_UNDEFINED. + */ +static int JS_TryGetPropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx, JSValue *pval) +{ + JSValue val; + JSAtom prop; + int present; + + if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT && + (uint64_t)idx <= INT32_MAX)) { + /* fast path for array and typed array access */ + JSObject *p = JS_VALUE_GET_OBJ(obj); + if (js_get_fast_array_element(ctx, p, idx, pval)) + return true; + } + val = JS_EXCEPTION; + present = -1; + prop = JS_NewAtomInt64(ctx, idx); + if (likely(prop != JS_ATOM_NULL)) { + present = JS_HasProperty(ctx, obj, prop); + if (present > 0) { + val = JS_GetProperty(ctx, obj, prop); + if (unlikely(JS_IsException(val))) + present = -1; + } else if (present == false) { + val = JS_UNDEFINED; + } + JS_FreeAtom(ctx, prop); + } + *pval = val; + return present; +} + +JSValue JS_GetPropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx) +{ + JSAtom prop; + JSValue val; + + if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT && + (uint64_t)idx <= INT32_MAX)) { + /* fast path for array and typed array access */ + JSObject *p = JS_VALUE_GET_OBJ(obj); + if (js_get_fast_array_element(ctx, p, idx, &val)) + return val; + } + prop = JS_NewAtomInt64(ctx, idx); + if (prop == JS_ATOM_NULL) + return JS_EXCEPTION; + + val = JS_GetProperty(ctx, obj, prop); + JS_FreeAtom(ctx, prop); + return val; +} + +/* `prop` may be pure ASCII or UTF-8 encoded */ +JSValue JS_GetPropertyStr(JSContext *ctx, JSValueConst this_obj, + const char *prop) +{ + JSAtom atom; + JSValue ret; + atom = JS_NewAtom(ctx, prop); + if (atom == JS_ATOM_NULL) + return JS_EXCEPTION; + ret = JS_GetProperty(ctx, this_obj, atom); + JS_FreeAtom(ctx, atom); + return ret; +} + +/* Note: the property value is not initialized. Return NULL if memory + error. */ +static JSProperty *add_property(JSContext *ctx, + JSObject *p, JSAtom prop, int prop_flags) +{ + JSShape *sh, *new_sh; + + sh = p->shape; + if (sh->is_hashed) { + /* try to find an existing shape */ + new_sh = find_hashed_shape_prop(ctx->rt, sh, prop, prop_flags); + if (new_sh) { + /* matching shape found: use it */ + /* the property array may need to be resized */ + if (new_sh->prop_size != sh->prop_size) { + JSProperty *new_prop; + new_prop = js_realloc(ctx, p->prop, sizeof(p->prop[0]) * + new_sh->prop_size); + if (!new_prop) + return NULL; + p->prop = new_prop; + } + p->shape = js_dup_shape(new_sh); + js_free_shape(ctx->rt, sh); + return &p->prop[new_sh->prop_count - 1]; + } else if (sh->header.ref_count != 1) { + /* if the shape is shared, clone it */ + new_sh = js_clone_shape(ctx, sh); + if (!new_sh) + return NULL; + /* hash the cloned shape */ + new_sh->is_hashed = true; + js_shape_hash_link(ctx->rt, new_sh); + js_free_shape(ctx->rt, p->shape); + p->shape = new_sh; + } + } + assert(p->shape->header.ref_count == 1); + if (add_shape_property(ctx, &p->shape, p, prop, prop_flags)) + return NULL; + return &p->prop[p->shape->prop_count - 1]; +} + +/* can be called on Array or Arguments objects. return < 0 if + memory alloc error. */ +static no_inline __exception int convert_fast_array_to_array(JSContext *ctx, + JSObject *p) +{ + JSProperty *pr; + JSShape *sh; + JSValue *tab; + uint32_t i, len, new_count; + + if (js_shape_prepare_update(ctx, p, NULL)) + return -1; + len = p->u.array.count; + /* resize the properties once to simplify the error handling */ + sh = p->shape; + new_count = sh->prop_count + len; + if (new_count > sh->prop_size) { + if (resize_properties(ctx, &p->shape, p, new_count)) + return -1; + } + + tab = p->u.array.u.values; + for(i = 0; i < len; i++) { + /* add_property cannot fail here but + __JS_AtomFromUInt32(i) fails for i > INT32_MAX */ + pr = add_property(ctx, p, __JS_AtomFromUInt32(i), JS_PROP_C_W_E); + pr->u.value = *tab++; + } + js_free(ctx, p->u.array.u.values); + p->u.array.count = 0; + p->u.array.u.values = NULL; /* fail safe */ + p->u.array.u1.size = 0; + p->fast_array = 0; + return 0; +} + +static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom) +{ + JSShape *sh; + JSShapeProperty *pr, *lpr, *prop; + JSProperty *pr1; + uint32_t lpr_idx; + intptr_t h, h1; + + redo: + sh = p->shape; + h1 = atom & sh->prop_hash_mask; + h = prop_hash_end(sh)[-h1 - 1]; + prop = get_shape_prop(sh); + lpr = NULL; + lpr_idx = 0; /* prevent warning */ + while (h != 0) { + pr = &prop[h - 1]; + if (likely(pr->atom == atom)) { + /* found ! */ + if (!(pr->flags & JS_PROP_CONFIGURABLE)) + return false; + /* realloc the shape if needed */ + if (lpr) + lpr_idx = lpr - get_shape_prop(sh); + if (js_shape_prepare_update(ctx, p, &pr)) + return -1; + sh = p->shape; + /* remove property */ + if (lpr) { + lpr = get_shape_prop(sh) + lpr_idx; + lpr->hash_next = pr->hash_next; + } else { + prop_hash_end(sh)[-h1 - 1] = pr->hash_next; + } + sh->deleted_prop_count++; + /* free the entry */ + pr1 = &p->prop[h - 1]; + free_property(ctx->rt, pr1, pr->flags); + JS_FreeAtom(ctx, pr->atom); + /* put default values */ + pr->flags = 0; + pr->atom = JS_ATOM_NULL; + pr1->u.value = JS_UNDEFINED; + + /* compact the properties if too many deleted properties */ + if (sh->deleted_prop_count >= 8 && + sh->deleted_prop_count >= ((unsigned)sh->prop_count / 2)) { + compact_properties(ctx, p); + } + return true; + } + lpr = pr; + h = pr->hash_next; + } + + if (p->is_exotic) { + if (p->fast_array) { + uint32_t idx; + if (JS_AtomIsArrayIndex(ctx, &idx, atom) && + idx < p->u.array.count) { + if (p->class_id == JS_CLASS_ARRAY || + p->class_id == JS_CLASS_ARGUMENTS) { + /* Special case deleting the last element of a fast Array */ + if (idx == p->u.array.count - 1) { + JS_FreeValue(ctx, p->u.array.u.values[idx]); + p->u.array.count = idx; + return true; + } + if (convert_fast_array_to_array(ctx, p)) + return -1; + goto redo; + } else { + return false; + } + } + } else { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em && em->delete_property) { + return em->delete_property(ctx, JS_MKPTR(JS_TAG_OBJECT, p), atom); + } + } + } + /* not found */ + return true; +} + +static int call_setter(JSContext *ctx, JSObject *setter, + JSValueConst this_obj, JSValue val, int flags) +{ + JSValue ret, func; + if (likely(setter)) { + func = JS_MKPTR(JS_TAG_OBJECT, setter); + /* Note: the field could be removed in the setter */ + func = js_dup(func); + ret = JS_CallFree(ctx, func, this_obj, 1, vc(&val)); + JS_FreeValue(ctx, val); + if (JS_IsException(ret)) + return -1; + JS_FreeValue(ctx, ret); + return true; + } else { + JS_FreeValue(ctx, val); + if ((flags & JS_PROP_THROW) || + ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) { + JS_ThrowTypeError(ctx, "no setter for property"); + return -1; + } + return false; + } +} + +/* set the array length and remove the array elements if necessary. */ +static int set_array_length(JSContext *ctx, JSObject *p, JSValue val, + int flags) +{ + uint32_t len, idx, cur_len; + int i, ret; + + /* Note: this call can reallocate the properties of 'p' */ + ret = JS_ToArrayLengthFree(ctx, &len, val, false); + if (ret) + return -1; + /* JS_ToArrayLengthFree() must be done before the read-only test */ + if (unlikely(!(p->shape->prop[0].flags & JS_PROP_WRITABLE))) + return JS_ThrowTypeErrorReadOnly(ctx, flags, JS_ATOM_length); + + if (likely(p->fast_array)) { + uint32_t old_len = p->u.array.count; + if (len < old_len) { + for(i = len; i < old_len; i++) { + JS_FreeValue(ctx, p->u.array.u.values[i]); + } + p->u.array.count = len; + } + p->prop[0].u.value = js_uint32(len); + } else { + /* Note: length is always a uint32 because the object is an + array */ + JS_ToUint32(ctx, &cur_len, p->prop[0].u.value); + if (len < cur_len) { + uint32_t d; + JSShape *sh; + JSShapeProperty *pr; + + d = cur_len - len; + sh = p->shape; + if (d <= sh->prop_count) { + JSAtom atom; + + /* faster to iterate */ + while (cur_len > len) { + atom = JS_NewAtomUInt32(ctx, cur_len - 1); + ret = delete_property(ctx, p, atom); + JS_FreeAtom(ctx, atom); + if (unlikely(!ret)) { + /* unlikely case: property is not + configurable */ + break; + } + cur_len--; + } + } else { + /* faster to iterate thru all the properties. Need two + passes in case one of the property is not + configurable */ + cur_len = len; + for(i = 0, pr = get_shape_prop(sh); i < sh->prop_count; + i++, pr++) { + if (pr->atom != JS_ATOM_NULL && + JS_AtomIsArrayIndex(ctx, &idx, pr->atom)) { + if (idx >= cur_len && + !(pr->flags & JS_PROP_CONFIGURABLE)) { + cur_len = idx + 1; + } + } + } + + for(i = 0, pr = get_shape_prop(sh); i < sh->prop_count; + i++, pr++) { + if (pr->atom != JS_ATOM_NULL && + JS_AtomIsArrayIndex(ctx, &idx, pr->atom)) { + if (idx >= cur_len) { + /* remove the property */ + delete_property(ctx, p, pr->atom); + /* WARNING: the shape may have been modified */ + sh = p->shape; + pr = get_shape_prop(sh) + i; + } + } + } + } + } else { + cur_len = len; + } + set_value(ctx, &p->prop[0].u.value, js_uint32(cur_len)); + if (unlikely(cur_len > len)) { + return JS_ThrowTypeErrorOrFalse(ctx, flags, "not configurable"); + } + } + return true; +} + +/* return -1 if exception */ +static int expand_fast_array(JSContext *ctx, JSObject *p, uint32_t new_len) +{ + uint32_t new_size; + size_t slack; + JSValue *new_array_prop; + /* XXX: potential arithmetic overflow */ + new_size = max_int(new_len, p->u.array.u1.size * 3 / 2); + new_array_prop = js_realloc2(ctx, p->u.array.u.values, sizeof(JSValue) * new_size, &slack); + if (!new_array_prop) + return -1; + new_size += slack / sizeof(*new_array_prop); + p->u.array.u.values = new_array_prop; + p->u.array.u1.size = new_size; + return 0; +} + +/* Preconditions: 'p' must be of class JS_CLASS_ARRAY, p->fast_array = + true and p->extensible = true */ +static int add_fast_array_element(JSContext *ctx, JSObject *p, + JSValue val, int flags) +{ + uint32_t new_len, array_len; + /* extend the array by one */ + /* XXX: convert to slow array if new_len > 2^31-1 elements */ + new_len = p->u.array.count + 1; + /* update the length if necessary. We assume that if the length is + not an integer, then if it >= 2^31. */ + if (likely(JS_VALUE_GET_TAG(p->prop[0].u.value) == JS_TAG_INT)) { + array_len = JS_VALUE_GET_INT(p->prop[0].u.value); + if (new_len > array_len) { + if (unlikely(!(get_shape_prop(p->shape)->flags & JS_PROP_WRITABLE))) { + JS_FreeValue(ctx, val); + return JS_ThrowTypeErrorReadOnly(ctx, flags, JS_ATOM_length); + } + p->prop[0].u.value = js_int32(new_len); + } + } + if (unlikely(new_len > p->u.array.u1.size)) { + if (expand_fast_array(ctx, p, new_len)) { + JS_FreeValue(ctx, val); + return -1; + } + } + p->u.array.u.values[new_len - 1] = val; + p->u.array.count = new_len; + return true; +} + +static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc) +{ + JS_FreeValue(ctx, desc->getter); + JS_FreeValue(ctx, desc->setter); + JS_FreeValue(ctx, desc->value); +} + +/* return -1 in case of exception or true or false. Warning: 'val' is + freed by the function. 'flags' is a bitmask of JS_PROP_NO_ADD, + JS_PROP_THROW or JS_PROP_THROW_STRICT. If JS_PROP_NO_ADD is set, + the new property is not added and an error is raised. + 'obj' must be an object when obj != this_obj. + */ +static int JS_SetPropertyInternal2(JSContext *ctx, JSValueConst obj, JSAtom prop, + JSValue val, JSValueConst this_obj, int flags) +{ + JSObject *p, *p1; + JSShapeProperty *prs; + JSProperty *pr; + JSPropertyDescriptor desc; + int ret; + + switch(JS_VALUE_GET_TAG(this_obj)) { + case JS_TAG_NULL: + JS_ThrowTypeErrorAtom(ctx, "cannot set property '%s' of null", prop); + goto fail; + case JS_TAG_UNDEFINED: + JS_ThrowTypeErrorAtom(ctx, "cannot set property '%s' of undefined", prop); + goto fail; + case JS_TAG_OBJECT: + p = JS_VALUE_GET_OBJ(this_obj); + p1 = JS_VALUE_GET_OBJ(obj); + if (p == p1) + break; + goto retry2; + default: + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + obj = JS_GetPrototypePrimitive(ctx, obj); + p = NULL; + p1 = JS_VALUE_GET_OBJ(obj); + goto prototype_lookup; + } + +retry: + prs = find_own_property(&pr, p1, prop); + if (prs) { + if (likely((prs->flags & (JS_PROP_TMASK | JS_PROP_WRITABLE | + JS_PROP_LENGTH)) == JS_PROP_WRITABLE)) { + /* fast case */ + set_value(ctx, &pr->u.value, val); + return true; + } else if (prs->flags & JS_PROP_LENGTH) { + assert(p->class_id == JS_CLASS_ARRAY); + assert(prop == JS_ATOM_length); + return set_array_length(ctx, p, val, flags); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + return call_setter(ctx, pr->u.getset.setter, this_obj, val, flags); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + /* JS_PROP_WRITABLE is always true for variable + references, but they are write protected in module name + spaces. */ + if (p->class_id == JS_CLASS_MODULE_NS) + goto read_only_prop; + set_value(ctx, pr->u.var_ref->pvalue, val); + return true; + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* Instantiate property and retry (potentially useless) */ + if (JS_AutoInitProperty(ctx, p, prop, pr, prs)) + goto fail; + goto retry; + } else { + goto read_only_prop; + } + } + + for(;;) { + if (p1->is_exotic) { + if (p1->fast_array) { + if (__JS_AtomIsTaggedInt(prop)) { + uint32_t idx = __JS_AtomToUInt32(prop); + if (idx < p1->u.array.count) { + if (unlikely(p == p1)) + return JS_SetPropertyValue(ctx, this_obj, js_int32(idx), val, flags); + else + break; + } else if (is_typed_array(p1->class_id)) { + goto typed_array_oob; + } + } else if (is_typed_array(p1->class_id)) { + ret = JS_AtomIsNumericIndex(ctx, prop); + if (ret != 0) { + if (ret < 0) + goto fail; + typed_array_oob: + // per spec: evaluate value for side effects + if (p1->class_id == JS_CLASS_BIG_INT64_ARRAY || + p1->class_id == JS_CLASS_BIG_UINT64_ARRAY) { + int64_t v; + if (JS_ToBigInt64Free(ctx, &v, val)) + return -1; + } else { + val = JS_ToNumberFree(ctx, val); + JS_FreeValue(ctx, val); + if (JS_IsException(val)) + return -1; + } + return true; + } + } + } else { + const JSClassExoticMethods *em = ctx->rt->class_array[p1->class_id].exotic; + if (em) { + JSValue obj1; + if (em->set_property) { + /* set_property can free the prototype */ + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, p1)); + ret = em->set_property(ctx, obj1, prop, + val, this_obj, flags); + JS_FreeValue(ctx, obj1); + JS_FreeValue(ctx, val); + return ret; + } + if (em->get_own_property) { + /* get_own_property can free the prototype */ + obj1 = js_dup(JS_MKPTR(JS_TAG_OBJECT, p1)); + ret = em->get_own_property(ctx, &desc, + obj1, prop); + JS_FreeValue(ctx, obj1); + if (ret < 0) + goto fail; + if (ret) { + if (desc.flags & JS_PROP_GETSET) { + JSObject *setter; + if (JS_IsUndefined(desc.setter)) + setter = NULL; + else + setter = JS_VALUE_GET_OBJ(desc.setter); + ret = call_setter(ctx, setter, this_obj, val, flags); + JS_FreeValue(ctx, desc.getter); + JS_FreeValue(ctx, desc.setter); + return ret; + } else { + JS_FreeValue(ctx, desc.value); + if (!(desc.flags & JS_PROP_WRITABLE)) + goto read_only_prop; + if (likely(p == p1)) { + ret = JS_DefineProperty(ctx, this_obj, prop, val, + JS_UNDEFINED, JS_UNDEFINED, + JS_PROP_HAS_VALUE); + JS_FreeValue(ctx, val); + return ret; + } else { + break; + } + } + } + } + } + } + } + p1 = p1->shape->proto; + prototype_lookup: + if (!p1) + break; + + retry2: + prs = find_own_property(&pr, p1, prop); + if (prs) { + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + return call_setter(ctx, pr->u.getset.setter, this_obj, val, flags); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* Instantiate property and retry (potentially useless) */ + if (JS_AutoInitProperty(ctx, p1, prop, pr, prs)) + return -1; + goto retry2; + } else if (!(prs->flags & JS_PROP_WRITABLE)) { + goto read_only_prop; + } else { + break; + } + } + } + + if (unlikely(flags & JS_PROP_NO_ADD)) { + JS_ThrowReferenceErrorNotDefined(ctx, prop); + goto fail; + } + + if (unlikely(!p)) { + ret = JS_ThrowTypeErrorOrFalse(ctx, flags, "not an object"); + goto done; + } + + if (unlikely(!p->extensible)) { + ret = JS_ThrowTypeErrorOrFalse(ctx, flags, "object is not extensible"); + goto done; + } + + if (p == JS_VALUE_GET_OBJ(obj)) { + if (p->is_exotic) { + if (p->class_id == JS_CLASS_ARRAY && p->fast_array && + __JS_AtomIsTaggedInt(prop)) { + uint32_t idx = __JS_AtomToUInt32(prop); + if (idx == p->u.array.count) { + /* fast case */ + return add_fast_array_element(ctx, p, val, flags); + } + } + goto generic_create_prop; + } else { + pr = add_property(ctx, p, prop, JS_PROP_C_W_E); + if (!pr) + goto fail; + pr->u.value = val; + return true; + } + } + + // TODO(bnoordhuis) return JSProperty slot and update in place + // when plain property (not is_exotic/setter/etc.) to avoid + // calling find_own_property() thrice? + ret = JS_GetOwnPropertyInternal(ctx, &desc, p, prop); + if (ret < 0) + goto fail; + + if (ret) { + JS_FreeValue(ctx, desc.value); + if (desc.flags & JS_PROP_GETSET) { + JS_FreeValue(ctx, desc.getter); + JS_FreeValue(ctx, desc.setter); + ret = JS_ThrowTypeErrorOrFalse(ctx, flags, "setter is forbidden"); + goto done; + } else if (!(desc.flags & JS_PROP_WRITABLE) || + p->class_id == JS_CLASS_MODULE_NS) { + read_only_prop: + ret = JS_ThrowTypeErrorReadOnly(ctx, flags, prop); + goto done; + } + ret = JS_DefineProperty(ctx, this_obj, prop, val, + JS_UNDEFINED, JS_UNDEFINED, + JS_PROP_HAS_VALUE); + } else { + generic_create_prop: + ret = JS_CreateProperty(ctx, p, prop, val, JS_UNDEFINED, JS_UNDEFINED, + flags | + JS_PROP_HAS_VALUE | + JS_PROP_HAS_ENUMERABLE | + JS_PROP_HAS_WRITABLE | + JS_PROP_HAS_CONFIGURABLE | + JS_PROP_C_W_E); + } + +done: + JS_FreeValue(ctx, val); + return ret; +fail: + JS_FreeValue(ctx, val); + return -1; +} + +static int JS_SetPropertyInternal(JSContext *ctx, JSValueConst obj, JSAtom prop, + JSValue val, int flags) +{ + return JS_SetPropertyInternal2(ctx, obj, prop, val, obj, flags); +} + +int JS_SetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop, JSValue val) +{ + return JS_SetPropertyInternal(ctx, this_obj, prop, val, JS_PROP_THROW); +} + +/* flags can be JS_PROP_THROW or JS_PROP_THROW_STRICT */ +static int JS_SetPropertyValue(JSContext *ctx, JSValueConst this_obj, + JSValue prop, JSValue val, int flags) +{ + if (likely(JS_VALUE_GET_TAG(this_obj) == JS_TAG_OBJECT && + JS_VALUE_GET_TAG(prop) == JS_TAG_INT)) { + JSObject *p; + uint32_t idx; + double d; + int32_t v; + + /* fast path for array access */ + p = JS_VALUE_GET_OBJ(this_obj); + idx = JS_VALUE_GET_INT(prop); + switch(p->class_id) { + case JS_CLASS_ARRAY: + if (unlikely(idx >= (uint32_t)p->u.array.count)) { + JSObject *p1; + JSShape *sh1; + + /* fast path to add an element to the array */ + if (idx != (uint32_t)p->u.array.count || + !p->fast_array || !p->extensible) + goto slow_path; + /* check if prototype chain has a numeric property */ + p1 = p->shape->proto; + while (p1 != NULL) { + sh1 = p1->shape; + if (p1->class_id == JS_CLASS_ARRAY) { + if (unlikely(!p1->fast_array)) + goto slow_path; + } else if (p1->class_id == JS_CLASS_OBJECT) { + if (unlikely(sh1->has_small_array_index)) + goto slow_path; + } else { + goto slow_path; + } + p1 = sh1->proto; + } + /* add element */ + return add_fast_array_element(ctx, p, val, flags); + } + set_value(ctx, &p->u.array.u.values[idx], val); + break; + case JS_CLASS_ARGUMENTS: + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto slow_path; + set_value(ctx, &p->u.array.u.values[idx], val); + break; + case JS_CLASS_UINT8C_ARRAY: + if (JS_ToUint8ClampFree(ctx, &v, val)) + goto ta_cvt_fail; + /* Note: the conversion can detach the typed array, so the + array bound check must be done after */ + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.uint8_ptr[idx] = v; + break; + case JS_CLASS_INT8_ARRAY: + case JS_CLASS_UINT8_ARRAY: + if (JS_ToInt32Free(ctx, &v, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.uint8_ptr[idx] = v; + break; + case JS_CLASS_INT16_ARRAY: + case JS_CLASS_UINT16_ARRAY: + if (JS_ToInt32Free(ctx, &v, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.uint16_ptr[idx] = v; + break; + case JS_CLASS_INT32_ARRAY: + case JS_CLASS_UINT32_ARRAY: + if (JS_ToInt32Free(ctx, &v, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.uint32_ptr[idx] = v; + break; + case JS_CLASS_BIG_INT64_ARRAY: + case JS_CLASS_BIG_UINT64_ARRAY: + /* XXX: need specific conversion function */ + { + int64_t v; + if (JS_ToBigInt64Free(ctx, &v, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.uint64_ptr[idx] = v; + } + break; + case JS_CLASS_FLOAT16_ARRAY: + if (JS_ToFloat64Free(ctx, &d, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.fp16_ptr[idx] = tofp16(d); + break; + case JS_CLASS_FLOAT32_ARRAY: + if (JS_ToFloat64Free(ctx, &d, val)) + goto ta_cvt_fail; + if (unlikely(idx >= (uint32_t)p->u.array.count)) + goto ta_out_of_bound; + p->u.array.u.float_ptr[idx] = d; + break; + case JS_CLASS_FLOAT64_ARRAY: + if (JS_ToFloat64Free(ctx, &d, val)) { + ta_cvt_fail: + if (flags & JS_PROP_REFLECT_DEFINE_PROPERTY) { + JS_FreeValue(ctx, JS_GetException(ctx)); + return false; + } + return -1; + } + if (unlikely(idx >= (uint32_t)p->u.array.count)) { + ta_out_of_bound: + if (typed_array_is_oob(p)) + if (flags & JS_PROP_DEFINE_PROPERTY) + return JS_ThrowTypeErrorOrFalse(ctx, flags, "out-of-bound numeric index"); + return true; // per spec: no OOB exception + } + p->u.array.u.double_ptr[idx] = d; + break; + default: + goto slow_path; + } + return true; + } else { + JSAtom atom; + int ret; + slow_path: + atom = JS_ValueToAtom(ctx, prop); + JS_FreeValue(ctx, prop); + if (unlikely(atom == JS_ATOM_NULL)) { + JS_FreeValue(ctx, val); + return -1; + } + ret = JS_SetPropertyInternal(ctx, this_obj, atom, val, flags); + JS_FreeAtom(ctx, atom); + return ret; + } +} + +int JS_SetPropertyUint32(JSContext *ctx, JSValueConst this_obj, + uint32_t idx, JSValue val) +{ + return JS_SetPropertyValue(ctx, this_obj, js_uint32(idx), val, + JS_PROP_THROW); +} + +int JS_SetPropertyInt64(JSContext *ctx, JSValueConst this_obj, + int64_t idx, JSValue val) +{ + JSAtom prop; + int res; + + if ((uint64_t)idx <= INT32_MAX) { + /* fast path for fast arrays */ + return JS_SetPropertyValue(ctx, this_obj, js_int32(idx), val, + JS_PROP_THROW); + } + prop = JS_NewAtomInt64(ctx, idx); + if (prop == JS_ATOM_NULL) { + JS_FreeValue(ctx, val); + return -1; + } + res = JS_SetProperty(ctx, this_obj, prop, val); + JS_FreeAtom(ctx, prop); + return res; +} + +/* `prop` may be pure ASCII or UTF-8 encoded */ +int JS_SetPropertyStr(JSContext *ctx, JSValueConst this_obj, + const char *prop, JSValue val) +{ + JSAtom atom; + int ret; + atom = JS_NewAtom(ctx, prop); + if (atom == JS_ATOM_NULL) { + JS_FreeValue(ctx, val); + return -1; + } + ret = JS_SetPropertyInternal(ctx, this_obj, atom, val, JS_PROP_THROW); + JS_FreeAtom(ctx, atom); + return ret; +} + +/* compute the property flags. For each flag: (JS_PROP_HAS_x forces + it, otherwise def_flags is used) + Note: makes assumption about the bit pattern of the flags +*/ +static int get_prop_flags(int flags, int def_flags) +{ + int mask; + mask = (flags >> JS_PROP_HAS_SHIFT) & JS_PROP_C_W_E; + return (flags & mask) | (def_flags & ~mask); +} + +static int JS_CreateProperty(JSContext *ctx, JSObject *p, + JSAtom prop, JSValueConst val, + JSValueConst getter, JSValueConst setter, + int flags) +{ + JSProperty *pr; + int ret, prop_flags; + + /* add a new property or modify an existing exotic one */ + if (p->is_exotic) { + if (p->class_id == JS_CLASS_ARRAY) { + uint32_t idx, len; + + if (p->fast_array) { + if (__JS_AtomIsTaggedInt(prop)) { + idx = __JS_AtomToUInt32(prop); + if (idx == p->u.array.count) { + if (!p->extensible) + goto not_extensible; + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) + goto convert_to_array; + prop_flags = get_prop_flags(flags, 0); + if (prop_flags != JS_PROP_C_W_E) + goto convert_to_array; + return add_fast_array_element(ctx, p, + js_dup(val), flags); + } else { + goto convert_to_array; + } + } else if (JS_AtomIsArrayIndex(ctx, &idx, prop)) { + /* convert the fast array to normal array */ + convert_to_array: + if (convert_fast_array_to_array(ctx, p)) + return -1; + goto generic_array; + } + } else if (JS_AtomIsArrayIndex(ctx, &idx, prop)) { + JSProperty *plen; + JSShapeProperty *pslen; + generic_array: + /* update the length field */ + plen = &p->prop[0]; + JS_ToUint32(ctx, &len, plen->u.value); + if ((idx + 1) > len) { + pslen = get_shape_prop(p->shape); + if (unlikely(!(pslen->flags & JS_PROP_WRITABLE))) + return JS_ThrowTypeErrorReadOnly(ctx, flags, JS_ATOM_length); + /* XXX: should update the length after defining + the property */ + len = idx + 1; + set_value(ctx, &plen->u.value, js_uint32(len)); + } + } + } else if (is_typed_array(p->class_id)) { + ret = JS_AtomIsNumericIndex(ctx, prop); + if (ret != 0) { + if (ret < 0) + return -1; + return JS_ThrowTypeErrorOrFalse(ctx, flags, "cannot create numeric index in typed array"); + } + } else if (!(flags & JS_PROP_NO_EXOTIC)) { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + if (em) { + if (em->define_own_property) { + return em->define_own_property(ctx, JS_MKPTR(JS_TAG_OBJECT, p), + prop, val, getter, setter, flags); + } + ret = JS_IsExtensible(ctx, JS_MKPTR(JS_TAG_OBJECT, p)); + if (ret < 0) + return -1; + if (!ret) + goto not_extensible; + } + } + } + + if (!p->extensible) { + not_extensible: + return JS_ThrowTypeErrorOrFalse(ctx, flags, "object is not extensible"); + } + + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + prop_flags = (flags & (JS_PROP_CONFIGURABLE | JS_PROP_ENUMERABLE)) | + JS_PROP_GETSET; + } else { + prop_flags = flags & JS_PROP_C_W_E; + } + pr = add_property(ctx, p, prop, prop_flags); + if (unlikely(!pr)) + return -1; + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + pr->u.getset.getter = NULL; + if ((flags & JS_PROP_HAS_GET) && JS_IsFunction(ctx, getter)) { + pr->u.getset.getter = + JS_VALUE_GET_OBJ(js_dup(getter)); + } + pr->u.getset.setter = NULL; + if ((flags & JS_PROP_HAS_SET) && JS_IsFunction(ctx, setter)) { + pr->u.getset.setter = + JS_VALUE_GET_OBJ(js_dup(setter)); + } + } else { + if (flags & JS_PROP_HAS_VALUE) { + pr->u.value = js_dup(val); + } else { + pr->u.value = JS_UNDEFINED; + } + } + return true; +} + +/* return false if not OK */ +static bool check_define_prop_flags(int prop_flags, int flags) +{ + bool has_accessor, is_getset; + + if (!(prop_flags & JS_PROP_CONFIGURABLE)) { + if ((flags & (JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE)) == + (JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE)) { + return false; + } + if ((flags & JS_PROP_HAS_ENUMERABLE) && + (flags & JS_PROP_ENUMERABLE) != (prop_flags & JS_PROP_ENUMERABLE)) + return false; + } + if (flags & (JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | + JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + if (!(prop_flags & JS_PROP_CONFIGURABLE)) { + has_accessor = ((flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) != 0); + is_getset = ((prop_flags & JS_PROP_TMASK) == JS_PROP_GETSET); + if (has_accessor != is_getset) + return false; + if (!has_accessor && !is_getset && !(prop_flags & JS_PROP_WRITABLE)) { + /* not writable: cannot set the writable bit */ + if ((flags & (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE)) == + (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE)) + return false; + } + } + } + return true; +} + +/* ensure that the shape can be safely modified */ +static int js_shape_prepare_update(JSContext *ctx, JSObject *p, + JSShapeProperty **pprs) +{ + JSShape *sh; + uint32_t idx = 0; /* prevent warning */ + + sh = p->shape; + if (sh->is_hashed) { + if (sh->header.ref_count != 1) { + if (pprs) + idx = *pprs - get_shape_prop(sh); + /* clone the shape (the resulting one is no longer hashed) */ + sh = js_clone_shape(ctx, sh); + if (!sh) + return -1; + js_free_shape(ctx->rt, p->shape); + p->shape = sh; + if (pprs) + *pprs = get_shape_prop(sh) + idx; + } else { + js_shape_hash_unlink(ctx->rt, sh); + sh->is_hashed = false; + } + } + return 0; +} + +static int js_update_property_flags(JSContext *ctx, JSObject *p, + JSShapeProperty **pprs, int flags) +{ + if (flags != (*pprs)->flags) { + if (js_shape_prepare_update(ctx, p, pprs)) + return -1; + (*pprs)->flags = flags; + } + return 0; +} + +/* allowed flags: + JS_PROP_CONFIGURABLE, JS_PROP_WRITABLE, JS_PROP_ENUMERABLE + JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE, + JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_ENUMERABLE, + JS_PROP_THROW, JS_PROP_NO_EXOTIC. + If JS_PROP_THROW is set, return an exception instead of false. + if JS_PROP_NO_EXOTIC is set, do not call the exotic + define_own_property callback. + return -1 (exception), false or true. +*/ +int JS_DefineProperty(JSContext *ctx, JSValueConst this_obj, + JSAtom prop, JSValueConst val, + JSValueConst getter, JSValueConst setter, int flags) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + int mask, res; + + if (JS_VALUE_GET_TAG(this_obj) != JS_TAG_OBJECT) { + JS_ThrowTypeErrorNotAnObject(ctx); + return -1; + } + p = JS_VALUE_GET_OBJ(this_obj); + + redo_prop_update: + prs = find_own_property(&pr, p, prop); + if (prs) { + /* the range of the Array length property is always tested before */ + if ((prs->flags & JS_PROP_LENGTH) && (flags & JS_PROP_HAS_VALUE)) { + uint32_t array_length; + if (JS_ToArrayLengthFree(ctx, &array_length, + js_dup(val), false)) { + return -1; + } + /* this code relies on the fact that Uint32 are never allocated */ + val = js_uint32(array_length); + /* prs may have been modified */ + prs = find_own_property(&pr, p, prop); + assert(prs != NULL); + } + /* property already exists */ + if (!check_define_prop_flags(prs->flags, flags)) { + not_configurable: + return JS_ThrowTypeErrorOrFalse(ctx, flags, "property is not configurable"); + } + + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + /* Instantiate property and retry */ + if (JS_AutoInitProperty(ctx, p, prop, pr, prs)) + return -1; + goto redo_prop_update; + } + + if (flags & (JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | + JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + JSObject *new_getter, *new_setter; + + if (JS_IsFunction(ctx, getter)) { + new_getter = JS_VALUE_GET_OBJ(getter); + } else { + new_getter = NULL; + } + if (JS_IsFunction(ctx, setter)) { + new_setter = JS_VALUE_GET_OBJ(setter); + } else { + new_setter = NULL; + } + + if ((prs->flags & JS_PROP_TMASK) != JS_PROP_GETSET) { + if (js_shape_prepare_update(ctx, p, &prs)) + return -1; + /* convert to getset */ + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + free_var_ref(ctx->rt, pr->u.var_ref); + } else { + JS_FreeValue(ctx, pr->u.value); + } + prs->flags = (prs->flags & + (JS_PROP_CONFIGURABLE | JS_PROP_ENUMERABLE)) | + JS_PROP_GETSET; + pr->u.getset.getter = NULL; + pr->u.getset.setter = NULL; + } else { + if (!(prs->flags & JS_PROP_CONFIGURABLE)) { + if ((flags & JS_PROP_HAS_GET) && + new_getter != pr->u.getset.getter) { + goto not_configurable; + } + if ((flags & JS_PROP_HAS_SET) && + new_setter != pr->u.getset.setter) { + goto not_configurable; + } + } + } + if (flags & JS_PROP_HAS_GET) { + if (pr->u.getset.getter) + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.getter)); + if (new_getter) + js_dup(getter); + pr->u.getset.getter = new_getter; + } + if (flags & JS_PROP_HAS_SET) { + if (pr->u.getset.setter) + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.setter)); + if (new_setter) + js_dup(setter); + pr->u.getset.setter = new_setter; + } + } else { + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + /* convert to data descriptor */ + if (js_shape_prepare_update(ctx, p, &prs)) + return -1; + if (pr->u.getset.getter) + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.getter)); + if (pr->u.getset.setter) + JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, pr->u.getset.setter)); + prs->flags &= ~(JS_PROP_TMASK | JS_PROP_WRITABLE); + pr->u.value = JS_UNDEFINED; + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + /* Note: JS_PROP_VARREF is always writable */ + } else { + if ((prs->flags & (JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE)) == 0 && + (flags & JS_PROP_HAS_VALUE)) { + if (!js_same_value(ctx, val, pr->u.value)) { + goto not_configurable; + } else { + return true; + } + } + } + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + if (flags & JS_PROP_HAS_VALUE) { + if (p->class_id == JS_CLASS_MODULE_NS) { + /* JS_PROP_WRITABLE is always true for variable + references, but they are write protected in module name + spaces. */ + if (!js_same_value(ctx, val, *pr->u.var_ref->pvalue)) + goto not_configurable; + } + /* update the reference */ + set_value(ctx, pr->u.var_ref->pvalue, js_dup(val)); + } + /* if writable is set to false, no longer a + reference (for mapped arguments) */ + if ((flags & (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE)) == JS_PROP_HAS_WRITABLE) { + JSValue val1; + if (js_shape_prepare_update(ctx, p, &prs)) + return -1; + val1 = js_dup(*pr->u.var_ref->pvalue); + free_var_ref(ctx->rt, pr->u.var_ref); + pr->u.value = val1; + prs->flags &= ~(JS_PROP_TMASK | JS_PROP_WRITABLE); + } + } else if (prs->flags & JS_PROP_LENGTH) { + if (flags & JS_PROP_HAS_VALUE) { + /* Note: no JS code is executable because + 'val' is guaranted to be a Uint32 */ + res = set_array_length(ctx, p, js_dup(val), flags); + } else { + res = true; + } + /* still need to reset the writable flag if + needed. The JS_PROP_LENGTH is kept because the + Uint32 test is still done if the length + property is read-only. */ + if ((flags & (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE)) == + JS_PROP_HAS_WRITABLE) { + prs = get_shape_prop(p->shape); + if (js_update_property_flags(ctx, p, &prs, + prs->flags & ~JS_PROP_WRITABLE)) + return -1; + } + return res; + } else { + if (flags & JS_PROP_HAS_VALUE) { + JS_FreeValue(ctx, pr->u.value); + pr->u.value = js_dup(val); + } + if (flags & JS_PROP_HAS_WRITABLE) { + if (js_update_property_flags(ctx, p, &prs, + (prs->flags & ~JS_PROP_WRITABLE) | + (flags & JS_PROP_WRITABLE))) + return -1; + } + } + } + } + mask = 0; + if (flags & JS_PROP_HAS_CONFIGURABLE) + mask |= JS_PROP_CONFIGURABLE; + if (flags & JS_PROP_HAS_ENUMERABLE) + mask |= JS_PROP_ENUMERABLE; + if (js_update_property_flags(ctx, p, &prs, + (prs->flags & ~mask) | (flags & mask))) + return -1; + return true; + } + + /* handle modification of fast array elements */ + if (p->fast_array) { + uint32_t idx; + uint32_t prop_flags; + if (p->class_id == JS_CLASS_ARRAY) { + if (__JS_AtomIsTaggedInt(prop)) { + idx = __JS_AtomToUInt32(prop); + if (idx < p->u.array.count) { + prop_flags = get_prop_flags(flags, JS_PROP_C_W_E); + if (prop_flags != JS_PROP_C_W_E) + goto convert_to_slow_array; + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) { + convert_to_slow_array: + if (convert_fast_array_to_array(ctx, p)) + return -1; + else + goto redo_prop_update; + } + if (flags & JS_PROP_HAS_VALUE) { + set_value(ctx, &p->u.array.u.values[idx], js_dup(val)); + } + return true; + } + } + } else if (is_typed_array(p->class_id)) { + JSValue num; + int ret; + + if (!__JS_AtomIsTaggedInt(prop)) { + /* slow path with to handle all numeric indexes */ + num = JS_AtomIsNumericIndex1(ctx, prop); + if (JS_IsUndefined(num)) + goto typed_array_done; + if (JS_IsException(num)) + return -1; + ret = JS_NumberIsInteger(ctx, num); + if (ret < 0) { + JS_FreeValue(ctx, num); + return -1; + } + if (!ret) { + JS_FreeValue(ctx, num); + return JS_ThrowTypeErrorOrFalse(ctx, flags, "non integer index in typed array"); + } + ret = JS_NumberIsNegativeOrMinusZero(ctx, num); + JS_FreeValue(ctx, num); + if (ret) { + return JS_ThrowTypeErrorOrFalse(ctx, flags, "negative index in typed array"); + } + if (!__JS_AtomIsTaggedInt(prop)) + goto typed_array_oob; + } + idx = __JS_AtomToUInt32(prop); + /* if the typed array is detached, p->u.array.count = 0 */ + if (idx >= p->u.array.count) { + typed_array_oob: + return JS_ThrowTypeErrorOrFalse(ctx, flags, "out-of-bound index in typed array"); + } + prop_flags = get_prop_flags(flags, JS_PROP_ENUMERABLE | JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + if (flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET) || + prop_flags != (JS_PROP_ENUMERABLE | JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE)) { + return JS_ThrowTypeErrorOrFalse(ctx, flags, "invalid descriptor flags"); + } + if (flags & JS_PROP_HAS_VALUE) { + return JS_SetPropertyValue(ctx, this_obj, js_int32(idx), js_dup(val), flags); + } + return true; + typed_array_done: ; + } + } + + return JS_CreateProperty(ctx, p, prop, val, getter, setter, flags); +} + +static int JS_DefineAutoInitProperty(JSContext *ctx, JSValueConst this_obj, + JSAtom prop, JSAutoInitIDEnum id, + void *opaque, int flags) +{ + JSObject *p; + JSProperty *pr; + + if (JS_VALUE_GET_TAG(this_obj) != JS_TAG_OBJECT) + return false; + + p = JS_VALUE_GET_OBJ(this_obj); + + if (find_own_property(&pr, p, prop)) { + /* property already exists */ + abort(); + return false; + } + + /* Specialized CreateProperty */ + pr = add_property(ctx, p, prop, (flags & JS_PROP_C_W_E) | JS_PROP_AUTOINIT); + if (unlikely(!pr)) + return -1; + pr->u.init.realm_and_id = (uintptr_t)JS_DupContext(ctx); + assert((pr->u.init.realm_and_id & 3) == 0); + assert(id <= 3); + pr->u.init.realm_and_id |= id; + pr->u.init.opaque = opaque; + return true; +} + +/* shortcut to add or redefine a new property value */ +int JS_DefinePropertyValue(JSContext *ctx, JSValueConst this_obj, + JSAtom prop, JSValue val, int flags) +{ + int ret; + ret = JS_DefineProperty(ctx, this_obj, prop, val, JS_UNDEFINED, JS_UNDEFINED, + flags | JS_PROP_HAS_VALUE | JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE); + JS_FreeValue(ctx, val); + return ret; +} + +int JS_DefinePropertyValueValue(JSContext *ctx, JSValueConst this_obj, + JSValue prop, JSValue val, int flags) +{ + JSAtom atom; + int ret; + atom = JS_ValueToAtom(ctx, prop); + JS_FreeValue(ctx, prop); + if (unlikely(atom == JS_ATOM_NULL)) { + JS_FreeValue(ctx, val); + return -1; + } + ret = JS_DefinePropertyValue(ctx, this_obj, atom, val, flags); + JS_FreeAtom(ctx, atom); + return ret; +} + +int JS_DefinePropertyValueUint32(JSContext *ctx, JSValueConst this_obj, + uint32_t idx, JSValue val, int flags) +{ + return JS_DefinePropertyValueValue(ctx, this_obj, js_uint32(idx), + val, flags); +} + +int JS_DefinePropertyValueInt64(JSContext *ctx, JSValueConst this_obj, + int64_t idx, JSValue val, int flags) +{ + return JS_DefinePropertyValueValue(ctx, this_obj, js_int64(idx), + val, flags); +} + +/* `prop` may be pure ASCII or UTF-8 encoded */ +int JS_DefinePropertyValueStr(JSContext *ctx, JSValueConst this_obj, + const char *prop, JSValue val, int flags) +{ + JSAtom atom; + int ret; + atom = JS_NewAtom(ctx, prop); + if (atom == JS_ATOM_NULL) { + JS_FreeValue(ctx, val); + return -1; + } + ret = JS_DefinePropertyValue(ctx, this_obj, atom, val, flags); + JS_FreeAtom(ctx, atom); + return ret; +} + +/* shortcut to add getter & setter */ +int JS_DefinePropertyGetSet(JSContext *ctx, JSValueConst this_obj, + JSAtom prop, JSValue getter, JSValue setter, + int flags) +{ + int ret; + ret = JS_DefineProperty(ctx, this_obj, prop, JS_UNDEFINED, getter, setter, + flags | JS_PROP_HAS_GET | JS_PROP_HAS_SET | + JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_ENUMERABLE); + JS_FreeValue(ctx, getter); + JS_FreeValue(ctx, setter); + return ret; +} + +static int JS_CreateDataPropertyUint32(JSContext *ctx, JSValueConst this_obj, + int64_t idx, JSValue val, int flags) +{ + return JS_DefinePropertyValueValue(ctx, this_obj, js_int64(idx), + val, flags | JS_PROP_CONFIGURABLE | + JS_PROP_ENUMERABLE | JS_PROP_WRITABLE); +} + + +/* return true if 'obj' has a non empty 'name' string */ +static bool js_object_has_name(JSContext *ctx, JSValue obj) +{ + JSProperty *pr; + JSShapeProperty *prs; + JSValue val; + JSString *p; + + prs = find_own_property(&pr, JS_VALUE_GET_OBJ(obj), JS_ATOM_name); + if (!prs) + return false; + if ((prs->flags & JS_PROP_TMASK) != JS_PROP_NORMAL) + return true; + val = pr->u.value; + if (JS_VALUE_GET_TAG(val) != JS_TAG_STRING) + return true; + p = JS_VALUE_GET_STRING(val); + return (p->len != 0); +} + +static int JS_DefineObjectName(JSContext *ctx, JSValue obj, + JSAtom name, int flags) +{ + if (name != JS_ATOM_NULL + && JS_IsObject(obj) + && !js_object_has_name(ctx, obj) + && JS_DefinePropertyValue(ctx, obj, JS_ATOM_name, JS_AtomToString(ctx, name), flags) < 0) { + return -1; + } + return 0; +} + +static int JS_DefineObjectNameComputed(JSContext *ctx, JSValue obj, + JSValue str, int flags) +{ + if (JS_IsObject(obj) && + !js_object_has_name(ctx, obj)) { + JSAtom prop; + JSValue name_str; + prop = JS_ValueToAtom(ctx, str); + if (prop == JS_ATOM_NULL) + return -1; + name_str = js_get_function_name(ctx, prop); + JS_FreeAtom(ctx, prop); + if (JS_IsException(name_str)) + return -1; + if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_name, name_str, flags) < 0) + return -1; + } + return 0; +} + +#define DEFINE_GLOBAL_LEX_VAR (1 << 7) +#define DEFINE_GLOBAL_FUNC_VAR (1 << 6) + +static JSValue JS_ThrowSyntaxErrorVarRedeclaration(JSContext *ctx, JSAtom prop) +{ + return JS_ThrowSyntaxErrorAtom(ctx, "redeclaration of '%s'", prop); +} + +/* flags is 0, DEFINE_GLOBAL_LEX_VAR or DEFINE_GLOBAL_FUNC_VAR */ +/* XXX: could support exotic global object. */ +static int JS_CheckDefineGlobalVar(JSContext *ctx, JSAtom prop, int flags) +{ + JSObject *p; + JSShapeProperty *prs; + + p = JS_VALUE_GET_OBJ(ctx->global_obj); + prs = find_own_property1(p, prop); + /* XXX: should handle JS_PROP_AUTOINIT */ + if (flags & DEFINE_GLOBAL_LEX_VAR) { + if (prs && !(prs->flags & JS_PROP_CONFIGURABLE)) + goto fail_redeclaration; + } else { + if (!prs && !p->extensible) + goto define_error; + if (flags & DEFINE_GLOBAL_FUNC_VAR) { + if (prs) { + if (!(prs->flags & JS_PROP_CONFIGURABLE) && + ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET || + ((prs->flags & (JS_PROP_WRITABLE | JS_PROP_ENUMERABLE)) != + (JS_PROP_WRITABLE | JS_PROP_ENUMERABLE)))) { + define_error: + JS_ThrowTypeErrorAtom(ctx, "cannot define variable '%s'", + prop); + return -1; + } + } + } + } + /* check if there already is a lexical declaration */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property1(p, prop); + if (prs) { + fail_redeclaration: + JS_ThrowSyntaxErrorVarRedeclaration(ctx, prop); + return -1; + } + return 0; +} + +/* def_flags is (0, DEFINE_GLOBAL_LEX_VAR) | + JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE */ +/* XXX: could support exotic global object. */ +static int JS_DefineGlobalVar(JSContext *ctx, JSAtom prop, int def_flags) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + JSValue val; + int flags; + + if (def_flags & DEFINE_GLOBAL_LEX_VAR) { + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + flags = JS_PROP_ENUMERABLE | (def_flags & JS_PROP_WRITABLE) | + JS_PROP_CONFIGURABLE; + val = JS_UNINITIALIZED; + } else { + p = JS_VALUE_GET_OBJ(ctx->global_obj); + flags = JS_PROP_ENUMERABLE | JS_PROP_WRITABLE | + (def_flags & JS_PROP_CONFIGURABLE); + val = JS_UNDEFINED; + } + prs = find_own_property1(p, prop); + if (prs) + return 0; + if (!p->extensible) + return 0; + pr = add_property(ctx, p, prop, flags); + if (unlikely(!pr)) + return -1; + pr->u.value = val; + return 0; +} + +/* 'def_flags' is 0 or JS_PROP_CONFIGURABLE. */ +/* XXX: could support exotic global object. */ +static int JS_DefineGlobalFunction(JSContext *ctx, JSAtom prop, + JSValue func, int def_flags) +{ + + JSObject *p; + JSShapeProperty *prs; + int flags; + + p = JS_VALUE_GET_OBJ(ctx->global_obj); + prs = find_own_property1(p, prop); + flags = JS_PROP_HAS_VALUE | JS_PROP_THROW; + if (!prs || (prs->flags & JS_PROP_CONFIGURABLE)) { + flags |= JS_PROP_ENUMERABLE | JS_PROP_WRITABLE | def_flags | + JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE; + } + if (JS_DefineProperty(ctx, ctx->global_obj, prop, func, + JS_UNDEFINED, JS_UNDEFINED, flags) < 0) + return -1; + return 0; +} + +static JSValue JS_GetGlobalVar(JSContext *ctx, JSAtom prop, + bool throw_ref_error) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + + /* no exotic behavior is possible in global_var_obj */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property(&pr, p, prop); + if (prs) { + /* XXX: should handle JS_PROP_TMASK properties */ + if (unlikely(JS_IsUninitialized(pr->u.value))) + return JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return js_dup(pr->u.value); + } + return JS_GetPropertyInternal(ctx, ctx->global_obj, prop, + ctx->global_obj, throw_ref_error); +} + +/* construct a reference to a global variable */ +static int JS_GetGlobalVarRef(JSContext *ctx, JSAtom prop, JSValue *sp) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + + /* no exotic behavior is possible in global_var_obj */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property(&pr, p, prop); + if (prs) { + /* XXX: should handle JS_PROP_AUTOINIT properties? */ + /* XXX: conformance: do these tests in + OP_put_var_ref/OP_get_var_ref ? */ + if (unlikely(JS_IsUninitialized(pr->u.value))) { + JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return -1; + } + if (unlikely(!(prs->flags & JS_PROP_WRITABLE))) { + return JS_ThrowTypeErrorReadOnly(ctx, JS_PROP_THROW, prop); + } + sp[0] = js_dup(ctx->global_var_obj); + } else { + int ret; + ret = JS_HasProperty(ctx, ctx->global_obj, prop); + if (ret < 0) + return -1; + if (ret) { + sp[0] = js_dup(ctx->global_obj); + } else { + sp[0] = JS_UNDEFINED; + } + } + sp[1] = JS_AtomToValue(ctx, prop); + return 0; +} + +/* use for strict variable access: test if the variable exists */ +static int JS_CheckGlobalVar(JSContext *ctx, JSAtom prop) +{ + JSObject *p; + JSShapeProperty *prs; + int ret; + + /* no exotic behavior is possible in global_var_obj */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property1(p, prop); + if (prs) { + ret = true; + } else { + ret = JS_HasProperty(ctx, ctx->global_obj, prop); + if (ret < 0) + return -1; + } + return ret; +} + +/* flag = 0: normal variable write + flag = 1: initialize lexical variable + flag = 2: normal variable write, strict check was done before +*/ +static int JS_SetGlobalVar(JSContext *ctx, JSAtom prop, JSValue val, + int flag) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + int flags; + + /* no exotic behavior is possible in global_var_obj */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property(&pr, p, prop); + if (prs) { + /* XXX: should handle JS_PROP_AUTOINIT properties? */ + if (flag != 1) { + if (unlikely(JS_IsUninitialized(pr->u.value))) { + JS_FreeValue(ctx, val); + JS_ThrowReferenceErrorUninitialized(ctx, prs->atom); + return -1; + } + if (unlikely(!(prs->flags & JS_PROP_WRITABLE))) { + JS_FreeValue(ctx, val); + return JS_ThrowTypeErrorReadOnly(ctx, JS_PROP_THROW, prop); + } + } + set_value(ctx, &pr->u.value, val); + return 0; + } + flags = JS_PROP_THROW_STRICT; + if (is_strict_mode(ctx)) + flags |= JS_PROP_NO_ADD; + return JS_SetPropertyInternal(ctx, ctx->global_obj, prop, val, flags); +} + +/* return -1, false or true */ +static int JS_DeleteGlobalVar(JSContext *ctx, JSAtom prop) +{ + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + int ret; + + /* 9.1.1.4.7 DeleteBinding ( N ) */ + p = JS_VALUE_GET_OBJ(ctx->global_var_obj); + prs = find_own_property(&pr, p, prop); + if (prs) + return false; /* lexical variables cannot be deleted */ + ret = JS_HasProperty(ctx, ctx->global_obj, prop); + if (ret < 0) + return -1; + if (ret) { + return JS_DeleteProperty(ctx, ctx->global_obj, prop, 0); + } else { + return true; + } +} + +/* return -1, false or true. return false if not configurable or + invalid object. return -1 in case of exception. + flags can be 0, JS_PROP_THROW or JS_PROP_THROW_STRICT */ +int JS_DeleteProperty(JSContext *ctx, JSValueConst obj, JSAtom prop, int flags) +{ + JSValue obj1; + JSObject *p; + int res; + + obj1 = JS_ToObject(ctx, obj); + if (JS_IsException(obj1)) + return -1; + p = JS_VALUE_GET_OBJ(obj1); + res = delete_property(ctx, p, prop); + JS_FreeValue(ctx, obj1); + if (res != false) + return res; + if ((flags & JS_PROP_THROW) || + ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) { + JS_ThrowTypeError(ctx, "could not delete property"); + return -1; + } + return false; +} + +int JS_DeletePropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx, int flags) +{ + JSAtom prop; + int res; + + if ((uint64_t)idx <= JS_ATOM_MAX_INT) { + /* fast path for fast arrays */ + return JS_DeleteProperty(ctx, obj, __JS_AtomFromUInt32(idx), flags); + } + prop = JS_NewAtomInt64(ctx, idx); + if (prop == JS_ATOM_NULL) + return -1; + res = JS_DeleteProperty(ctx, obj, prop, flags); + JS_FreeAtom(ctx, prop); + return res; +} + +bool JS_IsFunction(JSContext *ctx, JSValueConst val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(val); + switch(p->class_id) { + case JS_CLASS_BYTECODE_FUNCTION: + return true; + case JS_CLASS_PROXY: + return p->u.proxy_data->is_func; + default: + return (ctx->rt->class_array[p->class_id].call != NULL); + } +} + +static bool JS_IsCFunction(JSContext *ctx, JSValueConst val, JSCFunction *func, + int magic) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(val); + if (p->class_id == JS_CLASS_C_FUNCTION) + return (p->u.cfunc.c_function.generic == func && p->u.cfunc.magic == magic); + else + return false; +} + +bool JS_IsConstructor(JSContext *ctx, JSValueConst val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(val); + return p->is_constructor; +} + +bool JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, bool val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(func_obj); + p->is_constructor = val; + return true; +} + +bool JS_IsRegExp(JSValueConst val) +{ + return JS_CLASS_REGEXP == JS_GetClassID(val); +} + +bool JS_IsMap(JSValueConst val) +{ + return JS_CLASS_MAP == JS_GetClassID(val); +} + +bool JS_IsSet(JSValueConst val) +{ + return JS_CLASS_SET == JS_GetClassID(val); +} + +bool JS_IsWeakRef(JSValueConst val) +{ + return JS_CLASS_WEAK_REF == JS_GetClassID(val); +} + +bool JS_IsWeakSet(JSValueConst val) +{ + return JS_CLASS_WEAKSET == JS_GetClassID(val); +} + +bool JS_IsWeakMap(JSValueConst val) +{ + return JS_CLASS_WEAKMAP == JS_GetClassID(val); +} + +bool JS_IsDataView(JSValueConst val) +{ + return JS_CLASS_DATAVIEW == JS_GetClassID(val); +} + +bool JS_IsError(JSValueConst val) +{ + return JS_CLASS_ERROR == JS_GetClassID(val); +} + +/* used to avoid catching interrupt exceptions */ +bool JS_IsUncatchableError(JSValueConst val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(val); + return p->class_id == JS_CLASS_ERROR && p->is_uncatchable_error; +} + +static void js_set_uncatchable_error(JSContext *ctx, JSValueConst val, bool flag) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return; + p = JS_VALUE_GET_OBJ(val); + if (p->class_id == JS_CLASS_ERROR) + p->is_uncatchable_error = flag; +} + +void JS_SetUncatchableError(JSContext *ctx, JSValueConst val) +{ + js_set_uncatchable_error(ctx, val, true); +} + +void JS_ClearUncatchableError(JSContext *ctx, JSValueConst val) +{ + js_set_uncatchable_error(ctx, val, false); +} + +void JS_ResetUncatchableError(JSContext *ctx) +{ + js_set_uncatchable_error(ctx, ctx->rt->current_exception, false); +} + +int JS_SetOpaque(JSValueConst obj, void *opaque) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + p = JS_VALUE_GET_OBJ(obj); + // User code can't set the opaque of internal objects. + if (p->class_id >= JS_CLASS_INIT_COUNT) { + p->u.opaque = opaque; + return 0; + } + } + + return -1; +} + +/* |obj| must be a JSObject of an internal class. */ +static void JS_SetOpaqueInternal(JSValueConst obj, void *opaque) +{ + JSObject *p; + assert(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT); + p = JS_VALUE_GET_OBJ(obj); + assert(p->class_id < JS_CLASS_INIT_COUNT); + p->u.opaque = opaque; +} + +/* return NULL if not an object of class class_id */ +void *JS_GetOpaque(JSValueConst obj, JSClassID class_id) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return NULL; + p = JS_VALUE_GET_OBJ(obj); + if (p->class_id != class_id) + return NULL; + return p->u.opaque; +} + +void *JS_GetOpaque2(JSContext *ctx, JSValueConst obj, JSClassID class_id) +{ + void *p = JS_GetOpaque(obj, class_id); + if (unlikely(!p)) { + JS_ThrowTypeErrorInvalidClass(ctx, class_id); + } + return p; +} + +void *JS_GetAnyOpaque(JSValueConst obj, JSClassID *class_id) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) { + *class_id = 0; + return NULL; + } + p = JS_VALUE_GET_OBJ(obj); + *class_id = p->class_id; + return p->u.opaque; +} + +static JSValue JS_ToPrimitiveFree(JSContext *ctx, JSValue val, int hint) +{ + int i; + bool force_ordinary; + + JSAtom method_name; + JSValue method, ret; + if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) + return val; + force_ordinary = hint & HINT_FORCE_ORDINARY; + hint &= ~HINT_FORCE_ORDINARY; + if (!force_ordinary) { + method = JS_GetProperty(ctx, val, JS_ATOM_Symbol_toPrimitive); + if (JS_IsException(method)) + goto exception; + /* ECMA says *If exoticToPrim is not undefined* but tests in + test262 use null as a non callable converter */ + if (!JS_IsUndefined(method) && !JS_IsNull(method)) { + JSAtom atom; + JSValue arg; + switch(hint) { + case HINT_STRING: + atom = JS_ATOM_string; + break; + case HINT_NUMBER: + atom = JS_ATOM_number; + break; + default: + case HINT_NONE: + atom = JS_ATOM_default; + break; + } + arg = JS_AtomToString(ctx, atom); + ret = JS_CallFree(ctx, method, val, 1, vc(&arg)); + JS_FreeValue(ctx, arg); + if (JS_IsException(ret)) + goto exception; + JS_FreeValue(ctx, val); + if (JS_VALUE_GET_TAG(ret) != JS_TAG_OBJECT) + return ret; + JS_FreeValue(ctx, ret); + return JS_ThrowTypeError(ctx, "toPrimitive"); + } + } + if (hint != HINT_STRING) + hint = HINT_NUMBER; + for(i = 0; i < 2; i++) { + if ((i ^ hint) == 0) { + method_name = JS_ATOM_toString; + } else { + method_name = JS_ATOM_valueOf; + } + method = JS_GetProperty(ctx, val, method_name); + if (JS_IsException(method)) + goto exception; + if (JS_IsFunction(ctx, method)) { + ret = JS_CallFree(ctx, method, val, 0, NULL); + if (JS_IsException(ret)) + goto exception; + if (JS_VALUE_GET_TAG(ret) != JS_TAG_OBJECT) { + JS_FreeValue(ctx, val); + return ret; + } + JS_FreeValue(ctx, ret); + } else { + JS_FreeValue(ctx, method); + } + } + JS_ThrowTypeError(ctx, "toPrimitive"); +exception: + JS_FreeValue(ctx, val); + return JS_EXCEPTION; +} + +static JSValue JS_ToPrimitive(JSContext *ctx, JSValueConst val, int hint) +{ + return JS_ToPrimitiveFree(ctx, js_dup(val), hint); +} + +void JS_SetIsHTMLDDA(JSContext *ctx, JSValueConst obj) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return; + p = JS_VALUE_GET_OBJ(obj); + p->is_HTMLDDA = true; +} + +static inline bool JS_IsHTMLDDA(JSContext *ctx, JSValueConst obj) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(obj); + return p->is_HTMLDDA; +} + +static int JS_ToBoolFree(JSContext *ctx, JSValue val) +{ + uint32_t tag = JS_VALUE_GET_TAG(val); + switch(tag) { + case JS_TAG_INT: + return JS_VALUE_GET_INT(val) != 0; + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + return JS_VALUE_GET_INT(val); + case JS_TAG_EXCEPTION: + return -1; + case JS_TAG_STRING: + { + bool ret = JS_VALUE_GET_STRING(val)->len != 0; + JS_FreeValue(ctx, val); + return ret; + } + case JS_TAG_SHORT_BIG_INT: + return JS_VALUE_GET_SHORT_BIG_INT(val) != 0; + case JS_TAG_BIG_INT: + { + JSBigInt *p = JS_VALUE_GET_PTR(val); + bool ret; + int i; + + /* fail safe: we assume it is not necessarily + normalized. Beginning from the MSB ensures that the + test is fast. */ + ret = false; + for(i = p->len - 1; i >= 0; i--) { + if (p->tab[i] != 0) { + ret = true; + break; + } + } + JS_FreeValue(ctx, val); + return ret; + } + case JS_TAG_OBJECT: + { + JSObject *p = JS_VALUE_GET_OBJ(val); + bool ret = !p->is_HTMLDDA; + JS_FreeValue(ctx, val); + return ret; + } + break; + default: + if (JS_TAG_IS_FLOAT64(tag)) { + double d = JS_VALUE_GET_FLOAT64(val); + return !isnan(d) && d != 0; + } else { + JS_FreeValue(ctx, val); + return true; + } + } +} + +int JS_ToBool(JSContext *ctx, JSValueConst val) +{ + return JS_ToBoolFree(ctx, js_dup(val)); +} + +/* pc points to pure ASCII or UTF-8, null terminated contents */ +static int skip_spaces(const char *pc) +{ + const uint8_t *p, *p_next, *p_start; + uint32_t c; + + p = p_start = (const uint8_t *)pc; + for (;;) { + c = *p++; + if (c < 0x80) { + if (!((c >= 0x09 && c <= 0x0d) || (c == 0x20))) + break; + } else { + c = utf8_decode(p - 1, &p_next); + /* no need to test for invalid UTF-8, 0xFFFD is not a space */ + if (!lre_is_space(c)) + break; + p = p_next; + } + } + return p - 1 - p_start; +} + +static inline int js_to_digit(int c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'Z') + return c - 'A' + 10; + else if (c >= 'a' && c <= 'z') + return c - 'a' + 10; + else + return 36; +} + +/* bigint support */ + +#define ADDC(res, carry_out, op1, op2, carry_in) \ +do { \ + js_limb_t __v, __a, __k, __k1; \ + __v = (op1); \ + __a = __v + (op2); \ + __k1 = __a < __v; \ + __k = (carry_in); \ + __a = __a + __k; \ + carry_out = (__a < __k) | __k1; \ + res = __a; \ +} while (0) + +/* a != 0 */ +static inline js_limb_t js_limb_clz(js_limb_t a) +{ + if (!a) + return JS_LIMB_BITS; + return clz32(a); +} + +static js_limb_t js_mp_add(js_limb_t *res, const js_limb_t *op1, const js_limb_t *op2, + js_limb_t n, js_limb_t carry) +{ + int i; + for(i = 0;i < n; i++) { + ADDC(res[i], carry, op1[i], op2[i], carry); + } + return carry; +} + +static js_limb_t js_mp_sub(js_limb_t *res, const js_limb_t *op1, const js_limb_t *op2, + int n, js_limb_t carry) +{ + int i; + js_limb_t k, a, v, k1; + + k = carry; + for(i=0;i v; + v = a - k; + k = (v > a) | k1; + res[i] = v; + } + return k; +} + +/* compute 0 - op2. carry = 0 or 1. */ +static js_limb_t js_mp_neg(js_limb_t *res, const js_limb_t *op2, int n) +{ + int i; + js_limb_t v, carry; + + carry = 1; + for(i=0;i> JS_LIMB_BITS; + } + return l; +} + +static js_limb_t js_mp_div1(js_limb_t *tabr, const js_limb_t *taba, js_limb_t n, + js_limb_t b, js_limb_t r) +{ + js_slimb_t i; + js_dlimb_t a1; + for(i = n - 1; i >= 0; i--) { + a1 = ((js_dlimb_t)r << JS_LIMB_BITS) | taba[i]; + tabr[i] = a1 / b; + r = a1 % b; + } + return r; +} + +/* tabr[] += taba[] * b, return the high word. */ +static js_limb_t js_mp_add_mul1(js_limb_t *tabr, const js_limb_t *taba, js_limb_t n, + js_limb_t b) +{ + js_limb_t i, l; + js_dlimb_t t; + + l = 0; + for(i = 0; i < n; i++) { + t = (js_dlimb_t)taba[i] * (js_dlimb_t)b + l + tabr[i]; + tabr[i] = t; + l = t >> JS_LIMB_BITS; + } + return l; +} + +/* size of the result : op1_size + op2_size. */ +static void js_mp_mul_basecase(js_limb_t *result, + const js_limb_t *op1, js_limb_t op1_size, + const js_limb_t *op2, js_limb_t op2_size) +{ + int i; + js_limb_t r; + + result[op1_size] = js_mp_mul1(result, op1, op1_size, op2[0], 0); + for(i=1;i> JS_LIMB_BITS); + } + return l; +} + +/* WARNING: d must be >= 2^(JS_LIMB_BITS-1) */ +static inline js_limb_t js_udiv1norm_init(js_limb_t d) +{ + js_limb_t a0, a1; + a1 = -d - 1; + a0 = -1; + return (((js_dlimb_t)a1 << JS_LIMB_BITS) | a0) / d; +} + +/* return the quotient and the remainder in '*pr'of 'a1*2^JS_LIMB_BITS+a0 + / d' with 0 <= a1 < d. */ +static inline js_limb_t js_udiv1norm(js_limb_t *pr, js_limb_t a1, js_limb_t a0, + js_limb_t d, js_limb_t d_inv) +{ + js_limb_t n1m, n_adj, q, r, ah; + js_dlimb_t a; + n1m = ((js_slimb_t)a0 >> (JS_LIMB_BITS - 1)); + n_adj = a0 + (n1m & d); + a = (js_dlimb_t)d_inv * (a1 - n1m) + n_adj; + q = (a >> JS_LIMB_BITS) + a1; + /* compute a - q * r and update q so that the remainder is\ + between 0 and d - 1 */ + a = ((js_dlimb_t)a1 << JS_LIMB_BITS) | a0; + a = a - (js_dlimb_t)q * d - d; + ah = a >> JS_LIMB_BITS; + q += 1 + ah; + r = (js_limb_t)a + (ah & d); + *pr = r; + return q; +} + +#define UDIV1NORM_THRESHOLD 3 + +/* b must be >= 1 << (JS_LIMB_BITS - 1) */ +static js_limb_t js_mp_div1norm(js_limb_t *tabr, const js_limb_t *taba, js_limb_t n, + js_limb_t b, js_limb_t r) +{ + js_slimb_t i; + + if (n >= UDIV1NORM_THRESHOLD) { + js_limb_t b_inv; + b_inv = js_udiv1norm_init(b); + for(i = n - 1; i >= 0; i--) { + tabr[i] = js_udiv1norm(&r, r, taba[i], b, b_inv); + } + } else { + js_dlimb_t a1; + for(i = n - 1; i >= 0; i--) { + a1 = ((js_dlimb_t)r << JS_LIMB_BITS) | taba[i]; + tabr[i] = a1 / b; + r = a1 % b; + } + } + return r; +} + +/* base case division: divides taba[0..na-1] by tabb[0..nb-1]. tabb[nb + - 1] must be >= 1 << (JS_LIMB_BITS - 1). na - nb must be >= 0. 'taba' + is modified and contains the remainder (nb limbs). tabq[0..na-nb] + contains the quotient with tabq[na - nb] <= 1. */ +static void js_mp_divnorm(js_limb_t *tabq, js_limb_t *taba, js_limb_t na, + const js_limb_t *tabb, js_limb_t nb) +{ + js_limb_t r, a, c, q, v, b1, b1_inv, n, dummy_r; + int i, j; + + b1 = tabb[nb - 1]; + if (nb == 1) { + taba[0] = js_mp_div1norm(tabq, taba, na, b1, 0); + return; + } + n = na - nb; + + if (n >= UDIV1NORM_THRESHOLD) + b1_inv = js_udiv1norm_init(b1); + else + b1_inv = 0; + + /* first iteration: the quotient is only 0 or 1 */ + q = 1; + for(j = nb - 1; j >= 0; j--) { + if (taba[n + j] != tabb[j]) { + if (taba[n + j] < tabb[j]) + q = 0; + break; + } + } + tabq[n] = q; + if (q) { + js_mp_sub(taba + n, taba + n, tabb, nb, 0); + } + + for(i = n - 1; i >= 0; i--) { + if (unlikely(taba[i + nb] >= b1)) { + q = -1; + } else if (b1_inv) { + q = js_udiv1norm(&dummy_r, taba[i + nb], taba[i + nb - 1], b1, b1_inv); + } else { + js_dlimb_t al; + al = ((js_dlimb_t)taba[i + nb] << JS_LIMB_BITS) | taba[i + nb - 1]; + q = al / b1; + r = al % b1; + } + r = js_mp_sub_mul1(taba + i, tabb, nb, q); + + v = taba[i + nb]; + a = v - r; + c = (a > v); + taba[i + nb] = a; + + if (c != 0) { + /* negative result */ + for(;;) { + q--; + c = js_mp_add(taba + i, taba + i, tabb, nb, 0); + /* propagate carry and test if positive result */ + if (c != 0) { + if (++taba[i + nb] == 0) { + break; + } + } + } + } + tabq[i] = q; + } +} + +/* 1 <= shift <= JS_LIMB_BITS - 1 */ +static js_limb_t js_mp_shl(js_limb_t *tabr, const js_limb_t *taba, int n, + int shift) +{ + int i; + js_limb_t l, v; + l = 0; + for(i = 0; i < n; i++) { + v = taba[i]; + tabr[i] = (v << shift) | l; + l = v >> (JS_LIMB_BITS - shift); + } + return l; +} + +/* r = (a + high*B^n) >> shift. Return the remainder r (0 <= r < 2^shift). + 1 <= shift <= LIMB_BITS - 1 */ +static js_limb_t js_mp_shr(js_limb_t *tab_r, const js_limb_t *tab, int n, + int shift, js_limb_t high) +{ + int i; + js_limb_t l, a; + + l = high; + for(i = n - 1; i >= 0; i--) { + a = tab[i]; + tab_r[i] = (a >> shift) | (l << (JS_LIMB_BITS - shift)); + l = a; + } + return l & (((js_limb_t)1 << shift) - 1); +} + +static JSBigInt *js_bigint_new(JSContext *ctx, int len) +{ + JSBigInt *r; + if (len > JS_BIGINT_MAX_SIZE) { + JS_ThrowRangeError(ctx, "BigInt is too large to allocate"); + return NULL; + } + r = js_malloc(ctx, sizeof(JSBigInt) + len * sizeof(js_limb_t)); + if (!r) + return NULL; + r->header.ref_count = 1; + r->len = len; + return r; +} + +static JSBigInt *js_bigint_set_si(JSBigIntBuf *buf, js_slimb_t a) +{ + JSBigInt *r = (JSBigInt *)buf->big_int_buf; + r->header.ref_count = 0; /* fail safe */ + r->len = 1; + r->tab[0] = a; + return r; +} + +static JSBigInt *js_bigint_set_si64(JSBigIntBuf *buf, int64_t a) +{ + JSBigInt *r = (JSBigInt *)buf->big_int_buf; + r->header.ref_count = 0; /* fail safe */ + if (a >= INT32_MIN && a <= INT32_MAX) { + r->len = 1; + r->tab[0] = a; + } else { + r->len = 2; + r->tab[0] = a; + r->tab[1] = a >> JS_LIMB_BITS; + } + return r; +} + +/* val must be a short big int */ +static JSBigInt *js_bigint_set_short(JSBigIntBuf *buf, JSValueConst val) +{ + return js_bigint_set_si(buf, JS_VALUE_GET_SHORT_BIG_INT(val)); +} + +static __maybe_unused void js_bigint_dump1(JSContext *ctx, const char *str, + const js_limb_t *tab, int len) +{ + int i; + printf("%s: ", str); + for(i = len - 1; i >= 0; i--) { + printf(" %08x", tab[i]); + } + printf("\n"); +} + +static __maybe_unused void js_bigint_dump(JSContext *ctx, const char *str, + const JSBigInt *p) +{ + js_bigint_dump1(ctx, str, p->tab, p->len); +} + +static JSBigInt *js_bigint_new_si(JSContext *ctx, js_slimb_t a) +{ + JSBigInt *r; + r = js_bigint_new(ctx, 1); + if (!r) + return NULL; + r->tab[0] = a; + return r; +} + +static JSBigInt *js_bigint_new_si64(JSContext *ctx, int64_t a) +{ + if (a >= INT32_MIN && a <= INT32_MAX) { + return js_bigint_new_si(ctx, a); + } else { + JSBigInt *r; + r = js_bigint_new(ctx, 2); + if (!r) + return NULL; + r->tab[0] = a; + r->tab[1] = a >> 32; + return r; + } +} + +static JSBigInt *js_bigint_new_ui64(JSContext *ctx, uint64_t a) +{ + if (a <= INT64_MAX) { + return js_bigint_new_si64(ctx, a); + } else { + JSBigInt *r; + r = js_bigint_new(ctx, (65 + JS_LIMB_BITS - 1) / JS_LIMB_BITS); + if (!r) + return NULL; + r->tab[0] = a; + r->tab[1] = a >> 32; + r->tab[2] = 0; + return r; + } +} + +static JSBigInt *js_bigint_new_di(JSContext *ctx, js_sdlimb_t a) +{ + JSBigInt *r; + if (a == (js_slimb_t)a) { + r = js_bigint_new(ctx, 1); + if (!r) + return NULL; + r->tab[0] = a; + } else { + r = js_bigint_new(ctx, 2); + if (!r) + return NULL; + r->tab[0] = a; + r->tab[1] = a >> JS_LIMB_BITS; + } + return r; +} + +/* Remove redundant high order limbs. Warning: 'a' may be + reallocated. Can never fail. +*/ +static JSBigInt *js_bigint_normalize1(JSContext *ctx, JSBigInt *a, int l) +{ + js_limb_t v; + + assert(a->header.ref_count == 1); + while (l > 1) { + v = a->tab[l - 1]; + if ((v != 0 && v != -1) || + (v & 1) != (a->tab[l - 2] >> (JS_LIMB_BITS - 1))) { + break; + } + l--; + } + if (l != a->len) { + JSBigInt *a1; + /* realloc to reduce the size */ + a->len = l; + a1 = js_realloc(ctx, a, sizeof(JSBigInt) + l * sizeof(js_limb_t)); + if (a1) + a = a1; + } + return a; +} + +static JSBigInt *js_bigint_normalize(JSContext *ctx, JSBigInt *a) +{ + return js_bigint_normalize1(ctx, a, a->len); +} + +/* return 0 or 1 depending on the sign */ +static inline int js_bigint_sign(const JSBigInt *a) +{ + return a->tab[a->len - 1] >> (JS_LIMB_BITS - 1); +} + +static js_slimb_t js_bigint_get_si_sat(const JSBigInt *a) +{ + if (a->len == 1) { + return a->tab[0]; + } else { + if (js_bigint_sign(a)) + return INT32_MIN; + else + return INT32_MAX; + } +} + +/* add the op1 limb */ +static JSBigInt *js_bigint_extend(JSContext *ctx, JSBigInt *r, + js_limb_t op1) +{ + int n2 = r->len; + if ((op1 != 0 && op1 != -1) || + (op1 & 1) != r->tab[n2 - 1] >> (JS_LIMB_BITS - 1)) { + JSBigInt *r1; + r1 = js_realloc(ctx, r, + sizeof(JSBigInt) + (n2 + 1) * sizeof(js_limb_t)); + if (!r1) { + js_free(ctx, r); + return NULL; + } + r = r1; + r->len = n2 + 1; + r->tab[n2] = op1; + } else { + /* otherwise still need to normalize the result */ + r = js_bigint_normalize(ctx, r); + } + return r; +} + +/* return NULL in case of error. Compute a + b (b_neg = 0) or a - b + (b_neg = 1) */ +/* XXX: optimize */ +static JSBigInt *js_bigint_add(JSContext *ctx, const JSBigInt *a, + const JSBigInt *b, int b_neg) +{ + JSBigInt *r; + int n1, n2, i; + js_limb_t carry, op1, op2, a_sign, b_sign; + + n2 = max_int(a->len, b->len); + n1 = min_int(a->len, b->len); + r = js_bigint_new(ctx, n2); + if (!r) + return NULL; + /* XXX: optimize */ + /* common part */ + carry = b_neg; + for(i = 0; i < n1; i++) { + op1 = a->tab[i]; + op2 = b->tab[i] ^ (-b_neg); + ADDC(r->tab[i], carry, op1, op2, carry); + } + a_sign = -js_bigint_sign(a); + b_sign = (-js_bigint_sign(b)) ^ (-b_neg); + /* part with sign extension of one operand */ + if (a->len > b->len) { + for(i = n1; i < n2; i++) { + op1 = a->tab[i]; + ADDC(r->tab[i], carry, op1, b_sign, carry); + } + } else if (a->len < b->len) { + for(i = n1; i < n2; i++) { + op2 = b->tab[i] ^ (-b_neg); + ADDC(r->tab[i], carry, a_sign, op2, carry); + } + } + + /* part with sign extension for both operands. Extend the result + if necessary */ + return js_bigint_extend(ctx, r, a_sign + b_sign + carry); +} + +/* XXX: optimize */ +static JSBigInt *js_bigint_neg(JSContext *ctx, const JSBigInt *a) +{ + JSBigIntBuf buf; + JSBigInt *b; + b = js_bigint_set_si(&buf, 0); + return js_bigint_add(ctx, b, a, 1); +} + +static JSBigInt *js_bigint_mul(JSContext *ctx, const JSBigInt *a, + const JSBigInt *b) +{ + JSBigInt *r; + + r = js_bigint_new(ctx, a->len + b->len); + if (!r) + return NULL; + js_mp_mul_basecase(r->tab, a->tab, a->len, b->tab, b->len); + /* correct the result if negative operands (no overflow is + possible) */ + if (js_bigint_sign(a)) + js_mp_sub(r->tab + a->len, r->tab + a->len, b->tab, b->len, 0); + if (js_bigint_sign(b)) + js_mp_sub(r->tab + b->len, r->tab + b->len, a->tab, a->len, 0); + return js_bigint_normalize(ctx, r); +} + +/* return the division or the remainder. 'b' must be != 0. return NULL + in case of exception (division by zero or memory error) */ +static JSBigInt *js_bigint_divrem(JSContext *ctx, const JSBigInt *a, + const JSBigInt *b, bool is_rem) +{ + JSBigInt *r, *q; + js_limb_t *tabb, h; + int na, nb, a_sign, b_sign, shift; + + if (b->len == 1 && b->tab[0] == 0) { + JS_ThrowRangeError(ctx, "BigInt division by zero"); + return NULL; + } + + a_sign = js_bigint_sign(a); + b_sign = js_bigint_sign(b); + na = a->len; + nb = b->len; + + r = js_bigint_new(ctx, na + 2); + if (!r) + return NULL; + if (a_sign) { + js_mp_neg(r->tab, a->tab, na); + } else { + memcpy(r->tab, a->tab, na * sizeof(a->tab[0])); + } + /* normalize */ + while (na > 1 && r->tab[na - 1] == 0) + na--; + + tabb = js_malloc(ctx, nb * sizeof(tabb[0])); + if (!tabb) { + js_free(ctx, r); + return NULL; + } + if (b_sign) { + js_mp_neg(tabb, b->tab, nb); + } else { + memcpy(tabb, b->tab, nb * sizeof(tabb[0])); + } + /* normalize */ + while (nb > 1 && tabb[nb - 1] == 0) + nb--; + + /* trivial case if 'a' is small */ + if (na < nb) { + js_free(ctx, r); + js_free(ctx, tabb); + if (is_rem) { + /* r = a */ + r = js_bigint_new(ctx, a->len); + if (!r) + return NULL; + memcpy(r->tab, a->tab, a->len * sizeof(a->tab[0])); + return r; + } else { + /* q = 0 */ + return js_bigint_new_si(ctx, 0); + } + } + + /* normalize 'b' */ + shift = js_limb_clz(tabb[nb - 1]); + if (shift != 0) { + js_mp_shl(tabb, tabb, nb, shift); + h = js_mp_shl(r->tab, r->tab, na, shift); + if (h != 0) + r->tab[na++] = h; + } + + q = js_bigint_new(ctx, na - nb + 2); /* one more limb for the sign */ + if (!q) { + js_free(ctx, r); + js_free(ctx, tabb); + return NULL; + } + + // js_bigint_dump1(ctx, "a", r->tab, na); + // js_bigint_dump1(ctx, "b", tabb, nb); + js_mp_divnorm(q->tab, r->tab, na, tabb, nb); + js_free(ctx, tabb); + + if (is_rem) { + js_free(ctx, q); + if (shift != 0) + js_mp_shr(r->tab, r->tab, nb, shift, 0); + r->tab[nb++] = 0; + if (a_sign) + js_mp_neg(r->tab, r->tab, nb); + r = js_bigint_normalize1(ctx, r, nb); + return r; + } else { + js_free(ctx, r); + q->tab[na - nb + 1] = 0; + if (a_sign ^ b_sign) { + js_mp_neg(q->tab, q->tab, q->len); + } + q = js_bigint_normalize(ctx, q); + return q; + } +} + +/* and, or, xor */ +static JSBigInt *js_bigint_logic(JSContext *ctx, const JSBigInt *a, + const JSBigInt *b, OPCodeEnum op) +{ + JSBigInt *r; + js_limb_t b_sign; + int a_len, b_len, i; + + if (a->len < b->len) { + const JSBigInt *tmp; + tmp = a; + a = b; + b = tmp; + } + /* a_len >= b_len */ + a_len = a->len; + b_len = b->len; + b_sign = -js_bigint_sign(b); + + r = js_bigint_new(ctx, a_len); + if (!r) + return NULL; + switch(op) { + case OP_or: + for(i = 0; i < b_len; i++) { + r->tab[i] = a->tab[i] | b->tab[i]; + } + for(i = b_len; i < a_len; i++) { + r->tab[i] = a->tab[i] | b_sign; + } + break; + case OP_and: + for(i = 0; i < b_len; i++) { + r->tab[i] = a->tab[i] & b->tab[i]; + } + for(i = b_len; i < a_len; i++) { + r->tab[i] = a->tab[i] & b_sign; + } + break; + case OP_xor: + for(i = 0; i < b_len; i++) { + r->tab[i] = a->tab[i] ^ b->tab[i]; + } + for(i = b_len; i < a_len; i++) { + r->tab[i] = a->tab[i] ^ b_sign; + } + break; + default: + abort(); + } + return js_bigint_normalize(ctx, r); +} + +static JSBigInt *js_bigint_not(JSContext *ctx, const JSBigInt *a) +{ + JSBigInt *r; + int i; + + r = js_bigint_new(ctx, a->len); + if (!r) + return NULL; + for(i = 0; i < a->len; i++) { + r->tab[i] = ~a->tab[i]; + } + /* no normalization is needed */ + return r; +} + +static JSBigInt *js_bigint_shl(JSContext *ctx, const JSBigInt *a, + unsigned int shift1) +{ + int d, i, shift; + JSBigInt *r; + js_limb_t l; + + if (a->len == 1 && a->tab[0] == 0) + return js_bigint_new_si(ctx, 0); /* zero case */ + d = shift1 / JS_LIMB_BITS; + shift = shift1 % JS_LIMB_BITS; + r = js_bigint_new(ctx, a->len + d); + if (!r) + return NULL; + for(i = 0; i < d; i++) + r->tab[i] = 0; + if (shift == 0) { + for(i = 0; i < a->len; i++) { + r->tab[i + d] = a->tab[i]; + } + } else { + l = js_mp_shl(r->tab + d, a->tab, a->len, shift); + if (js_bigint_sign(a)) + l |= (js_limb_t)(-1) << shift; + r = js_bigint_extend(ctx, r, l); + } + return r; +} + +static JSBigInt *js_bigint_shr(JSContext *ctx, const JSBigInt *a, + unsigned int shift1) +{ + int d, i, shift, a_sign, n1; + JSBigInt *r; + + d = shift1 / JS_LIMB_BITS; + shift = shift1 % JS_LIMB_BITS; + a_sign = js_bigint_sign(a); + if (d >= a->len) + return js_bigint_new_si(ctx, -a_sign); + n1 = a->len - d; + r = js_bigint_new(ctx, n1); + if (!r) + return NULL; + if (shift == 0) { + for(i = 0; i < n1; i++) { + r->tab[i] = a->tab[i + d]; + } + /* no normalization is needed */ + } else { + js_mp_shr(r->tab, a->tab + d, n1, shift, -a_sign); + r = js_bigint_normalize(ctx, r); + } + return r; +} + +static JSBigInt *js_bigint_pow(JSContext *ctx, const JSBigInt *a, JSBigInt *b) +{ + uint32_t e; + int n_bits, i; + JSBigInt *r, *r1; + + /* b must be >= 0 */ + if (js_bigint_sign(b)) { + JS_ThrowRangeError(ctx, "BigInt negative exponent"); + return NULL; + } + if (b->len == 1 && b->tab[0] == 0) { + /* a^0 = 1 */ + return js_bigint_new_si(ctx, 1); + } else if (a->len == 1) { + js_limb_t v; + bool is_neg; + + v = a->tab[0]; + if (v <= 1) + return js_bigint_new_si(ctx, v); + else if (v == -1) + return js_bigint_new_si(ctx, 1 - 2 * (b->tab[0] & 1)); + is_neg = (js_slimb_t)v < 0; + if (is_neg) + v = -v; + if ((v & (v - 1)) == 0) { + uint64_t e1; + int n; + /* v = 2^n */ + n = JS_LIMB_BITS - 1 - js_limb_clz(v); + if (b->len > 1) + goto overflow; + if (b->tab[0] > INT32_MAX) + goto overflow; + e = b->tab[0]; + e1 = (uint64_t)e * n; + if (e1 > JS_BIGINT_MAX_SIZE * JS_LIMB_BITS) + goto overflow; + e = e1; + if (is_neg) + is_neg = b->tab[0] & 1; + r = js_bigint_new(ctx, + (e + JS_LIMB_BITS + 1 - is_neg) / JS_LIMB_BITS); + if (!r) + return NULL; + memset(r->tab, 0, sizeof(r->tab[0]) * r->len); + r->tab[e / JS_LIMB_BITS] = + (js_limb_t)(1 - 2 * is_neg) << (e % JS_LIMB_BITS); + return r; + } + } + if (b->len > 1) + goto overflow; + if (b->tab[0] > INT32_MAX) + goto overflow; + e = b->tab[0]; + n_bits = 32 - clz32(e); + + r = js_bigint_new(ctx, a->len); + if (!r) + return NULL; + memcpy(r->tab, a->tab, a->len * sizeof(a->tab[0])); + for(i = n_bits - 2; i >= 0; i--) { + r1 = js_bigint_mul(ctx, r, r); + if (!r1) + return NULL; + js_free(ctx, r); + r = r1; + if ((e >> i) & 1) { + r1 = js_bigint_mul(ctx, r, a); + if (!r1) + return NULL; + js_free(ctx, r); + r = r1; + } + } + return r; + overflow: + JS_ThrowRangeError(ctx, "BigInt is too large"); + return NULL; +} + +/* return (mant, exp) so that abs(a) ~ mant*2^(exp - (limb_bits - + 1). a must be != 0. */ +static uint64_t js_bigint_get_mant_exp(JSContext *ctx, + int *pexp, const JSBigInt *a) +{ + js_limb_t t[4 - JS_LIMB_BITS / 32], carry, v, low_bits; + int n1, n2, sgn, shift, i, j, e; + uint64_t a1, a0; + + n2 = 4 - JS_LIMB_BITS / 32; + n1 = a->len - n2; + sgn = js_bigint_sign(a); + + /* low_bits != 0 if there are a non zero low bit in abs(a) */ + low_bits = 0; + carry = sgn; + for(i = 0; i < n1; i++) { + v = (a->tab[i] ^ (-sgn)) + carry; + carry = v < carry; + low_bits |= v; + } + /* get the n2 high limbs of abs(a) */ + for(j = 0; j < n2; j++) { + i = j + n1; + if (i < 0) { + v = 0; + } else { + v = (a->tab[i] ^ (-sgn)) + carry; + carry = v < carry; + } + t[j] = v; + } + + a1 = ((uint64_t)t[2] << 32) | t[1]; + a0 = (uint64_t)t[0] << 32; + a0 |= (low_bits != 0); + /* normalize */ + { + shift = clz64(a1); + if (shift != 0) { + a1 = (a1 << shift) | (a0 >> (64 - shift)); + a0 <<= shift; + } + } + a1 |= (a0 != 0); /* keep the bits for the final rounding */ + /* compute the exponent */ + e = a->len * JS_LIMB_BITS - shift - 1; + *pexp = e; + return a1; +} + +/* shift left with round to nearest, ties to even. n >= 1 */ +static uint64_t shr_rndn(uint64_t a, int n) +{ + uint64_t addend = ((a >> n) & 1) + ((1 << (n - 1)) - 1); + return (a + addend) >> n; +} + +/* convert to float64 with round to nearest, ties to even. Return + +/-infinity if too large. */ +static double js_bigint_to_float64(JSContext *ctx, const JSBigInt *a) +{ + int sgn, e; + uint64_t mant; + + if (a->len == 1) { + /* fast case, including zero */ + return (double)(js_slimb_t)a->tab[0]; + } + + sgn = js_bigint_sign(a); + mant = js_bigint_get_mant_exp(ctx, &e, a); + if (e > 1023) { + /* overflow: return infinity */ + mant = 0; + e = 1024; + } else { + mant = (mant >> 1) | (mant & 1); /* avoid overflow in rounding */ + mant = shr_rndn(mant, 10); + /* rounding can cause an overflow */ + if (mant >= ((uint64_t)1 << 53)) { + mant >>= 1; + e++; + } + mant &= (((uint64_t)1 << 52) - 1); + } + return uint64_as_float64(((uint64_t)sgn << 63) | + ((uint64_t)(e + 1023) << 52) | + mant); +} + +/* return (1, NULL) if not an integer, (2, NULL) if NaN or Infinity, + (0, n) if an integer, (0, NULL) in case of memory error */ +static JSBigInt *js_bigint_from_float64(JSContext *ctx, int *pres, double a1) +{ + uint64_t a = float64_as_uint64(a1); + int sgn, e, shift; + uint64_t mant; + JSBigIntBuf buf; + JSBigInt *r; + + sgn = a >> 63; + e = (a >> 52) & ((1 << 11) - 1); + mant = a & (((uint64_t)1 << 52) - 1); + if (e == 2047) { + /* NaN, Infinity */ + *pres = 2; + return NULL; + } + if (e == 0 && mant == 0) { + /* zero */ + *pres = 0; + return js_bigint_new_si(ctx, 0); + } + e -= 1023; + /* 0 < a < 1 : not an integer */ + if (e < 0) + goto not_an_integer; + mant |= (uint64_t)1 << 52; + if (e < 52) { + shift = 52 - e; + /* check that there is no fractional part */ + if (mant & (((uint64_t)1 << shift) - 1)) { + not_an_integer: + *pres = 1; + return NULL; + } + mant >>= shift; + e = 0; + } else { + e -= 52; + } + if (sgn) + mant = -mant; + /* the integer is mant*2^e */ + r = js_bigint_set_si64(&buf, (int64_t)mant); + *pres = 0; + return js_bigint_shl(ctx, r, e); +} + +/* return -1, 0, 1 or (2) (unordered) */ +static int js_bigint_float64_cmp(JSContext *ctx, const JSBigInt *a, + double b) +{ + int b_sign, a_sign, e, f; + uint64_t mant, b1, a_mant; + + b1 = float64_as_uint64(b); + b_sign = b1 >> 63; + e = (b1 >> 52) & ((1 << 11) - 1); + mant = b1 & (((uint64_t)1 << 52) - 1); + a_sign = js_bigint_sign(a); + if (e == 2047) { + if (mant != 0) { + /* NaN */ + return 2; + } else { + /* +/- infinity */ + return 2 * b_sign - 1; + } + } else if (e == 0 && mant == 0) { + /* b = +/-0 */ + if (a->len == 1 && a->tab[0] == 0) + return 0; + else + return 1 - 2 * a_sign; + } else if (a->len == 1 && a->tab[0] == 0) { + /* a = 0, b != 0 */ + return 2 * b_sign - 1; + } else if (a_sign != b_sign) { + return 1 - 2 * a_sign; + } else { + e -= 1023; + /* Note: handling denormals is not necessary because we + compare to integers hence f >= 0 */ + /* compute f so that 2^f <= abs(a) < 2^(f+1) */ + a_mant = js_bigint_get_mant_exp(ctx, &f, a); + if (f != e) { + if (f < e) + return -1; + else + return 1; + } else { + mant = (mant | ((uint64_t)1 << 52)) << 11; /* align to a_mant */ + if (a_mant < mant) + return 2 * a_sign - 1; + else if (a_mant > mant) + return 1 - 2 * a_sign; + else + return 0; + } + } +} + +/* return -1, 0 or 1 */ +static int js_bigint_cmp(JSContext *ctx, const JSBigInt *a, + const JSBigInt *b) +{ + int a_sign, b_sign, res, i; + a_sign = js_bigint_sign(a); + b_sign = js_bigint_sign(b); + if (a_sign != b_sign) { + res = 1 - 2 * a_sign; + } else { + /* we assume the numbers are normalized */ + if (a->len != b->len) { + if (a->len < b->len) + res = 2 * a_sign - 1; + else + res = 1 - 2 * a_sign; + } else { + res = 0; + for(i = a->len -1; i >= 0; i--) { + if (a->tab[i] != b->tab[i]) { + if (a->tab[i] < b->tab[i]) + res = -1; + else + res = 1; + break; + } + } + } + } + return res; +} + +/* contains 10^i */ +static const js_limb_t js_pow_dec[JS_LIMB_DIGITS + 1] = { + 1U, + 10U, + 100U, + 1000U, + 10000U, + 100000U, + 1000000U, + 10000000U, + 100000000U, + 1000000000U, +}; + +/* syntax: [-]digits in base radix. Return NULL if memory error. radix + = 10, 2, 8 or 16. */ +static JSBigInt *js_bigint_from_string(JSContext *ctx, + const char *str, int radix) +{ + const char *p = str; + size_t n_digits1; + int is_neg, n_digits, n_limbs, len, log2_radix, n_bits, i; + JSBigInt *r; + js_limb_t v, c, h; + + is_neg = 0; + if (*p == '-') { + is_neg = 1; + p++; + } + while (*p == '0') + p++; + n_digits1 = strlen(p); + /* the real check for overflox is done js_bigint_new(). Here + we just avoid integer overflow */ + if (n_digits1 > JS_BIGINT_MAX_SIZE * JS_LIMB_BITS) { + JS_ThrowRangeError(ctx, "BigInt is too large to allocate"); + return NULL; + } + n_digits = n_digits1; + log2_radix = 32 - clz32(radix - 1); /* ceil(log2(radix)) */ + /* compute the maximum number of limbs */ + if (radix == 10) { + n_bits = (n_digits * 27 + 7) / 8; /* >= ceil(n_digits * log2(10)) */ + } else { + n_bits = n_digits * log2_radix; + } + /* we add one extra bit for the sign */ + n_limbs = max_int(1, n_bits / JS_LIMB_BITS + 1); + r = js_bigint_new(ctx, n_limbs); + if (!r) + return NULL; + if (radix == 10) { + int digits_per_limb = JS_LIMB_DIGITS; + len = 1; + r->tab[0] = 0; + for(;;) { + /* XXX: slow */ + v = 0; + for(i = 0; i < digits_per_limb; i++) { + c = js_to_digit(*p); + if (c >= radix) + break; + p++; + v = v * 10 + c; + } + if (i == 0) + break; + if (len == 1 && r->tab[0] == 0) { + r->tab[0] = v; + } else { + h = js_mp_mul1(r->tab, r->tab, len, js_pow_dec[i], v); + if (h != 0) { + r->tab[len++] = h; + } + } + } + /* add one extra limb to have the correct sign*/ + if ((r->tab[len - 1] >> (JS_LIMB_BITS - 1)) != 0) + r->tab[len++] = 0; + r->len = len; + } else { + unsigned int bit_pos, shift, pos; + + /* power of two base: no multiplication is needed */ + r->len = n_limbs; + memset(r->tab, 0, sizeof(r->tab[0]) * n_limbs); + for(i = 0; i < n_digits; i++) { + c = js_to_digit(p[n_digits - 1 - i]); + assert(c < radix); + bit_pos = i * log2_radix; + shift = bit_pos & (JS_LIMB_BITS - 1); + pos = bit_pos / JS_LIMB_BITS; + r->tab[pos] |= c << shift; + /* if log2_radix does not divide JS_LIMB_BITS, needed an + additional op */ + if (shift + log2_radix > JS_LIMB_BITS) { + r->tab[pos + 1] |= c >> (JS_LIMB_BITS - shift); + } + } + } + r = js_bigint_normalize(ctx, r); + /* XXX: could do it in place */ + if (is_neg) { + JSBigInt *r1; + r1 = js_bigint_neg(ctx, r); + js_free(ctx, r); + r = r1; + } + return r; +} + +/* 2 <= base <= 36 */ +static char const digits[36] = { + '0','1','2','3','4','5','6','7','8','9', + 'a','b','c','d','e','f','g','h','i','j', + 'k','l','m','n','o','p','q','r','s','t', + 'u','v','w','x','y','z' +}; + +/* special version going backwards */ +/* XXX: use dtoa.c */ +static char *js_u64toa(char *q, int64_t n, unsigned int base) +{ + int digit; + if (base == 10) { + /* division by known base uses multiplication */ + do { + digit = (uint64_t)n % 10; + n = (uint64_t)n / 10; + *--q = '0' + digit; + } while (n != 0); + } else { + do { + digit = (uint64_t)n % base; + n = (uint64_t)n / base; + *--q = digits[digit]; + } while (n != 0); + } + return q; +} + +/* len >= 1. 2 <= radix <= 36 */ +static char *js_limb_to_a(char *q, js_limb_t n, unsigned int radix, int len) +{ + int digit, i; + + if (radix == 10) { + /* specific case with constant divisor */ + /* XXX: optimize */ + for(i = 0; i < len; i++) { + digit = (js_limb_t)n % 10; + n = (js_limb_t)n / 10; + *--q = digit + '0'; + } + } else { + for(i = 0; i < len; i++) { + digit = (js_limb_t)n % radix; + n = (js_limb_t)n / radix; + *--q = digits[digit]; + } + } + return q; +} + +#define JS_RADIX_MAX 36 + +static const uint8_t js_digits_per_limb_table[JS_RADIX_MAX - 1] = { +32,20,16,13,12,11,10,10, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +}; + +static const js_limb_t js_radix_base_table[JS_RADIX_MAX - 1] = { + 0x00000000, 0xcfd41b91, 0x00000000, 0x48c27395, + 0x81bf1000, 0x75db9c97, 0x40000000, 0xcfd41b91, + 0x3b9aca00, 0x8c8b6d2b, 0x19a10000, 0x309f1021, + 0x57f6c100, 0x98c29b81, 0x00000000, 0x18754571, + 0x247dbc80, 0x3547667b, 0x4c4b4000, 0x6b5a6e1d, + 0x94ace180, 0xcaf18367, 0x0b640000, 0x0e8d4a51, + 0x1269ae40, 0x17179149, 0x1cb91000, 0x23744899, + 0x2b73a840, 0x34e63b41, 0x40000000, 0x4cfa3cc1, + 0x5c13d840, 0x6d91b519, 0x81bf1000, +}; + +static JSValue js_bigint_to_string1(JSContext *ctx, JSValueConst val, int radix) +{ + if (JS_VALUE_GET_TAG(val) == JS_TAG_SHORT_BIG_INT) { + char buf[66]; + int len; + len = i64toa_radix(buf, JS_VALUE_GET_SHORT_BIG_INT(val), radix); + return js_new_string8_len(ctx, buf, len); + } else { + JSBigInt *r, *tmp = NULL; + char *buf, *q, *buf_end; + int is_neg, n_bits, log2_radix, n_digits; + bool is_binary_radix; + JSValue res; + + assert(JS_VALUE_GET_TAG(val) == JS_TAG_BIG_INT); + r = JS_VALUE_GET_PTR(val); + if (r->len == 1 && r->tab[0] == 0) { + /* '0' case */ + return js_new_string8_len(ctx, "0", 1); + } + is_binary_radix = ((radix & (radix - 1)) == 0); + is_neg = js_bigint_sign(r); + if (is_neg) { + tmp = js_bigint_neg(ctx, r); + if (!tmp) + return JS_EXCEPTION; + r = tmp; + } else if (!is_binary_radix) { + /* need to modify 'r' */ + tmp = js_bigint_new(ctx, r->len); + if (!tmp) + return JS_EXCEPTION; + memcpy(tmp->tab, r->tab, r->len * sizeof(r->tab[0])); + r = tmp; + } + log2_radix = 31 - clz32(radix); /* floor(log2(radix)) */ + n_bits = r->len * JS_LIMB_BITS - js_limb_clz(r->tab[r->len - 1]); + /* n_digits is exact only if radix is a power of + two. Otherwise it is >= the exact number of digits */ + n_digits = (n_bits + log2_radix - 1) / log2_radix; + /* XXX: could directly build the JSString */ + buf = js_malloc(ctx, n_digits + is_neg + 1); + if (!buf) { + js_free(ctx, tmp); + return JS_EXCEPTION; + } + q = buf + n_digits + is_neg + 1; + *--q = '\0'; + buf_end = q; + if (!is_binary_radix) { + int len; + js_limb_t radix_base, v; + radix_base = js_radix_base_table[radix - 2]; + len = r->len; + for(;;) { + /* remove leading zero limbs */ + while (len > 1 && r->tab[len - 1] == 0) + len--; + if (len == 1 && r->tab[0] < radix_base) { + v = r->tab[0]; + if (v != 0) { + q = js_u64toa(q, v, radix); + } + break; + } else { + v = js_mp_div1(r->tab, r->tab, len, radix_base, 0); + q = js_limb_to_a(q, v, radix, js_digits_per_limb_table[radix - 2]); + } + } + } else { + int i, shift; + unsigned int bit_pos, pos, c; + + /* radix is a power of two */ + for(i = 0; i < n_digits; i++) { + bit_pos = i * log2_radix; + pos = bit_pos / JS_LIMB_BITS; + shift = bit_pos % JS_LIMB_BITS; + c = r->tab[pos] >> shift; + if ((shift + log2_radix) > JS_LIMB_BITS && + (pos + 1) < r->len) { + c |= r->tab[pos + 1] << (JS_LIMB_BITS - shift); + } + c &= (radix - 1); + *--q = digits[c]; + } + } + if (is_neg) + *--q = '-'; + js_free(ctx, tmp); + res = js_new_string8_len(ctx, q, buf_end - q); + js_free(ctx, buf); + return res; + } +} + +/* if possible transform a BigInt to short big and free it, otherwise + return a normal bigint */ +static JSValue JS_CompactBigInt(JSContext *ctx, JSBigInt *p) +{ + JSValue res; + if (p->len == 1) { + res = __JS_NewShortBigInt(ctx, (js_slimb_t)p->tab[0]); + js_free(ctx, p); + return res; + } else { + return JS_MKPTR(JS_TAG_BIG_INT, p); + } +} + +#define ATOD_INT_ONLY (1 << 0) +/* accept Oo and Ob prefixes in addition to 0x prefix if radix = 0 */ +#define ATOD_ACCEPT_BIN_OCT (1 << 2) +/* accept O prefix as octal if radix == 0 and properly formed (Annex B) */ +#define ATOD_ACCEPT_LEGACY_OCTAL (1 << 4) +/* accept _ between digits as a digit separator */ +#define ATOD_ACCEPT_UNDERSCORES (1 << 5) +/* allow a suffix to override the type */ +#define ATOD_ACCEPT_SUFFIX (1 << 6) +/* default type */ +#define ATOD_TYPE_MASK (3 << 7) +#define ATOD_TYPE_FLOAT64 (0 << 7) +#define ATOD_TYPE_BIG_INT (1 << 7) +/* accept -0x1 */ +#define ATOD_ACCEPT_PREFIX_AFTER_SIGN (1 << 10) + +/* return an exception in case of memory error. Return JS_NAN if + invalid syntax */ +/* XXX: directly use js_atod() */ +static JSValue js_atof(JSContext *ctx, const char *str, const char **pp, + int radix, int flags) +{ + const char *p, *p_start; + int sep, is_neg; + bool is_float, has_legacy_octal; + int atod_type = flags & ATOD_TYPE_MASK; + char buf1[64], *buf; + int i, j, len; + bool buf_allocated = false; + JSValue val; + JSATODTempMem atod_mem; + + /* optional separator between digits */ + sep = (flags & ATOD_ACCEPT_UNDERSCORES) ? '_' : 256; + has_legacy_octal = false; + + p = str; + p_start = p; + is_neg = 0; + if (p[0] == '+') { + p++; + p_start++; + if (!(flags & ATOD_ACCEPT_PREFIX_AFTER_SIGN)) + goto no_radix_prefix; + } else if (p[0] == '-') { + p++; + p_start++; + is_neg = 1; + if (!(flags & ATOD_ACCEPT_PREFIX_AFTER_SIGN)) + goto no_radix_prefix; + } + if (p[0] == '0') { + if ((p[1] == 'x' || p[1] == 'X') && + (radix == 0 || radix == 16)) { + p += 2; + radix = 16; + } else if ((p[1] == 'o' || p[1] == 'O') && + radix == 0 && (flags & ATOD_ACCEPT_BIN_OCT)) { + p += 2; + radix = 8; + } else if ((p[1] == 'b' || p[1] == 'B') && + radix == 0 && (flags & ATOD_ACCEPT_BIN_OCT)) { + p += 2; + radix = 2; + } else if ((p[1] >= '0' && p[1] <= '9') && + radix == 0 && (flags & ATOD_ACCEPT_LEGACY_OCTAL)) { + int i; + has_legacy_octal = true; + sep = 256; + for (i = 1; (p[i] >= '0' && p[i] <= '7'); i++) + continue; + if (p[i] == '8' || p[i] == '9') + goto no_prefix; + p += 1; + radix = 8; + } else { + goto no_prefix; + } + /* there must be a digit after the prefix */ + if (js_to_digit((uint8_t)*p) >= radix) + goto fail; + no_prefix: ; + } else { + no_radix_prefix: + if (!(flags & ATOD_INT_ONLY) && + (atod_type == ATOD_TYPE_FLOAT64) && + js__strstart(p, "Infinity", &p)) { + double d = INFINITY; + if (is_neg) + d = -d; + val = js_float64(d); + goto done; + } + } + if (radix == 0) + radix = 10; + is_float = false; + p_start = p; + while (js_to_digit((uint8_t)*p) < radix + || (*p == sep && (radix != 10 || + p != p_start + 1 || p[-1] != '0') && + js_to_digit((uint8_t)p[1]) < radix)) { + p++; + } + if (!(flags & ATOD_INT_ONLY) && radix == 10) { + if (*p == '.' && (p > p_start || js_to_digit((uint8_t)p[1]) < radix)) { + is_float = true; + p++; + if (*p == sep) + goto fail; + while (js_to_digit((uint8_t)*p) < radix || + (*p == sep && js_to_digit((uint8_t)p[1]) < radix)) + p++; + } + if (p > p_start && (*p == 'e' || *p == 'E')) { + const char *p1 = p + 1; + is_float = true; + if (*p1 == '+') { + p1++; + } else if (*p1 == '-') { + p1++; + } + if (is_digit((uint8_t)*p1)) { + p = p1 + 1; + while (is_digit((uint8_t)*p) || (*p == sep && is_digit((uint8_t)p[1]))) + p++; + } + } + } + if (p == p_start) + goto fail; + + buf = buf1; + buf_allocated = false; + len = p - p_start; + if (unlikely((len + 2) > sizeof(buf1))) { + buf = js_malloc_rt(ctx->rt, len + 2); /* no exception raised */ + if (!buf) + goto mem_error; + buf_allocated = true; + } + /* remove the separators and the radix prefixes */ + j = 0; + if (is_neg) + buf[j++] = '-'; + for (i = 0; i < len; i++) { + if (p_start[i] != '_') + buf[j++] = p_start[i]; + } + buf[j] = '\0'; + + if (flags & ATOD_ACCEPT_SUFFIX) { + if (*p == 'n') { + p++; + atod_type = ATOD_TYPE_BIG_INT; + } + } + + switch(atod_type) { + case ATOD_TYPE_FLOAT64: + { + double d; + d = js_atod(buf, NULL, radix, is_float ? 0 : JS_ATOD_INT_ONLY, + &atod_mem); + /* return int or float64 */ + val = js_number(d); + } + break; + case ATOD_TYPE_BIG_INT: + { + JSBigInt *r; + if (has_legacy_octal || is_float) + goto fail; + r = js_bigint_from_string(ctx, buf, radix); + if (!r) { + val = JS_EXCEPTION; + goto done; + } + val = JS_CompactBigInt(ctx, r); + } + break; + default: + abort(); + } + +done: + if (buf_allocated) + js_free_rt(ctx->rt, buf); + if (pp) + *pp = p; + return val; + fail: + val = JS_NAN; + goto done; + mem_error: + val = JS_ThrowOutOfMemory(ctx); + goto done; +} + +typedef enum JSToNumberHintEnum { + TON_FLAG_NUMBER, + TON_FLAG_NUMERIC, +} JSToNumberHintEnum; + +static JSValue JS_ToNumberHintFree(JSContext *ctx, JSValue val, + JSToNumberHintEnum flag) +{ + uint32_t tag; + JSValue ret; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_BIG_INT: + case JS_TAG_SHORT_BIG_INT: + if (flag != TON_FLAG_NUMERIC) { + JS_FreeValue(ctx, val); + return JS_ThrowTypeError(ctx, "cannot convert BigInt to number"); + } + ret = val; + break; + case JS_TAG_FLOAT64: + case JS_TAG_INT: + case JS_TAG_EXCEPTION: + ret = val; + break; + case JS_TAG_BOOL: + case JS_TAG_NULL: + ret = js_int32(JS_VALUE_GET_INT(val)); + break; + case JS_TAG_UNDEFINED: + ret = JS_NAN; + break; + case JS_TAG_OBJECT: + val = JS_ToPrimitiveFree(ctx, val, HINT_NUMBER); + if (JS_IsException(val)) + return JS_EXCEPTION; + goto redo; + case JS_TAG_STRING: + { + const char *str; + const char *p; + size_t len; + + str = JS_ToCStringLen(ctx, &len, val); + JS_FreeValue(ctx, val); + if (!str) + return JS_EXCEPTION; + p = str; + p += skip_spaces(p); + if ((p - str) == len) { + ret = JS_NewInt32(ctx, 0); + } else { + int flags = ATOD_ACCEPT_BIN_OCT; + ret = js_atof(ctx, p, &p, 0, flags); + if (!JS_IsException(ret)) { + p += skip_spaces(p); + if ((p - str) != len) { + JS_FreeValue(ctx, ret); + ret = JS_NAN; + } + } + } + JS_FreeCString(ctx, str); + } + break; + case JS_TAG_SYMBOL: + JS_FreeValue(ctx, val); + return JS_ThrowTypeError(ctx, "cannot convert symbol to number"); + default: + JS_FreeValue(ctx, val); + ret = JS_NAN; + break; + } + return ret; +} + +static JSValue JS_ToNumberFree(JSContext *ctx, JSValue val) +{ + return JS_ToNumberHintFree(ctx, val, TON_FLAG_NUMBER); +} + +static JSValue JS_ToNumericFree(JSContext *ctx, JSValue val) +{ + return JS_ToNumberHintFree(ctx, val, TON_FLAG_NUMERIC); +} + +static JSValue JS_ToNumeric(JSContext *ctx, JSValueConst val) +{ + return JS_ToNumericFree(ctx, js_dup(val)); +} + +static __exception int __JS_ToFloat64Free(JSContext *ctx, double *pres, + JSValue val) +{ + double d; + uint32_t tag; + + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) + goto fail; + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + d = JS_VALUE_GET_INT(val); + break; + case JS_TAG_FLOAT64: + d = JS_VALUE_GET_FLOAT64(val); + break; + default: + abort(); + } + *pres = d; + return 0; +fail: + *pres = NAN; + return -1; +} + +static inline int JS_ToFloat64Free(JSContext *ctx, double *pres, JSValue val) +{ + uint32_t tag; + + tag = JS_VALUE_GET_TAG(val); + if (tag <= JS_TAG_NULL) { + *pres = JS_VALUE_GET_INT(val); + return 0; + } else if (JS_TAG_IS_FLOAT64(tag)) { + *pres = JS_VALUE_GET_FLOAT64(val); + return 0; + } else { + return __JS_ToFloat64Free(ctx, pres, val); + } +} + +int JS_ToFloat64(JSContext *ctx, double *pres, JSValueConst val) +{ + return JS_ToFloat64Free(ctx, pres, js_dup(val)); +} + +JSValue JS_ToNumber(JSContext *ctx, JSValueConst val) +{ + return JS_ToNumberFree(ctx, js_dup(val)); +} + +/* same as JS_ToNumber() but return 0 in case of NaN/Undefined */ +static __maybe_unused JSValue JS_ToIntegerFree(JSContext *ctx, JSValue val) +{ + uint32_t tag; + JSValue ret; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + ret = js_int32(JS_VALUE_GET_INT(val)); + break; + case JS_TAG_FLOAT64: + { + double d = JS_VALUE_GET_FLOAT64(val); + if (isnan(d)) { + ret = js_int32(0); + } else { + /* convert -0 to +0 */ + d = trunc(d) + 0.0; + ret = js_number(d); + } + } + break; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) + return val; + goto redo; + } + return ret; +} + +/* Note: the integer value is satured to 32 bits */ +static int JS_ToInt32SatFree(JSContext *ctx, int *pres, JSValue val) +{ + uint32_t tag; + int ret; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + ret = JS_VALUE_GET_INT(val); + break; + case JS_TAG_EXCEPTION: + *pres = 0; + return -1; + case JS_TAG_FLOAT64: + { + double d = JS_VALUE_GET_FLOAT64(val); + if (isnan(d)) { + ret = 0; + } else { + if (d < INT32_MIN) + ret = INT32_MIN; + else if (d > INT32_MAX) + ret = INT32_MAX; + else + ret = (int)d; + } + } + break; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + goto redo; + } + *pres = ret; + return 0; +} + +static int JS_ToInt32Sat(JSContext *ctx, int *pres, JSValueConst val) +{ + return JS_ToInt32SatFree(ctx, pres, js_dup(val)); +} + +static int JS_ToInt32Clamp(JSContext *ctx, int *pres, JSValueConst val, + int min, int max, int min_offset) +{ + int res = JS_ToInt32SatFree(ctx, pres, js_dup(val)); + if (res == 0) { + if (*pres < min) { + *pres += min_offset; + if (*pres < min) + *pres = min; + } else { + if (*pres > max) + *pres = max; + } + } + return res; +} + +static int JS_ToInt64SatFree(JSContext *ctx, int64_t *pres, JSValue val) +{ + uint32_t tag; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + *pres = JS_VALUE_GET_INT(val); + return 0; + case JS_TAG_EXCEPTION: + *pres = 0; + return -1; + case JS_TAG_FLOAT64: + { + double d = JS_VALUE_GET_FLOAT64(val); + if (isnan(d)) { + *pres = 0; + } else { + if (d < INT64_MIN) + *pres = INT64_MIN; + else if (d >= 0x1p63) + *pres = INT64_MAX; + else + *pres = (int64_t)d; + } + } + return 0; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + goto redo; + } +} + +int JS_ToInt64Sat(JSContext *ctx, int64_t *pres, JSValueConst val) +{ + return JS_ToInt64SatFree(ctx, pres, js_dup(val)); +} + +int JS_ToInt64Clamp(JSContext *ctx, int64_t *pres, JSValueConst val, + int64_t min, int64_t max, int64_t neg_offset) +{ + int res = JS_ToInt64SatFree(ctx, pres, js_dup(val)); + if (res == 0) { + if (*pres < 0) + *pres += neg_offset; + if (*pres < min) + *pres = min; + else if (*pres > max) + *pres = max; + } + return res; +} + +/* Same as JS_ToInt32Free() but with a 64 bit result. Return (<0, 0) + in case of exception */ +static int JS_ToInt64Free(JSContext *ctx, int64_t *pres, JSValue val) +{ + uint32_t tag; + int64_t ret; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + ret = JS_VALUE_GET_INT(val); + break; + case JS_TAG_FLOAT64: + { + JSFloat64Union u; + double d; + int e; + d = JS_VALUE_GET_FLOAT64(val); + u.d = d; + /* we avoid doing fmod(x, 2^64) */ + e = (u.u64 >> 52) & 0x7ff; + if (likely(e <= (1023 + 62))) { + /* fast case */ + ret = (int64_t)d; + } else if (e <= (1023 + 62 + 53)) { + uint64_t v; + /* remainder modulo 2^64 */ + v = (u.u64 & (((uint64_t)1 << 52) - 1)) | ((uint64_t)1 << 52); + ret = v << ((e - 1023) - 52); + /* take the sign into account */ + if (u.u64 >> 63) + if (ret != INT64_MIN) + ret = -ret; + } else { + ret = 0; /* also handles NaN and +inf */ + } + } + break; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + goto redo; + } + *pres = ret; + return 0; +} + +int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValueConst val) +{ + return JS_ToInt64Free(ctx, pres, js_dup(val)); +} + +int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValueConst val) +{ + if (JS_IsBigInt(val)) + return JS_ToBigInt64(ctx, pres, val); + else + return JS_ToInt64(ctx, pres, val); +} + +/* return (<0, 0) in case of exception */ +static int JS_ToInt32Free(JSContext *ctx, int32_t *pres, JSValue val) +{ + uint32_t tag; + int32_t ret; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + ret = JS_VALUE_GET_INT(val); + break; + case JS_TAG_FLOAT64: + { + JSFloat64Union u; + double d; + int e; + d = JS_VALUE_GET_FLOAT64(val); + u.d = d; + /* we avoid doing fmod(x, 2^32) */ + e = (u.u64 >> 52) & 0x7ff; + if (likely(e <= (1023 + 30))) { + /* fast case */ + ret = (int32_t)d; + } else if (e <= (1023 + 30 + 53)) { + uint64_t v; + /* remainder modulo 2^32 */ + v = (u.u64 & (((uint64_t)1 << 52) - 1)) | ((uint64_t)1 << 52); + v = v << ((e - 1023) - 52 + 32); + ret = v >> 32; + /* take the sign into account */ + if (u.u64 >> 63) + if (ret != INT32_MIN) + ret = -ret; + } else { + ret = 0; /* also handles NaN and +inf */ + } + } + break; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + goto redo; + } + *pres = ret; + return 0; +} + +int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val) +{ + return JS_ToInt32Free(ctx, pres, js_dup(val)); +} + +static inline int JS_ToUint32Free(JSContext *ctx, uint32_t *pres, JSValue val) +{ + return JS_ToInt32Free(ctx, (int32_t *)pres, val); +} + +static int JS_ToUint8ClampFree(JSContext *ctx, int32_t *pres, JSValue val) +{ + uint32_t tag; + int res; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + res = JS_VALUE_GET_INT(val); + res = max_int(0, min_int(255, res)); + break; + case JS_TAG_FLOAT64: + { + double d = JS_VALUE_GET_FLOAT64(val); + if (isnan(d)) { + res = 0; + } else { + if (d < 0) + res = 0; + else if (d > 255) + res = 255; + else + res = lrint(d); + } + } + break; + default: + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + goto redo; + } + *pres = res; + return 0; +} + +static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen, + JSValue val, bool is_array_ctor) +{ + uint32_t tag, len; + + tag = JS_VALUE_GET_TAG(val); + switch(tag) { + case JS_TAG_INT: + case JS_TAG_BOOL: + case JS_TAG_NULL: + { + int v; + v = JS_VALUE_GET_INT(val); + if (v < 0) + goto fail; + len = v; + } + break; + default: + if (JS_TAG_IS_FLOAT64(tag)) { + double d; + d = JS_VALUE_GET_FLOAT64(val); + if (!(d >= 0 && d <= UINT32_MAX)) + goto fail; + len = (uint32_t)d; + if (len != d) + goto fail; + } else { + uint32_t len1; + + if (is_array_ctor) { + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) + return -1; + /* cannot recurse because val is a number */ + if (JS_ToArrayLengthFree(ctx, &len, val, true)) + return -1; + } else { + /* legacy behavior: must do the conversion twice and compare */ + if (JS_ToUint32(ctx, &len, val)) { + JS_FreeValue(ctx, val); + return -1; + } + val = JS_ToNumberFree(ctx, val); + if (JS_IsException(val)) + return -1; + /* cannot recurse because val is a number */ + if (JS_ToArrayLengthFree(ctx, &len1, val, false)) + return -1; + if (len1 != len) { + fail: + JS_ThrowRangeError(ctx, "invalid array length"); + return -1; + } + } + } + break; + } + *plen = len; + return 0; +} + +#define MAX_SAFE_INTEGER (((int64_t)1 << 53) - 1) + +static bool is_safe_integer(double d) +{ + return isfinite(d) && floor(d) == d && + fabs(d) <= (double)MAX_SAFE_INTEGER; +} + +int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValueConst val) +{ + int64_t v; + if (JS_ToInt64Sat(ctx, &v, val)) + return -1; + if (v < 0 || v > MAX_SAFE_INTEGER) { + JS_ThrowRangeError(ctx, "invalid array index"); + *plen = 0; + return -1; + } + *plen = v; + return 0; +} + +/* convert a value to a length between 0 and MAX_SAFE_INTEGER. + return -1 for exception */ +static __exception int JS_ToLengthFree(JSContext *ctx, int64_t *plen, + JSValue val) +{ + int res = JS_ToInt64Clamp(ctx, plen, val, 0, MAX_SAFE_INTEGER, 0); + JS_FreeValue(ctx, val); + return res; +} + +/* Note: can return an exception */ +static int JS_NumberIsInteger(JSContext *ctx, JSValueConst val) +{ + double d; + if (!JS_IsNumber(val)) + return false; + if (unlikely(JS_ToFloat64(ctx, &d, val))) + return -1; + return isfinite(d) && floor(d) == d; +} + +static bool JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValueConst val) +{ + uint32_t tag; + + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_INT: + { + int v; + v = JS_VALUE_GET_INT(val); + return (v < 0); + } + case JS_TAG_FLOAT64: + { + JSFloat64Union u; + u.d = JS_VALUE_GET_FLOAT64(val); + return (u.u64 >> 63); + } + case JS_TAG_SHORT_BIG_INT: + return (JS_VALUE_GET_SHORT_BIG_INT(val) < 0); + case JS_TAG_BIG_INT: + { + JSBigInt *p = JS_VALUE_GET_PTR(val); + return js_bigint_sign(p); + } + default: + return false; + } +} + +static JSValue js_bigint_to_string(JSContext *ctx, JSValueConst val) +{ + return js_bigint_to_string1(ctx, val, 10); +} + +/*---- floating point number to string conversions ----*/ + +static JSValue js_dtoa2(JSContext *ctx, + double d, int radix, int n_digits, int flags) +{ + char static_buf[128], *buf, *tmp_buf; + int len, len_max; + JSValue res; + JSDTOATempMem dtoa_mem; + len_max = js_dtoa_max_len(d, radix, n_digits, flags); + + /* longer buffer may be used if radix != 10 */ + if (len_max > sizeof(static_buf) - 1) { + tmp_buf = js_malloc(ctx, len_max + 1); + if (!tmp_buf) + return JS_EXCEPTION; + buf = tmp_buf; + } else { + tmp_buf = NULL; + buf = static_buf; + } + len = js_dtoa(buf, d, radix, n_digits, flags, &dtoa_mem); + res = js_new_string8_len(ctx, buf, len); + js_free(ctx, tmp_buf); + return res; +} + +static JSValue JS_ToStringInternal(JSContext *ctx, JSValueConst val, + int flags) +{ + uint32_t tag; + char buf[32]; + size_t len; + + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_STRING: + return js_dup(val); + case JS_TAG_INT: + len = i32toa(buf, JS_VALUE_GET_INT(val)); + return js_new_string8_len(ctx, buf, len); + case JS_TAG_BOOL: + return JS_AtomToString(ctx, JS_VALUE_GET_BOOL(val) ? + JS_ATOM_true : JS_ATOM_false); + case JS_TAG_NULL: + return JS_AtomToString(ctx, JS_ATOM_null); + case JS_TAG_UNDEFINED: + return JS_AtomToString(ctx, JS_ATOM_undefined); + case JS_TAG_EXCEPTION: + return JS_EXCEPTION; + case JS_TAG_OBJECT: + if (flags & JS_TO_STRING_NO_SIDE_EFFECTS) { + return js_new_string8(ctx, "{}"); + } else { + JSValue val1, ret; + val1 = JS_ToPrimitive(ctx, val, HINT_STRING); + if (JS_IsException(val1)) + return val1; + ret = JS_ToStringInternal(ctx, val1, flags); + JS_FreeValue(ctx, val1); + return ret; + } + break; + case JS_TAG_FUNCTION_BYTECODE: + return js_new_string8(ctx, "[function bytecode]"); + case JS_TAG_SYMBOL: + if (flags & JS_TO_STRING_IS_PROPERTY_KEY) { + return js_dup(val); + } else { + return JS_ThrowTypeError(ctx, "cannot convert symbol to string"); + } + case JS_TAG_FLOAT64: + return js_dtoa2(ctx, JS_VALUE_GET_FLOAT64(val), 10, 0, + JS_DTOA_FORMAT_FREE); + case JS_TAG_SHORT_BIG_INT: + case JS_TAG_BIG_INT: + return js_bigint_to_string(ctx, val); + case JS_TAG_UNINITIALIZED: + return js_new_string8(ctx, "[uninitialized]"); + default: + return js_new_string8(ctx, "[unsupported type]"); + } +} + +JSValue JS_ToString(JSContext *ctx, JSValueConst val) +{ + return JS_ToStringInternal(ctx, val, /*flags*/0); +} + +static JSValue JS_ToStringFree(JSContext *ctx, JSValue val) +{ + JSValue ret; + ret = JS_ToString(ctx, val); + JS_FreeValue(ctx, val); + return ret; +} + +static JSValue JS_ToLocaleStringFree(JSContext *ctx, JSValue val) +{ + if (JS_IsUndefined(val) || JS_IsNull(val)) + return JS_ToStringFree(ctx, val); + return JS_InvokeFree(ctx, val, JS_ATOM_toLocaleString, 0, NULL); +} + +static JSValue JS_ToPropertyKeyInternal(JSContext *ctx, JSValueConst val, + int flags) +{ + return JS_ToStringInternal(ctx, val, flags | JS_TO_STRING_IS_PROPERTY_KEY); +} + +JSValue JS_ToPropertyKey(JSContext *ctx, JSValueConst val) +{ + return JS_ToPropertyKeyInternal(ctx, val, /*flags*/0); +} + +static JSValue JS_ToStringCheckObject(JSContext *ctx, JSValueConst val) +{ + uint32_t tag = JS_VALUE_GET_TAG(val); + if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED) + return JS_ThrowTypeError(ctx, "null or undefined are forbidden"); + return JS_ToString(ctx, val); +} + +static JSValue JS_ToQuotedString(JSContext *ctx, JSValueConst val1) +{ + JSValue val; + JSString *p; + int i; + uint32_t c; + StringBuffer b_s, *b = &b_s; + char buf[16]; + + val = JS_ToStringCheckObject(ctx, val1); + if (JS_IsException(val)) + return val; + p = JS_VALUE_GET_STRING(val); + + if (string_buffer_init(ctx, b, p->len + 2)) + goto fail; + + if (string_buffer_putc8(b, '\"')) + goto fail; + for(i = 0; i < p->len; ) { + c = string_getc(p, &i); + switch(c) { + case '\t': + c = 't'; + goto quote; + case '\r': + c = 'r'; + goto quote; + case '\n': + c = 'n'; + goto quote; + case '\b': + c = 'b'; + goto quote; + case '\f': + c = 'f'; + goto quote; + case '\"': + case '\\': + quote: + if (string_buffer_putc8(b, '\\')) + goto fail; + if (string_buffer_putc8(b, c)) + goto fail; + break; + default: + if (c < 32 || is_surrogate(c)) { + snprintf(buf, sizeof(buf), "\\u%04x", c); + if (string_buffer_write8(b, (uint8_t*)buf, 6)) + goto fail; + } else { + if (string_buffer_putc(b, c)) + goto fail; + } + break; + } + } + if (string_buffer_putc8(b, '\"')) + goto fail; + JS_FreeValue(ctx, val); + return string_buffer_end(b); + fail: + JS_FreeValue(ctx, val); + string_buffer_free(b); + return JS_EXCEPTION; +} + +static __maybe_unused void JS_DumpObjectHeader(JSRuntime *rt) +{ + printf("%14s %4s %4s %14s %10s %s\n", + "ADDRESS", "REFS", "SHRF", "PROTO", "CLASS", "PROPS"); +} + +/* for debug only: dump an object without side effect */ +static __maybe_unused void JS_DumpObject(JSRuntime *rt, JSObject *p) +{ + uint32_t i; + char atom_buf[ATOM_GET_STR_BUF_SIZE]; + JSShape *sh; + JSShapeProperty *prs; + JSProperty *pr; + bool is_first = true; + + /* XXX: should encode atoms with special characters */ + sh = p->shape; /* the shape can be NULL while freeing an object */ + printf("%14p %4d ", + (void *)p, + p->header.ref_count); + if (sh) { + printf("%3d%c %14p ", + sh->header.ref_count, + " *"[sh->is_hashed], + (void *)sh->proto); + } else { + printf("%3s %14s ", "-", "-"); + } + printf("%10s ", + JS_AtomGetStrRT(rt, atom_buf, sizeof(atom_buf), rt->class_array[p->class_id].class_name)); + if (p->is_exotic && p->fast_array) { + printf("[ "); + for(i = 0; i < p->u.array.count; i++) { + if (i != 0) + printf(", "); + switch (p->class_id) { + case JS_CLASS_ARRAY: + case JS_CLASS_ARGUMENTS: + JS_DumpValue(rt, p->u.array.u.values[i]); + break; + case JS_CLASS_UINT8C_ARRAY: + case JS_CLASS_INT8_ARRAY: + case JS_CLASS_UINT8_ARRAY: + case JS_CLASS_INT16_ARRAY: + case JS_CLASS_UINT16_ARRAY: + case JS_CLASS_INT32_ARRAY: + case JS_CLASS_UINT32_ARRAY: + case JS_CLASS_BIG_INT64_ARRAY: + case JS_CLASS_BIG_UINT64_ARRAY: + case JS_CLASS_FLOAT16_ARRAY: + case JS_CLASS_FLOAT32_ARRAY: + case JS_CLASS_FLOAT64_ARRAY: + { + int size = 1 << typed_array_size_log2(p->class_id); + const uint8_t *b = p->u.array.u.uint8_ptr + i * size; + while (size-- > 0) + printf("%02X", *b++); + } + break; + } + } + printf(" ] "); + } + + if (sh) { + printf("{ "); + for(i = 0, prs = get_shape_prop(sh); i < sh->prop_count; i++, prs++) { + if (prs->atom != JS_ATOM_NULL) { + pr = &p->prop[i]; + if (!is_first) + printf(", "); + printf("%s: ", + JS_AtomGetStrRT(rt, atom_buf, sizeof(atom_buf), prs->atom)); + if ((prs->flags & JS_PROP_TMASK) == JS_PROP_GETSET) { + printf("[getset %p %p]", (void *)pr->u.getset.getter, + (void *)pr->u.getset.setter); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_VARREF) { + printf("[varref %p]", (void *)pr->u.var_ref); + } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { + printf("[autoinit %p %d %p]", + (void *)js_autoinit_get_realm(pr), + js_autoinit_get_id(pr), + (void *)pr->u.init.opaque); + } else { + JS_DumpValue(rt, pr->u.value); + } + is_first = false; + } + } + printf(" }"); + } + + if (js_class_has_bytecode(p->class_id)) { + JSFunctionBytecode *b = p->u.func.function_bytecode; + JSVarRef **var_refs; + if (b->closure_var_count) { + var_refs = p->u.func.var_refs; + printf(" Closure:"); + for(i = 0; i < b->closure_var_count; i++) { + printf(" "); + JS_DumpValue(rt, var_refs[i]->value); + } + if (p->u.func.home_object) { + printf(" HomeObject: "); + JS_DumpValue(rt, JS_MKPTR(JS_TAG_OBJECT, p->u.func.home_object)); + } + } + } + printf("\n"); +} + +static __maybe_unused void JS_DumpGCObject(JSRuntime *rt, JSGCObjectHeader *p) +{ + if (p->gc_obj_type == JS_GC_OBJ_TYPE_JS_OBJECT) { + JS_DumpObject(rt, (JSObject *)p); + } else { + printf("%14p %4d ", + (void *)p, + p->ref_count); + switch(p->gc_obj_type) { + case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE: + printf("[function bytecode]"); + break; + case JS_GC_OBJ_TYPE_SHAPE: + printf("[shape]"); + break; + case JS_GC_OBJ_TYPE_VAR_REF: + printf("[var_ref]"); + break; + case JS_GC_OBJ_TYPE_ASYNC_FUNCTION: + printf("[async_function]"); + break; + case JS_GC_OBJ_TYPE_JS_CONTEXT: + printf("[js_context]"); + break; + default: + printf("[unknown %d]", p->gc_obj_type); + break; + } + printf("\n"); + } +} + +static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValueConst val) +{ + uint32_t tag = JS_VALUE_GET_NORM_TAG(val); + const char *str; + + switch(tag) { + case JS_TAG_INT: + printf("%d", JS_VALUE_GET_INT(val)); + break; + case JS_TAG_BOOL: + if (JS_VALUE_GET_BOOL(val)) + str = "true"; + else + str = "false"; + goto print_str; + case JS_TAG_NULL: + str = "null"; + goto print_str; + case JS_TAG_EXCEPTION: + str = "exception"; + goto print_str; + case JS_TAG_UNINITIALIZED: + str = "uninitialized"; + goto print_str; + case JS_TAG_UNDEFINED: + str = "undefined"; + print_str: + printf("%s", str); + break; + case JS_TAG_FLOAT64: + printf("%.14g", JS_VALUE_GET_FLOAT64(val)); + break; + case JS_TAG_SHORT_BIG_INT: + printf("%" PRId64 "n", (int64_t)JS_VALUE_GET_SHORT_BIG_INT(val)); + break; + case JS_TAG_BIG_INT: + { + JSBigInt *p = JS_VALUE_GET_PTR(val); + int sgn, i; + /* In order to avoid allocations we just dump the limbs */ + sgn = js_bigint_sign(p); + if (sgn) + printf("BigInt.asIntN(%d,", p->len * JS_LIMB_BITS); + printf("0x"); + for(i = p->len - 1; i >= 0; i--) { + if (i != p->len - 1) + printf("_"); + printf("%08x", p->tab[i]); + } + printf("n"); + if (sgn) + printf(")"); + } + break; + case JS_TAG_STRING: + { + JSString *p; + p = JS_VALUE_GET_STRING(val); + JS_DumpString(rt, p); + } + break; + case JS_TAG_FUNCTION_BYTECODE: + { + JSFunctionBytecode *b = JS_VALUE_GET_PTR(val); + char buf[ATOM_GET_STR_BUF_SIZE]; + if (b->func_name) { + printf("[bytecode %s]", JS_AtomGetStrRT(rt, buf, sizeof(buf), b->func_name)); + } else { + printf("[bytecode (anonymous)]"); + } + } + break; + case JS_TAG_OBJECT: + { + JSObject *p = JS_VALUE_GET_OBJ(val); + JSAtom atom = rt->class_array[p->class_id].class_name; + char atom_buf[ATOM_GET_STR_BUF_SIZE]; + printf("[%s %p]", + JS_AtomGetStrRT(rt, atom_buf, sizeof(atom_buf), atom), (void *)p); + } + break; + case JS_TAG_SYMBOL: + { + JSAtomStruct *p = JS_VALUE_GET_PTR(val); + char atom_buf[ATOM_GET_STR_BUF_SIZE]; + printf("Symbol(%s)", + JS_AtomGetStrRT(rt, atom_buf, sizeof(atom_buf), js_get_atom_index(rt, p))); + } + break; + case JS_TAG_MODULE: + printf("[module]"); + break; + default: + printf("[unknown tag %d]", tag); + break; + } +} + +bool JS_IsArray(JSValueConst val) +{ + if (JS_VALUE_GET_TAG(val) == JS_TAG_OBJECT) { + JSObject *p = JS_VALUE_GET_OBJ(val); + return p->class_id == JS_CLASS_ARRAY; + } + return false; +} + +/* return -1 if exception (proxy case) or true/false */ +static int js_is_array(JSContext *ctx, JSValueConst val) +{ + JSObject *p; + if (JS_VALUE_GET_TAG(val) == JS_TAG_OBJECT) { + p = JS_VALUE_GET_OBJ(val); + if (unlikely(p->class_id == JS_CLASS_PROXY)) + return js_proxy_isArray(ctx, val); + else + return p->class_id == JS_CLASS_ARRAY; + } else { + return false; + } +} + +static double js_math_pow(double a, double b) +{ + double d; + + if (unlikely(!isfinite(b)) && fabs(a) == 1) { + /* not compatible with IEEE 754 */ + d = NAN; + } else { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + d = pow(a, b); + JS_X87_FPCW_RESTORE(fpcw); + } + return d; +} + +JSValue JS_NewBigInt64(JSContext *ctx, int64_t v) +{ + if (v >= JS_SHORT_BIG_INT_MIN && v <= JS_SHORT_BIG_INT_MAX) { + return __JS_NewShortBigInt(ctx, v); + } else { + JSBigInt *p; + p = js_bigint_new_si64(ctx, v); + if (!p) + return JS_EXCEPTION; + return JS_MKPTR(JS_TAG_BIG_INT, p); + } +} + +JSValue JS_NewBigUint64(JSContext *ctx, uint64_t v) +{ + if (v <= JS_SHORT_BIG_INT_MAX) { + return __JS_NewShortBigInt(ctx, v); + } else { + JSBigInt *p; + p = js_bigint_new_ui64(ctx, v); + if (!p) + return JS_EXCEPTION; + return JS_MKPTR(JS_TAG_BIG_INT, p); + } +} + +/* return NaN if bad bigint literal */ +static JSValue JS_StringToBigInt(JSContext *ctx, JSValue val) +{ + const char *str, *p; + size_t len; + int flags; + + str = JS_ToCStringLen(ctx, &len, val); + JS_FreeValue(ctx, val); + if (!str) + return JS_EXCEPTION; + p = str; + p += skip_spaces(p); + if ((p - str) == len) { + val = JS_NewBigInt64(ctx, 0); + } else { + flags = ATOD_INT_ONLY | ATOD_ACCEPT_BIN_OCT | ATOD_TYPE_BIG_INT; + val = js_atof(ctx, p, &p, 0, flags); + p += skip_spaces(p); + if (!JS_IsException(val)) { + if ((p - str) != len) { + JS_FreeValue(ctx, val); + val = JS_NAN; + } + } + } + JS_FreeCString(ctx, str); + return val; +} + +static JSValue JS_StringToBigIntErr(JSContext *ctx, JSValue val) +{ + val = JS_StringToBigInt(ctx, val); + if (JS_VALUE_IS_NAN(val)) + return JS_ThrowSyntaxError(ctx, "invalid BigInt literal"); + return val; +} + +/* JS Numbers are not allowed */ +static JSValue JS_ToBigIntFree(JSContext *ctx, JSValue val) +{ + uint32_t tag; + + redo: + tag = JS_VALUE_GET_NORM_TAG(val); + switch(tag) { + case JS_TAG_SHORT_BIG_INT: + case JS_TAG_BIG_INT: + break; + case JS_TAG_INT: + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + case JS_TAG_FLOAT64: + goto fail; + case JS_TAG_BOOL: + val = __JS_NewShortBigInt(ctx, JS_VALUE_GET_INT(val)); + break; + case JS_TAG_STRING: + val = JS_StringToBigIntErr(ctx, val); + if (JS_IsException(val)) + return val; + goto redo; + case JS_TAG_OBJECT: + val = JS_ToPrimitiveFree(ctx, val, HINT_NUMBER); + if (JS_IsException(val)) + return val; + goto redo; + default: + fail: + JS_FreeValue(ctx, val); + return JS_ThrowTypeError(ctx, "cannot convert to bigint"); + } + return val; +} + +static JSValue JS_ToBigInt(JSContext *ctx, JSValueConst val) +{ + return JS_ToBigIntFree(ctx, js_dup(val)); +} + +/* XXX: merge with JS_ToInt64Free with a specific flag */ +static int JS_ToBigInt64Free(JSContext *ctx, int64_t *pres, JSValue val) +{ + uint64_t res; + + val = JS_ToBigIntFree(ctx, val); + if (JS_IsException(val)) { + *pres = 0; + return -1; + } + if (JS_VALUE_GET_TAG(val) == JS_TAG_SHORT_BIG_INT) { + res = JS_VALUE_GET_SHORT_BIG_INT(val); + } else { + JSBigInt *p = JS_VALUE_GET_PTR(val); + /* return the value mod 2^64 */ + res = p->tab[0]; + if (p->len >= 2) + res |= (uint64_t)p->tab[1] << 32; + JS_FreeValue(ctx, val); + } + *pres = res; + return 0; +} + +int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValueConst val) +{ + return JS_ToBigInt64Free(ctx, pres, js_dup(val)); +} + +int JS_ToBigUint64(JSContext *ctx, uint64_t *pres, JSValueConst val) +{ + return JS_ToBigInt64Free(ctx, (int64_t *)pres, js_dup(val)); +} + +static no_inline __exception int js_unary_arith_slow(JSContext *ctx, + JSValue *sp, + OPCodeEnum op) +{ + JSValue op1; + int v; + uint32_t tag; + JSBigIntBuf buf1; + JSBigInt *p1; + + op1 = sp[-1]; + /* fast path for float64 */ + if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) + goto handle_float64; + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) + goto exception; + tag = JS_VALUE_GET_TAG(op1); + switch(tag) { + case JS_TAG_INT: + { + int64_t v64; + v64 = JS_VALUE_GET_INT(op1); + switch(op) { + case OP_inc: + case OP_dec: + v = 2 * (op - OP_dec) - 1; + v64 += v; + break; + case OP_plus: + break; + case OP_neg: + if (v64 == 0) { + sp[-1] = js_float64(-0.0); + return 0; + } else { + v64 = -v64; + } + break; + default: + abort(); + } + sp[-1] = js_int64(v64); + } + break; + case JS_TAG_SHORT_BIG_INT: + { + int64_t v; + v = JS_VALUE_GET_SHORT_BIG_INT(op1); + switch(op) { + case OP_plus: + JS_ThrowTypeError(ctx, "bigint argument with unary +"); + goto exception; + case OP_inc: + if (v == JS_SHORT_BIG_INT_MAX) + goto bigint_slow_case; + sp[-1] = __JS_NewShortBigInt(ctx, v + 1); + break; + case OP_dec: + if (v == JS_SHORT_BIG_INT_MIN) + goto bigint_slow_case; + sp[-1] = __JS_NewShortBigInt(ctx, v - 1); + break; + case OP_neg: + v = JS_VALUE_GET_SHORT_BIG_INT(op1); + if (v == JS_SHORT_BIG_INT_MIN) { + bigint_slow_case: + p1 = js_bigint_set_short(&buf1, op1); + goto bigint_slow_case1; + } + sp[-1] = __JS_NewShortBigInt(ctx, -v); + break; + default: + abort(); + } + } + break; + case JS_TAG_BIG_INT: + { + JSBigInt *r; + p1 = JS_VALUE_GET_PTR(op1); + bigint_slow_case1: + switch(op) { + case OP_plus: + JS_ThrowTypeError(ctx, "bigint argument with unary +"); + JS_FreeValue(ctx, op1); + goto exception; + case OP_inc: + case OP_dec: + { + JSBigIntBuf buf2; + JSBigInt *p2; + p2 = js_bigint_set_si(&buf2, 2 * (op - OP_dec) - 1); + r = js_bigint_add(ctx, p1, p2, 0); + } + break; + case OP_neg: + r = js_bigint_neg(ctx, p1); + break; + case OP_not: + r = js_bigint_not(ctx, p1); + break; + default: + abort(); + } + JS_FreeValue(ctx, op1); + if (!r) + goto exception; + sp[-1] = JS_CompactBigInt(ctx, r); + } + break; + default: + handle_float64: + { + double d; + d = JS_VALUE_GET_FLOAT64(op1); + switch(op) { + case OP_inc: + case OP_dec: + v = 2 * (op - OP_dec) - 1; + d += v; + break; + case OP_plus: + break; + case OP_neg: + d = -d; + break; + default: + abort(); + } + sp[-1] = js_float64(d); + } + break; + } + return 0; + exception: + sp[-1] = JS_UNDEFINED; + return -1; +} + +static __exception int js_post_inc_slow(JSContext *ctx, + JSValue *sp, OPCodeEnum op) +{ + JSValue op1; + + /* XXX: allow custom operators */ + op1 = sp[-1]; + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + sp[-1] = JS_UNDEFINED; + return -1; + } + sp[-1] = op1; + sp[0] = js_dup(op1); + return js_unary_arith_slow(ctx, sp + 1, op - OP_post_dec + OP_dec); +} + +static no_inline int js_not_slow(JSContext *ctx, JSValue *sp) +{ + JSValue op1; + + op1 = sp[-1]; + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) + goto exception; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT) { + sp[-1] = __JS_NewShortBigInt(ctx, ~JS_VALUE_GET_SHORT_BIG_INT(op1)); + } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_BIG_INT) { + JSBigInt *r; + r = js_bigint_not(ctx, JS_VALUE_GET_PTR(op1)); + JS_FreeValue(ctx, op1); + if (!r) + goto exception; + sp[-1] = JS_CompactBigInt(ctx, r); + } else { + int32_t v1; + if (unlikely(JS_ToInt32Free(ctx, &v1, op1))) + goto exception; + sp[-1] = js_int32(~v1); + } + return 0; + exception: + sp[-1] = JS_UNDEFINED; + return -1; +} + +static no_inline __exception int js_binary_arith_slow(JSContext *ctx, JSValue *sp, + OPCodeEnum op) +{ + JSValue op1, op2; + uint32_t tag1, tag2; + double d1, d2; + + op1 = sp[-2]; + op2 = sp[-1]; + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + /* fast path for float operations */ + if (tag1 == JS_TAG_FLOAT64 && tag2 == JS_TAG_FLOAT64) { + d1 = JS_VALUE_GET_FLOAT64(op1); + d2 = JS_VALUE_GET_FLOAT64(op2); + goto handle_float64; + } + /* fast path for short big int operations */ + if (tag1 == JS_TAG_SHORT_BIG_INT && tag2 == JS_TAG_SHORT_BIG_INT) { + js_slimb_t v1, v2; + js_sdlimb_t v; + v1 = JS_VALUE_GET_SHORT_BIG_INT(op1); + v2 = JS_VALUE_GET_SHORT_BIG_INT(op2); + switch(op) { + case OP_sub: + v = (js_sdlimb_t)v1 - (js_sdlimb_t)v2; + break; + case OP_mul: + v = (js_sdlimb_t)v1 * (js_sdlimb_t)v2; + break; + case OP_div: + if (v2 == 0 || + ((js_limb_t)v1 == (js_limb_t)1 << (JS_LIMB_BITS - 1) && + v2 == -1)) { + goto slow_big_int; + } + sp[-2] = __JS_NewShortBigInt(ctx, v1 / v2); + return 0; + case OP_mod: + if (v2 == 0 || + ((js_limb_t)v1 == (js_limb_t)1 << (JS_LIMB_BITS - 1) && + v2 == -1)) { + goto slow_big_int; + } + sp[-2] = __JS_NewShortBigInt(ctx, v1 % v2); + return 0; + case OP_pow: + goto slow_big_int; + default: + abort(); + } + if (likely(v >= JS_SHORT_BIG_INT_MIN && v <= JS_SHORT_BIG_INT_MAX)) { + sp[-2] = __JS_NewShortBigInt(ctx, v); + } else { + JSBigInt *r = js_bigint_new_di(ctx, v); + if (!r) + goto exception; + sp[-2] = JS_MKPTR(JS_TAG_BIG_INT, r); + } + return 0; + } + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + if (tag1 == JS_TAG_INT && tag2 == JS_TAG_INT) { + int32_t v1, v2; + int64_t v; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2); + switch(op) { + case OP_sub: + v = (int64_t)v1 - (int64_t)v2; + break; + case OP_mul: + v = (int64_t)v1 * (int64_t)v2; + if (v == 0 && (v1 | v2) < 0) { + sp[-2] = js_float64(-0.0); + return 0; + } + break; + case OP_div: + { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + sp[-2] = js_number((double)v1 / (double)v2); + JS_X87_FPCW_RESTORE(fpcw); + } + return 0; + case OP_mod: + if (v1 < 0 || v2 <= 0) { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + sp[-2] = js_number(fmod(v1, v2)); + JS_X87_FPCW_RESTORE(fpcw); + return 0; + } else { + v = (int64_t)v1 % (int64_t)v2; + } + break; + case OP_pow: + sp[-2] = js_number(js_math_pow(v1, v2)); + return 0; + default: + abort(); + } + sp[-2] = js_int64(v); + } else if ((tag1 == JS_TAG_SHORT_BIG_INT || tag1 == JS_TAG_BIG_INT) && + (tag2 == JS_TAG_SHORT_BIG_INT || tag2 == JS_TAG_BIG_INT)) { + JSBigInt *p1, *p2, *r; + JSBigIntBuf buf1, buf2; + slow_big_int: + /* bigint result */ + if (JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT) + p1 = js_bigint_set_short(&buf1, op1); + else + p1 = JS_VALUE_GET_PTR(op1); + if (JS_VALUE_GET_TAG(op2) == JS_TAG_SHORT_BIG_INT) + p2 = js_bigint_set_short(&buf2, op2); + else + p2 = JS_VALUE_GET_PTR(op2); + switch(op) { + case OP_add: + r = js_bigint_add(ctx, p1, p2, 0); + break; + case OP_sub: + r = js_bigint_add(ctx, p1, p2, 1); + break; + case OP_mul: + r = js_bigint_mul(ctx, p1, p2); + break; + case OP_div: + r = js_bigint_divrem(ctx, p1, p2, false); + break; + case OP_mod: + r = js_bigint_divrem(ctx, p1, p2, true); + break; + case OP_pow: + r = js_bigint_pow(ctx, p1, p2); + break; + default: + abort(); + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + if (!r) + goto exception; + sp[-2] = JS_CompactBigInt(ctx, r); + } else { + double dr; + /* float64 result */ + if (JS_ToFloat64Free(ctx, &d1, op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + if (JS_ToFloat64Free(ctx, &d2, op2)) + goto exception; + handle_float64: + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + switch(op) { + case OP_sub: + dr = d1 - d2; + break; + case OP_mul: + dr = d1 * d2; + break; + case OP_div: + dr = d1 / d2; + break; + case OP_mod: + dr = fmod(d1, d2); + break; + case OP_pow: + dr = js_math_pow(d1, d2); + break; + default: + abort(); + } + JS_X87_FPCW_RESTORE(fpcw); + sp[-2] = js_float64(dr); + } + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static no_inline __exception int js_add_slow(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + uint32_t tag1, tag2; + + op1 = sp[-2]; + op2 = sp[-1]; + + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + /* fast path for float64 */ + if (tag1 == JS_TAG_FLOAT64 && tag2 == JS_TAG_FLOAT64) { + double d1, d2; + d1 = JS_VALUE_GET_FLOAT64(op1); + d2 = JS_VALUE_GET_FLOAT64(op2); + sp[-2] = js_float64(d1 + d2); + return 0; + } + /* fast path for short bigint */ + if (tag1 == JS_TAG_SHORT_BIG_INT && tag2 == JS_TAG_SHORT_BIG_INT) { + js_slimb_t v1, v2; + js_sdlimb_t v; + v1 = JS_VALUE_GET_SHORT_BIG_INT(op1); + v2 = JS_VALUE_GET_SHORT_BIG_INT(op2); + v = (js_sdlimb_t)v1 + (js_sdlimb_t)v2; + if (likely(v >= JS_SHORT_BIG_INT_MIN && v <= JS_SHORT_BIG_INT_MAX)) { + sp[-2] = __JS_NewShortBigInt(ctx, v); + } else { + JSBigInt *r = js_bigint_new_di(ctx, v); + if (!r) + goto exception; + sp[-2] = JS_MKPTR(JS_TAG_BIG_INT, r); + } + return 0; + } + + if (tag1 == JS_TAG_OBJECT || tag2 == JS_TAG_OBJECT) { + op1 = JS_ToPrimitiveFree(ctx, op1, HINT_NONE); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + + op2 = JS_ToPrimitiveFree(ctx, op2, HINT_NONE); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + } + + if (tag1 == JS_TAG_STRING || tag2 == JS_TAG_STRING) { + sp[-2] = JS_ConcatString(ctx, op1, op2); + if (JS_IsException(sp[-2])) + goto exception; + return 0; + } + + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + if (tag1 == JS_TAG_INT && tag2 == JS_TAG_INT) { + int32_t v1, v2; + int64_t v; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2); + v = (int64_t)v1 + (int64_t)v2; + sp[-2] = js_int64(v); + } else if ((tag1 == JS_TAG_BIG_INT || tag1 == JS_TAG_SHORT_BIG_INT) && + (tag2 == JS_TAG_BIG_INT || tag2 == JS_TAG_SHORT_BIG_INT)) { + JSBigInt *p1, *p2, *r; + JSBigIntBuf buf1, buf2; + /* bigint result */ + if (JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT) + p1 = js_bigint_set_short(&buf1, op1); + else + p1 = JS_VALUE_GET_PTR(op1); + if (JS_VALUE_GET_TAG(op2) == JS_TAG_SHORT_BIG_INT) + p2 = js_bigint_set_short(&buf2, op2); + else + p2 = JS_VALUE_GET_PTR(op2); + r = js_bigint_add(ctx, p1, p2, 0); + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + if (!r) + goto exception; + sp[-2] = JS_CompactBigInt(ctx, r); + } else { + double d1, d2; + /* float64 result */ + if (JS_ToFloat64Free(ctx, &d1, op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + if (JS_ToFloat64Free(ctx, &d2, op2)) + goto exception; + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + sp[-2] = js_float64(d1 + d2); + JS_X87_FPCW_RESTORE(fpcw); + } + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static no_inline __exception int js_binary_logic_slow(JSContext *ctx, + JSValue *sp, + OPCodeEnum op) +{ + JSValue op1, op2; + uint32_t tag1, tag2; + uint32_t v1, v2, r; + + op1 = sp[-2]; + op2 = sp[-1]; + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + if (tag1 == JS_TAG_SHORT_BIG_INT && tag2 == JS_TAG_SHORT_BIG_INT) { + js_slimb_t v1, v2, v; + js_sdlimb_t vd; + v1 = JS_VALUE_GET_SHORT_BIG_INT(op1); + v2 = JS_VALUE_GET_SHORT_BIG_INT(op2); + /* bigint fast path */ + switch(op) { + case OP_and: + v = v1 & v2; + break; + case OP_or: + v = v1 | v2; + break; + case OP_xor: + v = v1 ^ v2; + break; + case OP_sar: + if (v2 > (JS_LIMB_BITS - 1)) { + goto slow_big_int; + } else if (v2 < 0) { + if (v2 < -(JS_LIMB_BITS - 1)) + goto slow_big_int; + v2 = -v2; + goto bigint_shl; + } + bigint_sar: + v = v1 >> v2; + break; + case OP_shl: + if (v2 > (JS_LIMB_BITS - 1)) { + goto slow_big_int; + } else if (v2 < 0) { + if (v2 < -(JS_LIMB_BITS - 1)) + goto slow_big_int; + v2 = -v2; + goto bigint_sar; + } + bigint_shl: + vd = (js_dlimb_t)v1 << v2; + if (likely(vd >= JS_SHORT_BIG_INT_MIN && + vd <= JS_SHORT_BIG_INT_MAX)) { + v = vd; + } else { + JSBigInt *r = js_bigint_new_di(ctx, vd); + if (!r) + goto exception; + sp[-2] = JS_MKPTR(JS_TAG_BIG_INT, r); + return 0; + } + break; + default: + abort(); + } + sp[-2] = __JS_NewShortBigInt(ctx, v); + return 0; + } + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + + tag1 = JS_VALUE_GET_TAG(op1); + tag2 = JS_VALUE_GET_TAG(op2); + if ((tag1 == JS_TAG_BIG_INT || tag1 == JS_TAG_SHORT_BIG_INT) && + (tag2 == JS_TAG_BIG_INT || tag2 == JS_TAG_SHORT_BIG_INT)) { + JSBigInt *p1, *p2, *r; + JSBigIntBuf buf1, buf2; + slow_big_int: + if (JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT) + p1 = js_bigint_set_short(&buf1, op1); + else + p1 = JS_VALUE_GET_PTR(op1); + if (JS_VALUE_GET_TAG(op2) == JS_TAG_SHORT_BIG_INT) + p2 = js_bigint_set_short(&buf2, op2); + else + p2 = JS_VALUE_GET_PTR(op2); + switch(op) { + case OP_and: + case OP_or: + case OP_xor: + r = js_bigint_logic(ctx, p1, p2, op); + break; + case OP_shl: + case OP_sar: + { + js_slimb_t shift; + shift = js_bigint_get_si_sat(p2); + if (shift > INT32_MAX) + shift = INT32_MAX; + else if (shift < -INT32_MAX) + shift = -INT32_MAX; + if (op == OP_sar) + shift = -shift; + if (shift >= 0) + r = js_bigint_shl(ctx, p1, shift); + else + r = js_bigint_shr(ctx, p1, -shift); + } + break; + default: + abort(); + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + if (!r) + goto exception; + sp[-2] = JS_CompactBigInt(ctx, r); + } else { + if (unlikely(JS_ToInt32Free(ctx, (int32_t *)&v1, op1))) { + JS_FreeValue(ctx, op2); + goto exception; + } + if (unlikely(JS_ToInt32Free(ctx, (int32_t *)&v2, op2))) + goto exception; + switch(op) { + case OP_shl: + r = v1 << (v2 & 0x1f); + break; + case OP_sar: + r = (int)v1 >> (v2 & 0x1f); + break; + case OP_and: + r = v1 & v2; + break; + case OP_or: + r = v1 | v2; + break; + case OP_xor: + r = v1 ^ v2; + break; + default: + abort(); + } + sp[-2] = js_int32(r); + } + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +/* op1 must be a bigint or int. */ +static JSBigInt *JS_ToBigIntBuf(JSContext *ctx, JSBigIntBuf *buf1, + JSValue op1) +{ + JSBigInt *p1; + + switch(JS_VALUE_GET_TAG(op1)) { + case JS_TAG_INT: + p1 = js_bigint_set_si(buf1, JS_VALUE_GET_INT(op1)); + break; + case JS_TAG_SHORT_BIG_INT: + p1 = js_bigint_set_short(buf1, op1); + break; + case JS_TAG_BIG_INT: + p1 = JS_VALUE_GET_PTR(op1); + break; + default: + abort(); + } + return p1; +} + +/* op1 and op2 must be numeric types and at least one must be a + bigint. No exception is generated. */ +static int js_compare_bigint(JSContext *ctx, OPCodeEnum op, + JSValue op1, JSValue op2) +{ + int res, val, tag1, tag2; + JSBigIntBuf buf1, buf2; + JSBigInt *p1, *p2; + + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + if ((tag1 == JS_TAG_SHORT_BIG_INT || tag1 == JS_TAG_INT) && + (tag2 == JS_TAG_SHORT_BIG_INT || tag2 == JS_TAG_INT)) { + /* fast path */ + js_slimb_t v1, v2; + if (tag1 == JS_TAG_INT) + v1 = JS_VALUE_GET_INT(op1); + else + v1 = JS_VALUE_GET_SHORT_BIG_INT(op1); + if (tag2 == JS_TAG_INT) + v2 = JS_VALUE_GET_INT(op2); + else + v2 = JS_VALUE_GET_SHORT_BIG_INT(op2); + val = (v1 > v2) - (v1 < v2); + } else { + if (tag1 == JS_TAG_FLOAT64) { + p2 = JS_ToBigIntBuf(ctx, &buf2, op2); + val = js_bigint_float64_cmp(ctx, p2, JS_VALUE_GET_FLOAT64(op1)); + if (val == 2) + goto unordered; + val = -val; + } else if (tag2 == JS_TAG_FLOAT64) { + p1 = JS_ToBigIntBuf(ctx, &buf1, op1); + val = js_bigint_float64_cmp(ctx, p1, JS_VALUE_GET_FLOAT64(op2)); + if (val == 2) { + unordered: + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + return false; + } + } else { + p1 = JS_ToBigIntBuf(ctx, &buf1, op1); + p2 = JS_ToBigIntBuf(ctx, &buf2, op2); + val = js_bigint_cmp(ctx, p1, p2); + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + } + + switch(op) { + case OP_lt: + res = val < 0; + break; + case OP_lte: + res = val <= 0; + break; + case OP_gt: + res = val > 0; + break; + case OP_gte: + res = val >= 0; + break; + case OP_eq: + res = val == 0; + break; + default: + abort(); + } + return res; +} + +static no_inline int js_relational_slow(JSContext *ctx, JSValue *sp, + OPCodeEnum op) +{ + JSValue op1, op2; + int res; + uint32_t tag1, tag2; + + op1 = sp[-2]; + op2 = sp[-1]; + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + op1 = JS_ToPrimitiveFree(ctx, op1, HINT_NUMBER); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToPrimitiveFree(ctx, op2, HINT_NUMBER); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + if (tag1 == JS_TAG_STRING && tag2 == JS_TAG_STRING) { + JSString *p1, *p2; + p1 = JS_VALUE_GET_STRING(op1); + p2 = JS_VALUE_GET_STRING(op2); + res = js_string_compare(p1, p2); + switch(op) { + case OP_lt: + res = (res < 0); + break; + case OP_lte: + res = (res <= 0); + break; + case OP_gt: + res = (res > 0); + break; + default: + case OP_gte: + res = (res >= 0); + break; + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + } else if ((tag1 <= JS_TAG_NULL || tag1 == JS_TAG_FLOAT64) && + (tag2 <= JS_TAG_NULL || tag2 == JS_TAG_FLOAT64)) { + /* fast path for float64/int */ + goto float64_compare; + } else { + if ((((tag1 == JS_TAG_BIG_INT || tag1 == JS_TAG_SHORT_BIG_INT) && + tag2 == JS_TAG_STRING) || + ((tag2 == JS_TAG_BIG_INT || tag2 == JS_TAG_SHORT_BIG_INT) && + tag1 == JS_TAG_STRING))) { + if (tag1 == JS_TAG_STRING) { + op1 = JS_StringToBigInt(ctx, op1); + if (JS_VALUE_GET_TAG(op1) != JS_TAG_BIG_INT && + JS_VALUE_GET_TAG(op1) != JS_TAG_SHORT_BIG_INT) + goto invalid_bigint_string; + } + if (tag2 == JS_TAG_STRING) { + op2 = JS_StringToBigInt(ctx, op2); + if (JS_VALUE_GET_TAG(op2) != JS_TAG_BIG_INT && + JS_VALUE_GET_TAG(op2) != JS_TAG_SHORT_BIG_INT) { + invalid_bigint_string: + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + res = false; + goto done; + } + } + } else { + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + } + + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + + if (tag1 == JS_TAG_BIG_INT || tag1 == JS_TAG_SHORT_BIG_INT || + tag2 == JS_TAG_BIG_INT || tag2 == JS_TAG_SHORT_BIG_INT) { + res = js_compare_bigint(ctx, op, op1, op2); + } else { + double d1, d2; + + float64_compare: + /* can use floating point comparison */ + if (tag1 == JS_TAG_FLOAT64) { + d1 = JS_VALUE_GET_FLOAT64(op1); + } else { + d1 = JS_VALUE_GET_INT(op1); + } + if (tag2 == JS_TAG_FLOAT64) { + d2 = JS_VALUE_GET_FLOAT64(op2); + } else { + d2 = JS_VALUE_GET_INT(op2); + } + switch(op) { + case OP_lt: + res = (d1 < d2); /* if NaN return false */ + break; + case OP_lte: + res = (d1 <= d2); /* if NaN return false */ + break; + case OP_gt: + res = (d1 > d2); /* if NaN return false */ + break; + default: + case OP_gte: + res = (d1 >= d2); /* if NaN return false */ + break; + } + } + } + done: + sp[-2] = js_bool(res); + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static bool tag_is_number(uint32_t tag) +{ + return (tag == JS_TAG_INT || + tag == JS_TAG_FLOAT64 || + tag == JS_TAG_BIG_INT || tag == JS_TAG_SHORT_BIG_INT); +} + +static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp, + bool is_neq) +{ + JSValue op1, op2; + int res; + uint32_t tag1, tag2; + + op1 = sp[-2]; + op2 = sp[-1]; + redo: + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + if (tag_is_number(tag1) && tag_is_number(tag2)) { + if (tag1 == JS_TAG_INT && tag2 == JS_TAG_INT) { + res = JS_VALUE_GET_INT(op1) == JS_VALUE_GET_INT(op2); + } else if ((tag1 == JS_TAG_FLOAT64 && + (tag2 == JS_TAG_INT || tag2 == JS_TAG_FLOAT64)) || + (tag2 == JS_TAG_FLOAT64 && + (tag1 == JS_TAG_INT || tag1 == JS_TAG_FLOAT64))) { + double d1, d2; + if (tag1 == JS_TAG_FLOAT64) { + d1 = JS_VALUE_GET_FLOAT64(op1); + } else { + d1 = JS_VALUE_GET_INT(op1); + } + if (tag2 == JS_TAG_FLOAT64) { + d2 = JS_VALUE_GET_FLOAT64(op2); + } else { + d2 = JS_VALUE_GET_INT(op2); + } + res = (d1 == d2); + } else { + res = js_compare_bigint(ctx, OP_eq, op1, op2); + if (res < 0) + goto exception; + } + } else if (tag1 == tag2) { + res = js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT); + } else if ((tag1 == JS_TAG_NULL && tag2 == JS_TAG_UNDEFINED) || + (tag2 == JS_TAG_NULL && tag1 == JS_TAG_UNDEFINED)) { + res = true; + } else if ((tag1 == JS_TAG_STRING && tag_is_number(tag2)) || + (tag2 == JS_TAG_STRING && tag_is_number(tag1))) { + + if (tag1 == JS_TAG_BIG_INT || tag1 == JS_TAG_SHORT_BIG_INT || + tag2 == JS_TAG_BIG_INT || tag2 == JS_TAG_SHORT_BIG_INT) { + if (tag1 == JS_TAG_STRING) { + op1 = JS_StringToBigInt(ctx, op1); + if (JS_VALUE_GET_TAG(op1) != JS_TAG_BIG_INT && + JS_VALUE_GET_TAG(op1) != JS_TAG_SHORT_BIG_INT) + goto invalid_bigint_string; + } + if (tag2 == JS_TAG_STRING) { + op2 = JS_StringToBigInt(ctx, op2); + if (JS_VALUE_GET_TAG(op2) != JS_TAG_BIG_INT && + JS_VALUE_GET_TAG(op2) != JS_TAG_SHORT_BIG_INT ) { + invalid_bigint_string: + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + res = false; + goto done; + } + } + } else { + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + } + res = js_strict_eq(ctx, op1, op2); + } else if (tag1 == JS_TAG_BOOL) { + op1 = js_int32(JS_VALUE_GET_INT(op1)); + goto redo; + } else if (tag2 == JS_TAG_BOOL) { + op2 = js_int32(JS_VALUE_GET_INT(op2)); + goto redo; + } else if ((tag1 == JS_TAG_OBJECT && + (tag_is_number(tag2) || tag2 == JS_TAG_STRING || tag2 == JS_TAG_SYMBOL)) || + (tag2 == JS_TAG_OBJECT && + (tag_is_number(tag1) || tag1 == JS_TAG_STRING || tag1 == JS_TAG_SYMBOL))) { + op1 = JS_ToPrimitiveFree(ctx, op1, HINT_NONE); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToPrimitiveFree(ctx, op2, HINT_NONE); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + goto redo; + } else { + /* IsHTMLDDA object is equivalent to undefined for '==' and '!=' */ + if ((JS_IsHTMLDDA(ctx, op1) && + (tag2 == JS_TAG_NULL || tag2 == JS_TAG_UNDEFINED)) || + (JS_IsHTMLDDA(ctx, op2) && + (tag1 == JS_TAG_NULL || tag1 == JS_TAG_UNDEFINED))) { + res = true; + } else { + res = false; + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + } + done: + sp[-2] = js_bool(res ^ is_neq); + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static no_inline int js_shr_slow(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + uint32_t v1, v2, r; + + op1 = sp[-2]; + op2 = sp[-1]; + op1 = JS_ToNumericFree(ctx, op1); + if (JS_IsException(op1)) { + JS_FreeValue(ctx, op2); + goto exception; + } + op2 = JS_ToNumericFree(ctx, op2); + if (JS_IsException(op2)) { + JS_FreeValue(ctx, op1); + goto exception; + } + + if (JS_VALUE_GET_TAG(op1) == JS_TAG_BIG_INT || + JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT || + JS_VALUE_GET_TAG(op2) == JS_TAG_BIG_INT || + JS_VALUE_GET_TAG(op2) == JS_TAG_SHORT_BIG_INT) { + JS_ThrowTypeError(ctx, "BigInt operands are forbidden for >>>"); + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + goto exception; + } + /* cannot give an exception */ + JS_ToUint32Free(ctx, &v1, op1); + JS_ToUint32Free(ctx, &v2, op2); + r = v1 >> (v2 & 0x1f); + sp[-2] = js_uint32(r); + return 0; + exception: + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static bool js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2, + JSStrictEqModeEnum eq_mode) +{ + bool res; + int tag1, tag2; + double d1, d2; + + tag1 = JS_VALUE_GET_NORM_TAG(op1); + tag2 = JS_VALUE_GET_NORM_TAG(op2); + switch(tag1) { + case JS_TAG_BOOL: + if (tag1 != tag2) { + res = false; + } else { + res = JS_VALUE_GET_INT(op1) == JS_VALUE_GET_INT(op2); + goto done_no_free; + } + break; + case JS_TAG_NULL: + case JS_TAG_UNDEFINED: + res = (tag1 == tag2); + break; + case JS_TAG_STRING: + { + JSString *p1, *p2; + if (tag1 != tag2) { + res = false; + } else { + p1 = JS_VALUE_GET_STRING(op1); + p2 = JS_VALUE_GET_STRING(op2); + res = js_string_eq(p1, p2); + } + } + break; + case JS_TAG_SYMBOL: + { + JSAtomStruct *p1, *p2; + if (tag1 != tag2) { + res = false; + } else { + p1 = JS_VALUE_GET_PTR(op1); + p2 = JS_VALUE_GET_PTR(op2); + res = (p1 == p2); + } + } + break; + case JS_TAG_OBJECT: + if (tag1 != tag2) + res = false; + else + res = JS_VALUE_GET_OBJ(op1) == JS_VALUE_GET_OBJ(op2); + break; + case JS_TAG_INT: + d1 = JS_VALUE_GET_INT(op1); + if (tag2 == JS_TAG_INT) { + d2 = JS_VALUE_GET_INT(op2); + goto number_test; + } else if (tag2 == JS_TAG_FLOAT64) { + d2 = JS_VALUE_GET_FLOAT64(op2); + goto number_test; + } else { + res = false; + } + break; + case JS_TAG_FLOAT64: + d1 = JS_VALUE_GET_FLOAT64(op1); + if (tag2 == JS_TAG_FLOAT64) { + d2 = JS_VALUE_GET_FLOAT64(op2); + } else if (tag2 == JS_TAG_INT) { + d2 = JS_VALUE_GET_INT(op2); + } else { + res = false; + break; + } + number_test: + if (unlikely(eq_mode >= JS_EQ_SAME_VALUE)) { + JSFloat64Union u1, u2; + /* NaN is not always normalized, so this test is necessary */ + if (isnan(d1) || isnan(d2)) { + res = isnan(d1) == isnan(d2); + } else if (eq_mode == JS_EQ_SAME_VALUE_ZERO) { + res = (d1 == d2); /* +0 == -0 */ + } else { + u1.d = d1; + u2.d = d2; + res = (u1.u64 == u2.u64); /* +0 != -0 */ + } + } else { + res = (d1 == d2); /* if NaN return false and +0 == -0 */ + } + goto done_no_free; + case JS_TAG_SHORT_BIG_INT: + case JS_TAG_BIG_INT: + { + JSBigIntBuf buf1, buf2; + JSBigInt *p1, *p2; + + if (tag2 != JS_TAG_SHORT_BIG_INT && + tag2 != JS_TAG_BIG_INT) { + res = false; + break; + } + + if (JS_VALUE_GET_TAG(op1) == JS_TAG_SHORT_BIG_INT) + p1 = js_bigint_set_short(&buf1, op1); + else + p1 = JS_VALUE_GET_PTR(op1); + if (JS_VALUE_GET_TAG(op2) == JS_TAG_SHORT_BIG_INT) + p2 = js_bigint_set_short(&buf2, op2); + else + p2 = JS_VALUE_GET_PTR(op2); + res = (js_bigint_cmp(ctx, p1, p2) == 0); + } + break; + default: + res = false; + break; + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + done_no_free: + return res; +} + +static bool js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2) +{ + return js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT); +} + +static bool js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2) +{ + return js_strict_eq2(ctx, js_dup(op1), js_dup(op2), JS_EQ_SAME_VALUE); +} + +static bool js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2) +{ + return js_strict_eq2(ctx, js_dup(op1), js_dup(op2), JS_EQ_SAME_VALUE_ZERO); +} + +static no_inline int js_strict_eq_slow(JSContext *ctx, JSValue *sp, + bool is_neq) +{ + bool res; + res = js_strict_eq(ctx, sp[-2], sp[-1]); + sp[-2] = js_bool(res ^ is_neq); + return 0; +} + +static __exception int js_operator_in(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + JSAtom atom; + int ret; + + op1 = sp[-2]; + op2 = sp[-1]; + + if (JS_VALUE_GET_TAG(op2) != JS_TAG_OBJECT) { + JS_ThrowTypeError(ctx, "invalid 'in' operand"); + return -1; + } + atom = JS_ValueToAtom(ctx, op1); + if (unlikely(atom == JS_ATOM_NULL)) + return -1; + ret = JS_HasProperty(ctx, op2, atom); + JS_FreeAtom(ctx, atom); + if (ret < 0) + return -1; + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + sp[-2] = js_bool(ret); + return 0; +} + +static __exception int js_operator_private_in(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + int ret; + op1 = sp[-2]; /* object */ + op2 = sp[-1]; /* field name or method function */ + if (JS_VALUE_GET_TAG(op1) != JS_TAG_OBJECT) { + JS_ThrowTypeError(ctx, "invalid 'in' operand"); + return -1; + } + if (JS_IsObject(op2)) { + /* method: use the brand */ + ret = JS_CheckBrand(ctx, op1, op2); + if (ret < 0) + return -1; + } else { + JSAtom atom; + JSObject *p; + JSShapeProperty *prs; + JSProperty *pr; + /* field */ + atom = JS_ValueToAtom(ctx, op2); + if (unlikely(atom == JS_ATOM_NULL)) + return -1; + p = JS_VALUE_GET_OBJ(op1); + prs = find_own_property(&pr, p, atom); + JS_FreeAtom(ctx, atom); + ret = (prs != NULL); + } + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + sp[-2] = js_bool(ret); + return 0; +} + +static __exception int js_has_unscopable(JSContext *ctx, JSValue obj, + JSAtom atom) +{ + JSValue arr, val; + int ret; + + arr = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_unscopables); + if (JS_IsException(arr)) + return -1; + ret = 0; + if (JS_IsObject(arr)) { + val = JS_GetProperty(ctx, arr, atom); + ret = JS_ToBoolFree(ctx, val); + } + JS_FreeValue(ctx, arr); + return ret; +} + +static __exception int js_operator_instanceof(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + int ret; + + op1 = sp[-2]; + op2 = sp[-1]; + ret = JS_IsInstanceOf(ctx, op1, op2); + if (ret < 0) + return ret; + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + sp[-2] = js_bool(ret); + return 0; +} + +static __exception int js_operator_typeof(JSContext *ctx, JSValue op1) +{ + JSAtom atom; + uint32_t tag; + + tag = JS_VALUE_GET_NORM_TAG(op1); + switch(tag) { + case JS_TAG_SHORT_BIG_INT: + case JS_TAG_BIG_INT: + atom = JS_ATOM_bigint; + break; + case JS_TAG_INT: + case JS_TAG_FLOAT64: + atom = JS_ATOM_number; + break; + case JS_TAG_UNDEFINED: + atom = JS_ATOM_undefined; + break; + case JS_TAG_BOOL: + atom = JS_ATOM_boolean; + break; + case JS_TAG_STRING: + atom = JS_ATOM_string; + break; + case JS_TAG_OBJECT: + { + JSObject *p; + p = JS_VALUE_GET_OBJ(op1); + if (unlikely(p->is_HTMLDDA)) + atom = JS_ATOM_undefined; + else if (JS_IsFunction(ctx, op1)) + atom = JS_ATOM_function; + else + goto obj_type; + } + break; + case JS_TAG_NULL: + obj_type: + atom = JS_ATOM_object; + break; + case JS_TAG_SYMBOL: + atom = JS_ATOM_symbol; + break; + default: + atom = JS_ATOM_unknown; + break; + } + return atom; +} + +static __exception int js_operator_delete(JSContext *ctx, JSValue *sp) +{ + JSValue op1, op2; + JSAtom atom; + int ret; + + op1 = sp[-2]; + op2 = sp[-1]; + atom = JS_ValueToAtom(ctx, op2); + if (unlikely(atom == JS_ATOM_NULL)) + return -1; + ret = JS_DeleteProperty(ctx, op1, atom, JS_PROP_THROW_STRICT); + JS_FreeAtom(ctx, atom); + if (unlikely(ret < 0)) + return -1; + JS_FreeValue(ctx, op1); + JS_FreeValue(ctx, op2); + sp[-2] = js_bool(ret); + return 0; +} + +static JSValue js_throw_type_error(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val); + if (!b || b->is_strict_mode || !b->has_prototype) { + return JS_ThrowTypeError(ctx, "invalid property access"); + } + return JS_UNDEFINED; +} + +static JSValue js_function_proto_fileName(JSContext *ctx, + JSValueConst this_val) +{ + JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val); + if (b) { + return JS_AtomToString(ctx, b->filename); + } + return JS_UNDEFINED; +} + +static JSValue js_function_proto_int32(JSContext *ctx, + JSValueConst this_val, + int magic) +{ + JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val); + if (b) { + int *field = (int *) ((char *)b + magic); + return js_int32(*field); + } + return JS_UNDEFINED; +} + +static int js_arguments_define_own_property(JSContext *ctx, + JSValueConst this_obj, + JSAtom prop, JSValueConst val, + JSValueConst getter, + JSValueConst setter, int flags) +{ + JSObject *p; + uint32_t idx; + p = JS_VALUE_GET_OBJ(this_obj); + /* convert to normal array when redefining an existing numeric field */ + if (p->fast_array && JS_AtomIsArrayIndex(ctx, &idx, prop) && + idx < p->u.array.count) { + if (convert_fast_array_to_array(ctx, p)) + return -1; + } + /* run the default define own property */ + return JS_DefineProperty(ctx, this_obj, prop, val, getter, setter, + flags | JS_PROP_NO_EXOTIC); +} + +static const JSClassExoticMethods js_arguments_exotic_methods = { + .define_own_property = js_arguments_define_own_property, +}; + +static JSValue js_build_arguments(JSContext *ctx, int argc, JSValueConst *argv) +{ + JSValue val, *tab; + JSProperty *pr; + JSObject *p; + int i; + + val = JS_NewObjectProtoClass(ctx, ctx->class_proto[JS_CLASS_OBJECT], + JS_CLASS_ARGUMENTS); + if (JS_IsException(val)) + return val; + p = JS_VALUE_GET_OBJ(val); + + /* add the length field (cannot fail) */ + pr = add_property(ctx, p, JS_ATOM_length, + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + if (!pr) { + JS_FreeValue(ctx, val); + return JS_EXCEPTION; + } + pr->u.value = js_int32(argc); + + /* initialize the fast array part */ + tab = NULL; + if (argc > 0) { + tab = js_malloc(ctx, sizeof(tab[0]) * argc); + if (!tab) { + JS_FreeValue(ctx, val); + return JS_EXCEPTION; + } + for(i = 0; i < argc; i++) { + tab[i] = js_dup(argv[i]); + } + } + p->u.array.u.values = tab; + p->u.array.count = argc; + + JS_DefinePropertyValue(ctx, val, JS_ATOM_Symbol_iterator, + js_dup(ctx->array_proto_values), + JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE); + /* add callee property to throw a TypeError in strict mode */ + JS_DefineProperty(ctx, val, JS_ATOM_callee, JS_UNDEFINED, + ctx->throw_type_error, ctx->throw_type_error, + JS_PROP_HAS_GET | JS_PROP_HAS_SET); + return val; +} + +#define GLOBAL_VAR_OFFSET 0x40000000 +#define ARGUMENT_VAR_OFFSET 0x20000000 + +/* legacy arguments object: add references to the function arguments */ +static JSValue js_build_mapped_arguments(JSContext *ctx, int argc, + JSValueConst *argv, + JSStackFrame *sf, int arg_count) +{ + JSValue val; + JSProperty *pr; + JSObject *p; + int i; + + val = JS_NewObjectProtoClass(ctx, ctx->class_proto[JS_CLASS_OBJECT], + JS_CLASS_MAPPED_ARGUMENTS); + if (JS_IsException(val)) + return val; + p = JS_VALUE_GET_OBJ(val); + + /* add the length field (cannot fail) */ + pr = add_property(ctx, p, JS_ATOM_length, + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + if (!pr) + goto fail; + pr->u.value = js_int32(argc); + + for(i = 0; i < arg_count; i++) { + JSVarRef *var_ref; + var_ref = get_var_ref(ctx, sf, i, true); + if (!var_ref) + goto fail; + pr = add_property(ctx, p, __JS_AtomFromUInt32(i), JS_PROP_C_W_E | JS_PROP_VARREF); + if (!pr) { + free_var_ref(ctx->rt, var_ref); + goto fail; + } + pr->u.var_ref = var_ref; + } + + /* the arguments not mapped to the arguments of the function can + be normal properties */ + for(i = arg_count; i < argc; i++) { + if (JS_DefinePropertyValueUint32(ctx, val, i, + js_dup(argv[i]), + JS_PROP_C_W_E) < 0) + goto fail; + } + + JS_DefinePropertyValue(ctx, val, JS_ATOM_Symbol_iterator, + js_dup(ctx->array_proto_values), + JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE); + /* callee returns this function in non strict mode */ + JS_DefinePropertyValue(ctx, val, JS_ATOM_callee, + js_dup(ctx->rt->current_stack_frame->cur_func), + JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE); + return val; + fail: + JS_FreeValue(ctx, val); + return JS_EXCEPTION; +} + +static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj) +{ + JSObject *p; + JSPropertyEnum *tab_atom; + int i; + JSValue enum_obj, obj1; + JSForInIterator *it; + uint32_t tag, tab_atom_count; + + tag = JS_VALUE_GET_TAG(obj); + if (tag != JS_TAG_OBJECT && tag != JS_TAG_NULL && tag != JS_TAG_UNDEFINED) { + obj = JS_ToObjectFree(ctx, obj); + } + + it = js_malloc(ctx, sizeof(*it)); + if (!it) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + enum_obj = JS_NewObjectProtoClass(ctx, JS_NULL, JS_CLASS_FOR_IN_ITERATOR); + if (JS_IsException(enum_obj)) { + js_free(ctx, it); + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + it->is_array = false; + it->obj = obj; + it->idx = 0; + p = JS_VALUE_GET_OBJ(enum_obj); + p->u.for_in_iterator = it; + + if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED) + return enum_obj; + + /* fast path: assume no enumerable properties in the prototype chain */ + obj1 = js_dup(obj); + for(;;) { + obj1 = JS_GetPrototypeFree(ctx, obj1); + if (JS_IsNull(obj1)) + break; + if (JS_IsException(obj1)) + goto fail; + if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, + JS_VALUE_GET_OBJ(obj1), + JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY)) { + JS_FreeValue(ctx, obj1); + goto fail; + } + js_free_prop_enum(ctx, tab_atom, tab_atom_count); + if (tab_atom_count != 0) { + JS_FreeValue(ctx, obj1); + goto slow_path; + } + /* must check for timeout to avoid infinite loop */ + if (js_poll_interrupts(ctx)) { + JS_FreeValue(ctx, obj1); + goto fail; + } + } + + p = JS_VALUE_GET_OBJ(obj); + + if (p->fast_array) { + JSShape *sh; + JSShapeProperty *prs; + /* check that there are no enumerable normal fields */ + sh = p->shape; + for(i = 0, prs = get_shape_prop(sh); i < sh->prop_count; i++, prs++) { + if (prs->flags & JS_PROP_ENUMERABLE) + goto normal_case; + } + /* for fast arrays, we only store the number of elements */ + it->is_array = true; + it->array_length = p->u.array.count; + } else { + normal_case: + if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p, + JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY)) + goto fail; + for(i = 0; i < tab_atom_count; i++) { + JS_SetPropertyInternal(ctx, enum_obj, tab_atom[i].atom, JS_NULL, 0); + } + js_free_prop_enum(ctx, tab_atom, tab_atom_count); + } + return enum_obj; + + slow_path: + /* non enumerable properties hide the enumerables ones in the + prototype chain */ + obj1 = js_dup(obj); + for(;;) { + if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, + JS_VALUE_GET_OBJ(obj1), + JS_GPN_STRING_MASK | JS_GPN_SET_ENUM)) { + JS_FreeValue(ctx, obj1); + goto fail; + } + for(i = 0; i < tab_atom_count; i++) { + JS_DefinePropertyValue(ctx, enum_obj, tab_atom[i].atom, JS_NULL, + (tab_atom[i].is_enumerable ? + JS_PROP_ENUMERABLE : 0)); + } + js_free_prop_enum(ctx, tab_atom, tab_atom_count); + obj1 = JS_GetPrototypeFree(ctx, obj1); + if (JS_IsNull(obj1)) + break; + if (JS_IsException(obj1)) + goto fail; + /* must check for timeout to avoid infinite loop */ + if (js_poll_interrupts(ctx)) { + JS_FreeValue(ctx, obj1); + goto fail; + } + } + return enum_obj; + + fail: + JS_FreeValue(ctx, enum_obj); + return JS_EXCEPTION; +} + +/* obj -> enum_obj */ +static __exception int js_for_in_start(JSContext *ctx, JSValue *sp) +{ + sp[-1] = build_for_in_iterator(ctx, sp[-1]); + if (JS_IsException(sp[-1])) + return -1; + return 0; +} + +/* enum_obj -> enum_obj value done */ +static __exception int js_for_in_next(JSContext *ctx, JSValue *sp) +{ + JSValue enum_obj; + JSObject *p; + JSAtom prop; + JSForInIterator *it; + int ret; + + enum_obj = sp[-1]; + /* fail safe */ + if (JS_VALUE_GET_TAG(enum_obj) != JS_TAG_OBJECT) + goto done; + p = JS_VALUE_GET_OBJ(enum_obj); + if (p->class_id != JS_CLASS_FOR_IN_ITERATOR) + goto done; + it = p->u.for_in_iterator; + + for(;;) { + if (it->is_array) { + if (it->idx >= it->array_length) + goto done; + prop = __JS_AtomFromUInt32(it->idx); + it->idx++; + } else { + JSShape *sh = p->shape; + JSShapeProperty *prs; + if (it->idx >= sh->prop_count) + goto done; + prs = get_shape_prop(sh) + it->idx; + prop = prs->atom; + it->idx++; + if (prop == JS_ATOM_NULL || !(prs->flags & JS_PROP_ENUMERABLE)) + continue; + } + // check if the property was deleted unless we're dealing with a proxy + JSValue obj = it->obj; + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + JSObject *p = JS_VALUE_GET_OBJ(obj); + if (p->class_id == JS_CLASS_PROXY) + break; + } + ret = JS_HasProperty(ctx, obj, prop); + if (ret < 0) + return ret; + if (ret) + break; + } + /* return the property */ + sp[0] = JS_AtomToValue(ctx, prop); + sp[1] = JS_FALSE; + return 0; + done: + /* return the end */ + sp[0] = JS_UNDEFINED; + sp[1] = JS_TRUE; + return 0; +} + +static JSValue JS_GetIterator2(JSContext *ctx, JSValueConst obj, + JSValueConst method) +{ + JSValue enum_obj; + + enum_obj = JS_Call(ctx, method, obj, 0, NULL); + if (JS_IsException(enum_obj)) + return enum_obj; + if (!JS_IsObject(enum_obj)) { + JS_FreeValue(ctx, enum_obj); + return JS_ThrowTypeErrorNotAnObject(ctx); + } + return enum_obj; +} + +static JSValue JS_GetIterator(JSContext *ctx, JSValueConst obj, bool is_async) +{ + JSValue method, ret, sync_iter; + + if (is_async) { + method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_asyncIterator); + if (JS_IsException(method)) + return method; + if (JS_IsUndefined(method) || JS_IsNull(method)) { + method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_iterator); + if (JS_IsException(method)) + return method; + sync_iter = JS_GetIterator2(ctx, obj, method); + JS_FreeValue(ctx, method); + if (JS_IsException(sync_iter)) + return sync_iter; + ret = JS_CreateAsyncFromSyncIterator(ctx, sync_iter); + JS_FreeValue(ctx, sync_iter); + return ret; + } + } else { + method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_iterator); + if (JS_IsException(method)) + return method; + } + if (!JS_IsFunction(ctx, method)) { + JS_FreeValue(ctx, method); + return JS_ThrowTypeError(ctx, "value is not iterable"); + } + ret = JS_GetIterator2(ctx, obj, method); + JS_FreeValue(ctx, method); + return ret; +} + +/* return *pdone = 2 if the iterator object is not parsed */ +static JSValue JS_IteratorNext2(JSContext *ctx, JSValueConst enum_obj, + JSValueConst method, + int argc, JSValueConst *argv, int *pdone) +{ + JSValue obj; + + /* fast path for the built-in iterators (avoid creating the + intermediate result object) */ + if (JS_IsObject(method)) { + JSObject *p = JS_VALUE_GET_OBJ(method); + if (p->class_id == JS_CLASS_C_FUNCTION && + p->u.cfunc.cproto == JS_CFUNC_iterator_next) { + JSCFunctionType func; + JSValueConst args[1]; + + /* in case the function expects one argument */ + if (argc == 0) { + args[0] = JS_UNDEFINED; + argv = args; + } + func = p->u.cfunc.c_function; + return func.iterator_next(ctx, enum_obj, argc, argv, + pdone, p->u.cfunc.magic); + } + } + obj = JS_Call(ctx, method, enum_obj, argc, argv); + if (JS_IsException(obj)) + goto fail; + if (!JS_IsObject(obj)) { + JS_FreeValue(ctx, obj); + JS_ThrowTypeError(ctx, "iterator must return an object"); + goto fail; + } + *pdone = 2; + return obj; + fail: + *pdone = false; + return JS_EXCEPTION; +} + +static JSValue JS_IteratorNext(JSContext *ctx, JSValueConst enum_obj, + JSValueConst method, + int argc, JSValueConst *argv, int *pdone) +{ + JSValue obj, value, done_val; + int done; + + obj = JS_IteratorNext2(ctx, enum_obj, method, argc, argv, &done); + if (JS_IsException(obj)) + goto fail; + if (likely(done == 0)) { + *pdone = false; + return obj; + } else if (done != 2) { + JS_FreeValue(ctx, obj); + *pdone = true; + return JS_UNDEFINED; + } else { + done_val = JS_GetProperty(ctx, obj, JS_ATOM_done); + if (JS_IsException(done_val)) + goto fail; + *pdone = JS_ToBoolFree(ctx, done_val); + value = JS_UNDEFINED; + if (!*pdone) { + value = JS_GetProperty(ctx, obj, JS_ATOM_value); + } + JS_FreeValue(ctx, obj); + return value; + } + fail: + JS_FreeValue(ctx, obj); + *pdone = false; + return JS_EXCEPTION; +} + +/* return < 0 in case of exception */ +static int JS_IteratorClose(JSContext *ctx, JSValueConst enum_obj, + bool is_exception_pending) +{ + JSValue method, ret, ex_obj; + int res; + + if (is_exception_pending) { + ex_obj = ctx->rt->current_exception; + ctx->rt->current_exception = JS_UNINITIALIZED; + res = -1; + } else { + ex_obj = JS_UNDEFINED; + res = 0; + } + method = JS_GetProperty(ctx, enum_obj, JS_ATOM_return); + if (JS_IsException(method)) { + res = -1; + goto done; + } + if (JS_IsUndefined(method) || JS_IsNull(method)) { + goto done; + } + ret = JS_CallFree(ctx, method, enum_obj, 0, NULL); + if (!is_exception_pending) { + if (JS_IsException(ret)) { + res = -1; + } else if (!JS_IsObject(ret)) { + JS_ThrowTypeErrorNotAnObject(ctx); + res = -1; + } + } + JS_FreeValue(ctx, ret); + done: + if (is_exception_pending) { + JS_Throw(ctx, ex_obj); + } + return res; +} + +/* obj -> enum_rec (3 slots) */ +static __exception int js_for_of_start(JSContext *ctx, JSValue *sp, + bool is_async) +{ + JSValue op1, obj, method; + op1 = sp[-1]; + obj = JS_GetIterator(ctx, op1, is_async); + if (JS_IsException(obj)) + return -1; + JS_FreeValue(ctx, op1); + sp[-1] = obj; + method = JS_GetProperty(ctx, obj, JS_ATOM_next); + if (JS_IsException(method)) + return -1; + sp[0] = method; + return 0; +} + +/* enum_rec [objs] -> enum_rec [objs] value done. There are 'offset' + objs. If 'done' is true or in case of exception, 'enum_rec' is set + to undefined. If 'done' is true, 'value' is always set to + undefined. */ +static __exception int js_for_of_next(JSContext *ctx, JSValue *sp, int offset) +{ + JSValue value = JS_UNDEFINED; + int done = 1; + + if (likely(!JS_IsUndefined(sp[offset]))) { + value = JS_IteratorNext(ctx, sp[offset], sp[offset + 1], 0, NULL, &done); + if (JS_IsException(value)) + done = -1; + if (done) { + /* value is JS_UNDEFINED or JS_EXCEPTION */ + /* replace the iteration object with undefined */ + JS_FreeValue(ctx, sp[offset]); + sp[offset] = JS_UNDEFINED; + if (done < 0) { + return -1; + } else { + JS_FreeValue(ctx, value); + value = JS_UNDEFINED; + } + } + } + sp[0] = value; + sp[1] = js_bool(done); + return 0; +} + +static JSValue JS_IteratorGetCompleteValue(JSContext *ctx, JSValue obj, + int *pdone) +{ + JSValue done_val, value; + int done; + done_val = JS_GetProperty(ctx, obj, JS_ATOM_done); + if (JS_IsException(done_val)) + goto fail; + done = JS_ToBoolFree(ctx, done_val); + value = JS_GetProperty(ctx, obj, JS_ATOM_value); + if (JS_IsException(value)) + goto fail; + *pdone = done; + return value; + fail: + *pdone = false; + return JS_EXCEPTION; +} + +static __exception int js_iterator_get_value_done(JSContext *ctx, JSValue *sp) +{ + JSValue obj, value; + int done; + obj = sp[-1]; + if (!JS_IsObject(obj)) { + JS_ThrowTypeError(ctx, "iterator must return an object"); + return -1; + } + value = JS_IteratorGetCompleteValue(ctx, obj, &done); + if (JS_IsException(value)) + return -1; + JS_FreeValue(ctx, obj); + sp[-1] = value; + sp[0] = js_bool(done); + return 0; +} + +static JSValue js_create_iterator_result(JSContext *ctx, + JSValue val, + bool done) +{ + JSValue obj; + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) { + JS_FreeValue(ctx, val); + return obj; + } + if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_value, + val, JS_PROP_C_W_E) < 0) { + goto fail; + } + if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_done, + js_bool(done), JS_PROP_C_W_E) < 0) { + fail: + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + return obj; +} + +static JSValue js_array_iterator_next(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, + int *pdone, int magic); + +static JSValue js_create_array_iterator(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, int magic); + +static bool js_is_fast_array(JSContext *ctx, JSValue obj) +{ + /* Try and handle fast arrays explicitly */ + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + JSObject *p = JS_VALUE_GET_OBJ(obj); + if (p->class_id == JS_CLASS_ARRAY && p->fast_array) { + return true; + } + } + return false; +} + +/* Access an Array's internal JSValue array if available */ +static bool js_get_fast_array(JSContext *ctx, JSValue obj, + JSValue **arrpp, uint32_t *countp) +{ + /* Try and handle fast arrays explicitly */ + if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) { + JSObject *p = JS_VALUE_GET_OBJ(obj); + if (p->class_id == JS_CLASS_ARRAY && p->fast_array) { + *countp = p->u.array.count; + *arrpp = p->u.array.u.values; + return true; + } + } + return false; +} + +static __exception int js_append_enumerate(JSContext *ctx, JSValue *sp) +{ + JSValue iterator, enumobj, method, value; + int is_array_iterator; + JSValue *arrp; + uint32_t i, count32, pos; + + if (JS_VALUE_GET_TAG(sp[-2]) != JS_TAG_INT) { + JS_ThrowInternalError(ctx, "invalid index for append"); + return -1; + } + + pos = JS_VALUE_GET_INT(sp[-2]); + + /* XXX: further optimisations: + - use ctx->array_proto_values? + - check if array_iterator_prototype next method is built-in and + avoid constructing actual iterator object? + - build this into js_for_of_start and use in all `for (x of o)` loops + */ + iterator = JS_GetProperty(ctx, sp[-1], JS_ATOM_Symbol_iterator); + if (JS_IsException(iterator)) + return -1; + /* Used to squelch a -Wcast-function-type warning. */ + JSCFunctionType ft = { .generic_magic = js_create_array_iterator }; + is_array_iterator = JS_IsCFunction(ctx, iterator, + ft.generic, + JS_ITERATOR_KIND_VALUE); + JS_FreeValue(ctx, iterator); + + enumobj = JS_GetIterator(ctx, sp[-1], false); + if (JS_IsException(enumobj)) + return -1; + method = JS_GetProperty(ctx, enumobj, JS_ATOM_next); + if (JS_IsException(method)) { + JS_FreeValue(ctx, enumobj); + return -1; + } + /* Used to squelch a -Wcast-function-type warning. */ + JSCFunctionType ft2 = { .iterator_next = js_array_iterator_next }; + if (is_array_iterator + && JS_IsCFunction(ctx, method, ft2.generic, 0) + && js_get_fast_array(ctx, sp[-1], &arrp, &count32)) { + uint32_t len; + if (js_get_length32(ctx, &len, sp[-1])) + goto exception; + /* if len > count32, the elements >= count32 might be read in + the prototypes and might have side effects */ + if (len != count32) + goto general_case; + /* Handle fast arrays explicitly */ + for (i = 0; i < count32; i++) { + if (JS_DefinePropertyValueUint32(ctx, sp[-3], pos++, + js_dup(arrp[i]), JS_PROP_C_W_E) < 0) + goto exception; + } + } else { + general_case: + for (;;) { + int done; + value = JS_IteratorNext(ctx, enumobj, method, 0, NULL, &done); + if (JS_IsException(value)) + goto exception; + if (done) { + /* value is JS_UNDEFINED */ + break; + } + if (JS_DefinePropertyValueUint32(ctx, sp[-3], pos++, value, JS_PROP_C_W_E) < 0) + goto exception; + } + } + /* Note: could raise an error if too many elements */ + sp[-2] = js_int32(pos); + JS_FreeValue(ctx, enumobj); + JS_FreeValue(ctx, method); + return 0; + +exception: + JS_IteratorClose(ctx, enumobj, true); + JS_FreeValue(ctx, enumobj); + JS_FreeValue(ctx, method); + return -1; +} + +static __exception int JS_CopyDataProperties(JSContext *ctx, + JSValue target, + JSValue source, + JSValue excluded, + bool setprop) +{ + JSPropertyEnum *tab_atom; + JSValue val; + uint32_t i, tab_atom_count; + JSObject *p; + JSObject *pexcl = NULL; + int ret, gpn_flags; + JSPropertyDescriptor desc; + bool is_enumerable; + + if (JS_VALUE_GET_TAG(source) != JS_TAG_OBJECT) + return 0; + + if (JS_VALUE_GET_TAG(excluded) == JS_TAG_OBJECT) + pexcl = JS_VALUE_GET_OBJ(excluded); + + p = JS_VALUE_GET_OBJ(source); + + gpn_flags = JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK | JS_GPN_ENUM_ONLY; + if (p->is_exotic) { + const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic; + /* cannot use JS_GPN_ENUM_ONLY with e.g. proxies because it + introduces a visible change */ + if (em && em->get_own_property_names) { + gpn_flags &= ~JS_GPN_ENUM_ONLY; + } + } + if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p, + gpn_flags)) + return -1; + + for (i = 0; i < tab_atom_count; i++) { + if (pexcl) { + ret = JS_GetOwnPropertyInternal(ctx, NULL, pexcl, tab_atom[i].atom); + if (ret) { + if (ret < 0) + goto exception; + continue; + } + } + if (!(gpn_flags & JS_GPN_ENUM_ONLY)) { + /* test if the property is enumerable */ + ret = JS_GetOwnPropertyInternal(ctx, &desc, p, tab_atom[i].atom); + if (ret < 0) + goto exception; + if (!ret) + continue; + is_enumerable = (desc.flags & JS_PROP_ENUMERABLE) != 0; + js_free_desc(ctx, &desc); + if (!is_enumerable) + continue; + } + val = JS_GetProperty(ctx, source, tab_atom[i].atom); + if (JS_IsException(val)) + goto exception; + if (setprop) + ret = JS_SetProperty(ctx, target, tab_atom[i].atom, val); + else + ret = JS_DefinePropertyValue(ctx, target, tab_atom[i].atom, val, + JS_PROP_C_W_E); + if (ret < 0) + goto exception; + } + js_free_prop_enum(ctx, tab_atom, tab_atom_count); + return 0; + exception: + js_free_prop_enum(ctx, tab_atom, tab_atom_count); + return -1; +} + +/* only valid inside C functions */ +static JSValueConst JS_GetActiveFunction(JSContext *ctx) +{ + return ctx->rt->current_stack_frame->cur_func; +} + +static JSVarRef *get_var_ref(JSContext *ctx, JSStackFrame *sf, int var_idx, + bool is_arg) +{ + JSObject *p; + JSFunctionBytecode *b; + JSVarRef *var_ref; + JSValue *pvalue; + int var_ref_idx; + JSVarDef *vd; + + p = JS_VALUE_GET_OBJ(sf->cur_func); + b = p->u.func.function_bytecode; + + if (is_arg) { + vd = &b->vardefs[var_idx]; + pvalue = &sf->arg_buf[var_idx]; + } else { + vd = &b->vardefs[b->arg_count + var_idx]; + pvalue = &sf->var_buf[var_idx]; + } + + /* If the variable is captured, use the pre-computed index for O(1) lookup */ + if (vd->is_captured) { + var_ref_idx = vd->var_ref_idx; + var_ref = sf->var_refs[var_ref_idx]; + if (var_ref) { + /* reference to the already created local variable */ + var_ref->header.ref_count++; + return var_ref; + } + + /* create a new one */ + var_ref = js_malloc(ctx, sizeof(JSVarRef)); + if (!var_ref) + return NULL; + var_ref->header.ref_count = 1; + var_ref->is_detached = false; + var_ref->var_ref_idx = var_ref_idx; + var_ref->stack_frame = sf; + sf->var_refs[var_ref_idx] = var_ref; + var_ref->pvalue = pvalue; + return var_ref; + } else { + /* Variable is not captured (e.g., from eval closures on uncaptured vars). + Create a detached var_ref that holds a copy of the value. */ + var_ref = js_malloc(ctx, sizeof(JSVarRef)); + if (!var_ref) + return NULL; + var_ref->header.ref_count = 1; + var_ref->is_detached = true; + var_ref->value = js_dup(*pvalue); + var_ref->pvalue = &var_ref->value; + add_gc_object(ctx->rt, &var_ref->header, JS_GC_OBJ_TYPE_VAR_REF); + return var_ref; + } +} + +static JSValue js_closure2(JSContext *ctx, JSValue func_obj, + JSFunctionBytecode *b, + JSVarRef **cur_var_refs, + JSStackFrame *sf) +{ + JSObject *p; + JSVarRef **var_refs; + int i; + + p = JS_VALUE_GET_OBJ(func_obj); + p->u.func.function_bytecode = b; + p->u.func.home_object = NULL; + p->u.func.var_refs = NULL; + if (b->closure_var_count) { + var_refs = js_mallocz(ctx, sizeof(var_refs[0]) * b->closure_var_count); + if (!var_refs) + goto fail; + p->u.func.var_refs = var_refs; + for(i = 0; i < b->closure_var_count; i++) { + JSClosureVar *cv = &b->closure_var[i]; + JSVarRef *var_ref; + if (cv->is_local) { + /* reuse the existing variable reference if it already exists */ + var_ref = get_var_ref(ctx, sf, cv->var_idx, cv->is_arg); + if (!var_ref) + goto fail; + } else { + var_ref = cur_var_refs[cv->var_idx]; + var_ref->header.ref_count++; + } + var_refs[i] = var_ref; + } + } + return func_obj; + fail: + /* bfunc is freed when func_obj is freed */ + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; +} + +static JSValue js_instantiate_prototype(JSContext *ctx, JSObject *p, JSAtom atom, void *opaque) +{ + JSValue obj, this_val; + int ret; + + this_val = JS_MKPTR(JS_TAG_OBJECT, p); + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) + return JS_EXCEPTION; + ret = JS_DefinePropertyValue(ctx, obj, JS_ATOM_constructor, + js_dup(this_val), + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + if (ret < 0) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + return obj; +} + +static const uint16_t func_kind_to_class_id[] = { + [JS_FUNC_NORMAL] = JS_CLASS_BYTECODE_FUNCTION, + [JS_FUNC_GENERATOR] = JS_CLASS_GENERATOR_FUNCTION, + [JS_FUNC_ASYNC] = JS_CLASS_ASYNC_FUNCTION, + [JS_FUNC_ASYNC_GENERATOR] = JS_CLASS_ASYNC_GENERATOR_FUNCTION, +}; + +static JSValue js_closure(JSContext *ctx, JSValue bfunc, + JSVarRef **cur_var_refs, + JSStackFrame *sf) +{ + JSFunctionBytecode *b; + JSValue func_obj; + JSAtom name_atom; + + b = JS_VALUE_GET_PTR(bfunc); + func_obj = JS_NewObjectClass(ctx, func_kind_to_class_id[b->func_kind]); + if (JS_IsException(func_obj)) { + JS_FreeValue(ctx, bfunc); + return JS_EXCEPTION; + } + func_obj = js_closure2(ctx, func_obj, b, cur_var_refs, sf); + if (JS_IsException(func_obj)) { + /* bfunc has been freed */ + goto fail; + } + name_atom = b->func_name; + if (name_atom == JS_ATOM_NULL) + name_atom = JS_ATOM_empty_string; + js_function_set_properties(ctx, func_obj, name_atom, + b->defined_arg_count); + + if (b->func_kind & JS_FUNC_GENERATOR) { + JSValue proto; + int proto_class_id; + /* generators have a prototype field which is used as + prototype for the generator object */ + if (b->func_kind == JS_FUNC_ASYNC_GENERATOR) + proto_class_id = JS_CLASS_ASYNC_GENERATOR; + else + proto_class_id = JS_CLASS_GENERATOR; + proto = JS_NewObjectProto(ctx, ctx->class_proto[proto_class_id]); + if (JS_IsException(proto)) + goto fail; + JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_prototype, proto, + JS_PROP_WRITABLE); + } else if (b->has_prototype) { + /* add the 'prototype' property: delay instantiation to avoid + creating cycles for every javascript function. The prototype + object is created on the fly when first accessed */ + JS_SetConstructorBit(ctx, func_obj, true); + JS_DefineAutoInitProperty(ctx, func_obj, JS_ATOM_prototype, + JS_AUTOINIT_ID_PROTOTYPE, NULL, + JS_PROP_WRITABLE); + } + return func_obj; + fail: + /* bfunc is freed when func_obj is freed */ + JS_FreeValue(ctx, func_obj); + return JS_EXCEPTION; +} + +#define JS_DEFINE_CLASS_HAS_HERITAGE (1 << 0) + +static int js_op_define_class(JSContext *ctx, JSValue *sp, + JSAtom class_name, int class_flags, + JSVarRef **cur_var_refs, + JSStackFrame *sf, bool is_computed_name) +{ + JSValue bfunc, parent_class, proto = JS_UNDEFINED; + JSValue ctor = JS_UNDEFINED, parent_proto = JS_UNDEFINED; + JSFunctionBytecode *b; + + parent_class = sp[-2]; + bfunc = sp[-1]; + + if (class_flags & JS_DEFINE_CLASS_HAS_HERITAGE) { + if (JS_IsNull(parent_class)) { + parent_proto = JS_NULL; + parent_class = js_dup(ctx->function_proto); + } else { + if (!JS_IsConstructor(ctx, parent_class)) { + JS_ThrowTypeError(ctx, "parent class must be constructor"); + goto fail; + } + parent_proto = JS_GetProperty(ctx, parent_class, JS_ATOM_prototype); + if (JS_IsException(parent_proto)) + goto fail; + if (!JS_IsNull(parent_proto) && !JS_IsObject(parent_proto)) { + JS_ThrowTypeError(ctx, "parent prototype must be an object or null"); + goto fail; + } + } + } else { + /* parent_class is JS_UNDEFINED in this case */ + parent_proto = js_dup(ctx->class_proto[JS_CLASS_OBJECT]); + parent_class = js_dup(ctx->function_proto); + } + proto = JS_NewObjectProto(ctx, parent_proto); + if (JS_IsException(proto)) + goto fail; + + b = JS_VALUE_GET_PTR(bfunc); + assert(b->func_kind == JS_FUNC_NORMAL); + ctor = JS_NewObjectProtoClass(ctx, parent_class, + JS_CLASS_BYTECODE_FUNCTION); + if (JS_IsException(ctor)) + goto fail; + ctor = js_closure2(ctx, ctor, b, cur_var_refs, sf); + bfunc = JS_UNDEFINED; + if (JS_IsException(ctor)) + goto fail; + js_method_set_home_object(ctx, ctor, proto); + JS_SetConstructorBit(ctx, ctor, true); + + JS_DefinePropertyValue(ctx, ctor, JS_ATOM_length, + js_int32(b->defined_arg_count), + JS_PROP_CONFIGURABLE); + + if (is_computed_name) { + if (JS_DefineObjectNameComputed(ctx, ctor, sp[-3], + JS_PROP_CONFIGURABLE) < 0) + goto fail; + } else { + if (JS_DefineObjectName(ctx, ctor, class_name, JS_PROP_CONFIGURABLE) < 0) + goto fail; + } + + /* the constructor property must be first. It can be overriden by + computed property names */ + if (JS_DefinePropertyValue(ctx, proto, JS_ATOM_constructor, + js_dup(ctor), + JS_PROP_CONFIGURABLE | + JS_PROP_WRITABLE | JS_PROP_THROW) < 0) + goto fail; + /* set the prototype property */ + if (JS_DefinePropertyValue(ctx, ctor, JS_ATOM_prototype, + js_dup(proto), JS_PROP_THROW) < 0) + goto fail; + + JS_FreeValue(ctx, parent_proto); + JS_FreeValue(ctx, parent_class); + + sp[-2] = ctor; + sp[-1] = proto; + return 0; + fail: + JS_FreeValue(ctx, parent_class); + JS_FreeValue(ctx, parent_proto); + JS_FreeValue(ctx, bfunc); + JS_FreeValue(ctx, proto); + JS_FreeValue(ctx, ctor); + sp[-2] = JS_UNDEFINED; + sp[-1] = JS_UNDEFINED; + return -1; +} + +static void close_var_ref(JSRuntime *rt, JSVarRef *var_ref) +{ + var_ref->value = js_dup(*var_ref->pvalue); + var_ref->pvalue = &var_ref->value; + /* the reference is no longer to a local variable */ + var_ref->is_detached = true; + add_gc_object(rt, &var_ref->header, JS_GC_OBJ_TYPE_VAR_REF); +} + +static void close_var_refs(JSRuntime *rt, JSStackFrame *sf) +{ + JSVarRef *var_ref; + int i; + + for (i = 0; i < sf->var_ref_count; i++) { + var_ref = sf->var_refs[i]; + if (var_ref) + close_var_ref(rt, var_ref); + } +} + +static void close_lexical_var(JSContext *ctx, JSFunctionBytecode *b, + JSStackFrame *sf, int var_idx) +{ + JSVarRef *var_ref; + int var_ref_idx; + + var_ref_idx = b->vardefs[b->arg_count + var_idx].var_ref_idx; + var_ref = sf->var_refs[var_ref_idx]; + if (var_ref) { + close_var_ref(ctx->rt, var_ref); + sf->var_refs[var_ref_idx] = NULL; + } +} + +#define JS_CALL_FLAG_COPY_ARGV (1 << 1) +#define JS_CALL_FLAG_GENERATOR (1 << 2) + +static JSValue js_call_c_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, int flags) +{ + JSRuntime *rt = ctx->rt; + JSCFunctionType func; + JSObject *p; + JSStackFrame sf_s, *sf = &sf_s, *prev_sf; + JSValue ret_val; + JSValueConst *arg_buf; + int arg_count, i; + JSCFunctionEnum cproto; + + p = JS_VALUE_GET_OBJ(func_obj); + cproto = p->u.cfunc.cproto; + arg_count = p->u.cfunc.length; + + /* better to always check stack overflow */ + if (js_check_stack_overflow(rt, sizeof(arg_buf[0]) * arg_count)) + return JS_ThrowStackOverflow(ctx); + + prev_sf = rt->current_stack_frame; + sf->prev_frame = prev_sf; + rt->current_stack_frame = sf; + ctx = p->u.cfunc.realm; /* change the current realm */ + + sf->is_strict_mode = false; + sf->cur_func = unsafe_unconst(func_obj); + sf->arg_count = argc; + arg_buf = argv; + + if (unlikely(argc < arg_count)) { + /* ensure that at least argc_count arguments are readable */ + arg_buf = alloca(sizeof(arg_buf[0]) * arg_count); + for(i = 0; i < argc; i++) + arg_buf[i] = argv[i]; + for(i = argc; i < arg_count; i++) + arg_buf[i] = JS_UNDEFINED; + sf->arg_count = arg_count; + } + sf->arg_buf = (JSValue *)arg_buf; + + func = p->u.cfunc.c_function; + switch(cproto) { + case JS_CFUNC_constructor: + case JS_CFUNC_constructor_or_func: + if (!(flags & JS_CALL_FLAG_CONSTRUCTOR)) { + if (cproto == JS_CFUNC_constructor) { + not_a_constructor: + ret_val = JS_ThrowTypeError(ctx, "must be called with new"); + break; + } else { + this_obj = JS_UNDEFINED; + } + } + /* here this_obj is new_target */ + /* fall thru */ + case JS_CFUNC_generic: + ret_val = func.generic(ctx, this_obj, argc, arg_buf); + break; + case JS_CFUNC_constructor_magic: + case JS_CFUNC_constructor_or_func_magic: + if (!(flags & JS_CALL_FLAG_CONSTRUCTOR)) { + if (cproto == JS_CFUNC_constructor_magic) { + goto not_a_constructor; + } else { + this_obj = JS_UNDEFINED; + } + } + /* fall thru */ + case JS_CFUNC_generic_magic: + ret_val = func.generic_magic(ctx, this_obj, argc, arg_buf, + p->u.cfunc.magic); + break; + case JS_CFUNC_getter: + ret_val = func.getter(ctx, this_obj); + break; + case JS_CFUNC_setter: + ret_val = func.setter(ctx, this_obj, arg_buf[0]); + break; + case JS_CFUNC_getter_magic: + ret_val = func.getter_magic(ctx, this_obj, p->u.cfunc.magic); + break; + case JS_CFUNC_setter_magic: + ret_val = func.setter_magic(ctx, this_obj, arg_buf[0], p->u.cfunc.magic); + break; + case JS_CFUNC_f_f: + { + double d1; + + if (unlikely(JS_ToFloat64(ctx, &d1, arg_buf[0]))) { + ret_val = JS_EXCEPTION; + break; + } + ret_val = js_number(func.f_f(d1)); + } + break; + case JS_CFUNC_f_f_f: + { + double d1, d2; + + if (unlikely(JS_ToFloat64(ctx, &d1, arg_buf[0]))) { + ret_val = JS_EXCEPTION; + break; + } + if (unlikely(JS_ToFloat64(ctx, &d2, arg_buf[1]))) { + ret_val = JS_EXCEPTION; + break; + } + ret_val = js_number(func.f_f_f(d1, d2)); + } + break; + case JS_CFUNC_iterator_next: + { + int done; + ret_val = func.iterator_next(ctx, this_obj, argc, arg_buf, + &done, p->u.cfunc.magic); + if (!JS_IsException(ret_val) && done != 2) { + ret_val = js_create_iterator_result(ctx, ret_val, done); + } + } + break; + default: + abort(); + } + + rt->current_stack_frame = sf->prev_frame; + return ret_val; +} + +static JSValue js_call_bound_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, int flags) +{ + JSObject *p; + JSBoundFunction *bf; + JSValueConst *arg_buf, new_target; + int arg_count, i; + + p = JS_VALUE_GET_OBJ(func_obj); + bf = p->u.bound_function; + arg_count = bf->argc + argc; + if (js_check_stack_overflow(ctx->rt, sizeof(JSValue) * arg_count)) + return JS_ThrowStackOverflow(ctx); + arg_buf = alloca(sizeof(JSValue) * arg_count); + for(i = 0; i < bf->argc; i++) { + arg_buf[i] = bf->argv[i]; + } + for(i = 0; i < argc; i++) { + arg_buf[bf->argc + i] = argv[i]; + } + if (flags & JS_CALL_FLAG_CONSTRUCTOR) { + new_target = this_obj; + if (js_same_value(ctx, func_obj, new_target)) + new_target = bf->func_obj; + return JS_CallConstructor2(ctx, bf->func_obj, new_target, + arg_count, arg_buf); + } else { + return JS_Call(ctx, bf->func_obj, bf->this_val, + arg_count, arg_buf); + } +} + +/* argument of OP_special_object */ +typedef enum { + OP_SPECIAL_OBJECT_ARGUMENTS, + OP_SPECIAL_OBJECT_MAPPED_ARGUMENTS, + OP_SPECIAL_OBJECT_THIS_FUNC, + OP_SPECIAL_OBJECT_NEW_TARGET, + OP_SPECIAL_OBJECT_HOME_OBJECT, + OP_SPECIAL_OBJECT_VAR_OBJECT, + OP_SPECIAL_OBJECT_IMPORT_META, + OP_SPECIAL_OBJECT_NULL_PROTO, +} OPSpecialObjectEnum; + +#define FUNC_RET_AWAIT 0 +#define FUNC_RET_YIELD 1 +#define FUNC_RET_YIELD_STAR 2 + +#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_* +static void dump_single_byte_code(JSContext *ctx, const uint8_t *pc, + JSFunctionBytecode *b, int start_pos); +static void print_func_name(JSFunctionBytecode *b); +#endif + +static bool needs_backtrace(JSValue exc) +{ + JSObject *p; + + if (JS_VALUE_GET_TAG(exc) != JS_TAG_OBJECT) + return false; + p = JS_VALUE_GET_OBJ(exc); + if (p->class_id != JS_CLASS_ERROR) + return false; + return !find_own_property1(p, JS_ATOM_stack); +} + +/* argv[] is modified if (flags & JS_CALL_FLAG_COPY_ARGV) = 0. */ +static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj, + JSValueConst this_obj, JSValueConst new_target, + int argc, JSValueConst *argv, int flags) +{ + JSRuntime *rt = caller_ctx->rt; + JSContext *ctx; + JSObject *p; + JSFunctionBytecode *b; + JSStackFrame sf_s, *sf = &sf_s; + uint8_t *pc; + int opcode, arg_allocated_size, i; + JSValue *local_buf, *stack_buf, *var_buf, *arg_buf, *sp, ret_val, *pval; + JSVarRef **var_refs; + size_t alloca_size; + +#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_STEP +#define DUMP_BYTECODE_OR_DONT(pc) \ + if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_STEP)) dump_single_byte_code(ctx, pc, b, 0); +#else +#define DUMP_BYTECODE_OR_DONT(pc) +#endif + +#if !DIRECT_DISPATCH +#define SWITCH(pc) DUMP_BYTECODE_OR_DONT(pc) switch (opcode = *pc++) +#define CASE(op) case op +#define DEFAULT default +#define BREAK break +#else + __extension__ static const void * const dispatch_table[256] = { +#define DEF(id, size, n_pop, n_push, f) && case_OP_ ## id, +#define def(id, size, n_pop, n_push, f) +#include "quickjs-opcode.h" + [ OP_COUNT ... 255 ] = &&case_default + }; +#define SWITCH(pc) DUMP_BYTECODE_OR_DONT(pc) __extension__ ({ goto *dispatch_table[opcode = *pc++]; }); +#define CASE(op) case_ ## op +#define DEFAULT case_default +#define BREAK SWITCH(pc) +#endif + + if (js_poll_interrupts(caller_ctx)) + return JS_EXCEPTION; + if (unlikely(JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT)) { + if (flags & JS_CALL_FLAG_GENERATOR) { + JSAsyncFunctionState *s = JS_VALUE_GET_PTR(func_obj); + /* func_obj get contains a pointer to JSFuncAsyncState */ + /* the stack frame is already allocated */ + sf = &s->frame; + p = JS_VALUE_GET_OBJ(sf->cur_func); + b = p->u.func.function_bytecode; + ctx = b->realm; + var_refs = p->u.func.var_refs; + local_buf = arg_buf = sf->arg_buf; + var_buf = sf->var_buf; + stack_buf = sf->var_buf + b->var_count; + sp = sf->cur_sp; + sf->cur_sp = NULL; /* cur_sp is NULL if the function is running */ + pc = sf->cur_pc; + sf->prev_frame = rt->current_stack_frame; + rt->current_stack_frame = sf; + if (s->throw_flag) + goto exception; + else + goto restart; + } else { + goto not_a_function; + } + } + p = JS_VALUE_GET_OBJ(func_obj); + if (unlikely(p->class_id != JS_CLASS_BYTECODE_FUNCTION)) { + JSClassCall *call_func; + call_func = rt->class_array[p->class_id].call; + if (!call_func) { + not_a_function: + return JS_ThrowTypeErrorNotAFunction(caller_ctx); + } + return call_func(caller_ctx, func_obj, this_obj, argc, + argv, flags); + } + b = p->u.func.function_bytecode; + + if (unlikely(argc < b->arg_count || (flags & JS_CALL_FLAG_COPY_ARGV))) { + arg_allocated_size = b->arg_count; + } else { + arg_allocated_size = 0; + } + + alloca_size = sizeof(JSValue) * (arg_allocated_size + b->var_count + + b->stack_size) + + sizeof(JSVarRef *) * b->var_ref_count; + if (js_check_stack_overflow(rt, alloca_size)) + return JS_ThrowStackOverflow(caller_ctx); + + sf->is_strict_mode = b->is_strict_mode; + arg_buf = (JSValue *)argv; + sf->arg_count = argc; + sf->cur_func = unsafe_unconst(func_obj); + var_refs = p->u.func.var_refs; + + local_buf = alloca(alloca_size); + if (unlikely(arg_allocated_size)) { + int n = min_int(argc, b->arg_count); + arg_buf = local_buf; + for(i = 0; i < n; i++) + arg_buf[i] = js_dup(argv[i]); + for(; i < b->arg_count; i++) + arg_buf[i] = JS_UNDEFINED; + sf->arg_count = b->arg_count; + } + var_buf = local_buf + arg_allocated_size; + sf->var_buf = var_buf; + sf->arg_buf = arg_buf; + + for(i = 0; i < b->var_count; i++) + var_buf[i] = JS_UNDEFINED; + + stack_buf = var_buf + b->var_count; + sf->var_refs = (JSVarRef **)(stack_buf + b->stack_size); + sf->var_ref_count = b->var_ref_count; + for(i = 0; i < b->var_ref_count; i++) + sf->var_refs[i] = NULL; + sp = stack_buf; + pc = b->byte_code_buf; + /* sf->cur_pc must we set to pc before any recursive calls to JS_CallInternal. */ + sf->cur_pc = NULL; + sf->prev_frame = rt->current_stack_frame; + rt->current_stack_frame = sf; + ctx = b->realm; /* set the current realm */ + +#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_STEP + if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_STEP)) + print_func_name(b); +#endif + + restart: + for(;;) { + int call_argc; + JSValue *call_argv; + + SWITCH(pc) { + CASE(OP_push_i32): + *sp++ = js_int32(get_u32(pc)); + pc += 4; + BREAK; + CASE(OP_push_bigint_i32): + *sp++ = __JS_NewShortBigInt(ctx, (int)get_u32(pc)); + pc += 4; + BREAK; + CASE(OP_push_const): + *sp++ = js_dup(b->cpool[get_u32(pc)]); + pc += 4; + BREAK; + CASE(OP_push_minus1): + CASE(OP_push_0): + CASE(OP_push_1): + CASE(OP_push_2): + CASE(OP_push_3): + CASE(OP_push_4): + CASE(OP_push_5): + CASE(OP_push_6): + CASE(OP_push_7): + *sp++ = js_int32(opcode - OP_push_0); + BREAK; + CASE(OP_push_i8): + *sp++ = js_int32(get_i8(pc)); + pc += 1; + BREAK; + CASE(OP_push_i16): + *sp++ = js_int32(get_i16(pc)); + pc += 2; + BREAK; + CASE(OP_push_const8): + *sp++ = js_dup(b->cpool[*pc++]); + BREAK; + CASE(OP_fclosure8): + *sp++ = js_closure(ctx, js_dup(b->cpool[*pc++]), var_refs, sf); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + BREAK; + CASE(OP_push_empty_string): + *sp++ = js_empty_string(rt); + BREAK; + CASE(OP_get_length): + { + JSValue val; + + sf->cur_pc = pc; + val = JS_GetProperty(ctx, sp[-1], JS_ATOM_length); + if (unlikely(JS_IsException(val))) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = val; + } + BREAK; + CASE(OP_push_atom_value): + *sp++ = JS_AtomToValue(ctx, get_u32(pc)); + pc += 4; + BREAK; + CASE(OP_undefined): + *sp++ = JS_UNDEFINED; + BREAK; + CASE(OP_null): + *sp++ = JS_NULL; + BREAK; + CASE(OP_push_this): + /* OP_push_this is only called at the start of a function */ + { + JSValue val; + if (!b->is_strict_mode) { + uint32_t tag = JS_VALUE_GET_TAG(this_obj); + if (likely(tag == JS_TAG_OBJECT)) + goto normal_this; + if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED) { + val = js_dup(ctx->global_obj); + } else { + val = JS_ToObject(ctx, this_obj); + if (JS_IsException(val)) + goto exception; + } + } else { + normal_this: + val = js_dup(this_obj); + } + *sp++ = val; + } + BREAK; + CASE(OP_push_false): + *sp++ = JS_FALSE; + BREAK; + CASE(OP_push_true): + *sp++ = JS_TRUE; + BREAK; + CASE(OP_object): + *sp++ = JS_NewObject(ctx); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + BREAK; + CASE(OP_special_object): + { + int arg = *pc++; + switch(arg) { + case OP_SPECIAL_OBJECT_ARGUMENTS: + *sp++ = js_build_arguments(ctx, argc, argv); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + break; + case OP_SPECIAL_OBJECT_MAPPED_ARGUMENTS: + *sp++ = js_build_mapped_arguments(ctx, argc, argv, + sf, min_int(argc, b->arg_count)); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + break; + case OP_SPECIAL_OBJECT_THIS_FUNC: + *sp++ = js_dup(sf->cur_func); + break; + case OP_SPECIAL_OBJECT_NEW_TARGET: + *sp++ = js_dup(new_target); + break; + case OP_SPECIAL_OBJECT_HOME_OBJECT: + { + JSObject *p1; + p1 = p->u.func.home_object; + if (unlikely(!p1)) + *sp++ = JS_UNDEFINED; + else + *sp++ = js_dup(JS_MKPTR(JS_TAG_OBJECT, p1)); + } + break; + case OP_SPECIAL_OBJECT_VAR_OBJECT: + *sp++ = JS_NewObjectProto(ctx, JS_NULL); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + break; + case OP_SPECIAL_OBJECT_IMPORT_META: + *sp++ = js_import_meta(ctx); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + break; + case OP_SPECIAL_OBJECT_NULL_PROTO: + *sp++ = JS_NewObjectProtoClass(ctx, JS_NULL, JS_CLASS_OBJECT); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + break; + default: + abort(); + } + } + BREAK; + CASE(OP_rest): + { + int i, n, first = get_u16(pc); + pc += 2; + i = min_int(first, argc); + n = argc - i; + *sp++ = js_create_array(ctx, n, &argv[i]); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + } + BREAK; + + CASE(OP_drop): + JS_FreeValue(ctx, sp[-1]); + sp--; + BREAK; + CASE(OP_nip): + JS_FreeValue(ctx, sp[-2]); + sp[-2] = sp[-1]; + sp--; + BREAK; + CASE(OP_nip1): /* a b c -> b c */ + JS_FreeValue(ctx, sp[-3]); + sp[-3] = sp[-2]; + sp[-2] = sp[-1]; + sp--; + BREAK; + CASE(OP_dup): + sp[0] = js_dup(sp[-1]); + sp++; + BREAK; + CASE(OP_dup2): /* a b -> a b a b */ + sp[0] = js_dup(sp[-2]); + sp[1] = js_dup(sp[-1]); + sp += 2; + BREAK; + CASE(OP_dup3): /* a b c -> a b c a b c */ + sp[0] = js_dup(sp[-3]); + sp[1] = js_dup(sp[-2]); + sp[2] = js_dup(sp[-1]); + sp += 3; + BREAK; + CASE(OP_dup1): /* a b -> a a b */ + sp[0] = sp[-1]; + sp[-1] = js_dup(sp[-2]); + sp++; + BREAK; + CASE(OP_insert2): /* obj a -> a obj a (dup_x1) */ + sp[0] = sp[-1]; + sp[-1] = sp[-2]; + sp[-2] = js_dup(sp[0]); + sp++; + BREAK; + CASE(OP_insert3): /* obj prop a -> a obj prop a (dup_x2) */ + sp[0] = sp[-1]; + sp[-1] = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = js_dup(sp[0]); + sp++; + BREAK; + CASE(OP_insert4): /* this obj prop a -> a this obj prop a */ + sp[0] = sp[-1]; + sp[-1] = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = sp[-4]; + sp[-4] = js_dup(sp[0]); + sp++; + BREAK; + CASE(OP_perm3): /* obj a b -> a obj b (213) */ + { + JSValue tmp; + tmp = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = tmp; + } + BREAK; + CASE(OP_rot3l): /* x a b -> a b x (231) */ + { + JSValue tmp; + tmp = sp[-3]; + sp[-3] = sp[-2]; + sp[-2] = sp[-1]; + sp[-1] = tmp; + } + BREAK; + CASE(OP_rot4l): /* x a b c -> a b c x */ + { + JSValue tmp; + tmp = sp[-4]; + sp[-4] = sp[-3]; + sp[-3] = sp[-2]; + sp[-2] = sp[-1]; + sp[-1] = tmp; + } + BREAK; + CASE(OP_rot5l): /* x a b c d -> a b c d x */ + { + JSValue tmp; + tmp = sp[-5]; + sp[-5] = sp[-4]; + sp[-4] = sp[-3]; + sp[-3] = sp[-2]; + sp[-2] = sp[-1]; + sp[-1] = tmp; + } + BREAK; + CASE(OP_rot3r): /* a b x -> x a b (312) */ + { + JSValue tmp; + tmp = sp[-1]; + sp[-1] = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = tmp; + } + BREAK; + CASE(OP_perm4): /* obj prop a b -> a obj prop b */ + { + JSValue tmp; + tmp = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = sp[-4]; + sp[-4] = tmp; + } + BREAK; + CASE(OP_perm5): /* this obj prop a b -> a this obj prop b */ + { + JSValue tmp; + tmp = sp[-2]; + sp[-2] = sp[-3]; + sp[-3] = sp[-4]; + sp[-4] = sp[-5]; + sp[-5] = tmp; + } + BREAK; + CASE(OP_swap): /* a b -> b a */ + { + JSValue tmp; + tmp = sp[-2]; + sp[-2] = sp[-1]; + sp[-1] = tmp; + } + BREAK; + CASE(OP_swap2): /* a b c d -> c d a b */ + { + JSValue tmp1, tmp2; + tmp1 = sp[-4]; + tmp2 = sp[-3]; + sp[-4] = sp[-2]; + sp[-3] = sp[-1]; + sp[-2] = tmp1; + sp[-1] = tmp2; + } + BREAK; + + CASE(OP_fclosure): + { + JSValue bfunc = js_dup(b->cpool[get_u32(pc)]); + pc += 4; + *sp++ = js_closure(ctx, bfunc, var_refs, sf); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + } + BREAK; + CASE(OP_call0): + CASE(OP_call1): + CASE(OP_call2): + CASE(OP_call3): + call_argc = opcode - OP_call0; + goto has_call_argc; + CASE(OP_call): + CASE(OP_tail_call): + { + call_argc = get_u16(pc); + pc += 2; + goto has_call_argc; + has_call_argc: + call_argv = sp - call_argc; + sf->cur_pc = pc; + ret_val = JS_CallInternal(ctx, call_argv[-1], JS_UNDEFINED, + JS_UNDEFINED, call_argc, + vc(call_argv), 0); + if (unlikely(JS_IsException(ret_val))) + goto exception; + if (opcode == OP_tail_call) + goto done; + for(i = -1; i < call_argc; i++) + JS_FreeValue(ctx, call_argv[i]); + sp -= call_argc + 1; + *sp++ = ret_val; + } + BREAK; + CASE(OP_call_constructor): + { + call_argc = get_u16(pc); + pc += 2; + call_argv = sp - call_argc; + sf->cur_pc = pc; + ret_val = JS_CallConstructorInternal(ctx, call_argv[-2], + call_argv[-1], call_argc, + vc(call_argv), 0); + if (unlikely(JS_IsException(ret_val))) + goto exception; + for(i = -2; i < call_argc; i++) + JS_FreeValue(ctx, call_argv[i]); + sp -= call_argc + 2; + *sp++ = ret_val; + } + BREAK; + CASE(OP_call_method): + CASE(OP_tail_call_method): + { + call_argc = get_u16(pc); + pc += 2; + call_argv = sp - call_argc; + sf->cur_pc = pc; + ret_val = JS_CallInternal(ctx, call_argv[-1], call_argv[-2], + JS_UNDEFINED, call_argc, + vc(call_argv), 0); + if (unlikely(JS_IsException(ret_val))) + goto exception; + if (opcode == OP_tail_call_method) + goto done; + for(i = -2; i < call_argc; i++) + JS_FreeValue(ctx, call_argv[i]); + sp -= call_argc + 2; + *sp++ = ret_val; + } + BREAK; + CASE(OP_array_from): + { + call_argc = get_u16(pc); + pc += 2; + call_argv = sp - call_argc; + ret_val = JS_NewArrayFrom(ctx, call_argc, call_argv); + sp -= call_argc; + if (unlikely(JS_IsException(ret_val))) + goto exception; + *sp++ = ret_val; + } + BREAK; + + CASE(OP_apply): + { + int magic; + magic = get_u16(pc); + pc += 2; + sf->cur_pc = pc; + + ret_val = js_function_apply(ctx, sp[-3], 2, vc(&sp[-2]), magic); + if (unlikely(JS_IsException(ret_val))) + goto exception; + JS_FreeValue(ctx, sp[-3]); + JS_FreeValue(ctx, sp[-2]); + JS_FreeValue(ctx, sp[-1]); + sp -= 3; + *sp++ = ret_val; + } + BREAK; + CASE(OP_return): + ret_val = *--sp; + goto done; + CASE(OP_return_undef): + ret_val = JS_UNDEFINED; + goto done; + + CASE(OP_check_ctor_return): + /* return true if 'this' should be returned */ + if (!JS_IsObject(sp[-1])) { + if (!JS_IsUndefined(sp[-1])) { + JS_ThrowTypeError(caller_ctx, "derived class constructor must return an object or undefined"); + goto exception; + } + sp[0] = JS_TRUE; + } else { + sp[0] = JS_FALSE; + } + sp++; + BREAK; + CASE(OP_check_ctor): + if (JS_IsUndefined(new_target)) { + non_ctor_call: + JS_ThrowTypeError(ctx, "class constructors must be invoked with 'new'"); + goto exception; + } + BREAK; + CASE(OP_init_ctor): + { + JSValue super, ret; + sf->cur_pc = pc; + if (JS_IsUndefined(new_target)) + goto non_ctor_call; + super = JS_GetPrototype(ctx, func_obj); + if (JS_IsException(super)) + goto exception; + ret = JS_CallConstructor2(ctx, super, new_target, argc, argv); + JS_FreeValue(ctx, super); + if (JS_IsException(ret)) + goto exception; + *sp++ = ret; + } + BREAK; + CASE(OP_check_brand): + { + int ret = JS_CheckBrand(ctx, sp[-2], sp[-1]); + if (ret < 0) + goto exception; + if (!ret) { + JS_ThrowTypeError(ctx, "invalid brand on object"); + goto exception; + } + } + BREAK; + CASE(OP_add_brand): + if (JS_AddBrand(ctx, sp[-2], sp[-1]) < 0) + goto exception; + JS_FreeValue(ctx, sp[-2]); + JS_FreeValue(ctx, sp[-1]); + sp -= 2; + BREAK; + + CASE(OP_throw): + JS_Throw(ctx, *--sp); + goto exception; + + CASE(OP_throw_error): +#define JS_THROW_VAR_RO 0 +#define JS_THROW_VAR_REDECL 1 +#define JS_THROW_VAR_UNINITIALIZED 2 +#define JS_THROW_ERROR_DELETE_SUPER 3 +#define JS_THROW_ERROR_ITERATOR_THROW 4 + { + JSAtom atom; + int type; + atom = get_u32(pc); + type = pc[4]; + pc += 5; + if (type == JS_THROW_VAR_RO) + JS_ThrowTypeErrorReadOnly(ctx, JS_PROP_THROW, atom); + else + if (type == JS_THROW_VAR_REDECL) + JS_ThrowSyntaxErrorVarRedeclaration(ctx, atom); + else + if (type == JS_THROW_VAR_UNINITIALIZED) + JS_ThrowReferenceErrorUninitialized(ctx, atom); + else + if (type == JS_THROW_ERROR_DELETE_SUPER) + JS_ThrowReferenceError(ctx, "unsupported reference to 'super'"); + else + if (type == JS_THROW_ERROR_ITERATOR_THROW) + JS_ThrowTypeError(ctx, "iterator does not have a throw method"); + else + JS_ThrowInternalError(ctx, "invalid throw var type %d", type); + } + goto exception; + + CASE(OP_eval): + { + JSValue obj; + int scope_idx; + call_argc = get_u16(pc); + scope_idx = get_u16(pc + 2) - 1; + pc += 4; + call_argv = sp - call_argc; + sf->cur_pc = pc; + if (js_same_value(ctx, call_argv[-1], ctx->eval_obj)) { + if (call_argc >= 1) + obj = call_argv[0]; + else + obj = JS_UNDEFINED; + ret_val = JS_EvalObject(ctx, JS_UNDEFINED, obj, + JS_EVAL_TYPE_DIRECT, scope_idx); + } else { + ret_val = JS_CallInternal(ctx, call_argv[-1], JS_UNDEFINED, + JS_UNDEFINED, call_argc, + vc(call_argv), 0); + } + if (unlikely(JS_IsException(ret_val))) + goto exception; + for(i = -1; i < call_argc; i++) + JS_FreeValue(ctx, call_argv[i]); + sp -= call_argc + 1; + *sp++ = ret_val; + } + BREAK; + /* could merge with OP_apply */ + CASE(OP_apply_eval): + { + int scope_idx; + uint32_t len; + JSValue *tab; + JSValue obj; + + scope_idx = get_u16(pc) - 1; + pc += 2; + sf->cur_pc = pc; + tab = build_arg_list(ctx, &len, sp[-1]); + if (!tab) + goto exception; + if (js_same_value(ctx, sp[-2], ctx->eval_obj)) { + if (len >= 1) + obj = tab[0]; + else + obj = JS_UNDEFINED; + ret_val = JS_EvalObject(ctx, JS_UNDEFINED, obj, + JS_EVAL_TYPE_DIRECT, scope_idx); + } else { + ret_val = JS_Call(ctx, sp[-2], JS_UNDEFINED, len, vc(tab)); + } + free_arg_list(ctx, tab, len); + if (unlikely(JS_IsException(ret_val))) + goto exception; + JS_FreeValue(ctx, sp[-2]); + JS_FreeValue(ctx, sp[-1]); + sp -= 2; + *sp++ = ret_val; + } + BREAK; + + CASE(OP_regexp): + { + sp[-2] = js_regexp_constructor_internal(ctx, JS_UNDEFINED, + sp[-2], sp[-1]); + sp--; + } + BREAK; + + CASE(OP_get_super): + { + JSValue proto; + proto = JS_GetPrototype(ctx, sp[-1]); + if (JS_IsException(proto)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = proto; + } + BREAK; + + CASE(OP_import): + { + JSValue val; + sf->cur_pc = pc; + val = js_dynamic_import(ctx, sp[-2], sp[-1]); + if (JS_IsException(val)) + goto exception; + JS_FreeValue(ctx, sp[-2]); + JS_FreeValue(ctx, sp[-1]); + sp--; + sp[-1] = val; + } + BREAK; + + CASE(OP_check_var): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + + ret = JS_CheckGlobalVar(ctx, atom); + if (ret < 0) + goto exception; + *sp++ = js_bool(ret); + } + BREAK; + + CASE(OP_get_var_undef): + CASE(OP_get_var): + { + JSValue val; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + + val = JS_GetGlobalVar(ctx, atom, opcode - OP_get_var_undef); + if (unlikely(JS_IsException(val))) + goto exception; + *sp++ = val; + } + BREAK; + + CASE(OP_put_var): + CASE(OP_put_var_init): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + + ret = JS_SetGlobalVar(ctx, atom, sp[-1], opcode - OP_put_var); + sp--; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_put_var_strict): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + + /* sp[-2] is JS_TRUE or JS_FALSE */ + if (unlikely(!JS_VALUE_GET_INT(sp[-2]))) { + JS_ThrowReferenceErrorNotDefined(ctx, atom); + goto exception; + } + ret = JS_SetGlobalVar(ctx, atom, sp[-1], 2); + sp -= 2; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_check_define_var): + { + JSAtom atom; + int flags; + atom = get_u32(pc); + flags = pc[4]; + pc += 5; + if (JS_CheckDefineGlobalVar(ctx, atom, flags)) + goto exception; + } + BREAK; + CASE(OP_define_var): + { + JSAtom atom; + int flags; + atom = get_u32(pc); + flags = pc[4]; + pc += 5; + if (JS_DefineGlobalVar(ctx, atom, flags)) + goto exception; + } + BREAK; + CASE(OP_define_func): + { + JSAtom atom; + int flags; + atom = get_u32(pc); + flags = pc[4]; + pc += 5; + if (JS_DefineGlobalFunction(ctx, atom, sp[-1], flags)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp--; + } + BREAK; + + CASE(OP_get_loc): + { + int idx; + idx = get_u16(pc); + pc += 2; + sp[0] = js_dup(var_buf[idx]); + sp++; + } + BREAK; + CASE(OP_put_loc): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, &var_buf[idx], sp[-1]); + sp--; + } + BREAK; + CASE(OP_set_loc): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, &var_buf[idx], js_dup(sp[-1])); + } + BREAK; + CASE(OP_get_arg): + { + int idx; + idx = get_u16(pc); + pc += 2; + sp[0] = js_dup(arg_buf[idx]); + sp++; + } + BREAK; + CASE(OP_put_arg): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, &arg_buf[idx], sp[-1]); + sp--; + } + BREAK; + CASE(OP_set_arg): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, &arg_buf[idx], js_dup(sp[-1])); + } + BREAK; + + CASE(OP_get_loc8): *sp++ = js_dup(var_buf[*pc++]); BREAK; + CASE(OP_put_loc8): set_value(ctx, &var_buf[*pc++], *--sp); BREAK; + CASE(OP_set_loc8): set_value(ctx, &var_buf[*pc++], js_dup(sp[-1])); BREAK; + + // Observation: get_loc0 and get_loc1 are individually very + // frequent opcodes _and_ they are very often paired together, + // making them ideal candidates for opcode fusion. + CASE(OP_get_loc0_loc1): + *sp++ = js_dup(var_buf[0]); + *sp++ = js_dup(var_buf[1]); + BREAK; + + CASE(OP_get_loc0): *sp++ = js_dup(var_buf[0]); BREAK; + CASE(OP_get_loc1): *sp++ = js_dup(var_buf[1]); BREAK; + CASE(OP_get_loc2): *sp++ = js_dup(var_buf[2]); BREAK; + CASE(OP_get_loc3): *sp++ = js_dup(var_buf[3]); BREAK; + CASE(OP_put_loc0): set_value(ctx, &var_buf[0], *--sp); BREAK; + CASE(OP_put_loc1): set_value(ctx, &var_buf[1], *--sp); BREAK; + CASE(OP_put_loc2): set_value(ctx, &var_buf[2], *--sp); BREAK; + CASE(OP_put_loc3): set_value(ctx, &var_buf[3], *--sp); BREAK; + CASE(OP_set_loc0): set_value(ctx, &var_buf[0], js_dup(sp[-1])); BREAK; + CASE(OP_set_loc1): set_value(ctx, &var_buf[1], js_dup(sp[-1])); BREAK; + CASE(OP_set_loc2): set_value(ctx, &var_buf[2], js_dup(sp[-1])); BREAK; + CASE(OP_set_loc3): set_value(ctx, &var_buf[3], js_dup(sp[-1])); BREAK; + CASE(OP_get_arg0): *sp++ = js_dup(arg_buf[0]); BREAK; + CASE(OP_get_arg1): *sp++ = js_dup(arg_buf[1]); BREAK; + CASE(OP_get_arg2): *sp++ = js_dup(arg_buf[2]); BREAK; + CASE(OP_get_arg3): *sp++ = js_dup(arg_buf[3]); BREAK; + CASE(OP_put_arg0): set_value(ctx, &arg_buf[0], *--sp); BREAK; + CASE(OP_put_arg1): set_value(ctx, &arg_buf[1], *--sp); BREAK; + CASE(OP_put_arg2): set_value(ctx, &arg_buf[2], *--sp); BREAK; + CASE(OP_put_arg3): set_value(ctx, &arg_buf[3], *--sp); BREAK; + CASE(OP_set_arg0): set_value(ctx, &arg_buf[0], js_dup(sp[-1])); BREAK; + CASE(OP_set_arg1): set_value(ctx, &arg_buf[1], js_dup(sp[-1])); BREAK; + CASE(OP_set_arg2): set_value(ctx, &arg_buf[2], js_dup(sp[-1])); BREAK; + CASE(OP_set_arg3): set_value(ctx, &arg_buf[3], js_dup(sp[-1])); BREAK; + CASE(OP_get_var_ref0): *sp++ = js_dup(*var_refs[0]->pvalue); BREAK; + CASE(OP_get_var_ref1): *sp++ = js_dup(*var_refs[1]->pvalue); BREAK; + CASE(OP_get_var_ref2): *sp++ = js_dup(*var_refs[2]->pvalue); BREAK; + CASE(OP_get_var_ref3): *sp++ = js_dup(*var_refs[3]->pvalue); BREAK; + CASE(OP_put_var_ref0): set_value(ctx, var_refs[0]->pvalue, *--sp); BREAK; + CASE(OP_put_var_ref1): set_value(ctx, var_refs[1]->pvalue, *--sp); BREAK; + CASE(OP_put_var_ref2): set_value(ctx, var_refs[2]->pvalue, *--sp); BREAK; + CASE(OP_put_var_ref3): set_value(ctx, var_refs[3]->pvalue, *--sp); BREAK; + CASE(OP_set_var_ref0): set_value(ctx, var_refs[0]->pvalue, js_dup(sp[-1])); BREAK; + CASE(OP_set_var_ref1): set_value(ctx, var_refs[1]->pvalue, js_dup(sp[-1])); BREAK; + CASE(OP_set_var_ref2): set_value(ctx, var_refs[2]->pvalue, js_dup(sp[-1])); BREAK; + CASE(OP_set_var_ref3): set_value(ctx, var_refs[3]->pvalue, js_dup(sp[-1])); BREAK; + + CASE(OP_get_var_ref): + { + int idx; + JSValue val; + idx = get_u16(pc); + pc += 2; + val = *var_refs[idx]->pvalue; + sp[0] = js_dup(val); + sp++; + } + BREAK; + CASE(OP_put_var_ref): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, var_refs[idx]->pvalue, sp[-1]); + sp--; + } + BREAK; + CASE(OP_set_var_ref): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, var_refs[idx]->pvalue, js_dup(sp[-1])); + } + BREAK; + CASE(OP_get_var_ref_check): + { + int idx; + JSValue val; + idx = get_u16(pc); + pc += 2; + val = *var_refs[idx]->pvalue; + if (unlikely(JS_IsUninitialized(val))) { + JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true); + goto exception; + } + sp[0] = js_dup(val); + sp++; + } + BREAK; + CASE(OP_put_var_ref_check): + { + int idx; + idx = get_u16(pc); + pc += 2; + if (unlikely(JS_IsUninitialized(*var_refs[idx]->pvalue))) { + JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true); + goto exception; + } + set_value(ctx, var_refs[idx]->pvalue, sp[-1]); + sp--; + } + BREAK; + CASE(OP_put_var_ref_check_init): + { + int idx; + idx = get_u16(pc); + pc += 2; + if (unlikely(!JS_IsUninitialized(*var_refs[idx]->pvalue))) { + JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true); + goto exception; + } + set_value(ctx, var_refs[idx]->pvalue, sp[-1]); + sp--; + } + BREAK; + CASE(OP_set_loc_uninitialized): + { + int idx; + idx = get_u16(pc); + pc += 2; + set_value(ctx, &var_buf[idx], JS_UNINITIALIZED); + } + BREAK; + CASE(OP_get_loc_check): + { + int idx; + idx = get_u16(pc); + pc += 2; + if (unlikely(JS_IsUninitialized(var_buf[idx]))) { + JS_ThrowReferenceErrorUninitialized2(caller_ctx, b, idx, + false); + goto exception; + } + sp[0] = js_dup(var_buf[idx]); + sp++; + } + BREAK; + CASE(OP_put_loc_check): + { + int idx; + idx = get_u16(pc); + pc += 2; + if (unlikely(JS_IsUninitialized(var_buf[idx]))) { + JS_ThrowReferenceErrorUninitialized2(caller_ctx, b, idx, + false); + goto exception; + } + set_value(ctx, &var_buf[idx], sp[-1]); + sp--; + } + BREAK; + CASE(OP_put_loc_check_init): + { + int idx; + idx = get_u16(pc); + pc += 2; + if (unlikely(!JS_IsUninitialized(var_buf[idx]))) { + JS_ThrowReferenceError(caller_ctx, + "'this' can be initialized only once"); + goto exception; + } + set_value(ctx, &var_buf[idx], sp[-1]); + sp--; + } + BREAK; + CASE(OP_close_loc): + { + int idx; + idx = get_u16(pc); + pc += 2; + close_lexical_var(ctx, b, sf, idx); + } + BREAK; + + CASE(OP_make_loc_ref): + CASE(OP_make_arg_ref): + CASE(OP_make_var_ref_ref): + { + JSVarRef *var_ref; + JSProperty *pr; + JSAtom atom; + int idx; + atom = get_u32(pc); + idx = get_u16(pc + 4); + pc += 6; + *sp++ = JS_NewObjectProto(ctx, JS_NULL); + if (unlikely(JS_IsException(sp[-1]))) + goto exception; + if (opcode == OP_make_var_ref_ref) { + var_ref = var_refs[idx]; + var_ref->header.ref_count++; + } else { + var_ref = get_var_ref(ctx, sf, idx, opcode == OP_make_arg_ref); + if (!var_ref) + goto exception; + } + pr = add_property(ctx, JS_VALUE_GET_OBJ(sp[-1]), atom, + JS_PROP_WRITABLE | JS_PROP_VARREF); + if (!pr) { + free_var_ref(rt, var_ref); + goto exception; + } + pr->u.var_ref = var_ref; + *sp++ = JS_AtomToValue(ctx, atom); + } + BREAK; + CASE(OP_make_var_ref): + { + JSAtom atom; + atom = get_u32(pc); + pc += 4; + + if (JS_GetGlobalVarRef(ctx, atom, sp)) + goto exception; + sp += 2; + } + BREAK; + + CASE(OP_goto): + pc += (int32_t)get_u32(pc); + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + BREAK; + CASE(OP_goto16): + pc += (int16_t)get_u16(pc); + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + BREAK; + CASE(OP_goto8): + pc += (int8_t)pc[0]; + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + BREAK; + CASE(OP_if_true): + { + int res; + JSValue op1; + + op1 = sp[-1]; + pc += 4; + if ((uint32_t)JS_VALUE_GET_TAG(op1) <= JS_TAG_UNDEFINED) { + res = JS_VALUE_GET_INT(op1); + } else { + res = JS_ToBoolFree(ctx, op1); + } + sp--; + if (res) { + pc += (int32_t)get_u32(pc - 4) - 4; + } + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + } + BREAK; + CASE(OP_if_false): + { + int res; + JSValue op1; + + op1 = sp[-1]; + pc += 4; + if ((uint32_t)JS_VALUE_GET_TAG(op1) <= JS_TAG_UNDEFINED) { + res = JS_VALUE_GET_INT(op1); + } else { + res = JS_ToBoolFree(ctx, op1); + } + sp--; + if (!res) { + pc += (int32_t)get_u32(pc - 4) - 4; + } + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + } + BREAK; + CASE(OP_if_true8): + { + int res; + JSValue op1; + + op1 = sp[-1]; + pc += 1; + if ((uint32_t)JS_VALUE_GET_TAG(op1) <= JS_TAG_UNDEFINED) { + res = JS_VALUE_GET_INT(op1); + } else { + res = JS_ToBoolFree(ctx, op1); + } + sp--; + if (res) { + pc += (int8_t)pc[-1] - 1; + } + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + } + BREAK; + CASE(OP_if_false8): + { + int res; + JSValue op1; + + op1 = sp[-1]; + pc += 1; + if ((uint32_t)JS_VALUE_GET_TAG(op1) <= JS_TAG_UNDEFINED) { + res = JS_VALUE_GET_INT(op1); + } else { + res = JS_ToBoolFree(ctx, op1); + } + sp--; + if (!res) { + pc += (int8_t)pc[-1] - 1; + } + if (unlikely(js_poll_interrupts(ctx))) + goto exception; + } + BREAK; + CASE(OP_catch): + { + int32_t diff; + diff = get_u32(pc); + sp[0] = JS_NewCatchOffset(ctx, pc + diff - b->byte_code_buf); + sp++; + pc += 4; + } + BREAK; + CASE(OP_gosub): + { + int32_t diff; + diff = get_u32(pc); + /* XXX: should have a different tag to avoid security flaw */ + sp[0] = js_int32(pc + 4 - b->byte_code_buf); + sp++; + pc += diff; + } + BREAK; + CASE(OP_ret): + { + JSValue op1; + uint32_t pos; + op1 = sp[-1]; + if (unlikely(JS_VALUE_GET_TAG(op1) != JS_TAG_INT)) + goto ret_fail; + pos = JS_VALUE_GET_INT(op1); + if (unlikely(pos >= b->byte_code_len)) { + ret_fail: + JS_ThrowInternalError(ctx, "invalid ret value"); + goto exception; + } + sp--; + pc = b->byte_code_buf + pos; + } + BREAK; + + CASE(OP_for_in_start): + sf->cur_pc = pc; + if (js_for_in_start(ctx, sp)) + goto exception; + BREAK; + CASE(OP_for_in_next): + sf->cur_pc = pc; + if (js_for_in_next(ctx, sp)) + goto exception; + sp += 2; + BREAK; + CASE(OP_for_of_start): + sf->cur_pc = pc; + if (js_for_of_start(ctx, sp, false)) + goto exception; + sp += 1; + *sp++ = JS_NewCatchOffset(ctx, 0); + BREAK; + CASE(OP_for_of_next): + { + int offset = -3 - pc[0]; + pc += 1; + sf->cur_pc = pc; + if (js_for_of_next(ctx, sp, offset)) + goto exception; + sp += 2; + } + BREAK; + CASE(OP_for_await_of_start): + sf->cur_pc = pc; + if (js_for_of_start(ctx, sp, true)) + goto exception; + sp += 1; + *sp++ = JS_NewCatchOffset(ctx, 0); + BREAK; + CASE(OP_iterator_get_value_done): + sf->cur_pc = pc; + if (js_iterator_get_value_done(ctx, sp)) + goto exception; + sp += 1; + BREAK; + CASE(OP_iterator_check_object): + if (unlikely(!JS_IsObject(sp[-1]))) { + JS_ThrowTypeError(ctx, "iterator must return an object"); + goto exception; + } + BREAK; + + CASE(OP_iterator_close): + /* iter_obj next catch_offset -> */ + sp--; /* drop the catch offset to avoid getting caught by exception */ + JS_FreeValue(ctx, sp[-1]); /* drop the next method */ + sp--; + if (!JS_IsUndefined(sp[-1])) { + sf->cur_pc = pc; + if (JS_IteratorClose(ctx, sp[-1], false)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + } + sp--; + BREAK; + CASE(OP_nip_catch): + { + JSValue ret_val; + /* catch_offset ... ret_val -> ret_eval */ + ret_val = *--sp; + while (sp > stack_buf && + JS_VALUE_GET_TAG(sp[-1]) != JS_TAG_CATCH_OFFSET) { + JS_FreeValue(ctx, *--sp); + } + if (unlikely(sp == stack_buf)) { + JS_ThrowInternalError(ctx, "nip_catch"); + JS_FreeValue(ctx, ret_val); + goto exception; + } + sp[-1] = ret_val; + } + BREAK; + + CASE(OP_iterator_next): + /* stack: iter_obj next catch_offset val */ + { + JSValue ret; + sf->cur_pc = pc; + ret = JS_Call(ctx, sp[-3], sp[-4], 1, vc(sp - 1)); + if (JS_IsException(ret)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = ret; + } + BREAK; + + CASE(OP_iterator_call): + /* stack: iter_obj next catch_offset val */ + { + JSValue method, ret; + bool ret_flag; + int flags; + flags = *pc++; + sf->cur_pc = pc; + method = JS_GetProperty(ctx, sp[-4], (flags & 1) ? + JS_ATOM_throw : JS_ATOM_return); + if (JS_IsException(method)) + goto exception; + if (JS_IsUndefined(method) || JS_IsNull(method)) { + ret_flag = true; + } else { + if (flags & 2) { + /* no argument */ + ret = JS_CallFree(ctx, method, sp[-4], + 0, NULL); + } else { + ret = JS_CallFree(ctx, method, sp[-4], + 1, vc(sp - 1)); + } + if (JS_IsException(ret)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = ret; + ret_flag = false; + } + sp[0] = js_bool(ret_flag); + sp += 1; + } + BREAK; + + CASE(OP_lnot): + { + int res; + JSValue op1; + + op1 = sp[-1]; + if ((uint32_t)JS_VALUE_GET_TAG(op1) <= JS_TAG_UNDEFINED) { + res = JS_VALUE_GET_INT(op1) != 0; + } else { + res = JS_ToBoolFree(ctx, op1); + } + sp[-1] = js_bool(!res); + } + BREAK; + + CASE(OP_get_field): + { + JSValue val; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + val = JS_GetPropertyInternal(ctx, sp[-1], atom, sp[-1], false); + if (unlikely(JS_IsException(val))) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = val; + } + BREAK; + + CASE(OP_get_field2): + { + JSValue val; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + val = JS_GetPropertyInternal(ctx, sp[-1], atom, sp[-1], false); + if (unlikely(JS_IsException(val))) + goto exception; + *sp++ = val; + } + BREAK; + + CASE(OP_put_field): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + sf->cur_pc = pc; + ret = JS_SetPropertyInternal2(ctx, + sp[-2], atom, + sp[-1], sp[-2], + JS_PROP_THROW_STRICT); + JS_FreeValue(ctx, sp[-2]); + sp -= 2; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_private_symbol): + { + JSAtom atom; + JSValue val; + + atom = get_u32(pc); + pc += 4; + val = JS_NewSymbolFromAtom(ctx, atom, JS_ATOM_TYPE_PRIVATE); + if (JS_IsException(val)) + goto exception; + *sp++ = val; + } + BREAK; + + CASE(OP_get_private_field): + { + JSValue val; + sf->cur_pc = pc; + val = JS_GetPrivateField(ctx, sp[-2], sp[-1]); + JS_FreeValue(ctx, sp[-1]); + JS_FreeValue(ctx, sp[-2]); + sp[-2] = val; + sp--; + if (unlikely(JS_IsException(val))) + goto exception; + } + BREAK; + + CASE(OP_put_private_field): + { + int ret; + sf->cur_pc = pc; + ret = JS_SetPrivateField(ctx, sp[-3], sp[-1], sp[-2]); + JS_FreeValue(ctx, sp[-3]); + JS_FreeValue(ctx, sp[-1]); + sp -= 3; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_define_private_field): + { + int ret; + ret = JS_DefinePrivateField(ctx, sp[-3], sp[-2], sp[-1]); + JS_FreeValue(ctx, sp[-2]); + sp -= 2; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_define_field): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + + ret = JS_DefinePropertyValue(ctx, sp[-2], atom, sp[-1], + JS_PROP_C_W_E | JS_PROP_THROW); + sp--; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_set_name): + { + int ret; + JSAtom atom; + atom = get_u32(pc); + pc += 4; + + ret = JS_DefineObjectName(ctx, sp[-1], atom, JS_PROP_CONFIGURABLE); + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + CASE(OP_set_name_computed): + { + int ret; + ret = JS_DefineObjectNameComputed(ctx, sp[-1], sp[-2], JS_PROP_CONFIGURABLE); + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + CASE(OP_set_proto): + { + JSValue proto; + proto = sp[-1]; + if (JS_IsObject(proto) || JS_IsNull(proto)) { + if (JS_SetPrototypeInternal(ctx, sp[-2], proto, true) < 0) + goto exception; + } + JS_FreeValue(ctx, proto); + sp--; + } + BREAK; + CASE(OP_set_home_object): + js_method_set_home_object(ctx, sp[-1], sp[-2]); + BREAK; + CASE(OP_define_method): + CASE(OP_define_method_computed): + { + JSValue getter, setter, value; + JSValue obj; + JSAtom atom; + int flags, ret, op_flags; + bool is_computed; +#define OP_DEFINE_METHOD_METHOD 0 +#define OP_DEFINE_METHOD_GETTER 1 +#define OP_DEFINE_METHOD_SETTER 2 +#define OP_DEFINE_METHOD_ENUMERABLE 4 + + is_computed = (opcode == OP_define_method_computed); + if (is_computed) { + atom = JS_ValueToAtom(ctx, sp[-2]); + if (unlikely(atom == JS_ATOM_NULL)) + goto exception; + opcode += OP_define_method - OP_define_method_computed; + } else { + atom = get_u32(pc); + pc += 4; + } + op_flags = *pc++; + + obj = sp[-2 - is_computed]; + flags = JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE | + JS_PROP_HAS_ENUMERABLE | JS_PROP_THROW; + if (op_flags & OP_DEFINE_METHOD_ENUMERABLE) + flags |= JS_PROP_ENUMERABLE; + op_flags &= 3; + value = JS_UNDEFINED; + getter = JS_UNDEFINED; + setter = JS_UNDEFINED; + if (op_flags == OP_DEFINE_METHOD_METHOD) { + value = sp[-1]; + flags |= JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE; + } else if (op_flags == OP_DEFINE_METHOD_GETTER) { + getter = sp[-1]; + flags |= JS_PROP_HAS_GET; + } else { + setter = sp[-1]; + flags |= JS_PROP_HAS_SET; + } + ret = js_method_set_properties(ctx, sp[-1], atom, flags, obj); + if (ret >= 0) { + ret = JS_DefineProperty(ctx, obj, atom, value, + getter, setter, flags); + } + JS_FreeValue(ctx, sp[-1]); + if (is_computed) { + JS_FreeAtom(ctx, atom); + JS_FreeValue(ctx, sp[-2]); + } + sp -= 1 + is_computed; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_define_class): + CASE(OP_define_class_computed): + { + int class_flags; + JSAtom atom; + + atom = get_u32(pc); + class_flags = pc[4]; + pc += 5; + if (js_op_define_class(ctx, sp, atom, class_flags, + var_refs, sf, + (opcode == OP_define_class_computed)) < 0) + goto exception; + } + BREAK; + + CASE(OP_get_array_el): + { + JSValue val; + + sf->cur_pc = pc; + val = JS_GetPropertyValue(ctx, sp[-2], sp[-1]); + JS_FreeValue(ctx, sp[-2]); + sp[-2] = val; + sp--; + if (unlikely(JS_IsException(val))) + goto exception; + } + BREAK; + + CASE(OP_get_array_el2): + { + JSValue val; + + sf->cur_pc = pc; + val = JS_GetPropertyValue(ctx, sp[-2], sp[-1]); + sp[-1] = val; + if (unlikely(JS_IsException(val))) + goto exception; + } + BREAK; + + CASE(OP_get_ref_value): + { + JSValue val; + sf->cur_pc = pc; + if (unlikely(JS_IsUndefined(sp[-2]))) { + JSAtom atom = JS_ValueToAtom(ctx, sp[-1]); + if (atom != JS_ATOM_NULL) { + JS_ThrowReferenceErrorNotDefined(ctx, atom); + JS_FreeAtom(ctx, atom); + } + goto exception; + } + val = JS_GetPropertyValue(ctx, sp[-2], + js_dup(sp[-1])); + if (unlikely(JS_IsException(val))) + goto exception; + sp[0] = val; + sp++; + } + BREAK; + + CASE(OP_get_super_value): + { + JSValue val; + JSAtom atom; + sf->cur_pc = pc; + atom = JS_ValueToAtom(ctx, sp[-1]); + if (unlikely(atom == JS_ATOM_NULL)) + goto exception; + val = JS_GetPropertyInternal(ctx, sp[-2], atom, sp[-3], false); + JS_FreeAtom(ctx, atom); + if (unlikely(JS_IsException(val))) + goto exception; + JS_FreeValue(ctx, sp[-1]); + JS_FreeValue(ctx, sp[-2]); + JS_FreeValue(ctx, sp[-3]); + sp[-3] = val; + sp -= 2; + } + BREAK; + + CASE(OP_put_array_el): + { + int ret; + sf->cur_pc = pc; + ret = JS_SetPropertyValue(ctx, sp[-3], sp[-2], sp[-1], JS_PROP_THROW_STRICT); + JS_FreeValue(ctx, sp[-3]); + sp -= 3; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_put_ref_value): + { + int ret, flags; + sf->cur_pc = pc; + flags = JS_PROP_THROW_STRICT; + if (unlikely(JS_IsUndefined(sp[-3]))) { + if (is_strict_mode(ctx)) { + JSAtom atom = JS_ValueToAtom(ctx, sp[-2]); + if (atom != JS_ATOM_NULL) { + JS_ThrowReferenceErrorNotDefined(ctx, atom); + JS_FreeAtom(ctx, atom); + } + goto exception; + } else { + sp[-3] = js_dup(ctx->global_obj); + } + } else { + if (is_strict_mode(ctx)) + flags |= JS_PROP_NO_ADD; + } + ret = JS_SetPropertyValue(ctx, sp[-3], sp[-2], sp[-1], flags); + JS_FreeValue(ctx, sp[-3]); + sp -= 3; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_put_super_value): + { + int ret; + JSAtom atom; + sf->cur_pc = pc; + if (JS_VALUE_GET_TAG(sp[-3]) != JS_TAG_OBJECT) { + JS_ThrowTypeErrorNotAnObject(ctx); + goto exception; + } + atom = JS_ValueToAtom(ctx, sp[-2]); + if (unlikely(atom == JS_ATOM_NULL)) + goto exception; + ret = JS_SetPropertyInternal2(ctx, + sp[-3], atom, + sp[-1], sp[-4], + JS_PROP_THROW_STRICT); + JS_FreeAtom(ctx, atom); + JS_FreeValue(ctx, sp[-4]); + JS_FreeValue(ctx, sp[-3]); + JS_FreeValue(ctx, sp[-2]); + sp -= 4; + if (ret < 0) + goto exception; + } + BREAK; + + CASE(OP_define_array_el): + { + int ret; + ret = JS_DefinePropertyValueValue(ctx, sp[-3], js_dup(sp[-2]), sp[-1], + JS_PROP_C_W_E | JS_PROP_THROW); + sp -= 1; + if (unlikely(ret < 0)) + goto exception; + } + BREAK; + + CASE(OP_append): /* array pos enumobj -- array pos */ + { + sf->cur_pc = pc; + if (js_append_enumerate(ctx, sp)) + goto exception; + JS_FreeValue(ctx, *--sp); + } + BREAK; + + CASE(OP_copy_data_properties): /* target source excludeList */ + { + /* stack offsets (-1 based): + 2 bits for target, + 3 bits for source, + 2 bits for exclusionList */ + int mask; + + mask = *pc++; + sf->cur_pc = pc; + if (JS_CopyDataProperties(ctx, sp[-1 - (mask & 3)], + sp[-1 - ((mask >> 2) & 7)], + sp[-1 - ((mask >> 5) & 7)], 0)) + goto exception; + } + BREAK; + + CASE(OP_add): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + int64_t r; + r = (int64_t)JS_VALUE_GET_INT(op1) + JS_VALUE_GET_INT(op2); + if (unlikely((int)r != r)) + goto add_slow; + sp[-2] = js_int32(r); + sp--; + } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + sp[-2] = js_float64(JS_VALUE_GET_FLOAT64(op1) + + JS_VALUE_GET_FLOAT64(op2)); + JS_X87_FPCW_RESTORE(fpcw); + sp--; + } else { + add_slow: + sf->cur_pc = pc; + if (js_add_slow(ctx, sp)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_add_loc): + { + JSValue *pv; + int idx; + idx = *pc; + pc += 1; + + pv = &var_buf[idx]; + if (likely(JS_VALUE_IS_BOTH_INT(*pv, sp[-1]))) { + int64_t r; + r = (int64_t)JS_VALUE_GET_INT(*pv) + + JS_VALUE_GET_INT(sp[-1]); + if (unlikely((int)r != r)) + goto add_loc_slow; + *pv = js_int32(r); + sp--; + } else if (JS_VALUE_GET_TAG(*pv) == JS_TAG_STRING) { + JSValue op1; + op1 = sp[-1]; + sp--; + sf->cur_pc = pc; + op1 = JS_ToPrimitiveFree(ctx, op1, HINT_NONE); + if (JS_IsException(op1)) + goto exception; + op1 = JS_ConcatString(ctx, js_dup(*pv), op1); + if (JS_IsException(op1)) + goto exception; + set_value(ctx, pv, op1); + } else { + JSValue ops[2]; + add_loc_slow: + /* In case of exception, js_add_slow frees ops[0] + and ops[1], so we must duplicate *pv */ + sf->cur_pc = pc; + ops[0] = js_dup(*pv); + ops[1] = sp[-1]; + sp--; + if (js_add_slow(ctx, ops + 2)) + goto exception; + set_value(ctx, pv, ops[0]); + } + } + BREAK; + CASE(OP_sub): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + int64_t r; + r = (int64_t)JS_VALUE_GET_INT(op1) - JS_VALUE_GET_INT(op2); + if (unlikely((int)r != r)) + goto binary_arith_slow; + sp[-2] = js_int32(r); + sp--; + } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + sp[-2] = js_float64(JS_VALUE_GET_FLOAT64(op1) - + JS_VALUE_GET_FLOAT64(op2)); + JS_X87_FPCW_RESTORE(fpcw); + sp--; + } else { + goto binary_arith_slow; + } + } + BREAK; + CASE(OP_mul): + { + JSValue op1, op2; + double d; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + int32_t v1, v2; + int64_t r; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2); + r = (int64_t)v1 * v2; + if (unlikely((int)r != r)) { + d = (double)r; + goto mul_fp_res; + } + /* need to test zero case for -0 result */ + if (unlikely(r == 0 && (v1 | v2) < 0)) { + d = -0.0; + goto mul_fp_res; + } + sp[-2] = js_int32(r); + sp--; + } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) { + JS_X87_FPCW_SAVE_AND_ADJUST(fpcw); + d = JS_VALUE_GET_FLOAT64(op1) * JS_VALUE_GET_FLOAT64(op2); + JS_X87_FPCW_RESTORE(fpcw); + mul_fp_res: + sp[-2] = js_float64(d); + sp--; + } else { + goto binary_arith_slow; + } + } + BREAK; + CASE(OP_div): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + int v1, v2; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2); + sp[-2] = js_number((double)v1 / (double)v2); + sp--; + } else { + goto binary_arith_slow; + } + } + BREAK; + CASE(OP_mod): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + int v1, v2, r; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2); + /* We must avoid v2 = 0, v1 = INT32_MIN and v2 = + -1 and the cases where the result is -0. */ + if (unlikely(v1 < 0 || v2 <= 0)) + goto binary_arith_slow; + r = v1 % v2; + sp[-2] = js_int32(r); + sp--; + } else { + goto binary_arith_slow; + } + } + BREAK; + CASE(OP_pow): + binary_arith_slow: + sf->cur_pc = pc; + if (js_binary_arith_slow(ctx, sp, opcode)) + goto exception; + sp--; + BREAK; + + CASE(OP_plus): + { + JSValue op1; + uint32_t tag; + op1 = sp[-1]; + tag = JS_VALUE_GET_TAG(op1); + if (tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag)) { + } else { + sf->cur_pc = pc; + if (js_unary_arith_slow(ctx, sp, opcode)) + goto exception; + } + } + BREAK; + CASE(OP_neg): + { + JSValue op1; + uint32_t tag; + int val; + double d; + op1 = sp[-1]; + tag = JS_VALUE_GET_TAG(op1); + if (tag == JS_TAG_INT) { + val = JS_VALUE_GET_INT(op1); + /* Note: -0 cannot be expressed as integer */ + if (unlikely(val == 0)) { + d = -0.0; + goto neg_fp_res; + } + if (unlikely(val == INT32_MIN)) { + d = -(double)val; + goto neg_fp_res; + } + sp[-1] = js_int32(-val); + } else if (JS_TAG_IS_FLOAT64(tag)) { + d = -JS_VALUE_GET_FLOAT64(op1); + neg_fp_res: + sp[-1] = js_float64(d); + } else { + sf->cur_pc = pc; + if (js_unary_arith_slow(ctx, sp, opcode)) + goto exception; + } + } + BREAK; + CASE(OP_inc): + { + JSValue op1; + int val; + op1 = sp[-1]; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) { + val = JS_VALUE_GET_INT(op1); + if (unlikely(val == INT32_MAX)) + goto inc_slow; + sp[-1] = js_int32(val + 1); + } else { + inc_slow: + sf->cur_pc = pc; + if (js_unary_arith_slow(ctx, sp, opcode)) + goto exception; + } + } + BREAK; + CASE(OP_dec): + { + JSValue op1; + int val; + op1 = sp[-1]; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) { + val = JS_VALUE_GET_INT(op1); + if (unlikely(val == INT32_MIN)) + goto dec_slow; + sp[-1] = js_int32(val - 1); + } else { + dec_slow: + sf->cur_pc = pc; + if (js_unary_arith_slow(ctx, sp, opcode)) + goto exception; + } + } + BREAK; + CASE(OP_post_inc): + CASE(OP_post_dec): + sf->cur_pc = pc; + if (js_post_inc_slow(ctx, sp, opcode)) + goto exception; + sp++; + BREAK; + CASE(OP_inc_loc): + { + JSValue op1; + int val; + int idx; + idx = *pc; + pc += 1; + + op1 = var_buf[idx]; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) { + val = JS_VALUE_GET_INT(op1); + if (unlikely(val == INT32_MAX)) + goto inc_loc_slow; + var_buf[idx] = js_int32(val + 1); + } else { + inc_loc_slow: + sf->cur_pc = pc; + /* must duplicate otherwise the variable value may + be destroyed before JS code accesses it */ + op1 = js_dup(op1); + if (js_unary_arith_slow(ctx, &op1 + 1, OP_inc)) + goto exception; + set_value(ctx, &var_buf[idx], op1); + } + } + BREAK; + CASE(OP_dec_loc): + { + JSValue op1; + int val; + int idx; + idx = *pc; + pc += 1; + + op1 = var_buf[idx]; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) { + val = JS_VALUE_GET_INT(op1); + if (unlikely(val == INT32_MIN)) + goto dec_loc_slow; + var_buf[idx] = js_int32(val - 1); + } else { + dec_loc_slow: + sf->cur_pc = pc; + /* must duplicate otherwise the variable value may + be destroyed before JS code accesses it */ + op1 = js_dup(op1); + if (js_unary_arith_slow(ctx, &op1 + 1, OP_dec)) + goto exception; + set_value(ctx, &var_buf[idx], op1); + } + } + BREAK; + CASE(OP_not): + { + JSValue op1; + op1 = sp[-1]; + if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) { + sp[-1] = js_int32(~JS_VALUE_GET_INT(op1)); + } else { + sf->cur_pc = pc; + if (js_not_slow(ctx, sp)) + goto exception; + } + } + BREAK; + + CASE(OP_shl): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + uint32_t v1, v2; + v1 = JS_VALUE_GET_INT(op1); + v2 = JS_VALUE_GET_INT(op2) & 0x1f; + sp[-2] = js_int32(v1 << v2); + sp--; + } else { + sf->cur_pc = pc; + if (js_binary_logic_slow(ctx, sp, opcode)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_shr): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + uint32_t v2; + v2 = JS_VALUE_GET_INT(op2); + v2 &= 0x1f; + sp[-2] = js_uint32((uint32_t)JS_VALUE_GET_INT(op1) >> v2); + sp--; + } else { + sf->cur_pc = pc; + if (js_shr_slow(ctx, sp)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_sar): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + uint32_t v2; + v2 = JS_VALUE_GET_INT(op2); + if (unlikely(v2 > 0x1f)) { + v2 &= 0x1f; + } + sp[-2] = js_int32((int)JS_VALUE_GET_INT(op1) >> v2); + sp--; + } else { + sf->cur_pc = pc; + if (js_binary_logic_slow(ctx, sp, opcode)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_and): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + sp[-2] = js_int32(JS_VALUE_GET_INT(op1) & JS_VALUE_GET_INT(op2)); + sp--; + } else { + sf->cur_pc = pc; + if (js_binary_logic_slow(ctx, sp, opcode)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_or): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + sp[-2] = js_int32(JS_VALUE_GET_INT(op1) | JS_VALUE_GET_INT(op2)); + sp--; + } else { + sf->cur_pc = pc; + if (js_binary_logic_slow(ctx, sp, opcode)) + goto exception; + sp--; + } + } + BREAK; + CASE(OP_xor): + { + JSValue op1, op2; + op1 = sp[-2]; + op2 = sp[-1]; + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { + sp[-2] = js_int32(JS_VALUE_GET_INT(op1) ^ JS_VALUE_GET_INT(op2)); + sp--; + } else { + sf->cur_pc = pc; + if (js_binary_logic_slow(ctx, sp, opcode)) + goto exception; + sp--; + } + } + BREAK; + + +#define OP_CMP(opcode, binary_op, slow_call) \ + CASE(opcode): \ + { \ + JSValue op1, op2; \ + op1 = sp[-2]; \ + op2 = sp[-1]; \ + if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) { \ + sp[-2] = js_bool(JS_VALUE_GET_INT(op1) binary_op JS_VALUE_GET_INT(op2)); \ + sp--; \ + } else { \ + sf->cur_pc = pc; \ + if (slow_call) \ + goto exception; \ + sp--; \ + } \ + } \ + BREAK + + OP_CMP(OP_lt, <, js_relational_slow(ctx, sp, opcode)); + OP_CMP(OP_lte, <=, js_relational_slow(ctx, sp, opcode)); + OP_CMP(OP_gt, >, js_relational_slow(ctx, sp, opcode)); + OP_CMP(OP_gte, >=, js_relational_slow(ctx, sp, opcode)); + OP_CMP(OP_eq, ==, js_eq_slow(ctx, sp, 0)); + OP_CMP(OP_neq, !=, js_eq_slow(ctx, sp, 1)); + OP_CMP(OP_strict_eq, ==, js_strict_eq_slow(ctx, sp, 0)); + OP_CMP(OP_strict_neq, !=, js_strict_eq_slow(ctx, sp, 1)); + + CASE(OP_in): + sf->cur_pc = pc; + if (js_operator_in(ctx, sp)) + goto exception; + sp--; + BREAK; + CASE(OP_private_in): + if (js_operator_private_in(ctx, sp)) + goto exception; + sp--; + BREAK; + CASE(OP_instanceof): + sf->cur_pc = pc; + if (js_operator_instanceof(ctx, sp)) + goto exception; + sp--; + BREAK; + CASE(OP_typeof): + { + JSValue op1; + JSAtom atom; + + op1 = sp[-1]; + atom = js_operator_typeof(ctx, op1); + JS_FreeValue(ctx, op1); + sp[-1] = JS_AtomToString(ctx, atom); + } + BREAK; + CASE(OP_delete): + sf->cur_pc = pc; + if (js_operator_delete(ctx, sp)) + goto exception; + sp--; + BREAK; + CASE(OP_delete_var): + { + JSAtom atom; + int ret; + + atom = get_u32(pc); + pc += 4; + + sf->cur_pc = pc; + ret = JS_DeleteGlobalVar(ctx, atom); + if (unlikely(ret < 0)) + goto exception; + *sp++ = js_bool(ret); + } + BREAK; + + CASE(OP_to_object): + if (JS_VALUE_GET_TAG(sp[-1]) != JS_TAG_OBJECT) { + sf->cur_pc = pc; + ret_val = JS_ToObject(ctx, sp[-1]); + if (JS_IsException(ret_val)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = ret_val; + } + BREAK; + + CASE(OP_to_propkey): + switch (JS_VALUE_GET_TAG(sp[-1])) { + case JS_TAG_INT: + case JS_TAG_STRING: + case JS_TAG_SYMBOL: + break; + default: + sf->cur_pc = pc; + ret_val = JS_ToPropertyKey(ctx, sp[-1]); + if (JS_IsException(ret_val)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = ret_val; + break; + } + BREAK; + + CASE(OP_to_propkey2): + /* must be tested first */ + if (unlikely(JS_IsUndefined(sp[-2]) || JS_IsNull(sp[-2]))) { + JS_ThrowTypeError(ctx, "value has no property"); + goto exception; + } + switch (JS_VALUE_GET_TAG(sp[-1])) { + case JS_TAG_INT: + case JS_TAG_STRING: + case JS_TAG_SYMBOL: + break; + default: + sf->cur_pc = pc; + ret_val = JS_ToPropertyKey(ctx, sp[-1]); + if (JS_IsException(ret_val)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = ret_val; + break; + } + BREAK; + CASE(OP_with_get_var): + CASE(OP_with_put_var): + CASE(OP_with_delete_var): + CASE(OP_with_make_ref): + CASE(OP_with_get_ref): + CASE(OP_with_get_ref_undef): + { + JSAtom atom; + int32_t diff; + JSValue obj, val; + int ret, is_with; + atom = get_u32(pc); + diff = get_u32(pc + 4); + is_with = pc[8]; + pc += 9; + sf->cur_pc = pc; + + obj = sp[-1]; + ret = JS_HasProperty(ctx, obj, atom); + if (unlikely(ret < 0)) + goto exception; + if (ret) { + if (is_with) { + ret = js_has_unscopable(ctx, obj, atom); + if (unlikely(ret < 0)) + goto exception; + if (ret) + goto no_with; + } + switch (opcode) { + case OP_with_get_var: + val = JS_GetProperty(ctx, obj, atom); + if (unlikely(JS_IsException(val))) + goto exception; + set_value(ctx, &sp[-1], val); + break; + case OP_with_put_var: + /* XXX: check if strict mode */ + ret = JS_SetPropertyInternal(ctx, obj, atom, sp[-2], + JS_PROP_THROW_STRICT); + JS_FreeValue(ctx, sp[-1]); + sp -= 2; + if (unlikely(ret < 0)) + goto exception; + break; + case OP_with_delete_var: + ret = JS_DeleteProperty(ctx, obj, atom, 0); + if (unlikely(ret < 0)) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = js_bool(ret); + break; + case OP_with_make_ref: + /* produce a pair object/propname on the stack */ + *sp++ = JS_AtomToValue(ctx, atom); + break; + case OP_with_get_ref: + /* produce a pair object/method on the stack */ + val = JS_GetProperty(ctx, obj, atom); + if (unlikely(JS_IsException(val))) + goto exception; + *sp++ = val; + break; + case OP_with_get_ref_undef: + /* produce a pair undefined/function on the stack */ + val = JS_GetProperty(ctx, obj, atom); + if (unlikely(JS_IsException(val))) + goto exception; + JS_FreeValue(ctx, sp[-1]); + sp[-1] = JS_UNDEFINED; + *sp++ = val; + break; + } + pc += diff - 5; + } else { + no_with: + /* if not jumping, drop the object argument */ + JS_FreeValue(ctx, sp[-1]); + sp--; + } + } + BREAK; + + CASE(OP_await): + ret_val = js_int32(FUNC_RET_AWAIT); + goto done_generator; + CASE(OP_yield): + ret_val = js_int32(FUNC_RET_YIELD); + goto done_generator; + CASE(OP_yield_star): + CASE(OP_async_yield_star): + ret_val = js_int32(FUNC_RET_YIELD_STAR); + goto done_generator; + CASE(OP_return_async): + CASE(OP_initial_yield): + ret_val = JS_UNDEFINED; + goto done_generator; + + CASE(OP_nop): + BREAK; + CASE(OP_is_undefined_or_null): + if (JS_VALUE_GET_TAG(sp[-1]) == JS_TAG_UNDEFINED || + JS_VALUE_GET_TAG(sp[-1]) == JS_TAG_NULL) { + goto set_true; + } else { + goto free_and_set_false; + } + CASE(OP_is_undefined): + if (JS_VALUE_GET_TAG(sp[-1]) == JS_TAG_UNDEFINED) { + goto set_true; + } else { + goto free_and_set_false; + } + CASE(OP_is_null): + if (JS_VALUE_GET_TAG(sp[-1]) == JS_TAG_NULL) { + goto set_true; + } else { + goto free_and_set_false; + } + /* XXX: could merge to a single opcode */ + CASE(OP_typeof_is_undefined): + /* different from OP_is_undefined because of isHTMLDDA */ + if (js_operator_typeof(ctx, sp[-1]) == JS_ATOM_undefined) { + goto free_and_set_true; + } else { + goto free_and_set_false; + } + CASE(OP_typeof_is_function): + if (js_operator_typeof(ctx, sp[-1]) == JS_ATOM_function) { + goto free_and_set_true; + } else { + goto free_and_set_false; + } + free_and_set_true: + JS_FreeValue(ctx, sp[-1]); + set_true: + sp[-1] = JS_TRUE; + BREAK; + free_and_set_false: + JS_FreeValue(ctx, sp[-1]); + sp[-1] = JS_FALSE; + BREAK; + CASE(OP_invalid): + DEFAULT: + JS_ThrowInternalError(ctx, "invalid opcode: pc=%u opcode=0x%02x", + (int)(pc - b->byte_code_buf - 1), opcode); + goto exception; + } + } + exception: + if (needs_backtrace(rt->current_exception) + || JS_IsUndefined(ctx->error_back_trace)) { + sf->cur_pc = pc; + build_backtrace(ctx, rt->current_exception, JS_UNDEFINED, + NULL, 0, 0, 0); + } + if (!JS_IsUncatchableError(rt->current_exception)) { + while (sp > stack_buf) { + JSValue val = *--sp; + JS_FreeValue(ctx, val); + if (JS_VALUE_GET_TAG(val) == JS_TAG_CATCH_OFFSET) { + int pos = JS_VALUE_GET_INT(val); + if (pos == 0) { + /* enumerator: close it with a throw */ + JS_FreeValue(ctx, sp[-1]); /* drop the next method */ + sp--; + JS_IteratorClose(ctx, sp[-1], true); + } else { + *sp++ = rt->current_exception; + rt->current_exception = JS_UNINITIALIZED; + JS_FreeValueRT(rt, ctx->error_back_trace); + ctx->error_back_trace = JS_UNDEFINED; + pc = b->byte_code_buf + pos; + goto restart; + } + } + } + } + ret_val = JS_EXCEPTION; + /* the local variables are freed by the caller in the generator + case. Hence the label 'done' should never be reached in a + generator function. */ + if (b->func_kind != JS_FUNC_NORMAL) { + done_generator: + sf->cur_pc = pc; + sf->cur_sp = sp; + } else { + done: + if (unlikely(sf->var_ref_count != 0)) { + /* variable references reference the stack: must close them */ + close_var_refs(rt, sf); + } + /* free the local variables and stack */ + for(pval = local_buf; pval < sp; pval++) { + JS_FreeValue(ctx, *pval); + } + } + rt->current_stack_frame = sf->prev_frame; + return ret_val; +} + +JSValue JS_Call(JSContext *ctx, JSValueConst func_obj, JSValueConst this_obj, + int argc, JSValueConst *argv) +{ + return JS_CallInternal(ctx, func_obj, this_obj, JS_UNDEFINED, + argc, argv, JS_CALL_FLAG_COPY_ARGV); +} + +static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValueConst this_obj, + int argc, JSValueConst *argv) +{ + JSValue res = JS_CallInternal(ctx, func_obj, this_obj, JS_UNDEFINED, + argc, argv, JS_CALL_FLAG_COPY_ARGV); + JS_FreeValue(ctx, func_obj); + return res; +} + +/* warning: the refcount of the context is not incremented. Return + NULL in case of exception (case of revoked proxy only) */ +static JSContext *JS_GetFunctionRealm(JSContext *ctx, JSValueConst func_obj) +{ + JSObject *p; + JSContext *realm; + + if (JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT) + return ctx; + p = JS_VALUE_GET_OBJ(func_obj); + switch(p->class_id) { + case JS_CLASS_C_FUNCTION: + realm = p->u.cfunc.realm; + break; + case JS_CLASS_BYTECODE_FUNCTION: + case JS_CLASS_GENERATOR_FUNCTION: + case JS_CLASS_ASYNC_FUNCTION: + case JS_CLASS_ASYNC_GENERATOR_FUNCTION: + { + JSFunctionBytecode *b; + b = p->u.func.function_bytecode; + realm = b->realm; + } + break; + case JS_CLASS_PROXY: + { + JSProxyData *s = p->u.opaque; + if (!s) + return ctx; + if (s->is_revoked) { + JS_ThrowTypeErrorRevokedProxy(ctx); + return NULL; + } else { + realm = JS_GetFunctionRealm(ctx, s->target); + } + } + break; + case JS_CLASS_BOUND_FUNCTION: + { + JSBoundFunction *bf = p->u.bound_function; + realm = JS_GetFunctionRealm(ctx, bf->func_obj); + } + break; + default: + realm = ctx; + break; + } + return realm; +} + +static JSValue js_create_from_ctor(JSContext *ctx, JSValueConst ctor, + int class_id) +{ + JSValue proto, obj; + JSContext *realm; + + if (JS_IsUndefined(ctor)) { + proto = js_dup(ctx->class_proto[class_id]); + } else { + proto = JS_GetProperty(ctx, ctor, JS_ATOM_prototype); + if (JS_IsException(proto)) + return proto; + if (!JS_IsObject(proto)) { + JS_FreeValue(ctx, proto); + realm = JS_GetFunctionRealm(ctx, ctor); + if (!realm) + return JS_EXCEPTION; + proto = js_dup(realm->class_proto[class_id]); + } + } + obj = JS_NewObjectProtoClass(ctx, proto, class_id); + JS_FreeValue(ctx, proto); + return obj; +} + +/* argv[] is modified if (flags & JS_CALL_FLAG_COPY_ARGV) = 0. */ +static JSValue JS_CallConstructorInternal(JSContext *ctx, + JSValueConst func_obj, + JSValueConst new_target, + int argc, JSValueConst *argv, + int flags) +{ + JSObject *p; + JSFunctionBytecode *b; + + if (js_poll_interrupts(ctx)) + return JS_EXCEPTION; + flags |= JS_CALL_FLAG_CONSTRUCTOR; + if (unlikely(JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT)) + goto not_a_function; + p = JS_VALUE_GET_OBJ(func_obj); + if (unlikely(!p->is_constructor)) + return JS_ThrowTypeErrorNotAConstructor(ctx, func_obj); + if (unlikely(p->class_id != JS_CLASS_BYTECODE_FUNCTION)) { + JSClassCall *call_func; + call_func = ctx->rt->class_array[p->class_id].call; + if (!call_func) { + not_a_function: + return JS_ThrowTypeErrorNotAFunction(ctx); + } + return call_func(ctx, func_obj, new_target, argc, + argv, flags); + } + + b = p->u.func.function_bytecode; + if (b->is_derived_class_constructor) { + return JS_CallInternal(ctx, func_obj, JS_UNDEFINED, new_target, argc, argv, flags); + } else { + JSValue obj, ret; + /* legacy constructor behavior */ + obj = js_create_from_ctor(ctx, new_target, JS_CLASS_OBJECT); + if (JS_IsException(obj)) + return JS_EXCEPTION; + ret = JS_CallInternal(ctx, func_obj, obj, new_target, argc, argv, flags); + if (JS_VALUE_GET_TAG(ret) == JS_TAG_OBJECT || + JS_IsException(ret)) { + JS_FreeValue(ctx, obj); + return ret; + } else { + JS_FreeValue(ctx, ret); + return obj; + } + } +} + +JSValue JS_CallConstructor2(JSContext *ctx, JSValueConst func_obj, + JSValueConst new_target, + int argc, JSValueConst *argv) +{ + return JS_CallConstructorInternal(ctx, func_obj, new_target, + argc, argv, + JS_CALL_FLAG_COPY_ARGV); +} + +JSValue JS_CallConstructor(JSContext *ctx, JSValueConst func_obj, + int argc, JSValueConst *argv) +{ + return JS_CallConstructorInternal(ctx, func_obj, func_obj, + argc, argv, + JS_CALL_FLAG_COPY_ARGV); +} + +JSValue JS_Invoke(JSContext *ctx, JSValueConst this_val, JSAtom atom, + int argc, JSValueConst *argv) +{ + JSValue func_obj; + func_obj = JS_GetProperty(ctx, this_val, atom); + if (JS_IsException(func_obj)) + return func_obj; + return JS_CallFree(ctx, func_obj, this_val, argc, argv); +} + +static JSValue JS_InvokeFree(JSContext *ctx, JSValue this_val, JSAtom atom, + int argc, JSValueConst *argv) +{ + JSValue res = JS_Invoke(ctx, this_val, atom, argc, argv); + JS_FreeValue(ctx, this_val); + return res; +} + +/* JSAsyncFunctionState (used by generator and async functions) */ +static __exception int async_func_init(JSContext *ctx, JSAsyncFunctionState *s, + JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv) +{ + JSObject *p; + JSFunctionBytecode *b; + JSStackFrame *sf; + int local_count, i, arg_buf_len, n; + size_t alloc_size; + + sf = &s->frame; + p = JS_VALUE_GET_OBJ(func_obj); + b = p->u.func.function_bytecode; + sf->is_strict_mode = b->is_strict_mode; + sf->cur_pc = b->byte_code_buf; + arg_buf_len = max_int(b->arg_count, argc); + local_count = arg_buf_len + b->var_count + b->stack_size; + alloc_size = sizeof(JSValue) * max_int(local_count, 1) + + sizeof(JSVarRef *) * b->var_ref_count; + sf->arg_buf = js_malloc(ctx, alloc_size); + if (!sf->arg_buf) + return -1; + sf->cur_func = js_dup(func_obj); + s->this_val = js_dup(this_obj); + s->argc = argc; + sf->arg_count = arg_buf_len; + sf->var_buf = sf->arg_buf + arg_buf_len; + sf->cur_sp = sf->var_buf + b->var_count; + sf->var_refs = (JSVarRef **)(sf->cur_sp + b->stack_size); + sf->var_ref_count = b->var_ref_count; + for(i = 0; i < b->var_ref_count; i++) + sf->var_refs[i] = NULL; + for(i = 0; i < argc; i++) + sf->arg_buf[i] = js_dup(argv[i]); + n = arg_buf_len + b->var_count; + for(i = argc; i < n; i++) + sf->arg_buf[i] = JS_UNDEFINED; + return 0; +} + +static void async_func_mark(JSRuntime *rt, JSAsyncFunctionState *s, + JS_MarkFunc *mark_func) +{ + JSStackFrame *sf; + JSValue *sp; + + sf = &s->frame; + JS_MarkValue(rt, sf->cur_func, mark_func); + JS_MarkValue(rt, s->this_val, mark_func); + if (sf->cur_sp) { + /* if the function is running, cur_sp is not known so we + cannot mark the stack. Marking the variables is not needed + because a running function cannot be part of a removable + cycle */ + for(sp = sf->arg_buf; sp < sf->cur_sp; sp++) + JS_MarkValue(rt, *sp, mark_func); + } +} + +static void async_func_free(JSRuntime *rt, JSAsyncFunctionState *s) +{ + JSStackFrame *sf; + JSValue *sp; + + sf = &s->frame; + + if (sf->arg_buf) { + /* close the closure variables. */ + if (sf->var_ref_count != 0) + close_var_refs(rt, sf); + + /* cannot free the function if it is running */ + assert(sf->cur_sp != NULL); + for(sp = sf->arg_buf; sp < sf->cur_sp; sp++) { + JS_FreeValueRT(rt, *sp); + } + js_free_rt(rt, sf->arg_buf); + } + JS_FreeValueRT(rt, sf->cur_func); + JS_FreeValueRT(rt, s->this_val); +} + +static JSValue async_func_resume(JSContext *ctx, JSAsyncFunctionState *s) +{ + JSValue func_obj; + + if (js_check_stack_overflow(ctx->rt, 0)) + return JS_ThrowStackOverflow(ctx); + + /* the tag does not matter provided it is not an object */ + func_obj = JS_MKPTR(JS_TAG_INT, s); + return JS_CallInternal(ctx, func_obj, s->this_val, JS_UNDEFINED, + s->argc, vc(s->frame.arg_buf), + JS_CALL_FLAG_GENERATOR); +} + + +/* Generators */ + +typedef enum JSGeneratorStateEnum { + JS_GENERATOR_STATE_SUSPENDED_START, + JS_GENERATOR_STATE_SUSPENDED_YIELD, + JS_GENERATOR_STATE_SUSPENDED_YIELD_STAR, + JS_GENERATOR_STATE_EXECUTING, + JS_GENERATOR_STATE_COMPLETED, +} JSGeneratorStateEnum; + +typedef struct JSGeneratorData { + JSGeneratorStateEnum state; + JSAsyncFunctionState func_state; +} JSGeneratorData; + +static void free_generator_stack_rt(JSRuntime *rt, JSGeneratorData *s) +{ + if (s->state == JS_GENERATOR_STATE_COMPLETED) + return; + async_func_free(rt, &s->func_state); + s->state = JS_GENERATOR_STATE_COMPLETED; +} + +static void js_generator_finalizer(JSRuntime *rt, JSValueConst obj) +{ + JSGeneratorData *s = JS_GetOpaque(obj, JS_CLASS_GENERATOR); + + if (s) { + free_generator_stack_rt(rt, s); + js_free_rt(rt, s); + } +} + +static void free_generator_stack(JSContext *ctx, JSGeneratorData *s) +{ + free_generator_stack_rt(ctx->rt, s); +} + +static void js_generator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSGeneratorData *s = p->u.generator_data; + + if (!s || s->state == JS_GENERATOR_STATE_COMPLETED) + return; + async_func_mark(rt, &s->func_state, mark_func); +} + +/* XXX: use enum */ +#define GEN_MAGIC_NEXT 0 +#define GEN_MAGIC_RETURN 1 +#define GEN_MAGIC_THROW 2 + +static JSValue js_generator_next(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, + int *pdone, int magic) +{ + JSGeneratorData *s = JS_GetOpaque(this_val, JS_CLASS_GENERATOR); + JSStackFrame *sf; + JSValue ret, func_ret; + + *pdone = true; + if (!s) + return JS_ThrowTypeError(ctx, "not a generator"); + sf = &s->func_state.frame; + switch(s->state) { + default: + case JS_GENERATOR_STATE_SUSPENDED_START: + if (magic == GEN_MAGIC_NEXT) { + goto exec_no_arg; + } else { + free_generator_stack(ctx, s); + goto done; + } + break; + case JS_GENERATOR_STATE_SUSPENDED_YIELD_STAR: + case JS_GENERATOR_STATE_SUSPENDED_YIELD: + /* cur_sp[-1] was set to JS_UNDEFINED in the previous call */ + ret = js_dup(argv[0]); + if (magic == GEN_MAGIC_THROW && + s->state == JS_GENERATOR_STATE_SUSPENDED_YIELD) { + JS_Throw(ctx, ret); + s->func_state.throw_flag = true; + } else { + sf->cur_sp[-1] = ret; + sf->cur_sp[0] = js_int32(magic); + sf->cur_sp++; + exec_no_arg: + s->func_state.throw_flag = false; + } + s->state = JS_GENERATOR_STATE_EXECUTING; + func_ret = async_func_resume(ctx, &s->func_state); + s->state = JS_GENERATOR_STATE_SUSPENDED_YIELD; + if (JS_IsException(func_ret)) { + /* finalize the execution in case of exception */ + free_generator_stack(ctx, s); + return func_ret; + } + if (JS_VALUE_GET_TAG(func_ret) == JS_TAG_INT) { + /* get the returned yield value at the top of the stack */ + ret = sf->cur_sp[-1]; + sf->cur_sp[-1] = JS_UNDEFINED; + if (JS_VALUE_GET_INT(func_ret) == FUNC_RET_YIELD_STAR) { + s->state = JS_GENERATOR_STATE_SUSPENDED_YIELD_STAR; + /* return (value, done) object */ + *pdone = 2; + } else { + *pdone = false; + } + } else { + /* end of iterator */ + ret = sf->cur_sp[-1]; + sf->cur_sp[-1] = JS_UNDEFINED; + JS_FreeValue(ctx, func_ret); + free_generator_stack(ctx, s); + } + break; + case JS_GENERATOR_STATE_COMPLETED: + done: + /* execution is finished */ + switch(magic) { + default: + case GEN_MAGIC_NEXT: + ret = JS_UNDEFINED; + break; + case GEN_MAGIC_RETURN: + ret = js_dup(argv[0]); + break; + case GEN_MAGIC_THROW: + ret = JS_Throw(ctx, js_dup(argv[0])); + break; + } + break; + case JS_GENERATOR_STATE_EXECUTING: + ret = JS_ThrowTypeError(ctx, "cannot invoke a running generator"); + break; + } + return ret; +} + +static JSValue js_call_generator_function(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int flags) +{ + JSValue obj, func_ret; + JSGeneratorData *s; + + s = js_mallocz(ctx, sizeof(*s)); + if (!s) + return JS_EXCEPTION; + s->state = JS_GENERATOR_STATE_SUSPENDED_START; + if (async_func_init(ctx, &s->func_state, func_obj, this_obj, argc, argv)) { + s->state = JS_GENERATOR_STATE_COMPLETED; + goto fail; + } + + /* execute the function up to 'OP_initial_yield' */ + func_ret = async_func_resume(ctx, &s->func_state); + if (JS_IsException(func_ret)) + goto fail; + JS_FreeValue(ctx, func_ret); + + obj = js_create_from_ctor(ctx, func_obj, JS_CLASS_GENERATOR); + if (JS_IsException(obj)) + goto fail; + JS_SetOpaqueInternal(obj, s); + return obj; + fail: + free_generator_stack_rt(ctx->rt, s); + js_free(ctx, s); + return JS_EXCEPTION; +} + +/* AsyncFunction */ + +static void js_async_function_terminate(JSRuntime *rt, JSAsyncFunctionData *s) +{ + if (s->is_active) { + async_func_free(rt, &s->func_state); + s->is_active = false; + } +} + +static void js_async_function_free0(JSRuntime *rt, JSAsyncFunctionData *s) +{ + js_async_function_terminate(rt, s); + JS_FreeValueRT(rt, s->resolving_funcs[0]); + JS_FreeValueRT(rt, s->resolving_funcs[1]); + remove_gc_object(&s->header); + js_free_rt(rt, s); +} + +static void js_async_function_free(JSRuntime *rt, JSAsyncFunctionData *s) +{ + if (--s->header.ref_count == 0) { + js_async_function_free0(rt, s); + } +} + +static void js_async_function_resolve_finalizer(JSRuntime *rt, + JSValueConst val) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSAsyncFunctionData *s = p->u.async_function_data; + if (s) { + js_async_function_free(rt, s); + } +} + +static void js_async_function_resolve_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSObject *p = JS_VALUE_GET_OBJ(val); + JSAsyncFunctionData *s = p->u.async_function_data; + if (s) { + mark_func(rt, &s->header); + } +} + +static int js_async_function_resolve_create(JSContext *ctx, + JSAsyncFunctionData *s, + JSValue *resolving_funcs) +{ + int i; + JSObject *p; + + for(i = 0; i < 2; i++) { + resolving_funcs[i] = + JS_NewObjectProtoClass(ctx, ctx->function_proto, + JS_CLASS_ASYNC_FUNCTION_RESOLVE + i); + if (JS_IsException(resolving_funcs[i])) { + if (i == 1) + JS_FreeValue(ctx, resolving_funcs[0]); + return -1; + } + p = JS_VALUE_GET_OBJ(resolving_funcs[i]); + s->header.ref_count++; + p->u.async_function_data = s; + } + return 0; +} + +static bool js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s) +{ + bool is_success = true; + JSValue func_ret, ret2; + + func_ret = async_func_resume(ctx, &s->func_state); + if (JS_IsException(func_ret)) { + fail: + if (unlikely(JS_IsUncatchableError(ctx->rt->current_exception))) { + is_success = false; + } else { + JSValue error = JS_GetException(ctx); + ret2 = JS_Call(ctx, s->resolving_funcs[1], JS_UNDEFINED, + 1, vc(&error)); + JS_FreeValue(ctx, error); + resolved: + if (unlikely(JS_IsException(ret2))) { + if (JS_IsUncatchableError(ctx->rt->current_exception)) { + is_success = false; + } else { + abort(); /* BUG */ + } + } + JS_FreeValue(ctx, ret2); + } + js_async_function_terminate(ctx->rt, s); + } else { + JSValue value; + value = s->func_state.frame.cur_sp[-1]; + s->func_state.frame.cur_sp[-1] = JS_UNDEFINED; + if (JS_IsUndefined(func_ret)) { + /* function returned */ + ret2 = JS_Call(ctx, s->resolving_funcs[0], JS_UNDEFINED, + 1, vc(&value)); + JS_FreeValue(ctx, value); + goto resolved; + } else { + JSValue promise, resolving_funcs[2], resolving_funcs1[2]; + int i, res; + + /* await */ + JS_FreeValue(ctx, func_ret); /* not used */ + promise = js_promise_resolve(ctx, ctx->promise_ctor, + 1, vc(&value), 0); + JS_FreeValue(ctx, value); + if (JS_IsException(promise)) + goto fail; + if (js_async_function_resolve_create(ctx, s, resolving_funcs)) { + JS_FreeValue(ctx, promise); + goto fail; + } + + /* Note: no need to create 'thrownawayCapability' as in + the spec */ + for(i = 0; i < 2; i++) + resolving_funcs1[i] = JS_UNDEFINED; + res = perform_promise_then(ctx, promise, + vc(resolving_funcs), + vc(resolving_funcs1)); + JS_FreeValue(ctx, promise); + for(i = 0; i < 2; i++) + JS_FreeValue(ctx, resolving_funcs[i]); + if (res) + goto fail; + } + } + return is_success; +} + +static JSValue js_async_function_resolve_call(JSContext *ctx, + JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int flags) +{ + JSObject *p = JS_VALUE_GET_OBJ(func_obj); + JSAsyncFunctionData *s = p->u.async_function_data; + bool is_reject = p->class_id - JS_CLASS_ASYNC_FUNCTION_RESOLVE; + JSValueConst arg; + + if (argc > 0) + arg = argv[0]; + else + arg = JS_UNDEFINED; + s->func_state.throw_flag = is_reject; + if (is_reject) { + JS_Throw(ctx, js_dup(arg)); + } else { + /* return value of await */ + s->func_state.frame.cur_sp[-1] = js_dup(arg); + } + if (!js_async_function_resume(ctx, s)) + return JS_EXCEPTION; + return JS_UNDEFINED; +} + +static JSValue js_async_function_call(JSContext *ctx, JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, int flags) +{ + JSValue promise; + JSAsyncFunctionData *s; + + s = js_mallocz(ctx, sizeof(*s)); + if (!s) + return JS_EXCEPTION; + s->header.ref_count = 1; + add_gc_object(ctx->rt, &s->header, JS_GC_OBJ_TYPE_ASYNC_FUNCTION); + s->is_active = false; + s->resolving_funcs[0] = JS_UNDEFINED; + s->resolving_funcs[1] = JS_UNDEFINED; + + promise = JS_NewPromiseCapability(ctx, s->resolving_funcs); + if (JS_IsException(promise)) + goto fail; + + if (async_func_init(ctx, &s->func_state, func_obj, this_obj, argc, argv)) { + fail: + JS_FreeValue(ctx, promise); + js_async_function_free(ctx->rt, s); + return JS_EXCEPTION; + } + s->is_active = true; + + if (!js_async_function_resume(ctx, s)) + goto fail; + + js_async_function_free(ctx->rt, s); + + return promise; +} + +/* AsyncGenerator */ + +typedef enum JSAsyncGeneratorStateEnum { + JS_ASYNC_GENERATOR_STATE_SUSPENDED_START, + JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD, + JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD_STAR, + JS_ASYNC_GENERATOR_STATE_EXECUTING, + JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN, + JS_ASYNC_GENERATOR_STATE_COMPLETED, +} JSAsyncGeneratorStateEnum; + +typedef struct JSAsyncGeneratorRequest { + struct list_head link; + /* completion */ + int completion_type; /* GEN_MAGIC_x */ + JSValue result; + /* promise capability */ + JSValue promise; + JSValue resolving_funcs[2]; +} JSAsyncGeneratorRequest; + +typedef struct JSAsyncGeneratorData { + JSObject *generator; /* back pointer to the object (const) */ + JSAsyncGeneratorStateEnum state; + JSAsyncFunctionState func_state; + struct list_head queue; /* list of JSAsyncGeneratorRequest.link */ +} JSAsyncGeneratorData; + +static void js_async_generator_free(JSRuntime *rt, + JSAsyncGeneratorData *s) +{ + struct list_head *el, *el1; + JSAsyncGeneratorRequest *req; + + list_for_each_safe(el, el1, &s->queue) { + req = list_entry(el, JSAsyncGeneratorRequest, link); + JS_FreeValueRT(rt, req->result); + JS_FreeValueRT(rt, req->promise); + JS_FreeValueRT(rt, req->resolving_funcs[0]); + JS_FreeValueRT(rt, req->resolving_funcs[1]); + js_free_rt(rt, req); + } + if (s->state != JS_ASYNC_GENERATOR_STATE_COMPLETED && + s->state != JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN) { + async_func_free(rt, &s->func_state); + } + js_free_rt(rt, s); +} + +static void js_async_generator_finalizer(JSRuntime *rt, JSValueConst obj) +{ + JSAsyncGeneratorData *s = JS_GetOpaque(obj, JS_CLASS_ASYNC_GENERATOR); + + if (s) { + js_async_generator_free(rt, s); + } +} + +static void js_async_generator_mark(JSRuntime *rt, JSValueConst val, + JS_MarkFunc *mark_func) +{ + JSAsyncGeneratorData *s = JS_GetOpaque(val, JS_CLASS_ASYNC_GENERATOR); + struct list_head *el; + JSAsyncGeneratorRequest *req; + if (s) { + list_for_each(el, &s->queue) { + req = list_entry(el, JSAsyncGeneratorRequest, link); + JS_MarkValue(rt, req->result, mark_func); + JS_MarkValue(rt, req->promise, mark_func); + JS_MarkValue(rt, req->resolving_funcs[0], mark_func); + JS_MarkValue(rt, req->resolving_funcs[1], mark_func); + } + if (s->state != JS_ASYNC_GENERATOR_STATE_COMPLETED && + s->state != JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN) { + async_func_mark(rt, &s->func_state, mark_func); + } + } +} + +static JSValue js_async_generator_resolve_function(JSContext *ctx, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int magic, JSValueConst *func_data); + +static int js_async_generator_resolve_function_create(JSContext *ctx, + JSValue generator, + JSValue *resolving_funcs, + bool is_resume_next) +{ + int i; + JSValue func; + + for(i = 0; i < 2; i++) { + func = JS_NewCFunctionData(ctx, js_async_generator_resolve_function, 1, + i + is_resume_next * 2, 1, vc(&generator)); + if (JS_IsException(func)) { + if (i == 1) + JS_FreeValue(ctx, resolving_funcs[0]); + return -1; + } + resolving_funcs[i] = func; + } + return 0; +} + +static int js_async_generator_await(JSContext *ctx, + JSAsyncGeneratorData *s, + JSValue value) +{ + JSValue promise, resolving_funcs[2], resolving_funcs1[2]; + int i, res; + + promise = js_promise_resolve(ctx, ctx->promise_ctor, + 1, vc(&value), 0); + if (JS_IsException(promise)) + goto fail; + + if (js_async_generator_resolve_function_create(ctx, JS_MKPTR(JS_TAG_OBJECT, s->generator), + resolving_funcs, false)) { + JS_FreeValue(ctx, promise); + goto fail; + } + + /* Note: no need to create 'thrownawayCapability' as in + the spec */ + for(i = 0; i < 2; i++) + resolving_funcs1[i] = JS_UNDEFINED; + res = perform_promise_then(ctx, promise, + vc(resolving_funcs), + vc(resolving_funcs1)); + JS_FreeValue(ctx, promise); + for(i = 0; i < 2; i++) + JS_FreeValue(ctx, resolving_funcs[i]); + if (res) + goto fail; + return 0; + fail: + return -1; +} + +static void js_async_generator_resolve_or_reject(JSContext *ctx, + JSAsyncGeneratorData *s, + JSValueConst result, + int is_reject) +{ + JSAsyncGeneratorRequest *next; + JSValue ret; + + next = list_entry(s->queue.next, JSAsyncGeneratorRequest, link); + list_del(&next->link); + ret = JS_Call(ctx, next->resolving_funcs[is_reject], JS_UNDEFINED, 1, + &result); + JS_FreeValue(ctx, ret); + JS_FreeValue(ctx, next->result); + JS_FreeValue(ctx, next->promise); + JS_FreeValue(ctx, next->resolving_funcs[0]); + JS_FreeValue(ctx, next->resolving_funcs[1]); + js_free(ctx, next); +} + +static void js_async_generator_resolve(JSContext *ctx, + JSAsyncGeneratorData *s, + JSValueConst value, + bool done) +{ + JSValue result; + result = js_create_iterator_result(ctx, js_dup(value), done); + /* XXX: better exception handling ? */ + js_async_generator_resolve_or_reject(ctx, s, result, 0); + JS_FreeValue(ctx, result); + } + +static void js_async_generator_reject(JSContext *ctx, + JSAsyncGeneratorData *s, + JSValueConst exception) +{ + js_async_generator_resolve_or_reject(ctx, s, exception, 1); +} + +static void js_async_generator_complete(JSContext *ctx, + JSAsyncGeneratorData *s) +{ + if (s->state != JS_ASYNC_GENERATOR_STATE_COMPLETED) { + s->state = JS_ASYNC_GENERATOR_STATE_COMPLETED; + async_func_free(ctx->rt, &s->func_state); + } +} + +static int js_async_generator_completed_return(JSContext *ctx, + JSAsyncGeneratorData *s, + JSValue value) +{ + JSValue promise, resolving_funcs[2], resolving_funcs1[2]; + int res; + + // Can fail looking up JS_ATOM_constructor when is_reject==0. + promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, vc(&value), + /*is_reject*/0); + // A poisoned .constructor property is observable and the resulting + // exception should be delivered to the catch handler. + if (JS_IsException(promise)) { + JSValue err = JS_GetException(ctx); + promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, vc(&err), + /*is_reject*/1); + JS_FreeValue(ctx, err); + if (JS_IsException(promise)) + return -1; + } + if (js_async_generator_resolve_function_create(ctx, + JS_MKPTR(JS_TAG_OBJECT, s->generator), + resolving_funcs1, + true)) { + JS_FreeValue(ctx, promise); + return -1; + } + resolving_funcs[0] = JS_UNDEFINED; + resolving_funcs[1] = JS_UNDEFINED; + res = perform_promise_then(ctx, promise, + vc(resolving_funcs1), + vc(resolving_funcs)); + JS_FreeValue(ctx, resolving_funcs1[0]); + JS_FreeValue(ctx, resolving_funcs1[1]); + JS_FreeValue(ctx, promise); + return res; +} + +static void js_async_generator_resume_next(JSContext *ctx, + JSAsyncGeneratorData *s) +{ + JSAsyncGeneratorRequest *next; + JSValue func_ret, value; + + for(;;) { + if (list_empty(&s->queue)) + break; + next = list_entry(s->queue.next, JSAsyncGeneratorRequest, link); + switch(s->state) { + case JS_ASYNC_GENERATOR_STATE_EXECUTING: + /* only happens when restarting execution after await() */ + goto resume_exec; + case JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN: + goto done; + case JS_ASYNC_GENERATOR_STATE_SUSPENDED_START: + if (next->completion_type == GEN_MAGIC_NEXT) { + goto exec_no_arg; + } else { + js_async_generator_complete(ctx, s); + } + break; + case JS_ASYNC_GENERATOR_STATE_COMPLETED: + if (next->completion_type == GEN_MAGIC_NEXT) { + js_async_generator_resolve(ctx, s, JS_UNDEFINED, true); + } else if (next->completion_type == GEN_MAGIC_RETURN) { + s->state = JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN; + js_async_generator_completed_return(ctx, s, next->result); + } else { + js_async_generator_reject(ctx, s, next->result); + } + goto done; + case JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD: + case JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD_STAR: + value = js_dup(next->result); + if (next->completion_type == GEN_MAGIC_THROW && + s->state == JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD) { + JS_Throw(ctx, value); + s->func_state.throw_flag = true; + } else { + /* 'yield' returns a value. 'yield *' also returns a value + in case the 'throw' method is called */ + s->func_state.frame.cur_sp[-1] = value; + s->func_state.frame.cur_sp[0] = + js_int32(next->completion_type); + s->func_state.frame.cur_sp++; + exec_no_arg: + s->func_state.throw_flag = false; + } + s->state = JS_ASYNC_GENERATOR_STATE_EXECUTING; + resume_exec: + func_ret = async_func_resume(ctx, &s->func_state); + if (JS_IsException(func_ret)) { + value = JS_GetException(ctx); + js_async_generator_complete(ctx, s); + js_async_generator_reject(ctx, s, value); + JS_FreeValue(ctx, value); + } else if (JS_VALUE_GET_TAG(func_ret) == JS_TAG_INT) { + int func_ret_code, ret; + value = s->func_state.frame.cur_sp[-1]; + s->func_state.frame.cur_sp[-1] = JS_UNDEFINED; + func_ret_code = JS_VALUE_GET_INT(func_ret); + switch(func_ret_code) { + case FUNC_RET_YIELD: + case FUNC_RET_YIELD_STAR: + if (func_ret_code == FUNC_RET_YIELD_STAR) + s->state = JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD_STAR; + else + s->state = JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD; + js_async_generator_resolve(ctx, s, value, false); + JS_FreeValue(ctx, value); + break; + case FUNC_RET_AWAIT: + ret = js_async_generator_await(ctx, s, value); + JS_FreeValue(ctx, value); + if (ret < 0) { + /* exception: throw it */ + s->func_state.throw_flag = true; + goto resume_exec; + } + goto done; + default: + abort(); + } + } else { + assert(JS_IsUndefined(func_ret)); + /* end of function */ + value = s->func_state.frame.cur_sp[-1]; + s->func_state.frame.cur_sp[-1] = JS_UNDEFINED; + js_async_generator_complete(ctx, s); + js_async_generator_resolve(ctx, s, value, true); + JS_FreeValue(ctx, value); + } + break; + default: + abort(); + } + } + done: ; +} + +static JSValue js_async_generator_resolve_function(JSContext *ctx, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int magic, JSValueConst *func_data) +{ + bool is_reject = magic & 1; + JSAsyncGeneratorData *s = JS_GetOpaque(func_data[0], JS_CLASS_ASYNC_GENERATOR); + JSValueConst arg = argv[0]; + + /* XXX: what if s == NULL */ + + if (magic >= 2) { + /* resume next case in AWAITING_RETURN state */ + assert(s->state == JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN || + s->state == JS_ASYNC_GENERATOR_STATE_COMPLETED); + s->state = JS_ASYNC_GENERATOR_STATE_COMPLETED; + if (is_reject) { + js_async_generator_reject(ctx, s, arg); + } else { + js_async_generator_resolve(ctx, s, arg, true); + } + } else { + /* restart function execution after await() */ + assert(s->state == JS_ASYNC_GENERATOR_STATE_EXECUTING); + s->func_state.throw_flag = is_reject; + if (is_reject) { + JS_Throw(ctx, js_dup(arg)); + } else { + /* return value of await */ + s->func_state.frame.cur_sp[-1] = js_dup(arg); + } + js_async_generator_resume_next(ctx, s); + } + return JS_UNDEFINED; +} + +/* magic = GEN_MAGIC_x */ +static JSValue js_async_generator_next(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv, + int magic) +{ + JSAsyncGeneratorData *s = JS_GetOpaque(this_val, JS_CLASS_ASYNC_GENERATOR); + JSValue promise, resolving_funcs[2]; + JSAsyncGeneratorRequest *req; + + promise = JS_NewPromiseCapability(ctx, resolving_funcs); + if (JS_IsException(promise)) + return JS_EXCEPTION; + if (!s) { + JSValue err, res2; + JS_ThrowTypeError(ctx, "not an AsyncGenerator object"); + err = JS_GetException(ctx); + res2 = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, + 1, vc(&err)); + JS_FreeValue(ctx, err); + JS_FreeValue(ctx, res2); + JS_FreeValue(ctx, resolving_funcs[0]); + JS_FreeValue(ctx, resolving_funcs[1]); + return promise; + } + req = js_mallocz(ctx, sizeof(*req)); + if (!req) + goto fail; + req->completion_type = magic; + req->result = js_dup(argv[0]); + req->promise = js_dup(promise); + req->resolving_funcs[0] = resolving_funcs[0]; + req->resolving_funcs[1] = resolving_funcs[1]; + list_add_tail(&req->link, &s->queue); + if (s->state != JS_ASYNC_GENERATOR_STATE_EXECUTING) { + js_async_generator_resume_next(ctx, s); + } + return promise; + fail: + JS_FreeValue(ctx, resolving_funcs[0]); + JS_FreeValue(ctx, resolving_funcs[1]); + JS_FreeValue(ctx, promise); + return JS_EXCEPTION; +} + +static JSValue js_async_generator_function_call(JSContext *ctx, + JSValueConst func_obj, + JSValueConst this_obj, + int argc, JSValueConst *argv, + int flags) +{ + JSValue obj, func_ret; + JSAsyncGeneratorData *s; + + s = js_mallocz(ctx, sizeof(*s)); + if (!s) + return JS_EXCEPTION; + s->state = JS_ASYNC_GENERATOR_STATE_SUSPENDED_START; + init_list_head(&s->queue); + if (async_func_init(ctx, &s->func_state, func_obj, this_obj, argc, argv)) { + s->state = JS_ASYNC_GENERATOR_STATE_COMPLETED; + goto fail; + } + + /* execute the function up to 'OP_initial_yield' (no yield nor + await are possible) */ + func_ret = async_func_resume(ctx, &s->func_state); + if (JS_IsException(func_ret)) + goto fail; + JS_FreeValue(ctx, func_ret); + + obj = js_create_from_ctor(ctx, func_obj, JS_CLASS_ASYNC_GENERATOR); + if (JS_IsException(obj)) + goto fail; + s->generator = JS_VALUE_GET_OBJ(obj); + JS_SetOpaqueInternal(obj, s); + return obj; + fail: + js_async_generator_free(ctx->rt, s); + return JS_EXCEPTION; +} + +/* JS parser */ + +enum { + TOK_NUMBER = -128, + TOK_STRING, + TOK_TEMPLATE, + TOK_IDENT, + TOK_REGEXP, + /* warning: order matters (see js_parse_assign_expr) */ + TOK_MUL_ASSIGN, + TOK_DIV_ASSIGN, + TOK_MOD_ASSIGN, + TOK_PLUS_ASSIGN, + TOK_MINUS_ASSIGN, + TOK_SHL_ASSIGN, + TOK_SAR_ASSIGN, + TOK_SHR_ASSIGN, + TOK_AND_ASSIGN, + TOK_XOR_ASSIGN, + TOK_OR_ASSIGN, + TOK_POW_ASSIGN, + TOK_LAND_ASSIGN, + TOK_LOR_ASSIGN, + TOK_DOUBLE_QUESTION_MARK_ASSIGN, + TOK_DEC, + TOK_INC, + TOK_SHL, + TOK_SAR, + TOK_SHR, + TOK_LT, + TOK_LTE, + TOK_GT, + TOK_GTE, + TOK_EQ, + TOK_STRICT_EQ, + TOK_NEQ, + TOK_STRICT_NEQ, + TOK_LAND, + TOK_LOR, + TOK_POW, + TOK_ARROW, + TOK_ELLIPSIS, + TOK_DOUBLE_QUESTION_MARK, + TOK_QUESTION_MARK_DOT, + TOK_ERROR, + TOK_PRIVATE_NAME, + TOK_EOF, + /* keywords: WARNING: same order as atoms */ + TOK_NULL, /* must be first */ + TOK_FALSE, + TOK_TRUE, + TOK_IF, + TOK_ELSE, + TOK_RETURN, + TOK_VAR, + TOK_THIS, + TOK_DELETE, + TOK_VOID, + TOK_TYPEOF, + TOK_NEW, + TOK_IN, + TOK_INSTANCEOF, + TOK_DO, + TOK_WHILE, + TOK_FOR, + TOK_BREAK, + TOK_CONTINUE, + TOK_SWITCH, + TOK_CASE, + TOK_DEFAULT, + TOK_THROW, + TOK_TRY, + TOK_CATCH, + TOK_FINALLY, + TOK_FUNCTION, + TOK_DEBUGGER, + TOK_WITH, + /* FutureReservedWord */ + TOK_CLASS, + TOK_CONST, + TOK_ENUM, + TOK_EXPORT, + TOK_EXTENDS, + TOK_IMPORT, + TOK_SUPER, + /* FutureReservedWords when parsing strict mode code */ + TOK_IMPLEMENTS, + TOK_INTERFACE, + TOK_LET, + TOK_PACKAGE, + TOK_PRIVATE, + TOK_PROTECTED, + TOK_PUBLIC, + TOK_STATIC, + TOK_YIELD, + TOK_AWAIT, /* must be last */ + TOK_OF, /* only used for js_parse_skip_parens_token() */ +}; + +#define TOK_FIRST_KEYWORD TOK_NULL +#define TOK_LAST_KEYWORD TOK_AWAIT + +/* unicode code points */ +#define CP_NBSP 0x00a0 +#define CP_BOM 0xfeff + +#define CP_LS 0x2028 +#define CP_PS 0x2029 + +typedef struct BlockEnv { + struct BlockEnv *prev; + JSAtom label_name; /* JS_ATOM_NULL if none */ + int label_break; /* -1 if none */ + int label_cont; /* -1 if none */ + int drop_count; /* number of stack elements to drop */ + int label_finally; /* -1 if none */ + int scope_level; + uint8_t has_iterator : 1; + uint8_t is_regular_stmt : 1; // i.e. not a loop statement +} BlockEnv; + +typedef struct JSGlobalVar { + int cpool_idx; /* if >= 0, index in the constant pool for hoisted + function defintion*/ + uint8_t force_init : 1; /* force initialization to undefined */ + uint8_t is_lexical : 1; /* global let/const definition */ + uint8_t is_const : 1; /* const definition */ + int scope_level; /* scope of definition */ + JSAtom var_name; /* variable name */ +} JSGlobalVar; + +typedef struct RelocEntry { + struct RelocEntry *next; + uint32_t addr; /* address to patch */ + int size; /* address size: 1, 2 or 4 bytes */ +} RelocEntry; + +typedef struct JumpSlot { + int op; + int size; + int pos; + int label; +} JumpSlot; + +typedef struct LabelSlot { + int ref_count; + int pos; /* phase 1 address, -1 means not resolved yet */ + int pos2; /* phase 2 address, -1 means not resolved yet */ + int addr; /* phase 3 address, -1 means not resolved yet */ + RelocEntry *first_reloc; +} LabelSlot; + +typedef struct SourceLocSlot { + uint32_t pc; + int line_num; + int col_num; +} SourceLocSlot; + +typedef enum JSParseFunctionEnum { + JS_PARSE_FUNC_STATEMENT, + JS_PARSE_FUNC_VAR, + JS_PARSE_FUNC_EXPR, + JS_PARSE_FUNC_ARROW, + JS_PARSE_FUNC_GETTER, + JS_PARSE_FUNC_SETTER, + JS_PARSE_FUNC_METHOD, + JS_PARSE_FUNC_CLASS_STATIC_INIT, + JS_PARSE_FUNC_CLASS_CONSTRUCTOR, + JS_PARSE_FUNC_DERIVED_CLASS_CONSTRUCTOR, +} JSParseFunctionEnum; + +typedef enum JSParseExportEnum { + JS_PARSE_EXPORT_NONE, + JS_PARSE_EXPORT_NAMED, + JS_PARSE_EXPORT_DEFAULT, +} JSParseExportEnum; + +typedef struct JSFunctionDef { + JSContext *ctx; + struct JSFunctionDef *parent; + int parent_cpool_idx; /* index in the constant pool of the parent + or -1 if none */ + int parent_scope_level; /* scope level in parent at point of definition */ + struct list_head child_list; /* list of JSFunctionDef.link */ + struct list_head link; + + int eval_type; /* only valid if is_eval = true */ + + /* Pack all boolean flags together as 1-bit fields to reduce struct size + while avoiding padding and compiler deoptimization. */ + bool is_eval : 1; /* true if eval code */ + bool is_global_var : 1; /* true if variables are not defined locally: + eval global, eval module or non strict eval */ + bool is_func_expr : 1; /* true if function expression */ + bool has_home_object : 1; /* true if the home object is available */ + bool has_prototype : 1; /* true if a prototype field is necessary */ + bool has_simple_parameter_list : 1; + bool has_parameter_expressions : 1; /* if true, an argument scope is created */ + bool has_use_strict : 1; /* to reject directive in special cases */ + bool has_eval_call : 1; /* true if the function contains a call to eval() */ + bool has_arguments_binding : 1; /* true if the 'arguments' binding is + available in the function */ + bool has_this_binding : 1; /* true if the 'this' and new.target binding are + available in the function */ + bool new_target_allowed : 1; /* true if the 'new.target' does not + throw a syntax error */ + bool super_call_allowed : 1; /* true if super() is allowed */ + bool super_allowed : 1; /* true if super. or super[] is allowed */ + bool arguments_allowed : 1; /* true if the 'arguments' identifier is allowed */ + bool is_derived_class_constructor : 1; + bool in_function_body : 1; + bool backtrace_barrier : 1; + bool need_home_object : 1; + bool use_short_opcodes : 1; /* true if short opcodes are used in byte_code */ + bool has_await : 1; /* true if await is used (used in module eval) */ + + JSFunctionKindEnum func_kind : 8; + JSParseFunctionEnum func_type : 7; + uint8_t is_strict_mode : 1; + JSAtom func_name; /* JS_ATOM_NULL if no name */ + + JSVarDef *vars; + uint32_t *vars_htab; // indexes into vars[] + int var_size; /* allocated size for vars[] */ + int var_count; + JSVarDef *args; + int arg_size; /* allocated size for args[] */ + int arg_count; /* number of arguments */ + int defined_arg_count; + int var_ref_count; /* number of local/arg variable references */ + int var_object_idx; /* -1 if none */ + int arg_var_object_idx; /* -1 if none (var object for the argument scope) */ + int arguments_var_idx; /* -1 if none */ + int arguments_arg_idx; /* argument variable definition in argument scope, + -1 if none */ + int func_var_idx; /* variable containing the current function (-1 + if none, only used if is_func_expr is true) */ + int eval_ret_idx; /* variable containing the return value of the eval, -1 if none */ + int this_var_idx; /* variable containg the 'this' value, -1 if none */ + int new_target_var_idx; /* variable containg the 'new.target' value, -1 if none */ + int this_active_func_var_idx; /* variable containg the 'this.active_func' value, -1 if none */ + int home_object_var_idx; + + int scope_level; /* index into fd->scopes if the current lexical scope */ + int scope_first; /* index into vd->vars of first lexically scoped variable */ + int scope_size; /* allocated size of fd->scopes array */ + int scope_count; /* number of entries used in the fd->scopes array */ + JSVarScope *scopes; + JSVarScope def_scope_array[4]; + int body_scope; /* scope of the body of the function or eval */ + + int global_var_count; + int global_var_size; + JSGlobalVar *global_vars; + + DynBuf byte_code; + int last_opcode_pos; /* -1 if no last opcode */ + + LabelSlot *label_slots; + int label_size; /* allocated size for label_slots[] */ + int label_count; + BlockEnv *top_break; /* break/continue label stack */ + + /* constant pool (strings, functions, numbers) */ + JSValue *cpool; + int cpool_count; + int cpool_size; + + /* list of variables in the closure */ + int closure_var_count; + int closure_var_size; + JSClosureVar *closure_var; + + JumpSlot *jump_slots; + int jump_size; + int jump_count; + + SourceLocSlot *source_loc_slots; + int source_loc_size; + int source_loc_count; + int line_number_last; + int line_number_last_pc; + int col_number_last; + + /* pc2line table */ + JSAtom filename; + int line_num; + int col_num; + DynBuf pc2line; + + char *source; /* raw source, utf-8 encoded */ + int source_len; + + JSModuleDef *module; /* != NULL when parsing a module */ +} JSFunctionDef; + +typedef struct JSToken { + int val; + int line_num; /* line number of token start */ + int col_num; /* column number of token start */ + const uint8_t *ptr; + union { + struct { + JSValue str; + int sep; + } str; + struct { + JSValue val; + } num; + struct { + JSAtom atom; + bool has_escape; + bool is_reserved; + } ident; + struct { + JSValue body; + JSValue flags; + } regexp; + } u; +} JSToken; + +typedef struct JSParseState { + JSContext *ctx; + int last_line_num; /* line number of last token */ + int last_col_num; /* column number of last token */ + int line_num; /* line number of current offset */ + int col_num; /* column number of current offset */ + const char *filename; + JSToken token; + bool got_lf; /* true if got line feed before the current token */ + const uint8_t *last_ptr; + const uint8_t *buf_start; + const uint8_t *buf_ptr; + const uint8_t *buf_end; + const uint8_t *eol; // most recently seen end-of-line character + const uint8_t *mark; // first token character, invariant: eol < mark + + /* current function code */ + JSFunctionDef *cur_func; + bool is_module; /* parsing a module */ + bool allow_html_comments; +} JSParseState; + +typedef struct JSOpCode { +#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_* + const char *name; +#endif + uint8_t size; /* in bytes */ + /* the opcodes remove n_pop items from the top of the stack, then + pushes n_push items */ + uint8_t n_pop; + uint8_t n_push; + uint8_t fmt; +} JSOpCode; + +static const JSOpCode opcode_info[OP_COUNT + (OP_TEMP_END - OP_TEMP_START)] = { +#define FMT(f) +#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_* +#define DEF(id, size, n_pop, n_push, f) { #id, size, n_pop, n_push, OP_FMT_ ## f }, +#else +#define DEF(id, size, n_pop, n_push, f) { size, n_pop, n_push, OP_FMT_ ## f }, +#endif +#include "quickjs-opcode.h" +#undef DEF +#undef FMT +}; + +/* After the final compilation pass, short opcodes are used. Their + opcodes overlap with the temporary opcodes which cannot appear in + the final bytecode. Their description is after the temporary + opcodes in opcode_info[]. */ +#define short_opcode_info(op) \ + opcode_info[(op) >= OP_TEMP_START ? \ + (op) + (OP_TEMP_END - OP_TEMP_START) : (op)] + +static void json_free_token(JSParseState *s, JSToken *token) { + // Only free actual allocated values + switch(token->val) { + case TOK_NUMBER: + JS_FreeValue(s->ctx, token->u.num.val); + break; + case TOK_STRING: + JS_FreeValue(s->ctx, token->u.str.str); + break; + case TOK_IDENT: + JS_FreeAtom(s->ctx, token->u.ident.atom); + break; + } +} + +static void free_token(JSParseState *s, JSToken *token) +{ + switch(token->val) { + case TOK_NUMBER: + JS_FreeValue(s->ctx, token->u.num.val); + break; + case TOK_STRING: + case TOK_TEMPLATE: + JS_FreeValue(s->ctx, token->u.str.str); + break; + case TOK_REGEXP: + JS_FreeValue(s->ctx, token->u.regexp.body); + JS_FreeValue(s->ctx, token->u.regexp.flags); + break; + case TOK_IDENT: + case TOK_PRIVATE_NAME: + JS_FreeAtom(s->ctx, token->u.ident.atom); + break; + default: + if (token->val >= TOK_FIRST_KEYWORD && + token->val <= TOK_LAST_KEYWORD) { + JS_FreeAtom(s->ctx, token->u.ident.atom); + } + break; + } +} + +static void __attribute((unused)) dump_token(JSParseState *s, + const JSToken *token) +{ + printf("%d:%d ", token->line_num, token->col_num); + switch(token->val) { + case TOK_NUMBER: + { + double d; + JS_ToFloat64(s->ctx, &d, token->u.num.val); /* no exception possible */ + printf("number: %.14g\n", d); + } + break; + case TOK_IDENT: + dump_atom: + { + char buf[ATOM_GET_STR_BUF_SIZE]; + printf("ident: '%s'\n", + JS_AtomGetStr(s->ctx, buf, sizeof(buf), token->u.ident.atom)); + } + break; + case TOK_STRING: + { + const char *str; + /* XXX: quote the string */ + str = JS_ToCString(s->ctx, token->u.str.str); + printf("string: '%s'\n", str); + JS_FreeCString(s->ctx, str); + } + break; + case TOK_TEMPLATE: + { + const char *str; + str = JS_ToCString(s->ctx, token->u.str.str); + printf("template: `%s`\n", str); + JS_FreeCString(s->ctx, str); + } + break; + case TOK_REGEXP: + { + const char *str, *str2; + str = JS_ToCString(s->ctx, token->u.regexp.body); + str2 = JS_ToCString(s->ctx, token->u.regexp.flags); + printf("regexp: '%s' '%s'\n", str, str2); + JS_FreeCString(s->ctx, str); + JS_FreeCString(s->ctx, str2); + } + break; + case TOK_EOF: + printf("eof\n"); + break; + default: + if (s->token.val >= TOK_NULL && s->token.val <= TOK_LAST_KEYWORD) { + goto dump_atom; + } else if (s->token.val >= 256) { + printf("token: %d\n", token->val); + } else { + printf("token: '%c'\n", token->val); + } + break; + } +} + +int JS_PRINTF_FORMAT_ATTR(2, 3) js_parse_error(JSParseState *s, JS_PRINTF_FORMAT const char *fmt, ...) +{ + JSContext *ctx = s->ctx; + va_list ap; + int backtrace_flags; + + va_start(ap, fmt); + JS_ThrowError2(ctx, JS_SYNTAX_ERROR, false, fmt, ap); + va_end(ap); + backtrace_flags = 0; + if (s->cur_func && s->cur_func->backtrace_barrier) + backtrace_flags = JS_BACKTRACE_FLAG_SINGLE_LEVEL; + build_backtrace(ctx, ctx->rt->current_exception, JS_UNDEFINED, s->filename, + s->line_num, s->col_num, backtrace_flags); + return -1; +} + +#ifndef QJS_DISABLE_PARSER + +static __exception int next_token(JSParseState *s); + +static int js_parse_expect(JSParseState *s, int tok) +{ + char buf[ATOM_GET_STR_BUF_SIZE]; + + if (s->token.val == tok) + return next_token(s); + + switch(s->token.val) { + case TOK_EOF: + return js_parse_error(s, "Unexpected end of input"); + case TOK_NUMBER: + return js_parse_error(s, "Unexpected number"); + case TOK_STRING: + return js_parse_error(s, "Unexpected string"); + case TOK_TEMPLATE: + return js_parse_error(s, "Unexpected string template"); + case TOK_REGEXP: + return js_parse_error(s, "Unexpected regexp"); + case TOK_IDENT: + return js_parse_error(s, "Unexpected identifier '%s'", + JS_AtomGetStr(s->ctx, buf, sizeof(buf), + s->token.u.ident.atom)); + case TOK_ERROR: + return js_parse_error(s, "Invalid or unexpected token"); + default: + return js_parse_error(s, "Unexpected token '%.*s'", + (int)(s->buf_ptr - s->token.ptr), + (const char *)s->token.ptr); + } +} + +static int js_parse_expect_semi(JSParseState *s) +{ + if (s->token.val != ';') { + /* automatic insertion of ';' */ + if (s->token.val == TOK_EOF || s->token.val == '}' || s->got_lf) { + return 0; + } + return js_parse_error(s, "expecting '%c'", ';'); + } + return next_token(s); +} + +static int js_parse_error_reserved_identifier(JSParseState *s) +{ + char buf1[ATOM_GET_STR_BUF_SIZE]; + return js_parse_error(s, "'%s' is a reserved identifier", + JS_AtomGetStr(s->ctx, buf1, sizeof(buf1), + s->token.u.ident.atom)); +} + +static __exception int js_parse_template_part(JSParseState *s, + const uint8_t *p) +{ + const uint8_t *p_next; + uint32_t c; + StringBuffer b_s, *b = &b_s; + JSValue str; + + /* p points to the first byte of the template part */ + if (string_buffer_init(s->ctx, b, 32)) + goto fail; + for(;;) { + if (p >= s->buf_end) + goto unexpected_eof; + c = *p++; + if (c == '`') { + /* template end part */ + break; + } + if (c == '$' && *p == '{') { + /* template start or middle part */ + p++; + break; + } + if (c == '\\') { + if (string_buffer_putc8(b, c)) + goto fail; + if (p >= s->buf_end) + goto unexpected_eof; + c = *p++; + } + /* newline sequences are normalized as single '\n' bytes */ + if (c == '\r') { + if (*p == '\n') + p++; + c = '\n'; + } + if (c == '\n') { + s->line_num++; + s->eol = &p[-1]; + s->mark = p; + } else if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) { + js_parse_error(s, "invalid UTF-8 sequence"); + goto fail; + } + p = p_next; + } + if (string_buffer_putc(b, c)) + goto fail; + } + str = string_buffer_end(b); + if (JS_IsException(str)) + return -1; + s->token.val = TOK_TEMPLATE; + s->token.u.str.sep = c; + s->token.u.str.str = str; + s->buf_ptr = p; + return 0; + + unexpected_eof: + js_parse_error(s, "unexpected end of string"); + fail: + string_buffer_free(b); + return -1; +} + +static __exception int js_parse_string(JSParseState *s, int sep, + bool do_throw, const uint8_t *p, + JSToken *token, const uint8_t **pp) +{ + const uint8_t *p_next; + int ret; + uint32_t c; + StringBuffer b_s, *b = &b_s; + JSValue str; + + /* string */ + if (string_buffer_init(s->ctx, b, 32)) + goto fail; + for(;;) { + if (p >= s->buf_end) + goto invalid_char; + c = *p; + if (c < 0x20) { + if (sep == '`') { + if (c == '\r') { + if (p[1] == '\n') + p++; + c = '\n'; + } + /* do not update s->line_num */ + } else if (c == '\n' || c == '\r') + goto invalid_char; + } + p++; + if (c == sep) + break; + if (c == '$' && *p == '{' && sep == '`') { + /* template start or middle part */ + p++; + break; + } + if (c == '\\') { + c = *p; + switch(c) { + case '\0': + if (p >= s->buf_end) { + if (sep != '`') + goto invalid_char; + if (do_throw) + js_parse_error(s, "Unexpected end of input"); + goto fail; + } + p++; + break; + case '\'': + case '\"': + case '\\': + p++; + break; + case '\r': /* accept DOS and MAC newline sequences */ + if (p[1] == '\n') { + p++; + } + /* fall thru */ + case '\n': + /* ignore escaped newline sequence */ + p++; + if (sep != '`') { + s->line_num++; + s->eol = &p[-1]; + s->mark = p; + } + continue; + default: + if (c == '0' && !(p[1] >= '0' && p[1] <= '9')) { + /* accept isolated \0 */ + p++; + c = '\0'; + } else + if ((c >= '0' && c <= '9') + && (s->cur_func->is_strict_mode || sep == '`')) { + if (do_throw) { + js_parse_error(s, "%s are not allowed in %s", + (c >= '8') ? "\\8 and \\9" : "Octal escape sequences", + (sep == '`') ? "template strings" : "strict mode"); + } + goto fail; + } else if (c >= 0x80) { + c = utf8_decode(p, &p_next); + if (p_next == p + 1) { + goto invalid_utf8; + } + p = p_next; + /* LS or PS are skipped */ + if (c == CP_LS || c == CP_PS) + continue; + } else { + ret = lre_parse_escape(&p, true); + if (ret == -1) { + if (do_throw) { + js_parse_error(s, "Invalid %s escape sequence", + c == 'u' ? "Unicode" : "hexadecimal"); + } + goto fail; + } else if (ret < 0) { + /* ignore the '\' (could output a warning) */ + p++; + } else { + c = ret; + } + } + break; + } + } else if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) + goto invalid_utf8; + p = p_next; + } + if (string_buffer_putc(b, c)) + goto fail; + } + str = string_buffer_end(b); + if (JS_IsException(str)) + return -1; + token->val = TOK_STRING; + token->u.str.sep = c; + token->u.str.str = str; + *pp = p; + return 0; + + invalid_utf8: + if (do_throw) + js_parse_error(s, "invalid UTF-8 sequence"); + goto fail; + invalid_char: + if (do_throw) + js_parse_error(s, "unexpected end of string"); + fail: + string_buffer_free(b); + return -1; +} + +static inline bool token_is_pseudo_keyword(JSParseState *s, JSAtom atom) { + return s->token.val == TOK_IDENT && s->token.u.ident.atom == atom && + !s->token.u.ident.has_escape; +} + +static __exception int js_parse_regexp(JSParseState *s) +{ + const uint8_t *p, *p_next; + bool in_class; + StringBuffer b_s, *b = &b_s; + StringBuffer b2_s, *b2 = &b2_s; + uint32_t c; + JSValue body_str, flags_str; + + p = s->buf_ptr; + p++; + in_class = false; + if (string_buffer_init(s->ctx, b, 32)) + return -1; + if (string_buffer_init(s->ctx, b2, 1)) + goto fail; + for(;;) { + if (p >= s->buf_end) { + eof_error: + js_parse_error(s, "unexpected end of regexp"); + goto fail; + } + c = *p++; + if (c == '\n' || c == '\r') { + goto eol_error; + } else if (c == '/') { + if (!in_class) + break; + } else if (c == '[') { + in_class = true; + } else if (c == ']') { + /* XXX: incorrect as the first character in a class */ + in_class = false; + } else if (c == '\\') { + if (string_buffer_putc8(b, c)) + goto fail; + c = *p++; + if (c == '\n' || c == '\r') + goto eol_error; + else if (c == '\0' && p >= s->buf_end) + goto eof_error; + else if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) { + goto invalid_utf8; + } + p = p_next; + if (c == CP_LS || c == CP_PS) + goto eol_error; + } + } else if (c >= 0x80) { + c = utf8_decode(p - 1, &p_next); + if (p_next == p) { + invalid_utf8: + js_parse_error(s, "invalid UTF-8 sequence"); + goto fail; + } + p = p_next; + /* LS or PS are considered as line terminator */ + if (c == CP_LS || c == CP_PS) { + eol_error: + js_parse_error(s, "unexpected line terminator in regexp"); + goto fail; + } + } + if (string_buffer_putc(b, c)) + goto fail; + } + + /* flags */ + for(;;) { + c = utf8_decode(p, &p_next); + /* no need to test for invalid UTF-8, 0xFFFD is not ident_next */ + if (!lre_js_is_ident_next(c)) + break; + if (string_buffer_putc(b2, c)) + goto fail; + p = p_next; + } + + body_str = string_buffer_end(b); + flags_str = string_buffer_end(b2); + if (JS_IsException(body_str) || + JS_IsException(flags_str)) { + JS_FreeValue(s->ctx, body_str); + JS_FreeValue(s->ctx, flags_str); + return -1; + } + s->token.val = TOK_REGEXP; + s->token.u.regexp.body = body_str; + s->token.u.regexp.flags = flags_str; + s->buf_ptr = p; + return 0; + fail: + string_buffer_free(b); + string_buffer_free(b2); + return -1; +} + +#endif // QJS_DISABLE_PARSER + +static __exception int ident_realloc(JSContext *ctx, char **pbuf, size_t *psize, + char *static_buf) +{ + char *buf, *new_buf; + size_t size, new_size; + + buf = *pbuf; + size = *psize; + if (size >= (SIZE_MAX / 3) * 2) + new_size = SIZE_MAX; + else + new_size = size + (size >> 1); + if (buf == static_buf) { + new_buf = js_malloc(ctx, new_size); + if (!new_buf) + return -1; + memcpy(new_buf, buf, size); + } else { + new_buf = js_realloc(ctx, buf, new_size); + if (!new_buf) + return -1; + } + *pbuf = new_buf; + *psize = new_size; + return 0; +} + +#ifndef QJS_DISABLE_PARSER + +/* convert a TOK_IDENT to a keyword when needed */ +static void update_token_ident(JSParseState *s) +{ + if (s->token.u.ident.atom <= JS_ATOM_LAST_KEYWORD || + (s->token.u.ident.atom <= JS_ATOM_LAST_STRICT_KEYWORD && + s->cur_func->is_strict_mode) || + (s->token.u.ident.atom == JS_ATOM_yield && + ((s->cur_func->func_kind & JS_FUNC_GENERATOR) || + (s->cur_func->func_type == JS_PARSE_FUNC_ARROW && + !s->cur_func->in_function_body && s->cur_func->parent && + (s->cur_func->parent->func_kind & JS_FUNC_GENERATOR)))) || + (s->token.u.ident.atom == JS_ATOM_await && + (s->is_module || + (s->cur_func->func_kind & JS_FUNC_ASYNC) || + s->cur_func->func_type == JS_PARSE_FUNC_CLASS_STATIC_INIT || + (s->cur_func->func_type == JS_PARSE_FUNC_ARROW && + !s->cur_func->in_function_body && s->cur_func->parent && + ((s->cur_func->parent->func_kind & JS_FUNC_ASYNC) || + s->cur_func->parent->func_type == JS_PARSE_FUNC_CLASS_STATIC_INIT))))) { + if (s->token.u.ident.has_escape) { + s->token.u.ident.is_reserved = true; + s->token.val = TOK_IDENT; + } else { + /* The keywords atoms are pre allocated */ + s->token.val = s->token.u.ident.atom - 1 + TOK_FIRST_KEYWORD; + } + } +} + +/* if the current token is an identifier or keyword, reparse it + according to the current function type */ +static void reparse_ident_token(JSParseState *s) +{ + if (s->token.val == TOK_IDENT || + (s->token.val >= TOK_FIRST_KEYWORD && + s->token.val <= TOK_LAST_KEYWORD)) { + s->token.val = TOK_IDENT; + s->token.u.ident.is_reserved = false; + update_token_ident(s); + } +} + +/* 'c' is the first character. Return JS_ATOM_NULL in case of error */ +static JSAtom parse_ident(JSParseState *s, const uint8_t **pp, + bool *pident_has_escape, int c, bool is_private) +{ + const uint8_t *p, *p_next; + char ident_buf[128], *buf; + size_t ident_size, ident_pos; + JSAtom atom = JS_ATOM_NULL; + + p = *pp; + buf = ident_buf; + ident_size = sizeof(ident_buf); + ident_pos = 0; + if (is_private) + buf[ident_pos++] = '#'; + for(;;) { + if (c < 0x80) { + buf[ident_pos++] = c; + } else { + ident_pos += utf8_encode((uint8_t*)buf + ident_pos, c); + } + c = *p; + p_next = p + 1; + if (c == '\\' && *p_next == 'u') { + c = lre_parse_escape(&p_next, true); + *pident_has_escape = true; + } else if (c >= 0x80) { + c = utf8_decode(p, &p_next); + /* no need to test for invalid UTF-8, 0xFFFD is not ident_next */ + } + if (!lre_js_is_ident_next(c)) + break; + p = p_next; + if (unlikely(ident_pos >= ident_size - UTF8_CHAR_LEN_MAX)) { + if (ident_realloc(s->ctx, &buf, &ident_size, ident_buf)) + goto done; + } + } + /* buf is pure ASCII or UTF-8 encoded */ + atom = JS_NewAtomLen(s->ctx, buf, ident_pos); + done: + if (unlikely(buf != ident_buf)) + js_free(s->ctx, buf); + *pp = p; + return atom; +} + + +static __exception int next_token(JSParseState *s) +{ + const uint8_t *p, *p_next; + int c; + bool ident_has_escape; + JSAtom atom; + + if (js_check_stack_overflow(s->ctx->rt, 1000)) { + JS_ThrowStackOverflow(s->ctx); + return -1; + } + + free_token(s, &s->token); + + p = s->last_ptr = s->buf_ptr; + s->got_lf = false; + s->last_line_num = s->token.line_num; + s->last_col_num = s->token.col_num; + redo: + s->token.line_num = s->line_num; + s->token.col_num = s->col_num; + s->token.ptr = p; + c = *p; + switch(c) { + case 0: + if (p >= s->buf_end) { + s->token.val = TOK_EOF; + } else { + goto def_token; + } + break; + case '`': + if (js_parse_template_part(s, p + 1)) + goto fail; + p = s->buf_ptr; + break; + case '\'': + case '\"': + if (js_parse_string(s, c, true, p + 1, &s->token, &p)) + goto fail; + break; + case '\r': /* accept DOS and MAC newline sequences */ + if (p[1] == '\n') { + p++; + } + /* fall thru */ + case '\n': + p++; + line_terminator: + s->eol = &p[-1]; + s->mark = p; + s->got_lf = true; + s->line_num++; + goto redo; + case '\f': + case '\v': + case ' ': + case '\t': + s->mark = ++p; + goto redo; + case '/': + if (p[1] == '*') { + /* comment */ + p += 2; + for(;;) { + if (*p == '\0' && p >= s->buf_end) { + js_parse_error(s, "unexpected end of comment"); + goto fail; + } + if (p[0] == '*' && p[1] == '/') { + p += 2; + break; + } + if (*p == '\n') { + s->line_num++; + s->got_lf = true; /* considered as LF for ASI */ + s->eol = p++; + s->mark = p; + } else if (*p == '\r') { + s->got_lf = true; /* considered as LF for ASI */ + p++; + } else if (*p >= 0x80) { + c = utf8_decode(p, &p); + /* ignore invalid UTF-8 in comments */ + if (c == CP_LS || c == CP_PS) { + s->got_lf = true; /* considered as LF for ASI */ + } + } else { + p++; + } + } + s->mark = p; + goto redo; + } else if (p[1] == '/') { + /* line comment */ + p += 2; + skip_line_comment: + for(;;) { + if (*p == '\0' && p >= s->buf_end) + break; + if (*p == '\r' || *p == '\n') + break; + if (*p >= 0x80) { + c = utf8_decode(p, &p); + /* ignore invalid UTF-8 in comments */ + /* LS or PS are considered as line terminator */ + if (c == CP_LS || c == CP_PS) { + break; + } + } else { + p++; + } + } + s->mark = p; + goto redo; + } else if (p[1] == '=') { + p += 2; + s->token.val = TOK_DIV_ASSIGN; + } else { + p++; + s->token.val = c; + } + break; + case '\\': + if (p[1] == 'u') { + const uint8_t *p1 = p + 1; + int c1 = lre_parse_escape(&p1, true); + if (c1 >= 0 && lre_js_is_ident_first(c1)) { + c = c1; + p = p1; + ident_has_escape = true; + goto has_ident; + } else { + /* XXX: syntax error? */ + } + } + goto def_token; + case 'a': case 'b': case 'c': case 'd': + case 'e': case 'f': case 'g': case 'h': + case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'p': + case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': + case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': + case 'E': case 'F': case 'G': case 'H': + case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': + case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + case '_': + case '$': + /* identifier */ + s->mark = p; + p++; + ident_has_escape = false; + has_ident: + atom = parse_ident(s, &p, &ident_has_escape, c, false); + if (atom == JS_ATOM_NULL) + goto fail; + s->token.u.ident.atom = atom; + s->token.u.ident.has_escape = ident_has_escape; + s->token.u.ident.is_reserved = false; + s->token.val = TOK_IDENT; + update_token_ident(s); + break; + case '#': + /* private name */ + { + p++; + c = *p; + p_next = p + 1; + if (c == '\\' && *p_next == 'u') { + c = lre_parse_escape(&p_next, true); + } else if (c >= 0x80) { + c = utf8_decode(p, &p_next); + if (p_next == p + 1) + goto invalid_utf8; + } + if (!lre_js_is_ident_first(c)) { + js_parse_error(s, "invalid first character of private name"); + goto fail; + } + p = p_next; + ident_has_escape = false; /* not used */ + atom = parse_ident(s, &p, &ident_has_escape, c, true); + if (atom == JS_ATOM_NULL) + goto fail; + s->token.u.ident.atom = atom; + s->token.val = TOK_PRIVATE_NAME; + } + break; + case '.': + if (p[1] == '.' && p[2] == '.') { + p += 3; + s->token.val = TOK_ELLIPSIS; + break; + } + if (p[1] >= '0' && p[1] <= '9') { + goto parse_number; + } else { + goto def_token; + } + break; + case '0': + /* in strict mode, octal literals are not accepted */ + if (is_digit(p[1]) && (s->cur_func->is_strict_mode)) { + js_parse_error(s, "Octal literals are not allowed in strict mode"); + goto fail; + } + goto parse_number; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': + case '9': + /* number */ + parse_number: + { + JSValue ret; + const uint8_t *p1; + int flags; + flags = ATOD_ACCEPT_BIN_OCT | ATOD_ACCEPT_LEGACY_OCTAL | + ATOD_ACCEPT_UNDERSCORES | ATOD_ACCEPT_SUFFIX; + ret = js_atof(s->ctx, (const char *)p, (const char **)&p, 0, + flags); + if (JS_IsException(ret)) + goto fail; + /* reject `10instanceof Number` */ + if (JS_VALUE_IS_NAN(ret) || + lre_js_is_ident_next(utf8_decode(p, &p1))) { + JS_FreeValue(s->ctx, ret); + js_parse_error(s, "invalid number literal"); + goto fail; + } + s->token.val = TOK_NUMBER; + s->token.u.num.val = ret; + } + break; + case '*': + if (p[1] == '=') { + p += 2; + s->token.val = TOK_MUL_ASSIGN; + } else if (p[1] == '*') { + if (p[2] == '=') { + p += 3; + s->token.val = TOK_POW_ASSIGN; + } else { + p += 2; + s->token.val = TOK_POW; + } + } else { + goto def_token; + } + break; + case '%': + if (p[1] == '=') { + p += 2; + s->token.val = TOK_MOD_ASSIGN; + } else { + goto def_token; + } + break; + case '+': + if (p[1] == '=') { + p += 2; + s->token.val = TOK_PLUS_ASSIGN; + } else if (p[1] == '+') { + p += 2; + s->token.val = TOK_INC; + } else { + goto def_token; + } + break; + case '-': + if (p[1] == '=') { + p += 2; + s->token.val = TOK_MINUS_ASSIGN; + } else if (p[1] == '-') { + if (s->allow_html_comments && p[2] == '>' && + (s->got_lf || s->last_ptr == s->buf_start)) { + /* Annex B: `-->` at beginning of line is an html comment end. + It extends to the end of the line. + */ + goto skip_line_comment; + } + p += 2; + s->token.val = TOK_DEC; + } else { + goto def_token; + } + break; + case '<': + if (p[1] == '=') { + p += 2; + s->token.val = TOK_LTE; + } else if (p[1] == '<') { + if (p[2] == '=') { + p += 3; + s->token.val = TOK_SHL_ASSIGN; + } else { + p += 2; + s->token.val = TOK_SHL; + } + } else if (s->allow_html_comments && + p[1] == '!' && p[2] == '-' && p[3] == '-') { + /* Annex B: handle `