@bitgo-beta/sdk-coin-flrp 1.0.1-beta.9 → 1.0.1-beta.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/flrp.d.ts +82 -61
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +293 -134
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -6
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +233 -29
- package/dist/src/lib/constants.d.ts +160 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +213 -3
- package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +224 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +46 -17
- package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInPTxBuilder.js +70 -6
- package/dist/src/lib/iface.d.ts +52 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +403 -0
- package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
- package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInPTxBuilder.js +464 -0
- package/dist/src/lib/index.d.ts +7 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +15 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +4 -6
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
- package/dist/src/lib/transaction.d.ts +111 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +322 -0
- package/dist/src/lib/transactionBuilder.d.ts +85 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +167 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +91 -0
- package/dist/src/lib/types.d.ts +78 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +5 -0
- package/dist/src/lib/utils.d.ts +59 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +160 -52
- package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +180 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.js +37 -11
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +257 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +500 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +460 -0
- package/dist/test/unit/lib/utils.js +55 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +114 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/validatorTxBuilder.test.js +293 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -11
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
// Shared constants for Flare P-Chain (flrp) utilities and key handling.
|
|
3
3
|
// Centralizing avoids magic numbers scattered across utils and keyPair implementations.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.HEX_REGEX = exports.ADDRESS_REGEX = exports.OUTPUT_INDEX_HEX_LENGTH = exports.PRIVATE_KEY_COMPRESSED_SUFFIX = exports.SUFFIXED_PRIVATE_KEY_LENGTH = exports.RAW_PRIVATE_KEY_LENGTH = exports.UNCOMPRESSED_PUBLIC_KEY_LENGTH = exports.COMPRESSED_PUBLIC_KEY_LENGTH = exports.SHORT_PUB_KEY_LENGTH = exports.DECODED_BLOCK_ID_LENGTH = void 0;
|
|
6
|
-
exports.
|
|
5
|
+
exports.HEX_PREFIX_LENGTH = exports.HEX_PREFIX = exports.EMPTY_BUFFER_SIZE = exports.FLARE_TESTNET_NETWORK_ID = exports.FLARE_MAINNET_NETWORK_ID = exports.DEFAULT_NETWORK_ID = exports.HEX_PATTERN_WITH_PREFIX = exports.HEX_PATTERN_NO_PREFIX = exports.HEX_CHAR_PATTERN = exports.HEX_REGEX = exports.ADDRESS_REGEX = exports.FIRST_ADDRESS_INDEX = exports.MEMO_BUFFER_SIZE = exports.DEFAULT_LOCKTIME = exports.DEFAULT_THRESHOLD = exports.ZERO_NUMBER = exports.ZERO_BIGINT = exports.EMPTY_STRING = exports.CREDENTIAL_VERSION = exports.STAKE_OUTPUT_TYPE = exports.SECP256K1_CREDENTIAL_TYPE = exports.DELEGATOR_STAKE_TYPE = exports.PRIMARY_DELEGATOR_TYPE = exports.DELEGATOR_TRANSACTION_TYPE = exports.TRANSACTION_ID_PREFIX = exports.PERCENTAGE_MULTIPLIER = exports.BASIS_POINTS_DIVISOR = exports.MIN_DELEGATION_FEE_BASIS_POINTS = exports.MINIMUM_FEE = exports.OUTPUT_FEE = exports.INPUT_FEE = exports.DEFAULT_EVM_GAS_FEE = exports.DEFAULT_BASE_FEE = exports.MAX_CHAIN_ID_LENGTH = exports.CHAIN_ID_HEX_LENGTH = exports.BLS_SIGNATURE_LENGTH = exports.BLS_PUBLIC_KEY_UNCOMPRESSED_LENGTH = exports.BLS_PUBLIC_KEY_COMPRESSED_LENGTH = exports.SECP256K1_SIGNATURE_LENGTH = exports.PRIVATE_KEY_HEX_LENGTH = exports.TRANSACTION_ID_HEX_LENGTH = exports.ASSET_ID_LENGTH = exports.OUTPUT_INDEX_HEX_LENGTH = exports.PRIVATE_KEY_COMPRESSED_SUFFIX = exports.SUFFIXED_PRIVATE_KEY_LENGTH = exports.RAW_PRIVATE_KEY_LENGTH = exports.UNCOMPRESSED_PUBLIC_KEY_LENGTH = exports.COMPRESSED_PUBLIC_KEY_LENGTH = exports.SHORT_PUB_KEY_LENGTH = exports.DECODED_BLOCK_ID_LENGTH = void 0;
|
|
6
|
+
exports.IMPORT_TX_TYPE = exports.PLATFORM_VM_ADD_VALIDATOR_TX = exports.PLATFORM_VM_IMPORT_TX = exports.PADSTART_CHAR = exports.HEX_PREFIX_REMOVE = exports.ZERO_ADDRESS = exports.FLARE_ADDRESS_PLACEHOLDER = exports.FLARE_ATOMIC_PARSED_PREFIX = exports.FLARE_ATOMIC_PREFIX = exports.CHAIN_SUFFIX = exports.X_CHAIN_FULL = exports.C_CHAIN_FULL = exports.P_CHAIN_FULL = exports.X_CHAIN = exports.C_CHAIN = exports.P_CHAIN = exports.UTF8_ENCODING = exports.HEX_ENCODING = exports.BIGINT_TYPE = exports.FUNCTION_TYPE = exports.NUMBER_TYPE = exports.STRING_TYPE = exports.OBJECT_TYPE_STRING = exports.ERROR_FAILED_INITIALIZE_BUILDER = exports.ERROR_TRANSACTION_PARSE_FAILED = exports.ERROR_BLOCKCHAIN_ID_MISMATCH = exports.ERROR_TRANSACTION_REQUIRED = exports.ERROR_EXPORT_AMOUNT_POSITIVE = exports.ERROR_DESTINATION_ADDRESSES_REQUIRED = exports.ERROR_SOURCE_ADDRESSES_REQUIRED = exports.ERROR_DESTINATION_CHAIN_REQUIRED = exports.ERROR_EXPORT_NOT_IMPLEMENTED = exports.ERROR_UNKNOWN = exports.ERROR_CREATE_CREDENTIAL_FAILED = exports.ERROR_FLAREJS_SIGNING_FAILED = exports.ERROR_ENHANCED_PARSE_FAILED = exports.ERROR_ENHANCED_BUILD_FAILED = exports.ERROR_UTXOS_REQUIRED_BUILD = exports.ERROR_INVALID_PRIVATE_KEY = exports.ERROR_SIGNATURES_EMPTY = exports.ERROR_SIGNATURES_ARRAY = exports.ERROR_UTXOS_REQUIRED = exports.ERROR_CREDENTIALS_ARRAY = exports.ERROR_AMOUNT_POSITIVE = exports.EXPORT_TRANSACTION_TYPE = exports.MAINNET_TYPE = exports.FIRST_ARRAY_INDEX = exports.AMOUNT_STRING_ZERO = exports.SIGNING_METHOD = exports.DECIMAL_RADIX = void 0;
|
|
7
|
+
exports.FLR_ASSET_ID = exports.DESTINATION_CHAIN_FIELD = exports.SOURCE_CHAIN_FIELD = exports.REWARD_ADDRESSES_FIELD = exports.MEMO_FIELD = exports.DISPLAY_ORDER_BASE = exports.ADD_PERMISSIONLESS_VALIDATOR_TYPE = exports.HEX_RADIX = exports.SIGNATURE_VERSION = exports.RECOVERY_VERSION = exports.RECOVERY_MODE = exports.NORMAL_MODE = exports.RECOVERY_KEY_METHOD = exports.SHA256_HASH = exports.DER_FORMAT = exports.SECP256K1_SIG_TYPE = exports.TYPE_FIELD = exports.FEE_FIELD = exports.CHANGE_OUTPUTS_FIELD = exports.OUTPUTS_FIELD = exports.CHANGE_AMOUNT_FIELD = exports.OUTPUT_AMOUNT_FIELD = exports.ID_FIELD = exports.OUTPUT_IDX_FIELD = exports.TXID_FIELD = exports.AMOUNT_FIELD = exports.OUTPUT_ID_FIELD = exports.GET_OUTPUT_METHOD = exports.BLOCKCHAIN_ID_PROP = exports.NETWORK_ID_PROP_ALT = exports.NETWORK_ID_PROP = exports.INS_PROP = exports.INPUTS_PROP = exports.OUTS_PROP = exports.EXPORTED_OUTPUTS_PROP = exports.DESTINATION_CHAIN_ID_PROP = exports.DESTINATION_CHAIN_PROP = exports.SECP256K1_TRANSFER_OUTPUT_TYPE = exports.SECP256K1_TRANSFER_INPUT_TYPE = exports.CREDENTIAL_TYPE = exports.TRANSFERABLE_INPUT_TYPE = exports.VALIDATOR_TRANSACTION_TYPES = exports.ADD_VALIDATOR_TX_TYPE = exports.ADDVALIDATOR_TYPE = exports.VALIDATOR_TYPE = exports.IMPORT_C_TYPE = exports.SEND_TYPE = exports.EXPORT_TYPE = exports.IMPORT_TYPE = exports.P_CHAIN_IMPORT_TYPE = void 0;
|
|
8
|
+
exports.UTXO_REQUIRED_FIELDS = exports.ERROR_UNKNOWN_PARSING = exports.ERROR_PARSE_RAW_TRANSACTION = exports.ERROR_UTXOS_REQUIRED_BUILDER = exports.ERROR_FROM_ADDRESSES_REQUIRED = exports.ERROR_UTXOS_MISSING_FIELD = exports.ERROR_UTXOS_EMPTY_ARRAY = exports.ERROR_INVALID_LOCKTIME = exports.ERROR_INVALID_THRESHOLD = exports.ERROR_BLOCKCHAIN_ID_MISMATCH_BUILDER = exports.ERROR_NETWORK_ID_MISMATCH = exports.VALID_P_CHAIN_IMPORT_TYPES = exports.VALID_IMPORT_SOURCE_CHAINS = exports.X_CHAIN_SHORT = exports.P_CHAIN_SHORT = exports.PLACEHOLDER_NODE_ID = exports.FLARE_TRANSACTION_ID_PLACEHOLDER = exports.FLARE_SIGNABLE_PAYLOAD = exports.FLARE_TX_HEX_PLACEHOLDER = void 0;
|
|
9
|
+
exports.DECODED_BLOCK_ID_LENGTH = 32; // Expected decoded block identifier length
|
|
7
10
|
exports.SHORT_PUB_KEY_LENGTH = 50; // Placeholder (potential CB58 encoded form length)
|
|
8
11
|
exports.COMPRESSED_PUBLIC_KEY_LENGTH = 66; // 33 bytes (compressed) hex encoded
|
|
9
12
|
exports.UNCOMPRESSED_PUBLIC_KEY_LENGTH = 130; // 65 bytes (uncompressed) hex encoded
|
|
@@ -11,7 +14,214 @@ exports.RAW_PRIVATE_KEY_LENGTH = 64; // 32 bytes hex encoded
|
|
|
11
14
|
exports.SUFFIXED_PRIVATE_KEY_LENGTH = 66; // 32 bytes + compression flag suffix
|
|
12
15
|
exports.PRIVATE_KEY_COMPRESSED_SUFFIX = '01';
|
|
13
16
|
exports.OUTPUT_INDEX_HEX_LENGTH = 8; // 4 bytes serialized to hex length
|
|
17
|
+
// Asset and transaction constants
|
|
18
|
+
exports.ASSET_ID_LENGTH = 32; // Asset ID length in bytes (standard for AVAX/Flare networks)
|
|
19
|
+
exports.TRANSACTION_ID_HEX_LENGTH = 64; // Transaction ID length in hex characters (32 bytes)
|
|
20
|
+
exports.PRIVATE_KEY_HEX_LENGTH = 64; // Private key length in hex characters (32 bytes)
|
|
21
|
+
exports.SECP256K1_SIGNATURE_LENGTH = 65; // SECP256K1 signature length in bytes
|
|
22
|
+
exports.BLS_PUBLIC_KEY_COMPRESSED_LENGTH = 96; // BLS public key compressed length in hex chars (48 bytes)
|
|
23
|
+
exports.BLS_PUBLIC_KEY_UNCOMPRESSED_LENGTH = 192; // BLS public key uncompressed length in hex chars (96 bytes)
|
|
24
|
+
exports.BLS_SIGNATURE_LENGTH = 192; // BLS signature length in hex characters (96 bytes)
|
|
25
|
+
exports.CHAIN_ID_HEX_LENGTH = 64; // Chain ID length in hex characters (32 bytes)
|
|
26
|
+
exports.MAX_CHAIN_ID_LENGTH = 128; // Maximum chain ID string length
|
|
27
|
+
// Fee constants (in nanoFLR)
|
|
28
|
+
exports.DEFAULT_BASE_FEE = '1000000'; // 1M nanoFLR default base fee
|
|
29
|
+
exports.DEFAULT_EVM_GAS_FEE = '21000'; // Standard EVM transfer gas fee
|
|
30
|
+
exports.INPUT_FEE = '100000'; // 100K nanoFLR per input (FlareJS standard)
|
|
31
|
+
exports.OUTPUT_FEE = '50000'; // 50K nanoFLR per output (FlareJS standard)
|
|
32
|
+
exports.MINIMUM_FEE = '1000000'; // 1M nanoFLR minimum fee
|
|
33
|
+
// Validator constants
|
|
34
|
+
exports.MIN_DELEGATION_FEE_BASIS_POINTS = 20000; // 2% minimum delegation fee
|
|
35
|
+
exports.BASIS_POINTS_DIVISOR = 10000; // Divisor to convert basis points to decimal
|
|
36
|
+
exports.PERCENTAGE_MULTIPLIER = 100; // Multiplier to convert decimal to percentage
|
|
37
|
+
// Transaction ID prefix
|
|
38
|
+
exports.TRANSACTION_ID_PREFIX = 'flare-atomic-tx-'; // Prefix for transaction IDs
|
|
39
|
+
// Transaction type constants
|
|
40
|
+
exports.DELEGATOR_TRANSACTION_TYPE = 'PlatformVM.AddDelegatorTx'; // Delegator transaction type
|
|
41
|
+
// Delegator type constants
|
|
42
|
+
exports.PRIMARY_DELEGATOR_TYPE = 'primary'; // Primary delegator type
|
|
43
|
+
exports.DELEGATOR_STAKE_TYPE = 'delegator'; // Delegator stake type
|
|
44
|
+
exports.SECP256K1_CREDENTIAL_TYPE = 'secp256k1fx.Credential'; // SECP256K1 credential type
|
|
45
|
+
exports.STAKE_OUTPUT_TYPE = 'stake'; // Stake output type
|
|
46
|
+
exports.CREDENTIAL_VERSION = '1.0.0'; // Credential version
|
|
47
|
+
// Default values and thresholds
|
|
48
|
+
exports.EMPTY_STRING = ''; // Empty string default
|
|
49
|
+
exports.ZERO_BIGINT = 0n; // Zero BigInt default
|
|
50
|
+
exports.ZERO_NUMBER = 0; // Zero number default
|
|
51
|
+
exports.DEFAULT_THRESHOLD = 1; // Default signature threshold
|
|
52
|
+
exports.DEFAULT_LOCKTIME = 0n; // Default locktime
|
|
53
|
+
exports.MEMO_BUFFER_SIZE = 0; // Empty memo buffer size
|
|
54
|
+
exports.FIRST_ADDRESS_INDEX = 0; // First address index
|
|
14
55
|
// Regex patterns
|
|
15
56
|
exports.ADDRESS_REGEX = /^(^P||NodeID)-[a-zA-Z0-9]+$/;
|
|
16
57
|
exports.HEX_REGEX = /^(0x){0,1}([0-9a-f])+$/i;
|
|
17
|
-
|
|
58
|
+
// Hex pattern components for building dynamic regexes
|
|
59
|
+
exports.HEX_CHAR_PATTERN = '[0-9a-fA-F]';
|
|
60
|
+
exports.HEX_PATTERN_NO_PREFIX = `^${exports.HEX_CHAR_PATTERN}*$`;
|
|
61
|
+
exports.HEX_PATTERN_WITH_PREFIX = `^0x${exports.HEX_CHAR_PATTERN}`;
|
|
62
|
+
// Network and buffer constants
|
|
63
|
+
exports.DEFAULT_NETWORK_ID = 0; // Default network ID
|
|
64
|
+
exports.FLARE_MAINNET_NETWORK_ID = 1; // Flare mainnet network ID
|
|
65
|
+
exports.FLARE_TESTNET_NETWORK_ID = 5; // Flare testnet network ID
|
|
66
|
+
exports.EMPTY_BUFFER_SIZE = 0; // Empty buffer allocation size
|
|
67
|
+
exports.HEX_PREFIX = '0x'; // Hex prefix
|
|
68
|
+
exports.HEX_PREFIX_LENGTH = 2; // Length of hex prefix
|
|
69
|
+
exports.DECIMAL_RADIX = 10; // Decimal radix for parseInt
|
|
70
|
+
exports.SIGNING_METHOD = 'secp256k1'; // Default signing method
|
|
71
|
+
exports.AMOUNT_STRING_ZERO = '0'; // Zero amount as string
|
|
72
|
+
exports.FIRST_ARRAY_INDEX = 0; // First array index
|
|
73
|
+
exports.MAINNET_TYPE = 'mainnet'; // Mainnet type string
|
|
74
|
+
// Transaction type constants for export
|
|
75
|
+
exports.EXPORT_TRANSACTION_TYPE = 'PlatformVM.ExportTx'; // Export transaction type
|
|
76
|
+
// Error messages
|
|
77
|
+
exports.ERROR_AMOUNT_POSITIVE = 'Amount must be positive';
|
|
78
|
+
exports.ERROR_CREDENTIALS_ARRAY = 'Credentials must be an array';
|
|
79
|
+
exports.ERROR_UTXOS_REQUIRED = 'UTXOs are required for creating inputs and outputs';
|
|
80
|
+
exports.ERROR_SIGNATURES_ARRAY = 'Signatures must be an array';
|
|
81
|
+
exports.ERROR_SIGNATURES_EMPTY = 'Signatures array cannot be empty';
|
|
82
|
+
exports.ERROR_INVALID_PRIVATE_KEY = 'Invalid private key format';
|
|
83
|
+
exports.ERROR_UTXOS_REQUIRED_BUILD = 'UTXOs are required for transaction building';
|
|
84
|
+
exports.ERROR_ENHANCED_BUILD_FAILED = 'Enhanced FlareJS transaction building failed';
|
|
85
|
+
exports.ERROR_ENHANCED_PARSE_FAILED = 'Enhanced FlareJS transaction parsing failed';
|
|
86
|
+
exports.ERROR_FLAREJS_SIGNING_FAILED = 'FlareJS signing failed';
|
|
87
|
+
exports.ERROR_CREATE_CREDENTIAL_FAILED = 'Failed to create credential';
|
|
88
|
+
exports.ERROR_UNKNOWN = 'unknown error';
|
|
89
|
+
exports.ERROR_EXPORT_NOT_IMPLEMENTED = 'Flare P-chain export transaction build not implemented';
|
|
90
|
+
exports.ERROR_DESTINATION_CHAIN_REQUIRED = 'Destination chain ID must be set for P-chain export';
|
|
91
|
+
exports.ERROR_SOURCE_ADDRESSES_REQUIRED = 'Source addresses must be set for P-chain export';
|
|
92
|
+
exports.ERROR_DESTINATION_ADDRESSES_REQUIRED = 'Destination addresses must be set for P-chain export';
|
|
93
|
+
exports.ERROR_EXPORT_AMOUNT_POSITIVE = 'Export amount must be positive';
|
|
94
|
+
exports.ERROR_TRANSACTION_REQUIRED = 'Transaction is required for initialization';
|
|
95
|
+
exports.ERROR_BLOCKCHAIN_ID_MISMATCH = 'Blockchain ID mismatch';
|
|
96
|
+
exports.ERROR_TRANSACTION_PARSE_FAILED = 'Transaction cannot be parsed or has an unsupported transaction type';
|
|
97
|
+
exports.ERROR_FAILED_INITIALIZE_BUILDER = 'Failed to initialize builder from transaction';
|
|
98
|
+
// Type checking constants
|
|
99
|
+
exports.OBJECT_TYPE_STRING = 'object'; // Object type string for typeof checks
|
|
100
|
+
exports.STRING_TYPE = 'string'; // String type for typeof checks
|
|
101
|
+
exports.NUMBER_TYPE = 'number'; // Number type for typeof checks
|
|
102
|
+
exports.FUNCTION_TYPE = 'function'; // Function type for typeof checks
|
|
103
|
+
exports.BIGINT_TYPE = 'bigint'; // BigInt type for typeof checks
|
|
104
|
+
exports.HEX_ENCODING = 'hex'; // Hex encoding string
|
|
105
|
+
exports.UTF8_ENCODING = 'utf8'; // UTF8 encoding string
|
|
106
|
+
// Chain identifiers
|
|
107
|
+
exports.P_CHAIN = 'P'; // P-chain identifier
|
|
108
|
+
exports.C_CHAIN = 'C'; // C-chain identifier
|
|
109
|
+
exports.X_CHAIN = 'X'; // X-chain identifier
|
|
110
|
+
exports.P_CHAIN_FULL = 'P-chain'; // P-chain full name
|
|
111
|
+
exports.C_CHAIN_FULL = 'C-chain'; // C-chain full name
|
|
112
|
+
exports.X_CHAIN_FULL = 'X-chain'; // X-chain full name
|
|
113
|
+
exports.CHAIN_SUFFIX = '-chain'; // Chain name suffix
|
|
114
|
+
// Atomic transaction prefixes
|
|
115
|
+
exports.FLARE_ATOMIC_PREFIX = 'flare-atomic-'; // Prefix for atomic transaction IDs
|
|
116
|
+
exports.FLARE_ATOMIC_PARSED_PREFIX = 'flare-atomic-parsed-'; // Prefix for parsed transaction IDs
|
|
117
|
+
// Placeholder values
|
|
118
|
+
exports.FLARE_ADDRESS_PLACEHOLDER = 'flare-address-placeholder'; // Placeholder for address conversion
|
|
119
|
+
exports.ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; // Zero address
|
|
120
|
+
exports.HEX_PREFIX_REMOVE = '0x'; // Hex prefix to remove
|
|
121
|
+
exports.PADSTART_CHAR = '0'; // Character used for padding
|
|
122
|
+
// FlareJS transaction types
|
|
123
|
+
exports.PLATFORM_VM_IMPORT_TX = 'PlatformVM.ImportTx'; // Platform VM import transaction
|
|
124
|
+
exports.PLATFORM_VM_ADD_VALIDATOR_TX = 'PlatformVM.AddValidatorTx'; // Platform VM add validator transaction
|
|
125
|
+
exports.IMPORT_TX_TYPE = 'ImportTx'; // Import transaction type
|
|
126
|
+
exports.P_CHAIN_IMPORT_TYPE = 'P-chain-import'; // P-chain import type
|
|
127
|
+
// Transaction types and values
|
|
128
|
+
exports.IMPORT_TYPE = 'import'; // Import transaction type
|
|
129
|
+
exports.EXPORT_TYPE = 'export'; // Export transaction type
|
|
130
|
+
exports.SEND_TYPE = 'send'; // Send transaction type
|
|
131
|
+
exports.IMPORT_C_TYPE = 'import-c'; // Import C-chain transaction type
|
|
132
|
+
exports.VALIDATOR_TYPE = 'validator'; // Validator type
|
|
133
|
+
exports.ADDVALIDATOR_TYPE = 'addValidator'; // Add validator type
|
|
134
|
+
exports.ADD_VALIDATOR_TX_TYPE = 'AddValidatorTx'; // Add validator transaction type
|
|
135
|
+
// Validator transaction type arrays
|
|
136
|
+
exports.VALIDATOR_TRANSACTION_TYPES = [
|
|
137
|
+
exports.PLATFORM_VM_ADD_VALIDATOR_TX,
|
|
138
|
+
exports.ADD_VALIDATOR_TX_TYPE,
|
|
139
|
+
exports.ADDVALIDATOR_TYPE,
|
|
140
|
+
exports.VALIDATOR_TYPE,
|
|
141
|
+
]; // Valid validator transaction types
|
|
142
|
+
// Transfer types
|
|
143
|
+
exports.TRANSFERABLE_INPUT_TYPE = 'TransferableInput'; // Transferable input type
|
|
144
|
+
exports.CREDENTIAL_TYPE = 'Credential'; // Credential type
|
|
145
|
+
exports.SECP256K1_TRANSFER_INPUT_TYPE = 'secp256k1fx.TransferInput'; // SECP256K1 transfer input type
|
|
146
|
+
exports.SECP256K1_TRANSFER_OUTPUT_TYPE = 'secp256k1fx.TransferOutput'; // SECP256K1 transfer output type
|
|
147
|
+
// Property names for object checks
|
|
148
|
+
exports.DESTINATION_CHAIN_PROP = 'destinationChain'; // Destination chain property
|
|
149
|
+
exports.DESTINATION_CHAIN_ID_PROP = 'destinationChainID'; // Destination chain ID property
|
|
150
|
+
exports.EXPORTED_OUTPUTS_PROP = 'exportedOutputs'; // Exported outputs property
|
|
151
|
+
exports.OUTS_PROP = 'outs'; // Outputs property short name
|
|
152
|
+
exports.INPUTS_PROP = 'inputs'; // Inputs property
|
|
153
|
+
exports.INS_PROP = 'ins'; // Inputs property short name
|
|
154
|
+
exports.NETWORK_ID_PROP = 'networkID'; // Network ID property
|
|
155
|
+
exports.NETWORK_ID_PROP_ALT = 'networkId'; // Alternative network ID property
|
|
156
|
+
exports.BLOCKCHAIN_ID_PROP = 'blockchainID'; // Blockchain ID property
|
|
157
|
+
exports.GET_OUTPUT_METHOD = 'getOutput'; // Get output method name
|
|
158
|
+
// UTXO field names
|
|
159
|
+
exports.OUTPUT_ID_FIELD = 'outputID'; // Output ID field
|
|
160
|
+
exports.AMOUNT_FIELD = 'amount'; // Amount field
|
|
161
|
+
exports.TXID_FIELD = 'txid'; // Transaction ID field
|
|
162
|
+
exports.OUTPUT_IDX_FIELD = 'outputidx'; // Output index field
|
|
163
|
+
// Transaction explanation field names
|
|
164
|
+
exports.ID_FIELD = 'id'; // ID field name
|
|
165
|
+
exports.OUTPUT_AMOUNT_FIELD = 'outputAmount'; // Output amount field
|
|
166
|
+
exports.CHANGE_AMOUNT_FIELD = 'changeAmount'; // Change amount field
|
|
167
|
+
exports.OUTPUTS_FIELD = 'outputs'; // Outputs field
|
|
168
|
+
exports.CHANGE_OUTPUTS_FIELD = 'changeOutputs'; // Change outputs field
|
|
169
|
+
exports.FEE_FIELD = 'fee'; // Fee field
|
|
170
|
+
exports.TYPE_FIELD = 'type'; // Type field
|
|
171
|
+
// Signature and hash methods
|
|
172
|
+
exports.SECP256K1_SIG_TYPE = 'secp256k1'; // SECP256K1 signature type
|
|
173
|
+
exports.DER_FORMAT = 'der'; // DER format
|
|
174
|
+
exports.SHA256_HASH = 'sha256'; // SHA256 hash function
|
|
175
|
+
exports.RECOVERY_KEY_METHOD = 'recovery-key'; // Recovery key signing method
|
|
176
|
+
exports.NORMAL_MODE = 'normal'; // Normal mode
|
|
177
|
+
exports.RECOVERY_MODE = 'recovery'; // Recovery mode
|
|
178
|
+
// Version strings
|
|
179
|
+
exports.RECOVERY_VERSION = '1.0.0'; // Recovery version
|
|
180
|
+
exports.SIGNATURE_VERSION = '1.0.0'; // Signature version
|
|
181
|
+
// Numeric radix
|
|
182
|
+
exports.HEX_RADIX = 16; // Hexadecimal radix
|
|
183
|
+
// Transaction type identifiers (additional)
|
|
184
|
+
exports.ADD_PERMISSIONLESS_VALIDATOR_TYPE = 'addPermissionlessValidator'; // Add permissionless validator type
|
|
185
|
+
// Display order for transaction explanations
|
|
186
|
+
exports.DISPLAY_ORDER_BASE = [
|
|
187
|
+
'id',
|
|
188
|
+
'inputs',
|
|
189
|
+
'outputAmount',
|
|
190
|
+
'changeAmount',
|
|
191
|
+
'outputs',
|
|
192
|
+
'changeOutputs',
|
|
193
|
+
'fee',
|
|
194
|
+
'type',
|
|
195
|
+
]; // Base display order
|
|
196
|
+
exports.MEMO_FIELD = 'memo'; // Memo field name
|
|
197
|
+
exports.REWARD_ADDRESSES_FIELD = 'rewardAddresses'; // Reward addresses field
|
|
198
|
+
exports.SOURCE_CHAIN_FIELD = 'sourceChain'; // Source chain field
|
|
199
|
+
exports.DESTINATION_CHAIN_FIELD = 'destinationChain'; // Destination chain field
|
|
200
|
+
// Asset and network constants
|
|
201
|
+
exports.FLR_ASSET_ID = 'FLR'; // Default FLR asset ID
|
|
202
|
+
// Placeholder constants for development
|
|
203
|
+
exports.FLARE_TX_HEX_PLACEHOLDER = 'flare-tx-hex-placeholder'; // Transaction hex placeholder
|
|
204
|
+
exports.FLARE_SIGNABLE_PAYLOAD = 'flare-signable-payload'; // Signable payload placeholder
|
|
205
|
+
exports.FLARE_TRANSACTION_ID_PLACEHOLDER = 'flare-transaction-id-placeholder'; // Transaction ID placeholder
|
|
206
|
+
exports.PLACEHOLDER_NODE_ID = 'placeholder-node-id'; // Node ID placeholder
|
|
207
|
+
// Chain identifiers (short forms)
|
|
208
|
+
exports.P_CHAIN_SHORT = 'P'; // P-chain short name
|
|
209
|
+
exports.X_CHAIN_SHORT = 'X'; // X-chain short name
|
|
210
|
+
// Valid source chains for imports
|
|
211
|
+
exports.VALID_IMPORT_SOURCE_CHAINS = [exports.P_CHAIN_SHORT, exports.P_CHAIN_FULL, exports.X_CHAIN_SHORT, exports.X_CHAIN_FULL]; // Valid source chains for C-chain imports
|
|
212
|
+
// Valid P-chain import types
|
|
213
|
+
exports.VALID_P_CHAIN_IMPORT_TYPES = [exports.PLATFORM_VM_IMPORT_TX, exports.IMPORT_TX_TYPE, exports.IMPORT_TYPE, exports.P_CHAIN_IMPORT_TYPE]; // Valid P-chain import types
|
|
214
|
+
// Error messages for transactionBuilder
|
|
215
|
+
exports.ERROR_NETWORK_ID_MISMATCH = 'Network ID mismatch'; // Network ID validation error
|
|
216
|
+
exports.ERROR_BLOCKCHAIN_ID_MISMATCH_BUILDER = 'Blockchain ID mismatch'; // Blockchain ID validation error
|
|
217
|
+
exports.ERROR_INVALID_THRESHOLD = 'Invalid transaction: threshold must be set to 2'; // Threshold validation error
|
|
218
|
+
exports.ERROR_INVALID_LOCKTIME = 'Invalid transaction: locktime must be 0 or higher'; // Locktime validation error
|
|
219
|
+
exports.ERROR_UTXOS_EMPTY_ARRAY = "Utxos can't be empty array"; // Empty UTXOS array error
|
|
220
|
+
exports.ERROR_UTXOS_MISSING_FIELD = 'Utxos required'; // Missing UTXO field error
|
|
221
|
+
exports.ERROR_FROM_ADDRESSES_REQUIRED = 'from addresses are required'; // Missing from addresses error
|
|
222
|
+
exports.ERROR_UTXOS_REQUIRED_BUILDER = 'utxos are required'; // Missing UTXOs error
|
|
223
|
+
exports.ERROR_PARSE_RAW_TRANSACTION = 'Failed to parse raw transaction'; // Raw transaction parsing error
|
|
224
|
+
exports.ERROR_UNKNOWN_PARSING = 'Unknown error'; // Unknown parsing error
|
|
225
|
+
// UTXO field validation
|
|
226
|
+
exports.UTXO_REQUIRED_FIELDS = ['outputID', 'amount', 'txid', 'outputidx']; // Required UTXO fields
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdFQUF3RTtBQUN4RSx3RkFBd0Y7Ozs7OztBQUUzRSxRQUFBLHVCQUF1QixHQUFHLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztBQUN6RSxRQUFBLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxDQUFDLG1EQUFtRDtBQUM5RSxRQUFBLDRCQUE0QixHQUFHLEVBQUUsQ0FBQyxDQUFDLG9DQUFvQztBQUN2RSxRQUFBLDhCQUE4QixHQUFHLEdBQUcsQ0FBQyxDQUFDLHNDQUFzQztBQUM1RSxRQUFBLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtBQUNwRCxRQUFBLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztBQUN2RSxRQUFBLDZCQUE2QixHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFBLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztBQUU3RSxrQ0FBa0M7QUFDckIsUUFBQSxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUMsOERBQThEO0FBQ3BGLFFBQUEseUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscURBQXFEO0FBQ3JGLFFBQUEsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUMsa0RBQWtEO0FBQy9FLFFBQUEsMEJBQTBCLEdBQUcsRUFBRSxDQUFDLENBQUMsc0NBQXNDO0FBQ3ZFLFFBQUEsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDLENBQUMsMkRBQTJEO0FBQ2xHLFFBQUEsa0NBQWtDLEdBQUcsR0FBRyxDQUFDLENBQUMsNkRBQTZEO0FBQ3ZHLFFBQUEsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLENBQUMsb0RBQW9EO0FBQ2hGLFFBQUEsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUMsK0NBQStDO0FBQ3pFLFFBQUEsbUJBQW1CLEdBQUcsR0FBRyxDQUFD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QUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU2hhcmVkIGNvbnN0YW50cyBmb3IgRmxhcmUgUC1DaGFpbiAoZmxycCkgdXRpbGl0aWVzIGFuZCBrZXkgaGFuZGxpbmcuXG4vLyBDZW50cmFsaXppbmcgYXZvaWRzIG1hZ2ljIG51bWJlcnMgc2NhdHRlcmVkIGFjcm9zcyB1dGlscyBhbmQga2V5UGFpciBpbXBsZW1lbnRhdGlvbnMuXG5cbmV4cG9ydCBjb25zdCBERUNPREVEX0JMT0NLX0lEX0xFTkdUSCA9IDMyOyAvLyBFeHBlY3RlZCBkZWNvZGVkIGJsb2NrIGlkZW50aWZpZXIgbGVuZ3RoXG5leHBvcnQgY29uc3QgU0hPUlRfUFVCX0tFWV9MRU5HVEggPSA1MDsgLy8gUGxhY2Vob2xkZXIgKHBvdGVudGlhbCBDQjU4IGVuY29kZWQgZm9ybSBsZW5ndGgpXG5leHBvcnQgY29uc3QgQ09NUFJFU1NFRF9QVUJMSUNfS0VZX0xFTkdUSCA9IDY2OyAvLyAzMyBieXRlcyAoY29tcHJlc3NlZCkgaGV4IGVuY29kZWRcbmV4cG9ydCBjb25zdCBVTkNPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEggPSAxMzA7IC8vIDY1IGJ5dGVzICh1bmNvbXByZXNzZWQpIGhleCBlbmNvZGVkXG5leHBvcnQgY29uc3QgUkFXX1BSSVZBVEVfS0VZX0xFTkdUSCA9IDY0OyAvLyAzMiBieXRlcyBoZXggZW5jb2RlZFxuZXhwb3J0IGNvbnN0IFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCA9IDY2OyAvLyAzMiBieXRlcyArIGNvbXByZXNzaW9uIGZsYWcgc3VmZml4XG5leHBvcnQgY29uc3QgUFJJVkFURV9LRVlfQ09NUFJFU1NFRF9TVUZGSVggPSAnMDEnO1xuZXhwb3J0IGNvbnN0IE9VVFBVVF9JTkRFWF9IRVhfTEVOR1RIID0gODsgLy8gNCBieXRlcyBzZXJpYWxpemVkIHRvIGhleCBsZW5ndGhcblxuLy8gQXNzZXQgYW5kIHRyYW5zYWN0aW9uIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IEFTU0VUX0lEX0xFTkdUSCA9IDMyOyAvLyBBc3NldCBJRCBsZW5ndGggaW4gYnl0ZXMgKHN0YW5kYXJkIGZvciBBVkFYL0ZsYXJlIG5ldHdvcmtzKVxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEggPSA2NDsgLy8gVHJhbnNhY3Rpb24gSUQgbGVuZ3RoIGluIGhleCBjaGFyYWN0ZXJzICgzMiBieXRlcylcbmV4cG9ydCBjb25zdCBQUklWQVRFX0tFWV9IRVhfTEVOR1RIID0gNjQ7IC8vIFByaXZhdGUga2V5IGxlbmd0aCBpbiBoZXggY2hhcmFjdGVycyAoMzIgYnl0ZXMpXG5leHBvcnQgY29uc3QgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEggPSA2NTsgLy8gU0VDUDI1NksxIHNpZ25hdHVyZSBsZW5ndGggaW4gYnl0ZXNcbmV4cG9ydCBjb25zdCBCTFNfUFVCTElDX0tFWV9DT01QUkVTU0VEX0xFTkdUSCA9IDk2OyAvLyBCTFMgcHVibGljIGtleSBjb21wcmVzc2VkIGxlbmd0aCBpbiBoZXggY2hhcnMgKDQ4IGJ5dGVzKVxuZXhwb3J0IGNvbnN0IEJMU19QVUJMSUNfS0VZX1VOQ09NUFJFU1NFRF9MRU5HVEggPSAxOTI7IC8vIEJMUyBwdWJsaWMga2V5IHVuY29tcHJlc3NlZCBsZW5ndGggaW4gaGV4IGNoYXJzICg5NiBieXRlcylcbmV4cG9ydCBjb25zdCBCTFNfU0lHTkFUVVJFX0xFTkdUSCA9IDE5MjsgLy8gQkxTIHNpZ25hdHVyZSBsZW5ndGggaW4gaGV4IGNoYXJhY3RlcnMgKDk2IGJ5dGVzKVxuZXhwb3J0IGNvbnN0IENIQUlOX0lEX0hFWF9MRU5HVEggPSA2NDsgLy8gQ2hhaW4gSUQgbGVuZ3RoIGluIGhleCBjaGFyYWN0ZXJzICgzMiBieXRlcylcbmV4cG9ydCBjb25zdCBNQVhfQ0hBSU5fSURfTEVOR1RIID0gMTI4OyAvLyBNYXhpbXVtIGNoYWluIElEIHN0cmluZyBsZW5ndGhcblxuLy8gRmVlIGNvbnN0YW50cyAoaW4gbmFub0ZMUilcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfRkVFID0gJzEwMDAwMDAnOyAvLyAxTSBuYW5vRkxSIGRlZmF1bHQgYmFzZSBmZWVcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VWTV9HQVNfRkVFID0gJzIxMDAwJzsgLy8gU3RhbmRhcmQgRVZNIHRyYW5zZmVyIGdhcyBmZWVcbmV4cG9ydCBjb25zdCBJTlBVVF9GRUUgPSAnMTAwMDAwJzsgLy8gMTAwSyBuYW5vRkxSIHBlciBpbnB1dCAoRmxhcmVKUyBzdGFuZGFyZClcbmV4cG9ydCBjb25zdCBPVVRQVVRfRkVFID0gJzUwMDAwJzsgLy8gNTBLIG5hbm9GTFIgcGVyIG91dHB1dCAoRmxhcmVKUyBzdGFuZGFyZClcbmV4cG9ydCBjb25zdCBNSU5JTVVNX0ZFRSA9ICcxMDAwMDAwJzsgLy8gMU0gbmFub0ZMUiBtaW5pbXVtIGZlZVxuXG4vLyBWYWxpZGF0b3IgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgTUlOX0RFTEVHQVRJT05fRkVFX0JBU0lTX1BPSU5UUyA9IDIwMDAwOyAvLyAyJSBtaW5pbXVtIGRlbGVnYXRpb24gZmVlXG5leHBvcnQgY29uc3QgQkFTSVNfUE9JTlRTX0RJVklTT1IgPSAxMDAwMDsgLy8gRGl2aXNvciB0byBjb252ZXJ0IGJhc2lzIHBvaW50cyB0byBkZWNpbWFsXG5leHBvcnQgY29uc3QgUEVSQ0VOVEFHRV9NVUxUSVBMSUVSID0gMTAwOyAvLyBNdWx0aXBsaWVyIHRvIGNvbnZlcnQgZGVjaW1hbCB0byBwZXJjZW50YWdlXG5cbi8vIFRyYW5zYWN0aW9uIElEIHByZWZpeFxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0lEX1BSRUZJWCA9ICdmbGFyZS1hdG9taWMtdHgtJzsgLy8gUHJlZml4IGZvciB0cmFuc2FjdGlvbiBJRHNcblxuLy8gVHJhbnNhY3Rpb24gdHlwZSBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBERUxFR0FUT1JfVFJBTlNBQ1RJT05fVFlQRSA9ICdQbGF0Zm9ybVZNLkFkZERlbGVnYXRvclR4JzsgLy8gRGVsZWdhdG9yIHRyYW5zYWN0aW9uIHR5cGVcblxuLy8gRGVsZWdhdG9yIHR5cGUgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgUFJJTUFSWV9ERUxFR0FUT1JfVFlQRSA9ICdwcmltYXJ5JzsgLy8gUHJpbWFyeSBkZWxlZ2F0b3IgdHlwZVxuZXhwb3J0IGNvbnN0IERFTEVHQVRPUl9TVEFLRV9UWVBFID0gJ2RlbGVnYXRvcic7IC8vIERlbGVnYXRvciBzdGFrZSB0eXBlXG5leHBvcnQgY29uc3QgU0VDUDI1NksxX0NSRURFTlRJQUxfVFlQRSA9ICdzZWNwMjU2azFmeC5DcmVkZW50aWFsJzsgLy8gU0VDUDI1NksxIGNyZWRlbnRpYWwgdHlwZVxuZXhwb3J0IGNvbnN0IFNUQUtFX09VVFBVVF9UWVBFID0gJ3N0YWtlJzsgLy8gU3Rha2Ugb3V0cHV0IHR5cGVcbmV4cG9ydCBjb25zdCBDUkVERU5USUFMX1ZFUlNJT04gPSAnMS4wLjAnOyAvLyBDcmVkZW50aWFsIHZlcnNpb25cblxuLy8gRGVmYXVsdCB2YWx1ZXMgYW5kIHRocmVzaG9sZHNcbmV4cG9ydCBjb25zdCBFTVBUWV9TVFJJTkcgPSAnJzsgLy8gRW1wdHkgc3RyaW5nIGRlZmF1bHRcbmV4cG9ydCBjb25zdCBaRVJPX0JJR0lOVCA9IDBuOyAvLyBaZXJvIEJpZ0ludCBkZWZhdWx0XG5leHBvcnQgY29uc3QgWkVST19OVU1CRVIgPSAwOyAvLyBaZXJvIG51bWJlciBkZWZhdWx0XG5leHBvcnQgY29uc3QgREVGQVVMVF9USFJFU0hPTEQgPSAxOyAvLyBEZWZhdWx0IHNpZ25hdHVyZSB0aHJlc2hvbGRcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQ0tUSU1FID0gMG47IC8vIERlZmF1bHQgbG9ja3RpbWVcbmV4cG9ydCBjb25zdCBNRU1PX0JVRkZFUl9TSVpFID0gMDsgLy8gRW1wdHkgbWVtbyBidWZmZXIgc2l6ZVxuZXhwb3J0IGNvbnN0IEZJUlNUX0FERFJFU1NfSU5ERVggPSAwOyAvLyBGaXJzdCBhZGRyZXNzIGluZGV4XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5leHBvcnQgY29uc3QgQUREUkVTU19SRUdFWCA9IC9eKF5QfHxOb2RlSUQpLVthLXpBLVowLTldKyQvO1xuZXhwb3J0IGNvbnN0IEhFWF9SRUdFWCA9IC9eKDB4KXswLDF9KFswLTlhLWZdKSskL2k7XG5cbi8vIEhleCBwYXR0ZXJuIGNvbXBvbmVudHMgZm9yIGJ1aWxkaW5nIGR5bmFtaWMgcmVnZXhlc1xuZXhwb3J0IGNvbnN0IEhFWF9DSEFSX1BBVFRFUk4gPSAnWzAtOWEtZkEtRl0nO1xuZXhwb3J0IGNvbnN0IEhFWF9QQVRURVJOX05PX1BSRUZJWCA9IGBeJHtIRVhfQ0hBUl9QQVRURVJOfSokYDtcbmV4cG9ydCBjb25zdCBIRVhfUEFUVEVSTl9XSVRIX1BSRUZJWCA9IGBeMHgke0hFWF9DSEFSX1BBVFRFUk59YDtcblxuLy8gTmV0d29yayBhbmQgYnVmZmVyIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkVUV09SS19JRCA9IDA7IC8vIERlZmF1bHQgbmV0d29yayBJRFxuZXhwb3J0IGNvbnN0IEZMQVJFX01BSU5ORVRfTkVUV09SS19JRCA9IDE7IC8vIEZsYXJlIG1haW5uZXQgbmV0d29yayBJRFxuZXhwb3J0IGNvbnN0IEZMQVJFX1RFU1RORVRfTkVUV09SS19JRCA9IDU7IC8vIEZsYXJlIHRlc3RuZXQgbmV0d29yayBJRFxuZXhwb3J0IGNvbnN0IEVNUFRZX0JVRkZFUl9TSVpFID0gMDsgLy8gRW1wdHkgYnVmZmVyIGFsbG9jYXRpb24gc2l6ZVxuZXhwb3J0IGNvbnN0IEhFWF9QUkVGSVggPSAnMHgnOyAvLyBIZXggcHJlZml4XG5leHBvcnQgY29uc3QgSEVYX1BSRUZJWF9MRU5HVEggPSAyOyAvLyBMZW5ndGggb2YgaGV4IHByZWZpeFxuZXhwb3J0IGNvbnN0IERFQ0lNQUxfUkFESVggPSAxMDsgLy8gRGVjaW1hbCByYWRpeCBmb3IgcGFyc2VJbnRcbmV4cG9ydCBjb25zdCBTSUdOSU5HX01FVEhPRCA9ICdzZWNwMjU2azEnOyAvLyBEZWZhdWx0IHNpZ25pbmcgbWV0aG9kXG5leHBvcnQgY29uc3QgQU1PVU5UX1NUUklOR19aRVJPID0gJzAnOyAvLyBaZXJvIGFtb3VudCBhcyBzdHJpbmdcbmV4cG9ydCBjb25zdCBGSVJTVF9BUlJBWV9JTkRFWCA9IDA7IC8vIEZpcnN0IGFycmF5IGluZGV4XG5leHBvcnQgY29uc3QgTUFJTk5FVF9UWVBFID0gJ21haW5uZXQnOyAvLyBNYWlubmV0IHR5cGUgc3RyaW5nXG5cbi8vIFRyYW5zYWN0aW9uIHR5cGUgY29uc3RhbnRzIGZvciBleHBvcnRcbmV4cG9ydCBjb25zdCBFWFBPUlRfVFJBTlNBQ1RJT05fVFlQRSA9ICdQbGF0Zm9ybVZNLkV4cG9ydFR4JzsgLy8gRXhwb3J0IHRyYW5zYWN0aW9uIHR5cGVcblxuLy8gRXJyb3IgbWVzc2FnZXNcbmV4cG9ydCBjb25zdCBFUlJPUl9BTU9VTlRfUE9TSVRJVkUgPSAnQW1vdW50IG11c3QgYmUgcG9zaXRpdmUnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZID0gJ0NyZWRlbnRpYWxzIG11c3QgYmUgYW4gYXJyYXknO1xuZXhwb3J0IGNvbnN0IEVSUk9SX1VUWE9TX1JFUVVJUkVEID0gJ1VUWE9zIGFyZSByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzJztcbmV4cG9ydCBjb25zdCBFUlJPUl9TSUdOQVRVUkVTX0FSUkFZID0gJ1NpZ25hdHVyZXMgbXVzdCBiZSBhbiBhcnJheSc7XG5leHBvcnQgY29uc3QgRVJST1JfU0lHTkFUVVJFU19FTVBUWSA9ICdTaWduYXR1cmVzIGFycmF5IGNhbm5vdCBiZSBlbXB0eSc7XG5leHBvcnQgY29uc3QgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSA9ICdJbnZhbGlkIHByaXZhdGUga2V5IGZvcm1hdCc7XG5leHBvcnQgY29uc3QgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQgPSAnVVRYT3MgYXJlIHJlcXVpcmVkIGZvciB0cmFuc2FjdGlvbiBidWlsZGluZyc7XG5leHBvcnQgY29uc3QgRVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEID0gJ0VuaGFuY2VkIEZsYXJlSlMgdHJhbnNhY3Rpb24gYnVpbGRpbmcgZmFpbGVkJztcbmV4cG9ydCBjb25zdCBFUlJPUl9FTkhBTkNFRF9QQVJTRV9GQUlMRUQgPSAnRW5oYW5jZWQgRmxhcmVKUyB0cmFuc2FjdGlvbiBwYXJzaW5nIGZhaWxlZCc7XG5leHBvcnQgY29uc3QgRVJST1JfRkxBUkVKU19TSUdOSU5HX0ZBSUxFRCA9ICdGbGFyZUpTIHNpZ25pbmcgZmFpbGVkJztcbmV4cG9ydCBjb25zdCBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQgPSAnRmFpbGVkIHRvIGNyZWF0ZSBjcmVkZW50aWFsJztcbmV4cG9ydCBjb25zdCBFUlJPUl9VTktOT1dOID0gJ3Vua25vd24gZXJyb3InO1xuZXhwb3J0IGNvbnN0IEVSUk9SX0VYUE9SVF9OT1RfSU1QTEVNRU5URUQgPSAnRmxhcmUgUC1jaGFpbiBleHBvcnQgdHJhbnNhY3Rpb24gYnVpbGQgbm90IGltcGxlbWVudGVkJztcbmV4cG9ydCBjb25zdCBFUlJPUl9ERVNUSU5BVElPTl9DSEFJTl9SRVFVSVJFRCA9ICdEZXN0aW5hdGlvbiBjaGFpbiBJRCBtdXN0IGJlIHNldCBmb3IgUC1jaGFpbiBleHBvcnQnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX1NPVVJDRV9BRERSRVNTRVNfUkVRVUlSRUQgPSAnU291cmNlIGFkZHJlc3NlcyBtdXN0IGJlIHNldCBmb3IgUC1jaGFpbiBleHBvcnQnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX0RFU1RJTkFUSU9OX0FERFJFU1NFU19SRVFVSVJFRCA9ICdEZXN0aW5hdGlvbiBhZGRyZXNzZXMgbXVzdCBiZSBzZXQgZm9yIFAtY2hhaW4gZXhwb3J0JztcbmV4cG9ydCBjb25zdCBFUlJPUl9FWFBPUlRfQU1PVU5UX1BPU0lUSVZFID0gJ0V4cG9ydCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSc7XG5leHBvcnQgY29uc3QgRVJST1JfVFJBTlNBQ1RJT05fUkVRVUlSRUQgPSAnVHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGluaXRpYWxpemF0aW9uJztcbmV4cG9ydCBjb25zdCBFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENIID0gJ0Jsb2NrY2hhaW4gSUQgbWlzbWF0Y2gnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX1RSQU5TQUNUSU9OX1BBUlNFX0ZBSUxFRCA9ICdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJztcbmV4cG9ydCBjb25zdCBFUlJPUl9GQUlMRURfSU5JVElBTElaRV9CVUlMREVSID0gJ0ZhaWxlZCB0byBpbml0aWFsaXplIGJ1aWxkZXIgZnJvbSB0cmFuc2FjdGlvbic7XG5cbi8vIFR5cGUgY2hlY2tpbmcgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgT0JKRUNUX1RZUEVfU1RSSU5HID0gJ29iamVjdCc7IC8vIE9iamVjdCB0eXBlIHN0cmluZyBmb3IgdHlwZW9mIGNoZWNrc1xuZXhwb3J0IGNvbnN0IFNUUklOR19UWVBFID0gJ3N0cmluZyc7IC8vIFN0cmluZyB0eXBlIGZvciB0eXBlb2YgY2hlY2tzXG5leHBvcnQgY29uc3QgTlVNQkVSX1RZUEUgPSAnbnVtYmVyJzsgLy8gTnVtYmVyIHR5cGUgZm9yIHR5cGVvZiBjaGVja3NcbmV4cG9ydCBjb25zdCBGVU5DVElPTl9UWVBFID0gJ2Z1bmN0aW9uJzsgLy8gRnVuY3Rpb24gdHlwZSBmb3IgdHlwZW9mIGNoZWNrc1xuZXhwb3J0IGNvbnN0IEJJR0lOVF9UWVBFID0gJ2JpZ2ludCc7IC8vIEJpZ0ludCB0eXBlIGZvciB0eXBlb2YgY2hlY2tzXG5leHBvcnQgY29uc3QgSEVYX0VOQ09ESU5HID0gJ2hleCc7IC8vIEhleCBlbmNvZGluZyBzdHJpbmdcbmV4cG9ydCBjb25zdCBVVEY4X0VOQ09ESU5HID0gJ3V0ZjgnOyAvLyBVVEY4IGVuY29kaW5nIHN0cmluZ1xuXG4vLyBDaGFpbiBpZGVudGlmaWVyc1xuZXhwb3J0IGNvbnN0IFBfQ0hBSU4gPSAnUCc7IC8vIFAtY2hhaW4gaWRlbnRpZmllclxuZXhwb3J0IGNvbnN0IENfQ0hBSU4gPSAnQyc7IC8vIEMtY2hhaW4gaWRlbnRpZmllclxuZXhwb3J0IGNvbnN0IFhfQ0hBSU4gPSAnWCc7IC8vIFgtY2hhaW4gaWRlbnRpZmllclxuZXhwb3J0IGNvbnN0IFBfQ0hBSU5fRlVMTCA9ICdQLWNoYWluJzsgLy8gUC1jaGFpbiBmdWxsIG5hbWVcbmV4cG9ydCBjb25zdCBDX0NIQUlOX0ZVTEwgPSAnQy1jaGFpbic7IC8vIEMtY2hhaW4gZnVsbCBuYW1lXG5leHBvcnQgY29uc3QgWF9DSEFJTl9GVUxMID0gJ1gtY2hhaW4nOyAvLyBYLWNoYWluIGZ1bGwgbmFtZVxuZXhwb3J0IGNvbnN0IENIQUlOX1NVRkZJWCA9ICctY2hhaW4nOyAvLyBDaGFpbiBuYW1lIHN1ZmZpeFxuXG4vLyBBdG9taWMgdHJhbnNhY3Rpb24gcHJlZml4ZXNcbmV4cG9ydCBjb25zdCBGTEFSRV9BVE9NSUNfUFJFRklYID0gJ2ZsYXJlLWF0b21pYy0nOyAvLyBQcmVmaXggZm9yIGF0b21pYyB0cmFuc2FjdGlvbiBJRHNcbmV4cG9ydCBjb25zdCBGTEFSRV9BVE9NSUNfUEFSU0VEX1BSRUZJWCA9ICdmbGFyZS1hdG9taWMtcGFyc2VkLSc7IC8vIFByZWZpeCBmb3IgcGFyc2VkIHRyYW5zYWN0aW9uIElEc1xuXG4vLyBQbGFjZWhvbGRlciB2YWx1ZXNcbmV4cG9ydCBjb25zdCBGTEFSRV9BRERSRVNTX1BMQUNFSE9MREVSID0gJ2ZsYXJlLWFkZHJlc3MtcGxhY2Vob2xkZXInOyAvLyBQbGFjZWhvbGRlciBmb3IgYWRkcmVzcyBjb252ZXJzaW9uXG5leHBvcnQgY29uc3QgWkVST19BRERSRVNTID0gJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7IC8vIFplcm8gYWRkcmVzc1xuZXhwb3J0IGNvbnN0IEhFWF9QUkVGSVhfUkVNT1ZFID0gJzB4JzsgLy8gSGV4IHByZWZpeCB0byByZW1vdmVcbmV4cG9ydCBjb25zdCBQQURTVEFSVF9DSEFSID0gJzAnOyAvLyBDaGFyYWN0ZXIgdXNlZCBmb3IgcGFkZGluZ1xuXG4vLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHR5cGVzXG5leHBvcnQgY29uc3QgUExBVEZPUk1fVk1fSU1QT1JUX1RYID0gJ1BsYXRmb3JtVk0uSW1wb3J0VHgnOyAvLyBQbGF0Zm9ybSBWTSBpbXBvcnQgdHJhbnNhY3Rpb25cbmV4cG9ydCBjb25zdCBQTEFURk9STV9WTV9BRERfVkFMSURBVE9SX1RYID0gJ1BsYXRmb3JtVk0uQWRkVmFsaWRhdG9yVHgnOyAvLyBQbGF0Zm9ybSBWTSBhZGQgdmFsaWRhdG9yIHRyYW5zYWN0aW9uXG5leHBvcnQgY29uc3QgSU1QT1JUX1RYX1RZUEUgPSAnSW1wb3J0VHgnOyAvLyBJbXBvcnQgdHJhbnNhY3Rpb24gdHlwZVxuZXhwb3J0IGNvbnN0IFBfQ0hBSU5fSU1QT1JUX1RZUEUgPSAnUC1jaGFpbi1pbXBvcnQnOyAvLyBQLWNoYWluIGltcG9ydCB0eXBlXG5cbi8vIFRyYW5zYWN0aW9uIHR5cGVzIGFuZCB2YWx1ZXNcbmV4cG9ydCBjb25zdCBJTVBPUlRfVFlQRSA9ICdpbXBvcnQnOyAvLyBJbXBvcnQgdHJhbnNhY3Rpb24gdHlwZVxuZXhwb3J0IGNvbnN0IEVYUE9SVF9UWVBFID0gJ2V4cG9ydCc7IC8vIEV4cG9ydCB0cmFuc2FjdGlvbiB0eXBlXG5leHBvcnQgY29uc3QgU0VORF9UWVBFID0gJ3NlbmQnOyAvLyBTZW5kIHRyYW5zYWN0aW9uIHR5cGVcbmV4cG9ydCBjb25zdCBJTVBPUlRfQ19UWVBFID0gJ2ltcG9ydC1jJzsgLy8gSW1wb3J0IEMtY2hhaW4gdHJhbnNhY3Rpb24gdHlwZVxuZXhwb3J0IGNvbnN0IFZBTElEQVRPUl9UWVBFID0gJ3ZhbGlkYXRvcic7IC8vIFZhbGlkYXRvciB0eXBlXG5leHBvcnQgY29uc3QgQUREVkFMSURBVE9SX1RZUEUgPSAnYWRkVmFsaWRhdG9yJzsgLy8gQWRkIHZhbGlkYXRvciB0eXBlXG5leHBvcnQgY29uc3QgQUREX1ZBTElEQVRPUl9UWF9UWVBFID0gJ0FkZFZhbGlkYXRvclR4JzsgLy8gQWRkIHZhbGlkYXRvciB0cmFuc2FjdGlvbiB0eXBlXG5cbi8vIFZhbGlkYXRvciB0cmFuc2FjdGlvbiB0eXBlIGFycmF5c1xuZXhwb3J0IGNvbnN0IFZBTElEQVRPUl9UUkFOU0FDVElPTl9UWVBFUyA9IFtcbiAgUExBVEZPUk1fVk1fQUREX1ZBTElEQVRPUl9UWCxcbiAgQUREX1ZBTElEQVRPUl9UWF9UWVBFLFxuICBBRERWQUxJREFUT1JfVFlQRSxcbiAgVkFMSURBVE9SX1RZUEUsXG5dOyAvLyBWYWxpZCB2YWxpZGF0b3IgdHJhbnNhY3Rpb24gdHlwZXNcblxuLy8gVHJhbnNmZXIgdHlwZXNcbmV4cG9ydCBjb25zdCBUUkFOU0ZFUkFCTEVfSU5QVVRfVFlQRSA9ICdUcmFuc2ZlcmFibGVJbnB1dCc7IC8vIFRyYW5zZmVyYWJsZSBpbnB1dCB0eXBlXG5leHBvcnQgY29uc3QgQ1JFREVOVElBTF9UWVBFID0gJ0NyZWRlbnRpYWwnOyAvLyBDcmVkZW50aWFsIHR5cGVcbmV4cG9ydCBjb25zdCBTRUNQMjU2SzFfVFJBTlNGRVJfSU5QVVRfVFlQRSA9ICdzZWNwMjU2azFmeC5UcmFuc2ZlcklucHV0JzsgLy8gU0VDUDI1NksxIHRyYW5zZmVyIGlucHV0IHR5cGVcbmV4cG9ydCBjb25zdCBTRUNQMjU2SzFfVFJBTlNGRVJfT1VUUFVUX1RZUEUgPSAnc2VjcDI1NmsxZnguVHJhbnNmZXJPdXRwdXQnOyAvLyBTRUNQMjU2SzEgdHJhbnNmZXIgb3V0cHV0IHR5cGVcblxuLy8gUHJvcGVydHkgbmFtZXMgZm9yIG9iamVjdCBjaGVja3NcbmV4cG9ydCBjb25zdCBERVNUSU5BVElPTl9DSEFJTl9QUk9QID0gJ2Rlc3RpbmF0aW9uQ2hhaW4nOyAvLyBEZXN0aW5hdGlvbiBjaGFpbiBwcm9wZXJ0eVxuZXhwb3J0IGNvbnN0IERFU1RJTkFUSU9OX0NIQUlOX0lEX1BST1AgPSAnZGVzdGluYXRpb25DaGFpbklEJzsgLy8gRGVzdGluYXRpb24gY2hhaW4gSUQgcHJvcGVydHlcbmV4cG9ydCBjb25zdCBFWFBPUlRFRF9PVVRQVVRTX1BST1AgPSAnZXhwb3J0ZWRPdXRwdXRzJzsgLy8gRXhwb3J0ZWQgb3V0cHV0cyBwcm9wZXJ0eVxuZXhwb3J0IGNvbnN0IE9VVFNfUFJPUCA9ICdvdXRzJzsgLy8gT3V0cHV0cyBwcm9wZXJ0eSBzaG9ydCBuYW1lXG5leHBvcnQgY29uc3QgSU5QVVRTX1BST1AgPSAnaW5wdXRzJzsgLy8gSW5wdXRzIHByb3BlcnR5XG5leHBvcnQgY29uc3QgSU5TX1BST1AgPSAnaW5zJzsgLy8gSW5wdXRzIHByb3BlcnR5IHNob3J0IG5hbWVcbmV4cG9ydCBjb25zdCBORVRXT1JLX0lEX1BST1AgPSAnbmV0d29ya0lEJzsgLy8gTmV0d29yayBJRCBwcm9wZXJ0eVxuZXhwb3J0IGNvbnN0IE5FVFdPUktfSURfUFJPUF9BTFQgPSAnbmV0d29ya0lkJzsgLy8gQWx0ZXJuYXRpdmUgbmV0d29yayBJRCBwcm9wZXJ0eVxuZXhwb3J0IGNvbnN0IEJMT0NLQ0hBSU5fSURfUFJPUCA9ICdibG9ja2NoYWluSUQnOyAvLyBCbG9ja2NoYWluIElEIHByb3BlcnR5XG5leHBvcnQgY29uc3QgR0VUX09VVFBVVF9NRVRIT0QgPSAnZ2V0T3V0cHV0JzsgLy8gR2V0IG91dHB1dCBtZXRob2QgbmFtZVxuXG4vLyBVVFhPIGZpZWxkIG5hbWVzXG5leHBvcnQgY29uc3QgT1VUUFVUX0lEX0ZJRUxEID0gJ291dHB1dElEJzsgLy8gT3V0cHV0IElEIGZpZWxkXG5leHBvcnQgY29uc3QgQU1PVU5UX0ZJRUxEID0gJ2Ftb3VudCc7IC8vIEFtb3VudCBmaWVsZFxuZXhwb3J0IGNvbnN0IFRYSURfRklFTEQgPSAndHhpZCc7IC8vIFRyYW5zYWN0aW9uIElEIGZpZWxkXG5leHBvcnQgY29uc3QgT1VUUFVUX0lEWF9GSUVMRCA9ICdvdXRwdXRpZHgnOyAvLyBPdXRwdXQgaW5kZXggZmllbGRcblxuLy8gVHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gZmllbGQgbmFtZXNcbmV4cG9ydCBjb25zdCBJRF9GSUVMRCA9ICdpZCc7IC8vIElEIGZpZWxkIG5hbWVcbmV4cG9ydCBjb25zdCBPVVRQVVRfQU1PVU5UX0ZJRUxEID0gJ291dHB1dEFtb3VudCc7IC8vIE91dHB1dCBhbW91bnQgZmllbGRcbmV4cG9ydCBjb25zdCBDSEFOR0VfQU1PVU5UX0ZJRUxEID0gJ2NoYW5nZUFtb3VudCc7IC8vIENoYW5nZSBhbW91bnQgZmllbGRcbmV4cG9ydCBjb25zdCBPVVRQVVRTX0ZJRUxEID0gJ291dHB1dHMnOyAvLyBPdXRwdXRzIGZpZWxkXG5leHBvcnQgY29uc3QgQ0hBTkdFX09VVFBVVFNfRklFTEQgPSAnY2hhbmdlT3V0cHV0cyc7IC8vIENoYW5nZSBvdXRwdXRzIGZpZWxkXG5leHBvcnQgY29uc3QgRkVFX0ZJRUxEID0gJ2ZlZSc7IC8vIEZlZSBmaWVsZFxuZXhwb3J0IGNvbnN0IFRZUEVfRklFTEQgPSAndHlwZSc7IC8vIFR5cGUgZmllbGRcblxuLy8gU2lnbmF0dXJlIGFuZCBoYXNoIG1ldGhvZHNcbmV4cG9ydCBjb25zdCBTRUNQMjU2SzFfU0lHX1RZUEUgPSAnc2VjcDI1NmsxJzsgLy8gU0VDUDI1NksxIHNpZ25hdHVyZSB0eXBlXG5leHBvcnQgY29uc3QgREVSX0ZPUk1BVCA9ICdkZXInOyAvLyBERVIgZm9ybWF0XG5leHBvcnQgY29uc3QgU0hBMjU2X0hBU0ggPSAnc2hhMjU2JzsgLy8gU0hBMjU2IGhhc2ggZnVuY3Rpb25cbmV4cG9ydCBjb25zdCBSRUNPVkVSWV9LRVlfTUVUSE9EID0gJ3JlY292ZXJ5LWtleSc7IC8vIFJlY292ZXJ5IGtleSBzaWduaW5nIG1ldGhvZFxuZXhwb3J0IGNvbnN0IE5PUk1BTF9NT0RFID0gJ25vcm1hbCc7IC8vIE5vcm1hbCBtb2RlXG5leHBvcnQgY29uc3QgUkVDT1ZFUllfTU9ERSA9ICdyZWNvdmVyeSc7IC8vIFJlY292ZXJ5IG1vZGVcblxuLy8gVmVyc2lvbiBzdHJpbmdzXG5leHBvcnQgY29uc3QgUkVDT1ZFUllfVkVSU0lPTiA9ICcxLjAuMCc7IC8vIFJlY292ZXJ5IHZlcnNpb25cbmV4cG9ydCBjb25zdCBTSUdOQVRVUkVfVkVSU0lPTiA9ICcxLjAuMCc7IC8vIFNpZ25hdHVyZSB2ZXJzaW9uXG5cbi8vIE51bWVyaWMgcmFkaXhcbmV4cG9ydCBjb25zdCBIRVhfUkFESVggPSAxNjsgLy8gSGV4YWRlY2ltYWwgcmFkaXhcblxuLy8gVHJhbnNhY3Rpb24gdHlwZSBpZGVudGlmaWVycyAoYWRkaXRpb25hbClcbmV4cG9ydCBjb25zdCBBRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1RZUEUgPSAnYWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3InOyAvLyBBZGQgcGVybWlzc2lvbmxlc3MgdmFsaWRhdG9yIHR5cGVcblxuLy8gRGlzcGxheSBvcmRlciBmb3IgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25zXG5leHBvcnQgY29uc3QgRElTUExBWV9PUkRFUl9CQVNFID0gW1xuICAnaWQnLFxuICAnaW5wdXRzJyxcbiAgJ291dHB1dEFtb3VudCcsXG4gICdjaGFuZ2VBbW91bnQnLFxuICAnb3V0cHV0cycsXG4gICdjaGFuZ2VPdXRwdXRzJyxcbiAgJ2ZlZScsXG4gICd0eXBlJyxcbl07IC8vIEJhc2UgZGlzcGxheSBvcmRlclxuZXhwb3J0IGNvbnN0IE1FTU9fRklFTEQgPSAnbWVtbyc7IC8vIE1lbW8gZmllbGQgbmFtZVxuZXhwb3J0IGNvbnN0IFJFV0FSRF9BRERSRVNTRVNfRklFTEQgPSAncmV3YXJkQWRkcmVzc2VzJzsgLy8gUmV3YXJkIGFkZHJlc3NlcyBmaWVsZFxuZXhwb3J0IGNvbnN0IFNPVVJDRV9DSEFJTl9GSUVMRCA9ICdzb3VyY2VDaGFpbic7IC8vIFNvdXJjZSBjaGFpbiBmaWVsZFxuZXhwb3J0IGNvbnN0IERFU1RJTkFUSU9OX0NIQUlOX0ZJRUxEID0gJ2Rlc3RpbmF0aW9uQ2hhaW4nOyAvLyBEZXN0aW5hdGlvbiBjaGFpbiBmaWVsZFxuXG4vLyBBc3NldCBhbmQgbmV0d29yayBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBGTFJfQVNTRVRfSUQgPSAnRkxSJzsgLy8gRGVmYXVsdCBGTFIgYXNzZXQgSURcblxuLy8gUGxhY2Vob2xkZXIgY29uc3RhbnRzIGZvciBkZXZlbG9wbWVudFxuZXhwb3J0IGNvbnN0IEZMQVJFX1RYX0hFWF9QTEFDRUhPTERFUiA9ICdmbGFyZS10eC1oZXgtcGxhY2Vob2xkZXInOyAvLyBUcmFuc2FjdGlvbiBoZXggcGxhY2Vob2xkZXJcbmV4cG9ydCBjb25zdCBGTEFSRV9TSUdOQUJMRV9QQVlMT0FEID0gJ2ZsYXJlLXNpZ25hYmxlLXBheWxvYWQnOyAvLyBTaWduYWJsZSBwYXlsb2FkIHBsYWNlaG9sZGVyXG5leHBvcnQgY29uc3QgRkxBUkVfVFJBTlNBQ1RJT05fSURfUExBQ0VIT0xERVIgPSAnZmxhcmUtdHJhbnNhY3Rpb24taWQtcGxhY2Vob2xkZXInOyAvLyBUcmFuc2FjdGlvbiBJRCBwbGFjZWhvbGRlclxuZXhwb3J0IGNvbnN0IFBMQUNFSE9MREVSX05PREVfSUQgPSAncGxhY2Vob2xkZXItbm9kZS1pZCc7IC8vIE5vZGUgSUQgcGxhY2Vob2xkZXJcblxuLy8gQ2hhaW4gaWRlbnRpZmllcnMgKHNob3J0IGZvcm1zKVxuZXhwb3J0IGNvbnN0IFBfQ0hBSU5fU0hPUlQgPSAnUCc7IC8vIFAtY2hhaW4gc2hvcnQgbmFtZVxuZXhwb3J0IGNvbnN0IFhfQ0hBSU5fU0hPUlQgPSAnWCc7IC8vIFgtY2hhaW4gc2hvcnQgbmFtZVxuXG4vLyBWYWxpZCBzb3VyY2UgY2hhaW5zIGZvciBpbXBvcnRzXG5leHBvcnQgY29uc3QgVkFMSURfSU1QT1JUX1NPVVJDRV9DSEFJTlMgPSBbUF9DSEFJTl9TSE9SVCwgUF9DSEFJTl9GVUxMLCBYX0NIQUlOX1NIT1JULCBYX0NIQUlOX0ZVTExdOyAvLyBWYWxpZCBzb3VyY2UgY2hhaW5zIGZvciBDLWNoYWluIGltcG9ydHNcblxuLy8gVmFsaWQgUC1jaGFpbiBpbXBvcnQgdHlwZXNcbmV4cG9ydCBjb25zdCBWQUxJRF9QX0NIQUlOX0lNUE9SVF9UWVBFUyA9IFtQTEFURk9STV9WTV9JTVBPUlRfVFgsIElNUE9SVF9UWF9UWVBFLCBJTVBPUlRfVFlQRSwgUF9DSEFJTl9JTVBPUlRfVFlQRV07IC8vIFZhbGlkIFAtY2hhaW4gaW1wb3J0IHR5cGVzXG5cbi8vIEVycm9yIG1lc3NhZ2VzIGZvciB0cmFuc2FjdGlvbkJ1aWxkZXJcbmV4cG9ydCBjb25zdCBFUlJPUl9ORVRXT1JLX0lEX01JU01BVENIID0gJ05ldHdvcmsgSUQgbWlzbWF0Y2gnOyAvLyBOZXR3b3JrIElEIHZhbGlkYXRpb24gZXJyb3JcbmV4cG9ydCBjb25zdCBFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENIX0JVSUxERVIgPSAnQmxvY2tjaGFpbiBJRCBtaXNtYXRjaCc7IC8vIEJsb2NrY2hhaW4gSUQgdmFsaWRhdGlvbiBlcnJvclxuZXhwb3J0IGNvbnN0IEVSUk9SX0lOVkFMSURfVEhSRVNIT0xEID0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IHRocmVzaG9sZCBtdXN0IGJlIHNldCB0byAyJzsgLy8gVGhyZXNob2xkIHZhbGlkYXRpb24gZXJyb3JcbmV4cG9ydCBjb25zdCBFUlJPUl9JTlZBTElEX0xPQ0tUSU1FID0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInOyAvLyBMb2NrdGltZSB2YWxpZGF0aW9uIGVycm9yXG5leHBvcnQgY29uc3QgRVJST1JfVVRYT1NfRU1QVFlfQVJSQVkgPSBcIlV0eG9zIGNhbid0IGJlIGVtcHR5IGFycmF5XCI7IC8vIEVtcHR5IFVUWE9TIGFycmF5IGVycm9yXG5leHBvcnQgY29uc3QgRVJST1JfVVRYT1NfTUlTU0lOR19GSUVMRCA9ICdVdHhvcyByZXF1aXJlZCc7IC8vIE1pc3NpbmcgVVRYTyBmaWVsZCBlcnJvclxuZXhwb3J0IGNvbnN0IEVSUk9SX0ZST01fQUREUkVTU0VTX1JFUVVJUkVEID0gJ2Zyb20gYWRkcmVzc2VzIGFyZSByZXF1aXJlZCc7IC8vIE1pc3NpbmcgZnJvbSBhZGRyZXNzZXMgZXJyb3JcbmV4cG9ydCBjb25zdCBFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMREVSID0gJ3V0eG9zIGFyZSByZXF1aXJlZCc7IC8vIE1pc3NpbmcgVVRYT3MgZXJyb3JcbmV4cG9ydCBjb25zdCBFUlJPUl9QQVJTRV9SQVdfVFJBTlNBQ1RJT04gPSAnRmFpbGVkIHRvIHBhcnNlIHJhdyB0cmFuc2FjdGlvbic7IC8vIFJhdyB0cmFuc2FjdGlvbiBwYXJzaW5nIGVycm9yXG5leHBvcnQgY29uc3QgRVJST1JfVU5LTk9XTl9QQVJTSU5HID0gJ1Vua25vd24gZXJyb3InOyAvLyBVbmtub3duIHBhcnNpbmcgZXJyb3JcblxuLy8gVVRYTyBmaWVsZCB2YWxpZGF0aW9uXG5leHBvcnQgY29uc3QgVVRYT19SRVFVSVJFRF9GSUVMRFMgPSBbJ291dHB1dElEJywgJ2Ftb3VudCcsICd0eGlkJywgJ291dHB1dGlkeCddOyAvLyBSZXF1aXJlZCBVVFhPIGZpZWxkc1xuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
4
|
+
import { Tx } from './iface';
|
|
5
|
+
export declare class DelegatorTxBuilder extends AtomicTransactionBuilder {
|
|
6
|
+
protected _nodeID: string;
|
|
7
|
+
protected _startTime: bigint;
|
|
8
|
+
protected _endTime: bigint;
|
|
9
|
+
protected _stakeAmount: bigint;
|
|
10
|
+
/**
|
|
11
|
+
* @param coinConfig
|
|
12
|
+
*/
|
|
13
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
14
|
+
/**
|
|
15
|
+
* get transaction type
|
|
16
|
+
* @protected
|
|
17
|
+
*/
|
|
18
|
+
protected get transactionType(): TransactionType;
|
|
19
|
+
/**
|
|
20
|
+
* Set the node ID for delegation
|
|
21
|
+
* @param nodeID - The node ID to delegate to
|
|
22
|
+
*/
|
|
23
|
+
nodeID(nodeID: string): this;
|
|
24
|
+
/**
|
|
25
|
+
* Set the start time for delegation
|
|
26
|
+
* @param startTime - Unix timestamp for when delegation starts
|
|
27
|
+
*/
|
|
28
|
+
startTime(startTime: string | number | bigint): this;
|
|
29
|
+
/**
|
|
30
|
+
* Set the end time for delegation
|
|
31
|
+
* @param endTime - Unix timestamp for when delegation ends
|
|
32
|
+
*/
|
|
33
|
+
endTime(endTime: string | number | bigint): this;
|
|
34
|
+
/**
|
|
35
|
+
* Set the stake amount for delegation
|
|
36
|
+
* @param amount - Amount to stake (in nFLR)
|
|
37
|
+
*/
|
|
38
|
+
stakeAmount(amount: string | number | bigint): this;
|
|
39
|
+
/**
|
|
40
|
+
* Set reward addresses where delegation rewards should be sent
|
|
41
|
+
* @param addresses - Array of reward addresses
|
|
42
|
+
*/
|
|
43
|
+
rewardAddresses(addresses: string[]): this;
|
|
44
|
+
/** @inheritdoc */
|
|
45
|
+
initBuilder(tx: Tx): this;
|
|
46
|
+
/**
|
|
47
|
+
* Verify if the transaction is a delegator transaction
|
|
48
|
+
* @param tx
|
|
49
|
+
*/
|
|
50
|
+
static verifyTxType(tx: unknown): boolean;
|
|
51
|
+
verifyTxType(tx: unknown): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Build the delegator transaction using FlareJS PVM API
|
|
54
|
+
* @protected
|
|
55
|
+
*/
|
|
56
|
+
protected buildFlareTransaction(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=delegatorTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/delegatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAkB7B,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAE/B;;OAEG;gBACS,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C;;;OAGG;IACH,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ5B;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBpD;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBhD;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IASnD;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAS1C,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IA0BzB;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAMzC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAIlC;;;OAGG;cACa,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoGvD"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DelegatorTxBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
class DelegatorTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
8
|
+
/**
|
|
9
|
+
* @param coinConfig
|
|
10
|
+
*/
|
|
11
|
+
constructor(coinConfig) {
|
|
12
|
+
super(coinConfig);
|
|
13
|
+
this._nodeID = constants_1.EMPTY_STRING;
|
|
14
|
+
this._startTime = constants_1.ZERO_BIGINT;
|
|
15
|
+
this._endTime = constants_1.ZERO_BIGINT;
|
|
16
|
+
this._stakeAmount = constants_1.ZERO_BIGINT;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* get transaction type
|
|
20
|
+
* @protected
|
|
21
|
+
*/
|
|
22
|
+
get transactionType() {
|
|
23
|
+
return sdk_core_1.TransactionType.AddDelegator;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Set the node ID for delegation
|
|
27
|
+
* @param nodeID - The node ID to delegate to
|
|
28
|
+
*/
|
|
29
|
+
nodeID(nodeID) {
|
|
30
|
+
if (!nodeID || nodeID.length === constants_1.ZERO_NUMBER) {
|
|
31
|
+
throw new sdk_core_1.BuildTransactionError('Node ID cannot be empty');
|
|
32
|
+
}
|
|
33
|
+
this._nodeID = nodeID;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set the start time for delegation
|
|
38
|
+
* @param startTime - Unix timestamp for when delegation starts
|
|
39
|
+
*/
|
|
40
|
+
startTime(startTime) {
|
|
41
|
+
const time = BigInt(startTime);
|
|
42
|
+
// Validate that start time is positive
|
|
43
|
+
if (time <= constants_1.ZERO_NUMBER) {
|
|
44
|
+
throw new sdk_core_1.BuildTransactionError('Start time must be positive');
|
|
45
|
+
}
|
|
46
|
+
// Validate that start time is before end time (if end time is already set)
|
|
47
|
+
if (this._endTime > constants_1.ZERO_NUMBER && time >= this._endTime) {
|
|
48
|
+
throw new sdk_core_1.BuildTransactionError('Start time must be before end time');
|
|
49
|
+
}
|
|
50
|
+
this._startTime = time;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Set the end time for delegation
|
|
55
|
+
* @param endTime - Unix timestamp for when delegation ends
|
|
56
|
+
*/
|
|
57
|
+
endTime(endTime) {
|
|
58
|
+
const time = BigInt(endTime);
|
|
59
|
+
// Validate that end time is positive
|
|
60
|
+
if (time <= constants_1.ZERO_NUMBER) {
|
|
61
|
+
throw new sdk_core_1.BuildTransactionError('End time must be positive');
|
|
62
|
+
}
|
|
63
|
+
// Validate that end time is after start time (if start time is already set)
|
|
64
|
+
if (this._startTime > constants_1.ZERO_NUMBER && time <= this._startTime) {
|
|
65
|
+
throw new sdk_core_1.BuildTransactionError('End time must be after start time');
|
|
66
|
+
}
|
|
67
|
+
this._endTime = time;
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set the stake amount for delegation
|
|
72
|
+
* @param amount - Amount to stake (in nFLR)
|
|
73
|
+
*/
|
|
74
|
+
stakeAmount(amount) {
|
|
75
|
+
const stake = BigInt(amount);
|
|
76
|
+
if (stake <= constants_1.ZERO_NUMBER) {
|
|
77
|
+
throw new sdk_core_1.BuildTransactionError('Stake amount must be positive');
|
|
78
|
+
}
|
|
79
|
+
this._stakeAmount = stake;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set reward addresses where delegation rewards should be sent
|
|
84
|
+
* @param addresses - Array of reward addresses
|
|
85
|
+
*/
|
|
86
|
+
rewardAddresses(addresses) {
|
|
87
|
+
if (!addresses || addresses.length === constants_1.ZERO_NUMBER) {
|
|
88
|
+
throw new sdk_core_1.BuildTransactionError('At least one reward address is required');
|
|
89
|
+
}
|
|
90
|
+
// Store reward addresses in the transaction (we'll need to extend the type)
|
|
91
|
+
this.transaction._rewardAddresses = addresses;
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
/** @inheritdoc */
|
|
95
|
+
initBuilder(tx) {
|
|
96
|
+
super.initBuilder(tx);
|
|
97
|
+
// Extract delegator-specific fields from transaction
|
|
98
|
+
const txData = tx;
|
|
99
|
+
const delegatorData = txData;
|
|
100
|
+
if (delegatorData.nodeID) {
|
|
101
|
+
this._nodeID = delegatorData.nodeID;
|
|
102
|
+
}
|
|
103
|
+
if (delegatorData.startTime) {
|
|
104
|
+
this._startTime = BigInt(delegatorData.startTime);
|
|
105
|
+
}
|
|
106
|
+
if (delegatorData.endTime) {
|
|
107
|
+
this._endTime = BigInt(delegatorData.endTime);
|
|
108
|
+
}
|
|
109
|
+
if (delegatorData.stakeAmount) {
|
|
110
|
+
this._stakeAmount = BigInt(delegatorData.stakeAmount);
|
|
111
|
+
}
|
|
112
|
+
if (delegatorData.rewardAddresses) {
|
|
113
|
+
this.transaction._rewardAddresses = delegatorData.rewardAddresses;
|
|
114
|
+
}
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Verify if the transaction is a delegator transaction
|
|
119
|
+
* @param tx
|
|
120
|
+
*/
|
|
121
|
+
static verifyTxType(tx) {
|
|
122
|
+
// Check if transaction has delegator-specific properties
|
|
123
|
+
const delegatorData = tx;
|
|
124
|
+
return !!(delegatorData && delegatorData.nodeID && delegatorData.stakeAmount);
|
|
125
|
+
}
|
|
126
|
+
verifyTxType(tx) {
|
|
127
|
+
return DelegatorTxBuilder.verifyTxType(tx);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build the delegator transaction using FlareJS PVM API
|
|
131
|
+
* @protected
|
|
132
|
+
*/
|
|
133
|
+
async buildFlareTransaction() {
|
|
134
|
+
// Basic validation
|
|
135
|
+
if (!this._nodeID) {
|
|
136
|
+
throw new sdk_core_1.BuildTransactionError('Node ID is required for delegator transaction');
|
|
137
|
+
}
|
|
138
|
+
if (!this._startTime) {
|
|
139
|
+
throw new sdk_core_1.BuildTransactionError('Start time is required for delegator transaction');
|
|
140
|
+
}
|
|
141
|
+
if (!this._endTime) {
|
|
142
|
+
throw new sdk_core_1.BuildTransactionError('End time is required for delegator transaction');
|
|
143
|
+
}
|
|
144
|
+
if (!this._stakeAmount) {
|
|
145
|
+
throw new sdk_core_1.BuildTransactionError('Stake amount is required for delegator transaction');
|
|
146
|
+
}
|
|
147
|
+
const rewardAddresses = this.transaction._rewardAddresses;
|
|
148
|
+
if (!rewardAddresses || rewardAddresses.length === constants_1.ZERO_NUMBER) {
|
|
149
|
+
throw new sdk_core_1.BuildTransactionError('Reward addresses are required for delegator transaction');
|
|
150
|
+
}
|
|
151
|
+
// Validate time range
|
|
152
|
+
if (this._endTime <= this._startTime) {
|
|
153
|
+
throw new sdk_core_1.BuildTransactionError('End time must be after start time');
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
// FlareJS PVM API implementation for delegator transactions
|
|
157
|
+
// This creates a structured delegator transaction with proper credential handling
|
|
158
|
+
const enhancedDelegatorTx = {
|
|
159
|
+
type: constants_1.DELEGATOR_TRANSACTION_TYPE,
|
|
160
|
+
networkID: this.transaction._networkID,
|
|
161
|
+
blockchainID: this.transaction._blockchainID,
|
|
162
|
+
// Enhanced delegator information structure
|
|
163
|
+
delegator: {
|
|
164
|
+
nodeID: this._nodeID,
|
|
165
|
+
startTime: this._startTime,
|
|
166
|
+
endTime: this._endTime,
|
|
167
|
+
stakeAmount: this._stakeAmount,
|
|
168
|
+
rewardAddress: rewardAddresses[constants_1.FIRST_ADDRESS_INDEX],
|
|
169
|
+
// FlareJS delegator markers
|
|
170
|
+
_delegatorType: constants_1.PRIMARY_DELEGATOR_TYPE,
|
|
171
|
+
_flareJSReady: true,
|
|
172
|
+
_pvmCompatible: true,
|
|
173
|
+
},
|
|
174
|
+
// Enhanced stake information with credentials
|
|
175
|
+
stake: {
|
|
176
|
+
assetID: this.getAssetId(),
|
|
177
|
+
amount: this._stakeAmount,
|
|
178
|
+
addresses: this.transaction._fromAddresses,
|
|
179
|
+
threshold: this.transaction._threshold || constants_1.DEFAULT_THRESHOLD,
|
|
180
|
+
locktime: this.transaction._locktime || constants_1.DEFAULT_LOCKTIME,
|
|
181
|
+
// FlareJS stake markers
|
|
182
|
+
_stakeType: constants_1.DELEGATOR_STAKE_TYPE,
|
|
183
|
+
_flareJSReady: true,
|
|
184
|
+
},
|
|
185
|
+
// Enhanced credential structure for delegators
|
|
186
|
+
// This provides proper FlareJS-compatible credential management
|
|
187
|
+
credentials: this.transaction._fromAddresses.map((address, index) => ({
|
|
188
|
+
signatures: [], // Will be populated by FlareJS signing process
|
|
189
|
+
addressIndices: [index], // Index of the signing address
|
|
190
|
+
threshold: constants_1.DEFAULT_THRESHOLD, // Signature threshold for this credential
|
|
191
|
+
// FlareJS credential markers
|
|
192
|
+
_credentialType: constants_1.SECP256K1_CREDENTIAL_TYPE,
|
|
193
|
+
_delegatorCredential: true,
|
|
194
|
+
_addressIndex: index,
|
|
195
|
+
_signingAddress: address,
|
|
196
|
+
_flareJSReady: true,
|
|
197
|
+
_credentialVersion: constants_1.CREDENTIAL_VERSION,
|
|
198
|
+
})),
|
|
199
|
+
// Enhanced outputs for delegator rewards
|
|
200
|
+
outputs: [
|
|
201
|
+
{
|
|
202
|
+
assetID: this.getAssetId(),
|
|
203
|
+
amount: this._stakeAmount,
|
|
204
|
+
addresses: [rewardAddresses[constants_1.FIRST_ADDRESS_INDEX]],
|
|
205
|
+
threshold: constants_1.DEFAULT_THRESHOLD,
|
|
206
|
+
locktime: this.transaction._locktime || constants_1.DEFAULT_LOCKTIME,
|
|
207
|
+
// FlareJS output markers
|
|
208
|
+
_outputType: constants_1.STAKE_OUTPUT_TYPE,
|
|
209
|
+
_rewardOutput: true,
|
|
210
|
+
_flareJSReady: true,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
// Transaction metadata
|
|
214
|
+
memo: Buffer.alloc(constants_1.MEMO_BUFFER_SIZE),
|
|
215
|
+
};
|
|
216
|
+
this.transaction.setTransaction(enhancedDelegatorTx);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
throw new sdk_core_1.BuildTransactionError(`Failed to build delegator transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exports.DelegatorTxBuilder = DelegatorTxBuilder;
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdG9yVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZWxlZ2F0b3JUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQThFO0FBRTlFLHlFQUFzRTtBQUd0RSwyQ0FjcUI7QUFFckIsTUFBYSxrQkFBbUIsU0FBUSxtREFBd0I7SUFNOUQ7O09BRUc7SUFDSCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLHdCQUFZLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyx1QkFBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsdUJBQVcsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLHVCQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssdUJBQVcsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsU0FBbUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9CLHVDQUF1QztRQUN2QyxJQUFJLElBQUksSUFBSSx1QkFBVyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELDJFQUEyRTtRQUMzRSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsdUJBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsT0FBaUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTdCLHFDQUFxQztRQUNyQyxJQUFJLElBQUksSUFBSSx1QkFBVyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsdUJBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsTUFBZ0M7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxJQUFJLHVCQUFXLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksZ0NBQXFCLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLFNBQW1CO1FBQ2pDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyx1QkFBVyxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELDRFQUE0RTtRQUMzRSxJQUFJLENBQUMsV0FBcUQsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDekYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFNO1FBQ2hCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIscURBQXFEO1FBQ3JELE1BQU0sTUFBTSxHQUFHLEVBQW1DLENBQUM7UUFDbkQsTUFBTSxhQUFhLEdBQUcsTUFBcUMsQ0FBQztRQUU1RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFxRCxDQUFDLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUM7UUFDL0csQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBVztRQUM3Qix5REFBeUQ7UUFDekQsTUFBTSxhQUFhLEdBQUcsRUFBaUMsQ0FBQztRQUN4RCxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsWUFBWSxDQUFDLEVBQVc7UUFDdEIsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxxQkFBcUI7UUFDbkMsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFJLElBQUksQ0FBQyxXQUFxRCxDQUFDLGdCQUFnQixDQUFDO1FBQ3JHLElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyx1QkFBVyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCw0REFBNEQ7WUFDNUQsa0ZBQWtGO1lBRWxGLE1BQU0sbUJBQW1CLEdBQUc7Z0JBQzFCLElBQUksRUFBRSxzQ0FBMEI7Z0JBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVU7Z0JBQ3RDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7Z0JBRTVDLDJDQUEyQztnQkFDM0MsU0FBUyxFQUFFO29CQUNULE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDOUIsYUFBYSxFQUFFLGVBQWUsQ0FBQywrQkFBbUIsQ0FBQztvQkFDbkQsNEJBQTRCO29CQUM1QixjQUFjLEVBQUUsa0NBQXNCO29CQUN0QyxhQUFhLEVBQUUsSUFBSTtvQkFDbkIsY0FBYyxFQUFFLElBQUk7aUJBQ3JCO2dCQUVELDhDQUE4QztnQkFDOUMsS0FBSyxFQUFFO29CQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0JBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7b0JBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSw2QkFBaUI7b0JBQzNELFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSw0QkFBZ0I7b0JBQ3hELHdCQUF3QjtvQkFDeEIsVUFBVSxFQUFFLGdDQUFvQjtvQkFDaEMsYUFBYSxFQUFFLElBQUk7aUJBQ3BCO2dCQUVELCtDQUErQztnQkFDL0MsZ0VBQWdFO2dCQUNoRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDcEUsVUFBVSxFQUFFLEVBQUUsRUFBRSwrQ0FBK0M7b0JBQy9ELGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLCtCQUErQjtvQkFDeEQsU0FBUyxFQUFFLDZCQUFpQixFQUFFLDBDQUEwQztvQkFDeEUsNkJBQTZCO29CQUM3QixlQUFlLEVBQUUscUNBQXlCO29CQUMxQyxvQkFBb0IsRUFBRSxJQUFJO29CQUMxQixhQUFhLEVBQUUsS0FBSztvQkFDcEIsZUFBZSxFQUFFLE9BQU87b0JBQ3hCLGFBQWEsRUFBRSxJQUFJO29CQUNuQixrQkFBa0IsRUFBRSw4QkFBa0I7aUJBQ3ZDLENBQUMsQ0FBQztnQkFFSCx5Q0FBeUM7Z0JBQ3pDLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO3dCQUN6QixTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsK0JBQW1CLENBQUMsQ0FBQzt3QkFDakQsU0FBUyxFQUFFLDZCQUFpQjt3QkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLDRCQUFnQjt3QkFDeEQseUJBQXlCO3dCQUN6QixXQUFXLEVBQUUsNkJBQWlCO3dCQUM5QixhQUFhLEVBQUUsSUFBSTt3QkFDbkIsYUFBYSxFQUFFLElBQUk7cUJBQ3BCO2lCQUNGO2dCQUVELHVCQUF1QjtnQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQWdCLENBQUM7YUFDckMsQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLDBDQUEwQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FDckcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUExUEQsZ0RBMFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmF3VHJhbnNhY3Rpb25EYXRhLCBTdGFraW5nRXh0ZW5kZWRUcmFuc2FjdGlvbiwgRGVsZWdhdG9yUmF3VHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBERUxFR0FUT1JfVFJBTlNBQ1RJT05fVFlQRSxcbiAgUFJJTUFSWV9ERUxFR0FUT1JfVFlQRSxcbiAgREVMRUdBVE9SX1NUQUtFX1RZUEUsXG4gIFNFQ1AyNTZLMV9DUkVERU5USUFMX1RZUEUsXG4gIFNUQUtFX09VVFBVVF9UWVBFLFxuICBDUkVERU5USUFMX1ZFUlNJT04sXG4gIEVNUFRZX1NUUklORyxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgREVGQVVMVF9MT0NLVElNRSxcbiAgTUVNT19CVUZGRVJfU0laRSxcbiAgRklSU1RfQUREUkVTU19JTkRFWCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgRGVsZWdhdG9yVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF9ub2RlSUQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zdGFydFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9lbmRUaW1lOiBiaWdpbnQ7XG4gIHByb3RlY3RlZCBfc3Rha2VBbW91bnQ6IGJpZ2ludDtcblxuICAvKipcbiAgICogQHBhcmFtIGNvaW5Db25maWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fbm9kZUlEID0gRU1QVFlfU1RSSU5HO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IFpFUk9fQklHSU5UO1xuICAgIHRoaXMuX2VuZFRpbWUgPSBaRVJPX0JJR0lOVDtcbiAgICB0aGlzLl9zdGFrZUFtb3VudCA9IFpFUk9fQklHSU5UO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBub2RlIElEIGZvciBkZWxlZ2F0aW9uXG4gICAqIEBwYXJhbSBub2RlSUQgLSBUaGUgbm9kZSBJRCB0byBkZWxlZ2F0ZSB0b1xuICAgKi9cbiAgbm9kZUlEKG5vZGVJRDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFub2RlSUQgfHwgbm9kZUlELmxlbmd0aCA9PT0gWkVST19OVU1CRVIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGUgSUQgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIHRoaXMuX25vZGVJRCA9IG5vZGVJRDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXJ0IHRpbWUgZm9yIGRlbGVnYXRpb25cbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIFVuaXggdGltZXN0YW1wIGZvciB3aGVuIGRlbGVnYXRpb24gc3RhcnRzXG4gICAqL1xuICBzdGFydFRpbWUoc3RhcnRUaW1lOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCB0aW1lID0gQmlnSW50KHN0YXJ0VGltZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHN0YXJ0IHRpbWUgaXMgcG9zaXRpdmVcbiAgICBpZiAodGltZSA8PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBzdGFydCB0aW1lIGlzIGJlZm9yZSBlbmQgdGltZSAoaWYgZW5kIHRpbWUgaXMgYWxyZWFkeSBzZXQpXG4gICAgaWYgKHRoaXMuX2VuZFRpbWUgPiBaRVJPX05VTUJFUiAmJiB0aW1lID49IHRoaXMuX2VuZFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1N0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgZW5kIHRpbWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZW5kIHRpbWUgZm9yIGRlbGVnYXRpb25cbiAgICogQHBhcmFtIGVuZFRpbWUgLSBVbml4IHRpbWVzdGFtcCBmb3Igd2hlbiBkZWxlZ2F0aW9uIGVuZHNcbiAgICovXG4gIGVuZFRpbWUoZW5kVGltZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgdGltZSA9IEJpZ0ludChlbmRUaW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZW5kIHRpbWUgaXMgcG9zaXRpdmVcbiAgICBpZiAodGltZSA8PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRW5kIHRpbWUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZW5kIHRpbWUgaXMgYWZ0ZXIgc3RhcnQgdGltZSAoaWYgc3RhcnQgdGltZSBpcyBhbHJlYWR5IHNldClcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID4gWkVST19OVU1CRVIgJiYgdGltZSA8PSB0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCB0aW1lIG11c3QgYmUgYWZ0ZXIgc3RhcnQgdGltZScpO1xuICAgIH1cblxuICAgIHRoaXMuX2VuZFRpbWUgPSB0aW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3Rha2UgYW1vdW50IGZvciBkZWxlZ2F0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgdG8gc3Rha2UgKGluIG5GTFIpXG4gICAqL1xuICBzdGFrZUFtb3VudChhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHRoaXMge1xuICAgIGNvbnN0IHN0YWtlID0gQmlnSW50KGFtb3VudCk7XG4gICAgaWYgKHN0YWtlIDw9IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTdGFrZSBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFrZUFtb3VudCA9IHN0YWtlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZXdhcmQgYWRkcmVzc2VzIHdoZXJlIGRlbGVnYXRpb24gcmV3YXJkcyBzaG91bGQgYmUgc2VudFxuICAgKiBAcGFyYW0gYWRkcmVzc2VzIC0gQXJyYXkgb2YgcmV3YXJkIGFkZHJlc3Nlc1xuICAgKi9cbiAgcmV3YXJkQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICBpZiAoIWFkZHJlc3NlcyB8fCBhZGRyZXNzZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQXQgbGVhc3Qgb25lIHJld2FyZCBhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIFN0b3JlIHJld2FyZCBhZGRyZXNzZXMgaW4gdGhlIHRyYW5zYWN0aW9uICh3ZSdsbCBuZWVkIHRvIGV4dGVuZCB0aGUgdHlwZSlcbiAgICAodGhpcy50cmFuc2FjdGlvbiBhcyB1bmtub3duIGFzIFN0YWtpbmdFeHRlbmRlZFRyYW5zYWN0aW9uKS5fcmV3YXJkQWRkcmVzc2VzID0gYWRkcmVzc2VzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCk6IHRoaXMge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcblxuICAgIC8vIEV4dHJhY3QgZGVsZWdhdG9yLXNwZWNpZmljIGZpZWxkcyBmcm9tIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdHhEYXRhID0gdHggYXMgdW5rbm93biBhcyBSYXdUcmFuc2FjdGlvbkRhdGE7XG4gICAgY29uc3QgZGVsZWdhdG9yRGF0YSA9IHR4RGF0YSBhcyBEZWxlZ2F0b3JSYXdUcmFuc2FjdGlvbkRhdGE7XG5cbiAgICBpZiAoZGVsZWdhdG9yRGF0YS5ub2RlSUQpIHtcbiAgICAgIHRoaXMuX25vZGVJRCA9IGRlbGVnYXRvckRhdGEubm9kZUlEO1xuICAgIH1cbiAgICBpZiAoZGVsZWdhdG9yRGF0YS5zdGFydFRpbWUpIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IEJpZ0ludChkZWxlZ2F0b3JEYXRhLnN0YXJ0VGltZSk7XG4gICAgfVxuICAgIGlmIChkZWxlZ2F0b3JEYXRhLmVuZFRpbWUpIHtcbiAgICAgIHRoaXMuX2VuZFRpbWUgPSBCaWdJbnQoZGVsZWdhdG9yRGF0YS5lbmRUaW1lKTtcbiAgICB9XG4gICAgaWYgKGRlbGVnYXRvckRhdGEuc3Rha2VBbW91bnQpIHtcbiAgICAgIHRoaXMuX3N0YWtlQW1vdW50ID0gQmlnSW50KGRlbGVnYXRvckRhdGEuc3Rha2VBbW91bnQpO1xuICAgIH1cbiAgICBpZiAoZGVsZWdhdG9yRGF0YS5yZXdhcmRBZGRyZXNzZXMpIHtcbiAgICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIHVua25vd24gYXMgU3Rha2luZ0V4dGVuZGVkVHJhbnNhY3Rpb24pLl9yZXdhcmRBZGRyZXNzZXMgPSBkZWxlZ2F0b3JEYXRhLnJld2FyZEFkZHJlc3NlcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGEgZGVsZWdhdG9yIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh0eDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRyYW5zYWN0aW9uIGhhcyBkZWxlZ2F0b3Itc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIGNvbnN0IGRlbGVnYXRvckRhdGEgPSB0eCBhcyBEZWxlZ2F0b3JSYXdUcmFuc2FjdGlvbkRhdGE7XG4gICAgcmV0dXJuICEhKGRlbGVnYXRvckRhdGEgJiYgZGVsZWdhdG9yRGF0YS5ub2RlSUQgJiYgZGVsZWdhdG9yRGF0YS5zdGFrZUFtb3VudCk7XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodHg6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gRGVsZWdhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGRlbGVnYXRvciB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTIFBWTSBBUElcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNpYyB2YWxpZGF0aW9uXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGUgSUQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdG9yIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZW5kVGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRW5kIHRpbWUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YWtlQW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTdGFrZSBhbW91bnQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJld2FyZEFkZHJlc3NlcyA9ICh0aGlzLnRyYW5zYWN0aW9uIGFzIHVua25vd24gYXMgU3Rha2luZ0V4dGVuZGVkVHJhbnNhY3Rpb24pLl9yZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKCFyZXdhcmRBZGRyZXNzZXMgfHwgcmV3YXJkQWRkcmVzc2VzLmxlbmd0aCA9PT0gWkVST19OVU1CRVIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1Jld2FyZCBhZGRyZXNzZXMgYXJlIHJlcXVpcmVkIGZvciBkZWxlZ2F0b3IgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aW1lIHJhbmdlXG4gICAgaWYgKHRoaXMuX2VuZFRpbWUgPD0gdGhpcy5fc3RhcnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFbmQgdGltZSBtdXN0IGJlIGFmdGVyIHN0YXJ0IHRpbWUnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gRmxhcmVKUyBQVk0gQVBJIGltcGxlbWVudGF0aW9uIGZvciBkZWxlZ2F0b3IgdHJhbnNhY3Rpb25zXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdHJ1Y3R1cmVkIGRlbGVnYXRvciB0cmFuc2FjdGlvbiB3aXRoIHByb3BlciBjcmVkZW50aWFsIGhhbmRsaW5nXG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkRGVsZWdhdG9yVHggPSB7XG4gICAgICAgIHR5cGU6IERFTEVHQVRPUl9UUkFOU0FDVElPTl9UWVBFLFxuICAgICAgICBuZXR3b3JrSUQ6IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCxcbiAgICAgICAgYmxvY2tjaGFpbklEOiB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQsXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgZGVsZWdhdG9yIGluZm9ybWF0aW9uIHN0cnVjdHVyZVxuICAgICAgICBkZWxlZ2F0b3I6IHtcbiAgICAgICAgICBub2RlSUQ6IHRoaXMuX25vZGVJRCxcbiAgICAgICAgICBzdGFydFRpbWU6IHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgICAgICBlbmRUaW1lOiB0aGlzLl9lbmRUaW1lLFxuICAgICAgICAgIHN0YWtlQW1vdW50OiB0aGlzLl9zdGFrZUFtb3VudCxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzOiByZXdhcmRBZGRyZXNzZXNbRklSU1RfQUREUkVTU19JTkRFWF0sXG4gICAgICAgICAgLy8gRmxhcmVKUyBkZWxlZ2F0b3IgbWFya2Vyc1xuICAgICAgICAgIF9kZWxlZ2F0b3JUeXBlOiBQUklNQVJZX0RFTEVHQVRPUl9UWVBFLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgc3Rha2UgaW5mb3JtYXRpb24gd2l0aCBjcmVkZW50aWFsc1xuICAgICAgICBzdGFrZToge1xuICAgICAgICAgIGFzc2V0SUQ6IHRoaXMuZ2V0QXNzZXRJZCgpLFxuICAgICAgICAgIGFtb3VudDogdGhpcy5fc3Rha2VBbW91bnQsXG4gICAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLFxuICAgICAgICAgIHRocmVzaG9sZDogdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkIHx8IERFRkFVTFRfVEhSRVNIT0xELFxuICAgICAgICAgIGxvY2t0aW1lOiB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSB8fCBERUZBVUxUX0xPQ0tUSU1FLFxuICAgICAgICAgIC8vIEZsYXJlSlMgc3Rha2UgbWFya2Vyc1xuICAgICAgICAgIF9zdGFrZVR5cGU6IERFTEVHQVRPUl9TVEFLRV9UWVBFLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY3JlZGVudGlhbCBzdHJ1Y3R1cmUgZm9yIGRlbGVnYXRvcnNcbiAgICAgICAgLy8gVGhpcyBwcm92aWRlcyBwcm9wZXIgRmxhcmVKUy1jb21wYXRpYmxlIGNyZWRlbnRpYWwgbWFuYWdlbWVudFxuICAgICAgICBjcmVkZW50aWFsczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHNpZ25hdHVyZXM6IFtdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBieSBGbGFyZUpTIHNpZ25pbmcgcHJvY2Vzc1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzOiBbaW5kZXhdLCAvLyBJbmRleCBvZiB0aGUgc2lnbmluZyBhZGRyZXNzXG4gICAgICAgICAgdGhyZXNob2xkOiBERUZBVUxUX1RIUkVTSE9MRCwgLy8gU2lnbmF0dXJlIHRocmVzaG9sZCBmb3IgdGhpcyBjcmVkZW50aWFsXG4gICAgICAgICAgLy8gRmxhcmVKUyBjcmVkZW50aWFsIG1hcmtlcnNcbiAgICAgICAgICBfY3JlZGVudGlhbFR5cGU6IFNFQ1AyNTZLMV9DUkVERU5USUFMX1RZUEUsXG4gICAgICAgICAgX2RlbGVnYXRvckNyZWRlbnRpYWw6IHRydWUsXG4gICAgICAgICAgX2FkZHJlc3NJbmRleDogaW5kZXgsXG4gICAgICAgICAgX3NpZ25pbmdBZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX2NyZWRlbnRpYWxWZXJzaW9uOiBDUkVERU5USUFMX1ZFUlNJT04sXG4gICAgICAgIH0pKSxcblxuICAgICAgICAvLyBFbmhhbmNlZCBvdXRwdXRzIGZvciBkZWxlZ2F0b3IgcmV3YXJkc1xuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgICAgICAgYWRkcmVzc2VzOiBbcmV3YXJkQWRkcmVzc2VzW0ZJUlNUX0FERFJFU1NfSU5ERVhdXSxcbiAgICAgICAgICAgIHRocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgICAgICAgICBsb2NrdGltZTogdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgfHwgREVGQVVMVF9MT0NLVElNRSxcbiAgICAgICAgICAgIC8vIEZsYXJlSlMgb3V0cHV0IG1hcmtlcnNcbiAgICAgICAgICAgIF9vdXRwdXRUeXBlOiBTVEFLRV9PVVRQVVRfVFlQRSxcbiAgICAgICAgICAgIF9yZXdhcmRPdXRwdXQ6IHRydWUsXG4gICAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gbWV0YWRhdGFcbiAgICAgICAgbWVtbzogQnVmZmVyLmFsbG9jKE1FTU9fQlVGRkVSX1NJWkUpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihlbmhhbmNlZERlbGVnYXRvclR4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBidWlsZCBkZWxlZ2F0b3IgdHJhbnNhY3Rpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|