From a3bd6e028ac5d9ffc2a0004fbfa118e70ca2b180 Mon Sep 17 00:00:00 2001 From: yosaphatprs Date: Thu, 6 Nov 2025 14:10:04 +0700 Subject: [PATCH] (feat) CRU Log Rekam Medis + Obat --- backend/api/src/app.module.ts | 3 +- backend/api/src/common/crypto/hash.ts | 5 + .../fabric-gateway/{index.js => index.ts} | 201 +- backend/api/src/main.ts | 2 + .../auth/decorator/current-user.decorator.ts | 16 + .../api/src/modules/fabric/fabric.module.ts | 8 + .../src/modules/fabric/fabric.service.spec.ts | 18 + .../api/src/modules/fabric/fabric.service.ts | 39 + .../{create-log.dto.ts => store-log.dto.ts} | 35 +- backend/api/src/modules/log/log.controller.ts | 27 +- backend/api/src/modules/log/log.module.ts | 5 +- backend/api/src/modules/log/log.service.ts | 18 +- .../src/modules/obat/dto/create-obat-dto.ts | 22 + .../src/modules/obat/dto/update-obat-dto.ts | 8 + .../api/src/modules/obat/obat.controller.ts | 46 +- backend/api/src/modules/obat/obat.module.ts | 3 +- backend/api/src/modules/obat/obat.service.ts | 144 +- .../rekammedis/dto/payload-rekammedis.dto.ts | 18 + .../rekammedis/rekammedis.controller.ts | 38 +- .../modules/rekammedis/rekammedis.module.ts | 3 +- .../modules/rekammedis/rekammedis.service.ts | 154 +- .../tindakandokter.controller.ts | 7 + .../tindakandokter/tindakandokter.service.ts | 51 +- .../api/src/modules/user/user.controller.ts | 8 +- backend/api/src/modules/user/user.service.ts | 33 +- backend/blockchain/.gitignore | 3 + .../chaincode/logVerification/.eslintignore | 5 + .../chaincode/logVerification/.eslintrc.js | 39 + .../chaincode/logVerification/.gitignore | 15 + .../chaincode/logVerification/index.js | 6 + .../logVerification/lib/logVerification.js | 155 + .../logVerification/npm-shrinkwrap.json | 3948 +++++++++++++++++ .../chaincode/logVerification/package.json | 50 + .../test/logVerification.test.js | 0 backend/blockchain/generate-artifacts.sh | 25 + .../network/channel-artifacts/config_block.pb | Bin 0 -> 14403 bytes .../network/channel-artifacts/genesis.block | Bin 0 -> 17072 bytes .../network/channel-artifacts/mychannel.block | Bin 0 -> 14402 bytes .../network/channel-artifacts/mychannel.tx | Bin 0 -> 429 bytes .../network/config/collections_config.json | 11 + .../blockchain/network/config/configtx.yaml | 179 + backend/blockchain/network/config/core.yaml | 791 ++++ .../network/config/crypto-config.yaml | 81 + backend/blockchain/network/deployChaincode.sh | 115 + backend/blockchain/network/docker/.env | 5 + .../network/docker/docker-compose.yaml | 150 + backend/blockchain/network/network.sh | 39 + .../hospital.com/ca/ca.hospital.com-cert.pem | 15 + .../hospital.com/ca/priv_sk | 5 + .../admincerts/Admin@hospital.com-cert.pem | 14 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../admincerts/Admin@hospital.com-cert.pem | 14 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../orderer.hospital.com/msp/keystore/priv_sk | 5 + .../signcerts/orderer.hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../orderers/orderer.hospital.com/tls/ca.crt | 15 + .../orderer.hospital.com/tls/server.crt | 16 + .../orderer.hospital.com/tls/server.key | 5 + .../hospital.com/tlsca/priv_sk | 5 + .../tlsca/tlsca.hospital.com-cert.pem | 15 + .../admincerts/Admin@hospital.com-cert.pem | 14 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../Admin@hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/Admin@hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../users/Admin@hospital.com/tls/ca.crt | 15 + .../users/Admin@hospital.com/tls/client.crt | 14 + .../users/Admin@hospital.com/tls/client.key | 5 + .../hospital.com/ca/ca.hospital.com-cert.pem | 15 + .../peerOrganizations/hospital.com/ca/priv_sk | 5 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../hospital.com/msp/config.yaml | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../peers/peer0.hospital.com/msp/config.yaml | 14 + .../peer0.hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/peer0.hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../peers/peer0.hospital.com/tls/ca.crt | 15 + .../peers/peer0.hospital.com/tls/server.crt | 17 + .../peers/peer0.hospital.com/tls/server.key | 5 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../peers/peer1.hospital.com/msp/config.yaml | 14 + .../peer1.hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/peer1.hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../peers/peer1.hospital.com/tls/ca.crt | 15 + .../peers/peer1.hospital.com/tls/server.crt | 17 + .../peers/peer1.hospital.com/tls/server.key | 5 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../peers/peer2.hospital.com/msp/config.yaml | 14 + .../peer2.hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/peer2.hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../peers/peer2.hospital.com/tls/ca.crt | 15 + .../peers/peer2.hospital.com/tls/server.crt | 17 + .../peers/peer2.hospital.com/tls/server.key | 5 + .../hospital.com/tlsca/priv_sk | 5 + .../tlsca/tlsca.hospital.com-cert.pem | 15 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../users/Admin@hospital.com/msp/config.yaml | 14 + .../Admin@hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/Admin@hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../users/Admin@hospital.com/tls/ca.crt | 15 + .../users/Admin@hospital.com/tls/client.crt | 14 + .../users/Admin@hospital.com/tls/client.key | 5 + .../msp/cacerts/ca.hospital.com-cert.pem | 15 + .../users/User1@hospital.com/msp/config.yaml | 14 + .../User1@hospital.com/msp/keystore/priv_sk | 5 + .../msp/signcerts/User1@hospital.com-cert.pem | 14 + .../tlscacerts/tlsca.hospital.com-cert.pem | 15 + .../users/User1@hospital.com/tls/ca.crt | 15 + .../users/User1@hospital.com/tls/client.crt | 14 + .../users/User1@hospital.com/tls/client.key | 5 + frontend/hospital-log/.gitignore | 1 + .../src/components/dashboard/ButtonDark.vue | 23 + .../src/components/dashboard/DataTable.vue | 59 +- .../src/components/dashboard/FieldInput.vue | 70 + .../src/components/dashboard/Sidebar.vue | 12 +- .../dashboard/filter/CheckboxGroup.vue | 66 - .../dashboard/filter/DateRangePicker.vue | 218 - .../dashboard/filter/RangeSlider.vue | 119 - .../dashboard/filter/SelectInput.vue | 44 - .../components/dashboard/filter/TextInput.vue | 36 - .../src/components/dashboard/filter/index.ts | 5 - .../hospital-log/src/constants/interfaces.ts | 48 + .../hospital-log/src/constants/pagination.ts | 142 +- frontend/hospital-log/src/routes/index.ts | 46 +- .../hospital-log/src/validation/rekamMedis.ts | 250 ++ .../src/views/dashboard/CreateObatView.vue | 324 ++ .../views/dashboard/CreateRekamMedisView.vue | 603 +++ .../dashboard/CreateTindakanDokterView.vue | 0 .../src/views/dashboard/ObatView.vue | 41 +- .../src/views/dashboard/ObatViewLegacy.vue | 467 -- .../dashboard/PemberianObatDetailView.vue | 133 + .../views/dashboard/PemberianObatEditView.vue | 255 ++ .../views/dashboard/RekamMedisDetailsView.vue | 209 + .../views/dashboard/RekamMedisEditView.vue | 730 +++ .../src/views/dashboard/RekamMedisView.vue | 60 +- .../dashboard/TindakanDokterDetailsView.vue | 5 + .../dashboard/TindakanDokterEditView.vue | 5 + .../src/views/dashboard/TindakanView.vue | 227 +- .../src/views/dashboard/UsersView.vue | 69 +- 146 files changed, 10336 insertions(+), 1318 deletions(-) create mode 100644 backend/api/src/common/crypto/hash.ts rename backend/api/src/common/fabric-gateway/{index.js => index.ts} (50%) create mode 100644 backend/api/src/modules/auth/decorator/current-user.decorator.ts create mode 100644 backend/api/src/modules/fabric/fabric.module.ts create mode 100644 backend/api/src/modules/fabric/fabric.service.spec.ts create mode 100644 backend/api/src/modules/fabric/fabric.service.ts rename backend/api/src/modules/log/dto/{create-log.dto.ts => store-log.dto.ts} (54%) create mode 100644 backend/api/src/modules/obat/dto/create-obat-dto.ts create mode 100644 backend/api/src/modules/obat/dto/update-obat-dto.ts create mode 100644 backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts create mode 100644 backend/blockchain/.gitignore create mode 100644 backend/blockchain/chaincode/logVerification/.eslintignore create mode 100644 backend/blockchain/chaincode/logVerification/.eslintrc.js create mode 100644 backend/blockchain/chaincode/logVerification/.gitignore create mode 100644 backend/blockchain/chaincode/logVerification/index.js create mode 100644 backend/blockchain/chaincode/logVerification/lib/logVerification.js create mode 100644 backend/blockchain/chaincode/logVerification/npm-shrinkwrap.json create mode 100644 backend/blockchain/chaincode/logVerification/package.json create mode 100644 backend/blockchain/chaincode/logVerification/test/logVerification.test.js create mode 100755 backend/blockchain/generate-artifacts.sh create mode 100644 backend/blockchain/network/channel-artifacts/config_block.pb create mode 100644 backend/blockchain/network/channel-artifacts/genesis.block create mode 100644 backend/blockchain/network/channel-artifacts/mychannel.block create mode 100644 backend/blockchain/network/channel-artifacts/mychannel.tx create mode 100644 backend/blockchain/network/config/collections_config.json create mode 100644 backend/blockchain/network/config/configtx.yaml create mode 100644 backend/blockchain/network/config/core.yaml create mode 100644 backend/blockchain/network/config/crypto-config.yaml create mode 100755 backend/blockchain/network/deployChaincode.sh create mode 100644 backend/blockchain/network/docker/.env create mode 100644 backend/blockchain/network/docker/docker-compose.yaml create mode 100755 backend/blockchain/network/network.sh create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/priv_sk create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/admincerts/Admin@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/admincerts/Admin@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/signcerts/orderer.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.key create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/priv_sk create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/admincerts/Admin@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt create mode 100644 backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/signcerts/peer0.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.key create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/signcerts/peer1.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.key create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/signcerts/peer2.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.key create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/cacerts/ca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/config.yaml create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/keystore/priv_sk create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/signcerts/User1@hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/ca.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.crt create mode 100644 backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.key create mode 100644 frontend/hospital-log/src/components/dashboard/ButtonDark.vue create mode 100644 frontend/hospital-log/src/components/dashboard/FieldInput.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/CheckboxGroup.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/DateRangePicker.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/RangeSlider.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/SelectInput.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/TextInput.vue delete mode 100644 frontend/hospital-log/src/components/dashboard/filter/index.ts create mode 100644 frontend/hospital-log/src/validation/rekamMedis.ts create mode 100644 frontend/hospital-log/src/views/dashboard/CreateObatView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/CreateRekamMedisView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/CreateTindakanDokterView.vue delete mode 100644 frontend/hospital-log/src/views/dashboard/ObatViewLegacy.vue create mode 100644 frontend/hospital-log/src/views/dashboard/PemberianObatDetailView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/PemberianObatEditView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/RekamMedisDetailsView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/RekamMedisEditView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/TindakanDokterDetailsView.vue create mode 100644 frontend/hospital-log/src/views/dashboard/TindakanDokterEditView.vue diff --git a/backend/api/src/app.module.ts b/backend/api/src/app.module.ts index 0cea9ea..b2a25b2 100644 --- a/backend/api/src/app.module.ts +++ b/backend/api/src/app.module.ts @@ -9,6 +9,7 @@ import { TindakanDokterModule } from './modules/tindakandokter/tindakandokter.mo import { ConfigModule } from '@nestjs/config'; import { PrismaModule } from './modules/prisma/prisma.module'; import { AuthModule } from './modules/auth/auth.module'; +import { FabricModule } from './modules/fabric/fabric.module'; @Module({ imports: [ @@ -22,7 +23,7 @@ import { AuthModule } from './modules/auth/auth.module'; RekamMedisModule, ObatModule, PrismaModule, - AuthModule, + FabricModule, ], controllers: [AppController], providers: [AppService], diff --git a/backend/api/src/common/crypto/hash.ts b/backend/api/src/common/crypto/hash.ts new file mode 100644 index 0000000..af8a8eb --- /dev/null +++ b/backend/api/src/common/crypto/hash.ts @@ -0,0 +1,5 @@ +import crypto from 'node:crypto'; + +export const sha256 = (input: string | Buffer): string => { + return crypto.createHash('sha256').update(input).digest('hex'); +}; diff --git a/backend/api/src/common/fabric-gateway/index.js b/backend/api/src/common/fabric-gateway/index.ts similarity index 50% rename from backend/api/src/common/fabric-gateway/index.js rename to backend/api/src/common/fabric-gateway/index.ts index 3452aa6..652da28 100644 --- a/backend/api/src/common/fabric-gateway/index.js +++ b/backend/api/src/common/fabric-gateway/index.ts @@ -1,24 +1,18 @@ import { connect, signers } from '@hyperledger/fabric-gateway'; -import grpc from '@grpc/grpc-js'; +import * as grpc from '@grpc/grpc-js'; import crypto from 'node:crypto'; import fs from 'node:fs/promises'; import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -// Network configuration const channelName = process.env.CHANNEL_NAME || 'mychannel'; const chaincodeName = process.env.CHAINCODE_NAME || 'logVerification'; const mspId = process.env.MSP_ID || 'HospitalMSP'; -// Path to crypto materials - adjusted for your hospital network structure const cryptoPath = process.env.CRYPTO_PATH || path.resolve( __dirname, - '../../', + '../../../../', 'blockchain', 'network', 'organizations', @@ -26,26 +20,27 @@ const cryptoPath = 'hospital.com', ); -// Path to user private key directory const keyDirectoryPath = process.env.KEY_DIRECTORY_PATH || path.resolve(cryptoPath, 'users', 'Admin@hospital.com', 'msp', 'keystore'); -// Path to user certificate directory const certDirectoryPath = process.env.CERT_DIRECTORY_PATH || path.resolve(cryptoPath, 'users', 'Admin@hospital.com', 'msp', 'signcerts'); -// Path to peer tls certificate const tlsCertPath = process.env.TLS_CERT_PATH || path.resolve(cryptoPath, 'peers', 'peer0.hospital.com', 'tls', 'ca.crt'); -// Gateway peer endpoint const peerEndpoint = process.env.PEER_ENDPOINT || 'localhost:7051'; const peerHostAlias = process.env.PEER_HOST_ALIAS || 'peer0.hospital.com'; class FabricGateway { + gateway: any; + network: any; + contract: any; + client: any; + constructor() { this.gateway = null; this.network = null; @@ -53,9 +48,6 @@ class FabricGateway { this.client = null; } - /** - * Create a new gRPC connection to the gateway server - */ async newGrpcConnection() { const tlsRootCert = await fs.readFile(tlsCertPath); const tlsCredentials = grpc.credentials.createSsl(tlsRootCert); @@ -63,20 +55,31 @@ class FabricGateway { 'grpc.ssl_target_name_override': peerHostAlias, 'grpc.keepalive_time_ms': 120000, 'grpc.keepalive_timeout_ms': 5000, - 'grpc.keepalive_permit_without_calls': true, + 'grpc.keepalive_permit_without_calls': 1, 'grpc.http2.max_pings_without_data': 0, 'grpc.http2.min_time_between_pings_ms': 10000, 'grpc.http2.min_ping_interval_without_data_ms': 300000, }); } - /** - * Create a new identity for the user - */ + async ensureConnected() { + if (!this.contract) { + console.log('Not connected, attempting to reconnect...'); + await this.connect(); + } + } + async newIdentity() { const certificateDirectoryPath = certDirectoryPath; const certificateFiles = await fs.readdir(certificateDirectoryPath); - const certificateFile = certificateFiles[0]; + const certificateFile = certificateFiles.find( + (file) => file.endsWith('-cert.pem') || file.endsWith('.pem'), + ); + if (!certificateFile) { + throw new Error( + `No certificate file found in ${certificateDirectoryPath}`, + ); + } const certificatePath = path.resolve( certificateDirectoryPath, certificateFile, @@ -85,9 +88,6 @@ class FabricGateway { return { mspId, credentials: certificate }; } - /** - * Create a new signer for the user's private key - */ async newSigner() { const keyDirectoryFiles = await fs.readdir(keyDirectoryPath); const keyFile = keyDirectoryFiles[0]; @@ -97,26 +97,19 @@ class FabricGateway { return signers.newPrivateKeySigner(privateKey); } - /** - * Initialize and connect to the Fabric network - */ async connect() { try { console.log('Connecting to Hyperledger Fabric network...'); - // Create gRPC connection this.client = await this.newGrpcConnection(); - // Create identity and signer const identity = await this.newIdentity(); const signer = await this.newSigner(); - // Connect to gateway this.gateway = connect({ client: this.client, identity, signer, - // Default timeouts for different gRPC calls evaluateOptions: () => { return { deadline: Date.now() + 5000 }; }, @@ -131,7 +124,6 @@ class FabricGateway { }, }); - // Get network and contract this.network = this.gateway.getNetwork(channelName); this.contract = this.network.getContract(chaincodeName); @@ -143,9 +135,6 @@ class FabricGateway { } } - /** - * Disconnect from the network - */ async disconnect() { if (this.gateway) { this.gateway.close(); @@ -156,62 +145,22 @@ class FabricGateway { console.log('Disconnected from Fabric network'); } - /** - * Log verification result to blockchain (evaluate only, no commit) - * @param {string} proofHash - Hash of the proof - * @param {string} idVisit - Visit ID - * @param {boolean} isValid - Whether the proof is valid - * @param {Date} timestamp - Timestamp of verification - */ - async logVerification(proofHash, idVisit, isValid, timestamp) { + async storeLog( + id: string, + event: string, + user_id: string, + payload: string, + ): Promise<{ transactionId: string; status: string }> { try { + await this.ensureConnected(); if (!this.contract) { throw new Error('Not connected to network. Call connect() first.'); } - console.log('Evaluating verification log on blockchain...'); - - const resultBytes = await this.contract.evaluateTransaction( - 'logExists', - idVisit, - ); - const exists = new TextDecoder().decode(resultBytes); - - console.log('Log existence check:', exists); - return { - exists: exists === 'true', - message: `Log for visit ${idVisit} ${ - exists === 'true' ? 'already exists' : 'does not exist' - }`, - }; - } catch (error) { - console.error('Failed to check log verification:', error); - throw error; - } - } - - /** - * Submit a transaction to log verification - * @param {string} proofHash - Hash of the proof - * @param {string} idVisit - Visit ID - * @param {boolean} isValid - Whether the proof is valid - * @param {Date} timestamp - Timestamp of verification - */ - async submitLogVerification(proofHash, idVisit, isValid, timestamp) { - try { - if (!this.contract) { - throw new Error('Not connected to network. Call connect() first.'); - } - - console.log('Submitting verification log transaction...'); - + console.log(`Submitting log storage transaction for log ID: ${id}...`); + const payloadString: string = payload; const transaction = this.contract.newProposal('storeLog', { - arguments: [ - idVisit, - JSON.stringify(proofHash), - isValid.toString(), - timestamp.toISOString(), - ], + arguments: [id, event, user_id, payloadString], }); const transactionId = await transaction.getTransactionId(); @@ -225,97 +174,38 @@ class FabricGateway { ); } - console.log('Transaction committed successfully:', transactionId); + console.log( + 'Log stored successfully with transaction ID:', + transactionId, + ); return { transactionId, status: commitStatus, }; } catch (error) { - console.error('Failed to submit verification transaction:', error); + console.error('Failed to store log:', error); throw error; } } - /** - * Query verification logs by visit ID - * @param {string} idVisit - Visit ID to query - */ - async queryVerificationsByVisitId(idVisit) { + async getLogById(id: string) { try { if (!this.contract) { throw new Error('Not connected to network. Call connect() first.'); } - console.log(`Querying verifications for visit ID: ${idVisit}`); + console.log(`Evaluating getLogById transaction for log ID: ${id}...`); const resultBytes = await this.contract.evaluateTransaction( - 'readLog', - idVisit, + 'getLogById', + id, ); - const resultString = new TextDecoder().decode(resultBytes); - const result = JSON.parse(resultString); + const resultJson = new TextDecoder().decode(resultBytes); + const result = JSON.parse(resultJson); - console.log('Query successful'); return result; } catch (error) { - console.error('Failed to query verifications:', error); - throw error; - } - } - - /** - * Query all verification logs - */ - async queryAllVerifications() { - try { - if (!this.contract) { - throw new Error('Not connected to network. Call connect() first.'); - } - - console.log('Querying all verifications...'); - - const resultBytes = await this.contract.evaluateTransaction('getAllLogs'); - const resultString = new TextDecoder().decode(resultBytes); - const result = JSON.parse(resultString); - - console.log('Query successful'); - return result; - } catch (error) { - console.error('Failed to query all verifications:', error); - throw error; - } - } - - /** - * Initialize the ledger (should be called only once) - */ - async initLedger() { - try { - if (!this.contract) { - throw new Error('Not connected to network. Call connect() first.'); - } - - console.log('Initializing ledger...'); - - const transaction = this.contract.newProposal('InitLedger'); - const transactionId = await transaction.getTransactionId(); - const endorseResult = await transaction.endorse(); - const submitResult = await endorseResult.submit(); - const commitStatus = await submitResult.getStatus(); - - if (!commitStatus.successful) { - throw new Error( - `Init ledger transaction ${transactionId} failed to commit with status: ${commitStatus.code}`, - ); - } - - console.log('Ledger initialized successfully:', transactionId); - return { - transactionId, - status: commitStatus, - }; - } catch (error) { - console.error('Failed to initialize ledger:', error); + console.error('Failed to get log by ID:', error); throw error; } } @@ -323,5 +213,4 @@ class FabricGateway { export default FabricGateway; -// Export a singleton instance for convenience export const fabricGateway = new FabricGateway(); diff --git a/backend/api/src/main.ts b/backend/api/src/main.ts index 8f0fc3a..d20201c 100644 --- a/backend/api/src/main.ts +++ b/backend/api/src/main.ts @@ -10,6 +10,7 @@ import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.enableShutdownHooks(); const configService = app.get(ConfigService); app.setGlobalPrefix('api/'); app.enableCors({ @@ -26,6 +27,7 @@ async function bootstrap() { }), ); app.use(cookieParser(configService.get('COOKIE_SECRET'))); + await app.listen(configService.get('PORT') ?? 1323); } bootstrap(); diff --git a/backend/api/src/modules/auth/decorator/current-user.decorator.ts b/backend/api/src/modules/auth/decorator/current-user.decorator.ts new file mode 100644 index 0000000..5d5a0a5 --- /dev/null +++ b/backend/api/src/modules/auth/decorator/current-user.decorator.ts @@ -0,0 +1,16 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { UserRole } from '../dto/auth.dto'; + +export interface ActiveUserPayload { + sub: number; + username: string; + role: UserRole; + csrf: string; +} + +export const CurrentUser = createParamDecorator( + (_data: unknown, ctx: ExecutionContext): ActiveUserPayload => { + const request = ctx.switchToHttp().getRequest(); + return request.user as ActiveUserPayload; + }, +); diff --git a/backend/api/src/modules/fabric/fabric.module.ts b/backend/api/src/modules/fabric/fabric.module.ts new file mode 100644 index 0000000..4f403fa --- /dev/null +++ b/backend/api/src/modules/fabric/fabric.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; +import { FabricService } from './fabric.service'; + +@Module({ + providers: [FabricService], + exports: [FabricService], +}) +export class FabricModule {} diff --git a/backend/api/src/modules/fabric/fabric.service.spec.ts b/backend/api/src/modules/fabric/fabric.service.spec.ts new file mode 100644 index 0000000..78dab59 --- /dev/null +++ b/backend/api/src/modules/fabric/fabric.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { FabricService } from './fabric.service'; + +describe('FabricService', () => { + let service: FabricService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [FabricService], + }).compile(); + + service = module.get(FabricService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/backend/api/src/modules/fabric/fabric.service.ts b/backend/api/src/modules/fabric/fabric.service.ts new file mode 100644 index 0000000..6ef10d8 --- /dev/null +++ b/backend/api/src/modules/fabric/fabric.service.ts @@ -0,0 +1,39 @@ +import FabricGateway from '@api/common/fabric-gateway'; +import { + Injectable, + Logger, + OnApplicationShutdown, + OnModuleInit, +} from '@nestjs/common'; + +@Injectable() +export class FabricService implements OnModuleInit, OnApplicationShutdown { + private readonly logger = new Logger(FabricService.name); + private readonly gateway = new FabricGateway(); + + async onModuleInit() { + this.logger.log('Attempting to connect to Fabric network...'); + try { + await this.gateway.connect(); + this.logger.log('Successfully connected to Fabric network.'); + } catch (error) { + this.logger.error('Failed to connect to Fabric network:', error); + throw new Error('Failed to connect to Fabric network'); + } + } + + async onApplicationShutdown(signal?: string) { + this.logger.log('Disconnecting from Fabric network...'); + await this.gateway.disconnect(); + } + + async storeLog(id: string, event: string, user_id: string, payload: string) { + this.logger.log(`Storing log with ID: ${id}`); + return this.gateway.storeLog(id, event, user_id, payload); + } + + async getLogById(id: string) { + this.logger.log(`Retrieving log with ID: ${id}`); + return this.gateway.getLogById(id); + } +} diff --git a/backend/api/src/modules/log/dto/create-log.dto.ts b/backend/api/src/modules/log/dto/store-log.dto.ts similarity index 54% rename from backend/api/src/modules/log/dto/create-log.dto.ts rename to backend/api/src/modules/log/dto/store-log.dto.ts index 93adb25..26bb787 100644 --- a/backend/api/src/modules/log/dto/create-log.dto.ts +++ b/backend/api/src/modules/log/dto/store-log.dto.ts @@ -1,6 +1,17 @@ -import { IsString, IsNotEmpty, Length, IsJSON, IsEnum } from 'class-validator'; +import { + IsString, + IsNotEmpty, + Length, + IsJSON, + IsEnum, + IsNumber, +} from 'class-validator'; + +export class StoreLogDto { + @IsNotEmpty({ message: 'ID wajib diisi' }) + @IsString({ message: 'ID harus berupa string' }) + id: string; -export class CreateLogDto { @IsNotEmpty({ message: 'Event wajib diisi' }) @IsString({ message: 'Event harus berupa string' }) @IsEnum( @@ -22,19 +33,11 @@ export class CreateLogDto { @Length(1, 100, { message: 'Event maksimal 100 karakter' }) event: string; + @IsNotEmpty({ message: 'User ID wajib diisi' }) + @IsNumber({}, { message: 'User ID harus berupa angka' }) + user_id: number; + @IsNotEmpty({ message: 'Payload wajib diisi' }) - @IsJSON({ message: 'Payload harus berupa JSON yang valid' }) - payload: { - dokter_id: number; - visit_id: string; - tindakan?: string; - kategori_tindakan?: string; - kelompok_tindakan?: string; - obat?: string; - jumlah_obat?: number; - aturan_pakai?: string; - anamnese?: string; - jenis_kasus?: string; - tindak_lanjut?: string; - }; + @IsString({ message: 'Payload harus berupa string' }) + payload: string; } diff --git a/backend/api/src/modules/log/log.controller.ts b/backend/api/src/modules/log/log.controller.ts index c5dabb7..87b3511 100644 --- a/backend/api/src/modules/log/log.controller.ts +++ b/backend/api/src/modules/log/log.controller.ts @@ -1,4 +1,27 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Get, Param, Post } from '@nestjs/common'; +import { StoreLogDto } from './dto/store-log.dto'; +import { LogService } from './log.service'; +import { FabricService } from '../fabric/fabric.service'; @Controller('log') -export class LogController {} +export class LogController { + constructor( + private readonly logService: LogService, + private readonly fabricService: FabricService, + ) {} + + // @Post() + // storeLog(@Body() dto: StoreLogDto) { + // return this.logService.storeLog(dto); + // } + + // @Get(':id') + // getLogById(@Param('id') id: string) { + // return this.logService.getLogById(id); + // } + + // @Get() + // getAllLogs() { + // return this.logService.getAllLogs(); + // } +} diff --git a/backend/api/src/modules/log/log.module.ts b/backend/api/src/modules/log/log.module.ts index d6c6b36..98ec14a 100644 --- a/backend/api/src/modules/log/log.module.ts +++ b/backend/api/src/modules/log/log.module.ts @@ -1,9 +1,12 @@ import { Module } from '@nestjs/common'; import { LogController } from './log.controller'; import { LogService } from './log.service'; +import { FabricModule } from '../fabric/fabric.module'; @Module({ + imports: [FabricModule], controllers: [LogController], - providers: [LogService] + providers: [LogService], + exports: [LogService], }) export class LogModule {} diff --git a/backend/api/src/modules/log/log.service.ts b/backend/api/src/modules/log/log.service.ts index 2b8cb75..fd68424 100644 --- a/backend/api/src/modules/log/log.service.ts +++ b/backend/api/src/modules/log/log.service.ts @@ -1,4 +1,20 @@ import { Injectable } from '@nestjs/common'; +import { StoreLogDto } from './dto/store-log.dto'; +import { FabricService } from '../fabric/fabric.service'; @Injectable() -export class LogService {} +export class LogService { + constructor(private readonly fabricService: FabricService) {} + + async storeLog(dto: StoreLogDto) { + const { id, event, user_id, payload } = dto; + return this.fabricService.storeLog(id, event, user_id.toString(), payload); + } + async getLogById(id: string) { + const result = await this.fabricService.getLogById(id); + return result; + } + async getAllLogs() { + // return this.fabricService.getAllLogs(); + } +} diff --git a/backend/api/src/modules/obat/dto/create-obat-dto.ts b/backend/api/src/modules/obat/dto/create-obat-dto.ts new file mode 100644 index 0000000..22c6be5 --- /dev/null +++ b/backend/api/src/modules/obat/dto/create-obat-dto.ts @@ -0,0 +1,22 @@ +import { IsString, IsNotEmpty, IsInt, Min, Length } from 'class-validator'; +import { Transform } from 'class-transformer'; + +export class CreateObatDto { + @IsNotEmpty({ message: 'ID Visit wajib diisi' }) + @IsString() + id_visit: string; + + @IsNotEmpty({ message: 'Obat wajib diisi' }) + @IsString() + @Length(1, 100, { message: 'Obat maksimal 100 karakter' }) + obat: string; + + @IsNotEmpty({ message: 'Jumlah obat wajib diisi' }) + @IsInt({ message: 'Jumlah obat harus berupa angka bulat' }) + @Min(1, { message: 'Jumlah obat minimal 1' }) + @Transform(({ value }) => (value ? parseInt(value) : null)) + jumlah_obat: number; + + @IsString() + aturan_pakai: string; +} diff --git a/backend/api/src/modules/obat/dto/update-obat-dto.ts b/backend/api/src/modules/obat/dto/update-obat-dto.ts new file mode 100644 index 0000000..3a18b03 --- /dev/null +++ b/backend/api/src/modules/obat/dto/update-obat-dto.ts @@ -0,0 +1,8 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateObatDto } from './create-obat-dto'; +import { IsOptional } from 'class-validator'; + +export class UpdateObatDto extends PartialType(CreateObatDto) { + @IsOptional() + id_visit?: string; +} diff --git a/backend/api/src/modules/obat/obat.controller.ts b/backend/api/src/modules/obat/obat.controller.ts index 0944710..521742a 100644 --- a/backend/api/src/modules/obat/obat.controller.ts +++ b/backend/api/src/modules/obat/obat.controller.ts @@ -1,6 +1,19 @@ -import { Controller, Get, Query, UseGuards } from '@nestjs/common'; +import { + Body, + Controller, + Get, + Param, + Post, + Put, + Query, + UseGuards, +} from '@nestjs/common'; import { ObatService } from './obat.service'; import { AuthGuard } from '../auth/guard/auth.guard'; +import { UpdateObatDto } from './dto/update-obat-dto'; +import { CurrentUser } from '../auth/decorator/current-user.decorator'; +import type { ActiveUserPayload } from '../auth/decorator/current-user.decorator'; +import { CreateObatDto } from './dto/create-obat-dto'; @Controller('obat') export class ObatController { @@ -25,4 +38,35 @@ export class ObatController { order, }); } + + @Get(':id') + @UseGuards(AuthGuard) + async getObatById(@Param('id') id: number) { + return await this.obatService.getObatById(id); + } + + @Post('/') + @UseGuards(AuthGuard) + async createObat( + @Body() dto: CreateObatDto, + @CurrentUser() user: ActiveUserPayload, + ) { + return await this.obatService.createObat(dto, user); + } + + @Put(':id') + @UseGuards(AuthGuard) + async updateObatById( + @Param('id') id: number, + @Body() dto: UpdateObatDto, + @CurrentUser() user: ActiveUserPayload, + ) { + return await this.obatService.updateObatById(id, dto, user); + } + + @Get('/:id/log') + @UseGuards(AuthGuard) + async getObatLogs(@Param('id') id: string) { + return await this.obatService.getLogObatById(id); + } } diff --git a/backend/api/src/modules/obat/obat.module.ts b/backend/api/src/modules/obat/obat.module.ts index 02f916d..85378a6 100644 --- a/backend/api/src/modules/obat/obat.module.ts +++ b/backend/api/src/modules/obat/obat.module.ts @@ -2,9 +2,10 @@ import { Module } from '@nestjs/common'; import { ObatController } from './obat.controller'; import { ObatService } from './obat.service'; import { PrismaModule } from '../prisma/prisma.module'; +import { LogModule } from '../log/log.module'; @Module({ - imports: [PrismaModule], + imports: [PrismaModule, LogModule], controllers: [ObatController], providers: [ObatService], }) diff --git a/backend/api/src/modules/obat/obat.service.ts b/backend/api/src/modules/obat/obat.service.ts index 5da3bd0..2a08f7b 100644 --- a/backend/api/src/modules/obat/obat.service.ts +++ b/backend/api/src/modules/obat/obat.service.ts @@ -1,9 +1,42 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; +import { UpdateObatDto } from './dto/update-obat-dto'; +import { LogService } from '../log/log.service'; +import { sha256 } from '@api/common/crypto/hash'; +import { ActiveUserPayload } from '../auth/decorator/current-user.decorator'; +import { CreateObatDto } from './dto/create-obat-dto'; @Injectable() export class ObatService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private logService: LogService, + ) {} + + createHashingPayload(currentData: any): string { + return sha256(JSON.stringify(currentData)); + } + + determineStatus(rawFabricLog: any, index: number, arrLength: number): any { + console.log('Inside determineStatus with index:', index); + console.log('Raw Fabric Log:', rawFabricLog); + const flatLog = { + ...rawFabricLog.value, + txId: rawFabricLog.txId, + timestamp: rawFabricLog.value.timestamp, + }; + + if ( + index === arrLength - 1 && + rawFabricLog.value.event === 'obat_created' + ) { + flatLog.status = 'ORIGINAL'; + } else { + flatLog.status = 'UPDATED'; + } + + return flatLog; + } async getAllObat(params: { take?: number; @@ -43,4 +76,111 @@ export class ObatService { totalCount: count, }; } + + async getObatById(id: number) { + return await this.prisma.pemberian_obat.findUnique({ + where: { + id: id, + }, + }); + } + + async getLogObatById(id: string) { + const idLog = `OBAT_${id}`; + const rawLogs = await this.logService.getLogById(idLog); + const currentData = await this.getObatById(parseInt(id, 10)); + + if (!currentData) { + throw new Error(`Obat with id ${id} not found`); + } + + const currentDataHash = this.createHashingPayload({ + obat: currentData.obat, + jumlah_obat: currentData.jumlah_obat, + aturan_pakai: currentData.aturan_pakai, + }); + + const latestPayload = rawLogs[0].value.payload; + const isTampered = currentDataHash !== latestPayload; + + const chronologicalLogs = [...rawLogs]; + + const processedLogs = chronologicalLogs.map((log, index) => { + return this.determineStatus(log, index, chronologicalLogs.length); + }); + + return { + logs: processedLogs, + isTampered: isTampered, + currentDataHash: currentDataHash, + }; + } + + async createObat(dto: CreateObatDto, user: ActiveUserPayload) { + const visitExists = await this.prisma.rekam_medis.findUnique({ + where: { id_visit: dto.id_visit }, + }); + + if (!visitExists) { + throw new BadRequestException(`Visit with id ${dto.id_visit} not found`); + } + + const res = await this.prisma.pemberian_obat.create({ + data: { + id_visit: dto.id_visit, + obat: dto.obat, + jumlah_obat: dto.jumlah_obat, + aturan_pakai: dto.aturan_pakai, + }, + }); + + console.log('Created Obat:', dto); + + const logPayload = JSON.stringify(dto); + const payloadHash = sha256(logPayload); + const data = { + id: `OBAT_${res.id}`, + event: 'obat_created', + user_id: user.sub, + payload: payloadHash, + }; + const logResult = await this.logService.storeLog(data); + return { + ...res, + ...logResult, + }; + } + + async updateObatById( + id: number, + dto: UpdateObatDto, + user: ActiveUserPayload, + ) { + const res = await this.prisma.pemberian_obat.update({ + where: { + id: id, + }, + data: { + obat: dto.obat, + jumlah_obat: dto.jumlah_obat, + aturan_pakai: dto.aturan_pakai, + }, + }); + + console.log('Updated Obat:', dto); + + const logPayload = JSON.stringify(dto); + const payloadHash = sha256(logPayload); + const data = { + id: `OBAT_${id}`, + event: 'obat_updated', + user_id: user.sub, + payload: payloadHash, + }; + const logResult = await this.logService.storeLog(data); + return { + ...res, + ...logResult, + }; + } } diff --git a/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts b/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts new file mode 100644 index 0000000..81e5d8d --- /dev/null +++ b/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts @@ -0,0 +1,18 @@ +import { IsEnum, IsNumber, IsString } from 'class-validator'; + +export class PayloadRekamMedisDto { + @IsNumber({}, { message: 'ID dokter harus berupa angka' }) + dokter_id: number; + + @IsString({ message: 'ID kunjungan harus berupa string' }) + visit_id: string; + + @IsEnum({}, { message: 'Anamnese harus berupa enum' }) + anamnese: string; + + @IsEnum({}, { message: 'Jenis kasus harus berupa enum' }) + jenis_kasus: string; + + @IsEnum({}, { message: 'Tindak lanjut harus berupa enum' }) + tindak_lanjut: string; +} diff --git a/backend/api/src/modules/rekammedis/rekammedis.controller.ts b/backend/api/src/modules/rekammedis/rekammedis.controller.ts index 6be0d57..f67edab 100644 --- a/backend/api/src/modules/rekammedis/rekammedis.controller.ts +++ b/backend/api/src/modules/rekammedis/rekammedis.controller.ts @@ -4,13 +4,17 @@ import { Get, Header, HttpCode, + Param, Post, + Put, Query, UseGuards, } from '@nestjs/common'; import { RekammedisService } from './rekammedis.service'; import { CreateRekamMedisDto } from './dto/create-rekammedis.dto'; import { AuthGuard } from '../auth/guard/auth.guard'; +import { CurrentUser } from '../auth/decorator/current-user.decorator'; +import type { ActiveUserPayload } from '../auth/decorator/current-user.decorator'; @Controller('/rekammedis') export class RekamMedisController { @@ -58,10 +62,40 @@ export class RekamMedisController { }); } + @Get('/:id_visit') + @Header('Content-Type', 'application/json') + @HttpCode(200) + @UseGuards(AuthGuard) + async getRekamMedisById(@Param('id_visit') id_visit: string) { + return this.rekammedisService.getRekamMedisById(id_visit); + } + @Post('/') @Header('Content-Type', 'application/json') @UseGuards(AuthGuard) - async createRekamMedis(@Body() dto: CreateRekamMedisDto) { - return this.rekammedisService.createRekamMedis(dto); + async createRekamMedis( + @Body() dto: CreateRekamMedisDto, + @CurrentUser() user: ActiveUserPayload, + ) { + return this.rekammedisService.createRekamMedis(dto, user); + } + + @Get('/:id_visit/log') + @Header('Content-Type', 'application/json') + @HttpCode(200) + @UseGuards(AuthGuard) + async getRekamMedisLogById(@Param('id_visit') id_visit: string) { + return this.rekammedisService.getRekamMedisLogById(id_visit); + } + + @Put('/:id_visit') + @Header('Content-Type', 'application/json') + @UseGuards(AuthGuard) + async updateRekamMedis( + @Param('id_visit') id_visit: string, + @Body() dto: CreateRekamMedisDto, + @CurrentUser() user: ActiveUserPayload, + ) { + return this.rekammedisService.updateRekamMedis(id_visit, dto, user); } } diff --git a/backend/api/src/modules/rekammedis/rekammedis.module.ts b/backend/api/src/modules/rekammedis/rekammedis.module.ts index fbac3a0..2f4c9ca 100644 --- a/backend/api/src/modules/rekammedis/rekammedis.module.ts +++ b/backend/api/src/modules/rekammedis/rekammedis.module.ts @@ -3,9 +3,10 @@ import { RekamMedisController } from './rekammedis.controller'; import { RekammedisService } from './rekammedis.service'; import { PrismaModule } from '../prisma/prisma.module'; import { JwtModule } from '@nestjs/jwt'; +import { LogModule } from '../log/log.module'; @Module({ - imports: [PrismaModule], + imports: [PrismaModule, LogModule], controllers: [RekamMedisController], providers: [RekammedisService], }) diff --git a/backend/api/src/modules/rekammedis/rekammedis.service.ts b/backend/api/src/modules/rekammedis/rekammedis.service.ts index b2abaf5..8567170 100644 --- a/backend/api/src/modules/rekammedis/rekammedis.service.ts +++ b/backend/api/src/modules/rekammedis/rekammedis.service.ts @@ -2,11 +2,14 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; import { Prisma, rekam_medis } from '@dist/generated/prisma'; import { CreateRekamMedisDto } from './dto/create-rekammedis.dto'; -import { CreateLogDto } from '../log/dto/create-log.dto'; +import { LogService } from '../log/log.service'; +import { sha256 } from '@api/common/crypto/hash'; +import { ActiveUserPayload } from '../auth/decorator/current-user.decorator'; +import { PayloadRekamMedisDto } from './dto/payload-rekammedis.dto'; +// import { CreateLogDto } from '../log/dto/create-log.dto'; @Injectable() export class RekammedisService { - // Define known values as constants to avoid hardcoding everywhere private readonly KNOWN_BLOOD_TYPES = ['A', 'B', 'AB', 'O']; private readonly KNOWN_TINDAK_LANJUT = [ 'Dipulangkan untuk Kontrol', @@ -26,7 +29,35 @@ export class RekammedisService { 'Selesai Pelayanan Rawat Jalan', ]; - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private log: LogService, + ) {} + + createHashingPayload(currentData: PayloadRekamMedisDto): string { + return sha256(JSON.stringify(currentData)); + } + + determineStatus(rawFabricLog: any, index: number, arrLength: number): any { + const flatLog = { + ...rawFabricLog.value, + txId: rawFabricLog.txId, + timestamp: rawFabricLog.value.timestamp, + }; + + console.log('Processed flat log:', flatLog); + + if ( + index === arrLength - 1 && + rawFabricLog.value.event === 'rekam_medis_created' + ) { + flatLog.status = 'ORIGINAL'; + } else { + flatLog.status = 'UPDATED'; + } + + return flatLog; + } async getAllRekamMedis(params: { take?: number; @@ -58,13 +89,18 @@ export class RekammedisService { tanggal_end, umur_min, umur_max, - jenis_kelamin, kode_diagnosa, } = params; const golDarahArray = params.gol_darah?.split(',') || []; const tindakLanjutArray = params.tindak_lanjut?.split(',') || []; - console.log('Params Received:', params); + const jkCharacter = + params.jenis_kelamin == 'perempuan' + ? 'P' + : params.jenis_kelamin == 'laki-laki' + ? 'L' + : ''; + const take = params.take ? parseInt(params.take.toString()) : 10; const skipValue = skip ? parseInt(skip.toString()) @@ -158,7 +194,7 @@ export class RekammedisService { lte: parseInt(umur_max, 10), } : undefined, - jenis_kelamin: jenis_kelamin ? { equals: jenis_kelamin } : undefined, + jenis_kelamin: jkCharacter ? { equals: jkCharacter } : undefined, kode_diagnosa: kode_diagnosa ? { contains: kode_diagnosa } : undefined, ...golDarahFilter, ...tindakLanjutFilter, @@ -169,7 +205,7 @@ export class RekammedisService { take: take, where: whereClause, orderBy: orderBy - ? { [orderBy]: order || 'asc' } + ? { [orderBy]: order || 'desc' } : { waktu_visit: order ? order : 'asc' }, }); @@ -209,7 +245,13 @@ export class RekammedisService { }; } - async createRekamMedis(data: CreateRekamMedisDto) { + async getRekamMedisById(id_visit: string) { + return this.prisma.rekam_medis.findUnique({ + where: { id_visit }, + }); + } + + async createRekamMedis(data: CreateRekamMedisDto, user: ActiveUserPayload) { const latestId = await this.prisma.rekam_medis.findFirst({ orderBy: { waktu_visit: 'desc' }, }); @@ -239,7 +281,7 @@ export class RekammedisService { waktu_visit: new Date(), }; - const logData: CreateLogDto = { + const logData = { event: 'rekam_medis_created', payload: { dokter_id: 123, @@ -256,17 +298,21 @@ export class RekammedisService { data: rekamMedis, }); - await tx.blockchain_log_queue.create({ - data: { - event: logData.event, - user_id: 9, - payload: logData.payload, - }, - }); + const logPayload = JSON.stringify(logData.payload); + const payloadHash = sha256(logPayload); + const data = { + id: `REKAM_${newId}`, + event: 'rekam_medis_created', + user_id: user.sub, + payload: payloadHash, + }; - // Input Into Fabric Here + const createdLog = await this.log.storeLog(data); - return createdRekamMedis; + return { + ...createdRekamMedis, + log: createdLog, + }; }); return newRekamMedis; @@ -275,4 +321,76 @@ export class RekammedisService { throw error; } } + + async getRekamMedisLogById(id_visit: string) { + const idLog = `REKAM_${id_visit}`; + const rawLogs = await this.log.getLogById(idLog); + const currentData = await this.getRekamMedisById(id_visit); + + if (!currentData) { + throw new Error(`Rekam Medis with id_visit ${id_visit} not found`); + } + + const currentDataHash = this.createHashingPayload({ + dokter_id: 123, + visit_id: currentData.id_visit, + anamnese: currentData.anamnese ?? '', + jenis_kasus: currentData.jenis_kasus ?? '', + tindak_lanjut: currentData.tindak_lanjut ?? '', + }); + + const latestPayload = rawLogs[0].value.payload; + const isTampered = currentDataHash !== latestPayload; + const chronologicalLogs = [...rawLogs]; + + const processedLogs = chronologicalLogs.map((log, index) => { + return this.determineStatus(log, index, chronologicalLogs.length); + }); + + return { + logs: processedLogs, + isTampered: isTampered, + currentDataHash: currentDataHash, + }; + } + + async updateRekamMedis( + id_visit: string, + data: CreateRekamMedisDto, + user: ActiveUserPayload, + ) { + const rekamMedis = await this.prisma.rekam_medis.update({ + where: { id_visit }, + data: { + ...data, + }, + }); + + const logData = { + event: 'rekam_medis_updated', + payload: { + dokter_id: 123, + visit_id: id_visit, + anamnese: data.anamnese, + jenis_kasus: data.jenis_kasus, + tindak_lanjut: data.tindak_lanjut, + }, + }; + + const logPayload = JSON.stringify(logData.payload); + const payloadHash = sha256(logPayload); + const logDto = { + id: `REKAM_${id_visit}`, + event: 'rekam_medis_updated', + user_id: user.sub, + payload: payloadHash, + }; + + const createdLog = await this.log.storeLog(logDto); + + return { + ...rekamMedis, + log: createdLog, + }; + } } diff --git a/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts b/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts index 6808ecc..8e555d7 100644 --- a/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts +++ b/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts @@ -18,15 +18,22 @@ export class TindakanDokterController { @UseGuards(AuthGuard) async getAllTindakanDokter( @Query('take') take: number, + @Query('id_visit') id_visit: string, @Query('tindakan') tindakan: string, + @Query('kelompok') kelompok_tindakan: string, + @Query('kategori') kategori_tindakan: string, @Query('skip') skip: number, @Query('page') page: number, @Query('orderBy') orderBy: string, @Query('order') order: 'asc' | 'desc', ) { + console.log(); return await this.tindakanDokterService.getAllTindakanDokter({ take, + id_visit, tindakan, + kelompok_tindakan, + kategori_tindakan, skip, page, orderBy: orderBy ? { [orderBy]: order || 'asc' } : undefined, diff --git a/backend/api/src/modules/tindakandokter/tindakandokter.service.ts b/backend/api/src/modules/tindakandokter/tindakandokter.service.ts index c2f1c1c..4a978a6 100644 --- a/backend/api/src/modules/tindakandokter/tindakandokter.service.ts +++ b/backend/api/src/modules/tindakandokter/tindakandokter.service.ts @@ -10,28 +10,75 @@ export class TindakanDokterService { skip?: number; take?: number; page?: number; + id_visit?: string; + kelompok_tindakan?: string; + kategori_tindakan?: string; tindakan?: string; orderBy?: Prisma.pemberian_tindakanOrderByWithRelationInput; order?: 'asc' | 'desc'; }) { - const { skip, page, tindakan, orderBy, order } = params; + const { + skip, + page, + tindakan, + orderBy, + order, + id_visit, + kelompok_tindakan, + kategori_tindakan, + } = params; const take = params.take ? parseInt(params.take.toString()) : 10; + const kelompok_tindakanArray = params.kelompok_tindakan + ? params.kelompok_tindakan.split(',') + : []; + const kategori_tindakanArray = params.kategori_tindakan + ? params.kategori_tindakan.split(',') + : []; const skipValue = skip ? parseInt(skip.toString()) : page ? (parseInt(page.toString()) - 1) * take : 0; + console.log('Kelompok Tindakan Array:', kelompok_tindakanArray); + console.log('Kategori Tindakan Array:', kategori_tindakanArray); const results = await this.prisma.pemberian_tindakan.findMany({ skip: skipValue, take: take, where: { tindakan: tindakan ? { contains: tindakan } : undefined, + id_visit: id_visit ? { contains: id_visit } : undefined, + kelompok_tindakan: + kelompok_tindakanArray.length > 0 + ? { in: kelompok_tindakanArray } + : undefined, + kategori_tindakan: + kategori_tindakanArray.length > 0 + ? { in: kategori_tindakanArray } + : undefined, }, orderBy: orderBy ? { [Object.keys(orderBy)[0]]: order || 'asc' } : undefined, }); - return results; + const count = await this.prisma.pemberian_tindakan.count({ + where: { + tindakan: tindakan ? { contains: tindakan } : undefined, + id_visit: id_visit ? { contains: id_visit } : undefined, + kelompok_tindakan: + kelompok_tindakanArray.length > 0 + ? { in: kelompok_tindakanArray } + : undefined, + kategori_tindakan: + kategori_tindakanArray.length > 0 + ? { in: kategori_tindakanArray } + : undefined, + }, + }); + + return { + ...results, + totalCount: count, + }; } } diff --git a/backend/api/src/modules/user/user.controller.ts b/backend/api/src/modules/user/user.controller.ts index 9e132ec..5f5b7ed 100644 --- a/backend/api/src/modules/user/user.controller.ts +++ b/backend/api/src/modules/user/user.controller.ts @@ -37,8 +37,12 @@ export class UserController { @UseGuards(AuthGuard, RolesGuard) @Roles(UserRole.Admin) @HttpCode(200) - getAllUsers(): Promise { - return this.userService.getAllUsers(); + getAllUsers( + @Query('username') username: string, + @Query('page') page: number, + @Query('take') take: number, + ) { + return this.userService.getAllUsers({ username, page, take: take }); } @Get('/set-cookie') diff --git a/backend/api/src/modules/user/user.service.ts b/backend/api/src/modules/user/user.service.ts index 3881815..2cc5430 100644 --- a/backend/api/src/modules/user/user.service.ts +++ b/backend/api/src/modules/user/user.service.ts @@ -6,9 +6,32 @@ import { UserRole } from '../auth/dto/auth.dto'; @Injectable() export class UserService { constructor(private prisma: PrismaService) {} - async getAllUsers(): Promise { - const users = await this.prisma.users.findMany(); - return users.map((user) => ({ + async getAllUsers(params: { + username?: string; + take?: number; + skip?: number; + page?: number; + orderBy?: any; + order?: 'asc' | 'desc'; + }) { + const { username, skip, page } = params; + console.log('Fetching users with filter:', username); + const take = params.take ? parseInt(params.take.toString()) : 10; + const skipValue = skip + ? parseInt(skip.toString()) + : page + ? (parseInt(page.toString()) - 1) * take + : 0; + const users = await this.prisma.users.findMany({ + where: { + username: { + contains: username, + mode: 'insensitive', + }, + }, + }); + const count = await this.prisma.users.count(); + const usersResponse = users.map((user) => ({ id: user.id, name: user.nama_lengkap, username: user.username, @@ -16,5 +39,9 @@ export class UserService { created_at: user.created_at || undefined, updated_at: user.updated_at || undefined, })); + return { + ...usersResponse, + totalCount: count, + }; } } diff --git a/backend/blockchain/.gitignore b/backend/blockchain/.gitignore new file mode 100644 index 0000000..189d04c --- /dev/null +++ b/backend/blockchain/.gitignore @@ -0,0 +1,3 @@ +node_modules/* +channel-artifacts/* +organizations/* \ No newline at end of file diff --git a/backend/blockchain/chaincode/logVerification/.eslintignore b/backend/blockchain/chaincode/logVerification/.eslintignore new file mode 100644 index 0000000..1595847 --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/.eslintignore @@ -0,0 +1,5 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + +coverage diff --git a/backend/blockchain/chaincode/logVerification/.eslintrc.js b/backend/blockchain/chaincode/logVerification/.eslintrc.js new file mode 100644 index 0000000..555c0cf --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/.eslintrc.js @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +module.exports = { + env: { + node: true, + mocha: true, + es6: true + }, + parserOptions: { + ecmaVersion: 8, + sourceType: 'script' + }, + extends: "eslint:recommended", + rules: { + indent: ['error', 4], + 'linebreak-style': ['error', 'unix'], + quotes: ['error', 'single'], + semi: ['error', 'always'], + 'no-unused-vars': ['error', { args: 'none' }], + 'no-console': 'off', + curly: 'error', + eqeqeq: 'error', + 'no-throw-literal': 'error', + strict: 'error', + 'no-var': 'error', + 'dot-notation': 'error', + 'no-tabs': 'error', + 'no-trailing-spaces': 'error', + 'no-use-before-define': 'error', + 'no-useless-call': 'error', + 'no-with': 'error', + 'operator-linebreak': 'error', + yoda: 'error', + 'quote-props': ['error', 'as-needed'], + 'no-constant-condition': ["error", { "checkLoops": false }] + } +}; diff --git a/backend/blockchain/chaincode/logVerification/.gitignore b/backend/blockchain/chaincode/logVerification/.gitignore new file mode 100644 index 0000000..eeace29 --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/.gitignore @@ -0,0 +1,15 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + +# Coverage directory used by tools like istanbul +coverage + +# Report cache used by istanbul +.nyc_output + +# Dependency directories +node_modules/ +jspm_packages/ + +package-lock.json diff --git a/backend/blockchain/chaincode/logVerification/index.js b/backend/blockchain/chaincode/logVerification/index.js new file mode 100644 index 0000000..476a0fd --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/index.js @@ -0,0 +1,6 @@ +'use strict'; + +const logVerification = require('./lib/logVerification'); + +module.exports.LogVerification = logVerification; +module.exports.contracts = [logVerification]; diff --git a/backend/blockchain/chaincode/logVerification/lib/logVerification.js b/backend/blockchain/chaincode/logVerification/lib/logVerification.js new file mode 100644 index 0000000..7cd7a5d --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/lib/logVerification.js @@ -0,0 +1,155 @@ +"use strict"; + +const stringify = require("json-stringify-deterministic"); +const sortKeysRecursive = require("sort-keys-recursive"); +const { Contract } = require("fabric-contract-api"); + +const timestampToISOString = (timestamp) => { + if (!timestamp) { + return undefined; + } + + const seconds = + typeof timestamp.seconds?.toInt === "function" + ? timestamp.seconds.toInt() + : Number(timestamp.seconds || 0); + const millis = seconds * 1000 + Math.floor((timestamp.nanos || 0) / 1e6); + return new Date(millis).toISOString(); +}; + +class LogVerification extends Contract { + async beforeTransaction(ctx) { + this.TxId = ctx.stub.getTxID(); + console.log(`Transaction ID: ${this.TxId}`); + } + + async InitLedger(ctx) { + const logs = [ + { + id: "TINDAKAN_01", + event: "Tindakan Dokter", + user_id: "1", + payload: "hash1", + timestamp: "2023-10-01T09:00:00Z", + }, + { + id: "OBAT_01", + event: "Pemberian Obat", + user_id: "1", + payload: "hash1", + timestamp: "2023-10-01T09:00:00Z", + }, + ]; + + for (const log of logs) { + await ctx.stub.putState( + log.id, + Buffer.from(stringify(sortKeysRecursive(log))) + ); + } + } + + async storeLog(ctx, id, event, user_id, payload) { + if (!id || !event || !user_id || !payload) { + throw new Error("All parameters must be provided and non-empty"); + } + + const txTimestamp = ctx.stub.getTxTimestamp(); + const timestamp = timestampToISOString(txTimestamp); + const log = { + id: id, + event: event, + user_id: user_id, + payload: payload, + timestamp: timestamp, + }; + try { + await ctx.stub.putState( + id, + Buffer.from(stringify(sortKeysRecursive(log))) + ); + + return stringify({ + success: true, + message: `Log ${id} stored successfully`, + }); + } catch (error) { + throw new Error(`Failed to store log: ${error}`); + } + } + + async getLogById(ctx, id) { + const iterator = await ctx.stub.getHistoryForKey(id); + const logs = []; + + try { + while (true) { + const res = await iterator.next(); + if (res.value && res.value.value.length > 0) { + const payload = res.value.value.toString("utf8"); + logs.push({ + txId: res.value.txId, + value: JSON.parse(payload), + }); + } + if (res.done) { + break; + } + } + } finally { + await iterator.close(); + } + + if (logs.length === 0) { + throw new Error(`Log ${id} does not exist`); + } + + return logs; + } + + async deleteLogById(ctx, id) { + const exists = await this.logExists(ctx, id); + if (!exists) { + throw new Error(`Log ${id} does not exist`); + } + + await ctx.stub.deleteState(id); + } + + async getAllLogs(ctx) { + const allResults = []; + const iterator = await ctx.stub.getStateByRange("", ""); + try { + while (true) { + const result = await iterator.next(); + if (result.value && result.value.value.length > 0) { + const strValue = result.value.value.toString("utf8"); + try { + allResults.push(JSON.parse(strValue)); + } catch (err) { + console.log(err); + allResults.push(strValue); + } + } + if (result.done) { + break; + } + } + } finally { + await iterator.close(); + } + + return allResults; + } + + async logExists(ctx, id) { + const logJSON = await ctx.stub.getState(id); + return logJSON && logJSON.length > 0; + } + + async afterTransaction(ctx, result) { + console.log(`Transaction ${this.TxId} has been committed.`); + } +} + +module.exports = LogVerification; diff --git a/backend/blockchain/chaincode/logVerification/npm-shrinkwrap.json b/backend/blockchain/chaincode/logVerification/npm-shrinkwrap.json new file mode 100644 index 0000000..1655019 --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/npm-shrinkwrap.json @@ -0,0 +1,3948 @@ +{ + "name": "log-verification", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "log-verification", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "fabric-contract-api": "^2.5.8", + "fabric-shim": "^2.5.8", + "json-stringify-deterministic": "^1.0.0", + "sort-keys-recursive": "^2.1.0" + }, + "devDependencies": { + "chai": "^4.4.1", + "eslint": "^8.57.0", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "dependencies": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.0.tgz", + "integrity": "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@hyperledger/fabric-protos": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@hyperledger/fabric-protos/-/fabric-protos-0.2.2.tgz", + "integrity": "sha512-p5Meqig8DqsNDygoFMfAp0rqZQDtaatwUaYGF0LQvKS77ZLjP8WxvZ4/9zsr8aNs/4NkohKcq7ZUtEK70iBcrQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.11.0", + "google-protobuf": "^3.21.0" + }, + "engines": { + "node": ">=16.13.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001633", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001633.tgz", + "integrity": "sha512-6sT0yf/z5jqf8tISAgpJDrmwOpLsrpnyCdD/lOZKvKkkJK4Dn0X5i7KF7THEZhOq+30bmhwBlNEaqPUiHiKtZg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.802", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz", + "integrity": "sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fabric-contract-api": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/fabric-contract-api/-/fabric-contract-api-2.5.8.tgz", + "integrity": "sha512-Hc9bYDV1WI0zhYSXuGbmFq8NqPQvBZdnBfte98Nkc8Vy7V+A9+dBSGBc3puL652qjmvGTYUSN+DZq3tGDvlkQw==", + "license": "Apache-2.0", + "dependencies": { + "class-transformer": "^0.4.0", + "fabric-shim-api": "2.5.8", + "fast-safe-stringify": "^2.1.1", + "get-params": "^0.1.2", + "reflect-metadata": "^0.1.13", + "winston": "^3.7.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fabric-shim": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/fabric-shim/-/fabric-shim-2.5.8.tgz", + "integrity": "sha512-9j4ehj6kfz+dld4yuxN8nYsXcr8s5WiqdPrse1szEAPTFEhQU5vJ1/Z8CeVZXTYAXekrI4i79MjPHNU54RwD8A==", + "license": "Apache-2.0", + "dependencies": { + "@fidm/x509": "^1.2.1", + "@grpc/grpc-js": "^1.11.0", + "@hyperledger/fabric-protos": "^0.2.2", + "@types/node": "^16.11.1", + "ajv": "^6.12.2", + "fabric-contract-api": "2.5.8", + "fabric-shim-api": "2.5.8", + "fast-safe-stringify": "^2.1.1", + "long": "^5.2.3", + "reflect-metadata": "^0.1.13", + "winston": "^3.7.2", + "yargs": "^17.4.0", + "yargs-parser": "^21.0.1" + }, + "bin": { + "fabric-chaincode-node": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fabric-shim-api": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/fabric-shim-api/-/fabric-shim-api-2.5.8.tgz", + "integrity": "sha512-O+lg61KDqJn1Mr+KSPaq2nnjFkusp3bLC9CjNcMiNVWtQXqXXQtOQquoSWUeUVtRtUS4WL9zMBaU6Ynz7h7U7w==", + "license": "Apache-2.0", + "engines": { + "eslint": "^6.6.0", + "node": ">=18" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-params": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", + "integrity": "sha512-41eOxtlGgHQRbFyA8KTH+w+32Em3cRdfBud7j67ulzmIfmaHX9doq47s0fa4P5o9H64BZX9nrYI6sJvk46Op+Q==" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-deterministic": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.12.tgz", + "integrity": "sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sinon": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "dependencies": { + "is-plain-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys-recursive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/sort-keys-recursive/-/sort-keys-recursive-2.1.10.tgz", + "integrity": "sha512-yRLJbEER/PjU7hSRwXvP+NyXiORufu8rbSbp+3wFRuJZXoi/AhuKczbjuipqn7Le0SsTXK4VUeri2+Ni6WS8Hg==", + "dependencies": { + "kind-of": "~6.0.2", + "sort-keys": "~4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/backend/blockchain/chaincode/logVerification/package.json b/backend/blockchain/chaincode/logVerification/package.json new file mode 100644 index 0000000..7ff7d7a --- /dev/null +++ b/backend/blockchain/chaincode/logVerification/package.json @@ -0,0 +1,50 @@ +{ + "name": "log-verification", + "version": "1.0.0", + "description": "Log Verification contract implemented in JavaScript", + "main": "index.js", + "engines": { + "node": ">=20" + }, + "scripts": { + "lint": "eslint *.js */**.js", + "pretest": "npm run lint", + "test": "nyc mocha --recursive", + "start": "fabric-chaincode-node start" + }, + "engineStrict": true, + "author": "Hyperledger", + "license": "Apache-2.0", + "dependencies": { + "fabric-contract-api": "^2.5.8", + "fabric-shim": "^2.5.8", + "json-stringify-deterministic": "^1.0.0", + "sort-keys-recursive": "^2.1.0" + }, + "devDependencies": { + "chai": "^4.4.1", + "eslint": "^8.57.0", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0" + }, + "nyc": { + "exclude": [ + "coverage/**", + "test/**", + "index.js", + ".eslintrc.js" + ], + "reporter": [ + "text-summary", + "html" + ], + "all": true, + "check-coverage": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 + } +} diff --git a/backend/blockchain/chaincode/logVerification/test/logVerification.test.js b/backend/blockchain/chaincode/logVerification/test/logVerification.test.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/blockchain/generate-artifacts.sh b/backend/blockchain/generate-artifacts.sh new file mode 100755 index 0000000..689e488 --- /dev/null +++ b/backend/blockchain/generate-artifacts.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +export FABRIC_CFG_PATH=${PWD}/network/config/ + +rm -rf ./network/organizations ./network/channel-artifacts +mkdir -p ./network/channel-artifacts + +cryptogen generate --config=./network/config/crypto-config.yaml --output=./network/organizations +if [ "$?" -ne 0 ]; then + echo "Failed to generate certificates..." + exit 1 +fi + +echo "--- Generating genesis block for Hospital profile ---" +configtxgen -profile HospitalGenesis -outputBlock ./network/channel-artifacts/genesis.block -channelID system-channel +if [ "$?" -ne 0 ]; then + echo "Failed to generate genesis block..." + exit 1 +fi + +configtxgen -profile HospitalChannel -outputCreateChannelTx ./network/channel-artifacts/mychannel.tx -channelID mychannel +if [ "$?" -ne 0 ]; then + echo "Failed to generate channel transaction..." + exit 1 +fi \ No newline at end of file diff --git a/backend/blockchain/network/channel-artifacts/config_block.pb b/backend/blockchain/network/channel-artifacts/config_block.pb new file mode 100644 index 0000000000000000000000000000000000000000..fae0d34af35fa338507f0bf8192be4149ccd5b37 GIT binary patch literal 14403 zcmeHO4U8k@c|P{Iz2yUrW$v!IYzS;tB)Oh*u{|FDMWWI-zaHCTd+f2tV}Yvicsw)q zjK`iCdu%IJFH)$IKqx7VkSaB8s{T-tN;GPsP({!dDjYs)L2e(IBtE^l06O%z@3^;8r2%rf}+ zG5|%Vr8=s^RZ7V3ET5hI;1t6a)(NUCury0Rftt4hj%5jQN)WIqYtUzLsIg_pVQN?( z>S&{oh)8gdZfSTWh53Xgu{pcJPCF4Q=Q;W|guYTTHb!ZNNEYQanb z(Jkmr#`)e|G2MaH&G!_6tOf5GI0F=m9!jV=mC)3f7ND@%!4^nHA1N`s-(qMt zZxu#Ofs!~}nlA>&TuDNyq0FSGKw->?B>KT5X^+FPIw`PGPM~~l3b6vo`W$TsZQN#? zu-)d10+pZb9{e)fpY0wjwx1DTb94KgKr`t{gQ-m#b#}hZJ-ej4KIKc9t-~Y$icxXH4`v@ooNAV6D1VNVQ^Yh~ra4nsdeRGzy4jS{f7^P$^7IjAz?s zFwJ=vhAjKgFGE%%oauBNP1{CWGjXcHj`T_ske!xp5SmsFaqxRV5F#q`MtFlaag=C_(Eko#{sa_XPO6ZhZa-f-7- zkA3~mOh&r>zUXZ_=0MxU~OW<6NM`>3U8zaSv_a%W6Ih^0b z<(Ml}QF_QyjR}y%ct@@mI?X9n<8W?su+DKa9PPQFWzDB&S0q@S^3xru61SVNf)C_+ zS#J{YP7{sz8C@xGo$8nq;FKe^2-ktWIBT2E+s4~%Tic)Q9{e)fpY1-_!7JbXZ1-TX zeQ|DUl&w={@tqUraNI8t5SCH9gk>XGTJNUIXgEtvMwlK4RU^U<65T>J*BsOJhTka2 zXx4I5!?E2Tm{inqe4ghpQln|C6zwS8slwvPM!1U(#?zwT0d{bB@)Q^7S%ipn}~Vxf=<{JPGlj5Xl! zexv2Zh*I8*^7#mlmoc3(6Uj2BVyUjt5d=K=%-HHfz&;G&6jyX~y-L zO->`JaW>M-6y{U|W?b_MspePpBfK=-R5ET#?&*F;on%@VXgVbrXG=;RH??F$YWHiE ziB$Kz48&9Yq{7w{g=yA{#)VPVAEJ0$&8vQg^eT0Tb_X621I_SIY_y^HO6exR_9ow4 zGTmehOf0lAcrR&|>th=fS+PICa!oEmN%^Uq)^*p`wPw#7GV%rKCX)(HQhYRqF&?OJ zN>%l8&cNx@c`~Y4zB-qSbP!?6yF? z+)SvVRP3v?Sk^8|H*3qVWf?tp4Fy+Fy;k2gdY+5C6L}kWtGyXby;ry0zTwH{dllPy zUosMpEXHhLU~4pT23Ze0$?K36WI1?US~;|~iX7YRB(4T=+vZ9eF>ti3%0Z;&BBzn- zgYIj)h8;t$+C6OdAki_rmo@0j;{6u|I`K{N&1k_IueuR# zarm4MsUU8y2Ell@QO}x+vFX$AwzIp96e#g8>J(?Y#wcytI5}y=V)bTGOK}mgk!xi_ zO*thB>Bf*7_Nv8N82Gh;R>JT?LP>HYFG&nm%;9w4`9&*vx7h01Y&Rc@6R6Oy8aBrG z9LspSDINqt=#1lOn}n@7#aF7-riP$7xJJ=<5Gv0@=N%{6C*j)SMaJ-BM#M=&ha9(u?zFHM&%3<>YRV#|VW=MQV`NTooOvlX8oxLFXRPxAaz9dO%qUdqfNTCgl zwg_qHQM%caQmHUn1X>Z5bpE1I(ksv+Ds#y@vGC*rk&ZEkQVUHPZoQhF5)3!aG-~_P zOU=$}oL*{j_+~CEaFZ)7W*nrXs3F*=jlYZ()354BI4}S7V(BNgf(`PR<}s)c2Y4K- zIcPSU%p^IKnof#Nc{&qhUJm?Dr;Iv;qrBoDS4% zj7XRJu!^~$HyqS4eN9gSKKj8he!3cJh_N7-uTX1z;sV6g9Gk*GbNM`xNDwJdcC*{SyoI# z?RjgD9{}skm8m@d*6Rzb%loS8Y<%MYRtK;;h_zm|SPMBK&oWYHo;<+S0j>^k_3Gj3 z=vG>CAvkWt7a}AQLf#QXUT@!(hrJfLW{;k@D}VbwaAlAwwjEcs0=M!~#va~YvbCe9 zN=PwSGlv9;;@~w%83(_!*QK==S$kj8;r+d~mDCMxTgXLlBo)kxAy*+_XO;b9FWcX= zJ>5c>y-1cgzLO>1c+cMBc{_4E(0hZ!+;wIX8@R`@omR5hE`CtfPmGC zZ1qibr**Nrjg4)LTu`_V`fL|8Y$pI-L6Tr`&yXjs1-D%bo}N{^2bXYvwfiH>;NImu z=tTbDC2ONHGd)r%F7!xV38lH-So8*U+lf1D88rqy>wHD1^F}Yh?aitRUeyxZ;#R#l zMT|LG63d<}V&h9GBm_-ie`qCc6`jwChTaS`NVUat zfr#Eqnma z!{=`~`SXpR-uwCT?T(53DFC+}2D`pUf+FjClW*q}PhjYSx~3gN5&Zqw67nZYdq@4= zjLP;BXwdP()@e6?T#ChcBXP{atgUVAIkyupW_FRgj)DX0cFA8bIIwO9)(tr&{_mkL z{PbbvbB{TnzvsEH9%=mT7azIlhOZv_M}&z`OYb=JiKo8)&c}~@_|OZ_lyCad=})cu zKfZhPqpKf&|N3*!`pfsKAYP!P*N)fBnewNAHe=zVhyWDQORW<1d!-x1RmC zlkKnFb|*qd$ffo7|Lez|ea3$BkFIdO`JS6Q;@iFx&p!0Er;ptjTFw5|E#La>$CuW7 zzqtHX@$4P?_wLRw0pV8VllMJz>h_2J=ZF9K1um9O+k6caO`*YR0<6|)E XANk3H?tgv%fxo%ZTm#_H;@|%R&+vza literal 0 HcmV?d00001 diff --git a/backend/blockchain/network/channel-artifacts/genesis.block b/backend/blockchain/network/channel-artifacts/genesis.block new file mode 100644 index 0000000000000000000000000000000000000000..749a52c476b40ef06f9ed6c6831fa533854ecfe7 GIT binary patch literal 17072 zcmeHPU996)Uhhn&cW%$j-d;Sd+6H!+z3gsBlbwy@IA4`k>hWis#7UfQ=K=6nY$tY{ z#CDuSJPa!0VfTf1!~;kxt%Q(}*o7yy`&KGID*@Xgfz$^ONJy+e+6RyjaFX0)?)3KF zPKVLVYDlhptsI|^zmLz)|KIuj&j~n*-G+tt|FHU%zY_o8_u#+&=)>zjeD8NY_`db# z-`)D^+wkwd`|Zjd>_2|v3iv5H{tX?!27dYQ%JG%h!QnrD^t*p{aB}1?{J?PUX_hh? z8P45zh?J5}lUh2HHS!9s7)oAEt64pt%x3V6qLY0kuWMR9pTyOECY?#ucBGFzdldNCSFxW5Z+e^T->^J?YzK<- z4b5}k&f;l2b^vwP9{I74Z-E!ZMh*Mu7WNmnun%tS>RcuM`N6%_hhll5a+_xBO@R|= z*ksqKKokU8VrUu~h6y8qf~FvKGQDV`!0rGRjeJ64@CBoUmibb2$*O^@X!+Yu>geT|xnl@`H;0^3^v zxsx6!-O4~+vTczPH-#-xRQUW-;~iY?M4?RN1F>#KoVjj{VWa#&ZlpamRf&Moty?Oc z9;gH!6)deH4q9`u36~;c;^F{ComJX$oi^X4otnS09{gX-Us;bVczp9$)`PA2ohEEj zrgqxP0`;KBMT&|lG=z1+tC2;V%v-~Jok$ef#f-Glpk?F2Br~iOOX{5K_M%=zA&Rb_ z3+LW=;;>0~8cC8!GA757wd6n>E;WJ5_7X#4GGA7s0q{`gDN9(T%u2f;+aENxUP~{6)StOaookx-Iz4Z-O;6*a~wVE+@bFnP_4L2u*5Zi>5j( zCEQM#W~Oeducbn*oGw!S(2r;n^`zGmmIItcJ&AgsEdvn_Hwdvry4@D%>=M>jj|Abe zNe?TQ$~&%_DuzmjopS@&+Fa9`OdDOZDIRDphtT3IWg<7{)}v`v*lRMpHPcemSm!yv z>{e!Kla)nEUN;8kVofI4aD_PV5acMb%QS_g*kmJd3CRj0L?Y**G;x#G+@(crWd6!} zumV5znC7pn2V3*`CG2hPPZZf9H&i=LD4n|vs<(P+P>anVfhNm??TCR9TY$I#DcYL$ z6@yh%wpOYcS&{8clO>psFB^W*lM?LE9<~`hsaTRj#^VNvx)yKn?nI=kXg08Jm+S@r|o9^h~M}$hMgC2wNP2R z8nE&;kLhZDR&U|6-A$w5=ai8Z6^uneCxJSx!L(4*%9LYfak)QkHx_a?2nvwOjkB82 z%~Y1fAenB?icv^VeWPqd114y6Au*f;bPA}6u+!_q&f~fpgzb&Ld1QA}u*ptEFHobb zQ}50_P!&4k1zA!>oR!Np47da`JBKZI`M6G26rRiik=E_V` zb0cG6Sy`f1^oLeEoq#qB_-wC5mE%&=@N8l>YP#umK9y|M<8@yL-MX4FI&yVvaGkn& zsk_-Syb}_fay{%WcKh%O_6yh{c7V=T4_}BKV@GER--_mLc;QJ3T(27nBAY&T2m2Dr z9y?R)2)lW<*x5pzsU3W-LU*@J^ef;dt&A1bcI?15eC$;WfJ1PtP5cUuy|8T}cK;Rd z1=<_=#>fx-=3;DMKRLqw;RqZWfu>KDet>;=1l~IWuYMZ!J^ofU_FLE2F8UHqt2fch z##-!NHZl`TSXdJ${hS#N*;NmVjh zR%9eu=E-V_;t)woHp+fgA9}*D98c3kbKJ5$l8;1z56*gHfGFt79djN7^|d!{wAc-4 zGN+Wua+IVoP|PsNmFFV4Z8KH7f-j^Ifb#g zi5AlCvO@86j+n`^S`uVFomDO14k*OoS3H1as{=@yRvk@->W=2N7iISoj7$~^yUz85 zqRQt7XmT`PO>%J4T%R9uK%XFxOg(~89SUYGnES=Cp~rP|42Wr?$)?5wHs3Q_v#M5g z@rdu$+N2lAovcg?ux6FQ9I;F%#va*9^sM}lqvgz$wUy9Js(>jmv%#_rr^C2?88O~N z^5UuH9+HUnt_boTl1~wm7zSQSH9Hvv~tMLRrA}`|;IXp1a@`%JH;eTXAe%S+#;)Qs0jA z?DCwFply9ywt~HX58Qy`v14nSO8?{@_Wd}xQ8*RaR_fVz;;|px*{ExOdC15^?+^2(zK*wWhJ?<%pC$Z^*DSOa%RDUE4c4)XOeSUftkc6g zPf=bIhT`0x3%RymDtabYYv?6qh;*HJyjEo=dDAzD&{))Uz75?A=R0uG62l4+EzMFR z;|UVkhydpgvoku~mDI+vL6@9t+)c$LM?&+R#!?QLWw|EHMy48w?o8uslXGb~3|Pw< z$+=vDr~oWetbG(N;XAPeX&##{gg27@dE-dkg6HU_@EpWSbnB7bi-f97h+YJ zg?U8$9}b{{|piSX!pg_Tb zB9Uz{{c1#45*;Ny&W$aiRZj+7+o%Fd8&KnhKj*l_tlL)>mvHsoKgN(2@Zka2`>y9H zG_?0!>(J1%@?F@0=Gew4i2cnTSkG6?bq}m(3#@Bn!9Q*Z8DBS;kcdu~&KUzS#pUgbd z$;@8i7WWGGUg6#=-22TBr|W4y$L5E$S%<53NF8 zU~geJk=lH?75`(eCresNVNC3Ym`-Szyz6Op9 zif`E?6FR1cHiTI&hOI2y?DyP84Py7eo9ngNj1nlP1scIL)Pitop!mVT;s2n|E4%DP uaC~|vP}ir1@1sp(nah9W;3C^E(frSBHhUz^{|U?SF|;`rTm>&||Na+6CXSK- literal 0 HcmV?d00001 diff --git a/backend/blockchain/network/channel-artifacts/mychannel.block b/backend/blockchain/network/channel-artifacts/mychannel.block new file mode 100644 index 0000000000000000000000000000000000000000..4c0208cf14145d5ff3e17918f8eb0b42e2c662c7 GIT binary patch literal 14402 zcmeHOeT>`YeNN8K`TWMU9Xe^8OH(^entE1KQ55x+qQzc*ijqi)67@j=Z9joJ z8Kpa&&pz96Qp3oGyThICUcKMs^ZtH(o=4!s`te8q<~HwVr%wmh-J5*%(MSH^L-&3C z2K`gt{i|=@?EJ<`s&)(KlkU~Sv|4enX0DJ>*+S~ zjaBgQDgecyrVsTYUnwDjuhM3n zHJ0%TjxcUXw9FIoVlX)2OEN}}6gD#hDr=*1JqSC=_&k9(D2a>l5*_d}hzk@K@QfRl z@f&5*R#{M&=)!#V;8&UceD+{D{j3CA8`I|{hRsZyY;D?XaEoc4GfSo$(1D!Y+)NTc zacgHOD5{ibK)N`{lAe!6TO1b*mF^67qNz?omPd}2Q^TF?CbVffT4`o&wFXc-NAb1p zpeL!K{vUvS!n^PqnQ@jDY2F?$PIm6Qxg%4F@mTnJ**HO%BDM`Rx~8!i4F&kXKCb`}MVJkx$i;hwld0!+zhkRK>U49`fr2duSyUeMJQAji z;Xo0(QolvWNebo(!x)&|PO&746zmW~Ui1P$is3~OMV1b7wd#zP_z>Llo0uf{yofQL zQg4n`C()NBy3P~g20kaeP{o)LM>nTHt|vN5L+G?-bd4wYjm9R=&+&B5jaoJWW`3)L zqtijABUch`D=q{;X_UUV<~8GElw)gZjK|wkVrym2FOcK6~)1 zOn*N6a0YLE`t#X?<@D=|Ge_OrWsW$z<2*qG0tunSS;i<~VTE2*lZVj?CX*THft=Z4 zh7FN)Dn+O#>uot=XS{AE-`3D7O5xC+v{RUubfs){I?KSkRiSMwM3}kBqFCCSW^F6ObpNA_v*|B`%{jLC66E!_y&<2|}!9!*iDtN$UObrI z4qAqX{Jf(eztKUFAUT@jy8OhOaOs+t&$$Lus%Uwo8y=mJNU2BQ@|C2^iFhRdjMq(#$wWhJRb~}3Z>J(oJR;g6 zv|wc>`_!yZl4U(v^m%8jGM2$Oq&)Iz)9%UXbQCKBqln3-_`wfe0=UFMu(y(h7_vJ5 zok-@s_lD@IEYOu)qN@z^tUZ!7ENyv>YHmid{3P3~?Tl!x&Q*?REuPp2pJ7C+XzV16 zg7gUNfZ>~nYH!yioEP#g6!EwUJ}BUZ&tg&n5DC0C#B#Y*HpOG~Y+4+aXXAmj*Hg}2ej%LG(9%4bW-qnc4x?g2J7$yx&Tj3 z6c-2O5?LXzNDv+bL&BgLA`Hk-f~5sa%L{bTgapGtosIJ3;__*fAzB1UwE4WidvUJc zWIGt3AW_m|kxn7V((G8NXu3CxO!=ZR9%YK1^Uiid;2=dX&?0a$Q|`km?t$KD(7?@c zQJ=bvQI|A@RM*THts)WkYXs`}3gk@4W2p+&E(W9!tt*Lsx^H6Da?EFHdJ&jvhv-+l z3ByFkjkYqq1j?HKxE@Bj=T^aP?Anc8yRqvE#V%x3wJp8puYZ3RSi4E#Zc=!~l0sx} zU)P5xp52AjF06K8b>(1nouWBb@6_|VxZ1_lF0QT|uJ*YbjQsj4oCC}|p@Ds6T?tuw z50Q~#_~?~K4kHJ{*Oj$v!k_u;%K8n+p>v4E!`JRC+OxB0Wor~3?5htge?AI@-QABiBhhrQf}tRbr#yd%wBKT)$s+ zoqJMf0$r|h{lz02B=+-1kf)9yPafIobIxqPc^;siYz6}bHaak;XQCpN={gK`KF`tF z<*?@z{MF{L%a~ijb10rMyO}Z;&C$~_ZYDt0Lb*Y*E9CO63Dal>O+mqOj+Y)y-2T9( zW6m%TMINUNhQUj*j@q569Fb~9yVzhdD+Zmb$YHZwca*K+R6DCpOC7od$5MguRFDy! zXg%L?#4M%ub(+j38s&>}*rDb!tXm^|WHWkYGX)(nV zZ9EduLC`Q+oplC0(Qj&goGcamm{>qXqKuogolKQ+9Zz?yjwBJ`n(+noOl^p*b3r`| z3@TJ_=4#L;%?vv*)Pq8`Csbv*KJ9V?i#g>vFm!AQ43Q7&{T!}$MsmiE7P0gcPqk{Z^XT*rF}m7PsTZ&t zx-3Oca%d|nEaXx!*Gu1`T>5rh!W&Dbm8_RmdS;N-r&$dLtzii!xRP2RY$Jur?S8E? zl^edFg+#iaQn^M_nC1LfLK^3S5k|E2f*y1zztVtMci@w8(29=g%{HvRRmn8O_J(G9 z*^+72!s~*TC3-2l+?cqa$kqE(Jm2C`S}x3#jA?qVX|#I&h*d5cZnEjfG%d#BIO~H7 zuU2(GKO7AEOo582PM}XsGli9MUe~N8qM>B!v#Dm4C`3d_cP(t(lbl2?6OUEPk+P?O zM!A*L>vFNLGxf4@$#ApG@J`^%ycIcx91j!qcWq19!^e&7319eZvCP-wTS+r=5_xyn zY<*j^gUEsH&9*mMrq!3-Xqnz#BD+V=X7}r74uN-&ZqL(u-pG@teI0q_Ao33f!J6)? z+E8ix$a4q5HxGgvFO>Qoejv5}nSBd?$R)f`niL*3=5*_@ktu&b!xBGer;SmUF2%8F zVDI#0yj_v{CcGKVD}G*TJh2E}bSQ3DLl0QD*~rssTC z?Gn_q8ILzwMI+6l^=4knMp{a`E@he{e$=ZLYf%u?21W@dgru6{DN&YLyqG7LFiDG5 z3SLp`x?HyqNsyS-uUan720X|5+oLfEy-)LS%(xWP7SXs;r8lf=+XUgcW9zIZBcR~I zuOZDvVL(7G2=(DmJq|;8g{N~Av<#BKM@*+t4w{ifwU$;Wiy5dR(wPYaOQx~0EVuHU z%qCJT6F40r^r6i20GbY!V%#vxp`oX2t4?iNaL)6^$y|18b6qaiVl$o4;4_&Ubx^}t zyq*()F6PQA`4cbK*R_ad^Z_=kNOZj4p)*aRIxeb32MyR}sfN40Tu;fN8>D3BM`>)9 zi1uB)8f}`HE=21l zIIyTAS&r_GeB>aq7p!33*89i65pu(>T-H5*XsL6jrH5<{a#dNpQ{WI`yK1+l*p{~8 z`Mek__$ITJQvl496?f=cBPYzf5OBDnIDK0`Te`I+cY(uM#WSs*0d2z#8C%mq5M&K( zTHdzm-3@M8%$8DoWwSxWAC6RiG}J@>cy;ad@axc4^&B|7Ng6^;8|t1H5~s;abAvZW zH?K`}vt@LXus*SsN?x22y+ZWsa-)%FZvYS60A8BA-9z4Wr`!G8tKh4v=P=~R=iksA zn4Oyg)#6r)r$#b-Z&LRM4R@Fra%IdK^ql{9v}JFe-d$1aZE@2tPLmU!k?Un&spFH& zAzwgC+R47`AYTf@swK#UZrl~JlpcEVGy{_bjq(`|^os*Q>%*dlw+7W&dn)DHWmhhl z?S?=IY>%5*GSMJ)3wPK~a%`pPiZX5Y%Y3@MLB52aTG+|HTo(DV>7)hcTWQ~vla>tq zjgd9PDy1{Q_R;bvlX(Cx+e0WqqWHmLw9u|k0xh& zD+4gp!IE{4#9f^9-Du5d#XF5lKNccKfBcctuRiiGPk%{#O#H!r{L^bM|KPW>pLy(& zgopeo0KdBjZ2KSyh8#cF34gv86+V}R&yQ!%vhe>WSCBthIk(kAb1Caw5i6{Cxnj=S zLxj0f@o0Ihg+X-tzTJ4C$bdYw5A2?9m;J$l-P3LNbVH7Q;?Uk--r5Jvpe|G(=A0Gb?u|M+HANc8^ zME>N;@#FV@`a|_Eq4$^e$L=_mek6C#i?PVP!UNBI_`tV5{v$tSZSRC5(s%#b5q97GpM3V)|NSi6`}~tPtpjk) H^80@QB*1#F literal 0 HcmV?d00001 diff --git a/backend/blockchain/network/channel-artifacts/mychannel.tx b/backend/blockchain/network/channel-artifacts/mychannel.tx new file mode 100644 index 0000000000000000000000000000000000000000..e50732ac71d6bdb67ce5ea91b5a98ff7c2b08cf0 GIT binary patch literal 429 zcmd;D#mptnCCb4h#m4dc`oa@zN}Rcs$r*`xd8s)QkWIho0c zC7JnoLV`m4T-+Y{#RZuqi8;Q(0YVH?d|X`4`FX|pMJ1V~xj_C&CZR=4sJbRGaWG

-rPAo`F%FM|u$xJO45)tC!;^1NlGm19_8pGz8lAD=Vtfa&RWeG_L@o_K%)j;_I zKrcYm=x}kn=B4Bp6{qH==9LJ^3JC)h0v(DZh@{$-OT;HLEj76^IVTlK1tD!pTO#71v#mR&;$VK CnRL?t literal 0 HcmV?d00001 diff --git a/backend/blockchain/network/config/collections_config.json b/backend/blockchain/network/config/collections_config.json new file mode 100644 index 0000000..5876add --- /dev/null +++ b/backend/blockchain/network/config/collections_config.json @@ -0,0 +1,11 @@ +[ + { + "name": "HospitalPrivateCollection", + "policy": "OR('HospitalMSP.member')", + "requiredPeerCount": 1, + "maxPeerCount": 3, + "blockToLive": 1000000, + "memberOnlyRead": true, + "memberOnlyWrite": true + } +] diff --git a/backend/blockchain/network/config/configtx.yaml b/backend/blockchain/network/config/configtx.yaml new file mode 100644 index 0000000..96c668a --- /dev/null +++ b/backend/blockchain/network/config/configtx.yaml @@ -0,0 +1,179 @@ +--- +################################################################################ +# +# Bagian: Organisasi +# +# - Bagian ini berisi mengenai pendefinisian organisasi yang akan digunakan +# dalam konfigurasi jaringan kemudian +# +################################################################################ +Organizations: + # !PENTING! pastikan terdapat minimal 2 organisasi, orderer dan peer. + - &OrdererOrg + Name: OrdererOrg + ID: OrdererMSP + MSPDir: ../organizations/ordererOrganizations/hospital.com/msp + Policies: + Readers: + Type: Signature + Rule: "OR('OrdererMSP.member')" + Writers: + Type: Signature + Rule: "OR('OrdererMSP.member')" + Admins: + Type: Signature + Rule: "OR('OrdererMSP.admin')" + OrdererEndpoints: + # OrdererEndpoints berisi IP atau domain beserta port yang digunakan + # Jika menjalankan dalam environment lokal seperti WSL, dapat menggunakan + # orderer.example.com:7050 sebagai domain endpoints sesuai dengan dokumentasi + - "orderer.hospital.com:7050" + + - &Hospital + Name: HospitalMSP + ID: HospitalMSP + MSPDir: ../organizations/peerOrganizations/hospital.com/msp + Policies: + Readers: + Type: Signature + Rule: "OR('HospitalMSP.admin', 'HospitalMSP.peer', 'HospitalMSP.client')" + Writers: + Type: Signature + Rule: "OR('HospitalMSP.admin', 'HospitalMSP.client')" + Admins: + Type: Signature + Rule: "OR('HospitalMSP.admin')" + Endorsement: + Type: Signature + Rule: "OR('HospitalMSP.peer')" + AnchorPeers: + - Host: peer0.hospital.com + Port: 7051 + +# Default +Capabilities: + Channel: &ChannelCapabilities + V2_0: true + Orderer: &OrdererCapabilities + V2_0: true + Application: &ApplicationCapabilities + V2_5: true + +# Default +Application: &ApplicationDefaults + Organizations: + Policies: + Readers: + Type: ImplicitMeta + Rule: "ANY Readers" + Writers: + Type: ImplicitMeta + Rule: "ANY Writers" + Admins: + Type: ImplicitMeta + Rule: "MAJORITY Admins" + LifecycleEndorsement: + Type: ImplicitMeta + Rule: "MAJORITY Endorsement" + Endorsement: + Type: ImplicitMeta + Rule: "MAJORITY Endorsement" + Capabilities: + <<: *ApplicationCapabilities + +################################################################################ +# +# Bagian: Orderer +# +# - Bagian ini berisi mengenai konfigurasi orderer yang akan digunakan +# dalam konfigurasi transaksi jaringan atau genesis block terkait parameter +# orderer yang digunakan. +# +################################################################################ +Orderer: + &OrdererDefaults # Berisi konfigurasi untuk konsensus Raft, sesuaikan dengan orderer yang digunakan + OrdererType: etcdraft + Addresses: + # Daftar alamat orderer yang digunakan dalam jaringan, dapat menggunakan + # IP atau domain sama seperti yang digunakan pada bagian OrdererEndpoints. + - "orderer.hospital.com:7050" + BatchTimeout: 2s + BatchSize: + MaxMessageCount: 10 + AbsoluteMaxBytes: 99 MB + PreferredMaxBytes: 512 KB + EtcdRaft: + Consenters: + - Host: orderer.hospital.com + Port: 7050 + ClientTLSCert: ../organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt + ServerTLSCert: ../organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt + Organizations: + Policies: + Readers: + Type: ImplicitMeta + Rule: "ANY Readers" + Writers: + Type: ImplicitMeta + Rule: "ANY Writers" + Admins: + Type: ImplicitMeta + Rule: "MAJORITY Admins" + BlockValidation: + Type: ImplicitMeta + Rule: "ANY Writers" + +# Default +Channel: &ChannelDefaults + Policies: + Readers: + Type: ImplicitMeta + Rule: "ANY Readers" + Writers: + Type: ImplicitMeta + Rule: "ANY Writers" + Admins: + Type: ImplicitMeta + Rule: "MAJORITY Admins" + Capabilities: + - *ChannelCapabilities + +################################################################################ +# +# Profile +# +# - Bagian ini berisi mengenai konfigurasi profil yang akan digunakan sebagai +# parameter pada configtxgen tool untuk menghasilkan genesis block dan channel. +# +################################################################################ +Profiles: + HospitalGenesis: + <<: *ChannelDefaults + Orderer: + # Menggunakan konfigurasi yang telah didefinisikan sebelumnya + <<: *OrdererDefaults + Organizations: + # Menggunakan organisasi orderer yang telah didefinisikan sebelumnya + - *OrdererOrg + Capabilities: *OrdererCapabilities + Consortiums: + SampleConsortium: + Organizations: + # Sesuaikan jumlah organisasi yang digunakan dalam konsorsium + - *Hospital + Application: + <<: *ApplicationDefaults + Organizations: + # Sesuaikan organisasi yang digunakan dalam aplikasi + - *Hospital + Capabilities: *ApplicationCapabilities + + HospitalChannel: + Consortium: SampleConsortium + <<: *ChannelDefaults + Application: + <<: *ApplicationDefaults + Organizations: + - *Hospital + Capabilities: + - *ApplicationCapabilities diff --git a/backend/blockchain/network/config/core.yaml b/backend/blockchain/network/config/core.yaml new file mode 100644 index 0000000..14475bd --- /dev/null +++ b/backend/blockchain/network/config/core.yaml @@ -0,0 +1,791 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################### +# +# Peer section +# +############################################################################### +peer: + # The peer id provides a name for this peer instance and is used when + # naming docker resources. + id: hospital-peer0 + + # The networkId allows for logical separation of networks and is used when + # naming docker resources. + networkId: dev + + # The Address at local network interface this Peer will listen on. + # By default, it will listen on all network interfaces + listenAddress: 0.0.0.0:7051 + + # The endpoint this peer uses to listen for inbound chaincode connections. + # If this is commented-out, the listen address is selected to be + # the peer's address (see below) with port 7052 + # chaincodeListenAddress: 0.0.0.0:7052 + + # The endpoint the chaincode for this peer uses to connect to the peer. + # If this is not specified, the chaincodeListenAddress address is selected. + # And if chaincodeListenAddress is not specified, address is selected from + # peer address (see below). If specified peer address is invalid then it + # will fallback to the auto detected IP (local IP) regardless of the peer + # addressAutoDetect value. + # chaincodeAddress: 0.0.0.0:7052 + + # When used as peer config, this represents the endpoint to other peers + # in the same organization. For peers in other organization, see + # gossip.externalEndpoint for more info. + # When used as CLI config, this means the peer's endpoint to interact with + address: 0.0.0.0:7051 + + # Whether the Peer should programmatically determine its address + # This case is useful for docker containers. + # When set to true, will override peer address. + addressAutoDetect: false + + # Settings for the Peer's gateway server. + gateway: + # Whether the gateway is enabled for this Peer. + enabled: true + # endorsementTimeout is the duration the gateway waits for a response + # from other endorsing peers before returning a timeout error to the client. + endorsementTimeout: 30s + # broadcastTimeout is the duration the gateway waits for a response + # from ordering nodes before returning a timeout error to the client. + broadcastTimeout: 30s + # dialTimeout is the duration the gateway waits for a connection + # to other network nodes. + dialTimeout: 2m + + # Keepalive settings for peer server and clients + keepalive: + # Interval is the duration after which if the server does not see + # any activity from the client it pings the client to see if it's alive + interval: 7200s + # Timeout is the duration the server waits for a response + # from the client after sending a ping before closing the connection + timeout: 20s + # MinInterval is the minimum permitted time between client pings. + # If clients send pings more frequently, the peer server will + # disconnect them + minInterval: 60s + # Client keepalive settings for communicating with other peer nodes + client: + # Interval is the time between pings to peer nodes. This must + # greater than or equal to the minInterval specified by peer + # nodes + interval: 60s + # Timeout is the duration the client waits for a response from + # peer nodes before closing the connection + timeout: 20s + # DeliveryClient keepalive settings for communication with ordering + # nodes. + deliveryClient: + # Interval is the time between pings to ordering nodes. This must + # greater than or equal to the minInterval specified by ordering + # nodes. + interval: 60s + # Timeout is the duration the client waits for a response from + # ordering nodes before closing the connection + timeout: 20s + + # Gossip related configuration + gossip: + # Bootstrap set to initialize gossip with. + # This is a list of other peers that this peer reaches out to at startup. + # Important: The endpoints here have to be endpoints of peers in the same + # organization, because the peer would refuse connecting to these endpoints + # unless they are in the same organization as the peer. + bootstrap: 127.0.0.1:7051 + + # NOTE: orgLeader and useLeaderElection parameters are mutual exclusive. + # Setting both to true would result in the termination of the peer + # since this is undefined state. If the peers are configured with + # useLeaderElection=false, make sure there is at least 1 peer in the + # organization that its orgLeader is set to true. + + # Defines whenever peer will initialize dynamic algorithm for + # "leader" selection, where leader is the peer to establish + # connection with ordering service and use delivery protocol + # to pull ledger blocks from ordering service. + useLeaderElection: false + # Statically defines peer to be an organization "leader", + # where this means that current peer will maintain connection + # with ordering service and disseminate block across peers in + # its own organization. Multiple peers or all peers in an organization + # may be configured as org leaders, so that they all pull + # blocks directly from ordering service. + orgLeader: true + + # Interval for membershipTracker polling + membershipTrackerInterval: 5s + + # Overrides the endpoint that the peer publishes to peers + # in its organization. For peers in foreign organizations + # see 'externalEndpoint' + endpoint: + # Maximum count of blocks stored in memory + maxBlockCountToStore: 10 + # Max time between consecutive message pushes(unit: millisecond) + maxPropagationBurstLatency: 10ms + # Max number of messages stored until a push is triggered to remote peers + maxPropagationBurstSize: 10 + # Number of times a message is pushed to remote peers + propagateIterations: 1 + # Number of peers selected to push messages to + propagatePeerNum: 3 + # Determines frequency of pull phases(unit: second) + # Must be greater than digestWaitTime + responseWaitTime + pullInterval: 4s + # Number of peers to pull from + pullPeerNum: 3 + # Determines frequency of pulling state info messages from peers(unit: second) + requestStateInfoInterval: 4s + # Determines frequency of pushing state info messages to peers(unit: second) + publishStateInfoInterval: 4s + # Maximum time a stateInfo message is kept until expired + stateInfoRetentionInterval: + # Time from startup certificates are included in Alive messages(unit: second) + publishCertPeriod: 10s + # Should we skip verifying block messages or not (currently not in use) + skipBlockVerification: false + # Dial timeout(unit: second) + dialTimeout: 3s + # Connection timeout(unit: second) + connTimeout: 2s + # Buffer size of received messages + recvBuffSize: 20 + # Buffer size of sending messages + sendBuffSize: 200 + # Time to wait before pull engine processes incoming digests (unit: second) + # Should be slightly smaller than requestWaitTime + digestWaitTime: 1s + # Time to wait before pull engine removes incoming nonce (unit: milliseconds) + # Should be slightly bigger than digestWaitTime + requestWaitTime: 1500ms + # Time to wait before pull engine ends pull (unit: second) + responseWaitTime: 2s + # Alive check interval(unit: second) + aliveTimeInterval: 5s + # Alive expiration timeout(unit: second) + aliveExpirationTimeout: 25s + # Reconnect interval(unit: second) + reconnectInterval: 25s + # Max number of attempts to connect to a peer + maxConnectionAttempts: 120 + # Message expiration factor for alive messages + msgExpirationFactor: 20 + # This is an endpoint that is published to peers outside of the organization. + # If this isn't set, the peer will not be known to other organizations and will not be exposed via service discovery. + externalEndpoint: + # Leader election service configuration + election: + # Longest time peer waits for stable membership during leader election startup (unit: second) + startupGracePeriod: 15s + # Interval gossip membership samples to check its stability (unit: second) + membershipSampleInterval: 1s + # Time passes since last declaration message before peer decides to perform leader election (unit: second) + leaderAliveThreshold: 10s + # Time between peer sends propose message and declares itself as a leader (sends declaration message) (unit: second) + leaderElectionDuration: 5s + + pvtData: + # pullRetryThreshold determines the maximum duration of time private data corresponding for a given block + # would be attempted to be pulled from peers until the block would be committed without the private data + pullRetryThreshold: 60s + # As private data enters the transient store, it is associated with the peer's ledger's height at that time. + # transientstoreMaxBlockRetention defines the maximum difference between the current ledger's height upon commit, + # and the private data residing inside the transient store that is guaranteed not to be purged. + # Private data is purged from the transient store when blocks with sequences that are multiples + # of transientstoreMaxBlockRetention are committed. + transientstoreMaxBlockRetention: 1000 + # pushAckTimeout is the maximum time to wait for an acknowledgement from each peer + # at private data push at endorsement time. + pushAckTimeout: 3s + # Block to live pulling margin, used as a buffer + # to prevent peer from trying to pull private data + # from peers that is soon to be purged in next N blocks. + # This helps a newly joined peer catch up to current + # blockchain height quicker. + btlPullMargin: 10 + # the process of reconciliation is done in an endless loop, while in each iteration reconciler tries to + # pull from the other peers the most recent missing blocks with a maximum batch size limitation. + # reconcileBatchSize determines the maximum batch size of missing private data that will be reconciled in a + # single iteration. + reconcileBatchSize: 10 + # reconcileSleepInterval determines the time reconciler sleeps from end of an iteration until the beginning + # of the next reconciliation iteration. + reconcileSleepInterval: 1m + # reconciliationEnabled is a flag that indicates whether private data reconciliation is enable or not. + reconciliationEnabled: true + # skipPullingInvalidTransactionsDuringCommit is a flag that indicates whether pulling of invalid + # transaction's private data from other peers need to be skipped during the commit time and pulled + # only through reconciler. + skipPullingInvalidTransactionsDuringCommit: false + # implicitCollectionDisseminationPolicy specifies the dissemination policy for the peer's own implicit collection. + # When a peer endorses a proposal that writes to its own implicit collection, below values override the default values + # for disseminating private data. + # Note that it is applicable to all channels the peer has joined. The implication is that requiredPeerCount has to + # be smaller than the number of peers in a channel that has the lowest numbers of peers from the organization. + implicitCollectionDisseminationPolicy: + # requiredPeerCount defines the minimum number of eligible peers to which the peer must successfully + # disseminate private data for its own implicit collection during endorsement. Default value is 0. + requiredPeerCount: 0 + # maxPeerCount defines the maximum number of eligible peers to which the peer will attempt to + # disseminate private data for its own implicit collection during endorsement. Default value is 1. + maxPeerCount: 1 + + # Gossip state transfer related configuration + state: + # indicates whenever state transfer is enabled or not + # default value is false, i.e. state transfer is active + # and takes care to sync up missing blocks allowing + # lagging peer to catch up to speed with rest network. + # Keep in mind that when peer.gossip.useLeaderElection is true + # and there are several peers in the organization, + # or peer.gossip.useLeaderElection is false alongside with + # peer.gossip.orgleader being false, the peer's ledger may lag behind + # the rest of the peers and will never catch up due to state transfer + # being disabled. + enabled: false + # checkInterval interval to check whether peer is lagging behind enough to + # request blocks via state transfer from another peer. + checkInterval: 10s + # responseTimeout amount of time to wait for state transfer response from + # other peers + responseTimeout: 3s + # batchSize the number of blocks to request via state transfer from another peer + batchSize: 10 + # blockBufferSize reflects the size of the re-ordering buffer + # which captures blocks and takes care to deliver them in order + # down to the ledger layer. The actual buffer size is bounded between + # 0 and 2*blockBufferSize, each channel maintains its own buffer + blockBufferSize: 20 + # maxRetries maximum number of re-tries to ask + # for single state transfer request + maxRetries: 3 + + # TLS Settings + tls: + # Require server-side TLS + enabled: false + # Require client certificates / mutual TLS for inbound connections. + # Note that clients that are not configured to use a certificate will + # fail to connect to the peer. + clientAuthRequired: false + # X.509 certificate used for TLS server + cert: + file: tls/server.crt + # Private key used for TLS server + key: + file: tls/server.key + # rootcert.file represents the trusted root certificate chain used for verifying certificates + # of other nodes during outbound connections. + # It is not required to be set, but can be used to augment the set of TLS CA certificates + # available from the MSPs of each channel’s configuration. + rootcert: + file: tls/ca.crt + # If mutual TLS is enabled, clientRootCAs.files contains a list of additional root certificates + # used for verifying certificates of client connections. + # It augments the set of TLS CA certificates available from the MSPs of each channel’s configuration. + # Minimally, set your organization's TLS CA root certificate so that the peer can receive join channel requests. + clientRootCAs: + files: + - tls/ca.crt + # Private key used for TLS when making client connections. + # If not set, peer.tls.key.file will be used instead + clientKey: + file: + # X.509 certificate used for TLS when making client connections. + # If not set, peer.tls.cert.file will be used instead + clientCert: + file: + + # Authentication contains configuration parameters related to authenticating + # client messages + authentication: + # the acceptable difference between the current server time and the + # client's time as specified in a client request message. + # timewindow is checked on requests to the delivery service only. + timewindow: 15m + + # Path on the file system where peer will store data (eg ledger). This + # location must be access control protected to prevent unintended + # modification that might corrupt the peer operations. + # The path may be relative to FABRIC_CFG_PATH or an absolute path. + fileSystemPath: /var/hyperledger/production + + # BCCSP (Blockchain crypto provider): Select which crypto implementation or + # library to use + BCCSP: + Default: SW + # Settings for the SW crypto provider (i.e. when DEFAULT: SW) + SW: + # TODO: The default Hash and Security level needs refactoring to be + # fully configurable. Changing these defaults requires coordination + # SHA2 is hardcoded in several places, not only BCCSP + Hash: SHA2 + Security: 256 + # Location of Key Store + FileKeyStore: + # If "", defaults to 'mspConfigPath'/keystore + KeyStore: + # Settings for the PKCS#11 crypto provider (i.e. when DEFAULT: PKCS11) + PKCS11: + # Location of the PKCS11 module library + Library: + # Token Label + Label: + # User PIN + Pin: + Hash: + Security: + SoftwareVerify: + Immutable: + AltID: + KeyIds: + + # Path on the file system where peer will find MSP local configurations + # The path may be relative to FABRIC_CFG_PATH or an absolute path. + mspConfigPath: msp + + # Identifier of the local MSP + # ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!---- + # Deployers need to change the value of the localMspId string. + # In particular, the name of the local MSP ID of a peer needs + # to match the name of one of the MSPs in each of the channel + # that this peer is a member of. Otherwise this peer's messages + # will not be identified as valid by other nodes. + localMspId: SampleOrg + + # CLI common client config options + client: + # connection timeout + connTimeout: 3s + + # Delivery service related config + deliveryclient: + # Enables this peer to disseminate blocks it pulled from the ordering service + # via gossip. + # Note that 'gossip.state.enabled' controls point to point block replication + # of blocks committed in the past. + blockGossipEnabled: true + # It sets the total time the delivery service may spend in reconnection + # attempts until its retry logic gives up and returns an error, + # ignored if peer is a static leader + reconnectTotalTimeThreshold: 3600s + + # It sets the delivery service <-> ordering service node connection timeout + connTimeout: 3s + + # It sets the delivery service maximal delay between consecutive retries. + # Time between retries will have exponential backoff until hitting this threshold. + reConnectBackoffThreshold: 3600s + + # A list of orderer endpoint addresses which should be overridden + # when found in channel configurations. + addressOverrides: + # - from: + # to: + # caCertsFile: + # - from: + # to: + # caCertsFile: + + # Type for the local MSP - by default it's of type bccsp + localMspType: bccsp + + # Used with Go profiling tools only in none production environment. In + # production, it should be disabled (eg enabled: false) + profile: + enabled: false + listenAddress: 0.0.0.0:6060 + + # Handlers defines custom handlers that can filter and mutate + # objects passing within the peer, such as: + # Auth filter - reject or forward proposals from clients + # Decorators - append or mutate the chaincode input passed to the chaincode + # Endorsers - Custom signing over proposal response payload and its mutation + # Valid handler definition contains: + # - A name which is a factory method name defined in + # core/handlers/library/library.go for statically compiled handlers + # - library path to shared object binary for pluggable filters + # Auth filters and decorators are chained and executed in the order that + # they are defined. For example: + # authFilters: + # - + # name: FilterOne + # library: /opt/lib/filter.so + # - + # name: FilterTwo + # decorators: + # - + # name: DecoratorOne + # - + # name: DecoratorTwo + # library: /opt/lib/decorator.so + # Endorsers are configured as a map that its keys are the endorsement system chaincodes that are being overridden. + # Below is an example that overrides the default ESCC and uses an endorsement plugin that has the same functionality + # as the default ESCC. + # If the 'library' property is missing, the name is used as the constructor method in the builtin library similar + # to auth filters and decorators. + # endorsers: + # escc: + # name: DefaultESCC + # library: /etc/hyperledger/fabric/plugin/escc.so + handlers: + authFilters: + - name: DefaultAuth + - name: ExpirationCheck # This filter checks identity x509 certificate expiration + decorators: + - name: DefaultDecorator + endorsers: + escc: + name: DefaultEndorsement + library: + validators: + vscc: + name: DefaultValidation + library: + + # library: /etc/hyperledger/fabric/plugin/escc.so + # Number of goroutines that will execute transaction validation in parallel. + # By default, the peer chooses the number of CPUs on the machine. Set this + # variable to override that choice. + # NOTE: overriding this value might negatively influence the performance of + # the peer so please change this value only if you know what you're doing + validatorPoolSize: + + # The discovery service is used by clients to query information about peers, + # such as - which peers have joined a certain channel, what is the latest + # channel config, and most importantly - given a chaincode and a channel, + # what possible sets of peers satisfy the endorsement policy. + discovery: + enabled: true + # Whether the authentication cache is enabled or not. + authCacheEnabled: true + # The maximum size of the cache, after which a purge takes place + authCacheMaxSize: 1000 + # The proportion (0 to 1) of entries that remain in the cache after the cache is purged due to overpopulation + authCachePurgeRetentionRatio: 0.75 + # Whether to allow non-admins to perform non channel scoped queries. + # When this is false, it means that only peer admins can perform non channel scoped queries. + orgMembersAllowedAccess: false + + # Limits is used to configure some internal resource limits. + limits: + # Concurrency limits the number of concurrently running requests to a service on each peer. + # Currently this option is only applied to endorser service and deliver service. + # When the property is missing or the value is 0, the concurrency limit is disabled for the service. + concurrency: + # endorserService limits concurrent requests to endorser service that handles chaincode deployment, query and invocation, + # including both user chaincodes and system chaincodes. + endorserService: 2500 + # deliverService limits concurrent event listeners registered to deliver service for blocks and transaction events. + deliverService: 2500 + # gatewayService limits concurrent requests to gateway service that handles the submission and evaluation of transactions. + gatewayService: 500 + + # Since all nodes should be consistent it is recommended to keep + # the default value of 100MB for MaxRecvMsgSize & MaxSendMsgSize + # Max message size in bytes GRPC server and client can receive + maxRecvMsgSize: 104857600 + # Max message size in bytes GRPC server and client can send + maxSendMsgSize: 104857600 + +############################################################################### +# +# VM section +# +############################################################################### +vm: + # Endpoint of the vm management system. For docker can be one of the following in general + # unix:///var/run/docker.sock + # http://localhost:2375 + # https://localhost:2376 + # If you utilize external chaincode builders and don't need the default Docker chaincode builder, + # the endpoint should be unconfigured so that the peer's Docker health checker doesn't get registered. + endpoint: unix:///var/run/docker.sock + + # settings for docker vms + docker: + tls: + enabled: false + ca: + file: docker/ca.crt + cert: + file: docker/tls.crt + key: + file: docker/tls.key + + # Enables/disables the standard out/err from chaincode containers for + # debugging purposes + attachStdout: false + + # Parameters on creating docker container. + # Container may be efficiently created using ipam & dns-server for cluster + # NetworkMode - sets the networking mode for the container. Supported + # standard values are: `host`(default),`bridge`,`ipvlan`,`none`. + # Dns - a list of DNS servers for the container to use. + # Note: `Privileged` `Binds` `Links` and `PortBindings` properties of + # Docker Host Config are not supported and will not be used if set. + # LogConfig - sets the logging driver (Type) and related options + # (Config) for Docker. For more info, + # https://docs.docker.com/engine/admin/logging/overview/ + # Note: Set LogConfig using Environment Variables is not supported. + hostConfig: + NetworkMode: host + Dns: + # - 192.168.0.1 + LogConfig: + Type: json-file + Config: + max-size: "50m" + max-file: "5" + Memory: 2147483648 + +############################################################################### +# +# Chaincode section +# +############################################################################### +chaincode: + # The id is used by the Chaincode stub to register the executing Chaincode + # ID with the Peer and is generally supplied through ENV variables + # the `path` form of ID is provided when installing the chaincode. + # The `name` is used for all other requests and can be any string. + id: + path: + name: + + # Generic builder environment, suitable for most chaincode types + builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION) + + # Enables/disables force pulling of the base docker images (listed below) + # during user chaincode instantiation. + # Useful when using moving image tags (such as :latest) + pull: false + + golang: + # golang will never need more than baseos + runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION) + + # whether or not golang chaincode should be linked dynamically + dynamicLink: false + + java: + # This is an image based on java:openjdk-8 with addition compiler + # tools added for java shim layer packaging. + # This image is packed with shim layer libraries that are necessary + # for Java chaincode runtime. + runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION) + + node: + # This is an image based on node:$(NODE_VER)-alpine + runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION) + + # List of directories to treat as external builders and launchers for + # chaincode. The external builder detection processing will iterate over the + # builders in the order specified below. + # If you don't need to fallback to the default Docker builder, also unconfigure vm.endpoint above. + # To override this property via env variable use CORE_CHAINCODE_EXTERNALBUILDERS: [{name: x, path: dir1}, {name: y, path: dir2}] + # The path must be an absolute path. + externalBuilders: + - name: ccaas_builder + path: /opt/hyperledger/ccaas_builder + propagateEnvironment: + - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG + + # The maximum duration to wait for the chaincode build and install process + # to complete. + installTimeout: 300s + + # Timeout duration for starting up a container and waiting for Register + # to come through. + startuptimeout: 300s + + # Timeout duration for Invoke and Init calls to prevent runaway. + # This timeout is used by all chaincodes in all the channels, including + # system chaincodes. + # Note that during Invoke, if the image is not available (e.g. being + # cleaned up when in development environment), the peer will automatically + # build the image, which might take more time. In production environment, + # the chaincode image is unlikely to be deleted, so the timeout could be + # reduced accordingly. + executetimeout: 30s + + # There are 2 modes: "dev" and "net". + # In dev mode, user runs the chaincode after starting peer from + # command line on local machine. + # In net mode, peer will run chaincode in a docker container. + mode: net + + # keepalive in seconds. In situations where the communication goes through a + # proxy that does not support keep-alive, this parameter will maintain connection + # between peer and chaincode. + # A value <= 0 turns keepalive off + keepalive: 0 + + # enabled system chaincodes + system: + _lifecycle: enable + cscc: enable + lscc: enable + qscc: enable + + # Logging section for the chaincode container + logging: + # Default level for all loggers within the chaincode container + level: info + # Override default level for the 'shim' logger + shim: warning + # Format for the chaincode container logs + format: "%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" + +############################################################################### +# +# Ledger section - ledger configuration encompasses both the blockchain +# and the state +# +############################################################################### +ledger: + blockchain: + + state: + # stateDatabase - options are "goleveldb", "CouchDB" + # goleveldb - default state database stored in goleveldb. + # CouchDB - store state database in CouchDB + stateDatabase: goleveldb + # Limit on the number of records to return per query + totalQueryLimit: 100000 + couchDBConfig: + # It is recommended to run CouchDB on the same server as the peer, and + # not map the CouchDB container port to a server port in docker-compose. + # Otherwise proper security must be provided on the connection between + # CouchDB client (on the peer) and server. + couchDBAddress: 127.0.0.1:5984 + # This username must have read and write authority on CouchDB + username: + # The password is recommended to pass as an environment variable + # during start up (eg CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD). + # If it is stored here, the file must be access control protected + # to prevent unintended users from discovering the password. + password: + # Number of retries for CouchDB errors + maxRetries: 3 + # Number of retries for CouchDB errors during peer startup. + # The delay between retries doubles for each attempt. + # Default of 10 retries results in 11 attempts over 2 minutes. + maxRetriesOnStartup: 10 + # CouchDB request timeout (unit: duration, e.g. 20s) + requestTimeout: 35s + # Limit on the number of records per each CouchDB query + # Note that chaincode queries are only bound by totalQueryLimit. + # Internally the chaincode may execute multiple CouchDB queries, + # each of size internalQueryLimit. + internalQueryLimit: 1000 + # Limit on the number of records per CouchDB bulk update batch + maxBatchUpdateSize: 1000 + # Create the _global_changes system database + # This is optional. Creating the global changes database will require + # additional system resources to track changes and maintain the database + createGlobalChangesDB: false + # CacheSize denotes the maximum mega bytes (MB) to be allocated for the in-memory state + # cache. Note that CacheSize needs to be a multiple of 32 MB. If it is not a multiple + # of 32 MB, the peer would round the size to the next multiple of 32 MB. + # To disable the cache, 0 MB needs to be assigned to the cacheSize. + cacheSize: 64 + + history: + # enableHistoryDatabase - options are true or false + # Indicates if the history of key updates should be stored. + # All history 'index' will be stored in goleveldb, regardless if using + # CouchDB or alternate database for the state. + enableHistoryDatabase: true + + pvtdataStore: + # the maximum db batch size for converting + # the ineligible missing data entries to eligible missing data entries + collElgProcMaxDbBatchSize: 5000 + # the minimum duration (in milliseconds) between writing + # two consecutive db batches for converting the ineligible missing data entries to eligible missing data entries + collElgProcDbBatchesInterval: 1000 + # The missing data entries are classified into two categories: + # (1) prioritized + # (2) deprioritized + # Initially, all missing data are in the prioritized list. When the + # reconciler is unable to fetch the missing data from other peers, + # the unreconciled missing data would be moved to the deprioritized list. + # The reconciler would retry deprioritized missing data after every + # deprioritizedDataReconcilerInterval (unit: minutes). Note that the + # interval needs to be greater than the reconcileSleepInterval + deprioritizedDataReconcilerInterval: 60m + # The frequency to purge private data (in number of blocks). + # Private data is purged from the peer's private data store based on + # the collection property blockToLive or an explicit chaincode call to PurgePrivateData(). + purgeInterval: 100 + # Whether to log private data keys purged from private data store (INFO level) when explicitly purged via chaincode + purgedKeyAuditLogging: true + + snapshots: + # Path on the file system where peer will store ledger snapshots + # The path must be an absolute path. + rootDir: /var/hyperledger/production/snapshots + +############################################################################### +# +# Operations section +# +############################################################################### +operations: + # host and port for the operations server + listenAddress: 127.0.0.1:9443 + + # TLS configuration for the operations endpoint + tls: + # TLS enabled + enabled: false + + # path to PEM encoded server certificate for the operations server + # The paths in this section may be relative to FABRIC_CFG_PATH or an absolute path. + cert: + file: + + # path to PEM encoded server key for the operations server + key: + file: + + # most operations service endpoints require client authentication when TLS + # is enabled. clientAuthRequired requires client certificate authentication + # at the TLS layer to access all resources. + clientAuthRequired: false + + # paths to PEM encoded ca certificates to trust for client authentication + clientRootCAs: + files: [] + +############################################################################### +# +# Metrics section +# +############################################################################### +metrics: + # metrics provider is one of statsd, prometheus, or disabled + provider: disabled + + # statsd configuration + statsd: + # network type: tcp or udp + network: udp + + # statsd server address + address: 127.0.0.1:8125 + + # the interval at which locally cached counters and gauges are pushed + # to statsd; timings are pushed immediately + writeInterval: 10s + + # prefix is prepended to all emitted statsd metrics + prefix: diff --git a/backend/blockchain/network/config/crypto-config.yaml b/backend/blockchain/network/config/crypto-config.yaml new file mode 100644 index 0000000..381c1d6 --- /dev/null +++ b/backend/blockchain/network/config/crypto-config.yaml @@ -0,0 +1,81 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + +# --------------------------------------------------------------------------- +# "PeerOrgs" - Definition of organizations managing peer nodes +# --------------------------------------------------------------------------- +PeerOrgs: + # --------------------------------------------------------------------------- + # Org1 + # --------------------------------------------------------------------------- + - Name: Hospital + Domain: hospital.com + EnableNodeOUs: true + # --------------------------------------------------------------------------- + # "Specs" + # --------------------------------------------------------------------------- + # Uncomment this section to enable the explicit definition of hosts in your + # configuration. Most users will want to use Template, below + # + # Specs is an array of Spec entries. Each Spec entry consists of two fields: + # - Hostname: (Required) The desired hostname, sans the domain. + # - CommonName: (Optional) Specifies the template or explicit override for + # the CN. By default, this is the template: + # + # "{{.Hostname}}.{{.Domain}}" + # + # which obtains its values from the Spec.Hostname and + # Org.Domain, respectively. + # --------------------------------------------------------------------------- + # - Hostname: foo # implicitly "foo.org1.example.com" + # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above + # - Hostname: bar + # - Hostname: baz + # --------------------------------------------------------------------------- + # "Template" + # --------------------------------------------------------------------------- + # Allows for the definition of 1 or more hosts that are created sequentially + # from a template. By default, this looks like "peer%d" from 0 to Count-1. + # You may override the number of nodes (Count), the starting index (Start) + # or the template used to construct the name (Hostname). + # + # Note: Template and Specs are not mutually exclusive. You may define both + # sections and the aggregate nodes will be created for you. Take care with + # name collisions + # --------------------------------------------------------------------------- + Template: + # Ubah sesuai dengan jumlah node peer yang digunakan. + Count: 3 + SANS: + # List dari Subject Alternative Names (SANS) yang akan disertakan dalam sertifikat TLS + # untuk node peer. Ini dapat mencakup alamat IP, nama host, atau + # pengenal lain yang akan digunakan oleh node peer untuk berkomunikasi secara aman + - localhost + - "127.0.0.1" + - peer0.hospital.com + - peer1.hospital.com + - peer2.hospital.com + # Start: 5 + # Hostname: {{.Prefix}}{{.Index}} # default + # --------------------------------------------------------------------------- + # "Users" + # --------------------------------------------------------------------------- + # Count: The number of user accounts _in addition_ to Admin + # --------------------------------------------------------------------------- + Users: + Count: 1 + +# Ubah sesuai dengan jumlah node orderer yang digunakan dalam jaringan. +OrdererOrgs: + - Name: Orderer + Domain: hospital.com + Specs: + - Hostname: orderer + SANS: + # List dari Subject Alternative Names (SANS) yang akan disertakan dalam sertifikat TLS + # untuk node orderer. Ini dapat mencakup alamat IP, nama host, atau + # pengenal lain yang akan digunakan oleh node orderer untuk berkomunikasi secara aman + - "localhost" + - "hospital.com" diff --git a/backend/blockchain/network/deployChaincode.sh b/backend/blockchain/network/deployChaincode.sh new file mode 100755 index 0000000..64ae949 --- /dev/null +++ b/backend/blockchain/network/deployChaincode.sh @@ -0,0 +1,115 @@ +#!/bin/bash +set -euo pipefail + +# ----------------------------------------------------------------------------- +# Chaincode deployment helper based on chaincode.txt guide +# ----------------------------------------------------------------------------- +CHANNEL_NAME=${CHANNEL_NAME:-mychannel} +CC_NAME=${CC_NAME:-logVerification} +CC_VERSION=${CC_VERSION:-1.0} +CC_SEQUENCE=${CC_SEQUENCE:-1} +CC_LABEL="${CC_NAME}_${CC_VERSION}" +CC_SRC_PATH=${CC_SRC_PATH:-./chaincode/logVerification} +CLI_CONTAINER=${CLI_CONTAINER:-cli} +ORDERER_ADDRESS=${ORDERER_ADDRESS:-orderer.hospital.com:7050} +ORDERER_TLS_HOSTNAME=${ORDERER_TLS_HOSTNAME:-orderer.hospital.com} +ORG_ROOT=/opt/gopath/src/github.com/hyperledger/fabric/peer +ORDERER_CA=${ORDERER_CA:-${ORG_ROOT}/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem} +MSP_PATH=${MSP_PATH:-${ORG_ROOT}/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp} + +PEER0_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt +PEER1_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt +PEER2_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt + +PACKAGE_FILE=${CC_LABEL}.tar.gz + +info() { echo "[INFO] $*"; } +err() { echo "[ERROR] $*" >&2; } + +run_cli() { + docker exec "${CLI_CONTAINER}" bash -lc "$*" +} + +set_peer_env() { + local tls=$1 addr=$2 + echo "export CORE_PEER_TLS_ENABLED=true" + echo "export CORE_PEER_LOCALMSPID=HospitalMSP" + echo "export CORE_PEER_TLS_ROOTCERT_FILE=${tls}" + echo "export CORE_PEER_MSPCONFIGPATH=${MSP_PATH}" + echo "export CORE_PEER_ADDRESS=${addr}" +} + +create_channel_artifacts() { + info "Creating channel ${CHANNEL_NAME}" + run_cli "export ORDERER_CA=${ORDERER_CA}; \ + peer channel create -o ${ORDERER_ADDRESS} -c ${CHANNEL_NAME} -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile \$ORDERER_CA" + run_cli "export ORDERER_CA=${ORDERER_CA}; \ + peer channel fetch config ./channel-artifacts/config_block.pb -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} -c ${CHANNEL_NAME} --tls --cafile \$ORDERER_CA" +} + +join_peers() { + info "Joining peers to ${CHANNEL_NAME}" + run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" + run_cli "$(set_peer_env ${PEER1_TLS} peer1.hospital.com:8051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" + run_cli "$(set_peer_env ${PEER2_TLS} peer2.hospital.com:9051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" +} + +package_chaincode() { + info "Packaging chaincode ${CC_LABEL}" + run_cli "rm -f ${PACKAGE_FILE}" + run_cli "peer lifecycle chaincode package ${PACKAGE_FILE} --path ${CC_SRC_PATH} --lang node --label ${CC_LABEL}" +} + +install_chaincode() { + info "Installing package on peers" + run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" + run_cli "$(set_peer_env ${PEER1_TLS} peer1.hospital.com:8051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" + run_cli "$(set_peer_env ${PEER2_TLS} peer2.hospital.com:9051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" +} + +query_package_id() { + info "Querying installed chaincode for package ID" + PACKAGE_ID=$(docker exec "${CLI_CONTAINER}" bash -lc "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); peer lifecycle chaincode queryinstalled | grep 'Label: ${CC_LABEL}' | sed -n 's/^Package ID: \([^,]*\),.*/\1/p'") + if [[ -z ${PACKAGE_ID} ]]; then + err "Failed to find package ID for label ${CC_LABEL}" + exit 1 + fi + echo "PACKAGE_ID=${PACKAGE_ID}" +} + +approve_chaincode() { + info "Approving chaincode for HospitalMSP" + run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); \ + peer lifecycle chaincode approveformyorg -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --package-id ${PACKAGE_ID} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA}" +} + +check_commit_readiness() { + info "Checking commit readiness" + run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); \ + peer lifecycle chaincode checkcommitreadiness -o ${ORDERER_ADDRESS} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA} --output json" +} + +commit_chaincode() { + info "Committing chaincode definition" + run_cli "peer lifecycle chaincode commit -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA} --peerAddresses peer0.hospital.com:7051 --tlsRootCertFiles ${PEER0_TLS}" +} + +main() { + local CREATE_CHANNEL=${CREATE_CHANNEL:-false} + if [[ ${CREATE_CHANNEL} == "true" ]]; then + create_channel_artifacts + join_peers + fi + + package_chaincode + install_chaincode + query_package_id + approve_chaincode + check_commit_readiness + commit_chaincode + + info "Chaincode ${CC_NAME} (version ${CC_VERSION}, sequence ${CC_SEQUENCE}) deployed on ${CHANNEL_NAME}." + info "If this chaincode requires initialization, invoke with --isInit before normal use." +} + +main "$@" diff --git a/backend/blockchain/network/docker/.env b/backend/blockchain/network/docker/.env new file mode 100644 index 0000000..bf2af2a --- /dev/null +++ b/backend/blockchain/network/docker/.env @@ -0,0 +1,5 @@ +# POSTGRES_PASSWORD=password +# JWT_SECRET_KEY=masukkan_jwt_secret_dengan_format_SHA256 +# INITIAL_ADMIN_USER=masukkan_username_admin +# INITIAL_ADMIN_PASSWORD=masukkan_pasword_admin +# ENCRYPTION_KEY=masukkan_key_32byte \ No newline at end of file diff --git a/backend/blockchain/network/docker/docker-compose.yaml b/backend/blockchain/network/docker/docker-compose.yaml new file mode 100644 index 0000000..86cf8cb --- /dev/null +++ b/backend/blockchain/network/docker/docker-compose.yaml @@ -0,0 +1,150 @@ +networks: + hospital_net: + name: hospital_net + ipam: + driver: default + config: + - subnet: 172.20.0.0/16 + +services: + orderer.hospital.com: + container_name: orderer.hospital.com + image: hyperledger/fabric-orderer:2.5 + environment: + - FABRIC_LOGGING_SPEC=INFO + - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 + - ORDERER_GENERAL_LISTENPORT=7050 + - ORDERER_GENERAL_GENESISMETHOD=file + - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block + - ORDERER_GENERAL_LOCALMSPID=OrdererMSP + - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp + - ORDERER_GENERAL_TLS_ENABLED=true + - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key + - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt + - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] + - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1 + - ORDERER_KAFKA_VERBOSE=true + - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt + - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key + - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] + working_dir: /opt/gopath/src/github.com/hyperledger/fabric + command: orderer + volumes: + - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block + - ../organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp:/var/hyperledger/orderer/msp + - ../organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls:/var/hyperledger/orderer/tls + ports: + - 7050:7050 + networks: + hospital_net: + ipv4_address: 172.20.0.10 + + peer0.hospital.com: + container_name: peer0.hospital.com + image: hyperledger/fabric-peer:2.5 + environment: + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=hospital_net + - FABRIC_LOGGING_SPEC=INFO + - CORE_PEER_TLS_ENABLED=true + - CORE_PEER_PROFILE_ENABLED=true + - CORE_PEER_ID=peer0.hospital.com + - CORE_PEER_ADDRESS=peer0.hospital.com:7051 + - CORE_PEER_LISTENADDRESS=0.0.0.0:7051 + - CORE_PEER_CHAINCODEADDRESS=peer0.hospital.com:7052 + - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 + - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.hospital.com:7051 + - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.hospital.com:7051 + - CORE_PEER_LOCALMSPID=HospitalMSP + volumes: + - /var/run/:/host/var/run/ + - ../organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp:/etc/hyperledger/fabric/msp + - ../organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls:/etc/hyperledger/fabric/tls + ports: + - 7051:7051 + networks: + hospital_net: + ipv4_address: 172.20.0.11 + + peer1.hospital.com: + container_name: peer1.hospital.com + image: hyperledger/fabric-peer:2.5 + environment: + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=hospital_net + - FABRIC_LOGGING_SPEC=INFO + - CORE_PEER_TLS_ENABLED=true + - CORE_PEER_PROFILE_ENABLED=true + - CORE_PEER_ID=peer1.hospital.com + - CORE_PEER_ADDRESS=peer1.hospital.com:8051 + - CORE_PEER_LISTENADDRESS=0.0.0.0:8051 + - CORE_PEER_CHAINCODEADDRESS=peer1.hospital.com:7052 + - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 + - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.hospital.com:7051 # <-- Bootstrap ke peer0 + - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.hospital.com:8051 + - CORE_PEER_LOCALMSPID=HospitalMSP + volumes: + - /var/run/:/host/var/run/ + - ../organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp:/etc/hyperledger/fabric/msp + - ../organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls:/etc/hyperledger/fabric/tls + ports: + - 8051:8051 + networks: + hospital_net: + ipv4_address: 172.20.0.12 + + peer2.hospital.com: + container_name: peer2.hospital.com + image: hyperledger/fabric-peer:2.5 + environment: + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=hospital_net + - FABRIC_LOGGING_SPEC=INFO + - CORE_PEER_TLS_ENABLED=true + - CORE_PEER_PROFILE_ENABLED=true + - CORE_PEER_ID=peer2.hospital.com + - CORE_PEER_ADDRESS=peer2.hospital.com:9051 + - CORE_PEER_LISTENADDRESS=0.0.0.0:9051 + - CORE_PEER_CHAINCODEADDRESS=peer2.hospital.com:7052 + - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 + - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.hospital.com:7051 # <-- Bootstrap ke peer0 + - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2.hospital.com:9051 + - CORE_PEER_LOCALMSPID=HospitalMSP + volumes: + - /var/run/:/host/var/run/ + - ../organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp:/etc/hyperledger/fabric/msp + - ../organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls:/etc/hyperledger/fabric/tls + ports: + - 9051:9051 + networks: + hospital_net: + ipv4_address: 172.20.0.13 + + cli: + container_name: cli + image: hyperledger/fabric-tools:2.5 + tty: true + stdin_open: true + environment: + - GOPATH=/opt/gopath + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - FABRIC_LOGGING_SPEC=INFO + - CORE_PEER_TLS_ENABLED=true + - CORE_PEER_LOCALMSPID=HospitalMSP + - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt + - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp + - CORE_PEER_ADDRESS=peer0.hospital.com:7051 + working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer + command: /bin/bash + volumes: + - /var/run/:/host/var/run/ + - ../../chaincode:/opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode + - ../organizations:/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations + - ../channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts + depends_on: + - orderer.hospital.com + - peer0.hospital.com + - peer1.hospital.com + - peer2.hospital.com + networks: + - hospital_net diff --git a/backend/blockchain/network/network.sh b/backend/blockchain/network/network.sh new file mode 100755 index 0000000..55a7683 --- /dev/null +++ b/backend/blockchain/network/network.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +export COMPOSE_PROJECT_NAME=hospital +export IMAGE_TAG=latest + +function networkUp() { + docker compose -f ./docker/docker-compose.yaml up -d + echo "--- Network is up ---" +} + +function networkDown() { + docker compose -f ./docker/docker-compose.yaml down --volumes --remove-orphans + echo "--- Network is down ---" +} + +function createChannel() { + docker exec cli peer channel create -o orderer.hospital.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --outputBlock ./channel-artifacts/mychannel.block --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem + + # Join Peer 0 + docker exec -e CORE_PEER_LOCALMSPID="HospitalMSP" -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp -e CORE_PEER_ADDRESS=peer0.hospital.com:7051 cli peer channel join -b ./channel-artifacts/mychannel.block + + # Join Peer 1 + docker exec -e CORE_PEER_LOCALMSPID="HospitalMSP" -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp -e CORE_PEER_ADDRESS=peer1.hospital.com:8051 cli peer channel join -b ./channel-artifacts/mychannel.block + + # Join Peer 2 + docker exec -e CORE_PEER_LOCALMSPID="HospitalMSP" -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp -e CORE_PEER_ADDRESS=peer2.hospital.com:9051 cli peer channel join -b ./channel-artifacts/mychannel.block +} + +MODE=$1 +if [ "$MODE" == "up" ]; then + networkUp +elif [ "$MODE" == "down" ]; then + networkDown +elif [ "$MODE" == "createChannel" ]; then + createChannel +else + echo "Usage: ./network.sh [up|down|createChannel]" + exit 1 +fi \ No newline at end of file diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/ca.hospital.com-cert.pem new file mode 100644 index 0000000..0028d09 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQW6ZwqaAXjAJe9/QD9kmFDjAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2oP4J049hk9R2/JEyv4h5 +Ui0Iq6kNJKbxFXZwZNa2Jms8uxopqlE1mrwQQM4DgFF4P1jckzcIB7Z/k2qxzOwj +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIGIkuHV4DfHdyPjEPAvTLFsc +9Qm/WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0cAMEQCICAerWiu4ulFe1C+afnF +J0+iCEtp+tfm1lhoKC0s8hreAiB6eAJeOV0Y7BXNf3EomcBeZpdUW10WQPsy9Pk5 +dYcXUA== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/priv_sk b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/priv_sk new file mode 100644 index 0000000..9dec6be --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/ca/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgYFDSkvlA3Ef+oZUT +9LDbeafnrwEuv23OhxneaQbdBkChRANCAAR2oP4J049hk9R2/JEyv4h5Ui0Iq6kN +JKbxFXZwZNa2Jms8uxopqlE1mrwQQM4DgFF4P1jckzcIB7Z/k2qxzOwj +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/admincerts/Admin@hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/admincerts/Admin@hospital.com-cert.pem new file mode 100644 index 0000000..4687d79 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/admincerts/Admin@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICDjCCAbSgAwIBAgIRAK/mWLCDrmUfc3ucL5JBskswCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowVzELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xGzAZBgNVBAMMEkFkbWluQGhvc3BpdGFsLmNvbTBZMBMGByqGSM49AgEG +CCqGSM49AwEHA0IABChrfaeEb3icKPe7MEZr1KA9+zSsJoQ/EkikVDd1ahQl4++e +wXhGeGmqMBpZdt3CPLt1QL0QBR4hEl67R4e48kijTTBLMA4GA1UdDwEB/wQEAwIH +gDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIGIkuHV4DfHdyPjEPAvTLFsc9Qm/ +WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0gAMEUCIQCZ/vliKquBinrgGtU853mu +lEOIjJD1kbOKSwompWK3TQIgd04F2MqJiZ1hih+A2zrNflOmpO4iK9ThNHTT301J +WX0= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..0028d09 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQW6ZwqaAXjAJe9/QD9kmFDjAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2oP4J049hk9R2/JEyv4h5 +Ui0Iq6kNJKbxFXZwZNa2Jms8uxopqlE1mrwQQM4DgFF4P1jckzcIB7Z/k2qxzOwj +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIGIkuHV4DfHdyPjEPAvTLFsc +9Qm/WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0cAMEQCICAerWiu4ulFe1C+afnF +J0+iCEtp+tfm1lhoKC0s8hreAiB6eAJeOV0Y7BXNf3EomcBeZpdUW10WQPsy9Pk5 +dYcXUA== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/admincerts/Admin@hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/admincerts/Admin@hospital.com-cert.pem new file mode 100644 index 0000000..4687d79 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/admincerts/Admin@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICDjCCAbSgAwIBAgIRAK/mWLCDrmUfc3ucL5JBskswCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowVzELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xGzAZBgNVBAMMEkFkbWluQGhvc3BpdGFsLmNvbTBZMBMGByqGSM49AgEG +CCqGSM49AwEHA0IABChrfaeEb3icKPe7MEZr1KA9+zSsJoQ/EkikVDd1ahQl4++e +wXhGeGmqMBpZdt3CPLt1QL0QBR4hEl67R4e48kijTTBLMA4GA1UdDwEB/wQEAwIH +gDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIGIkuHV4DfHdyPjEPAvTLFsc9Qm/ +WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0gAMEUCIQCZ/vliKquBinrgGtU853mu +lEOIjJD1kbOKSwompWK3TQIgd04F2MqJiZ1hih+A2zrNflOmpO4iK9ThNHTT301J +WX0= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..0028d09 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQW6ZwqaAXjAJe9/QD9kmFDjAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2oP4J049hk9R2/JEyv4h5 +Ui0Iq6kNJKbxFXZwZNa2Jms8uxopqlE1mrwQQM4DgFF4P1jckzcIB7Z/k2qxzOwj +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIGIkuHV4DfHdyPjEPAvTLFsc +9Qm/WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0cAMEQCICAerWiu4ulFe1C+afnF +J0+iCEtp+tfm1lhoKC0s8hreAiB6eAJeOV0Y7BXNf3EomcBeZpdUW10WQPsy9Pk5 +dYcXUA== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..5afa90c --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgD2ZA+jFQ8/sFuKOy +MasGELTJXhdPz5la44nK+reGAjGhRANCAAQ6ocKy3b9sgjCtqTMCP/uPlhi6aIlw +WMCTl3Lz9JkeVxXSUkMxWSp9OJm3K2pUjLYVX7ejsxtpdOE0Fz2EBPLN +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/signcerts/orderer.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/signcerts/orderer.hospital.com-cert.pem new file mode 100644 index 0000000..bd9994e --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/signcerts/orderer.hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICDzCCAbagAwIBAgIRAM4e/huh2ZN60YAq9dgBS84wCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowWTELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xHTAbBgNVBAMTFG9yZGVyZXIuaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEOqHCst2/bIIwrakzAj/7j5YYumiJcFjAk5dy8/SZHlcV +0lJDMVkqfTiZtytqVIy2FV+3o7MbaXThNBc9hATyzaNNMEswDgYDVR0PAQH/BAQD +AgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgYiS4dXgN8d3I+MQ8C9MsWxz1 +Cb9YqOZAcNyl4QIfldEwCgYIKoZIzj0EAwIDRwAwRAIgCrzzx19oifglBEZIvhSb +DjdhiCjPGiNqJrtedc5+2GICIBWTwSCEO/q8QwDSUQFq/mK4pBYeFISsy6Dm3hyv +G2/+ +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/ca.crt new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt new file mode 100644 index 0000000..94ae52d --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.crt @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICdTCCAhygAwIBAgIQYDtqEAPMqf8gukEP32ywlDAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBZMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEdMBsGA1UEAxMUb3JkZXJlci5ob3NwaXRhbC5jb20wWTATBgcqhkjO +PQIBBggqhkjOPQMBBwNCAARJkiv9loBDyZ33XbOg8M0WZKdH+ba8WT9ZuMunUOV/ +wVqgP4BN6c7MDQYYG4OKBFdYc1SLsOdkoIkL+5C2TpUio4GwMIGtMA4GA1UdDwEB +/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/ +BAIwADArBgNVHSMEJDAigCB4uFjXRwZ+5UV8aDiFqcuCmzNBGC82vYYbKIYG57bh +mjBBBgNVHREEOjA4ghRvcmRlcmVyLmhvc3BpdGFsLmNvbYIHb3JkZXJlcoIJbG9j +YWxob3N0ggxob3NwaXRhbC5jb20wCgYIKoZIzj0EAwIDRwAwRAIgPtxsJped+dgp +2rSTE3pjE9ZgUvOcOm0wGZPV4otYW7YCIAPhKu82z5/po4U/Zh9kFCY6rEiaug1b +DKDvjzVArk+i +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.key b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.key new file mode 100644 index 0000000..e23df78 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/ARTlMcxKEEhlMxA +TQVjBmsRRKiqobEPOSN/uI8GBi2hRANCAARJkiv9loBDyZ33XbOg8M0WZKdH+ba8 +WT9ZuMunUOV/wVqgP4BN6c7MDQYYG4OKBFdYc1SLsOdkoIkL+5C2TpUi +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/priv_sk b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/priv_sk new file mode 100644 index 0000000..babbef6 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgPhMkXhdQyGjzneZf +XQqXqIfXtjfWHST73Gu438vXgeqhRANCAASHs8anhwHeyHd4brPA5IPcLBlg70Yf +pVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3b/uWZfAW +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/admincerts/Admin@hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/admincerts/Admin@hospital.com-cert.pem new file mode 100644 index 0000000..4687d79 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/admincerts/Admin@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICDjCCAbSgAwIBAgIRAK/mWLCDrmUfc3ucL5JBskswCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowVzELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xGzAZBgNVBAMMEkFkbWluQGhvc3BpdGFsLmNvbTBZMBMGByqGSM49AgEG +CCqGSM49AwEHA0IABChrfaeEb3icKPe7MEZr1KA9+zSsJoQ/EkikVDd1ahQl4++e +wXhGeGmqMBpZdt3CPLt1QL0QBR4hEl67R4e48kijTTBLMA4GA1UdDwEB/wQEAwIH +gDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIGIkuHV4DfHdyPjEPAvTLFsc9Qm/ +WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0gAMEUCIQCZ/vliKquBinrgGtU853mu +lEOIjJD1kbOKSwompWK3TQIgd04F2MqJiZ1hih+A2zrNflOmpO4iK9ThNHTT301J +WX0= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..0028d09 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQW6ZwqaAXjAJe9/QD9kmFDjAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2oP4J049hk9R2/JEyv4h5 +Ui0Iq6kNJKbxFXZwZNa2Jms8uxopqlE1mrwQQM4DgFF4P1jckzcIB7Z/k2qxzOwj +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIGIkuHV4DfHdyPjEPAvTLFsc +9Qm/WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0cAMEQCICAerWiu4ulFe1C+afnF +J0+iCEtp+tfm1lhoKC0s8hreAiB6eAJeOV0Y7BXNf3EomcBeZpdUW10WQPsy9Pk5 +dYcXUA== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..d3d23fe --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNDSkX+blUZWH93Ho +zGD9hWiBT/boL5P2e2aX7fYE1iehRANCAAQoa32nhG94nCj3uzBGa9SgPfs0rCaE +PxJIpFQ3dWoUJePvnsF4RnhpqjAaWXbdwjy7dUC9EAUeIRJeu0eHuPJI +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem new file mode 100644 index 0000000..4687d79 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICDjCCAbSgAwIBAgIRAK/mWLCDrmUfc3ucL5JBskswCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowVzELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xGzAZBgNVBAMMEkFkbWluQGhvc3BpdGFsLmNvbTBZMBMGByqGSM49AgEG +CCqGSM49AwEHA0IABChrfaeEb3icKPe7MEZr1KA9+zSsJoQ/EkikVDd1ahQl4++e +wXhGeGmqMBpZdt3CPLt1QL0QBR4hEl67R4e48kijTTBLMA4GA1UdDwEB/wQEAwIH +gDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIGIkuHV4DfHdyPjEPAvTLFsc9Qm/ +WKjmQHDcpeECH5XRMAoGCCqGSM49BAMCA0gAMEUCIQCZ/vliKquBinrgGtU853mu +lEOIjJD1kbOKSwompWK3TQIgd04F2MqJiZ1hih+A2zrNflOmpO4iK9ThNHTT301J +WX0= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt new file mode 100644 index 0000000..9547753 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICRjCCAe2gAwIBAgIQMwWpJ4ejuY9l/O28y47bVzAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASHs8anhwHeyHd4 +brPA5IPcLBlg70YfpVSyYXttHAB8p7cIX6NzJt15TvJwu2BfeLewjDtSXA2kqtC3 +b/uWZfAWo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIG +CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHi4WNdHBn7lRXxo +OIWpy4KbM0EYLza9hhsohgbntuGaMAoGCCqGSM49BAMCA0cAMEQCIH8+y8Q134Gt +SMcUetKrqrpFLD1cmweyhh72PJskhV5/AiAtG7ZUBL+QTeoi2vnTm5V931UR+Rsd +XRb6eWYOpeFWRg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt new file mode 100644 index 0000000..d3ef24e --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICLzCCAdWgAwIBAgIQe7GKXAvB/0RLi8cG5pwQvjAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBXMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEbMBkGA1UEAwwSQWRtaW5AaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAED3R/6kg1RJooq9pE5WSe309YGez499NC6Q2233qtde+p +Vx7Y1mU+BngGDg6qEcm5jPt3AZ/lReGt2Kk59KgHuKNsMGowDgYDVR0PAQH/BAQD +AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA +MCsGA1UdIwQkMCKAIHi4WNdHBn7lRXxoOIWpy4KbM0EYLza9hhsohgbntuGaMAoG +CCqGSM49BAMCA0gAMEUCIQClB6GEZss+mfxLfyjndDAsNnwZIY0sTm+8MXEo/sOx +MQIgEejkLd1/CFzxUoKIAjhIffufsKVhaRTij9lHwBrUy6g= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key new file mode 100644 index 0000000..495bbd0 --- /dev/null +++ b/backend/blockchain/network/organizations/ordererOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgvpxkslG5HZI0fAhR +0TXMV97rPHYohdTsGlfSYjfHN6mhRANCAAQPdH/qSDVEmiir2kTlZJ7fT1gZ7Pj3 +00LpDbbfeq1176lXHtjWZT4GeAYODqoRybmM+3cBn+VF4a3YqTn0qAe4 +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/priv_sk new file mode 100644 index 0000000..4cc8b42 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/ca/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2kwHcYJUJ7oHbSlm +/2Koc1xt6RB5o0nKJNcMSb7kcIehRANCAATIigu5i2LnUdYr/S2YC9AsJhjFrXQC +mSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..dcc733a --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgg77lfA99A7OmI7bT +Qo4ZW5av+cpH7uokB+qL96t9eGOhRANCAARrYrhVWDHfkxDAvD7q0Qr3gX/8wvAL +k/R/acLIhAAfD65JbSJMHs2w/WpwHnIyIDlXpAGuWsX1S8iMTeMtP+OG +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/signcerts/peer0.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/signcerts/peer0.hospital.com-cert.pem new file mode 100644 index 0000000..c955c87 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/signcerts/peer0.hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICHTCCAcOgAwIBAgIRAJi7Frowz9TbFBH79/hpWbYwCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowZjELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xDTALBgNVBAsTBHBlZXIxGzAZBgNVBAMTEnBlZXIwLmhvc3BpdGFsLmNv +bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtiuFVYMd+TEMC8PurRCveBf/zC +8AuT9H9pwsiEAB8PrkltIkwezbD9anAecjIgOVekAa5axfVLyIxN4y0/44ajTTBL +MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIIkMxsxI +8VsKJogFPSdKak9z++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0gAMEUCIQCl +Uf3N8F+lrcnnFvikX2uHs/KH75DlWHbxJoBJ7ai4oQIgUx7gewxurP+Wx+JNQqrz +V8zwA1wm4EnwfOpIDisF+jg= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.crt new file mode 100644 index 0000000..a475d6b --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpDCCAkqgAwIBAgIQb0W21UMZpFkblXQ60HX5rjAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBXMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEbMBkGA1UEAxMScGVlcjAuaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEprW1SI4IulrzQ818Tgpsa7y2NMHO15ApbL9wjeyJuSos ++gBNHzUqN+PEz4mI7/mS2j4qAcaIiVLrZj7yjkL7CqOB4DCB3TAOBgNVHQ8BAf8E +BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC +MAAwKwYDVR0jBCQwIoAgXzCjTLNyKWRo9gwAT3tfoy8BxBr2knXrM/sjDmr7vTow +cQYDVR0RBGowaIIScGVlcjAuaG9zcGl0YWwuY29tggVwZWVyMIIJbG9jYWxob3N0 +ghJwZWVyMC5ob3NwaXRhbC5jb22CEnBlZXIxLmhvc3BpdGFsLmNvbYIScGVlcjIu +aG9zcGl0YWwuY29thwR/AAABMAoGCCqGSM49BAMCA0gAMEUCIQDVJcPthHbVnJAa +24Qypnm7ENLuMqo2hoam58IsHLt0HwIgCDtWtXYJsmYwpi+6JYPa1NoHWARje8lt ++8mQmCtSm1c= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.key b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.key new file mode 100644 index 0000000..4bf11b9 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaHNDQ85FC1jSvPKA +dHRZz6kFyZoVMoR5MkJt8nQbj8ehRANCAASmtbVIjgi6WvNDzXxOCmxrvLY0wc7X +kClsv3CN7Im5Kiz6AE0fNSo348TPiYjv+ZLaPioBxoiJUutmPvKOQvsK +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..ab8405d --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgzGBT3anTXStu86ju +BCIDGm2G+SeH30af2nQeEdWuLaKhRANCAARfR4n+P7IQIuChln6SpcnV34ZGId7l +DfriFg0w1eSCsfPyU6FZoQVb35Vgvi/OhCI+vbKiAHgxJFPtm2xAKiy1 +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/signcerts/peer1.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/signcerts/peer1.hospital.com-cert.pem new file mode 100644 index 0000000..6d64a70 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/signcerts/peer1.hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICHDCCAcOgAwIBAgIRAIrl3qhzDSVM4wIorHf2aUwwCgYIKoZIzj0EAwIwazEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEYMBYGA1UEAxMPY2EuaG9z +cGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowZjELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu +Y2lzY28xDTALBgNVBAsTBHBlZXIxGzAZBgNVBAMTEnBlZXIxLmhvc3BpdGFsLmNv +bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABF9Hif4/shAi4KGWfpKlydXfhkYh +3uUN+uIWDTDV5IKx8/JToVmhBVvflWC+L86EIj69sqIAeDEkU+2bbEAqLLWjTTBL +MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIIkMxsxI +8VsKJogFPSdKak9z++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIC5L +zaqfrOGKn9ilsiLaW2yUCf6SKXFtScU+I8v6RnUGAiBYAeVRkz1USU40Bru9Kpz7 +5qKdDCdEGGVAzVWq+OJmKw== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.crt new file mode 100644 index 0000000..5ff3a05 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkqgAwIBAgIQBMT6520mXab8k70zsb9LGTAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBXMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEbMBkGA1UEAxMScGVlcjEuaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEPzqCTsNDoKsyUxSkTnp00SAuMsDw5bQaAIEiUFkDlNUh +XE6JkhWGbkKQ/UGUVypxatA0I0mrG7CcsXcQSSqe1KOB4DCB3TAOBgNVHQ8BAf8E +BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC +MAAwKwYDVR0jBCQwIoAgXzCjTLNyKWRo9gwAT3tfoy8BxBr2knXrM/sjDmr7vTow +cQYDVR0RBGowaIIScGVlcjEuaG9zcGl0YWwuY29tggVwZWVyMYIJbG9jYWxob3N0 +ghJwZWVyMC5ob3NwaXRhbC5jb22CEnBlZXIxLmhvc3BpdGFsLmNvbYIScGVlcjIu +aG9zcGl0YWwuY29thwR/AAABMAoGCCqGSM49BAMCA0cAMEQCIHi7kh+pbCzdpTpO +Fqj03dh05XrWc/o53AG/+1FJXrMxAiB4pMORPxz/Ew3Ro470cSiuZXeIGM6VWdw0 +MstyqrhBlg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.key b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.key new file mode 100644 index 0000000..fdf66a7 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgoXVksNj43L20RjMj +807+tIkTPi6fj2jLinDbUs0EuWOhRANCAAQ/OoJOw0OgqzJTFKROenTRIC4ywPDl +tBoAgSJQWQOU1SFcTomSFYZuQpD9QZRXKnFq0DQjSasbsJyxdxBJKp7U +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..84296f0 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgitvB9obBLXABTpkm +tlvP2xR6QSLGUEg7KRzZD1Zlb+6hRANCAAR45jYHDm7UUvYHPum7sywe48VVXaX0 +V66/IitCjB+wEdhQcR7xUXWKM97FP3qWuxvBZYmQuqgpGdqYgtbF2SVg +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/signcerts/peer2.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/signcerts/peer2.hospital.com-cert.pem new file mode 100644 index 0000000..9535827 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/signcerts/peer2.hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICHDCCAcKgAwIBAgIQZJlhQ2QHKszWsSdXAQ+0iDAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBmMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzENMAsGA1UECxMEcGVlcjEbMBkGA1UEAxMScGVlcjIuaG9zcGl0YWwuY29t +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeOY2Bw5u1FL2Bz7pu7MsHuPFVV2l +9FeuvyIrQowfsBHYUHEe8VF1ijPexT96lrsbwWWJkLqoKRnamILWxdklYKNNMEsw +DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgiQzGzEjx +WwomiAU9J0pqT3P7484Sr2Cx7a57JF0ZUCYwCgYIKoZIzj0EAwIDSAAwRQIhALIk +iorT1/TsR0L7Gn7Od1VEHVlbK4hUWXbEgqz9B1NRAiBQx25OMZfQM0+j1slQwYgE +TexwSa8LfFPPVyKfc6m02Q== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.crt new file mode 100644 index 0000000..73a711a --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkqgAwIBAgIQXQ74jH1BzgHXY5rLZ1I1kjAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBXMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEbMBkGA1UEAxMScGVlcjIuaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEGTblvwD42JFnHOhcqhiURkJftIvLMUpZkvm0OL8yWga/ +gC8t4/y+gIvuMh/6BTbzn9Z+biOueNcQG4wrrH8gNqOB4DCB3TAOBgNVHQ8BAf8E +BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC +MAAwKwYDVR0jBCQwIoAgXzCjTLNyKWRo9gwAT3tfoy8BxBr2knXrM/sjDmr7vTow +cQYDVR0RBGowaIIScGVlcjIuaG9zcGl0YWwuY29tggVwZWVyMoIJbG9jYWxob3N0 +ghJwZWVyMC5ob3NwaXRhbC5jb22CEnBlZXIxLmhvc3BpdGFsLmNvbYIScGVlcjIu +aG9zcGl0YWwuY29thwR/AAABMAoGCCqGSM49BAMCA0cAMEQCIGnUbAf13PqwKCH3 +nmXiwV3A3C4DAagIgK9nZP/yx0PyAiB5bTh0n/jUF2CSUEM0BRbzdc18dr4PpwZp +SF1K/M/w8g== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.key b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.key new file mode 100644 index 0000000..cc068a2 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgZ3LcIMhnQi5ePQxf +S3M6DAFDgF7OZ7Vfn9MaPm9EzIWhRANCAAQZNuW/APjYkWcc6FyqGJRGQl+0i8sx +SlmS+bQ4vzJaBr+ALy3j/L6Ai+4yH/oFNvOf1n5uI6541xAbjCusfyA2 +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/priv_sk new file mode 100644 index 0000000..2ca7cb5 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgoVEf3rgW6VAU+YyX +9VWzV3A3j7Xny3Ocle5O5t7IXfOhRANCAAQhLioviC0bZPkHnhWvYknsfszYTPI6 +tHO+qBfcVY2uX+nePVqVtxppBkY9C1myeW0kfcww0gjdWCZtb3Ty+Hbz +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/tlsca/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..2d54bd2 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgODqNG6TwR3fMr+/t +2erZ/Tt6ktP/GCOj+wsHYCPePZmhRANCAAS61IjWC5N6DRw3oIK3YNmDXQ7RSKTq +jXaQDrOG6lM38kyX0aGD4X1zQTRpyMYmAVwnouJho+r4vBEmsn6UTPH4 +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem new file mode 100644 index 0000000..1dd3e87 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/signcerts/Admin@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICHDCCAcOgAwIBAgIQc+9MnxWtqXor5rIR2iqnmjAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBnMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEOMAwGA1UECxMFYWRtaW4xGzAZBgNVBAMMEkFkbWluQGhvc3BpdGFsLmNv +bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLrUiNYLk3oNHDeggrdg2YNdDtFI +pOqNdpAOs4bqUzfyTJfRoYPhfXNBNGnIxiYBXCei4mGj6vi8ESayfpRM8fijTTBL +MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIIkMxsxI +8VsKJogFPSdKak9z++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCICT5 +SqFFu0DYa+XgRh/rQcUxCO8CjPYojPcFchQKWihbAiBedQMSDCZIrDg05K06zeb9 +20m26WsC4o4Cto/Vgb3jXg== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt new file mode 100644 index 0000000..e15e1d9 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICLjCCAdWgAwIBAgIQNYYZp17kShX+8+3rdUrCvTAKBggqhkjOPQQDAjBuMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRswGQYDVQQDExJ0bHNjYS5o +b3NwaXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBXMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEbMBkGA1UEAwwSQWRtaW5AaG9zcGl0YWwuY29tMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEVmir973L9xuUn6jKbF9oJl5a8in1XiEZ4ZaMYaskvuyq +eAlZYNV587AfxZBbCx8KkI55PE5EJ3pHBWUnwWZuxKNsMGowDgYDVR0PAQH/BAQD +AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA +MCsGA1UdIwQkMCKAIF8wo0yzcilkaPYMAE97X6MvAcQa9pJ16zP7Iw5q+706MAoG +CCqGSM49BAMCA0cAMEQCIFzm6/e65scfutyFQ0ZoKjDr5gP77c8eCqgAIhWahSFE +AiAE/SaHXImOVqMdW1M5qg0zJONS0o1tCDOIuqUytsB7Ng== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key new file mode 100644 index 0000000..4e9ce29 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/tls/client.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtGvEELyGxbF1bPr5 +VUE4do7vTo8p/gn6m0ITH5JhMY+hRANCAARWaKv3vcv3G5SfqMpsX2gmXlryKfVe +IRnhloxhqyS+7Kp4CVlg1XnzsB/FkFsLHwqQjnk8TkQnekcFZSfBZm7E +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/cacerts/ca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/cacerts/ca.hospital.com-cert.pem new file mode 100644 index 0000000..de6ab21 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/cacerts/ca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQDCCAeegAwIBAgIQH0YqnsCA7grqaNkTpbBY6DAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBrMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3NwaXRh +bC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATIigu5i2LnUdYr/S2YC9As +JhjFrXQCmSOAe6WfY+l9sk9Kfd0U0D4Alxf72s6oTHUyz9AKiSEliJD63isElZ0W +o20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF +BwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIIkMxsxI8VsKJogFPSdKak9z +++POEq9gse2ueyRdGVAmMAoGCCqGSM49BAMCA0cAMEQCIAyUMuN2wzgKS6oIQ4Sw +Fsk7vC5XQbSzSCKl7+m3+QlQAiASzYtDzLPYYe6OtMmvcFigFmCYutEhlnY88/2O +gO2YhQ== +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/config.yaml b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/config.yaml new file mode 100644 index 0000000..2671f77 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/config.yaml @@ -0,0 +1,14 @@ +NodeOUs: + Enable: true + ClientOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: client + PeerOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: peer + AdminOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: admin + OrdererOUIdentifier: + Certificate: cacerts/ca.hospital.com-cert.pem + OrganizationalUnitIdentifier: orderer diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/keystore/priv_sk b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/keystore/priv_sk new file mode 100644 index 0000000..9a06327 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/keystore/priv_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgKPXn/wARWjz90BJJ +4POaBd5ar+XWK2ICkVze2K9vqCqhRANCAARfQ1T3Y/t8G6s8MyY18M3XUY9tNgTn +NrvEVKDxw8YbA+gD5SYEgzqbHjmS4QKW4vKxSvKkmR/qqsg7q52ay7B8 +-----END PRIVATE KEY----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/signcerts/User1@hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/signcerts/User1@hospital.com-cert.pem new file mode 100644 index 0000000..6055e16 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/signcerts/User1@hospital.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICHTCCAcSgAwIBAgIQDBIMemV3MZCp+NiLpCAxczAKBggqhkjOPQQDAjBrMQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEVMBMGA1UEChMMaG9zcGl0YWwuY29tMRgwFgYDVQQDEw9jYS5ob3Nw +aXRhbC5jb20wHhcNMjUxMTAzMDg0MjAwWhcNMzUxMTAxMDg0MjAwWjBoMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEPMA0GA1UECxMGY2xpZW50MRswGQYDVQQDDBJVc2VyMUBob3NwaXRhbC5j +b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARfQ1T3Y/t8G6s8MyY18M3XUY9t +NgTnNrvEVKDxw8YbA+gD5SYEgzqbHjmS4QKW4vKxSvKkmR/qqsg7q52ay7B8o00w +SzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCCJDMbM +SPFbCiaIBT0nSmpPc/vjzhKvYLHtrnskXRlQJjAKBggqhkjOPQQDAgNHADBEAiBZ +dbRZRjDoh1/iqIRPmMUSp5Vtz4KOt68ZYnDykGw4wgIgTEaHqWUOvUbyzTNCG0c/ +TIMnUdO3ItszSgH33bmA+1U= +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/ca.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/ca.crt new file mode 100644 index 0000000..1601beb --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe6gAwIBAgIRAKGluYd28isXUJzCGMxHZV4wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIS4qL4gtG2T5 +B54Vr2JJ7H7M2EzyOrRzvqgX3FWNrl/p3j1albcaaQZGPQtZsnltJH3MMNII3Vgm +bW908vh286NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCBfMKNMs3IpZGj2 +DABPe1+jLwHEGvaSdesz+yMOavu9OjAKBggqhkjOPQQDAgNIADBFAiB4C9RpAU4s +nuqX4hvOeyoXukChN7kh9gbOB3tVB0mtaAIhAM27SDfOwCN/Wa5p8ph2UR1tFVeO +hcjBpSsxFF/vXfay +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.crt b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.crt new file mode 100644 index 0000000..0d82e92 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICMDCCAdagAwIBAgIRAPPkM8u6o4NxgB6VUAp7dT8wCgYIKoZIzj0EAwIwbjEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFTATBgNVBAoTDGhvc3BpdGFsLmNvbTEbMBkGA1UEAxMSdGxzY2Eu +aG9zcGl0YWwuY29tMB4XDTI1MTEwMzA4NDIwMFoXDTM1MTEwMTA4NDIwMFowVzEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xGzAZBgNVBAMMElVzZXIxQGhvc3BpdGFsLmNvbTBZMBMGByqGSM49 +AgEGCCqGSM49AwEHA0IABHraA1bpyGdxzifWrqPTOZ6gPl+mkQPe9gb2pmlKR7c+ +Mm0H3GuEDaN1+C2y62ll8ABBt0qEGlXlYRUvxhC7/Q2jbDBqMA4GA1UdDwEB/wQE +AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw +ADArBgNVHSMEJDAigCBfMKNMs3IpZGj2DABPe1+jLwHEGvaSdesz+yMOavu9OjAK +BggqhkjOPQQDAgNIADBFAiEA3OYUSHwwvRqqB6BBeAeSHR+9AcHbGmFIoSgEOeu1 +ioYCIFKCrUgeywEZJXk/bUYYHx86v03lJVR2EMSkfyIEQZ/o +-----END CERTIFICATE----- diff --git a/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.key b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.key new file mode 100644 index 0000000..2bff4d8 --- /dev/null +++ b/backend/blockchain/network/organizations/peerOrganizations/hospital.com/users/User1@hospital.com/tls/client.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgrP5pL3WiPqPR2o7R +/Mnkd89STw+xtsGQTbE/QjRHic+hRANCAAR62gNW6chncc4n1q6j0zmeoD5fppED +3vYG9qZpSke3PjJtB9xrhA2jdfgtsutpZfAAQbdKhBpV5WEVL8YQu/0N +-----END PRIVATE KEY----- diff --git a/frontend/hospital-log/.gitignore b/frontend/hospital-log/.gitignore index 1e81c07..0f5be34 100644 --- a/frontend/hospital-log/.gitignore +++ b/frontend/hospital-log/.gitignore @@ -23,3 +23,4 @@ dist-ssr *.njsproj *.sln *.sw? +.test_script \ No newline at end of file diff --git a/frontend/hospital-log/src/components/dashboard/ButtonDark.vue b/frontend/hospital-log/src/components/dashboard/ButtonDark.vue new file mode 100644 index 0000000..75a2c38 --- /dev/null +++ b/frontend/hospital-log/src/components/dashboard/ButtonDark.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/frontend/hospital-log/src/components/dashboard/DataTable.vue b/frontend/hospital-log/src/components/dashboard/DataTable.vue index 72c5d7a..94e3d50 100644 --- a/frontend/hospital-log/src/components/dashboard/DataTable.vue +++ b/frontend/hospital-log/src/components/dashboard/DataTable.vue @@ -1,4 +1,6 @@ diff --git a/frontend/hospital-log/src/components/dashboard/FieldInput.vue b/frontend/hospital-log/src/components/dashboard/FieldInput.vue new file mode 100644 index 0000000..0b4c486 --- /dev/null +++ b/frontend/hospital-log/src/components/dashboard/FieldInput.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/frontend/hospital-log/src/components/dashboard/Sidebar.vue b/frontend/hospital-log/src/components/dashboard/Sidebar.vue index c4f9e6f..c2770bf 100644 --- a/frontend/hospital-log/src/components/dashboard/Sidebar.vue +++ b/frontend/hospital-log/src/components/dashboard/Sidebar.vue @@ -21,6 +21,12 @@ const navigateTo = (routeName: string) => { }; const isActive = (routeName: string) => { + if (route.name === "rekam-medis-details" && routeName === "rekam-medis") { + return true; + } + if (route.name === "pemberian-obat-details" && routeName === "obat") { + return true; + } return route.name === routeName; }; @@ -133,12 +139,12 @@ const isActive = (routeName: string) => {