tedious 16.4.0 → 16.4.1

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.
Files changed (146) hide show
  1. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +1 -1
  2. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -1
  3. package/lib/always-encrypted/cek-entry.js +1 -1
  4. package/lib/always-encrypted/cek-entry.js.map +1 -1
  5. package/lib/always-encrypted/get-parameter-encryption-metadata.js +1 -1
  6. package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -1
  7. package/lib/always-encrypted/key-crypto.js +1 -1
  8. package/lib/always-encrypted/key-crypto.js.map +1 -1
  9. package/lib/always-encrypted/keystore-provider-azure-key-vault.js +1 -1
  10. package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -1
  11. package/lib/always-encrypted/symmetric-key-cache.js +1 -1
  12. package/lib/always-encrypted/symmetric-key-cache.js.map +1 -1
  13. package/lib/always-encrypted/types.js +1 -1
  14. package/lib/always-encrypted/types.js.map +1 -1
  15. package/lib/bulk-load.js +1 -1
  16. package/lib/bulk-load.js.map +1 -1
  17. package/lib/connection.js +29 -8
  18. package/lib/connection.js.map +1 -1
  19. package/lib/connector.js +1 -1
  20. package/lib/connector.js.map +1 -1
  21. package/lib/data-type.js +1 -1
  22. package/lib/data-type.js.map +1 -1
  23. package/lib/data-types/bigint.js +1 -1
  24. package/lib/data-types/bigint.js.map +1 -1
  25. package/lib/data-types/binary.js +1 -1
  26. package/lib/data-types/binary.js.map +1 -1
  27. package/lib/data-types/bit.js +1 -1
  28. package/lib/data-types/bit.js.map +1 -1
  29. package/lib/data-types/bitn.js +1 -1
  30. package/lib/data-types/bitn.js.map +1 -1
  31. package/lib/data-types/char.js +1 -1
  32. package/lib/data-types/char.js.map +1 -1
  33. package/lib/data-types/date.js +1 -1
  34. package/lib/data-types/date.js.map +1 -1
  35. package/lib/data-types/datetime.js +1 -1
  36. package/lib/data-types/datetime.js.map +1 -1
  37. package/lib/data-types/datetime2.js +1 -1
  38. package/lib/data-types/datetime2.js.map +1 -1
  39. package/lib/data-types/datetimen.js +1 -1
  40. package/lib/data-types/datetimen.js.map +1 -1
  41. package/lib/data-types/datetimeoffset.js +1 -1
  42. package/lib/data-types/datetimeoffset.js.map +1 -1
  43. package/lib/data-types/decimal.js +1 -1
  44. package/lib/data-types/decimal.js.map +1 -1
  45. package/lib/data-types/decimaln.js +1 -1
  46. package/lib/data-types/decimaln.js.map +1 -1
  47. package/lib/data-types/float.js +1 -1
  48. package/lib/data-types/float.js.map +1 -1
  49. package/lib/data-types/floatn.js +1 -1
  50. package/lib/data-types/floatn.js.map +1 -1
  51. package/lib/data-types/image.js +1 -1
  52. package/lib/data-types/image.js.map +1 -1
  53. package/lib/data-types/int.js +1 -1
  54. package/lib/data-types/int.js.map +1 -1
  55. package/lib/data-types/intn.js +1 -1
  56. package/lib/data-types/intn.js.map +1 -1
  57. package/lib/data-types/money.js +1 -1
  58. package/lib/data-types/money.js.map +1 -1
  59. package/lib/data-types/moneyn.js +1 -1
  60. package/lib/data-types/moneyn.js.map +1 -1
  61. package/lib/data-types/nchar.js +1 -1
  62. package/lib/data-types/nchar.js.map +1 -1
  63. package/lib/data-types/ntext.js +1 -1
  64. package/lib/data-types/ntext.js.map +1 -1
  65. package/lib/data-types/null.js +1 -1
  66. package/lib/data-types/null.js.map +1 -1
  67. package/lib/data-types/numeric.js +1 -1
  68. package/lib/data-types/numeric.js.map +1 -1
  69. package/lib/data-types/numericn.js +1 -1
  70. package/lib/data-types/numericn.js.map +1 -1
  71. package/lib/data-types/nvarchar.js +1 -1
  72. package/lib/data-types/nvarchar.js.map +1 -1
  73. package/lib/data-types/real.js +1 -1
  74. package/lib/data-types/real.js.map +1 -1
  75. package/lib/data-types/smalldatetime.js +1 -1
  76. package/lib/data-types/smalldatetime.js.map +1 -1
  77. package/lib/data-types/smallint.js +1 -1
  78. package/lib/data-types/smallint.js.map +1 -1
  79. package/lib/data-types/smallmoney.js +1 -1
  80. package/lib/data-types/smallmoney.js.map +1 -1
  81. package/lib/data-types/sql-variant.js +1 -1
  82. package/lib/data-types/sql-variant.js.map +1 -1
  83. package/lib/data-types/text.js +1 -1
  84. package/lib/data-types/text.js.map +1 -1
  85. package/lib/data-types/time.js +1 -1
  86. package/lib/data-types/time.js.map +1 -1
  87. package/lib/data-types/tinyint.js +1 -1
  88. package/lib/data-types/tinyint.js.map +1 -1
  89. package/lib/data-types/tvp.js +1 -1
  90. package/lib/data-types/tvp.js.map +1 -1
  91. package/lib/data-types/udt.js +1 -1
  92. package/lib/data-types/udt.js.map +1 -1
  93. package/lib/data-types/uniqueidentifier.js +1 -1
  94. package/lib/data-types/uniqueidentifier.js.map +1 -1
  95. package/lib/data-types/varbinary.js +1 -1
  96. package/lib/data-types/varbinary.js.map +1 -1
  97. package/lib/data-types/varchar.js +1 -1
  98. package/lib/data-types/varchar.js.map +1 -1
  99. package/lib/data-types/xml.js +1 -1
  100. package/lib/data-types/xml.js.map +1 -1
  101. package/lib/metadata-parser.js +1 -1
  102. package/lib/metadata-parser.js.map +1 -1
  103. package/lib/request.js +1 -1
  104. package/lib/request.js.map +1 -1
  105. package/lib/rpcrequest-payload.js +1 -1
  106. package/lib/rpcrequest-payload.js.map +1 -1
  107. package/lib/tedious.js +1 -1
  108. package/lib/tedious.js.map +1 -1
  109. package/lib/token/colmetadata-token-parser.js +1 -1
  110. package/lib/token/colmetadata-token-parser.js.map +1 -1
  111. package/lib/token/done-token-parser.js +1 -1
  112. package/lib/token/done-token-parser.js.map +1 -1
  113. package/lib/token/env-change-token-parser.js +1 -1
  114. package/lib/token/env-change-token-parser.js.map +1 -1
  115. package/lib/token/feature-ext-ack-parser.js +1 -1
  116. package/lib/token/feature-ext-ack-parser.js.map +1 -1
  117. package/lib/token/fedauth-info-parser.js +1 -1
  118. package/lib/token/fedauth-info-parser.js.map +1 -1
  119. package/lib/token/handler.js +1 -1
  120. package/lib/token/handler.js.map +1 -1
  121. package/lib/token/infoerror-token-parser.js +1 -1
  122. package/lib/token/infoerror-token-parser.js.map +1 -1
  123. package/lib/token/loginack-token-parser.js +1 -1
  124. package/lib/token/loginack-token-parser.js.map +1 -1
  125. package/lib/token/nbcrow-token-parser.js +1 -1
  126. package/lib/token/nbcrow-token-parser.js.map +1 -1
  127. package/lib/token/order-token-parser.js +1 -1
  128. package/lib/token/order-token-parser.js.map +1 -1
  129. package/lib/token/returnstatus-token-parser.js +1 -1
  130. package/lib/token/returnstatus-token-parser.js.map +1 -1
  131. package/lib/token/returnvalue-token-parser.js +1 -1
  132. package/lib/token/returnvalue-token-parser.js.map +1 -1
  133. package/lib/token/row-token-parser.js +1 -1
  134. package/lib/token/row-token-parser.js.map +1 -1
  135. package/lib/token/sspi-token-parser.js +1 -1
  136. package/lib/token/sspi-token-parser.js.map +1 -1
  137. package/lib/token/stream-parser.js +1 -1
  138. package/lib/token/stream-parser.js.map +1 -1
  139. package/lib/token/token-stream-parser.js +1 -1
  140. package/lib/token/token-stream-parser.js.map +1 -1
  141. package/lib/token/token.js +1 -1
  142. package/lib/token/token.js.map +1 -1
  143. package/lib/value-parser.js +1 -1
  144. package/lib/value-parser.js.map +1 -1
  145. package/package.json +1 -1
  146. package/tsconfig.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"keystore-provider-azure-key-vault.js","names":["_identity","require","_keyvaultKeys","_crypto","_url","ColumnEncryptionAzureKeyVaultProvider","name","url","rsaEncryptionAlgorithmWithOAEPForAKV","firstVersion","credentials","azureKeyVaultDomainName","keyClient","constructor","clientId","clientKey","tenantId","Buffer","from","ClientSecretCredential","decryptColumnEncryptionKey","masterKeyPath","encryptionAlgorithm","encryptedColumnEncryptionKey","Error","length","validateEncryptionAlgorithm","masterKey","getMasterKey","keySizeInBytes","getAKVKeySize","cryptoClient","createCryptoClient","toString","currentIndex","keyPathLength","readInt16LE","cipherTextLength","signatureLength","cipherText","alloc","copy","signature","hash","messageDigest","createHash","update","dataToVerify","digest","verifyKey","verify","result","decryptedCEK","azureKeyVaultUnWrap","encryptColumnEncryptionKey","columnEncryptionKey","version","masterKeyPathBytes","toLowerCase","azureKeyVaultWrap","dataToHash","destinationPosition","dataToSign","signedHash","azureKeyVaultSignedHashedData","encryptedColumnEncryptionKeyLength","keyParts","parsePath","createKeyClient","vaultUrl","getKey","keyVaultUrl","KeyClient","CryptographyClient","trim","baseUri","parse","hostname","endsWith","segments","pathname","split","protocol","host","undefined","signedData","sign","wrappedKey","wrapKey","unwrappedKey","unwrapKey","retrievedKey","key","kty","toUpperCase","localeCompare","keyLength","n","exports"],"sources":["../../src/always-encrypted/keystore-provider-azure-key-vault.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { ClientSecretCredential } from '@azure/identity';\nimport { CryptographyClient, KeyWrapAlgorithm, KeyClient, KeyVaultKey } from '@azure/keyvault-keys';\nimport { createHash } from 'crypto';\nimport { parse } from 'url';\n\ninterface ParsedKeyPath {\n vaultUrl: string;\n name: string;\n version?: string | undefined;\n}\n\nexport class ColumnEncryptionAzureKeyVaultProvider {\n public readonly name: string;\n private url: undefined | string;\n private readonly rsaEncryptionAlgorithmWithOAEPForAKV: string;\n private readonly firstVersion: Buffer;\n private credentials: ClientSecretCredential;\n private readonly azureKeyVaultDomainName: string;\n private keyClient: undefined | KeyClient;\n\n constructor(clientId: string, clientKey: string, tenantId: string) {\n this.name = 'AZURE_KEY_VAULT';\n this.azureKeyVaultDomainName = 'vault.azure.net';\n this.rsaEncryptionAlgorithmWithOAEPForAKV = 'RSA-OAEP';\n this.firstVersion = Buffer.from([0x01]);\n this.credentials = new ClientSecretCredential(tenantId, clientId, clientKey);\n }\n\n async decryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, encryptedColumnEncryptionKey: Buffer): Promise<Buffer> {\n if (!encryptedColumnEncryptionKey) {\n throw new Error('Internal error. Encrypted column encryption key cannot be null.');\n }\n\n if (encryptedColumnEncryptionKey.length === 0) {\n throw new Error('Internal error. Empty encrypted column encryption key specified.');\n }\n\n encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);\n\n const masterKey = await this.getMasterKey(masterKeyPath);\n\n const keySizeInBytes = this.getAKVKeySize(masterKey);\n\n const cryptoClient = this.createCryptoClient(masterKey);\n\n if (encryptedColumnEncryptionKey[0] !== this.firstVersion[0]) {\n throw new Error(`Specified encrypted column encryption key contains an invalid encryption algorithm version ${Buffer.from([encryptedColumnEncryptionKey[0]]).toString('hex')}. Expected version is ${Buffer.from([this.firstVersion[0]]).toString('hex')}.`);\n }\n\n let currentIndex = this.firstVersion.length;\n const keyPathLength: number = encryptedColumnEncryptionKey.readInt16LE(currentIndex);\n\n currentIndex += 2;\n\n const cipherTextLength: number = encryptedColumnEncryptionKey.readInt16LE(currentIndex);\n\n currentIndex += 2;\n\n currentIndex += keyPathLength;\n\n if (cipherTextLength !== keySizeInBytes) {\n throw new Error(`The specified encrypted column encryption key's ciphertext length: ${cipherTextLength} does not match the ciphertext length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);\n }\n\n const signatureLength: number = encryptedColumnEncryptionKey.length - currentIndex - cipherTextLength;\n\n if (signatureLength !== keySizeInBytes) {\n throw new Error(`The specified encrypted column encryption key's signature length: ${signatureLength} does not match the signature length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);\n }\n\n const cipherText = Buffer.alloc(cipherTextLength);\n encryptedColumnEncryptionKey.copy(cipherText, 0, currentIndex, currentIndex + cipherTextLength);\n currentIndex += cipherTextLength;\n\n const signature = Buffer.alloc(signatureLength);\n encryptedColumnEncryptionKey.copy(signature, 0, currentIndex, currentIndex + signatureLength);\n\n const hash = Buffer.alloc(encryptedColumnEncryptionKey.length - signature.length);\n encryptedColumnEncryptionKey.copy(hash, 0, 0, encryptedColumnEncryptionKey.length - signature.length);\n\n const messageDigest = createHash('sha256');\n messageDigest.update(hash);\n\n const dataToVerify: Buffer = messageDigest.digest();\n\n if (!dataToVerify) {\n throw new Error('Hash should not be null while decrypting encrypted column encryption key.');\n }\n\n const verifyKey = await cryptoClient.verify('RS256', dataToVerify, signature);\n if (!verifyKey.result) {\n throw new Error(`The specified encrypted column encryption key signature does not match the signature computed with the column master key (Asymmetric key in Azure Key Vault) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified path may be incorrect.`);\n }\n\n const decryptedCEK: Buffer = await this.azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, cipherText);\n\n return decryptedCEK;\n }\n\n async encryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, columnEncryptionKey: Buffer): Promise<Buffer> {\n if (!columnEncryptionKey) {\n throw new Error('Column encryption key cannot be null.');\n }\n\n if (columnEncryptionKey.length === 0) {\n throw new Error('Empty column encryption key specified.');\n }\n\n encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);\n\n const masterKey = await this.getMasterKey(masterKeyPath);\n\n const keySizeInBytes = this.getAKVKeySize(masterKey);\n\n const cryptoClient = this.createCryptoClient(masterKey);\n\n const version = Buffer.from([this.firstVersion[0]]);\n\n const masterKeyPathBytes: Buffer = Buffer.from(masterKeyPath.toLowerCase(), 'utf8');\n\n const keyPathLength: Buffer = Buffer.alloc(2);\n\n keyPathLength[0] = masterKeyPathBytes.length & 0xff;\n keyPathLength[1] = masterKeyPathBytes.length >> 8 & 0xff;\n\n const cipherText: Buffer = await this.azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey);\n\n const cipherTextLength: Buffer = Buffer.alloc(2);\n\n cipherTextLength[0] = cipherText.length & 0xff;\n cipherTextLength[1] = cipherText.length >> 8 & 0xff;\n\n if (cipherText.length !== keySizeInBytes) {\n throw new Error('CipherText length does not match the RSA key size.');\n }\n\n const dataToHash: Buffer = Buffer.alloc(version.length + keyPathLength.length + cipherTextLength.length + masterKeyPathBytes.length + cipherText.length);\n let destinationPosition: number = version.length;\n version.copy(dataToHash, 0, 0, version.length);\n\n keyPathLength.copy(dataToHash, destinationPosition, 0, keyPathLength.length);\n destinationPosition += keyPathLength.length;\n\n cipherTextLength.copy(dataToHash, destinationPosition, 0, cipherTextLength.length);\n destinationPosition += cipherTextLength.length;\n\n masterKeyPathBytes.copy(dataToHash, destinationPosition, 0, masterKeyPathBytes.length);\n destinationPosition += masterKeyPathBytes.length;\n\n cipherText.copy(dataToHash, destinationPosition, 0, cipherText.length);\n\n const messageDigest = createHash('sha256');\n\n messageDigest.update(dataToHash);\n\n const dataToSign: Buffer = messageDigest.digest();\n\n const signedHash: Buffer = await this.azureKeyVaultSignedHashedData(cryptoClient, dataToSign);\n if (signedHash.length !== keySizeInBytes) {\n throw new Error('Signed hash length does not match the RSA key size.');\n }\n\n const verifyKey = await cryptoClient.verify('RS256', dataToSign, signedHash);\n\n if (!verifyKey.result) {\n throw new Error('Invalid signature of the encrypted column encryption key computed.');\n }\n\n const encryptedColumnEncryptionKeyLength: number = version.length + cipherTextLength.length + keyPathLength.length + cipherText.length + masterKeyPathBytes.length + signedHash.length;\n const encryptedColumnEncryptionKey: Buffer = Buffer.alloc(encryptedColumnEncryptionKeyLength);\n\n let currentIndex = 0;\n version.copy(encryptedColumnEncryptionKey, currentIndex, 0, version.length);\n currentIndex += version.length;\n\n keyPathLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, keyPathLength.length);\n currentIndex += keyPathLength.length;\n\n cipherTextLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherTextLength.length);\n currentIndex += cipherTextLength.length;\n\n masterKeyPathBytes.copy(encryptedColumnEncryptionKey, currentIndex, 0, masterKeyPathBytes.length);\n currentIndex += masterKeyPathBytes.length;\n\n cipherText.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherText.length);\n currentIndex += cipherText.length;\n\n signedHash.copy(encryptedColumnEncryptionKey, currentIndex, 0, signedHash.length);\n\n return encryptedColumnEncryptionKey;\n }\n\n private async getMasterKey(masterKeyPath: string): Promise<KeyVaultKey> {\n if (!masterKeyPath) {\n throw new Error('Master key path cannot be null or undefined');\n }\n const keyParts = this.parsePath(masterKeyPath);\n\n this.createKeyClient(keyParts.vaultUrl);\n\n return await (this.keyClient as KeyClient).getKey(keyParts.name, keyParts.version ? { version: keyParts.version } : {});\n }\n\n private createKeyClient(keyVaultUrl: string): void {\n if (!keyVaultUrl) {\n throw new Error('Cannot create key client with null or undefined keyVaultUrl');\n }\n if (!this.keyClient) {\n this.url = keyVaultUrl;\n this.keyClient = new KeyClient(keyVaultUrl, this.credentials);\n }\n }\n\n private createCryptoClient(masterKey: KeyVaultKey): CryptographyClient {\n if (!masterKey) {\n throw new Error('Cannot create CryptographyClient with null or undefined masterKey');\n }\n return new CryptographyClient(masterKey, this.credentials);\n }\n\n private parsePath(masterKeyPath: string): ParsedKeyPath {\n if (!masterKeyPath || masterKeyPath.trim() === '') {\n throw new Error('Azure Key Vault key path cannot be null.');\n }\n\n let baseUri;\n try {\n baseUri = parse(masterKeyPath, true, true);\n } catch {\n throw new Error(`Invalid keys identifier: ${masterKeyPath}. Not a valid URI`);\n }\n\n if (!baseUri.hostname || !baseUri.hostname.toLowerCase().endsWith(this.azureKeyVaultDomainName)) {\n throw new Error(`Invalid Azure Key Vault key path specified: ${masterKeyPath}.`);\n }\n\n // Path is of the form '/collection/name[/version]'\n const segments = (baseUri.pathname || '').split('/');\n if (segments.length !== 3 && segments.length !== 4) {\n throw new Error(\n `Invalid keys identifier: ${masterKeyPath}. Bad number of segments: ${segments.length}`\n );\n }\n\n if ('keys' !== segments[1]) {\n throw new Error(\n `Invalid keys identifier: ${masterKeyPath}. segment [1] should be \"keys\", found \"${segments[1]}\"`\n );\n }\n\n const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;\n const name = segments[2];\n const version = segments.length === 4 ? segments[3] : undefined;\n return {\n vaultUrl,\n name,\n version\n };\n }\n\n private async azureKeyVaultSignedHashedData(cryptoClient: CryptographyClient, dataToSign: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n const signedData = await cryptoClient.sign('RS256', dataToSign);\n\n return Buffer.from(signedData.result);\n }\n\n private async azureKeyVaultWrap(cryptoClient: CryptographyClient, encryptionAlgorithm: string, columnEncryptionKey: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n if (!columnEncryptionKey) {\n throw new Error('Column encryption key cannot be null.');\n }\n\n const wrappedKey = await cryptoClient.wrapKey(encryptionAlgorithm as KeyWrapAlgorithm, columnEncryptionKey);\n\n return Buffer.from(wrappedKey.result);\n }\n\n private async azureKeyVaultUnWrap(cryptoClient: CryptographyClient, encryptionAlgorithm: string, encryptedColumnEncryptionKey: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n if (!encryptionAlgorithm) {\n throw new Error('Encryption Algorithm cannot be null or undefined');\n }\n\n if (!encryptedColumnEncryptionKey) {\n throw new Error('Encrypted column encryption key cannot be null.');\n }\n\n if (encryptedColumnEncryptionKey.length === 0) {\n throw new Error('Encrypted Column Encryption Key length should not be zero.');\n }\n\n const unwrappedKey = await cryptoClient.unwrapKey(encryptionAlgorithm as KeyWrapAlgorithm, encryptedColumnEncryptionKey);\n\n return Buffer.from(unwrappedKey.result);\n }\n\n private getAKVKeySize(retrievedKey: KeyVaultKey): number {\n if (!retrievedKey) {\n throw new Error('Retrieved key cannot be null or undefined');\n }\n const key = retrievedKey.key;\n\n if (!key) {\n throw new Error(`Key does not exist ${retrievedKey.name}`);\n }\n\n const kty: string | undefined = key && key.kty && key.kty.toString().toUpperCase();\n\n if (!kty || 'RSA'.localeCompare(kty, 'en') !== 0) {\n throw new Error(`Cannot use a non-RSA key: ${kty}.`);\n }\n\n const keyLength = key && key.n && key.n.length;\n\n return keyLength || 0;\n }\n\n private validateEncryptionAlgorithm(encryptionAlgorithm: string): string {\n if (!encryptionAlgorithm) {\n throw new Error('Key encryption algorithm cannot be null.');\n }\n\n if ('RSA_OAEP'.localeCompare(encryptionAlgorithm.toUpperCase(), 'en') === 0) {\n encryptionAlgorithm = 'RSA-OAEP';\n }\n\n if (this.rsaEncryptionAlgorithmWithOAEPForAKV.localeCompare(encryptionAlgorithm.trim().toUpperCase(), 'en') !== 0) {\n throw new Error(`Invalid key encryption algorithm specified: ${encryptionAlgorithm}. Expected value: ${this.rsaEncryptionAlgorithmWithOAEPForAKV}.`);\n }\n\n return encryptionAlgorithm;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"keystore-provider-azure-key-vault.js","names":["_identity","require","_keyvaultKeys","_crypto","_url","ColumnEncryptionAzureKeyVaultProvider","name","url","rsaEncryptionAlgorithmWithOAEPForAKV","firstVersion","credentials","azureKeyVaultDomainName","keyClient","constructor","clientId","clientKey","tenantId","Buffer","from","ClientSecretCredential","decryptColumnEncryptionKey","masterKeyPath","encryptionAlgorithm","encryptedColumnEncryptionKey","Error","length","validateEncryptionAlgorithm","masterKey","getMasterKey","keySizeInBytes","getAKVKeySize","cryptoClient","createCryptoClient","toString","currentIndex","keyPathLength","readInt16LE","cipherTextLength","signatureLength","cipherText","alloc","copy","signature","hash","messageDigest","createHash","update","dataToVerify","digest","verifyKey","verify","result","decryptedCEK","azureKeyVaultUnWrap","encryptColumnEncryptionKey","columnEncryptionKey","version","masterKeyPathBytes","toLowerCase","azureKeyVaultWrap","dataToHash","destinationPosition","dataToSign","signedHash","azureKeyVaultSignedHashedData","encryptedColumnEncryptionKeyLength","keyParts","parsePath","createKeyClient","vaultUrl","getKey","keyVaultUrl","KeyClient","CryptographyClient","trim","baseUri","parse","hostname","endsWith","segments","pathname","split","protocol","host","undefined","signedData","sign","wrappedKey","wrapKey","unwrappedKey","unwrapKey","retrievedKey","key","kty","toUpperCase","localeCompare","keyLength","n","exports"],"sources":["../../src/always-encrypted/keystore-provider-azure-key-vault.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { ClientSecretCredential } from '@azure/identity';\nimport { CryptographyClient, type KeyWrapAlgorithm, KeyClient, type KeyVaultKey } from '@azure/keyvault-keys';\nimport { createHash } from 'crypto';\nimport { parse } from 'url';\n\ninterface ParsedKeyPath {\n vaultUrl: string;\n name: string;\n version?: string | undefined;\n}\n\nexport class ColumnEncryptionAzureKeyVaultProvider {\n public readonly name: string;\n private url: undefined | string;\n private readonly rsaEncryptionAlgorithmWithOAEPForAKV: string;\n private readonly firstVersion: Buffer;\n private credentials: ClientSecretCredential;\n private readonly azureKeyVaultDomainName: string;\n private keyClient: undefined | KeyClient;\n\n constructor(clientId: string, clientKey: string, tenantId: string) {\n this.name = 'AZURE_KEY_VAULT';\n this.azureKeyVaultDomainName = 'vault.azure.net';\n this.rsaEncryptionAlgorithmWithOAEPForAKV = 'RSA-OAEP';\n this.firstVersion = Buffer.from([0x01]);\n this.credentials = new ClientSecretCredential(tenantId, clientId, clientKey);\n }\n\n async decryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, encryptedColumnEncryptionKey: Buffer): Promise<Buffer> {\n if (!encryptedColumnEncryptionKey) {\n throw new Error('Internal error. Encrypted column encryption key cannot be null.');\n }\n\n if (encryptedColumnEncryptionKey.length === 0) {\n throw new Error('Internal error. Empty encrypted column encryption key specified.');\n }\n\n encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);\n\n const masterKey = await this.getMasterKey(masterKeyPath);\n\n const keySizeInBytes = this.getAKVKeySize(masterKey);\n\n const cryptoClient = this.createCryptoClient(masterKey);\n\n if (encryptedColumnEncryptionKey[0] !== this.firstVersion[0]) {\n throw new Error(`Specified encrypted column encryption key contains an invalid encryption algorithm version ${Buffer.from([encryptedColumnEncryptionKey[0]]).toString('hex')}. Expected version is ${Buffer.from([this.firstVersion[0]]).toString('hex')}.`);\n }\n\n let currentIndex = this.firstVersion.length;\n const keyPathLength: number = encryptedColumnEncryptionKey.readInt16LE(currentIndex);\n\n currentIndex += 2;\n\n const cipherTextLength: number = encryptedColumnEncryptionKey.readInt16LE(currentIndex);\n\n currentIndex += 2;\n\n currentIndex += keyPathLength;\n\n if (cipherTextLength !== keySizeInBytes) {\n throw new Error(`The specified encrypted column encryption key's ciphertext length: ${cipherTextLength} does not match the ciphertext length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);\n }\n\n const signatureLength: number = encryptedColumnEncryptionKey.length - currentIndex - cipherTextLength;\n\n if (signatureLength !== keySizeInBytes) {\n throw new Error(`The specified encrypted column encryption key's signature length: ${signatureLength} does not match the signature length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);\n }\n\n const cipherText = Buffer.alloc(cipherTextLength);\n encryptedColumnEncryptionKey.copy(cipherText, 0, currentIndex, currentIndex + cipherTextLength);\n currentIndex += cipherTextLength;\n\n const signature = Buffer.alloc(signatureLength);\n encryptedColumnEncryptionKey.copy(signature, 0, currentIndex, currentIndex + signatureLength);\n\n const hash = Buffer.alloc(encryptedColumnEncryptionKey.length - signature.length);\n encryptedColumnEncryptionKey.copy(hash, 0, 0, encryptedColumnEncryptionKey.length - signature.length);\n\n const messageDigest = createHash('sha256');\n messageDigest.update(hash);\n\n const dataToVerify: Buffer = messageDigest.digest();\n\n if (!dataToVerify) {\n throw new Error('Hash should not be null while decrypting encrypted column encryption key.');\n }\n\n const verifyKey = await cryptoClient.verify('RS256', dataToVerify, signature);\n if (!verifyKey.result) {\n throw new Error(`The specified encrypted column encryption key signature does not match the signature computed with the column master key (Asymmetric key in Azure Key Vault) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified path may be incorrect.`);\n }\n\n const decryptedCEK: Buffer = await this.azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, cipherText);\n\n return decryptedCEK;\n }\n\n async encryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, columnEncryptionKey: Buffer): Promise<Buffer> {\n if (!columnEncryptionKey) {\n throw new Error('Column encryption key cannot be null.');\n }\n\n if (columnEncryptionKey.length === 0) {\n throw new Error('Empty column encryption key specified.');\n }\n\n encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);\n\n const masterKey = await this.getMasterKey(masterKeyPath);\n\n const keySizeInBytes = this.getAKVKeySize(masterKey);\n\n const cryptoClient = this.createCryptoClient(masterKey);\n\n const version = Buffer.from([this.firstVersion[0]]);\n\n const masterKeyPathBytes: Buffer = Buffer.from(masterKeyPath.toLowerCase(), 'utf8');\n\n const keyPathLength: Buffer = Buffer.alloc(2);\n\n keyPathLength[0] = masterKeyPathBytes.length & 0xff;\n keyPathLength[1] = masterKeyPathBytes.length >> 8 & 0xff;\n\n const cipherText: Buffer = await this.azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey);\n\n const cipherTextLength: Buffer = Buffer.alloc(2);\n\n cipherTextLength[0] = cipherText.length & 0xff;\n cipherTextLength[1] = cipherText.length >> 8 & 0xff;\n\n if (cipherText.length !== keySizeInBytes) {\n throw new Error('CipherText length does not match the RSA key size.');\n }\n\n const dataToHash: Buffer = Buffer.alloc(version.length + keyPathLength.length + cipherTextLength.length + masterKeyPathBytes.length + cipherText.length);\n let destinationPosition: number = version.length;\n version.copy(dataToHash, 0, 0, version.length);\n\n keyPathLength.copy(dataToHash, destinationPosition, 0, keyPathLength.length);\n destinationPosition += keyPathLength.length;\n\n cipherTextLength.copy(dataToHash, destinationPosition, 0, cipherTextLength.length);\n destinationPosition += cipherTextLength.length;\n\n masterKeyPathBytes.copy(dataToHash, destinationPosition, 0, masterKeyPathBytes.length);\n destinationPosition += masterKeyPathBytes.length;\n\n cipherText.copy(dataToHash, destinationPosition, 0, cipherText.length);\n\n const messageDigest = createHash('sha256');\n\n messageDigest.update(dataToHash);\n\n const dataToSign: Buffer = messageDigest.digest();\n\n const signedHash: Buffer = await this.azureKeyVaultSignedHashedData(cryptoClient, dataToSign);\n if (signedHash.length !== keySizeInBytes) {\n throw new Error('Signed hash length does not match the RSA key size.');\n }\n\n const verifyKey = await cryptoClient.verify('RS256', dataToSign, signedHash);\n\n if (!verifyKey.result) {\n throw new Error('Invalid signature of the encrypted column encryption key computed.');\n }\n\n const encryptedColumnEncryptionKeyLength: number = version.length + cipherTextLength.length + keyPathLength.length + cipherText.length + masterKeyPathBytes.length + signedHash.length;\n const encryptedColumnEncryptionKey: Buffer = Buffer.alloc(encryptedColumnEncryptionKeyLength);\n\n let currentIndex = 0;\n version.copy(encryptedColumnEncryptionKey, currentIndex, 0, version.length);\n currentIndex += version.length;\n\n keyPathLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, keyPathLength.length);\n currentIndex += keyPathLength.length;\n\n cipherTextLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherTextLength.length);\n currentIndex += cipherTextLength.length;\n\n masterKeyPathBytes.copy(encryptedColumnEncryptionKey, currentIndex, 0, masterKeyPathBytes.length);\n currentIndex += masterKeyPathBytes.length;\n\n cipherText.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherText.length);\n currentIndex += cipherText.length;\n\n signedHash.copy(encryptedColumnEncryptionKey, currentIndex, 0, signedHash.length);\n\n return encryptedColumnEncryptionKey;\n }\n\n private async getMasterKey(masterKeyPath: string): Promise<KeyVaultKey> {\n if (!masterKeyPath) {\n throw new Error('Master key path cannot be null or undefined');\n }\n const keyParts = this.parsePath(masterKeyPath);\n\n this.createKeyClient(keyParts.vaultUrl);\n\n return await (this.keyClient as KeyClient).getKey(keyParts.name, keyParts.version ? { version: keyParts.version } : {});\n }\n\n private createKeyClient(keyVaultUrl: string): void {\n if (!keyVaultUrl) {\n throw new Error('Cannot create key client with null or undefined keyVaultUrl');\n }\n if (!this.keyClient) {\n this.url = keyVaultUrl;\n this.keyClient = new KeyClient(keyVaultUrl, this.credentials);\n }\n }\n\n private createCryptoClient(masterKey: KeyVaultKey): CryptographyClient {\n if (!masterKey) {\n throw new Error('Cannot create CryptographyClient with null or undefined masterKey');\n }\n return new CryptographyClient(masterKey, this.credentials);\n }\n\n private parsePath(masterKeyPath: string): ParsedKeyPath {\n if (!masterKeyPath || masterKeyPath.trim() === '') {\n throw new Error('Azure Key Vault key path cannot be null.');\n }\n\n let baseUri;\n try {\n baseUri = parse(masterKeyPath, true, true);\n } catch {\n throw new Error(`Invalid keys identifier: ${masterKeyPath}. Not a valid URI`);\n }\n\n if (!baseUri.hostname || !baseUri.hostname.toLowerCase().endsWith(this.azureKeyVaultDomainName)) {\n throw new Error(`Invalid Azure Key Vault key path specified: ${masterKeyPath}.`);\n }\n\n // Path is of the form '/collection/name[/version]'\n const segments = (baseUri.pathname || '').split('/');\n if (segments.length !== 3 && segments.length !== 4) {\n throw new Error(\n `Invalid keys identifier: ${masterKeyPath}. Bad number of segments: ${segments.length}`\n );\n }\n\n if ('keys' !== segments[1]) {\n throw new Error(\n `Invalid keys identifier: ${masterKeyPath}. segment [1] should be \"keys\", found \"${segments[1]}\"`\n );\n }\n\n const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;\n const name = segments[2];\n const version = segments.length === 4 ? segments[3] : undefined;\n return {\n vaultUrl,\n name,\n version\n };\n }\n\n private async azureKeyVaultSignedHashedData(cryptoClient: CryptographyClient, dataToSign: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n const signedData = await cryptoClient.sign('RS256', dataToSign);\n\n return Buffer.from(signedData.result);\n }\n\n private async azureKeyVaultWrap(cryptoClient: CryptographyClient, encryptionAlgorithm: string, columnEncryptionKey: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n if (!columnEncryptionKey) {\n throw new Error('Column encryption key cannot be null.');\n }\n\n const wrappedKey = await cryptoClient.wrapKey(encryptionAlgorithm as KeyWrapAlgorithm, columnEncryptionKey);\n\n return Buffer.from(wrappedKey.result);\n }\n\n private async azureKeyVaultUnWrap(cryptoClient: CryptographyClient, encryptionAlgorithm: string, encryptedColumnEncryptionKey: Buffer): Promise<Buffer> {\n if (!cryptoClient) {\n throw new Error('Azure KVS Crypto Client is not defined.');\n }\n\n if (!encryptionAlgorithm) {\n throw new Error('Encryption Algorithm cannot be null or undefined');\n }\n\n if (!encryptedColumnEncryptionKey) {\n throw new Error('Encrypted column encryption key cannot be null.');\n }\n\n if (encryptedColumnEncryptionKey.length === 0) {\n throw new Error('Encrypted Column Encryption Key length should not be zero.');\n }\n\n const unwrappedKey = await cryptoClient.unwrapKey(encryptionAlgorithm as KeyWrapAlgorithm, encryptedColumnEncryptionKey);\n\n return Buffer.from(unwrappedKey.result);\n }\n\n private getAKVKeySize(retrievedKey: KeyVaultKey): number {\n if (!retrievedKey) {\n throw new Error('Retrieved key cannot be null or undefined');\n }\n const key = retrievedKey.key;\n\n if (!key) {\n throw new Error(`Key does not exist ${retrievedKey.name}`);\n }\n\n const kty: string | undefined = key && key.kty && key.kty.toString().toUpperCase();\n\n if (!kty || 'RSA'.localeCompare(kty, 'en') !== 0) {\n throw new Error(`Cannot use a non-RSA key: ${kty}.`);\n }\n\n const keyLength = key && key.n && key.n.length;\n\n return keyLength || 0;\n }\n\n private validateEncryptionAlgorithm(encryptionAlgorithm: string): string {\n if (!encryptionAlgorithm) {\n throw new Error('Key encryption algorithm cannot be null.');\n }\n\n if ('RSA_OAEP'.localeCompare(encryptionAlgorithm.toUpperCase(), 'en') === 0) {\n encryptionAlgorithm = 'RSA-OAEP';\n }\n\n if (this.rsaEncryptionAlgorithmWithOAEPForAKV.localeCompare(encryptionAlgorithm.trim().toUpperCase(), 'en') !== 0) {\n throw new Error(`Invalid key encryption algorithm specified: ${encryptionAlgorithm}. Expected value: ${this.rsaEncryptionAlgorithmWithOAEPForAKV}.`);\n }\n\n return encryptionAlgorithm;\n }\n}\n"],"mappings":"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"}
@@ -33,4 +33,4 @@ const getKey = async (keyInfo, options) => {
33
33
  }
34
34
  };
35
35
  exports.getKey = getKey;
36
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbHJ1Q2FjaGUiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiTFJVIiwiZ2V0S2V5Iiwia2V5SW5mbyIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiRXJyb3IiLCJzZXJ2ZXJOYW1lIiwia2V5TG9va3VwVmFsdWUiLCJCdWZmZXIiLCJmcm9tIiwiZW5jcnlwdGVkS2V5IiwidG9TdHJpbmciLCJrZXlTdG9yZU5hbWUiLCJoYXMiLCJnZXQiLCJwcm92aWRlciIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsInBsYWludGV4dEtleSIsImRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5Iiwia2V5UGF0aCIsImFsZ29yaXRobU5hbWUiLCJlbmNyeXB0aW9uS2V5IiwiU3ltbWV0cmljS2V5IiwiY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMIiwic2V0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL3N5bW1ldHJpYy1rZXktY2FjaGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5cbmNvbnN0IGNhY2hlID0gbmV3IExSVTxzdHJpbmcsIFN5bW1ldHJpY0tleT4oMCk7XG5cbmV4cG9ydCBjb25zdCBnZXRLZXkgPSBhc3luYyAoa2V5SW5mbzogRW5jcnlwdGlvbktleUluZm8sIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTeW1tZXRyaWNLZXk+ID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBnZXRLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHNlcnZlck5hbWU6IHN0cmluZyA9IG9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRTtcblxuICBjb25zdCBrZXlMb29rdXBWYWx1ZSA9IGAke3NlcnZlck5hbWV9OiR7QnVmZmVyLmZyb20oa2V5SW5mby5lbmNyeXB0ZWRLZXkpLnRvU3RyaW5nKCdiYXNlNjQnKX06JHtrZXlJbmZvLmtleVN0b3JlTmFtZX1gO1xuXG4gIGlmIChjYWNoZS5oYXMoa2V5TG9va3VwVmFsdWUpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChrZXlMb29rdXBWYWx1ZSkgYXMgU3ltbWV0cmljS2V5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gb3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMgJiYgb3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnNba2V5SW5mby5rZXlTdG9yZU5hbWVdO1xuICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY3J5cHQgYSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkuIEludmFsaWQga2V5IHN0b3JlIHByb3ZpZGVyIG5hbWU6ICR7a2V5SW5mby5rZXlTdG9yZU5hbWV9LiBBIGtleSBzdG9yZSBwcm92aWRlciBuYW1lIG11c3QgZGVub3RlIGVpdGhlciBhIHN5c3RlbSBrZXkgc3RvcmUgcHJvdmlkZXIgb3IgYSByZWdpc3RlcmVkIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXIuIFZhbGlkIChjdXJyZW50bHkgcmVnaXN0ZXJlZCkgY3VzdG9tIGtleSBzdG9yZSBwcm92aWRlciBuYW1lcyBhcmU6ICR7b3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnN9LiBQbGVhc2UgdmVyaWZ5IGtleSBzdG9yZSBwcm92aWRlciBpbmZvcm1hdGlvbiBpbiBjb2x1bW4gbWFzdGVyIGtleSBkZWZpbml0aW9ucyBpbiB0aGUgZGF0YWJhc2UsIGFuZCB2ZXJpZnkgYWxsIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXJzIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbiBhcmUgcmVnaXN0ZXJlZCBwcm9wZXJseS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFpbnRleHRLZXk6IEJ1ZmZlciA9IGF3YWl0IHByb3ZpZGVyLmRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KGtleUluZm8ua2V5UGF0aCwga2V5SW5mby5hbGdvcml0aG1OYW1lLCBrZXlJbmZvLmVuY3J5cHRlZEtleSk7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IFN5bW1ldHJpY0tleShwbGFpbnRleHRLZXkpO1xuXG4gICAgaWYgKG9wdGlvbnMuY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMID4gMCkge1xuICAgICAgY2FjaGUuc2V0KGtleUxvb2t1cFZhbHVlLCBlbmNyeXB0aW9uS2V5LCBvcHRpb25zLmNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLElBQUFBLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUE0QixTQUFBRCx1QkFBQUcsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQU41QjtBQUNBOztBQU9BLE1BQU1HLEtBQUssR0FBRyxJQUFJQyxpQkFBRyxDQUF1QixDQUFDLENBQUM7QUFFdkMsTUFBTUMsTUFBTSxHQUFHLE1BQUFBLENBQU9DLE9BQTBCLEVBQUVDLE9BQTBCLEtBQTRCO0VBQzdHLElBQUksQ0FBQ0EsT0FBTyxDQUFDQyxtQkFBbUIsRUFBRTtJQUNoQyxNQUFNLElBQUlDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztFQUM3RDtFQUVBLE1BQU1DLFVBQWtCLEdBQUdILE9BQU8sQ0FBQ0MsbUJBQW1CO0VBRXRELE1BQU1HLGNBQWMsR0FBSSxHQUFFRCxVQUFXLElBQUdFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUCxPQUFPLENBQUNRLFlBQVksQ0FBQyxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFFLElBQUdULE9BQU8sQ0FBQ1UsWUFBYSxFQUFDO0VBRXRILElBQUliLEtBQUssQ0FBQ2MsR0FBRyxDQUFDTixjQUFjLENBQUMsRUFBRTtJQUM3QixPQUFPUixLQUFLLENBQUNlLEdBQUcsQ0FBQ1AsY0FBYyxDQUFDO0VBQ2xDLENBQUMsTUFBTTtJQUNMLE1BQU1RLFFBQVEsR0FBR1osT0FBTyxDQUFDYSwyQkFBMkIsSUFBSWIsT0FBTyxDQUFDYSwyQkFBMkIsQ0FBQ2QsT0FBTyxDQUFDVSxZQUFZLENBQUM7SUFDakgsSUFBSSxDQUFDRyxRQUFRLEVBQUU7TUFDYixNQUFNLElBQUlWLEtBQUssQ0FBRSwrRUFBOEVILE9BQU8sQ0FBQ1UsWUFBYSwyTEFBMExULE9BQU8sQ0FBQ2EsMkJBQTRCLDhMQUE2TCxDQUFDO0lBQ2xoQjtJQUVBLE1BQU1DLFlBQW9CLEdBQUcsTUFBTUYsUUFBUSxDQUFDRywwQkFBMEIsQ0FBQ2hCLE9BQU8sQ0FBQ2lCLE9BQU8sRUFBRWpCLE9BQU8sQ0FBQ2tCLGFBQWEsRUFBRWxCLE9BQU8sQ0FBQ1EsWUFBWSxDQUFDO0lBRXBJLE1BQU1XLGFBQWEsR0FBRyxJQUFJQyxxQkFBWSxDQUFDTCxZQUFZLENBQUM7SUFFcEQsSUFBSWQsT0FBTyxDQUFDb0IsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFO01BQzNDeEIsS0FBSyxDQUFDeUIsR0FBRyxDQUFDakIsY0FBYyxFQUFFYyxhQUFhLEVBQUVsQixPQUFPLENBQUNvQiwyQkFBMkIsQ0FBQztJQUMvRTtJQUVBLE9BQU9GLGFBQWE7RUFDdEI7QUFDRixDQUFDO0FBQUNJLE9BQUEsQ0FBQXhCLE1BQUEsR0FBQUEsTUFBQSJ9
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbHJ1Q2FjaGUiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiTFJVIiwiZ2V0S2V5Iiwia2V5SW5mbyIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiRXJyb3IiLCJzZXJ2ZXJOYW1lIiwia2V5TG9va3VwVmFsdWUiLCJCdWZmZXIiLCJmcm9tIiwiZW5jcnlwdGVkS2V5IiwidG9TdHJpbmciLCJrZXlTdG9yZU5hbWUiLCJoYXMiLCJnZXQiLCJwcm92aWRlciIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsInBsYWludGV4dEtleSIsImRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5Iiwia2V5UGF0aCIsImFsZ29yaXRobU5hbWUiLCJlbmNyeXB0aW9uS2V5IiwiU3ltbWV0cmljS2V5IiwiY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMIiwic2V0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL3N5bW1ldHJpYy1rZXktY2FjaGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBTeW1tZXRyaWNLZXkgZnJvbSAnLi9zeW1tZXRyaWMta2V5JztcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyBhcyBDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuXG5jb25zdCBjYWNoZSA9IG5ldyBMUlU8c3RyaW5nLCBTeW1tZXRyaWNLZXk+KDApO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ID0gYXN5bmMgKGtleUluZm86IEVuY3J5cHRpb25LZXlJbmZvLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U3ltbWV0cmljS2V5PiA9PiB7XG4gIGlmICghb3B0aW9ucy50cnVzdGVkU2VydmVyTmFtZUFFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgbmFtZSBzaG91bGQgbm90IGJlIG51bGwgaW4gZ2V0S2V5Jyk7XG4gIH1cblxuICBjb25zdCBzZXJ2ZXJOYW1lOiBzdHJpbmcgPSBvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUU7XG5cbiAgY29uc3Qga2V5TG9va3VwVmFsdWUgPSBgJHtzZXJ2ZXJOYW1lfToke0J1ZmZlci5mcm9tKGtleUluZm8uZW5jcnlwdGVkS2V5KS50b1N0cmluZygnYmFzZTY0Jyl9OiR7a2V5SW5mby5rZXlTdG9yZU5hbWV9YDtcblxuICBpZiAoY2FjaGUuaGFzKGtleUxvb2t1cFZhbHVlKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQoa2V5TG9va3VwVmFsdWUpIGFzIFN5bW1ldHJpY0tleTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG9wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzICYmIG9wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzW2tleUluZm8ua2V5U3RvcmVOYW1lXTtcbiAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZWNyeXB0IGEgY29sdW1uIGVuY3J5cHRpb24ga2V5LiBJbnZhbGlkIGtleSBzdG9yZSBwcm92aWRlciBuYW1lOiAke2tleUluZm8ua2V5U3RvcmVOYW1lfS4gQSBrZXkgc3RvcmUgcHJvdmlkZXIgbmFtZSBtdXN0IGRlbm90ZSBlaXRoZXIgYSBzeXN0ZW0ga2V5IHN0b3JlIHByb3ZpZGVyIG9yIGEgcmVnaXN0ZXJlZCBjdXN0b20ga2V5IHN0b3JlIHByb3ZpZGVyLiBWYWxpZCAoY3VycmVudGx5IHJlZ2lzdGVyZWQpIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXIgbmFtZXMgYXJlOiAke29wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzfS4gUGxlYXNlIHZlcmlmeSBrZXkgc3RvcmUgcHJvdmlkZXIgaW5mb3JtYXRpb24gaW4gY29sdW1uIG1hc3RlciBrZXkgZGVmaW5pdGlvbnMgaW4gdGhlIGRhdGFiYXNlLCBhbmQgdmVyaWZ5IGFsbCBjdXN0b20ga2V5IHN0b3JlIHByb3ZpZGVycyB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24gYXJlIHJlZ2lzdGVyZWQgcHJvcGVybHkuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW50ZXh0S2V5OiBCdWZmZXIgPSBhd2FpdCBwcm92aWRlci5kZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleShrZXlJbmZvLmtleVBhdGgsIGtleUluZm8uYWxnb3JpdGhtTmFtZSwga2V5SW5mby5lbmNyeXB0ZWRLZXkpO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG5ldyBTeW1tZXRyaWNLZXkocGxhaW50ZXh0S2V5KTtcblxuICAgIGlmIChvcHRpb25zLmNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCA+IDApIHtcbiAgICAgIGNhY2hlLnNldChrZXlMb29rdXBWYWx1ZSwgZW5jcnlwdGlvbktleSwgb3B0aW9ucy5jb2x1bW5FbmNyeXB0aW9uS2V5Q2FjaGVUVEwpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNyeXB0aW9uS2V5O1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSxJQUFBQSxhQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxTQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFBNEIsU0FBQUQsdUJBQUFHLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFONUI7QUFDQTs7QUFPQSxNQUFNRyxLQUFLLEdBQUcsSUFBSUMsaUJBQUcsQ0FBdUIsQ0FBQyxDQUFDO0FBRXZDLE1BQU1DLE1BQU0sR0FBRyxNQUFBQSxDQUFPQyxPQUEwQixFQUFFQyxPQUEwQixLQUE0QjtFQUM3RyxJQUFJLENBQUNBLE9BQU8sQ0FBQ0MsbUJBQW1CLEVBQUU7SUFDaEMsTUFBTSxJQUFJQyxLQUFLLENBQUMsMENBQTBDLENBQUM7RUFDN0Q7RUFFQSxNQUFNQyxVQUFrQixHQUFHSCxPQUFPLENBQUNDLG1CQUFtQjtFQUV0RCxNQUFNRyxjQUFjLEdBQUksR0FBRUQsVUFBVyxJQUFHRSxNQUFNLENBQUNDLElBQUksQ0FBQ1AsT0FBTyxDQUFDUSxZQUFZLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLFFBQVEsQ0FBRSxJQUFHVCxPQUFPLENBQUNVLFlBQWEsRUFBQztFQUV0SCxJQUFJYixLQUFLLENBQUNjLEdBQUcsQ0FBQ04sY0FBYyxDQUFDLEVBQUU7SUFDN0IsT0FBT1IsS0FBSyxDQUFDZSxHQUFHLENBQUNQLGNBQWMsQ0FBQztFQUNsQyxDQUFDLE1BQU07SUFDTCxNQUFNUSxRQUFRLEdBQUdaLE9BQU8sQ0FBQ2EsMkJBQTJCLElBQUliLE9BQU8sQ0FBQ2EsMkJBQTJCLENBQUNkLE9BQU8sQ0FBQ1UsWUFBWSxDQUFDO0lBQ2pILElBQUksQ0FBQ0csUUFBUSxFQUFFO01BQ2IsTUFBTSxJQUFJVixLQUFLLENBQUUsK0VBQThFSCxPQUFPLENBQUNVLFlBQWEsMkxBQTBMVCxPQUFPLENBQUNhLDJCQUE0Qiw4TEFBNkwsQ0FBQztJQUNsaEI7SUFFQSxNQUFNQyxZQUFvQixHQUFHLE1BQU1GLFFBQVEsQ0FBQ0csMEJBQTBCLENBQUNoQixPQUFPLENBQUNpQixPQUFPLEVBQUVqQixPQUFPLENBQUNrQixhQUFhLEVBQUVsQixPQUFPLENBQUNRLFlBQVksQ0FBQztJQUVwSSxNQUFNVyxhQUFhLEdBQUcsSUFBSUMscUJBQVksQ0FBQ0wsWUFBWSxDQUFDO0lBRXBELElBQUlkLE9BQU8sQ0FBQ29CLDJCQUEyQixHQUFHLENBQUMsRUFBRTtNQUMzQ3hCLEtBQUssQ0FBQ3lCLEdBQUcsQ0FBQ2pCLGNBQWMsRUFBRWMsYUFBYSxFQUFFbEIsT0FBTyxDQUFDb0IsMkJBQTJCLENBQUM7SUFDL0U7SUFFQSxPQUFPRixhQUFhO0VBQ3RCO0FBQ0YsQ0FBQztBQUFDSSxPQUFBLENBQUF4QixNQUFBLEdBQUFBLE1BQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"symmetric-key-cache.js","names":["_symmetricKey","_interopRequireDefault","require","_lruCache","obj","__esModule","default","cache","LRU","getKey","keyInfo","options","trustedServerNameAE","Error","serverName","keyLookupValue","Buffer","from","encryptedKey","toString","keyStoreName","has","get","provider","encryptionKeyStoreProviders","plaintextKey","decryptColumnEncryptionKey","keyPath","algorithmName","encryptionKey","SymmetricKey","columnEncryptionKeyCacheTTL","set","exports"],"sources":["../../src/always-encrypted/symmetric-key-cache.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { EncryptionKeyInfo } from './types';\nimport SymmetricKey from './symmetric-key';\nimport { InternalConnectionOptions as ConnectionOptions } from '../connection';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, SymmetricKey>(0);\n\nexport const getKey = async (keyInfo: EncryptionKeyInfo, options: ConnectionOptions): Promise<SymmetricKey> => {\n if (!options.trustedServerNameAE) {\n throw new Error('Server name should not be null in getKey');\n }\n\n const serverName: string = options.trustedServerNameAE;\n\n const keyLookupValue = `${serverName}:${Buffer.from(keyInfo.encryptedKey).toString('base64')}:${keyInfo.keyStoreName}`;\n\n if (cache.has(keyLookupValue)) {\n return cache.get(keyLookupValue) as SymmetricKey;\n } else {\n const provider = options.encryptionKeyStoreProviders && options.encryptionKeyStoreProviders[keyInfo.keyStoreName];\n if (!provider) {\n throw new Error(`Failed to decrypt a column encryption key. Invalid key store provider name: ${keyInfo.keyStoreName}. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid (currently registered) custom key store provider names are: ${options.encryptionKeyStoreProviders}. Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly.`);\n }\n\n const plaintextKey: Buffer = await provider.decryptColumnEncryptionKey(keyInfo.keyPath, keyInfo.algorithmName, keyInfo.encryptedKey);\n\n const encryptionKey = new SymmetricKey(plaintextKey);\n\n if (options.columnEncryptionKeyCacheTTL > 0) {\n cache.set(keyLookupValue, encryptionKey, options.columnEncryptionKeyCacheTTL);\n }\n\n return encryptionKey;\n }\n};\n"],"mappings":";;;;;;AAIA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA4B,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAN5B;AACA;;AAOA,MAAMG,KAAK,GAAG,IAAIC,iBAAG,CAAuB,CAAC,CAAC;AAEvC,MAAMC,MAAM,GAAG,MAAAA,CAAOC,OAA0B,EAAEC,OAA0B,KAA4B;EAC7G,IAAI,CAACA,OAAO,CAACC,mBAAmB,EAAE;IAChC,MAAM,IAAIC,KAAK,CAAC,0CAA0C,CAAC;EAC7D;EAEA,MAAMC,UAAkB,GAAGH,OAAO,CAACC,mBAAmB;EAEtD,MAAMG,cAAc,GAAI,GAAED,UAAW,IAAGE,MAAM,CAACC,IAAI,CAACP,OAAO,CAACQ,YAAY,CAAC,CAACC,QAAQ,CAAC,QAAQ,CAAE,IAAGT,OAAO,CAACU,YAAa,EAAC;EAEtH,IAAIb,KAAK,CAACc,GAAG,CAACN,cAAc,CAAC,EAAE;IAC7B,OAAOR,KAAK,CAACe,GAAG,CAACP,cAAc,CAAC;EAClC,CAAC,MAAM;IACL,MAAMQ,QAAQ,GAAGZ,OAAO,CAACa,2BAA2B,IAAIb,OAAO,CAACa,2BAA2B,CAACd,OAAO,CAACU,YAAY,CAAC;IACjH,IAAI,CAACG,QAAQ,EAAE;MACb,MAAM,IAAIV,KAAK,CAAE,+EAA8EH,OAAO,CAACU,YAAa,2LAA0LT,OAAO,CAACa,2BAA4B,8LAA6L,CAAC;IAClhB;IAEA,MAAMC,YAAoB,GAAG,MAAMF,QAAQ,CAACG,0BAA0B,CAAChB,OAAO,CAACiB,OAAO,EAAEjB,OAAO,CAACkB,aAAa,EAAElB,OAAO,CAACQ,YAAY,CAAC;IAEpI,MAAMW,aAAa,GAAG,IAAIC,qBAAY,CAACL,YAAY,CAAC;IAEpD,IAAId,OAAO,CAACoB,2BAA2B,GAAG,CAAC,EAAE;MAC3CxB,KAAK,CAACyB,GAAG,CAACjB,cAAc,EAAEc,aAAa,EAAElB,OAAO,CAACoB,2BAA2B,CAAC;IAC/E;IAEA,OAAOF,aAAa;EACtB;AACF,CAAC;AAACI,OAAA,CAAAxB,MAAA,GAAAA,MAAA"}
1
+ {"version":3,"file":"symmetric-key-cache.js","names":["_symmetricKey","_interopRequireDefault","require","_lruCache","obj","__esModule","default","cache","LRU","getKey","keyInfo","options","trustedServerNameAE","Error","serverName","keyLookupValue","Buffer","from","encryptedKey","toString","keyStoreName","has","get","provider","encryptionKeyStoreProviders","plaintextKey","decryptColumnEncryptionKey","keyPath","algorithmName","encryptionKey","SymmetricKey","columnEncryptionKeyCacheTTL","set","exports"],"sources":["../../src/always-encrypted/symmetric-key-cache.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { type EncryptionKeyInfo } from './types';\nimport SymmetricKey from './symmetric-key';\nimport { type InternalConnectionOptions as ConnectionOptions } from '../connection';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, SymmetricKey>(0);\n\nexport const getKey = async (keyInfo: EncryptionKeyInfo, options: ConnectionOptions): Promise<SymmetricKey> => {\n if (!options.trustedServerNameAE) {\n throw new Error('Server name should not be null in getKey');\n }\n\n const serverName: string = options.trustedServerNameAE;\n\n const keyLookupValue = `${serverName}:${Buffer.from(keyInfo.encryptedKey).toString('base64')}:${keyInfo.keyStoreName}`;\n\n if (cache.has(keyLookupValue)) {\n return cache.get(keyLookupValue) as SymmetricKey;\n } else {\n const provider = options.encryptionKeyStoreProviders && options.encryptionKeyStoreProviders[keyInfo.keyStoreName];\n if (!provider) {\n throw new Error(`Failed to decrypt a column encryption key. Invalid key store provider name: ${keyInfo.keyStoreName}. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid (currently registered) custom key store provider names are: ${options.encryptionKeyStoreProviders}. Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly.`);\n }\n\n const plaintextKey: Buffer = await provider.decryptColumnEncryptionKey(keyInfo.keyPath, keyInfo.algorithmName, keyInfo.encryptedKey);\n\n const encryptionKey = new SymmetricKey(plaintextKey);\n\n if (options.columnEncryptionKeyCacheTTL > 0) {\n cache.set(keyLookupValue, encryptionKey, options.columnEncryptionKeyCacheTTL);\n }\n\n return encryptionKey;\n }\n};\n"],"mappings":";;;;;;AAIA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA4B,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAN5B;AACA;;AAOA,MAAMG,KAAK,GAAG,IAAIC,iBAAG,CAAuB,CAAC,CAAC;AAEvC,MAAMC,MAAM,GAAG,MAAAA,CAAOC,OAA0B,EAAEC,OAA0B,KAA4B;EAC7G,IAAI,CAACA,OAAO,CAACC,mBAAmB,EAAE;IAChC,MAAM,IAAIC,KAAK,CAAC,0CAA0C,CAAC;EAC7D;EAEA,MAAMC,UAAkB,GAAGH,OAAO,CAACC,mBAAmB;EAEtD,MAAMG,cAAc,GAAI,GAAED,UAAW,IAAGE,MAAM,CAACC,IAAI,CAACP,OAAO,CAACQ,YAAY,CAAC,CAACC,QAAQ,CAAC,QAAQ,CAAE,IAAGT,OAAO,CAACU,YAAa,EAAC;EAEtH,IAAIb,KAAK,CAACc,GAAG,CAACN,cAAc,CAAC,EAAE;IAC7B,OAAOR,KAAK,CAACe,GAAG,CAACP,cAAc,CAAC;EAClC,CAAC,MAAM;IACL,MAAMQ,QAAQ,GAAGZ,OAAO,CAACa,2BAA2B,IAAIb,OAAO,CAACa,2BAA2B,CAACd,OAAO,CAACU,YAAY,CAAC;IACjH,IAAI,CAACG,QAAQ,EAAE;MACb,MAAM,IAAIV,KAAK,CAAE,+EAA8EH,OAAO,CAACU,YAAa,2LAA0LT,OAAO,CAACa,2BAA4B,8LAA6L,CAAC;IAClhB;IAEA,MAAMC,YAAoB,GAAG,MAAMF,QAAQ,CAACG,0BAA0B,CAAChB,OAAO,CAACiB,OAAO,EAAEjB,OAAO,CAACkB,aAAa,EAAElB,OAAO,CAACQ,YAAY,CAAC;IAEpI,MAAMW,aAAa,GAAG,IAAIC,qBAAY,CAACL,YAAY,CAAC;IAEpD,IAAId,OAAO,CAACoB,2BAA2B,GAAG,CAAC,EAAE;MAC3CxB,KAAK,CAACyB,GAAG,CAACjB,cAAc,EAAEc,aAAa,EAAElB,OAAO,CAACoB,2BAA2B,CAAC;IAC/E;IAEA,OAAOF,aAAa;EACtB;AACF,CAAC;AAACI,OAAA,CAAAxB,MAAA,GAAAA,MAAA"}
@@ -49,4 +49,4 @@ let SQLServerStatementColumnEncryptionSetting = /*#__PURE__*/function (SQLServer
49
49
  return SQLServerStatementColumnEncryptionSetting;
50
50
  }({});
51
51
  exports.SQLServerStatementColumnEncryptionSetting = SQLServerStatementColumnEncryptionSetting;
52
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsImV4cG9ydHMiLCJEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IENFS0VudHJ5IH0gZnJvbSAnLi9jZWstZW50cnknO1xuaW1wb3J0IHsgQmFzZU1ldGFkYXRhIH0gZnJvbSAnLi4vbWV0YWRhdGEtcGFyc2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0aW9uS2V5SW5mbyB7XG4gIGVuY3J5cHRlZEtleTogQnVmZmVyO1xuICBkYklkOiBudW1iZXI7XG4gIGtleUlkOiBudW1iZXI7XG4gIGtleVZlcnNpb246IG51bWJlcjtcbiAgbWRWZXJzaW9uOiBCdWZmZXI7XG4gIGtleVBhdGg6IHN0cmluZztcbiAga2V5U3RvcmVOYW1lOiBzdHJpbmc7XG4gIGFsZ29yaXRobU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gU1FMU2VydmVyRW5jcnlwdGlvblR5cGUge1xuICBEZXRlcm1pbmlzdGljID0gMSxcbiAgUmFuZG9taXplZCA9IDIsXG4gIFBsYWluVGV4dCA9IDAsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIGVuY3J5cHREYXRhOiAocGxhaW5UZXh0OiBCdWZmZXIpID0+IEJ1ZmZlcjtcbiAgZGVjcnlwdERhdGE6IChjaXBoZXJUZXh0OiBCdWZmZXIpID0+IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcnlwdG9NZXRhZGF0YSB7XG4gIGNla0VudHJ5PzogQ0VLRW50cnk7XG4gIGNpcGhlckFsZ29yaXRobUlkOiBudW1iZXI7XG4gIGNpcGhlckFsZ29yaXRobU5hbWU/OiBzdHJpbmc7XG4gIG5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbjogQnVmZmVyO1xuICBlbmNyeXB0aW9uS2V5SW5mbz86IEVuY3J5cHRpb25LZXlJbmZvO1xuICBvcmRpbmFsOiBudW1iZXI7XG4gIGVuY3J5cHRpb25UeXBlOiBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZTtcbiAgY2lwaGVyQWxnb3JpdGhtPzogRW5jcnlwdGlvbkFsZ29yaXRobTtcbiAgYmFzZVR5cGVJbmZvPzogQmFzZU1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc2hNYXA8VD4ge1xuICBbaGFzaDogc3RyaW5nXTogVDtcbn1cblxuXG4vLyBGaWVsZHMgaW4gdGhlIGZpcnN0IHJlc3VsdHNldCBvZiBcInNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uXCJcbi8vIFdlIGV4cGVjdCB0aGUgc2VydmVyIHRvIHJldHVybiB0aGUgZmllbGRzIGluIHRoZSByZXN1bHRzZXQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWVudGlvbmVkIGJlbG93LlxuLy8gSWYgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZSBiZWxvdyBvcmRlciwgdGhlbiB0cmFuc3BhcmVudCBwYXJhbWV0ZXIgZW5jcnlwdGlvbiB3aWxsIGJyZWFrLlxuZXhwb3J0IGVudW0gRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSB7XG4gIEtleU9yZGluYWwsXG4gIERiSWQsXG4gIEtleUlkLFxuICBLZXlWZXJzaW9uLFxuICBLZXlNZFZlcnNpb24sXG4gIEVuY3J5cHRlZEtleSxcbiAgUHJvdmlkZXJOYW1lLFxuICBLZXlQYXRoLFxuICBLZXlFbmNyeXB0aW9uQWxnb3JpdGhtXG59XG5cblxuLy8gRmllbGRzIGluIHRoZSBzZWNvbmQgcmVzdWx0c2V0IG9mIFwic3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb25cIlxuLy8gV2UgZXhwZWN0IHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIHRoZSBmaWVsZHMgaW4gdGhlIHJlc3VsdHNldCBpbiB0aGUgc2FtZSBvcmRlciBhcyBtZW50aW9uZWQgYmVsb3cuXG4vLyBJZiB0aGUgc2VydmVyIGNoYW5nZXMgdGhlIGJlbG93IG9yZGVyLCB0aGVuIHRyYW5zcGFyZW50IHBhcmFtZXRlciBlbmNyeXB0aW9uIHdpbGwgYnJlYWsuXG5leHBvcnQgZW51bSBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIHtcbiAgUGFyYW1ldGVyT3JkaW5hbCxcbiAgUGFyYW1ldGVyTmFtZSxcbiAgQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgQ29sdW1uRW5jcnl0aW9uVHlwZSxcbiAgQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWwsXG4gIE5vcm1hbGl6YXRpb25SdWxlVmVyc2lvblxufVxuXG5leHBvcnQgZW51bSBTUUxTZXJ2ZXJTdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZyB7XG4gIC8qKlxuICAgKiBpZiBcIkNvbHVtbiBFbmNyeXB0aW9uIFNldHRpbmc9RW5hYmxlZFwiIGluIHRoZSBjb25uZWN0aW9uIHN0cmluZywgdXNlIEVuYWJsZWQuIE90aGVyd2lzZSwgbWFwcyB0byBEaXNhYmxlZC5cbiAgICovXG4gIFVzZUNvbm5lY3Rpb25TZXR0aW5nLFxuICAvKipcbiAgICogRW5hYmxlcyBUQ0UgZm9yIHRoZSBjb21tYW5kLiBPdmVycmlkZXMgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgc2V0dGluZyBmb3IgdGhpcyBjb21tYW5kLlxuICAgKi9cbiAgRW5hYmxlZCxcbiAgLyoqXG4gICAqIFBhcmFtZXRlcnMgd2lsbCBub3QgYmUgZW5jcnlwdGVkLCBvbmx5IHRoZSBSZXN1bHRTZXQgd2lsbCBiZSBkZWNyeXB0ZWQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGZvciBxdWVyaWVzIHRoYXRcbiAgICogZG8gbm90IHBhc3MgYW55IGVuY3J5cHRlZCBpbnB1dCBwYXJhbWV0ZXJzLiBPdmVycmlkZXMgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgc2V0dGluZyBmb3IgdGhpcyBjb21tYW5kLlxuICAgKi9cbiAgUmVzdWx0U2V0T25seSxcbiAgLyoqXG4gICAqIERpc2FibGVzIFRDRSBmb3IgdGhlIGNvbW1hbmQuT3ZlcnJpZGVzIHRoZSBjb25uZWN0aW9uIGxldmVsIHNldHRpbmcgZm9yIHRoaXMgY29tbWFuZC5cbiAgICovXG4gIERpc2FibGVkLFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQUEsSUFnQllBLHVCQUF1QiwwQkFBdkJBLHVCQUF1QjtFQUF2QkEsdUJBQXVCLENBQXZCQSx1QkFBdUI7RUFBdkJBLHVCQUF1QixDQUF2QkEsdUJBQXVCO0VBQXZCQSx1QkFBdUIsQ0FBdkJBLHVCQUF1QjtFQUFBLE9BQXZCQSx1QkFBdUI7QUFBQTtBQUFBQyxPQUFBLENBQUFELHVCQUFBLEdBQUFBLHVCQUFBO0FBNEJuQztBQUNBO0FBQ0E7QUFBQSxJQUNZRSxxQ0FBcUMsMEJBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBQSxPQUFyQ0EscUNBQXFDO0FBQUEsT0FhakQ7QUFDQTtBQUNBO0FBQUFELE9BQUEsQ0FBQUMscUNBQUEsR0FBQUEscUNBQUE7QUFBQSxJQUNZQyxxQ0FBcUMsMEJBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBQSxPQUFyQ0EscUNBQXFDO0FBQUE7QUFBQUYsT0FBQSxDQUFBRSxxQ0FBQSxHQUFBQSxxQ0FBQTtBQUFBLElBU3JDQyx5Q0FBeUMsMEJBQXpDQSx5Q0FBeUM7RUFBekNBLHlDQUF5QyxDQUF6Q0EseUNBQXlDO0VBQXpDQSx5Q0FBeUMsQ0FBekNBLHlDQUF5QztFQUF6Q0EseUNBQXlDLENBQXpDQSx5Q0FBeUM7RUFBekNBLHlDQUF5QyxDQUF6Q0EseUNBQXlDO0VBQUEsT0FBekNBLHlDQUF5QztBQUFBO0FBQUFILE9BQUEsQ0FBQUcseUNBQUEsR0FBQUEseUNBQUEifQ==
52
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsImV4cG9ydHMiLCJEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IENFS0VudHJ5IH0gZnJvbSAnLi9jZWstZW50cnknO1xuaW1wb3J0IHsgdHlwZSBCYXNlTWV0YWRhdGEgfSBmcm9tICcuLi9tZXRhZGF0YS1wYXJzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRpb25LZXlJbmZvIHtcbiAgZW5jcnlwdGVkS2V5OiBCdWZmZXI7XG4gIGRiSWQ6IG51bWJlcjtcbiAga2V5SWQ6IG51bWJlcjtcbiAga2V5VmVyc2lvbjogbnVtYmVyO1xuICBtZFZlcnNpb246IEJ1ZmZlcjtcbiAga2V5UGF0aDogc3RyaW5nO1xuICBrZXlTdG9yZU5hbWU6IHN0cmluZztcbiAgYWxnb3JpdGhtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSB7XG4gIERldGVybWluaXN0aWMgPSAxLFxuICBSYW5kb21pemVkID0gMixcbiAgUGxhaW5UZXh0ID0gMCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgZW5jcnlwdERhdGE6IChwbGFpblRleHQ6IEJ1ZmZlcikgPT4gQnVmZmVyO1xuICBkZWNyeXB0RGF0YTogKGNpcGhlclRleHQ6IEJ1ZmZlcikgPT4gQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyeXB0b01ldGFkYXRhIHtcbiAgY2VrRW50cnk/OiBDRUtFbnRyeTtcbiAgY2lwaGVyQWxnb3JpdGhtSWQ6IG51bWJlcjtcbiAgY2lwaGVyQWxnb3JpdGhtTmFtZT86IHN0cmluZztcbiAgbm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uOiBCdWZmZXI7XG4gIGVuY3J5cHRpb25LZXlJbmZvPzogRW5jcnlwdGlvbktleUluZm87XG4gIG9yZGluYWw6IG51bWJlcjtcbiAgZW5jcnlwdGlvblR5cGU6IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlO1xuICBjaXBoZXJBbGdvcml0aG0/OiBFbmNyeXB0aW9uQWxnb3JpdGhtO1xuICBiYXNlVHlwZUluZm8/OiBCYXNlTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzaE1hcDxUPiB7XG4gIFtoYXNoOiBzdHJpbmddOiBUO1xufVxuXG5cbi8vIEZpZWxkcyBpbiB0aGUgZmlyc3QgcmVzdWx0c2V0IG9mIFwic3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb25cIlxuLy8gV2UgZXhwZWN0IHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIHRoZSBmaWVsZHMgaW4gdGhlIHJlc3VsdHNldCBpbiB0aGUgc2FtZSBvcmRlciBhcyBtZW50aW9uZWQgYmVsb3cuXG4vLyBJZiB0aGUgc2VydmVyIGNoYW5nZXMgdGhlIGJlbG93IG9yZGVyLCB0aGVuIHRyYW5zcGFyZW50IHBhcmFtZXRlciBlbmNyeXB0aW9uIHdpbGwgYnJlYWsuXG5leHBvcnQgZW51bSBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxIHtcbiAgS2V5T3JkaW5hbCxcbiAgRGJJZCxcbiAgS2V5SWQsXG4gIEtleVZlcnNpb24sXG4gIEtleU1kVmVyc2lvbixcbiAgRW5jcnlwdGVkS2V5LFxuICBQcm92aWRlck5hbWUsXG4gIEtleVBhdGgsXG4gIEtleUVuY3J5cHRpb25BbGdvcml0aG1cbn1cblxuXG4vLyBGaWVsZHMgaW4gdGhlIHNlY29uZCByZXN1bHRzZXQgb2YgXCJzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvblwiXG4vLyBXZSBleHBlY3QgdGhlIHNlcnZlciB0byByZXR1cm4gdGhlIGZpZWxkcyBpbiB0aGUgcmVzdWx0c2V0IGluIHRoZSBzYW1lIG9yZGVyIGFzIG1lbnRpb25lZCBiZWxvdy5cbi8vIElmIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGUgYmVsb3cgb3JkZXIsIHRoZW4gdHJhbnNwYXJlbnQgcGFyYW1ldGVyIGVuY3J5cHRpb24gd2lsbCBicmVhay5cbmV4cG9ydCBlbnVtIERlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIge1xuICBQYXJhbWV0ZXJPcmRpbmFsLFxuICBQYXJhbWV0ZXJOYW1lLFxuICBDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtLFxuICBDb2x1bW5FbmNyeXRpb25UeXBlLFxuICBDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCxcbiAgTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uXG59XG5cbmV4cG9ydCBlbnVtIFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIHtcbiAgLyoqXG4gICAqIGlmIFwiQ29sdW1uIEVuY3J5cHRpb24gU2V0dGluZz1FbmFibGVkXCIgaW4gdGhlIGNvbm5lY3Rpb24gc3RyaW5nLCB1c2UgRW5hYmxlZC4gT3RoZXJ3aXNlLCBtYXBzIHRvIERpc2FibGVkLlxuICAgKi9cbiAgVXNlQ29ubmVjdGlvblNldHRpbmcsXG4gIC8qKlxuICAgKiBFbmFibGVzIFRDRSBmb3IgdGhlIGNvbW1hbmQuIE92ZXJyaWRlcyB0aGUgY29ubmVjdGlvbiBsZXZlbCBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqL1xuICBFbmFibGVkLFxuICAvKipcbiAgICogUGFyYW1ldGVycyB3aWxsIG5vdCBiZSBlbmNyeXB0ZWQsIG9ubHkgdGhlIFJlc3VsdFNldCB3aWxsIGJlIGRlY3J5cHRlZC4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHF1ZXJpZXMgdGhhdFxuICAgKiBkbyBub3QgcGFzcyBhbnkgZW5jcnlwdGVkIGlucHV0IHBhcmFtZXRlcnMuIE92ZXJyaWRlcyB0aGUgY29ubmVjdGlvbiBsZXZlbCBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqL1xuICBSZXN1bHRTZXRPbmx5LFxuICAvKipcbiAgICogRGlzYWJsZXMgVENFIGZvciB0aGUgY29tbWFuZC5PdmVycmlkZXMgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgc2V0dGluZyBmb3IgdGhpcyBjb21tYW5kLlxuICAgKi9cbiAgRGlzYWJsZWQsXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFBQSxJQWdCWUEsdUJBQXVCLDBCQUF2QkEsdUJBQXVCO0VBQXZCQSx1QkFBdUIsQ0FBdkJBLHVCQUF1QjtFQUF2QkEsdUJBQXVCLENBQXZCQSx1QkFBdUI7RUFBdkJBLHVCQUF1QixDQUF2QkEsdUJBQXVCO0VBQUEsT0FBdkJBLHVCQUF1QjtBQUFBO0FBQUFDLE9BQUEsQ0FBQUQsdUJBQUEsR0FBQUEsdUJBQUE7QUE0Qm5DO0FBQ0E7QUFDQTtBQUFBLElBQ1lFLHFDQUFxQywwQkFBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFBLE9BQXJDQSxxQ0FBcUM7QUFBQSxPQWFqRDtBQUNBO0FBQ0E7QUFBQUQsT0FBQSxDQUFBQyxxQ0FBQSxHQUFBQSxxQ0FBQTtBQUFBLElBQ1lDLHFDQUFxQywwQkFBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFyQ0EscUNBQXFDLENBQXJDQSxxQ0FBcUM7RUFBckNBLHFDQUFxQyxDQUFyQ0EscUNBQXFDO0VBQXJDQSxxQ0FBcUMsQ0FBckNBLHFDQUFxQztFQUFBLE9BQXJDQSxxQ0FBcUM7QUFBQTtBQUFBRixPQUFBLENBQUFFLHFDQUFBLEdBQUFBLHFDQUFBO0FBQUEsSUFTckNDLHlDQUF5QywwQkFBekNBLHlDQUF5QztFQUF6Q0EseUNBQXlDLENBQXpDQSx5Q0FBeUM7RUFBekNBLHlDQUF5QyxDQUF6Q0EseUNBQXlDO0VBQXpDQSx5Q0FBeUMsQ0FBekNBLHlDQUF5QztFQUF6Q0EseUNBQXlDLENBQXpDQSx5Q0FBeUM7RUFBQSxPQUF6Q0EseUNBQXlDO0FBQUE7QUFBQUgsT0FBQSxDQUFBRyx5Q0FBQSxHQUFBQSx5Q0FBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["SQLServerEncryptionType","exports","DescribeParameterEncryptionResultSet1","DescribeParameterEncryptionResultSet2","SQLServerStatementColumnEncryptionSetting"],"sources":["../../src/always-encrypted/types.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { CEKEntry } from './cek-entry';\nimport { BaseMetadata } from '../metadata-parser';\n\nexport interface EncryptionKeyInfo {\n encryptedKey: Buffer;\n dbId: number;\n keyId: number;\n keyVersion: number;\n mdVersion: Buffer;\n keyPath: string;\n keyStoreName: string;\n algorithmName: string;\n}\n\nexport enum SQLServerEncryptionType {\n Deterministic = 1,\n Randomized = 2,\n PlainText = 0,\n}\n\nexport interface EncryptionAlgorithm {\n encryptData: (plainText: Buffer) => Buffer;\n decryptData: (cipherText: Buffer) => Buffer;\n}\n\nexport interface CryptoMetadata {\n cekEntry?: CEKEntry;\n cipherAlgorithmId: number;\n cipherAlgorithmName?: string;\n normalizationRuleVersion: Buffer;\n encryptionKeyInfo?: EncryptionKeyInfo;\n ordinal: number;\n encryptionType: SQLServerEncryptionType;\n cipherAlgorithm?: EncryptionAlgorithm;\n baseTypeInfo?: BaseMetadata;\n}\n\nexport interface HashMap<T> {\n [hash: string]: T;\n}\n\n\n// Fields in the first resultset of \"sp_describe_parameter_encryption\"\n// We expect the server to return the fields in the resultset in the same order as mentioned below.\n// If the server changes the below order, then transparent parameter encryption will break.\nexport enum DescribeParameterEncryptionResultSet1 {\n KeyOrdinal,\n DbId,\n KeyId,\n KeyVersion,\n KeyMdVersion,\n EncryptedKey,\n ProviderName,\n KeyPath,\n KeyEncryptionAlgorithm\n}\n\n\n// Fields in the second resultset of \"sp_describe_parameter_encryption\"\n// We expect the server to return the fields in the resultset in the same order as mentioned below.\n// If the server changes the below order, then transparent parameter encryption will break.\nexport enum DescribeParameterEncryptionResultSet2 {\n ParameterOrdinal,\n ParameterName,\n ColumnEncryptionAlgorithm,\n ColumnEncrytionType,\n ColumnEncryptionKeyOrdinal,\n NormalizationRuleVersion\n}\n\nexport enum SQLServerStatementColumnEncryptionSetting {\n /**\n * if \"Column Encryption Setting=Enabled\" in the connection string, use Enabled. Otherwise, maps to Disabled.\n */\n UseConnectionSetting,\n /**\n * Enables TCE for the command. Overrides the connection level setting for this command.\n */\n Enabled,\n /**\n * Parameters will not be encrypted, only the ResultSet will be decrypted. This is an optimization for queries that\n * do not pass any encrypted input parameters. Overrides the connection level setting for this command.\n */\n ResultSetOnly,\n /**\n * Disables TCE for the command.Overrides the connection level setting for this command.\n */\n Disabled,\n}\n"],"mappings":";;;;;;AAAA;AACA;AAAA,IAgBYA,uBAAuB,0BAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAA,OAAvBA,uBAAuB;AAAA;AAAAC,OAAA,CAAAD,uBAAA,GAAAA,uBAAA;AA4BnC;AACA;AACA;AAAA,IACYE,qCAAqC,0BAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAAA,OAArCA,qCAAqC;AAAA,OAajD;AACA;AACA;AAAAD,OAAA,CAAAC,qCAAA,GAAAA,qCAAA;AAAA,IACYC,qCAAqC,0BAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAAA,OAArCA,qCAAqC;AAAA;AAAAF,OAAA,CAAAE,qCAAA,GAAAA,qCAAA;AAAA,IASrCC,yCAAyC,0BAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAA,OAAzCA,yCAAyC;AAAA;AAAAH,OAAA,CAAAG,yCAAA,GAAAA,yCAAA"}
1
+ {"version":3,"file":"types.js","names":["SQLServerEncryptionType","exports","DescribeParameterEncryptionResultSet1","DescribeParameterEncryptionResultSet2","SQLServerStatementColumnEncryptionSetting"],"sources":["../../src/always-encrypted/types.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { CEKEntry } from './cek-entry';\nimport { type BaseMetadata } from '../metadata-parser';\n\nexport interface EncryptionKeyInfo {\n encryptedKey: Buffer;\n dbId: number;\n keyId: number;\n keyVersion: number;\n mdVersion: Buffer;\n keyPath: string;\n keyStoreName: string;\n algorithmName: string;\n}\n\nexport enum SQLServerEncryptionType {\n Deterministic = 1,\n Randomized = 2,\n PlainText = 0,\n}\n\nexport interface EncryptionAlgorithm {\n encryptData: (plainText: Buffer) => Buffer;\n decryptData: (cipherText: Buffer) => Buffer;\n}\n\nexport interface CryptoMetadata {\n cekEntry?: CEKEntry;\n cipherAlgorithmId: number;\n cipherAlgorithmName?: string;\n normalizationRuleVersion: Buffer;\n encryptionKeyInfo?: EncryptionKeyInfo;\n ordinal: number;\n encryptionType: SQLServerEncryptionType;\n cipherAlgorithm?: EncryptionAlgorithm;\n baseTypeInfo?: BaseMetadata;\n}\n\nexport interface HashMap<T> {\n [hash: string]: T;\n}\n\n\n// Fields in the first resultset of \"sp_describe_parameter_encryption\"\n// We expect the server to return the fields in the resultset in the same order as mentioned below.\n// If the server changes the below order, then transparent parameter encryption will break.\nexport enum DescribeParameterEncryptionResultSet1 {\n KeyOrdinal,\n DbId,\n KeyId,\n KeyVersion,\n KeyMdVersion,\n EncryptedKey,\n ProviderName,\n KeyPath,\n KeyEncryptionAlgorithm\n}\n\n\n// Fields in the second resultset of \"sp_describe_parameter_encryption\"\n// We expect the server to return the fields in the resultset in the same order as mentioned below.\n// If the server changes the below order, then transparent parameter encryption will break.\nexport enum DescribeParameterEncryptionResultSet2 {\n ParameterOrdinal,\n ParameterName,\n ColumnEncryptionAlgorithm,\n ColumnEncrytionType,\n ColumnEncryptionKeyOrdinal,\n NormalizationRuleVersion\n}\n\nexport enum SQLServerStatementColumnEncryptionSetting {\n /**\n * if \"Column Encryption Setting=Enabled\" in the connection string, use Enabled. Otherwise, maps to Disabled.\n */\n UseConnectionSetting,\n /**\n * Enables TCE for the command. Overrides the connection level setting for this command.\n */\n Enabled,\n /**\n * Parameters will not be encrypted, only the ResultSet will be decrypted. This is an optimization for queries that\n * do not pass any encrypted input parameters. Overrides the connection level setting for this command.\n */\n ResultSetOnly,\n /**\n * Disables TCE for the command.Overrides the connection level setting for this command.\n */\n Disabled,\n}\n"],"mappings":";;;;;;AAAA;AACA;AAAA,IAgBYA,uBAAuB,0BAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAvBA,uBAAuB,CAAvBA,uBAAuB;EAAA,OAAvBA,uBAAuB;AAAA;AAAAC,OAAA,CAAAD,uBAAA,GAAAA,uBAAA;AA4BnC;AACA;AACA;AAAA,IACYE,qCAAqC,0BAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAAA,OAArCA,qCAAqC;AAAA,OAajD;AACA;AACA;AAAAD,OAAA,CAAAC,qCAAA,GAAAA,qCAAA;AAAA,IACYC,qCAAqC,0BAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAArCA,qCAAqC,CAArCA,qCAAqC;EAAA,OAArCA,qCAAqC;AAAA;AAAAF,OAAA,CAAAE,qCAAA,GAAAA,qCAAA;AAAA,IASrCC,yCAAyC,0BAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAzCA,yCAAyC,CAAzCA,yCAAyC;EAAA,OAAzCA,yCAAyC;AAAA;AAAAH,OAAA,CAAAG,yCAAA,GAAAA,yCAAA"}
package/lib/bulk-load.js CHANGED
@@ -519,4 +519,4 @@ class BulkLoad extends _events.EventEmitter {
519
519
  var _default = BulkLoad;
520
520
  exports.default = _default;
521
521
  module.exports = BulkLoad;
522
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl93cml0YWJsZVRyYWNraW5nQnVmZmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHJlYW0iLCJfdG9rZW4iLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkZMQUdTIiwibnVsbGFibGUiLCJjYXNlU2VuIiwidXBkYXRlYWJsZVJlYWRXcml0ZSIsInVwZGF0ZWFibGVVbmtub3duIiwiaWRlbnRpdHkiLCJjb21wdXRlZCIsImZpeGVkTGVuQ0xSVHlwZSIsInNwYXJzZUNvbHVtblNldCIsImhpZGRlbiIsImtleSIsIm51bGxhYmxlVW5rbm93biIsIkRPTkVfU1RBVFVTIiwiRklOQUwiLCJNT1JFIiwiRVJST1IiLCJJTlhBQ1QiLCJDT1VOVCIsIkFUVE4iLCJTUlZFUlJPUiIsInJvd1Rva2VuQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsIlRPS0VOX1RZUEUiLCJST1ciLCJ0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlciIsInRleHRQb2ludGVyTnVsbEJ1ZmZlciIsIlJvd1RyYW5zZm9ybSIsIlRyYW5zZm9ybSIsImNvbHVtbk1ldGFkYXRhV3JpdHRlbiIsImJ1bGtMb2FkIiwibWFpbk9wdGlvbnMiLCJjb2x1bW5zIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJvcHRpb25zIiwiX3RyYW5zZm9ybSIsInJvdyIsIl9lbmNvZGluZyIsImNhbGxiYWNrIiwicHVzaCIsImdldENvbE1ldGFEYXRhIiwiaSIsImxlbmd0aCIsImMiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsIm9iak5hbWUiLCJmaXJzdFJvd1dyaXR0ZW4iLCJ0eXBlIiwidmFsaWRhdGUiLCJjb2xsYXRpb24iLCJlcnJvciIsInBhcmFtZXRlciIsInNjYWxlIiwicHJlY2lzaW9uIiwibmFtZSIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwiY2h1bmsiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJfZmx1c2giLCJjcmVhdGVEb25lVG9rZW4iLCJCdWxrTG9hZCIsIkV2ZW50RW1pdHRlciIsImNhbmNlbGVkIiwiZXhlY3V0aW9uU3RhcnRlZCIsInN0cmVhbWluZ01vZGUiLCJ0YWJsZSIsInRpbWVvdXQiLCJjb2x1bW5zQnlOYW1lIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJidWxrT3B0aW9ucyIsImNvbm5lY3Rpb24iLCJyb3dzIiwicnN0Iiwicm93Q291bnQiLCJjb25uZWN0aW9uT3B0aW9ucyIsImNoZWNrQ29uc3RyYWludHMiLCJmaXJlVHJpZ2dlcnMiLCJrZWVwTnVsbHMiLCJsb2NrVGFibGUiLCJvcmRlciIsIlR5cGVFcnJvciIsImNvbHVtbiIsImRpcmVjdGlvbiIsIk9iamVjdCIsImVudHJpZXMiLCJ1bmRlZmluZWQiLCJhZGRDb2x1bW4iLCJvdXRwdXQiLCJFcnJvciIsImlkIiwicmVzb2x2ZUxlbmd0aCIsInJlc29sdmVQcmVjaXNpb24iLCJyZXNvbHZlU2NhbGUiLCJnZXRPcHRpb25zU3FsIiwiYWRkT3B0aW9ucyIsIm9yZGVyQ29sdW1ucyIsImpvaW4iLCJnZXRCdWxrSW5zZXJ0U3FsIiwic3FsIiwibGVuIiwiZGVjbGFyYXRpb24iLCJnZXRUYWJsZUNyZWF0aW9uU3FsIiwidEJ1ZiIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVJbnQ4IiwiQ09MTUVUQURBVEEiLCJ3cml0ZVVJbnQxNkxFIiwiaiIsInRkc1ZlcnNpb24iLCJ3cml0ZVVJbnQzMkxFIiwiZmxhZ3MiLCJ3cml0ZUJ1ZmZlciIsImdlbmVyYXRlVHlwZUluZm8iLCJoYXNUYWJsZU5hbWUiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlQlZhcmNoYXIiLCJkYXRhIiwic2V0VGltZW91dCIsIkRPTkUiLCJzdGF0dXMiLCJjYW5jZWwiLCJlbWl0IiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL2J1bGstbG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCBDb25uZWN0aW9uLCB7IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuXG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgVFlQRSBhcyBUT0tFTl9UWVBFIH0gZnJvbSAnLi90b2tlbi90b2tlbic7XG5cbmltcG9ydCB7IERhdGFUeXBlLCBQYXJhbWV0ZXIgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRkxBR1MgPSB7XG4gIG51bGxhYmxlOiAxIDw8IDAsXG4gIGNhc2VTZW46IDEgPDwgMSxcbiAgdXBkYXRlYWJsZVJlYWRXcml0ZTogMSA8PCAyLFxuICB1cGRhdGVhYmxlVW5rbm93bjogMSA8PCAzLFxuICBpZGVudGl0eTogMSA8PCA0LFxuICBjb21wdXRlZDogMSA8PCA1LCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAgZml4ZWRMZW5DTFJUeXBlOiAxIDw8IDgsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBzcGFyc2VDb2x1bW5TZXQ6IDEgPDwgMTAsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMy5CXG4gIGhpZGRlbjogMSA8PCAxMywgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIGtleTogMSA8PCAxNCwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIG51bGxhYmxlVW5rbm93bjogMSA8PCAxNSAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRE9ORV9TVEFUVVMgPSB7XG4gIEZJTkFMOiAweDAwLFxuICBNT1JFOiAweDEsXG4gIEVSUk9SOiAweDIsXG4gIElOWEFDVDogMHg0LFxuICBDT1VOVDogMHgxMCxcbiAgQVRUTjogMHgyMCxcbiAgU1JWRVJST1I6IDB4MTAwXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbE9wdGlvbnMge1xuICBjaGVja0NvbnN0cmFpbnRzOiBib29sZWFuO1xuICBmaXJlVHJpZ2dlcnM6IGJvb2xlYW47XG4gIGtlZXBOdWxsczogYm9vbGVhbjtcbiAgbG9ja1RhYmxlOiBib29sZWFuO1xuICBvcmRlcjogeyBbY29sdW1uTmFtZTogc3RyaW5nXTogJ0FTQycgfCAnREVTQycgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvbm9ycyBjb25zdHJhaW50cyBkdXJpbmcgYnVsayBsb2FkLCB1c2luZyBULVNRTFxuICAgKiBbQ0hFQ0tfQ09OU1RSQUlOVFNdKGh0dHBzOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODYyNDcodj1zcWwuMTA1KS5hc3B4KS5cbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBjaGVja0NvbnN0cmFpbnRzPzogSW50ZXJuYWxPcHRpb25zWydjaGVja0NvbnN0cmFpbnRzJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvbm9ycyBpbnNlcnQgdHJpZ2dlcnMgZHVyaW5nIGJ1bGsgbG9hZCwgdXNpbmcgdGhlIFQtU1FMIFtGSVJFX1RSSUdHRVJTXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3NjQwKHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZmlyZVRyaWdnZXJzPzogSW50ZXJuYWxPcHRpb25zWydmaXJlVHJpZ2dlcnMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSG9ub3JzIG51bGwgdmFsdWUgcGFzc2VkLCBpZ25vcmVzIHRoZSBkZWZhdWx0IHZhbHVlcyBzZXQgb24gdGFibGUsIHVzaW5nIFQtU1FMIFtLRUVQX05VTExTXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3ODg3KHY9c3FsLjEyMCkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAga2VlcE51bGxzPzogSW50ZXJuYWxPcHRpb25zWydrZWVwTnVsbHMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGxhY2VzIGEgYnVsayB1cGRhdGUoQlUpIGxvY2sgb24gdGFibGUgd2hpbGUgcGVyZm9ybWluZyBidWxrIGxvYWQsIHVzaW5nIFQtU1FMIFtUQUJMT0NLXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTgwODc2KHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgbG9ja1RhYmxlPzogSW50ZXJuYWxPcHRpb25zWydsb2NrVGFibGUnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGF0YSB0byBwb3NzaWJseSBpbmNyZWFzZSBidWxrIGluc2VydCBwZXJmb3JtYW5jZSwgdXNpbmcgVC1TUUwgW09SREVSXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wcmV2aW91cy12ZXJzaW9ucy9zcWwvc3FsLXNlcnZlci0yMDA4LXIyL21zMTc3NDY4KHY9c3FsLjEwNSkpLiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIG9yZGVyPzogSW50ZXJuYWxPcHRpb25zWydvcmRlciddIHwgdW5kZWZpbmVkO1xufVxuXG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrID1cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFtbQnVsa0xvYWRdXSBmaW5pc2hlcyBleGVjdXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSByb3dDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgaW5zZXJ0ZWRcbiAgICovXG4gIChlcnI6IEVycm9yIHwgdW5kZWZpbmVkIHwgbnVsbCwgcm93Q291bnQ/OiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBDb2x1bW4gZXh0ZW5kcyBQYXJhbWV0ZXIge1xuICBvYmpOYW1lOiBzdHJpbmc7XG4gIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ29sdW1uT3B0aW9ucyB7XG4gIG91dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBWYXJDaGFyLCBOVmFyQ2hhciwgVmFyQmluYXJ5LiBVc2UgbGVuZ3RoIGFzIGBJbmZpbml0eWAgZm9yIFZhckNoYXIobWF4KSwgTlZhckNoYXIobWF4KSBhbmQgVmFyQmluYXJ5KG1heCkuXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvciBOdW1lcmljLCBEZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgICovXG4gIHNjYWxlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0sIHRoZW4geW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICovXG4gIG9iak5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gYWNjZXB0cyBOVUxMIHZhbHVlcy5cbiAgICovXG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbn1cblxuY29uc3Qgcm93VG9rZW5CdWZmZXIgPSBCdWZmZXIuZnJvbShbIFRPS0VOX1RZUEUuUk9XIF0pO1xuY29uc3QgdGV4dFBvaW50ZXJBbmRUaW1lc3RhbXBCdWZmZXIgPSBCdWZmZXIuZnJvbShbXG4gIC8vIFRleHRQb2ludGVyIGxlbmd0aFxuICAweDEwLFxuXG4gIC8vIFRleHRQb2ludGVyXG4gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG5cbiAgLy8gVGltZXN0YW1wXG4gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBcbl0pO1xuY29uc3QgdGV4dFBvaW50ZXJOdWxsQnVmZmVyID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuLy8gQSB0cmFuc2Zvcm0gdGhhdCBjb252ZXJ0cyByb3dzIHRvIHBhY2tldHMuXG5jbGFzcyBSb3dUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbHVtbk1ldGFkYXRhV3JpdHRlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWxrTG9hZDogQnVsa0xvYWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFpbk9wdGlvbnM6IEJ1bGtMb2FkWydvcHRpb25zJ107XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uczogQnVsa0xvYWRbJ2NvbHVtbnMnXTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJ1bGtMb2FkOiBCdWxrTG9hZCkge1xuICAgIHN1cGVyKHsgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy5idWxrTG9hZCA9IGJ1bGtMb2FkO1xuICAgIHRoaXMubWFpbk9wdGlvbnMgPSBidWxrTG9hZC5vcHRpb25zO1xuICAgIHRoaXMuY29sdW1ucyA9IGJ1bGtMb2FkLmNvbHVtbnM7XG5cbiAgICB0aGlzLmNvbHVtbk1ldGFkYXRhV3JpdHRlbiA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdHJhbnNmb3JtKHJvdzogQXJyYXk8dW5rbm93bj4gfCB7IFtjb2xOYW1lOiBzdHJpbmddOiB1bmtub3duIH0sIF9lbmNvZGluZzogc3RyaW5nLCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uTWV0YWRhdGFXcml0dGVuKSB7XG4gICAgICB0aGlzLnB1c2godGhpcy5idWxrTG9hZC5nZXRDb2xNZXRhRGF0YSgpKTtcbiAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFXcml0dGVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnB1c2gocm93VG9rZW5CdWZmZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJvdykgPyByb3dbaV0gOiByb3dbYy5vYmpOYW1lXTtcblxuICAgICAgaWYgKCF0aGlzLmJ1bGtMb2FkLmZpcnN0Um93V3JpdHRlbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gYy50eXBlLnZhbGlkYXRlKHZhbHVlLCBjLmNvbGxhdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHtcbiAgICAgICAgbGVuZ3RoOiBjLmxlbmd0aCxcbiAgICAgICAgc2NhbGU6IGMuc2NhbGUsXG4gICAgICAgIHByZWNpc2lvbjogYy5wcmVjaXNpb24sXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfTtcblxuICAgICAgaWYgKGMudHlwZS5uYW1lID09PSAnVGV4dCcgfHwgYy50eXBlLm5hbWUgPT09ICdJbWFnZScgfHwgYy50eXBlLm5hbWUgPT09ICdOVGV4dCcpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnB1c2godGV4dFBvaW50ZXJOdWxsQnVmZmVyKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHVzaCh0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVzaChjLnR5cGUuZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCB0aGlzLm1haW5PcHRpb25zKSk7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGMudHlwZS5nZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCB0aGlzLm1haW5PcHRpb25zKSkge1xuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZmx1c2goY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnB1c2godGhpcy5idWxrTG9hZC5jcmVhdGVEb25lVG9rZW4oKSk7XG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgQnVsa0xvYWQgaW5zdGFuY2UgaXMgdXNlZCB0byBwZXJmb3JtIGEgYnVsayBpbnNlcnQuXG4gKlxuICogVXNlIFtbQ29ubmVjdGlvbi5uZXdCdWxrTG9hZF1dIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSwgYW5kIFtbQ29ubmVjdGlvbi5leGVjQnVsa0xvYWRdXSB0byBleGVjdXRlIGl0LlxuICpcbiAqIEV4YW1wbGUgb2YgQnVsa0xvYWQgVXNhZ2VzOlxuICpcbiAqIGBgYGpzXG4gKiAvLyBvcHRpb25hbCBCdWxrTG9hZCBvcHRpb25zXG4gKiBjb25zdCBvcHRpb25zID0geyBrZWVwTnVsbHM6IHRydWUgfTtcbiAqXG4gKiAvLyBpbnN0YW50aWF0ZSAtIHByb3ZpZGUgdGhlIHRhYmxlIHdoZXJlIHlvdSdsbCBiZSBpbnNlcnRpbmcgdG8sIG9wdGlvbnMgYW5kIGEgY2FsbGJhY2tcbiAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnTXlUYWJsZScsIG9wdGlvbnMsIChlcnJvciwgcm93Q291bnQpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ2luc2VydGVkICVkIHJvd3MnLCByb3dDb3VudCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZXR1cCB5b3VyIGNvbHVtbnMgLSBhbHdheXMgaW5kaWNhdGUgd2hldGhlciB0aGUgY29sdW1uIGlzIG51bGxhYmxlXG4gKiBidWxrTG9hZC5hZGRDb2x1bW4oJ215SW50JywgVFlQRVMuSW50LCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAqIGJ1bGtMb2FkLmFkZENvbHVtbignbXlTdHJpbmcnLCBUWVBFUy5OVmFyQ2hhciwgeyBsZW5ndGg6IDUwLCBudWxsYWJsZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBleGVjdXRlXG4gKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICogICB7IG15SW50OiA3LCBteVN0cmluZzogJ2hlbGxvJyB9LFxuICogICB7IG15SW50OiAyMywgbXlTdHJpbmc6ICd3b3JsZCcgfVxuICogXSk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgQnVsa0xvYWQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBleGVjdXRpb25TdGFydGVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0cmVhbWluZ01vZGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGFibGU6IHN0cmluZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbGxiYWNrOiBDYWxsYmFjaztcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbHVtbnM6IEFycmF5PENvbHVtbj47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uc0J5TmFtZTogeyBbbmFtZTogc3RyaW5nXTogQ29sdW1uIH07XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmaXJzdFJvd1dyaXR0ZW46IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm93VG9QYWNrZXRUcmFuc2Zvcm06IFJvd1RyYW5zZm9ybTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1bGtPcHRpb25zOiBJbnRlcm5hbE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJvd3M6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcnN0OiBBcnJheTxhbnk+IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZTogc3RyaW5nLCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCwgY29ubmVjdGlvbk9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMsIHtcbiAgICBjaGVja0NvbnN0cmFpbnRzID0gZmFsc2UsXG4gICAgZmlyZVRyaWdnZXJzID0gZmFsc2UsXG4gICAga2VlcE51bGxzID0gZmFsc2UsXG4gICAgbG9ja1RhYmxlID0gZmFsc2UsXG4gICAgb3JkZXIgPSB7fSxcbiAgfTogT3B0aW9ucywgY2FsbGJhY2s6IENhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjaGVja0NvbnN0cmFpbnRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuY2hlY2tDb25zdHJhaW50c1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlyZVRyaWdnZXJzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuZmlyZVRyaWdnZXJzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBrZWVwTnVsbHMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5rZWVwTnVsbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxvY2tUYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLmxvY2tUYWJsZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdvYmplY3QnIHx8IG9yZGVyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLm9yZGVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMob3JkZXIpKSB7XG4gICAgICBpZiAoZGlyZWN0aW9uICE9PSAnQVNDJyAmJiBkaXJlY3Rpb24gIT09ICdERVNDJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgb2YgdGhlIFwiJyArIGNvbHVtbiArICdcIiBrZXkgaW4gdGhlIFwib3B0aW9ucy5vcmRlclwiIG9iamVjdCBtdXN0IGJlIGVpdGhlciBcIkFTQ1wiIG9yIFwiREVTQ1wiLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmV4ZWN1dGlvblN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuXG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb25PcHRpb25zO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmNvbHVtbnNCeU5hbWUgPSB7fTtcbiAgICB0aGlzLmZpcnN0Um93V3JpdHRlbiA9IGZhbHNlO1xuICAgIHRoaXMuc3RyZWFtaW5nTW9kZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb3dUb1BhY2tldFRyYW5zZm9ybSA9IG5ldyBSb3dUcmFuc2Zvcm0odGhpcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcblxuICAgIHRoaXMuYnVsa09wdGlvbnMgPSB7IGNoZWNrQ29uc3RyYWludHMsIGZpcmVUcmlnZ2Vycywga2VlcE51bGxzLCBsb2NrVGFibGUsIG9yZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgYnVsayBsb2FkLlxuICAgKlxuICAgKiBUaGUgY29sdW1uIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCB0aGUgdGFibGUgeW91IGFyZSB0cnlpbmcgdG8gaW5zZXJ0IGludG8uXG4gICAqIEF0dGVtcHRpbmcgdG8gY2FsbCBhZGRDb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHJvdyBoYXMgYmVlbiBhZGRlZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICpcbiAgICogYGBganNcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdNeUludENvbHVtbicsIFRZUEVTLkludCwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uLlxuICAgKiBAcGFyYW0gdHlwZSBPbmUgb2YgdGhlIHN1cHBvcnRlZCBgZGF0YSB0eXBlc2AuXG4gICAqIEBwYXJhbSBfX25hbWVkUGFyYW1ldGVycyBBZGRpdGlvbmFsIGNvbHVtbiB0eXBlIGluZm9ybWF0aW9uLiBBdCBhIG1pbmltdW0sIGBudWxsYWJsZWAgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciBmYWxzZS5cbiAgICogQHBhcmFtIGxlbmd0aCBGb3IgVmFyQ2hhciwgTlZhckNoYXIsIFZhckJpbmFyeS4gVXNlIGxlbmd0aCBhcyBgSW5maW5pdHlgIGZvciBWYXJDaGFyKG1heCksIE5WYXJDaGFyKG1heCkgYW5kIFZhckJpbmFyeShtYXgpLlxuICAgKiBAcGFyYW0gbnVsbGFibGUgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBhY2NlcHRzIE5VTEwgdmFsdWVzLlxuICAgKiBAcGFyYW0gb2JqTmFtZSBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0gb3IgW1tDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZF1dLCB0aGVuIHlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBwcmVjaXNpb24gRm9yIE51bWVyaWMsIERlY2ltYWwuXG4gICAqIEBwYXJhbSBzY2FsZSBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgKi9cbiAgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUsIHsgb3V0cHV0ID0gZmFsc2UsIGxlbmd0aCwgcHJlY2lzaW9uLCBzY2FsZSwgb2JqTmFtZSA9IG5hbWUsIG51bGxhYmxlID0gdHJ1ZSB9OiBDb2x1bW5PcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuZmlyc3RSb3dXcml0dGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbnMgY2Fubm90IGJlIGFkZGVkIHRvIGJ1bGsgaW5zZXJ0IGFmdGVyIHRoZSBmaXJzdCByb3cgaGFzIGJlZW4gd3JpdHRlbi4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXhlY3V0aW9uU3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW5zIGNhbm5vdCBiZSBhZGRlZCB0byBidWxrIGluc2VydCBhZnRlciBleGVjdXRpb24gaGFzIHN0YXJ0ZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW4gPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgb2JqTmFtZTogb2JqTmFtZSxcbiAgICAgIG51bGxhYmxlOiBudWxsYWJsZSxcbiAgICAgIGNvbGxhdGlvbjogdGhpcy5jb2xsYXRpb25cbiAgICB9O1xuXG4gICAgaWYgKCh0eXBlLmlkICYgMHgzMCkgPT09IDB4MjApIHtcbiAgICAgIGlmIChjb2x1bW4ubGVuZ3RoID09IG51bGwgJiYgdHlwZS5yZXNvbHZlTGVuZ3RoKSB7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPSB0eXBlLnJlc29sdmVMZW5ndGgoY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZS5yZXNvbHZlUHJlY2lzaW9uICYmIGNvbHVtbi5wcmVjaXNpb24gPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnByZWNpc2lvbiA9IHR5cGUucmVzb2x2ZVByZWNpc2lvbihjb2x1bW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlLnJlc29sdmVTY2FsZSAmJiBjb2x1bW4uc2NhbGUgPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnNjYWxlID0gdHlwZS5yZXNvbHZlU2NhbGUoY29sdW1uKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuXG4gICAgdGhpcy5jb2x1bW5zQnlOYW1lW25hbWVdID0gY29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRPcHRpb25zU3FsKCkge1xuICAgIGNvbnN0IGFkZE9wdGlvbnMgPSBbXTtcblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnQ0hFQ0tfQ09OU1RSQUlOVFMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5maXJlVHJpZ2dlcnMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnRklSRV9UUklHR0VSUycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmtlZXBOdWxscykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdLRUVQX05VTExTJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMubG9ja1RhYmxlKSB7XG4gICAgICBhZGRPcHRpb25zLnB1c2goJ1RBQkxPQ0snKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5vcmRlcikge1xuICAgICAgY29uc3Qgb3JkZXJDb2x1bW5zID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJ1bGtPcHRpb25zLm9yZGVyKSkge1xuICAgICAgICBvcmRlckNvbHVtbnMucHVzaChgJHtjb2x1bW59ICR7ZGlyZWN0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JkZXJDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBhZGRPcHRpb25zLnB1c2goYE9SREVSICgke29yZGVyQ29sdW1ucy5qb2luKCcsICcpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCBXSVRIICgke2FkZE9wdGlvbnMuam9pbignLCcpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCdWxrSW5zZXJ0U3FsKCkge1xuICAgIGxldCBzcWwgPSAnaW5zZXJ0IGJ1bGsgJyArIHRoaXMudGFibGUgKyAnKCc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLCAnO1xuICAgICAgfVxuICAgICAgc3FsICs9ICdbJyArIGMubmFtZSArICddICcgKyAoYy50eXBlLmRlY2xhcmF0aW9uKGMpKTtcbiAgICB9XG4gICAgc3FsICs9ICcpJztcblxuICAgIHNxbCArPSB0aGlzLmdldE9wdGlvbnNTcWwoKTtcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2ltcGx5IGEgaGVscGVyIHV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIGBDUkVBVEUgVEFCTEUgU1FMYCBzdGF0ZW1lbnQgYmFzZWQgb24gdGhlIGNvbHVtbnMgYWRkZWQgdG8gdGhlIGJ1bGtMb2FkIG9iamVjdC5cbiAgICogVGhpcyBtYXkgYmUgcGFydGljdWxhcmx5IGhhbmR5IHdoZW4geW91IHdhbnQgdG8gaW5zZXJ0IGludG8gYSB0ZW1wb3JhcnkgdGFibGUgKGEgdGFibGUgd2hpY2ggc3RhcnRzIHdpdGggYCNgKS5cbiAgICpcbiAgICogYGBganNcbiAgICogdmFyIHNxbCA9IGJ1bGtMb2FkLmdldFRhYmxlQ3JlYXRpb25TcWwoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEEgc2lkZSBub3RlIG9uIGJ1bGsgaW5zZXJ0aW5nIGludG8gdGVtcG9yYXJ5IHRhYmxlczogaWYgeW91IHdhbnQgdG8gYWNjZXNzIGEgbG9jYWwgdGVtcG9yYXJ5IHRhYmxlIGFmdGVyIGV4ZWN1dGluZyB0aGUgYnVsayBsb2FkLFxuICAgKiB5b3UnbGwgbmVlZCB0byB1c2UgdGhlIHNhbWUgY29ubmVjdGlvbiBhbmQgZXhlY3V0ZSB5b3VyIHJlcXVlc3RzIHVzaW5nIFtbQ29ubmVjdGlvbi5leGVjU3FsQmF0Y2hdXSBpbnN0ZWFkIG9mIFtbQ29ubmVjdGlvbi5leGVjU3FsXV1cbiAgICovXG4gIGdldFRhYmxlQ3JlYXRpb25TcWwoKSB7XG4gICAgbGV0IHNxbCA9ICdDUkVBVEUgVEFCTEUgJyArIHRoaXMudGFibGUgKyAnKFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLFxcbic7XG4gICAgICB9XG4gICAgICBzcWwgKz0gJ1snICsgYy5uYW1lICsgJ10gJyArIChjLnR5cGUuZGVjbGFyYXRpb24oYykpO1xuICAgICAgaWYgKGMubnVsbGFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzcWwgKz0gJyAnICsgKGMubnVsbGFibGUgPyAnTlVMTCcgOiAnTk9UIE5VTEwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3FsICs9ICdcXG4pJztcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRDb2xNZXRhRGF0YSgpIHtcbiAgICBjb25zdCB0QnVmID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMTAwLCBudWxsLCB0cnVlKTtcbiAgICAvLyBUb2tlblR5cGVcbiAgICB0QnVmLndyaXRlVUludDgoVE9LRU5fVFlQRS5DT0xNRVRBREFUQSk7XG4gICAgLy8gQ291bnRcbiAgICB0QnVmLndyaXRlVUludDE2TEUodGhpcy5jb2x1bW5zLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgLy8gVXNlclR5cGVcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MTZMRSgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmxhZ3NcbiAgICAgIGxldCBmbGFncyA9IEZMQUdTLnVwZGF0ZWFibGVSZWFkV3JpdGU7XG4gICAgICBpZiAoYy5udWxsYWJsZSkge1xuICAgICAgICBmbGFncyB8PSBGTEFHUy5udWxsYWJsZTtcbiAgICAgIH0gZWxzZSBpZiAoYy5udWxsYWJsZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uID49ICc3XzInKSB7XG4gICAgICAgIGZsYWdzIHw9IEZMQUdTLm51bGxhYmxlVW5rbm93bjtcbiAgICAgIH1cbiAgICAgIHRCdWYud3JpdGVVSW50MTZMRShmbGFncyk7XG5cbiAgICAgIC8vIFRZUEVfSU5GT1xuICAgICAgdEJ1Zi53cml0ZUJ1ZmZlcihjLnR5cGUuZ2VuZXJhdGVUeXBlSW5mbyhjLCB0aGlzLm9wdGlvbnMpKTtcblxuICAgICAgLy8gVGFibGVOYW1lXG4gICAgICBpZiAoYy50eXBlLmhhc1RhYmxlTmFtZSkge1xuICAgICAgICB0QnVmLndyaXRlVXNWYXJjaGFyKHRoaXMudGFibGUsICd1Y3MyJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbE5hbWVcbiAgICAgIHRCdWYud3JpdGVCVmFyY2hhcihjLm5hbWUsICd1Y3MyJyk7XG4gICAgfVxuICAgIHJldHVybiB0QnVmLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHRpbWVvdXQgZm9yIHRoaXMgYnVsayBsb2FkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBidWxrTG9hZC5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBidWxrIGxvYWQgaXMgY29uc2lkZXJlZCBmYWlsZWQsIG9yIDAgZm9yIG5vIHRpbWVvdXQuXG4gICAqICAgV2hlbiBubyB0aW1lb3V0IGlzIHNldCBmb3IgdGhlIGJ1bGsgbG9hZCwgdGhlIFtbQ29ubmVjdGlvbk9wdGlvbnMucmVxdWVzdFRpbWVvdXRdXSBvZiB0aGUgQ29ubmVjdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgc2V0VGltZW91dCh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRG9uZVRva2VuKCkge1xuICAgIC8vIEl0IG1pZ2h0IGJlIG5pY2UgdG8gbWFrZSBEb25lVG9rZW4gYSBjbGFzcyBpZiBhbnl0aGluZyBuZWVkcyB0byBjcmVhdGUgdGhlbSwgYnV0IGZvciBub3csIGp1c3QgZG8gaXQgaGVyZVxuICAgIGNvbnN0IHRCdWYgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcih0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInID8gOSA6IDEzKTtcbiAgICB0QnVmLndyaXRlVUludDgoVE9LRU5fVFlQRS5ET05FKTtcbiAgICBjb25zdCBzdGF0dXMgPSBET05FX1NUQVRVUy5GSU5BTDtcbiAgICB0QnVmLndyaXRlVUludDE2TEUoc3RhdHVzKTtcbiAgICB0QnVmLndyaXRlVUludDE2TEUoMCk7IC8vIEN1ckNtZCAoVERTIGlnbm9yZXMgdGhpcylcbiAgICB0QnVmLndyaXRlVUludDMyTEUoMCk7IC8vIHJvdyBjb3VudCAtIGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA+PSAnN18yJykge1xuICAgICAgdEJ1Zi53cml0ZVVJbnQzMkxFKDApOyAvLyByb3cgY291bnQgaXMgNjQgYml0cyBpbiA+PSBURFMgNy4yXG4gICAgfVxuICAgIHJldHVybiB0QnVmLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsZWQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnVsa0xvYWQ7XG5tb2R1bGUuZXhwb3J0cyA9IEJ1bGtMb2FkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFD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
522
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl93cml0YWJsZVRyYWNraW5nQnVmZmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHJlYW0iLCJfdG9rZW4iLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkZMQUdTIiwibnVsbGFibGUiLCJjYXNlU2VuIiwidXBkYXRlYWJsZVJlYWRXcml0ZSIsInVwZGF0ZWFibGVVbmtub3duIiwiaWRlbnRpdHkiLCJjb21wdXRlZCIsImZpeGVkTGVuQ0xSVHlwZSIsInNwYXJzZUNvbHVtblNldCIsImhpZGRlbiIsImtleSIsIm51bGxhYmxlVW5rbm93biIsIkRPTkVfU1RBVFVTIiwiRklOQUwiLCJNT1JFIiwiRVJST1IiLCJJTlhBQ1QiLCJDT1VOVCIsIkFUVE4iLCJTUlZFUlJPUiIsInJvd1Rva2VuQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsIlRPS0VOX1RZUEUiLCJST1ciLCJ0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlciIsInRleHRQb2ludGVyTnVsbEJ1ZmZlciIsIlJvd1RyYW5zZm9ybSIsIlRyYW5zZm9ybSIsImNvbHVtbk1ldGFkYXRhV3JpdHRlbiIsImJ1bGtMb2FkIiwibWFpbk9wdGlvbnMiLCJjb2x1bW5zIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJvcHRpb25zIiwiX3RyYW5zZm9ybSIsInJvdyIsIl9lbmNvZGluZyIsImNhbGxiYWNrIiwicHVzaCIsImdldENvbE1ldGFEYXRhIiwiaSIsImxlbmd0aCIsImMiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsIm9iak5hbWUiLCJmaXJzdFJvd1dyaXR0ZW4iLCJ0eXBlIiwidmFsaWRhdGUiLCJjb2xsYXRpb24iLCJlcnJvciIsInBhcmFtZXRlciIsInNjYWxlIiwicHJlY2lzaW9uIiwibmFtZSIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwiY2h1bmsiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJfZmx1c2giLCJjcmVhdGVEb25lVG9rZW4iLCJCdWxrTG9hZCIsIkV2ZW50RW1pdHRlciIsImNhbmNlbGVkIiwiZXhlY3V0aW9uU3RhcnRlZCIsInN0cmVhbWluZ01vZGUiLCJ0YWJsZSIsInRpbWVvdXQiLCJjb2x1bW5zQnlOYW1lIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJidWxrT3B0aW9ucyIsImNvbm5lY3Rpb24iLCJyb3dzIiwicnN0Iiwicm93Q291bnQiLCJjb25uZWN0aW9uT3B0aW9ucyIsImNoZWNrQ29uc3RyYWludHMiLCJmaXJlVHJpZ2dlcnMiLCJrZWVwTnVsbHMiLCJsb2NrVGFibGUiLCJvcmRlciIsIlR5cGVFcnJvciIsImNvbHVtbiIsImRpcmVjdGlvbiIsIk9iamVjdCIsImVudHJpZXMiLCJ1bmRlZmluZWQiLCJhZGRDb2x1bW4iLCJvdXRwdXQiLCJFcnJvciIsImlkIiwicmVzb2x2ZUxlbmd0aCIsInJlc29sdmVQcmVjaXNpb24iLCJyZXNvbHZlU2NhbGUiLCJnZXRPcHRpb25zU3FsIiwiYWRkT3B0aW9ucyIsIm9yZGVyQ29sdW1ucyIsImpvaW4iLCJnZXRCdWxrSW5zZXJ0U3FsIiwic3FsIiwibGVuIiwiZGVjbGFyYXRpb24iLCJnZXRUYWJsZUNyZWF0aW9uU3FsIiwidEJ1ZiIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVJbnQ4IiwiQ09MTUVUQURBVEEiLCJ3cml0ZVVJbnQxNkxFIiwiaiIsInRkc1ZlcnNpb24iLCJ3cml0ZVVJbnQzMkxFIiwiZmxhZ3MiLCJ3cml0ZUJ1ZmZlciIsImdlbmVyYXRlVHlwZUluZm8iLCJoYXNUYWJsZU5hbWUiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlQlZhcmNoYXIiLCJkYXRhIiwic2V0VGltZW91dCIsIkRPTkUiLCJzdGF0dXMiLCJjYW5jZWwiLCJlbWl0IiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL2J1bGstbG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCBDb25uZWN0aW9uLCB7IHR5cGUgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4vY29ubmVjdGlvbic7XG5cbmltcG9ydCB7IFRyYW5zZm9ybSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBUWVBFIGFzIFRPS0VOX1RZUEUgfSBmcm9tICcuL3Rva2VuL3Rva2VuJztcblxuaW1wb3J0IHsgdHlwZSBEYXRhVHlwZSwgdHlwZSBQYXJhbWV0ZXIgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRkxBR1MgPSB7XG4gIG51bGxhYmxlOiAxIDw8IDAsXG4gIGNhc2VTZW46IDEgPDwgMSxcbiAgdXBkYXRlYWJsZVJlYWRXcml0ZTogMSA8PCAyLFxuICB1cGRhdGVhYmxlVW5rbm93bjogMSA8PCAzLFxuICBpZGVudGl0eTogMSA8PCA0LFxuICBjb21wdXRlZDogMSA8PCA1LCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAgZml4ZWRMZW5DTFJUeXBlOiAxIDw8IDgsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBzcGFyc2VDb2x1bW5TZXQ6IDEgPDwgMTAsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMy5CXG4gIGhpZGRlbjogMSA8PCAxMywgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIGtleTogMSA8PCAxNCwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIG51bGxhYmxlVW5rbm93bjogMSA8PCAxNSAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRE9ORV9TVEFUVVMgPSB7XG4gIEZJTkFMOiAweDAwLFxuICBNT1JFOiAweDEsXG4gIEVSUk9SOiAweDIsXG4gIElOWEFDVDogMHg0LFxuICBDT1VOVDogMHgxMCxcbiAgQVRUTjogMHgyMCxcbiAgU1JWRVJST1I6IDB4MTAwXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbE9wdGlvbnMge1xuICBjaGVja0NvbnN0cmFpbnRzOiBib29sZWFuO1xuICBmaXJlVHJpZ2dlcnM6IGJvb2xlYW47XG4gIGtlZXBOdWxsczogYm9vbGVhbjtcbiAgbG9ja1RhYmxlOiBib29sZWFuO1xuICBvcmRlcjogeyBbY29sdW1uTmFtZTogc3RyaW5nXTogJ0FTQycgfCAnREVTQycgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvbm9ycyBjb25zdHJhaW50cyBkdXJpbmcgYnVsayBsb2FkLCB1c2luZyBULVNRTFxuICAgKiBbQ0hFQ0tfQ09OU1RSQUlOVFNdKGh0dHBzOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODYyNDcodj1zcWwuMTA1KS5hc3B4KS5cbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBjaGVja0NvbnN0cmFpbnRzPzogSW50ZXJuYWxPcHRpb25zWydjaGVja0NvbnN0cmFpbnRzJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvbm9ycyBpbnNlcnQgdHJpZ2dlcnMgZHVyaW5nIGJ1bGsgbG9hZCwgdXNpbmcgdGhlIFQtU1FMIFtGSVJFX1RSSUdHRVJTXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3NjQwKHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZmlyZVRyaWdnZXJzPzogSW50ZXJuYWxPcHRpb25zWydmaXJlVHJpZ2dlcnMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSG9ub3JzIG51bGwgdmFsdWUgcGFzc2VkLCBpZ25vcmVzIHRoZSBkZWZhdWx0IHZhbHVlcyBzZXQgb24gdGFibGUsIHVzaW5nIFQtU1FMIFtLRUVQX05VTExTXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3ODg3KHY9c3FsLjEyMCkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAga2VlcE51bGxzPzogSW50ZXJuYWxPcHRpb25zWydrZWVwTnVsbHMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGxhY2VzIGEgYnVsayB1cGRhdGUoQlUpIGxvY2sgb24gdGFibGUgd2hpbGUgcGVyZm9ybWluZyBidWxrIGxvYWQsIHVzaW5nIFQtU1FMIFtUQUJMT0NLXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTgwODc2KHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgbG9ja1RhYmxlPzogSW50ZXJuYWxPcHRpb25zWydsb2NrVGFibGUnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGF0YSB0byBwb3NzaWJseSBpbmNyZWFzZSBidWxrIGluc2VydCBwZXJmb3JtYW5jZSwgdXNpbmcgVC1TUUwgW09SREVSXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wcmV2aW91cy12ZXJzaW9ucy9zcWwvc3FsLXNlcnZlci0yMDA4LXIyL21zMTc3NDY4KHY9c3FsLjEwNSkpLiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIG9yZGVyPzogSW50ZXJuYWxPcHRpb25zWydvcmRlciddIHwgdW5kZWZpbmVkO1xufVxuXG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrID1cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFtbQnVsa0xvYWRdXSBmaW5pc2hlcyBleGVjdXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSByb3dDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgaW5zZXJ0ZWRcbiAgICovXG4gIChlcnI6IEVycm9yIHwgdW5kZWZpbmVkIHwgbnVsbCwgcm93Q291bnQ/OiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBDb2x1bW4gZXh0ZW5kcyBQYXJhbWV0ZXIge1xuICBvYmpOYW1lOiBzdHJpbmc7XG4gIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ29sdW1uT3B0aW9ucyB7XG4gIG91dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBWYXJDaGFyLCBOVmFyQ2hhciwgVmFyQmluYXJ5LiBVc2UgbGVuZ3RoIGFzIGBJbmZpbml0eWAgZm9yIFZhckNoYXIobWF4KSwgTlZhckNoYXIobWF4KSBhbmQgVmFyQmluYXJ5KG1heCkuXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvciBOdW1lcmljLCBEZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgICovXG4gIHNjYWxlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0sIHRoZW4geW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICovXG4gIG9iak5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gYWNjZXB0cyBOVUxMIHZhbHVlcy5cbiAgICovXG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbn1cblxuY29uc3Qgcm93VG9rZW5CdWZmZXIgPSBCdWZmZXIuZnJvbShbIFRPS0VOX1RZUEUuUk9XIF0pO1xuY29uc3QgdGV4dFBvaW50ZXJBbmRUaW1lc3RhbXBCdWZmZXIgPSBCdWZmZXIuZnJvbShbXG4gIC8vIFRleHRQb2ludGVyIGxlbmd0aFxuICAweDEwLFxuXG4gIC8vIFRleHRQb2ludGVyXG4gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG5cbiAgLy8gVGltZXN0YW1wXG4gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBcbl0pO1xuY29uc3QgdGV4dFBvaW50ZXJOdWxsQnVmZmVyID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuLy8gQSB0cmFuc2Zvcm0gdGhhdCBjb252ZXJ0cyByb3dzIHRvIHBhY2tldHMuXG5jbGFzcyBSb3dUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbHVtbk1ldGFkYXRhV3JpdHRlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWxrTG9hZDogQnVsa0xvYWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFpbk9wdGlvbnM6IEJ1bGtMb2FkWydvcHRpb25zJ107XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uczogQnVsa0xvYWRbJ2NvbHVtbnMnXTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJ1bGtMb2FkOiBCdWxrTG9hZCkge1xuICAgIHN1cGVyKHsgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy5idWxrTG9hZCA9IGJ1bGtMb2FkO1xuICAgIHRoaXMubWFpbk9wdGlvbnMgPSBidWxrTG9hZC5vcHRpb25zO1xuICAgIHRoaXMuY29sdW1ucyA9IGJ1bGtMb2FkLmNvbHVtbnM7XG5cbiAgICB0aGlzLmNvbHVtbk1ldGFkYXRhV3JpdHRlbiA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdHJhbnNmb3JtKHJvdzogQXJyYXk8dW5rbm93bj4gfCB7IFtjb2xOYW1lOiBzdHJpbmddOiB1bmtub3duIH0sIF9lbmNvZGluZzogc3RyaW5nLCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uTWV0YWRhdGFXcml0dGVuKSB7XG4gICAgICB0aGlzLnB1c2godGhpcy5idWxrTG9hZC5nZXRDb2xNZXRhRGF0YSgpKTtcbiAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFXcml0dGVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnB1c2gocm93VG9rZW5CdWZmZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJvdykgPyByb3dbaV0gOiByb3dbYy5vYmpOYW1lXTtcblxuICAgICAgaWYgKCF0aGlzLmJ1bGtMb2FkLmZpcnN0Um93V3JpdHRlbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gYy50eXBlLnZhbGlkYXRlKHZhbHVlLCBjLmNvbGxhdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHtcbiAgICAgICAgbGVuZ3RoOiBjLmxlbmd0aCxcbiAgICAgICAgc2NhbGU6IGMuc2NhbGUsXG4gICAgICAgIHByZWNpc2lvbjogYy5wcmVjaXNpb24sXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfTtcblxuICAgICAgaWYgKGMudHlwZS5uYW1lID09PSAnVGV4dCcgfHwgYy50eXBlLm5hbWUgPT09ICdJbWFnZScgfHwgYy50eXBlLm5hbWUgPT09ICdOVGV4dCcpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnB1c2godGV4dFBvaW50ZXJOdWxsQnVmZmVyKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHVzaCh0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVzaChjLnR5cGUuZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCB0aGlzLm1haW5PcHRpb25zKSk7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGMudHlwZS5nZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCB0aGlzLm1haW5PcHRpb25zKSkge1xuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZmx1c2goY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnB1c2godGhpcy5idWxrTG9hZC5jcmVhdGVEb25lVG9rZW4oKSk7XG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgQnVsa0xvYWQgaW5zdGFuY2UgaXMgdXNlZCB0byBwZXJmb3JtIGEgYnVsayBpbnNlcnQuXG4gKlxuICogVXNlIFtbQ29ubmVjdGlvbi5uZXdCdWxrTG9hZF1dIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSwgYW5kIFtbQ29ubmVjdGlvbi5leGVjQnVsa0xvYWRdXSB0byBleGVjdXRlIGl0LlxuICpcbiAqIEV4YW1wbGUgb2YgQnVsa0xvYWQgVXNhZ2VzOlxuICpcbiAqIGBgYGpzXG4gKiAvLyBvcHRpb25hbCBCdWxrTG9hZCBvcHRpb25zXG4gKiBjb25zdCBvcHRpb25zID0geyBrZWVwTnVsbHM6IHRydWUgfTtcbiAqXG4gKiAvLyBpbnN0YW50aWF0ZSAtIHByb3ZpZGUgdGhlIHRhYmxlIHdoZXJlIHlvdSdsbCBiZSBpbnNlcnRpbmcgdG8sIG9wdGlvbnMgYW5kIGEgY2FsbGJhY2tcbiAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnTXlUYWJsZScsIG9wdGlvbnMsIChlcnJvciwgcm93Q291bnQpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ2luc2VydGVkICVkIHJvd3MnLCByb3dDb3VudCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZXR1cCB5b3VyIGNvbHVtbnMgLSBhbHdheXMgaW5kaWNhdGUgd2hldGhlciB0aGUgY29sdW1uIGlzIG51bGxhYmxlXG4gKiBidWxrTG9hZC5hZGRDb2x1bW4oJ215SW50JywgVFlQRVMuSW50LCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAqIGJ1bGtMb2FkLmFkZENvbHVtbignbXlTdHJpbmcnLCBUWVBFUy5OVmFyQ2hhciwgeyBsZW5ndGg6IDUwLCBudWxsYWJsZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBleGVjdXRlXG4gKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICogICB7IG15SW50OiA3LCBteVN0cmluZzogJ2hlbGxvJyB9LFxuICogICB7IG15SW50OiAyMywgbXlTdHJpbmc6ICd3b3JsZCcgfVxuICogXSk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgQnVsa0xvYWQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBleGVjdXRpb25TdGFydGVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0cmVhbWluZ01vZGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGFibGU6IHN0cmluZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbGxiYWNrOiBDYWxsYmFjaztcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbHVtbnM6IEFycmF5PENvbHVtbj47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uc0J5TmFtZTogeyBbbmFtZTogc3RyaW5nXTogQ29sdW1uIH07XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmaXJzdFJvd1dyaXR0ZW46IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm93VG9QYWNrZXRUcmFuc2Zvcm06IFJvd1RyYW5zZm9ybTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1bGtPcHRpb25zOiBJbnRlcm5hbE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJvd3M6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcnN0OiBBcnJheTxhbnk+IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZTogc3RyaW5nLCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCwgY29ubmVjdGlvbk9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMsIHtcbiAgICBjaGVja0NvbnN0cmFpbnRzID0gZmFsc2UsXG4gICAgZmlyZVRyaWdnZXJzID0gZmFsc2UsXG4gICAga2VlcE51bGxzID0gZmFsc2UsXG4gICAgbG9ja1RhYmxlID0gZmFsc2UsXG4gICAgb3JkZXIgPSB7fSxcbiAgfTogT3B0aW9ucywgY2FsbGJhY2s6IENhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjaGVja0NvbnN0cmFpbnRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuY2hlY2tDb25zdHJhaW50c1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlyZVRyaWdnZXJzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuZmlyZVRyaWdnZXJzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBrZWVwTnVsbHMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5rZWVwTnVsbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxvY2tUYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLmxvY2tUYWJsZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdvYmplY3QnIHx8IG9yZGVyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLm9yZGVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMob3JkZXIpKSB7XG4gICAgICBpZiAoZGlyZWN0aW9uICE9PSAnQVNDJyAmJiBkaXJlY3Rpb24gIT09ICdERVNDJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgb2YgdGhlIFwiJyArIGNvbHVtbiArICdcIiBrZXkgaW4gdGhlIFwib3B0aW9ucy5vcmRlclwiIG9iamVjdCBtdXN0IGJlIGVpdGhlciBcIkFTQ1wiIG9yIFwiREVTQ1wiLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmV4ZWN1dGlvblN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuXG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb25PcHRpb25zO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmNvbHVtbnNCeU5hbWUgPSB7fTtcbiAgICB0aGlzLmZpcnN0Um93V3JpdHRlbiA9IGZhbHNlO1xuICAgIHRoaXMuc3RyZWFtaW5nTW9kZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb3dUb1BhY2tldFRyYW5zZm9ybSA9IG5ldyBSb3dUcmFuc2Zvcm0odGhpcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcblxuICAgIHRoaXMuYnVsa09wdGlvbnMgPSB7IGNoZWNrQ29uc3RyYWludHMsIGZpcmVUcmlnZ2Vycywga2VlcE51bGxzLCBsb2NrVGFibGUsIG9yZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgYnVsayBsb2FkLlxuICAgKlxuICAgKiBUaGUgY29sdW1uIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCB0aGUgdGFibGUgeW91IGFyZSB0cnlpbmcgdG8gaW5zZXJ0IGludG8uXG4gICAqIEF0dGVtcHRpbmcgdG8gY2FsbCBhZGRDb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHJvdyBoYXMgYmVlbiBhZGRlZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICpcbiAgICogYGBganNcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdNeUludENvbHVtbicsIFRZUEVTLkludCwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uLlxuICAgKiBAcGFyYW0gdHlwZSBPbmUgb2YgdGhlIHN1cHBvcnRlZCBgZGF0YSB0eXBlc2AuXG4gICAqIEBwYXJhbSBfX25hbWVkUGFyYW1ldGVycyBBZGRpdGlvbmFsIGNvbHVtbiB0eXBlIGluZm9ybWF0aW9uLiBBdCBhIG1pbmltdW0sIGBudWxsYWJsZWAgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciBmYWxzZS5cbiAgICogQHBhcmFtIGxlbmd0aCBGb3IgVmFyQ2hhciwgTlZhckNoYXIsIFZhckJpbmFyeS4gVXNlIGxlbmd0aCBhcyBgSW5maW5pdHlgIGZvciBWYXJDaGFyKG1heCksIE5WYXJDaGFyKG1heCkgYW5kIFZhckJpbmFyeShtYXgpLlxuICAgKiBAcGFyYW0gbnVsbGFibGUgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBhY2NlcHRzIE5VTEwgdmFsdWVzLlxuICAgKiBAcGFyYW0gb2JqTmFtZSBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0gb3IgW1tDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZF1dLCB0aGVuIHlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBwcmVjaXNpb24gRm9yIE51bWVyaWMsIERlY2ltYWwuXG4gICAqIEBwYXJhbSBzY2FsZSBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgKi9cbiAgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUsIHsgb3V0cHV0ID0gZmFsc2UsIGxlbmd0aCwgcHJlY2lzaW9uLCBzY2FsZSwgb2JqTmFtZSA9IG5hbWUsIG51bGxhYmxlID0gdHJ1ZSB9OiBDb2x1bW5PcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuZmlyc3RSb3dXcml0dGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbnMgY2Fubm90IGJlIGFkZGVkIHRvIGJ1bGsgaW5zZXJ0IGFmdGVyIHRoZSBmaXJzdCByb3cgaGFzIGJlZW4gd3JpdHRlbi4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXhlY3V0aW9uU3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW5zIGNhbm5vdCBiZSBhZGRlZCB0byBidWxrIGluc2VydCBhZnRlciBleGVjdXRpb24gaGFzIHN0YXJ0ZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW4gPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgb2JqTmFtZTogb2JqTmFtZSxcbiAgICAgIG51bGxhYmxlOiBudWxsYWJsZSxcbiAgICAgIGNvbGxhdGlvbjogdGhpcy5jb2xsYXRpb25cbiAgICB9O1xuXG4gICAgaWYgKCh0eXBlLmlkICYgMHgzMCkgPT09IDB4MjApIHtcbiAgICAgIGlmIChjb2x1bW4ubGVuZ3RoID09IG51bGwgJiYgdHlwZS5yZXNvbHZlTGVuZ3RoKSB7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPSB0eXBlLnJlc29sdmVMZW5ndGgoY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZS5yZXNvbHZlUHJlY2lzaW9uICYmIGNvbHVtbi5wcmVjaXNpb24gPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnByZWNpc2lvbiA9IHR5cGUucmVzb2x2ZVByZWNpc2lvbihjb2x1bW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlLnJlc29sdmVTY2FsZSAmJiBjb2x1bW4uc2NhbGUgPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnNjYWxlID0gdHlwZS5yZXNvbHZlU2NhbGUoY29sdW1uKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuXG4gICAgdGhpcy5jb2x1bW5zQnlOYW1lW25hbWVdID0gY29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRPcHRpb25zU3FsKCkge1xuICAgIGNvbnN0IGFkZE9wdGlvbnMgPSBbXTtcblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnQ0hFQ0tfQ09OU1RSQUlOVFMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5maXJlVHJpZ2dlcnMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnRklSRV9UUklHR0VSUycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmtlZXBOdWxscykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdLRUVQX05VTExTJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMubG9ja1RhYmxlKSB7XG4gICAgICBhZGRPcHRpb25zLnB1c2goJ1RBQkxPQ0snKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5vcmRlcikge1xuICAgICAgY29uc3Qgb3JkZXJDb2x1bW5zID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJ1bGtPcHRpb25zLm9yZGVyKSkge1xuICAgICAgICBvcmRlckNvbHVtbnMucHVzaChgJHtjb2x1bW59ICR7ZGlyZWN0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JkZXJDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBhZGRPcHRpb25zLnB1c2goYE9SREVSICgke29yZGVyQ29sdW1ucy5qb2luKCcsICcpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCBXSVRIICgke2FkZE9wdGlvbnMuam9pbignLCcpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCdWxrSW5zZXJ0U3FsKCkge1xuICAgIGxldCBzcWwgPSAnaW5zZXJ0IGJ1bGsgJyArIHRoaXMudGFibGUgKyAnKCc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLCAnO1xuICAgICAgfVxuICAgICAgc3FsICs9ICdbJyArIGMubmFtZSArICddICcgKyAoYy50eXBlLmRlY2xhcmF0aW9uKGMpKTtcbiAgICB9XG4gICAgc3FsICs9ICcpJztcblxuICAgIHNxbCArPSB0aGlzLmdldE9wdGlvbnNTcWwoKTtcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2ltcGx5IGEgaGVscGVyIHV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIGBDUkVBVEUgVEFCTEUgU1FMYCBzdGF0ZW1lbnQgYmFzZWQgb24gdGhlIGNvbHVtbnMgYWRkZWQgdG8gdGhlIGJ1bGtMb2FkIG9iamVjdC5cbiAgICogVGhpcyBtYXkgYmUgcGFydGljdWxhcmx5IGhhbmR5IHdoZW4geW91IHdhbnQgdG8gaW5zZXJ0IGludG8gYSB0ZW1wb3JhcnkgdGFibGUgKGEgdGFibGUgd2hpY2ggc3RhcnRzIHdpdGggYCNgKS5cbiAgICpcbiAgICogYGBganNcbiAgICogdmFyIHNxbCA9IGJ1bGtMb2FkLmdldFRhYmxlQ3JlYXRpb25TcWwoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEEgc2lkZSBub3RlIG9uIGJ1bGsgaW5zZXJ0aW5nIGludG8gdGVtcG9yYXJ5IHRhYmxlczogaWYgeW91IHdhbnQgdG8gYWNjZXNzIGEgbG9jYWwgdGVtcG9yYXJ5IHRhYmxlIGFmdGVyIGV4ZWN1dGluZyB0aGUgYnVsayBsb2FkLFxuICAgKiB5b3UnbGwgbmVlZCB0byB1c2UgdGhlIHNhbWUgY29ubmVjdGlvbiBhbmQgZXhlY3V0ZSB5b3VyIHJlcXVlc3RzIHVzaW5nIFtbQ29ubmVjdGlvbi5leGVjU3FsQmF0Y2hdXSBpbnN0ZWFkIG9mIFtbQ29ubmVjdGlvbi5leGVjU3FsXV1cbiAgICovXG4gIGdldFRhYmxlQ3JlYXRpb25TcWwoKSB7XG4gICAgbGV0IHNxbCA9ICdDUkVBVEUgVEFCTEUgJyArIHRoaXMudGFibGUgKyAnKFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLFxcbic7XG4gICAgICB9XG4gICAgICBzcWwgKz0gJ1snICsgYy5uYW1lICsgJ10gJyArIChjLnR5cGUuZGVjbGFyYXRpb24oYykpO1xuICAgICAgaWYgKGMubnVsbGFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzcWwgKz0gJyAnICsgKGMubnVsbGFibGUgPyAnTlVMTCcgOiAnTk9UIE5VTEwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3FsICs9ICdcXG4pJztcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRDb2xNZXRhRGF0YSgpIHtcbiAgICBjb25zdCB0QnVmID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMTAwLCBudWxsLCB0cnVlKTtcbiAgICAvLyBUb2tlblR5cGVcbiAgICB0QnVmLndyaXRlVUludDgoVE9LRU5fVFlQRS5DT0xNRVRBREFUQSk7XG4gICAgLy8gQ291bnRcbiAgICB0QnVmLndyaXRlVUludDE2TEUodGhpcy5jb2x1bW5zLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgLy8gVXNlclR5cGVcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MTZMRSgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmxhZ3NcbiAgICAgIGxldCBmbGFncyA9IEZMQUdTLnVwZGF0ZWFibGVSZWFkV3JpdGU7XG4gICAgICBpZiAoYy5udWxsYWJsZSkge1xuICAgICAgICBmbGFncyB8PSBGTEFHUy5udWxsYWJsZTtcbiAgICAgIH0gZWxzZSBpZiAoYy5udWxsYWJsZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uID49ICc3XzInKSB7XG4gICAgICAgIGZsYWdzIHw9IEZMQUdTLm51bGxhYmxlVW5rbm93bjtcbiAgICAgIH1cbiAgICAgIHRCdWYud3JpdGVVSW50MTZMRShmbGFncyk7XG5cbiAgICAgIC8vIFRZUEVfSU5GT1xuICAgICAgdEJ1Zi53cml0ZUJ1ZmZlcihjLnR5cGUuZ2VuZXJhdGVUeXBlSW5mbyhjLCB0aGlzLm9wdGlvbnMpKTtcblxuICAgICAgLy8gVGFibGVOYW1lXG4gICAgICBpZiAoYy50eXBlLmhhc1RhYmxlTmFtZSkge1xuICAgICAgICB0QnVmLndyaXRlVXNWYXJjaGFyKHRoaXMudGFibGUsICd1Y3MyJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbE5hbWVcbiAgICAgIHRCdWYud3JpdGVCVmFyY2hhcihjLm5hbWUsICd1Y3MyJyk7XG4gICAgfVxuICAgIHJldHVybiB0QnVmLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHRpbWVvdXQgZm9yIHRoaXMgYnVsayBsb2FkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBidWxrTG9hZC5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBidWxrIGxvYWQgaXMgY29uc2lkZXJlZCBmYWlsZWQsIG9yIDAgZm9yIG5vIHRpbWVvdXQuXG4gICAqICAgV2hlbiBubyB0aW1lb3V0IGlzIHNldCBmb3IgdGhlIGJ1bGsgbG9hZCwgdGhlIFtbQ29ubmVjdGlvbk9wdGlvbnMucmVxdWVzdFRpbWVvdXRdXSBvZiB0aGUgQ29ubmVjdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgc2V0VGltZW91dCh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRG9uZVRva2VuKCkge1xuICAgIC8vIEl0IG1pZ2h0IGJlIG5pY2UgdG8gbWFrZSBEb25lVG9rZW4gYSBjbGFzcyBpZiBhbnl0aGluZyBuZWVkcyB0byBjcmVhdGUgdGhlbSwgYnV0IGZvciBub3csIGp1c3QgZG8gaXQgaGVyZVxuICAgIGNvbnN0IHRCdWYgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcih0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInID8gOSA6IDEzKTtcbiAgICB0QnVmLndyaXRlVUludDgoVE9LRU5fVFlQRS5ET05FKTtcbiAgICBjb25zdCBzdGF0dXMgPSBET05FX1NUQVRVUy5GSU5BTDtcbiAgICB0QnVmLndyaXRlVUludDE2TEUoc3RhdHVzKTtcbiAgICB0QnVmLndyaXRlVUludDE2TEUoMCk7IC8vIEN1ckNtZCAoVERTIGlnbm9yZXMgdGhpcylcbiAgICB0QnVmLndyaXRlVUludDMyTEUoMCk7IC8vIHJvdyBjb3VudCAtIGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA+PSAnN18yJykge1xuICAgICAgdEJ1Zi53cml0ZVVJbnQzMkxFKDApOyAvLyByb3cgY291bnQgaXMgNjQgYml0cyBpbiA+PSBURFMgNy4yXG4gICAgfVxuICAgIHJldHVybiB0QnVmLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsZWQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnVsa0xvYWQ7XG5tb2R1bGUuZXhwb3J0cyA9IEJ1bGtMb2FkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJ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
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-load.js","names":["_events","require","_writableTrackingBuffer","_interopRequireDefault","_stream","_token","obj","__esModule","default","FLAGS","nullable","caseSen","updateableReadWrite","updateableUnknown","identity","computed","fixedLenCLRType","sparseColumnSet","hidden","key","nullableUnknown","DONE_STATUS","FINAL","MORE","ERROR","INXACT","COUNT","ATTN","SRVERROR","rowTokenBuffer","Buffer","from","TOKEN_TYPE","ROW","textPointerAndTimestampBuffer","textPointerNullBuffer","RowTransform","Transform","columnMetadataWritten","bulkLoad","mainOptions","columns","constructor","writableObjectMode","options","_transform","row","_encoding","callback","push","getColMetaData","i","length","c","value","Array","isArray","objName","firstRowWritten","type","validate","collation","error","parameter","scale","precision","name","generateParameterLength","chunk","generateParameterData","process","nextTick","_flush","createDoneToken","BulkLoad","EventEmitter","canceled","executionStarted","streamingMode","table","timeout","columnsByName","rowToPacketTransform","bulkOptions","connection","rows","rst","rowCount","connectionOptions","checkConstraints","fireTriggers","keepNulls","lockTable","order","TypeError","column","direction","Object","entries","undefined","addColumn","output","Error","id","resolveLength","resolvePrecision","resolveScale","getOptionsSql","addOptions","orderColumns","join","getBulkInsertSql","sql","len","declaration","getTableCreationSql","tBuf","WritableTrackingBuffer","writeUInt8","COLMETADATA","writeUInt16LE","j","tdsVersion","writeUInt32LE","flags","writeBuffer","generateTypeInfo","hasTableName","writeUsVarchar","writeBVarchar","data","setTimeout","DONE","status","cancel","emit","_default","exports","module"],"sources":["../src/bulk-load.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\nimport Connection, { InternalConnectionOptions } from './connection';\n\nimport { Transform } from 'stream';\nimport { TYPE as TOKEN_TYPE } from './token/token';\n\nimport { DataType, Parameter } from './data-type';\nimport { Collation } from './collation';\n\n/**\n * @private\n */\nconst FLAGS = {\n nullable: 1 << 0,\n caseSen: 1 << 1,\n updateableReadWrite: 1 << 2,\n updateableUnknown: 1 << 3,\n identity: 1 << 4,\n computed: 1 << 5, // introduced in TDS 7.2\n fixedLenCLRType: 1 << 8, // introduced in TDS 7.2\n sparseColumnSet: 1 << 10, // introduced in TDS 7.3.B\n hidden: 1 << 13, // introduced in TDS 7.2\n key: 1 << 14, // introduced in TDS 7.2\n nullableUnknown: 1 << 15 // introduced in TDS 7.2\n};\n\n/**\n * @private\n */\nconst DONE_STATUS = {\n FINAL: 0x00,\n MORE: 0x1,\n ERROR: 0x2,\n INXACT: 0x4,\n COUNT: 0x10,\n ATTN: 0x20,\n SRVERROR: 0x100\n};\n\n/**\n * @private\n */\ninterface InternalOptions {\n checkConstraints: boolean;\n fireTriggers: boolean;\n keepNulls: boolean;\n lockTable: boolean;\n order: { [columnName: string]: 'ASC' | 'DESC' };\n}\n\nexport interface Options {\n /**\n * Honors constraints during bulk load, using T-SQL\n * [CHECK_CONSTRAINTS](https://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx).\n * (default: `false`)\n */\n checkConstraints?: InternalOptions['checkConstraints'] | undefined;\n\n /**\n * Honors insert triggers during bulk load, using the T-SQL [FIRE_TRIGGERS](https://technet.microsoft.com/en-us/library/ms187640(v=sql.105).aspx). (default: `false`)\n */\n fireTriggers?: InternalOptions['fireTriggers'] | undefined;\n\n /**\n * Honors null value passed, ignores the default values set on table, using T-SQL [KEEP_NULLS](https://msdn.microsoft.com/en-us/library/ms187887(v=sql.120).aspx). (default: `false`)\n */\n keepNulls?: InternalOptions['keepNulls'] | undefined;\n\n /**\n * Places a bulk update(BU) lock on table while performing bulk load, using T-SQL [TABLOCK](https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx). (default: `false`)\n */\n lockTable?: InternalOptions['lockTable'] | undefined;\n\n /**\n * Specifies the ordering of the data to possibly increase bulk insert performance, using T-SQL [ORDER](https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms177468(v=sql.105)). (default: `{}`)\n */\n order?: InternalOptions['order'] | undefined;\n}\n\n\nexport type Callback =\n /**\n * A function which will be called after the [[BulkLoad]] finishes executing.\n *\n * @param rowCount the number of rows inserted\n */\n (err: Error | undefined | null, rowCount?: number) => void;\n\ninterface Column extends Parameter {\n objName: string;\n collation: Collation | undefined;\n}\n\ninterface ColumnOptions {\n output?: boolean;\n\n /**\n * For VarChar, NVarChar, VarBinary. Use length as `Infinity` for VarChar(max), NVarChar(max) and VarBinary(max).\n */\n length?: number;\n\n /**\n * For Numeric, Decimal.\n */\n precision?: number;\n\n /**\n * For Numeric, Decimal, Time, DateTime2, DateTimeOffset.\n */\n scale?: number;\n\n /**\n * If the name of the column is different from the name of the property found on `rowObj` arguments passed to [[addRow]], then you can use this option to specify the property name.\n */\n objName?: string;\n\n /**\n * Indicates whether the column accepts NULL values.\n */\n nullable?: boolean;\n}\n\nconst rowTokenBuffer = Buffer.from([ TOKEN_TYPE.ROW ]);\nconst textPointerAndTimestampBuffer = Buffer.from([\n // TextPointer length\n 0x10,\n\n // TextPointer\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n // Timestamp\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n]);\nconst textPointerNullBuffer = Buffer.from([0x00]);\n\n// A transform that converts rows to packets.\nclass RowTransform extends Transform {\n /**\n * @private\n */\n columnMetadataWritten: boolean;\n /**\n * @private\n */\n bulkLoad: BulkLoad;\n /**\n * @private\n */\n mainOptions: BulkLoad['options'];\n /**\n * @private\n */\n columns: BulkLoad['columns'];\n\n /**\n * @private\n */\n constructor(bulkLoad: BulkLoad) {\n super({ writableObjectMode: true });\n\n this.bulkLoad = bulkLoad;\n this.mainOptions = bulkLoad.options;\n this.columns = bulkLoad.columns;\n\n this.columnMetadataWritten = false;\n }\n\n /**\n * @private\n */\n _transform(row: Array<unknown> | { [colName: string]: unknown }, _encoding: string, callback: (error?: Error) => void) {\n if (!this.columnMetadataWritten) {\n this.push(this.bulkLoad.getColMetaData());\n this.columnMetadataWritten = true;\n }\n\n this.push(rowTokenBuffer);\n\n for (let i = 0; i < this.columns.length; i++) {\n const c = this.columns[i];\n let value = Array.isArray(row) ? row[i] : row[c.objName];\n\n if (!this.bulkLoad.firstRowWritten) {\n try {\n value = c.type.validate(value, c.collation);\n } catch (error: any) {\n return callback(error);\n }\n }\n\n const parameter = {\n length: c.length,\n scale: c.scale,\n precision: c.precision,\n value: value\n };\n\n if (c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText') {\n if (value == null) {\n this.push(textPointerNullBuffer);\n continue;\n }\n\n this.push(textPointerAndTimestampBuffer);\n }\n\n this.push(c.type.generateParameterLength(parameter, this.mainOptions));\n for (const chunk of c.type.generateParameterData(parameter, this.mainOptions)) {\n this.push(chunk);\n }\n }\n\n process.nextTick(callback);\n }\n\n /**\n * @private\n */\n _flush(callback: () => void) {\n this.push(this.bulkLoad.createDoneToken());\n\n process.nextTick(callback);\n }\n}\n\n/**\n * A BulkLoad instance is used to perform a bulk insert.\n *\n * Use [[Connection.newBulkLoad]] to create a new instance, and [[Connection.execBulkLoad]] to execute it.\n *\n * Example of BulkLoad Usages:\n *\n * ```js\n * // optional BulkLoad options\n * const options = { keepNulls: true };\n *\n * // instantiate - provide the table where you'll be inserting to, options and a callback\n * const bulkLoad = connection.newBulkLoad('MyTable', options, (error, rowCount) => {\n * console.log('inserted %d rows', rowCount);\n * });\n *\n * // setup your columns - always indicate whether the column is nullable\n * bulkLoad.addColumn('myInt', TYPES.Int, { nullable: false });\n * bulkLoad.addColumn('myString', TYPES.NVarChar, { length: 50, nullable: true });\n *\n * // execute\n * connection.execBulkLoad(bulkLoad, [\n * { myInt: 7, myString: 'hello' },\n * { myInt: 23, myString: 'world' }\n * ]);\n * ```\n */\nclass BulkLoad extends EventEmitter {\n /**\n * @private\n */\n error: Error | undefined;\n /**\n * @private\n */\n canceled: boolean;\n /**\n * @private\n */\n executionStarted: boolean;\n /**\n * @private\n */\n streamingMode: boolean;\n /**\n * @private\n */\n table: string;\n /**\n * @private\n */\n timeout: number | undefined;\n\n /**\n * @private\n */\n options: InternalConnectionOptions;\n /**\n * @private\n */\n callback: Callback;\n\n /**\n * @private\n */\n columns: Array<Column>;\n /**\n * @private\n */\n columnsByName: { [name: string]: Column };\n\n /**\n * @private\n */\n firstRowWritten: boolean;\n /**\n * @private\n */\n rowToPacketTransform: RowTransform;\n\n /**\n * @private\n */\n bulkOptions: InternalOptions;\n\n /**\n * @private\n */\n connection: Connection | undefined;\n /**\n * @private\n */\n rows: Array<any> | undefined;\n /**\n * @private\n */\n rst: Array<any> | undefined;\n /**\n * @private\n */\n rowCount: number | undefined;\n\n collation: Collation | undefined;\n\n /**\n * @private\n */\n constructor(table: string, collation: Collation | undefined, connectionOptions: InternalConnectionOptions, {\n checkConstraints = false,\n fireTriggers = false,\n keepNulls = false,\n lockTable = false,\n order = {},\n }: Options, callback: Callback) {\n if (typeof checkConstraints !== 'boolean') {\n throw new TypeError('The \"options.checkConstraints\" property must be of type boolean.');\n }\n\n if (typeof fireTriggers !== 'boolean') {\n throw new TypeError('The \"options.fireTriggers\" property must be of type boolean.');\n }\n\n if (typeof keepNulls !== 'boolean') {\n throw new TypeError('The \"options.keepNulls\" property must be of type boolean.');\n }\n\n if (typeof lockTable !== 'boolean') {\n throw new TypeError('The \"options.lockTable\" property must be of type boolean.');\n }\n\n if (typeof order !== 'object' || order === null) {\n throw new TypeError('The \"options.order\" property must be of type object.');\n }\n\n for (const [column, direction] of Object.entries(order)) {\n if (direction !== 'ASC' && direction !== 'DESC') {\n throw new TypeError('The value of the \"' + column + '\" key in the \"options.order\" object must be either \"ASC\" or \"DESC\".');\n }\n }\n\n super();\n\n this.error = undefined;\n this.canceled = false;\n this.executionStarted = false;\n\n this.collation = collation;\n\n this.table = table;\n this.options = connectionOptions;\n this.callback = callback;\n this.columns = [];\n this.columnsByName = {};\n this.firstRowWritten = false;\n this.streamingMode = false;\n\n this.rowToPacketTransform = new RowTransform(this); // eslint-disable-line no-use-before-define\n\n this.bulkOptions = { checkConstraints, fireTriggers, keepNulls, lockTable, order };\n }\n\n /**\n * Adds a column to the bulk load.\n *\n * The column definitions should match the table you are trying to insert into.\n * Attempting to call addColumn after the first row has been added will throw an exception.\n *\n * ```js\n * bulkLoad.addColumn('MyIntColumn', TYPES.Int, { nullable: false });\n * ```\n *\n * @param name The name of the column.\n * @param type One of the supported `data types`.\n * @param __namedParameters Additional column type information. At a minimum, `nullable` must be set to true or false.\n * @param length For VarChar, NVarChar, VarBinary. Use length as `Infinity` for VarChar(max), NVarChar(max) and VarBinary(max).\n * @param nullable Indicates whether the column accepts NULL values.\n * @param objName If the name of the column is different from the name of the property found on `rowObj` arguments passed to [[addRow]] or [[Connection.execBulkLoad]], then you can use this option to specify the property name.\n * @param precision For Numeric, Decimal.\n * @param scale For Numeric, Decimal, Time, DateTime2, DateTimeOffset.\n */\n addColumn(name: string, type: DataType, { output = false, length, precision, scale, objName = name, nullable = true }: ColumnOptions) {\n if (this.firstRowWritten) {\n throw new Error('Columns cannot be added to bulk insert after the first row has been written.');\n }\n if (this.executionStarted) {\n throw new Error('Columns cannot be added to bulk insert after execution has started.');\n }\n\n const column: Column = {\n type: type,\n name: name,\n value: null,\n output: output,\n length: length,\n precision: precision,\n scale: scale,\n objName: objName,\n nullable: nullable,\n collation: this.collation\n };\n\n if ((type.id & 0x30) === 0x20) {\n if (column.length == null && type.resolveLength) {\n column.length = type.resolveLength(column);\n }\n }\n\n if (type.resolvePrecision && column.precision == null) {\n column.precision = type.resolvePrecision(column);\n }\n\n if (type.resolveScale && column.scale == null) {\n column.scale = type.resolveScale(column);\n }\n\n this.columns.push(column);\n\n this.columnsByName[name] = column;\n }\n\n /**\n * @private\n */\n getOptionsSql() {\n const addOptions = [];\n\n if (this.bulkOptions.checkConstraints) {\n addOptions.push('CHECK_CONSTRAINTS');\n }\n\n if (this.bulkOptions.fireTriggers) {\n addOptions.push('FIRE_TRIGGERS');\n }\n\n if (this.bulkOptions.keepNulls) {\n addOptions.push('KEEP_NULLS');\n }\n\n if (this.bulkOptions.lockTable) {\n addOptions.push('TABLOCK');\n }\n\n if (this.bulkOptions.order) {\n const orderColumns = [];\n\n for (const [column, direction] of Object.entries(this.bulkOptions.order)) {\n orderColumns.push(`${column} ${direction}`);\n }\n\n if (orderColumns.length) {\n addOptions.push(`ORDER (${orderColumns.join(', ')})`);\n }\n }\n\n if (addOptions.length > 0) {\n return ` WITH (${addOptions.join(',')})`;\n } else {\n return '';\n }\n }\n\n /**\n * @private\n */\n getBulkInsertSql() {\n let sql = 'insert bulk ' + this.table + '(';\n for (let i = 0, len = this.columns.length; i < len; i++) {\n const c = this.columns[i];\n if (i !== 0) {\n sql += ', ';\n }\n sql += '[' + c.name + '] ' + (c.type.declaration(c));\n }\n sql += ')';\n\n sql += this.getOptionsSql();\n return sql;\n }\n\n /**\n * This is simply a helper utility function which returns a `CREATE TABLE SQL` statement based on the columns added to the bulkLoad object.\n * This may be particularly handy when you want to insert into a temporary table (a table which starts with `#`).\n *\n * ```js\n * var sql = bulkLoad.getTableCreationSql();\n * ```\n *\n * A side note on bulk inserting into temporary tables: if you want to access a local temporary table after executing the bulk load,\n * you'll need to use the same connection and execute your requests using [[Connection.execSqlBatch]] instead of [[Connection.execSql]]\n */\n getTableCreationSql() {\n let sql = 'CREATE TABLE ' + this.table + '(\\n';\n for (let i = 0, len = this.columns.length; i < len; i++) {\n const c = this.columns[i];\n if (i !== 0) {\n sql += ',\\n';\n }\n sql += '[' + c.name + '] ' + (c.type.declaration(c));\n if (c.nullable !== undefined) {\n sql += ' ' + (c.nullable ? 'NULL' : 'NOT NULL');\n }\n }\n sql += '\\n)';\n return sql;\n }\n\n /**\n * @private\n */\n getColMetaData() {\n const tBuf = new WritableTrackingBuffer(100, null, true);\n // TokenType\n tBuf.writeUInt8(TOKEN_TYPE.COLMETADATA);\n // Count\n tBuf.writeUInt16LE(this.columns.length);\n\n for (let j = 0, len = this.columns.length; j < len; j++) {\n const c = this.columns[j];\n // UserType\n if (this.options.tdsVersion < '7_2') {\n tBuf.writeUInt16LE(0);\n } else {\n tBuf.writeUInt32LE(0);\n }\n\n // Flags\n let flags = FLAGS.updateableReadWrite;\n if (c.nullable) {\n flags |= FLAGS.nullable;\n } else if (c.nullable === undefined && this.options.tdsVersion >= '7_2') {\n flags |= FLAGS.nullableUnknown;\n }\n tBuf.writeUInt16LE(flags);\n\n // TYPE_INFO\n tBuf.writeBuffer(c.type.generateTypeInfo(c, this.options));\n\n // TableName\n if (c.type.hasTableName) {\n tBuf.writeUsVarchar(this.table, 'ucs2');\n }\n\n // ColName\n tBuf.writeBVarchar(c.name, 'ucs2');\n }\n return tBuf.data;\n }\n\n /**\n * Sets a timeout for this bulk load.\n *\n * ```js\n * bulkLoad.setTimeout(timeout);\n * ```\n *\n * @param timeout The number of milliseconds before the bulk load is considered failed, or 0 for no timeout.\n * When no timeout is set for the bulk load, the [[ConnectionOptions.requestTimeout]] of the Connection is used.\n */\n setTimeout(timeout?: number) {\n this.timeout = timeout;\n }\n\n /**\n * @private\n */\n createDoneToken() {\n // It might be nice to make DoneToken a class if anything needs to create them, but for now, just do it here\n const tBuf = new WritableTrackingBuffer(this.options.tdsVersion < '7_2' ? 9 : 13);\n tBuf.writeUInt8(TOKEN_TYPE.DONE);\n const status = DONE_STATUS.FINAL;\n tBuf.writeUInt16LE(status);\n tBuf.writeUInt16LE(0); // CurCmd (TDS ignores this)\n tBuf.writeUInt32LE(0); // row count - doesn't really matter\n if (this.options.tdsVersion >= '7_2') {\n tBuf.writeUInt32LE(0); // row count is 64 bits in >= TDS 7.2\n }\n return tBuf.data;\n }\n\n /**\n * @private\n */\n cancel() {\n if (this.canceled) {\n return;\n }\n\n this.canceled = true;\n this.emit('cancel');\n }\n}\n\nexport default BulkLoad;\nmodule.exports = BulkLoad;\n"],"mappings":"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"}
1
+ {"version":3,"file":"bulk-load.js","names":["_events","require","_writableTrackingBuffer","_interopRequireDefault","_stream","_token","obj","__esModule","default","FLAGS","nullable","caseSen","updateableReadWrite","updateableUnknown","identity","computed","fixedLenCLRType","sparseColumnSet","hidden","key","nullableUnknown","DONE_STATUS","FINAL","MORE","ERROR","INXACT","COUNT","ATTN","SRVERROR","rowTokenBuffer","Buffer","from","TOKEN_TYPE","ROW","textPointerAndTimestampBuffer","textPointerNullBuffer","RowTransform","Transform","columnMetadataWritten","bulkLoad","mainOptions","columns","constructor","writableObjectMode","options","_transform","row","_encoding","callback","push","getColMetaData","i","length","c","value","Array","isArray","objName","firstRowWritten","type","validate","collation","error","parameter","scale","precision","name","generateParameterLength","chunk","generateParameterData","process","nextTick","_flush","createDoneToken","BulkLoad","EventEmitter","canceled","executionStarted","streamingMode","table","timeout","columnsByName","rowToPacketTransform","bulkOptions","connection","rows","rst","rowCount","connectionOptions","checkConstraints","fireTriggers","keepNulls","lockTable","order","TypeError","column","direction","Object","entries","undefined","addColumn","output","Error","id","resolveLength","resolvePrecision","resolveScale","getOptionsSql","addOptions","orderColumns","join","getBulkInsertSql","sql","len","declaration","getTableCreationSql","tBuf","WritableTrackingBuffer","writeUInt8","COLMETADATA","writeUInt16LE","j","tdsVersion","writeUInt32LE","flags","writeBuffer","generateTypeInfo","hasTableName","writeUsVarchar","writeBVarchar","data","setTimeout","DONE","status","cancel","emit","_default","exports","module"],"sources":["../src/bulk-load.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\nimport Connection, { type InternalConnectionOptions } from './connection';\n\nimport { Transform } from 'stream';\nimport { TYPE as TOKEN_TYPE } from './token/token';\n\nimport { type DataType, type Parameter } from './data-type';\nimport { Collation } from './collation';\n\n/**\n * @private\n */\nconst FLAGS = {\n nullable: 1 << 0,\n caseSen: 1 << 1,\n updateableReadWrite: 1 << 2,\n updateableUnknown: 1 << 3,\n identity: 1 << 4,\n computed: 1 << 5, // introduced in TDS 7.2\n fixedLenCLRType: 1 << 8, // introduced in TDS 7.2\n sparseColumnSet: 1 << 10, // introduced in TDS 7.3.B\n hidden: 1 << 13, // introduced in TDS 7.2\n key: 1 << 14, // introduced in TDS 7.2\n nullableUnknown: 1 << 15 // introduced in TDS 7.2\n};\n\n/**\n * @private\n */\nconst DONE_STATUS = {\n FINAL: 0x00,\n MORE: 0x1,\n ERROR: 0x2,\n INXACT: 0x4,\n COUNT: 0x10,\n ATTN: 0x20,\n SRVERROR: 0x100\n};\n\n/**\n * @private\n */\ninterface InternalOptions {\n checkConstraints: boolean;\n fireTriggers: boolean;\n keepNulls: boolean;\n lockTable: boolean;\n order: { [columnName: string]: 'ASC' | 'DESC' };\n}\n\nexport interface Options {\n /**\n * Honors constraints during bulk load, using T-SQL\n * [CHECK_CONSTRAINTS](https://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx).\n * (default: `false`)\n */\n checkConstraints?: InternalOptions['checkConstraints'] | undefined;\n\n /**\n * Honors insert triggers during bulk load, using the T-SQL [FIRE_TRIGGERS](https://technet.microsoft.com/en-us/library/ms187640(v=sql.105).aspx). (default: `false`)\n */\n fireTriggers?: InternalOptions['fireTriggers'] | undefined;\n\n /**\n * Honors null value passed, ignores the default values set on table, using T-SQL [KEEP_NULLS](https://msdn.microsoft.com/en-us/library/ms187887(v=sql.120).aspx). (default: `false`)\n */\n keepNulls?: InternalOptions['keepNulls'] | undefined;\n\n /**\n * Places a bulk update(BU) lock on table while performing bulk load, using T-SQL [TABLOCK](https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx). (default: `false`)\n */\n lockTable?: InternalOptions['lockTable'] | undefined;\n\n /**\n * Specifies the ordering of the data to possibly increase bulk insert performance, using T-SQL [ORDER](https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms177468(v=sql.105)). (default: `{}`)\n */\n order?: InternalOptions['order'] | undefined;\n}\n\n\nexport type Callback =\n /**\n * A function which will be called after the [[BulkLoad]] finishes executing.\n *\n * @param rowCount the number of rows inserted\n */\n (err: Error | undefined | null, rowCount?: number) => void;\n\ninterface Column extends Parameter {\n objName: string;\n collation: Collation | undefined;\n}\n\ninterface ColumnOptions {\n output?: boolean;\n\n /**\n * For VarChar, NVarChar, VarBinary. Use length as `Infinity` for VarChar(max), NVarChar(max) and VarBinary(max).\n */\n length?: number;\n\n /**\n * For Numeric, Decimal.\n */\n precision?: number;\n\n /**\n * For Numeric, Decimal, Time, DateTime2, DateTimeOffset.\n */\n scale?: number;\n\n /**\n * If the name of the column is different from the name of the property found on `rowObj` arguments passed to [[addRow]], then you can use this option to specify the property name.\n */\n objName?: string;\n\n /**\n * Indicates whether the column accepts NULL values.\n */\n nullable?: boolean;\n}\n\nconst rowTokenBuffer = Buffer.from([ TOKEN_TYPE.ROW ]);\nconst textPointerAndTimestampBuffer = Buffer.from([\n // TextPointer length\n 0x10,\n\n // TextPointer\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n // Timestamp\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n]);\nconst textPointerNullBuffer = Buffer.from([0x00]);\n\n// A transform that converts rows to packets.\nclass RowTransform extends Transform {\n /**\n * @private\n */\n columnMetadataWritten: boolean;\n /**\n * @private\n */\n bulkLoad: BulkLoad;\n /**\n * @private\n */\n mainOptions: BulkLoad['options'];\n /**\n * @private\n */\n columns: BulkLoad['columns'];\n\n /**\n * @private\n */\n constructor(bulkLoad: BulkLoad) {\n super({ writableObjectMode: true });\n\n this.bulkLoad = bulkLoad;\n this.mainOptions = bulkLoad.options;\n this.columns = bulkLoad.columns;\n\n this.columnMetadataWritten = false;\n }\n\n /**\n * @private\n */\n _transform(row: Array<unknown> | { [colName: string]: unknown }, _encoding: string, callback: (error?: Error) => void) {\n if (!this.columnMetadataWritten) {\n this.push(this.bulkLoad.getColMetaData());\n this.columnMetadataWritten = true;\n }\n\n this.push(rowTokenBuffer);\n\n for (let i = 0; i < this.columns.length; i++) {\n const c = this.columns[i];\n let value = Array.isArray(row) ? row[i] : row[c.objName];\n\n if (!this.bulkLoad.firstRowWritten) {\n try {\n value = c.type.validate(value, c.collation);\n } catch (error: any) {\n return callback(error);\n }\n }\n\n const parameter = {\n length: c.length,\n scale: c.scale,\n precision: c.precision,\n value: value\n };\n\n if (c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText') {\n if (value == null) {\n this.push(textPointerNullBuffer);\n continue;\n }\n\n this.push(textPointerAndTimestampBuffer);\n }\n\n this.push(c.type.generateParameterLength(parameter, this.mainOptions));\n for (const chunk of c.type.generateParameterData(parameter, this.mainOptions)) {\n this.push(chunk);\n }\n }\n\n process.nextTick(callback);\n }\n\n /**\n * @private\n */\n _flush(callback: () => void) {\n this.push(this.bulkLoad.createDoneToken());\n\n process.nextTick(callback);\n }\n}\n\n/**\n * A BulkLoad instance is used to perform a bulk insert.\n *\n * Use [[Connection.newBulkLoad]] to create a new instance, and [[Connection.execBulkLoad]] to execute it.\n *\n * Example of BulkLoad Usages:\n *\n * ```js\n * // optional BulkLoad options\n * const options = { keepNulls: true };\n *\n * // instantiate - provide the table where you'll be inserting to, options and a callback\n * const bulkLoad = connection.newBulkLoad('MyTable', options, (error, rowCount) => {\n * console.log('inserted %d rows', rowCount);\n * });\n *\n * // setup your columns - always indicate whether the column is nullable\n * bulkLoad.addColumn('myInt', TYPES.Int, { nullable: false });\n * bulkLoad.addColumn('myString', TYPES.NVarChar, { length: 50, nullable: true });\n *\n * // execute\n * connection.execBulkLoad(bulkLoad, [\n * { myInt: 7, myString: 'hello' },\n * { myInt: 23, myString: 'world' }\n * ]);\n * ```\n */\nclass BulkLoad extends EventEmitter {\n /**\n * @private\n */\n error: Error | undefined;\n /**\n * @private\n */\n canceled: boolean;\n /**\n * @private\n */\n executionStarted: boolean;\n /**\n * @private\n */\n streamingMode: boolean;\n /**\n * @private\n */\n table: string;\n /**\n * @private\n */\n timeout: number | undefined;\n\n /**\n * @private\n */\n options: InternalConnectionOptions;\n /**\n * @private\n */\n callback: Callback;\n\n /**\n * @private\n */\n columns: Array<Column>;\n /**\n * @private\n */\n columnsByName: { [name: string]: Column };\n\n /**\n * @private\n */\n firstRowWritten: boolean;\n /**\n * @private\n */\n rowToPacketTransform: RowTransform;\n\n /**\n * @private\n */\n bulkOptions: InternalOptions;\n\n /**\n * @private\n */\n connection: Connection | undefined;\n /**\n * @private\n */\n rows: Array<any> | undefined;\n /**\n * @private\n */\n rst: Array<any> | undefined;\n /**\n * @private\n */\n rowCount: number | undefined;\n\n collation: Collation | undefined;\n\n /**\n * @private\n */\n constructor(table: string, collation: Collation | undefined, connectionOptions: InternalConnectionOptions, {\n checkConstraints = false,\n fireTriggers = false,\n keepNulls = false,\n lockTable = false,\n order = {},\n }: Options, callback: Callback) {\n if (typeof checkConstraints !== 'boolean') {\n throw new TypeError('The \"options.checkConstraints\" property must be of type boolean.');\n }\n\n if (typeof fireTriggers !== 'boolean') {\n throw new TypeError('The \"options.fireTriggers\" property must be of type boolean.');\n }\n\n if (typeof keepNulls !== 'boolean') {\n throw new TypeError('The \"options.keepNulls\" property must be of type boolean.');\n }\n\n if (typeof lockTable !== 'boolean') {\n throw new TypeError('The \"options.lockTable\" property must be of type boolean.');\n }\n\n if (typeof order !== 'object' || order === null) {\n throw new TypeError('The \"options.order\" property must be of type object.');\n }\n\n for (const [column, direction] of Object.entries(order)) {\n if (direction !== 'ASC' && direction !== 'DESC') {\n throw new TypeError('The value of the \"' + column + '\" key in the \"options.order\" object must be either \"ASC\" or \"DESC\".');\n }\n }\n\n super();\n\n this.error = undefined;\n this.canceled = false;\n this.executionStarted = false;\n\n this.collation = collation;\n\n this.table = table;\n this.options = connectionOptions;\n this.callback = callback;\n this.columns = [];\n this.columnsByName = {};\n this.firstRowWritten = false;\n this.streamingMode = false;\n\n this.rowToPacketTransform = new RowTransform(this); // eslint-disable-line no-use-before-define\n\n this.bulkOptions = { checkConstraints, fireTriggers, keepNulls, lockTable, order };\n }\n\n /**\n * Adds a column to the bulk load.\n *\n * The column definitions should match the table you are trying to insert into.\n * Attempting to call addColumn after the first row has been added will throw an exception.\n *\n * ```js\n * bulkLoad.addColumn('MyIntColumn', TYPES.Int, { nullable: false });\n * ```\n *\n * @param name The name of the column.\n * @param type One of the supported `data types`.\n * @param __namedParameters Additional column type information. At a minimum, `nullable` must be set to true or false.\n * @param length For VarChar, NVarChar, VarBinary. Use length as `Infinity` for VarChar(max), NVarChar(max) and VarBinary(max).\n * @param nullable Indicates whether the column accepts NULL values.\n * @param objName If the name of the column is different from the name of the property found on `rowObj` arguments passed to [[addRow]] or [[Connection.execBulkLoad]], then you can use this option to specify the property name.\n * @param precision For Numeric, Decimal.\n * @param scale For Numeric, Decimal, Time, DateTime2, DateTimeOffset.\n */\n addColumn(name: string, type: DataType, { output = false, length, precision, scale, objName = name, nullable = true }: ColumnOptions) {\n if (this.firstRowWritten) {\n throw new Error('Columns cannot be added to bulk insert after the first row has been written.');\n }\n if (this.executionStarted) {\n throw new Error('Columns cannot be added to bulk insert after execution has started.');\n }\n\n const column: Column = {\n type: type,\n name: name,\n value: null,\n output: output,\n length: length,\n precision: precision,\n scale: scale,\n objName: objName,\n nullable: nullable,\n collation: this.collation\n };\n\n if ((type.id & 0x30) === 0x20) {\n if (column.length == null && type.resolveLength) {\n column.length = type.resolveLength(column);\n }\n }\n\n if (type.resolvePrecision && column.precision == null) {\n column.precision = type.resolvePrecision(column);\n }\n\n if (type.resolveScale && column.scale == null) {\n column.scale = type.resolveScale(column);\n }\n\n this.columns.push(column);\n\n this.columnsByName[name] = column;\n }\n\n /**\n * @private\n */\n getOptionsSql() {\n const addOptions = [];\n\n if (this.bulkOptions.checkConstraints) {\n addOptions.push('CHECK_CONSTRAINTS');\n }\n\n if (this.bulkOptions.fireTriggers) {\n addOptions.push('FIRE_TRIGGERS');\n }\n\n if (this.bulkOptions.keepNulls) {\n addOptions.push('KEEP_NULLS');\n }\n\n if (this.bulkOptions.lockTable) {\n addOptions.push('TABLOCK');\n }\n\n if (this.bulkOptions.order) {\n const orderColumns = [];\n\n for (const [column, direction] of Object.entries(this.bulkOptions.order)) {\n orderColumns.push(`${column} ${direction}`);\n }\n\n if (orderColumns.length) {\n addOptions.push(`ORDER (${orderColumns.join(', ')})`);\n }\n }\n\n if (addOptions.length > 0) {\n return ` WITH (${addOptions.join(',')})`;\n } else {\n return '';\n }\n }\n\n /**\n * @private\n */\n getBulkInsertSql() {\n let sql = 'insert bulk ' + this.table + '(';\n for (let i = 0, len = this.columns.length; i < len; i++) {\n const c = this.columns[i];\n if (i !== 0) {\n sql += ', ';\n }\n sql += '[' + c.name + '] ' + (c.type.declaration(c));\n }\n sql += ')';\n\n sql += this.getOptionsSql();\n return sql;\n }\n\n /**\n * This is simply a helper utility function which returns a `CREATE TABLE SQL` statement based on the columns added to the bulkLoad object.\n * This may be particularly handy when you want to insert into a temporary table (a table which starts with `#`).\n *\n * ```js\n * var sql = bulkLoad.getTableCreationSql();\n * ```\n *\n * A side note on bulk inserting into temporary tables: if you want to access a local temporary table after executing the bulk load,\n * you'll need to use the same connection and execute your requests using [[Connection.execSqlBatch]] instead of [[Connection.execSql]]\n */\n getTableCreationSql() {\n let sql = 'CREATE TABLE ' + this.table + '(\\n';\n for (let i = 0, len = this.columns.length; i < len; i++) {\n const c = this.columns[i];\n if (i !== 0) {\n sql += ',\\n';\n }\n sql += '[' + c.name + '] ' + (c.type.declaration(c));\n if (c.nullable !== undefined) {\n sql += ' ' + (c.nullable ? 'NULL' : 'NOT NULL');\n }\n }\n sql += '\\n)';\n return sql;\n }\n\n /**\n * @private\n */\n getColMetaData() {\n const tBuf = new WritableTrackingBuffer(100, null, true);\n // TokenType\n tBuf.writeUInt8(TOKEN_TYPE.COLMETADATA);\n // Count\n tBuf.writeUInt16LE(this.columns.length);\n\n for (let j = 0, len = this.columns.length; j < len; j++) {\n const c = this.columns[j];\n // UserType\n if (this.options.tdsVersion < '7_2') {\n tBuf.writeUInt16LE(0);\n } else {\n tBuf.writeUInt32LE(0);\n }\n\n // Flags\n let flags = FLAGS.updateableReadWrite;\n if (c.nullable) {\n flags |= FLAGS.nullable;\n } else if (c.nullable === undefined && this.options.tdsVersion >= '7_2') {\n flags |= FLAGS.nullableUnknown;\n }\n tBuf.writeUInt16LE(flags);\n\n // TYPE_INFO\n tBuf.writeBuffer(c.type.generateTypeInfo(c, this.options));\n\n // TableName\n if (c.type.hasTableName) {\n tBuf.writeUsVarchar(this.table, 'ucs2');\n }\n\n // ColName\n tBuf.writeBVarchar(c.name, 'ucs2');\n }\n return tBuf.data;\n }\n\n /**\n * Sets a timeout for this bulk load.\n *\n * ```js\n * bulkLoad.setTimeout(timeout);\n * ```\n *\n * @param timeout The number of milliseconds before the bulk load is considered failed, or 0 for no timeout.\n * When no timeout is set for the bulk load, the [[ConnectionOptions.requestTimeout]] of the Connection is used.\n */\n setTimeout(timeout?: number) {\n this.timeout = timeout;\n }\n\n /**\n * @private\n */\n createDoneToken() {\n // It might be nice to make DoneToken a class if anything needs to create them, but for now, just do it here\n const tBuf = new WritableTrackingBuffer(this.options.tdsVersion < '7_2' ? 9 : 13);\n tBuf.writeUInt8(TOKEN_TYPE.DONE);\n const status = DONE_STATUS.FINAL;\n tBuf.writeUInt16LE(status);\n tBuf.writeUInt16LE(0); // CurCmd (TDS ignores this)\n tBuf.writeUInt32LE(0); // row count - doesn't really matter\n if (this.options.tdsVersion >= '7_2') {\n tBuf.writeUInt32LE(0); // row count is 64 bits in >= TDS 7.2\n }\n return tBuf.data;\n }\n\n /**\n * @private\n */\n cancel() {\n if (this.canceled) {\n return;\n }\n\n this.canceled = true;\n this.emit('cancel');\n }\n}\n\nexport default BulkLoad;\nmodule.exports = BulkLoad;\n"],"mappings":"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"}