@icure/api 8.2.3 → 8.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/icc-api/api/IccAuthApi.js +1 -1
- package/icc-api/api/IccAuthApi.js.map +1 -1
- package/icc-api/api/IccDocumentApi.js.map +1 -1
- package/icc-api/api/IccFormApi.js.map +1 -1
- package/icc-api/api/IccReceiptApi.js.map +1 -1
- package/icc-api/api/IccRestApiPath.js +1 -2
- package/icc-api/api/IccRestApiPath.js.map +1 -1
- package/icc-api/api/XHR.js +17 -8
- package/icc-api/api/XHR.js.map +1 -1
- package/icc-api/model/Address.js +1 -1
- package/icc-api/model/Address.js.map +1 -1
- package/icc-api/model/Amp.js +1 -1
- package/icc-api/model/Amp.js.map +1 -1
- package/icc-api/model/AmpComponent.js +1 -1
- package/icc-api/model/AmpComponent.js.map +1 -1
- package/icc-api/model/Ampp.js +1 -1
- package/icc-api/model/Ampp.js.map +1 -1
- package/icc-api/model/AmppComponent.js +1 -1
- package/icc-api/model/AmppComponent.js.map +1 -1
- package/icc-api/model/CareTeamMember.js +1 -1
- package/icc-api/model/CareTeamMember.js.map +1 -1
- package/icc-api/model/CareTeamMembership.js +1 -1
- package/icc-api/model/CareTeamMembership.js.map +1 -1
- package/icc-api/model/Code.js +1 -1
- package/icc-api/model/Code.js.map +1 -1
- package/icc-api/model/Contact.js.map +1 -1
- package/icc-api/model/Content.js.map +1 -1
- package/icc-api/model/DataOwnerTypeEnum.js +1 -1
- package/icc-api/model/DataOwnerTypeEnum.js.map +1 -1
- package/icc-api/model/DataOwnerWithType.js +1 -1
- package/icc-api/model/DataOwnerWithType.js.map +1 -1
- package/icc-api/model/DatabaseSynchronization.js +1 -1
- package/icc-api/model/DatabaseSynchronization.js.map +1 -1
- package/icc-api/model/Dmpp.js +1 -1
- package/icc-api/model/Dmpp.js.map +1 -1
- package/icc-api/model/Document.js +1 -1
- package/icc-api/model/Document.js.map +1 -1
- package/icc-api/model/DocumentTemplate.d.ts +1 -1
- package/icc-api/model/DocumentTemplate.js +1 -1
- package/icc-api/model/DocumentTemplate.js.map +1 -1
- package/icc-api/model/Editor.js +1 -1
- package/icc-api/model/Editor.js.map +1 -1
- package/icc-api/model/EfactInvoice.js +1 -1
- package/icc-api/model/EfactInvoice.js.map +1 -1
- package/icc-api/model/EmailOrSmsMessage.js +1 -1
- package/icc-api/model/EmailOrSmsMessage.js.map +1 -1
- package/icc-api/model/FlatRateTarification.js +1 -1
- package/icc-api/model/FlatRateTarification.js.map +1 -1
- package/icc-api/model/Formula.js +1 -1
- package/icc-api/model/Formula.js.map +1 -1
- package/icc-api/model/FrontEndMigration.js +1 -1
- package/icc-api/model/FrontEndMigration.js.map +1 -1
- package/icc-api/model/HealthElement.js +1 -1
- package/icc-api/model/HealthElement.js.map +1 -1
- package/icc-api/model/HealthcareParty.js +1 -1
- package/icc-api/model/HealthcareParty.js.map +1 -1
- package/icc-api/model/HealthcarePartyHistoryStatus.js +1 -1
- package/icc-api/model/HealthcarePartyHistoryStatus.js.map +1 -1
- package/icc-api/model/Ingredient.js +1 -1
- package/icc-api/model/Ingredient.js.map +1 -1
- package/icc-api/model/Invoice.js +1 -1
- package/icc-api/model/Invoice.js.map +1 -1
- package/icc-api/model/InvoiceItem.js +1 -1
- package/icc-api/model/InvoiceItem.js.map +1 -1
- package/icc-api/model/InvoicingCode.js +1 -1
- package/icc-api/model/InvoicingCode.js.map +1 -1
- package/icc-api/model/MaintenanceTask.js +1 -1
- package/icc-api/model/MaintenanceTask.js.map +1 -1
- package/icc-api/model/Measure.js.map +1 -1
- package/icc-api/model/MedicalHouseContract.js +1 -1
- package/icc-api/model/MedicalHouseContract.js.map +1 -1
- package/icc-api/model/ModelHelper.js +9 -10
- package/icc-api/model/ModelHelper.js.map +1 -1
- package/icc-api/model/Partnership.js +1 -1
- package/icc-api/model/Partnership.js.map +1 -1
- package/icc-api/model/Patient.js +1 -1
- package/icc-api/model/Patient.js.map +1 -1
- package/icc-api/model/PatientByHcPartyGenderEducationProfession.js +1 -1
- package/icc-api/model/PatientByHcPartyGenderEducationProfession.js.map +1 -1
- package/icc-api/model/PatientHealthCareParty.js +1 -1
- package/icc-api/model/PatientHealthCareParty.js.map +1 -1
- package/icc-api/model/Payment.js +1 -1
- package/icc-api/model/Payment.js.map +1 -1
- package/icc-api/model/PermissionCriterion.js +1 -1
- package/icc-api/model/PermissionCriterion.js.map +1 -1
- package/icc-api/model/PermissionItem.js +1 -1
- package/icc-api/model/PermissionItem.js.map +1 -1
- package/icc-api/model/PersonName.js +1 -1
- package/icc-api/model/PersonName.js.map +1 -1
- package/icc-api/model/PropertyTypeStub.js +1 -1
- package/icc-api/model/PropertyTypeStub.js.map +1 -1
- package/icc-api/model/Reimbursement.js +1 -1
- package/icc-api/model/Reimbursement.js.map +1 -1
- package/icc-api/model/RoleSourceEnum.js +1 -1
- package/icc-api/model/RoleSourceEnum.js.map +1 -1
- package/icc-api/model/SecureDelegation.js +1 -1
- package/icc-api/model/SecureDelegation.js.map +1 -1
- package/icc-api/model/Service.js.map +1 -1
- package/icc-api/model/StandardSubstance.js +1 -1
- package/icc-api/model/StandardSubstance.js.map +1 -1
- package/icc-api/model/SumehrValidity.js +1 -1
- package/icc-api/model/SumehrValidity.js.map +1 -1
- package/icc-api/model/Tarification.js +1 -1
- package/icc-api/model/Tarification.js.map +1 -1
- package/icc-api/model/Telecom.js +1 -1
- package/icc-api/model/Telecom.js.map +1 -1
- package/icc-api/model/Topic.js +1 -1
- package/icc-api/model/Topic.js.map +1 -1
- package/icc-api/model/TypedValueObject.js +1 -1
- package/icc-api/model/TypedValueObject.js.map +1 -1
- package/icc-api/model/User.js +1 -1
- package/icc-api/model/User.js.map +1 -1
- package/icc-api/model/UserTypeEnum.js +1 -1
- package/icc-api/model/UserTypeEnum.js.map +1 -1
- package/icc-api/model/VirtualIngredient.js +1 -1
- package/icc-api/model/VirtualIngredient.js.map +1 -1
- package/icc-api/model/internal/RecoveryData.js +1 -1
- package/icc-api/model/internal/RecoveryData.js.map +1 -1
- package/icc-api/model/requests/EntityBulkShareResult.js.map +1 -1
- package/icc-api/model/requests/EntityShareOrMetadataUpdateRequest.js.map +1 -1
- package/icc-api/model/requests/EntityShareRequest.js +1 -1
- package/icc-api/model/requests/EntityShareRequest.js.map +1 -1
- package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js +1 -1
- package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js.map +1 -1
- package/icc-x-api/auth/AuthenticationProvider.js.map +1 -1
- package/icc-x-api/auth/BasicAuthService.js.map +1 -1
- package/icc-x-api/auth/EnsembleAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.d.ts +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.js +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtUtils.js +3 -4
- package/icc-x-api/auth/JwtUtils.js.map +1 -1
- package/icc-x-api/auth/NoAuthService.js.map +1 -1
- package/icc-x-api/auth/SmartAuthProvider.d.ts +1 -1
- package/icc-x-api/auth/SmartAuthProvider.js +1 -1
- package/icc-x-api/auth/SmartAuthProvider.js.map +1 -1
- package/icc-x-api/crypto/AES.js.map +1 -1
- package/icc-x-api/crypto/AccessControlKeysHeadersProvider.js.map +1 -1
- package/icc-x-api/crypto/AccessControlSecretUtils.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.js +10 -10
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeKeysManager.js +4 -4
- package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/CryptoStrategies.d.ts +5 -7
- package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.js +7 -8
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataMapManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeKeysManager.js +1 -1
- package/icc-x-api/crypto/ExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +11 -10
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/HMACUtils.js.map +1 -1
- package/icc-x-api/crypto/KeyRecovery.js +5 -5
- package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +3 -3
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -1
- package/icc-x-api/crypto/RSA.js +4 -4
- package/icc-x-api/crypto/RSA.js.map +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
- package/icc-x-api/crypto/SecretIdUseOption.js +1 -1
- package/icc-x-api/crypto/SecretIdUseOption.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsEncryption.js +4 -4
- package/icc-x-api/crypto/SecureDelegationsEncryption.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js +9 -9
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
- package/icc-x-api/crypto/ShareMetadataBehaviour.js +1 -1
- package/icc-x-api/crypto/ShareMetadataBehaviour.js.map +1 -1
- package/icc-x-api/crypto/TransferKeysManager.js +1 -1
- package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
- package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -2
- package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
- package/icc-x-api/crypto/shamir.d.ts +2 -2
- package/icc-x-api/crypto/shamir.js +4 -4
- package/icc-x-api/crypto/shamir.js.map +1 -1
- package/icc-x-api/crypto/utils.js +14 -15
- package/icc-x-api/crypto/utils.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.js +10 -10
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.js +7 -7
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-classification-x-api.js +5 -5
- package/icc-x-api/icc-classification-x-api.js.map +1 -1
- package/icc-x-api/icc-code-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.js +12 -12
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-data-owner-x-api.js.map +1 -1
- package/icc-x-api/icc-device-x-api.js +2 -2
- package/icc-x-api/icc-device-x-api.js.map +1 -1
- package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.js +15 -15
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.js +7 -7
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-hcparty-x-api.js +4 -4
- package/icc-x-api/icc-hcparty-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.js +10 -10
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-icure-maintenance-x-api.js.map +1 -1
- package/icc-x-api/icc-invoice-x-api.js +7 -7
- package/icc-x-api/icc-invoice-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.js +7 -7
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.js +8 -8
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.js +11 -11
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.js +10 -10
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/icc-recovery-x-api.js +4 -4
- package/icc-x-api/icc-recovery-x-api.js.map +1 -1
- package/icc-x-api/icc-time-table-x-api.js +5 -5
- package/icc-x-api/icc-time-table-x-api.js.map +1 -1
- package/icc-x-api/icc-topic-x-api.js +9 -9
- package/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/icc-x-api/icc-user-x-api.js +4 -4
- package/icc-x-api/icc-user-x-api.js.map +1 -1
- package/icc-x-api/index.js +22 -22
- package/icc-x-api/index.js.map +1 -1
- package/icc-x-api/maintenance/KeyPairUpdateRequest.js +2 -2
- package/icc-x-api/maintenance/KeyPairUpdateRequest.js.map +1 -1
- package/icc-x-api/storage/IcureStorageFacade.js +1 -1
- package/icc-x-api/storage/IcureStorageFacade.js.map +1 -1
- package/icc-x-api/storage/LocalStorageImpl.js +1 -1
- package/icc-x-api/storage/LocalStorageImpl.js.map +1 -1
- package/icc-x-api/utils/EntityWithDelegationTypeName.js +4 -4
- package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
- package/icc-x-api/utils/asn1-packer.js +2 -3
- package/icc-x-api/utils/asn1-packer.js.map +1 -1
- package/icc-x-api/utils/asn1-parser.js +1 -2
- package/icc-x-api/utils/asn1-parser.js.map +1 -1
- package/icc-x-api/utils/binary-utils.js +11 -11
- package/icc-x-api/utils/binary-utils.js.map +1 -1
- package/icc-x-api/utils/code-util.js +1 -2
- package/icc-x-api/utils/code-util.js.map +1 -1
- package/icc-x-api/utils/collection-utils.js +5 -6
- package/icc-x-api/utils/collection-utils.js.map +1 -1
- package/icc-x-api/utils/crypto-utils.d.ts +1 -1
- package/icc-x-api/utils/crypto-utils.js +17 -18
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/icc-x-api/utils/formatting-util.js +21 -21
- package/icc-x-api/utils/formatting-util.js.map +1 -1
- package/icc-x-api/utils/functional-util.js +3 -4
- package/icc-x-api/utils/functional-util.js.map +1 -1
- package/icc-x-api/utils/graph-utils.js +3 -4
- package/icc-x-api/utils/graph-utils.js.map +1 -1
- package/icc-x-api/utils/hcp-util.js +4 -4
- package/icc-x-api/utils/hcp-util.js.map +1 -1
- package/icc-x-api/utils/insurability-util.js +6 -7
- package/icc-x-api/utils/insurability-util.js.map +1 -1
- package/icc-x-api/utils/lru-temporised-async-cache.js.map +1 -1
- package/icc-x-api/utils/net-utils.js +3 -4
- package/icc-x-api/utils/net-utils.js.map +1 -1
- package/icc-x-api/utils/person-util.js +3 -4
- package/icc-x-api/utils/person-util.js.map +1 -1
- package/icc-x-api/utils/proxy-utils.js.map +1 -1
- package/icc-x-api/utils/simple-lru-cache.js.map +1 -1
- package/icc-x-api/utils/uuid-encoder.js +2 -2
- package/icc-x-api/utils/uuid-encoder.js.map +1 -1
- package/icc-x-api/utils/websocket.d.ts +0 -1
- package/icc-x-api/utils/websocket.js +3 -3
- package/icc-x-api/utils/websocket.js.map +1 -1
- package/package.json +3 -3
- package/test/icc-api/api/IccAgendaApi.js.map +1 -1
- package/test/icc-api/api/IccCalendarItemApi.js.map +1 -1
- package/test/icc-api/api/IccCalendarItemTypeApi.js +2 -2
- package/test/icc-api/api/IccCalendarItemTypeApi.js.map +1 -1
- package/test/icc-api/api/IccDocumentApi.js.map +1 -1
- package/test/icc-api/api/IccKeywordApi.js.map +1 -1
- package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -1
- package/test/icc-api/api/IccPlaceApi.js.map +1 -1
- package/test/icc-api/api/IccUserApi.js +6 -6
- package/test/icc-x-api/auth/group-switch-test.js.map +1 -1
- package/test/icc-x-api/auth/jwt-concurrency-test.js +1 -2
- package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -1
- package/test/icc-x-api/auth/jwt-provider-test.js.map +1 -1
- package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -1
- package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
- package/test/icc-x-api/confidential-entities-test.js +1 -1
- package/test/icc-x-api/confidential-entities-test.js.map +1 -1
- package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -1
- package/test/icc-x-api/crud/entities-crud-test-interface.js +24 -24
- package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.js +2 -2
- package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
- package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +4 -4
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/full-crypto-test.js +5 -5
- package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +7 -7
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/shamir.js.map +1 -1
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js +3 -3
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -1
- package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
- package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js +4 -4
- package/test/icc-x-api/icc-message-x-api.js +1 -1
- package/test/icc-x-api/icc-message-x-api.js.map +1 -1
- package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -1
- package/test/icc-x-api/icc-recovery-x-api.js.map +1 -1
- package/test/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
- package/test/icc-x-api/patient-user.js.map +1 -1
- package/test/icc-x-api/test-legacy-data-support.js.map +1 -1
- package/test/icc-x-api/utils/graph-test.js.map +1 -1
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -1
- package/test/support/CSM-243.js +2 -2
- package/test/support/CSM-243.js.map +1 -1
- package/test/support/CSM-93.js +1 -1
- package/test/support/CSM-93.js.map +1 -1
- package/test/utils/FakeDataOwnerApi.js.map +1 -1
- package/test/utils/FakeEncryptionKeysManager.js +2 -2
- package/test/utils/FakeEncryptionKeysManager.js.map +1 -1
- package/test/utils/FakeExchangeDataApi.js.map +1 -1
- package/test/utils/FakeExchangeDataManager.js.map +1 -1
- package/test/utils/FakeGenericApi.js.map +1 -1
- package/test/utils/TestApi.js +2 -2
- package/test/utils/TestApi.js.map +1 -1
- package/test/utils/TestCryptoStrategies.js.map +1 -1
- package/test/utils/TestStorage.js +2 -2
- package/test/utils/TestStorage.js.map +1 -1
- package/test/utils/test_utils.js +22 -22
- package/test/utils/test_utils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA6B;AAC7B,iCAA8B;AAC9B,uDAAoI;AACpI,mCAAkC;AAClC,4BAAyB;AACzB,kDAAwG;AACxG,sDAAkD;AAClD,4DAAwD;AAExD,4EAAwE;AACxE,+BAAiC;AACjC,iDAA6C;AAE7C,kGAA8F;AAC9F,8GAA0G;AAC1G,8FAA0F;AAC1F,2FAAuF;AAEvF,4BAA2B;AAC3B,mDAAmE;AACnE,8EAA0E;AAE1E,gFAA4E;AAE5E,6GAAyG;AACzG,IAAO,aAAa,GAAG,sBAAS,CAAC,aAAa,CAAA;AAC9C,IAAO,uBAAuB,GAAG,uCAAkB,CAAC,uBAAuB,CAAA;AAC3E,IAAO,eAAe,GAAG,mCAAgB,CAAC,eAAe,CAAA;AAEzD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAA;AACrD,MAAM,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAA;AAEnD,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AAKtB,MAAM,gBAAgB,GAAqC;IACzD,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,WAAW,EAAE,WAAW,CAAC;CAC3B,CAAA;AACD,IAAI,GAAa,CAAA;AACjB,IAAI,SAAe,CAAA;AACnB,IAAI,UAAgB,CAAA;AACpB,MAAM,UAAU,GAAG,IAAI,+BAAmB,CAAC,kBAAgB,CAAC,CAAA;AAE5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,cAAM,EAAC;;YACL,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACrB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;YACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YAClD,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;YACpC,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;QACvD,CAAC;KAAA,CAAC,CAAA;IAEF,SAAe,gBAAgB,CAAC,QAAuB;;YACrD,MAAM,SAAS,GACb,QAAQ,KAAK,UAAU;gBACrB,CAAC,CAAC,MAAM,SAAS,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,iCAAe,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpI,CAAC,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAC9C,UAAU,EACV,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,iBAAO,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CACrH,CAAA;YACP,MAAM,KAAK,GAAG,IAAA,SAAI,GAAE,CAAA;YACpB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,CAC7C,IAAI,WAAI,CAAC;gBACP,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAA,yBAAY,GAAE;gBACrB,MAAM,EAAE,QAAQ;gBAChB,iBAAiB,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;gBACrE,SAAS,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;aAC/D,CAAC,CACH,CAAA;YACD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EAAE,IAAA,SAAI,GAAE,CAAC,CAAA;YAC7D,OAAO;gBACL,GAAG,EAAE,MAAM,IAAA,iBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,kBAAgB,CAAC;gBAC7D,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAG,EAAE;aACnD,CAAA;QACH,CAAC;KAAA;IAED,SAAe,qBAAqB,CAAC,IAAU,EAAE,WAAmB,EAAE,UAAwC;;YAC5G,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YACzF,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAA;aACtB;iBAAM;gBACL,OAAO,CAAC,WAAW,CAAC,CAAA;aACrB;QACH,CAAC;KAAA;IAED,SAAe,wBAAwB,CAAC,gBAA0B,EAAE,mBAAyB,EAAE,oBAA8B;;YAC3H,MAAM,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;YAC7C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAM,EAAE,gBAAgB,CAAC,EAAE,EAAE,kBAAgB,EAAE,UAAU,EAAE;gBAC1H,8BAA8B,EAAE,KAAK;aACtC,CAAC,CAAA;YACF,MAAM,MAAM,CAAC,uBAAuB,CAAC,mCAAmC,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE;gBAC1G,qCAAiB,CAAC,OAAO;gBACzB,qCAAiB,CAAC,GAAG;aACtB,CAAC,CAAA;YACF,MAAM,mBAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACjD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,WAAW,EAAE,wCAA4B,CAAC,eAAe,CAAC,CAAA;YAClJ,MAAM,qBAAqB,GAAG,MAAM,SAAS;iBAC1C,MAAM,CAAC,CAAO,GAAG,EAAE,QAAQ,EAAE,EAAE;gBAC9B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAA;gBAC5B,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,kBAAkB,CAAC,gCAAgC,CAC9F,oBAAoB,CAAC,IAAI,EACzB,SAAS,EACT,SAAS,EACT,IAAI,uDAA0B,CAAC;oBAC7B,MAAM,EAAE,IAAI,+DAA8B,CAAC;wBACzC,IAAI,EAAE,gBAAgB;wBACtB,iBAAiB,EAAE,QAAQ;qBAC5B,CAAC;iBACH,CAAC,CACH,CAAA;gBACD,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC,IAAK,CAAC,CAAA;YAC7C,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,CAAC,EAAuB,CAAC,CAAC;iBAC3C,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2CAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACrH,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;YACzF,MAAM,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACpC,OAAO,MAAM,CAAA;QACf,CAAC;KAAA;IAED,SAAe,kBAAkB,CAC/B,WAAiB,EACjB,WAAqB,EACrB,YAAsB;;YAEtB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAC9D,UAAU,EACV,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,iBAAO,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAC3I,CAAA;YACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YACxE,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;YAC/I,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACzC,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE;gBACnH,oBAAoB,EAAE,UAAU;aACjC,CAAC,CAAA;YACF,MAAM,cAAc,GAAoB,EAAE,CAAA;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,2BAA2B,CAC3E,WAAW,CAAC,IAAI,EAChB,MAAM,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAC9H,CAAA;gBACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;gBACrI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;aAC9B;YACD,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YAChD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE;gBAC/B,IAAA,aAAM,EAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;aACpC;YACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAA;QACrD,CAAC;KAAA;IAED,SAAe,sBAAsB,CAAC,IAAU,EAAE,QAA+D;;YAC/G,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;YAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAA;YACpF,IAAA,aAAM,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,wCAA4B,CAAC,aAAa,CAAC,CAAA;YACzI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YACrE,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1C,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CACtC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,QAAQ,EAAE,EAAE;gBAC7C,MAAM,UAAU,GAAG,MAAM,GAAG,CAAA;gBAC5B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAClG,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC,CAAA;YACvC,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,CAAC,EAAqB,CAAC,CAAC,EAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CACZ,CAAA;YACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YAC/E,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,cAAc,EAAE;gBAChD,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC/E,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,WAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;aACpD;QACH,CAAC;KAAA;IAED,SAAe,eAAe,CAC5B,gBAAwH,EACxH,4BAAwE,EACxE,qCAA8C;;YAE9C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAA;YACzH,IAAA,aAAM,EAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;YACtG,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,EAAE;gBACvF,IAAA,aAAM,EAAC,gBAAgB,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;aACvF;QACH,CAAC;KAAA;IAED,EAAE,CAAC,8JAA8J,EAAE,GAAS,EAAE;QAC5K,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD;;WAEG;QACH,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK,EAAE,EACtD,KAAK,CACN,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H;;WAEG;QACH,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD;;;;WAIG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,qKAAqK,EAAE,GAAS,EAAE;QACnL,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA,CAAC,uCAAuC;QAC5K,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,MAAM,GAAY,MAAM,SAAS,CAAC,UAAU,CAAC,aAAa,CAC5D,MAAM,SAAS,CAAC,UAAU,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CACrG,CAAA;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACjI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG;YACrB,6EAA6E;YAC7E,CAAC,UAAU,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YACtD,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SAC1D,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzG,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC1G,MAAM,eAAe,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IAClH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oIAAoI,EAAE,GAAS,EAAE;QAClJ,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC3H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H;;;;WAIG;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpF,CAAA;QACD;;;;;WAKG;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACpF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnF,CAAA;QACD;;;;WAIG;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAS,EAAE;QAC9E,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,MAAM,GAAiB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,6BAA6B,CAChG,SAAS,CAAC,UAAU,EACpB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC5G,CAAA,CAAC,8DAA8D;QAChE,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5I,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC9F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,CACzC,CAAA;QACD,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG;YACrB,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAChE,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAC/D,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SAC1D,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACxH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IACvH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,uGAAuG,EAAE,GAAS,EAAE;QACrH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACvD,CAAA;QACD,MAAM,yBAAyB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QACpI,MAAM,uBAAuB,GAAG,MAAM,yBAAyB,CAAC,mBAAmB,CACjF,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,EAAE,EACjE,EAAE,CACH,CAAA;QACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,2CAA2C;QAC7F,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;QAC5D,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;QAC3D,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAE,CAAC,CAAC,CAAC,CAAA;QACzI,IAAA,aAAM,EAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAClD,IAAA,aAAM,EAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QAC9C,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACnF,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oFAAoF,EAAE,GAAS,EAAE;QAClG,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,OAAO,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,IAAI,OAAO,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EACpE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IACjH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,qIAAqI,EAAE,GAAS,EAAE;QACnJ,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,IAAI,MAAM,GAAiB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,KAAK,CAAC,QAAQ,CAAC,IAAI,EACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CACjG,CAAA;QACD,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACpF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACxD,CAAA;QACD,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAC1F,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,KAAK,SAAS,CACtG,CAAC,CAAC,CAAC,CAAA;QACL,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAC/C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QAC3C,MAAM,gBAAgB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QAC3H,MAAM,wCAAwC,GAAG,CAAC,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpI,IAAA,aAAM,EAAC,wCAAwC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QACpE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACpH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACzD,CAAA;QACD,MAAM,uCAAuC,GAAG,CAAC,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACnI,IAAA,aAAM,EAAC,uCAAuC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QACnE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnH,IAAA,aAAM,EAAC,uCAAuC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wCAAwC,CAAC,GAAG,CAAC,CAAA;IAC5G,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,GAAS,EAAE;QACzF,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,4FAA4F;QAC5F,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,IAAI,CACL,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,uIAAuI,EAAE,GAAS,EAAE;QACrJ,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,uBAAuB;QACvB,IAAI,MAAM,GAAiB,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,6BAA6B,CAC/F,SAAS,CAAC,SAAS,EACnB,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC1G,CAAA;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,kCAAkC;QAClC,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC9F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,kBAAkB;QAClB,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,uBAAuB;QACvB,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC7F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAC/D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACxH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,mBAAmB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QACxI,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAE,CAAC,CAAC,CAAC,CAAA;QACnI,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAC5C,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QACxC,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9I,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,uCAAuC;IACrF,CAAC,CAAA,CAAC,CAAA;IAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,EAAE;QACzD,EAAE,CAAC,wEAAwE,aAAa,KAAK,YAAY,GAAG,EAAE,GAAS,EAAE;YACvH,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;YAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;YACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;YACpG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACtD,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,mGAAmG,aAAa,KAAK,YAAY,GAAG,EAAE;;gBACvI,IAAI,aAAa,IAAI,YAAY,IAAI,aAAa,IAAI,UAAU,EAAE;oBAChE,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;oBAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;oBACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpG,MAAM,+BAA+B,GAAG,MAAM,wBAAwB,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;oBAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACpD,MAAM,sBAAsB,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAA;iBACpE;qBAAM;oBACL,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;iBAC3D;YACH,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+FAA+F,aAAa,KAAK,YAAY,GAAG,EAAE;;gBACnI,IAAI,aAAa,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,EAAE;oBAC/D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;oBAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;oBACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpG,MAAM,8BAA8B,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;oBACpI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;oBAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACpD,MAAM,sBAAsB,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;iBACnE;qBAAM;oBACL,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;iBAC3D;YACH,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessage(\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessage(\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptoTest.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/cryptoTest.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccPatientApi } from '../../../icc-api'\nimport 'isomorphic-fetch'\nimport { expect, use as chaiUse } from 'chai'\nimport 'mocha'\n\nimport { Patient } from '../../../icc-api/model/Patient'\nimport {\n createHcpHierarchyApis,\n createNewHcpApi,\n getEnvironmentInitializer,\n hcp1Username,\n isLiteTest,\n setLocalStorage,\n TestUtils,\n} from '../../utils/test_utils'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider, EntityWithDelegationTypeName } from '../../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { SecretIdUseOption } from '../../../icc-x-api/crypto/SecretIdUseOption'\nimport UseAnyConfidential = SecretIdUseOption.UseAnyConfidential\n\nchaiUse(require('chai-as-promised'))\n\nlet env: TestVars\n\nsetLocalStorage(fetch)\n\ndescribe('Create a patient from scratch', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should create a patient in the database', async () => {\n const api = await initApi(env, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n\n const note = 'A secured note that is encrypted'\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(\n user,\n new Patient({\n lastName: 'Biden',\n firstName: 'Joe',\n note,\n })\n )\n )\n expect(patient.note).to.equal(note)\n\n console.log(\n `Created patient (decrypted): ${patient.id}: ${patient.firstName} ${patient.lastName} [note:${patient.note}, encryptedSelf:${patient.encryptedSelf}]`\n )\n\n const fetched = await api.patientApi.getPatientWithUser(user, patient.id)\n console.log(\n `Fetched patient (decrypted): ${fetched.id}: ${fetched.firstName} ${fetched.lastName} [note:${fetched.note}, encryptedSelf:${fetched.encryptedSelf}]`\n )\n expect(fetched.id).to.equal(patient.id)\n expect(fetched.note).to.equal(note)\n\n const fetchedWithoutDecryption = await new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password),\n fetch as any\n ).getPatient(patient.id)\n\n console.log(\n `Fetched patient (encrypted):${fetchedWithoutDecryption.id}: ${fetchedWithoutDecryption.firstName} ${fetchedWithoutDecryption.lastName} [note: ${fetchedWithoutDecryption.note}]`\n )\n expect(fetchedWithoutDecryption.id).to.equal(patient.id)\n expect(fetchedWithoutDecryption.note).to.be.undefined\n })\n})\n\ndescribe('Init confidential delegation in patient', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should return a patient with a confidential delegation', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const note = 'Some note'\n const pat = await childApi.patientApi.createPatientWithUser(\n childUser,\n await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe', note })\n )\n\n // All parents and siblings should have access to the decrypted data and to the initial secret id\n expect(await childApi.patientApi.decryptSecretIdsOf(pat)).to.have.length(1)\n expect((await childApi.patientApi.getPatientWithUser(childUser, pat.id)).note).to.equal(note)\n const originalSecretId = (await childApi.patientApi.decryptSecretIdsOf(pat))[0]\n for (const { api, user } of others) {\n expect(await api.patientApi.decryptSecretIdsOf(pat)).to.have.length(1)\n expect((await api.patientApi.decryptSecretIdsOf(pat))[0]).to.equal(originalSecretId)\n expect((await api.patientApi.getPatientWithUser(user, pat.id)).note).to.equal(note)\n }\n\n // Initially there shouldn't be any secret confidential secret id\n expect(await childApi.patientApi.decryptConfidentialSecretIdsOf(pat)).to.be.empty\n\n // Now create a confidential delegation\n const patWithConfidential = await childApi.patientApi.initConfidentialSecretId(pat, childUser)\n\n // Confidential secret id should be different from the original secret id\n const confidentialDelegationKeys = await childApi.patientApi.decryptConfidentialSecretIdsOf(patWithConfidential)\n const nonConfidentialDelegationKeys = await childApi.patientApi.decryptNonConfidentialSecretIdsOf(patWithConfidential)\n expect(confidentialDelegationKeys).to.have.length(1)\n expect(nonConfidentialDelegationKeys).to.have.length(1)\n expect(confidentialDelegationKeys[0]).to.not.equal(nonConfidentialDelegationKeys)\n expect(nonConfidentialDelegationKeys[0]).to.equal(originalSecretId)\n\n // Child has access to confidential and not confidential secret ids.\n const childSecretIds = await childApi.patientApi.decryptSecretIdsOf(patWithConfidential)\n expect(childSecretIds).to.have.length(2)\n expect(childSecretIds).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(childSecretIds).to.have.contain(confidentialDelegationKeys[0])\n\n // All parents and siblings should have access to the decrypted data even after initialising confidential delegations...\n expect((await childApi.patientApi.getPatientWithUser(childUser, pat.id)).note).to.equal(note)\n for (const { api, user } of others) {\n expect((await api.patientApi.getPatientWithUser(user, pat.id)).note).to.equal(note)\n }\n\n // ...but not to the confidential secret id\n for (const { api } of others) {\n const secretIds = await api.patientApi.decryptSecretIdsOf(patWithConfidential)\n expect(secretIds).to.have.length(1)\n expect(secretIds).to.contain(nonConfidentialDelegationKeys[0])\n }\n\n // If a secret delegation is already available there is no need to create a new one\n const patWithConfidentialAgain = await childApi.patientApi.initConfidentialSecretId(patWithConfidential, childUser)\n expect(patWithConfidentialAgain.rev).to.equal(patWithConfidentialAgain.rev)\n expect(await childApi.patientApi.decryptSecretIdsOf(patWithConfidentialAgain)).to.have.length(2)\n\n // Different users will have different confidential secret ids...\n expect(await child2Api.patientApi.decryptConfidentialSecretIdsOf(patWithConfidential)).to.be.empty\n const patWithMoreConfidentialIds = await child2Api.patientApi.initConfidentialSecretId(patWithConfidential, child2User)\n\n // ...child continues to know the same secret ids...\n const childSecretIdsRepeat = await childApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)\n expect(childSecretIdsRepeat).to.have.length(2)\n expect(childSecretIdsRepeat).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(childSecretIdsRepeat).to.have.contain(confidentialDelegationKeys[0])\n\n // ...but child2 now also knows a different secret id...\n const child2secretIds = await child2Api.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)\n const child2confidential = await child2Api.patientApi.decryptConfidentialSecretIdsOf(patWithMoreConfidentialIds)\n expect(child2confidential).to.have.length(1)\n expect(child2confidential[0]).to.not.equal(confidentialDelegationKeys[0])\n expect(child2confidential[0]).to.not.equal(nonConfidentialDelegationKeys[0])\n expect(child2secretIds).to.have.length(2)\n expect(child2secretIds).to.contain(nonConfidentialDelegationKeys[0])\n expect(child2secretIds).to.contain(child2confidential[0])\n\n // ...and their parents still don't know them\n expect(await grandApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.length(1)\n expect(await grandApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(await parentApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.length(1)\n expect(await parentApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.contain(nonConfidentialDelegationKeys[0])\n })\n})\n\ndescribe('Test that contact information can be decrypted', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should return a contact with decrypted information', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const allApis = [\n { api: childApi, user: childUser },\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.createPatientWithUser(\n childUser,\n await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n )\n const idFlat = childApi.cryptoApi.primitives.randomUuid()\n const idCompound = childApi.cryptoApi.primitives.randomUuid()\n const idSalut = childApi.cryptoApi.primitives.randomUuid()\n const idAtoi = childApi.cryptoApi.primitives.randomUuid()\n const instance = await childApi.contactApi.newInstance(childUser, pat, {\n services: [\n {\n id: idFlat,\n content: { fr: { stringValue: 'Salut' }, nl: { stringValue: 'Halo' } },\n },\n {\n id: idCompound,\n content: {\n fr: {\n compoundValue: [\n { id: idSalut, content: { fr: { stringValue: 'Salut' } } },\n { id: idAtoi, content: { fr: { stringValue: 'à toi' } } },\n ],\n },\n },\n },\n ],\n })\n const created = await childApi.contactApi.createContactWithUser(childUser, instance)\n const createdFlat = created!.services!.find((x) => x.id === idFlat)!\n const createdCompound = created!.services!.find((x) => x.id === idCompound)!\n const createdSalut = createdCompound.content!.fr.compoundValue!.find((x) => x.id === idSalut)!\n const createdAtoi = createdCompound.content!.fr.compoundValue!.find((x) => x.id === idAtoi)!\n\n for (const { api, user } of allApis) {\n console.log('Trying with user: ' + user.login)\n const check = await api.contactApi.getContactWithUser(user, created!.id!)\n const checkFlat = check!.services!.find((x) => x.id == idFlat)!\n const checkCompound = check!.services!.find((x) => x.id == idCompound)!\n const checkSalut = checkCompound.content!.fr.compoundValue!.find((x) => x.id === idSalut)!\n const checkAtoi = checkCompound.content!.fr.compoundValue!.find((x) => x.id === idAtoi)!\n\n expect(checkFlat).to.not.be.undefined\n expect(checkFlat).to.not.be.null\n expect(checkSalut).to.not.be.undefined\n expect(checkSalut).to.not.be.null\n expect(checkAtoi).to.not.be.undefined\n expect(checkAtoi).to.not.be.null\n\n expect(checkFlat.content!.fr.stringValue).to.equal(createdFlat!.content!.fr.stringValue)\n expect(checkFlat.content!.nl.stringValue).to.equal(createdFlat!.content!.nl.stringValue)\n expect(checkFlat.content!.encryptedSelf).to.not.be.null\n\n expect(checkSalut.content!.fr.stringValue).to.equal(createdSalut.content!.fr.stringValue)\n expect(checkSalut.encryptedSelf).to.not.be.null\n\n expect(checkAtoi.content!.fr.stringValue).to.equal(createdAtoi.content!.fr.stringValue)\n expect(checkAtoi.encryptedSelf).to.not.be.null\n }\n })\n})\n\ndescribe('test that confidential helement information cannot be retrieved at MH level', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should find the confidential data only when logged as the user', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n const modifiedPatient = (await childApi.patientApi.initConfidentialSecretId(pat, childUser))!\n\n const confidentialHe = await childApi.healthcareElementApi.createHealthElementWithUser(\n childUser,\n await childApi.healthcareElementApi.newInstance(\n childUser,\n modifiedPatient,\n { descr: 'Confidential info' },\n { sfkOption: UseAnyConfidential, ignoreAutoDelegations: true }\n )\n )\n\n const retrievedHesAsUser = await childApi.healthcareElementApi.findBy(childUser.healthcarePartyId!, modifiedPatient)\n expect(retrievedHesAsUser.length).to.equal(1, 'User should see its confidential data')\n\n for (const { api, user } of others) {\n const retrievedHesAsMh = await api.healthcareElementApi.findBy(user.healthcarePartyId!, modifiedPatient)\n expect(retrievedHesAsMh.length).to.equal(0, 'MH should not see confidential data')\n let failedToRetrieve = false\n try {\n await api.healthcareElementApi.getHealthElementWithUser(user, confidentialHe.id!)\n } catch (e) {\n console.log(e)\n failedToRetrieve = true\n }\n if (!isLiteTest()) {\n expect(failedToRetrieve).to.equal(true, 'MH should fail to retrieve confidential data')\n }\n // Even if in some way I could get the contact I should not be able to decrypt it\n expect(\n await api.cryptoApi.xapi.encryptionKeysOf({ entity: confidentialHe!, type: EntityWithDelegationTypeName.HealthElement }, undefined)\n ).to.have.length(0)\n }\n })\n})\n\ndescribe('test that confidential contact information cannot be retrieved at MH level', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should find the confidential data only when logged as the user', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n const modifiedPatient = (await childApi.patientApi.initConfidentialSecretId(pat, childUser))!\n\n const confidentialCtc = await childApi.contactApi.createContactWithUser(\n childUser,\n await childApi.contactApi.newInstance(\n childUser,\n modifiedPatient,\n\n { descr: 'Confidential info', services: [], subContacts: [] },\n { sfkOption: UseAnyConfidential, ignoreAutoDelegations: true }\n )\n )\n\n await childApi.contactApi.createContactWithUser(\n childUser,\n await childApi.contactApi.newInstance(childUser, modifiedPatient, { descr: 'Non confidential info', services: [], subContacts: [] })\n )\n\n const retrievedCtcsAsUser = await childApi.contactApi.findBy(childUser.healthcarePartyId!, modifiedPatient)\n expect(retrievedCtcsAsUser.length).to.equal(2, 'User should see its confidential data')\n\n for (const { api, user } of others) {\n const retrievedCtcsAsMh = await api.contactApi.findBy(user.healthcarePartyId!, modifiedPatient)\n expect(retrievedCtcsAsMh.length).to.equal(1, 'MH should not see confidential data')\n // Even if in some way I could get the contact id I should not be able to get it\n let failedToRetrieve = false\n try {\n await api.contactApi.getContactWithUser(user, confidentialCtc!.id!)\n } catch (e) {\n console.log(e)\n failedToRetrieve = true\n }\n if (!isLiteTest()) {\n expect(failedToRetrieve).to.equal(true, 'MH should fail to retrieve confidential data')\n }\n // Even if in some way I could get the contact I should not be able to decrypt it\n expect(\n await api.cryptoApi.xapi.encryptionKeysOf({ entity: confidentialCtc!, type: EntityWithDelegationTypeName.Contact }, undefined)\n ).to.have.length(0)\n }\n })\n})\n\ndescribe('Share entity behaviour', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it(\"share method should fail if the user attempts to share an entity he can't access\", async () => {\n const hcp1 = await createNewHcpApi(env)\n const hcp2 = await createNewHcpApi(env)\n const hcp3 = await createNewHcpApi(env)\n const patient: Patient = await hcp1.api.patientApi.createPatientWithUser(\n hcp1.user,\n await hcp1.api.patientApi.newInstance(hcp1.user, { firstName: 'John', lastName: 'Doe', note: 'Secret' })\n )\n const encryptedPatient = await new IccPatientApi(env.iCureUrl, {}, hcp1.api.authApi.authenticationProvider, fetch).getPatient(patient.id!)\n await expect(hcp2.api.patientApi.shareWith(hcp3.credentials.dataOwnerId, encryptedPatient, [], { requestedPermissions: 'FULL_WRITE' })).to.be\n .rejected\n const shared = await hcp1.api.patientApi.shareWith(hcp2.credentials.dataOwnerId, patient, [], { requestedPermissions: 'FULL_WRITE' })\n await hcp2.api.patientApi.shareWith(hcp3.credentials.dataOwnerId, shared, [], { requestedPermissions: 'FULL_WRITE' })\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"cryptoTest.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/cryptoTest.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccPatientApi } from '../../../icc-api'\nimport 'isomorphic-fetch'\nimport { expect, use as chaiUse } from 'chai'\nimport 'mocha'\n\nimport { Patient } from '../../../icc-api/model/Patient'\nimport {\n createHcpHierarchyApis,\n createNewHcpApi,\n getEnvironmentInitializer,\n hcp1Username,\n isLiteTest,\n setLocalStorage,\n TestUtils,\n} from '../../utils/test_utils'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider, EntityWithDelegationTypeName } from '../../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { SecretIdUseOption } from '../../../icc-x-api/crypto/SecretIdUseOption'\nimport UseAnyConfidential = SecretIdUseOption.UseAnyConfidential\n\nchaiUse(require('chai-as-promised'))\n\nlet env: TestVars\n\nsetLocalStorage(fetch)\n\ndescribe('Create a patient from scratch', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should create a patient in the database', async () => {\n const api = await initApi(env, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n\n const note = 'A secured note that is encrypted'\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(\n user,\n new Patient({\n lastName: 'Biden',\n firstName: 'Joe',\n note,\n })\n )\n )\n expect(patient.note).to.equal(note)\n\n console.log(\n `Created patient (decrypted): ${patient.id}: ${patient.firstName} ${patient.lastName} [note:${patient.note}, encryptedSelf:${patient.encryptedSelf}]`\n )\n\n const fetched = await api.patientApi.getPatientWithUser(user, patient.id)\n console.log(\n `Fetched patient (decrypted): ${fetched.id}: ${fetched.firstName} ${fetched.lastName} [note:${fetched.note}, encryptedSelf:${fetched.encryptedSelf}]`\n )\n expect(fetched.id).to.equal(patient.id)\n expect(fetched.note).to.equal(note)\n\n const fetchedWithoutDecryption = await new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password),\n fetch as any\n ).getPatient(patient.id)\n\n console.log(\n `Fetched patient (encrypted):${fetchedWithoutDecryption.id}: ${fetchedWithoutDecryption.firstName} ${fetchedWithoutDecryption.lastName} [note: ${fetchedWithoutDecryption.note}]`\n )\n expect(fetchedWithoutDecryption.id).to.equal(patient.id)\n expect(fetchedWithoutDecryption.note).to.be.undefined\n })\n})\n\ndescribe('Init confidential delegation in patient', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should return a patient with a confidential delegation', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const note = 'Some note'\n const pat = await childApi.patientApi.createPatientWithUser(\n childUser,\n await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe', note })\n )\n\n // All parents and siblings should have access to the decrypted data and to the initial secret id\n expect(await childApi.patientApi.decryptSecretIdsOf(pat)).to.have.length(1)\n expect((await childApi.patientApi.getPatientWithUser(childUser, pat.id)).note).to.equal(note)\n const originalSecretId = (await childApi.patientApi.decryptSecretIdsOf(pat))[0]\n for (const { api, user } of others) {\n expect(await api.patientApi.decryptSecretIdsOf(pat)).to.have.length(1)\n expect((await api.patientApi.decryptSecretIdsOf(pat))[0]).to.equal(originalSecretId)\n expect((await api.patientApi.getPatientWithUser(user, pat.id)).note).to.equal(note)\n }\n\n // Initially there shouldn't be any secret confidential secret id\n expect(await childApi.patientApi.decryptConfidentialSecretIdsOf(pat)).to.be.empty\n\n // Now create a confidential delegation\n const patWithConfidential = await childApi.patientApi.initConfidentialSecretId(pat, childUser)\n\n // Confidential secret id should be different from the original secret id\n const confidentialDelegationKeys = await childApi.patientApi.decryptConfidentialSecretIdsOf(patWithConfidential)\n const nonConfidentialDelegationKeys = await childApi.patientApi.decryptNonConfidentialSecretIdsOf(patWithConfidential)\n expect(confidentialDelegationKeys).to.have.length(1)\n expect(nonConfidentialDelegationKeys).to.have.length(1)\n expect(confidentialDelegationKeys[0]).to.not.equal(nonConfidentialDelegationKeys)\n expect(nonConfidentialDelegationKeys[0]).to.equal(originalSecretId)\n\n // Child has access to confidential and not confidential secret ids.\n const childSecretIds = await childApi.patientApi.decryptSecretIdsOf(patWithConfidential)\n expect(childSecretIds).to.have.length(2)\n expect(childSecretIds).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(childSecretIds).to.have.contain(confidentialDelegationKeys[0])\n\n // All parents and siblings should have access to the decrypted data even after initialising confidential delegations...\n expect((await childApi.patientApi.getPatientWithUser(childUser, pat.id)).note).to.equal(note)\n for (const { api, user } of others) {\n expect((await api.patientApi.getPatientWithUser(user, pat.id)).note).to.equal(note)\n }\n\n // ...but not to the confidential secret id\n for (const { api } of others) {\n const secretIds = await api.patientApi.decryptSecretIdsOf(patWithConfidential)\n expect(secretIds).to.have.length(1)\n expect(secretIds).to.contain(nonConfidentialDelegationKeys[0])\n }\n\n // If a secret delegation is already available there is no need to create a new one\n const patWithConfidentialAgain = await childApi.patientApi.initConfidentialSecretId(patWithConfidential, childUser)\n expect(patWithConfidentialAgain.rev).to.equal(patWithConfidentialAgain.rev)\n expect(await childApi.patientApi.decryptSecretIdsOf(patWithConfidentialAgain)).to.have.length(2)\n\n // Different users will have different confidential secret ids...\n expect(await child2Api.patientApi.decryptConfidentialSecretIdsOf(patWithConfidential)).to.be.empty\n const patWithMoreConfidentialIds = await child2Api.patientApi.initConfidentialSecretId(patWithConfidential, child2User)\n\n // ...child continues to know the same secret ids...\n const childSecretIdsRepeat = await childApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)\n expect(childSecretIdsRepeat).to.have.length(2)\n expect(childSecretIdsRepeat).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(childSecretIdsRepeat).to.have.contain(confidentialDelegationKeys[0])\n\n // ...but child2 now also knows a different secret id...\n const child2secretIds = await child2Api.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)\n const child2confidential = await child2Api.patientApi.decryptConfidentialSecretIdsOf(patWithMoreConfidentialIds)\n expect(child2confidential).to.have.length(1)\n expect(child2confidential[0]).to.not.equal(confidentialDelegationKeys[0])\n expect(child2confidential[0]).to.not.equal(nonConfidentialDelegationKeys[0])\n expect(child2secretIds).to.have.length(2)\n expect(child2secretIds).to.contain(nonConfidentialDelegationKeys[0])\n expect(child2secretIds).to.contain(child2confidential[0])\n\n // ...and their parents still don't know them\n expect(await grandApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.length(1)\n expect(await grandApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.contain(nonConfidentialDelegationKeys[0])\n expect(await parentApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.length(1)\n expect(await parentApi.patientApi.decryptSecretIdsOf(patWithMoreConfidentialIds)).to.have.contain(nonConfidentialDelegationKeys[0])\n })\n})\n\ndescribe('Test that contact information can be decrypted', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should return a contact with decrypted information', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const allApis = [\n { api: childApi, user: childUser },\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.createPatientWithUser(\n childUser,\n await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n )\n const idFlat = childApi.cryptoApi.primitives.randomUuid()\n const idCompound = childApi.cryptoApi.primitives.randomUuid()\n const idSalut = childApi.cryptoApi.primitives.randomUuid()\n const idAtoi = childApi.cryptoApi.primitives.randomUuid()\n const instance = await childApi.contactApi.newInstance(childUser, pat, {\n services: [\n {\n id: idFlat,\n content: { fr: { stringValue: 'Salut' }, nl: { stringValue: 'Halo' } },\n },\n {\n id: idCompound,\n content: {\n fr: {\n compoundValue: [\n { id: idSalut, content: { fr: { stringValue: 'Salut' } } },\n { id: idAtoi, content: { fr: { stringValue: 'à toi' } } },\n ],\n },\n },\n },\n ],\n })\n const created = await childApi.contactApi.createContactWithUser(childUser, instance)\n const createdFlat = created!.services!.find((x) => x.id === idFlat)!\n const createdCompound = created!.services!.find((x) => x.id === idCompound)!\n const createdSalut = createdCompound.content!.fr.compoundValue!.find((x) => x.id === idSalut)!\n const createdAtoi = createdCompound.content!.fr.compoundValue!.find((x) => x.id === idAtoi)!\n\n for (const { api, user } of allApis) {\n console.log('Trying with user: ' + user.login)\n const check = await api.contactApi.getContactWithUser(user, created!.id!)\n const checkFlat = check!.services!.find((x) => x.id == idFlat)!\n const checkCompound = check!.services!.find((x) => x.id == idCompound)!\n const checkSalut = checkCompound.content!.fr.compoundValue!.find((x) => x.id === idSalut)!\n const checkAtoi = checkCompound.content!.fr.compoundValue!.find((x) => x.id === idAtoi)!\n\n expect(checkFlat).to.not.be.undefined\n expect(checkFlat).to.not.be.null\n expect(checkSalut).to.not.be.undefined\n expect(checkSalut).to.not.be.null\n expect(checkAtoi).to.not.be.undefined\n expect(checkAtoi).to.not.be.null\n\n expect(checkFlat.content!.fr.stringValue).to.equal(createdFlat!.content!.fr.stringValue)\n expect(checkFlat.content!.nl.stringValue).to.equal(createdFlat!.content!.nl.stringValue)\n expect(checkFlat.content!.encryptedSelf).to.not.be.null\n\n expect(checkSalut.content!.fr.stringValue).to.equal(createdSalut.content!.fr.stringValue)\n expect(checkSalut.encryptedSelf).to.not.be.null\n\n expect(checkAtoi.content!.fr.stringValue).to.equal(createdAtoi.content!.fr.stringValue)\n expect(checkAtoi.encryptedSelf).to.not.be.null\n }\n })\n})\n\ndescribe('test that confidential helement information cannot be retrieved at MH level', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should find the confidential data only when logged as the user', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n const modifiedPatient = (await childApi.patientApi.initConfidentialSecretId(pat, childUser))!\n\n const confidentialHe = await childApi.healthcareElementApi.createHealthElementWithUser(\n childUser,\n await childApi.healthcareElementApi.newInstance(\n childUser,\n modifiedPatient,\n { descr: 'Confidential info' },\n { sfkOption: UseAnyConfidential, ignoreAutoDelegations: true }\n )\n )\n\n const retrievedHesAsUser = await childApi.healthcareElementApi.findBy(childUser.healthcarePartyId!, modifiedPatient)\n expect(retrievedHesAsUser.length).to.equal(1, 'User should see its confidential data')\n\n for (const { api, user } of others) {\n const retrievedHesAsMh = await api.healthcareElementApi.findBy(user.healthcarePartyId!, modifiedPatient)\n expect(retrievedHesAsMh.length).to.equal(0, 'MH should not see confidential data')\n let failedToRetrieve = false\n try {\n await api.healthcareElementApi.getHealthElementWithUser(user, confidentialHe.id!)\n } catch (e) {\n console.log(e)\n failedToRetrieve = true\n }\n if (!isLiteTest()) {\n expect(failedToRetrieve).to.equal(true, 'MH should fail to retrieve confidential data')\n }\n // Even if in some way I could get the contact I should not be able to decrypt it\n expect(\n await api.cryptoApi.xapi.encryptionKeysOf({ entity: confidentialHe!, type: EntityWithDelegationTypeName.HealthElement }, undefined)\n ).to.have.length(0)\n }\n })\n})\n\ndescribe('test that confidential contact information cannot be retrieved at MH level', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should find the confidential data only when logged as the user', async () => {\n const { grandApi, grandUser, childApi, childUser, parentApi, parentUser, child2Api, child2User } = await createHcpHierarchyApis(env!)\n const others = [\n { api: child2Api, user: child2User },\n { api: parentApi, user: parentUser },\n { api: grandApi, user: grandUser },\n ]\n\n const pat = await childApi.patientApi.newInstance(childUser, { firstName: 'John', lastName: 'Doe' })\n const modifiedPatient = (await childApi.patientApi.initConfidentialSecretId(pat, childUser))!\n\n const confidentialCtc = await childApi.contactApi.createContactWithUser(\n childUser,\n await childApi.contactApi.newInstance(\n childUser,\n modifiedPatient,\n\n { descr: 'Confidential info', services: [], subContacts: [] },\n { sfkOption: UseAnyConfidential, ignoreAutoDelegations: true }\n )\n )\n\n await childApi.contactApi.createContactWithUser(\n childUser,\n await childApi.contactApi.newInstance(childUser, modifiedPatient, { descr: 'Non confidential info', services: [], subContacts: [] })\n )\n\n const retrievedCtcsAsUser = await childApi.contactApi.findBy(childUser.healthcarePartyId!, modifiedPatient)\n expect(retrievedCtcsAsUser.length).to.equal(2, 'User should see its confidential data')\n\n for (const { api, user } of others) {\n const retrievedCtcsAsMh = await api.contactApi.findBy(user.healthcarePartyId!, modifiedPatient)\n expect(retrievedCtcsAsMh.length).to.equal(1, 'MH should not see confidential data')\n // Even if in some way I could get the contact id I should not be able to get it\n let failedToRetrieve = false\n try {\n await api.contactApi.getContactWithUser(user, confidentialCtc!.id!)\n } catch (e) {\n console.log(e)\n failedToRetrieve = true\n }\n if (!isLiteTest()) {\n expect(failedToRetrieve).to.equal(true, 'MH should fail to retrieve confidential data')\n }\n // Even if in some way I could get the contact I should not be able to decrypt it\n expect(\n await api.cryptoApi.xapi.encryptionKeysOf({ entity: confidentialCtc!, type: EntityWithDelegationTypeName.Contact }, undefined)\n ).to.have.length(0)\n }\n })\n})\n\ndescribe('Share entity behaviour', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it(\"share method should fail if the user attempts to share an entity he can't access\", async () => {\n const hcp1 = await createNewHcpApi(env)\n const hcp2 = await createNewHcpApi(env)\n const hcp3 = await createNewHcpApi(env)\n const patient: Patient = await hcp1.api.patientApi.createPatientWithUser(\n hcp1.user,\n await hcp1.api.patientApi.newInstance(hcp1.user, { firstName: 'John', lastName: 'Doe', note: 'Secret' })\n )\n const encryptedPatient = await new IccPatientApi(env.iCureUrl, {}, hcp1.api.authApi.authenticationProvider, fetch).getPatient(patient.id!)\n await expect(hcp2.api.patientApi.shareWith(hcp3.credentials.dataOwnerId, encryptedPatient, [], { requestedPermissions: 'FULL_WRITE' })).to.be\n .rejected\n const shared = await hcp1.api.patientApi.shareWith(hcp2.credentials.dataOwnerId, patient, [], { requestedPermissions: 'FULL_WRITE' })\n await hcp2.api.patientApi.shareWith(hcp3.credentials.dataOwnerId, shared, [], { requestedPermissions: 'FULL_WRITE' })\n })\n})\n"]}
|