Index: .env
===================================================================
--- .env	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ .env	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -1,18 +1,7 @@
-# PostgreSQL Connection via SSH Tunnel
-# SSH tunnel should be established to: 194.149.135.130
-# SSH username: t_handcraft_store
-# SSH password: 9f0985a6
-# After SSH tunnel, connect to localhost:5432
-
-PGHOST=localhost
-PGPORT=9999
-PGDATABASE=db_202526z_va_prj_handcraft_store
-PGUSER=db_202526z_va_prj_handcraft_store_owner
-PGPASSWORD=77769964489a
-
 SMTP_HOST=smtp.ethereal.email
-SMTP_PORT=3000
+SMTP_PORT=587
 SMTP_USER=frederik52@ethereal.email
 SMTP_PASS=sgqN9t4qn7RxCdavyv
 JWT_SECRET=handcraft_marketplace_secret_key_2024
 PORT=3000
+DB_PATH=./handcraft.db
Index: dea/.name
===================================================================
--- .idea/.name	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-handcraft.db
Index: dea/editor.xml
===================================================================
--- .idea/editor.xml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,483 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="BackendCodeEditorSettings">
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexRemoved" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
-    <option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexRemoved" />
-  </component>
-</project>
Index: .idea/vcs.xml
===================================================================
--- .idea/vcs.xml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ .idea/vcs.xml	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
+  <component name="VcsDirectoryMappings" defaultProject="true" />
 </project>
Index: README.md
===================================================================
--- README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ README.md	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -3,5 +3,5 @@
  * Open the project folder in Command line
  * Run npm install command to install all dependencies
- * Run npm start to lunch the cmdprogram
+ * Run npm start to lunch the program
    * After running the command, app is available at locatlhost:3000
  * See the database with command node view-database.js
@@ -12,3 +12,3 @@
 Klimentina Efremova
 
-=======
+Aida Balikj
Index: database.js
===================================================================
--- database.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ database.js	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -1,272 +1,108 @@
-const { Pool } = require('pg');
+const sqlite3 = require('sqlite3').verbose();
+const path = require('path');
 const bcrypt = require('bcryptjs');
-require('dotenv').config();
-
-/*
- * ============================================================
- * PostgreSQL CONNECTION
- * ============================================================
- *
- * Put your actual FINKI connection information in .env
- *
- * Example:
- *
- * PGHOST=localhost
- * PGPORT=5432
- * PGDATABASE=handcraft
- * PGUSER=your_username
- * PGPASSWORD=your_password
- *
- * If you use the SSH tunnel, PGHOST/PGPORT will normally
- * point to the LOCAL end of the SSH tunnel.
- */
-
-const pool = new Pool({
-    host: process.env.PGHOST || 'localhost',
-    port: parseInt(process.env.PGPORT || '5432', 10),
-    database: process.env.PGDATABASE || 'db_202526z_va_prj_handcraft_store',
-    user: process.env.PGUSER || 'db_202526z_va_prj_handcraft_store_owner',
-    password: process.env.PGPASSWORD || '',
-    max: 10,
-    idleTimeoutMillis: 30000,
-    connectionTimeoutMillis: 10000
+const crypto = require('crypto');
+
+const dbPath = path.join(__dirname, 'database', 'handcraft.db');
+const dbDir = path.dirname(dbPath);
+
+// Create database directory if it doesn't exist
+const fs = require('fs');
+if (!fs.existsSync(dbDir)) {
+    fs.mkdirSync(dbDir, { recursive: true });
+}
+
+const database = new sqlite3.Database(dbPath, (err) => {
+    if (err) {
+        console.error('Error opening database:', err.message);
+    } else {
+        console.log('✅ Connected to SQLite database');
+    }
 });
 
-pool.on('connect', () => {
-    console.log('✅ Connected to PostgreSQL database');
-});
-
-pool.on('error', (err) => {
-    console.error('❌ Unexpected PostgreSQL pool error:', err);
-});
-
-/*
- * ============================================================
- * HELPER
- * ============================================================
- */
-
-function query(text, params = [], callback) {
-    pool.query(text, params)
-        .then(result => {
-            callback(null, result);
-        })
-        .catch(err => {
+// Enable foreign keys
+database.run('PRAGMA foreign_keys = ON');
+
+// Helper function to ensure general category exists
+function ensureGeneralCategory(callback) {
+    database.get('SELECT category_id FROM category WHERE name = ?', ['General'], (err, row) => {
+        if (err) {
+            callback(err);
+        } else if (!row) {
+            database.run(
+                'INSERT INTO category (name, description) VALUES (?, ?)',
+                ['General', 'General products category'],
+                function(err) {
+                    callback(err);
+                }
+            );
+        } else {
+            callback(null);
+        }
+    });
+}
+
+// Helper function to get the General category ID
+function getGeneralCategoryId(callback) {
+    database.get('SELECT category_id FROM category WHERE name = ?', ['General'], (err, row) => {
+        if (err) {
             callback(err, null);
-        });
-}
-
-
-/*
- * ============================================================
- * GENERAL CATEGORY
- * ============================================================
- */
-
-function ensureGeneralCategory(callback) {
-
-    query(
-        `SELECT category_id, name
-         FROM category
-         WHERE category_id = 1`,
-        [],
-        (err, result) => {
-
-            if (err) {
-                callback(err);
-                return;
-            }
-
-            const row = result.rows[0];
-
-            if (row && row.name === 'General') {
-
-                console.log('✅ General category exists with ID: 1');
-                callback(null);
-
-            } else if (row && row.name !== 'General') {
-
-                query(
-                    `UPDATE category
-                     SET name = $1,
-                         description = $2
-                     WHERE category_id = 1`,
-                    ['General', 'General products category'],
-                    (err) => {
-
-                        if (err) {
-                            callback(err);
-                        } else {
-                            console.log('✅ Updated category ID 1 to General');
-                            callback(null);
-                        }
-                    }
-                );
-
-            } else {
-
-                query(
-                    `INSERT INTO category
-                        (category_id, name, description)
-                     VALUES
-                        (1, $1, $2)
-                     ON CONFLICT (category_id) DO NOTHING`,
-                    ['General', 'General products category'],
-                    (err) => {
-
-                        if (err) {
-                            callback(err);
-                        } else {
-                            console.log('✅ Created General category with ID: 1');
-                            callback(null);
-                        }
-                    }
-                );
-            }
-        }
-    );
-}
-
-
-function getGeneralCategoryId(callback) {
-
-    query(
-        `SELECT category_id
-         FROM category
-         WHERE category_id = 1
-           AND name = $1`,
-        ['General'],
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            if (result.rows.length > 0) {
-                callback(null, result.rows[0].category_id);
-                return;
-            }
-
-            query(
-                `SELECT category_id
-                 FROM category
-                 WHERE name = $1`,
-                ['General'],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
-                    }
-
-                    if (result.rows.length > 0) {
-                        callback(null, result.rows[0].category_id);
-                        return;
-                    }
-
-                    query(
-                        `INSERT INTO category
-                            (name, description)
-                         VALUES
-                            ($1, $2)
-                         RETURNING category_id`,
-                        ['General', 'General products category'],
-                        (err, result) => {
-
-                            if (err) {
-                                callback(err, null);
-                            } else {
-                                const newId = result.rows[0].category_id;
-
-                                console.log(
-                                    `✅ Created new General category with ID: ${newId}`
-                                );
-
-                                callback(null, newId);
-                            }
-                        }
-                    );
-                }
-            );
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * USER FUNCTIONS
- * ============================================================
- */
-
-function getUserByUsername(username, callback) {
-
-    query(
-        `SELECT *
-         FROM users
-         WHERE username = $1`,
-        [username],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows[0] : null
-            );
-        }
-    );
-}
-
-
-function getUserById(id, callback) {
-
-    query(
-        `SELECT *
-         FROM users
-         WHERE id = $1`,
-        [id],
-        (err, result) => {
-
-            if (err || !result || result.rows.length === 0) {
-                callback(err, null);
-                return;
-            }
-
-            const row = result.rows[0];
-
-            query(
-                `SELECT r.*
-                 FROM roles r
-                 JOIN user_roles ur
-                   ON r.role_id = ur.role_id
-                 WHERE ur.user_id = $1`,
-                [id],
-                (err, result) => {
-
+        } else if (row) {
+            callback(null, row.category_id);
+        } else {
+            // Create General category if it doesn't exist
+            database.run(
+                'INSERT INTO category (name, description) VALUES (?, ?)',
+                ['General', 'General products category'],
+                function(err) {
                     if (err) {
                         callback(err, null);
                     } else {
-                        row.roles = result.rows || [];
-                        callback(null, row);
+                        callback(null, this.lastID);
                     }
                 }
             );
         }
-    );
-}
-
+    });
+}
+
+// User functions
+function getUserByUsername(username, callback) {
+    database.get('SELECT * FROM users WHERE username = ?', [username], (err, row) => {
+        callback(err, row);
+    });
+}
+
+function getUserById(id, callback) {
+    database.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {
+        if (err || !row) {
+            callback(err, null);
+            return;
+        }
+
+        // Get user roles
+        database.all(
+            `SELECT r.* FROM roles r
+             JOIN user_roles ur ON r.role_id = ur.role_id
+             WHERE ur.user_id = ?`,
+            [id],
+            (err, roles) => {
+                if (err) {
+                    callback(err, null);
+                } else {
+                    row.roles = roles || [];
+                    callback(null, row);
+                }
+            }
+        );
+    });
+}
 
 function createUser(id, username, email, password, userType, callback) {
-
     const hashedPassword = bcrypt.hashSync(password, 10);
-
-    query(
-        `INSERT INTO users
-            (id, username, email, password, user_type)
-         VALUES
-            ($1, $2, $3, $4, $5)`,
+    database.run(
+        'INSERT INTO users (id, username, email, password, user_type) VALUES (?, ?, ?, ?, ?)',
         [id, username, email, hashedPassword, userType],
-        (err) => {
-
+        function(err) {
             if (err) {
                 callback(err, null);
@@ -278,163 +114,66 @@
 }
 
-
-/*
- * ============================================================
- * CLIENT FUNCTIONS
- * ============================================================
- */
-
+// Client functions
 function getClientByEmail(email, callback) {
-
-    query(
-        `SELECT *
-         FROM client
-         WHERE email = $1`,
-        [email],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows[0] : null
-            );
-        }
-    );
-}
-
+    database.get('SELECT * FROM client WHERE email = ?', [email], (err, row) => {
+        callback(err, row);
+    });
+}
 
 function getClientById(id, callback) {
-
-    query(
-        `SELECT *
-         FROM client
-         WHERE client_id = $1`,
-        [id],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows[0] : null
-            );
-        }
-    );
-}
-
+    database.get('SELECT * FROM client WHERE client_id = ?', [id], (err, row) => {
+        callback(err, row);
+    });
+}
 
 function createClient(clientData, callback) {
-
-    const hashedPassword =
-        bcrypt.hashSync(clientData.password, 10);
-
-    query(
-        `INSERT INTO client
-            (first_name, last_name, email, password)
-         VALUES
-            ($1, $2, $3, $4)
-         RETURNING client_id`,
-        [
-            clientData.first_name,
-            clientData.last_name,
-            clientData.email,
-            hashedPassword
-        ],
-        (err, result) => {
-
+    const hashedPassword = bcrypt.hashSync(clientData.password, 10);
+    database.run(
+        'INSERT INTO client (first_name, last_name, email, password) VALUES (?, ?, ?, ?)',
+        [clientData.first_name, clientData.last_name, clientData.email, hashedPassword],
+        function(err) {
             if (err) {
                 callback(err, null);
             } else {
-                callback(
-                    null,
-                    result.rows[0].client_id
-                );
-            }
-        }
-    );
-}
-
-
-function verifyClientPassword(
-    password,
-    hashedPassword,
-    callback
-) {
-
+                callback(null, this.lastID);
+            }
+        }
+    );
+}
+
+function verifyClientPassword(password, hashedPassword, callback) {
     try {
-
-        const isValid =
-            bcrypt.compareSync(password, hashedPassword);
-
+        const isValid = bcrypt.compareSync(password, hashedPassword);
         callback(null, isValid);
-
     } catch (err) {
-
         callback(err, false);
     }
 }
 
-
-/*
- * ============================================================
- * PERSONAL / EMPLOYEE FUNCTIONS
- * ============================================================
- */
-
+// Personal functions
 function getPersonalByEmail(email, callback) {
-
-    query(
-        `SELECT *
-         FROM personal
-         WHERE email = $1`,
-        [email],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows[0] : null
-            );
-        }
-    );
-}
-
+    database.get('SELECT * FROM personal WHERE email = ?', [email], (err, row) => {
+        callback(err, row);
+    });
+}
 
 function getPersonalById(id, callback) {
-
-    query(
-        `SELECT *
-         FROM personal
-         WHERE id = $1`,
-        [id],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows[0] : null
-            );
-        }
-    );
-}
-
-
+    database.get('SELECT * FROM personal WHERE id = ?', [id], (err, row) => {
+        callback(err, row);
+    });
+}
+
+// Password verification for regular users
 function verifyPassword(password, hashedPassword) {
     return bcrypt.compareSync(password, hashedPassword);
 }
 
-
-function updatePasswordAndClearForce(
-    userId,
-    newPassword,
-    callback
-) {
-
-    const hashedPassword =
-        bcrypt.hashSync(newPassword, 10);
-
-    query(
-        `UPDATE users
-         SET password = $1,
-             force_password_change = 0
-         WHERE id = $2`,
+// Password update
+function updatePasswordAndClearForce(userId, newPassword, callback) {
+    const hashedPassword = bcrypt.hashSync(newPassword, 10);
+    database.run(
+        'UPDATE users SET password = ?, force_password_change = 0 WHERE id = ?',
         [hashedPassword, userId],
-        (err) => {
-
+        function(err) {
             callback(err);
         }
@@ -442,196 +181,120 @@
 }
 
-
-/*
- * ============================================================
- * PRODUCT FUNCTIONS
- * ============================================================
- */
-
+// Product functions
 function getProducts(categoryId, searchTerm, callback) {
-
-    let queryText = `
-        SELECT
-            p.*,
-            c.name AS category_name,
-            s.name AS store_name
+    let query = `
+        SELECT p.*, c.name as category_name, s.name as store_name
         FROM product p
-        JOIN category c
-          ON p.category_id = c.category_id
-        JOIN store s
-          ON p.store_id = s.store_id
-        WHERE 1 = 1
+        JOIN category c ON p.category_id = c.category_id
+        JOIN store s ON p.store_id = s.store_id
+        WHERE 1=1
     `;
-
     const params = [];
-    let paramIndex = 1;
 
     if (categoryId && categoryId !== 'all') {
-
-        queryText +=
-            ` AND p.category_id = $${paramIndex}`;
-
+        query += ' AND p.category_id = ?';
         params.push(categoryId);
-        paramIndex++;
     }
 
     if (searchTerm) {
-
-        queryText +=
-            ` AND (
-                p.description ILIKE $${paramIndex}
-                OR p.code ILIKE $${paramIndex + 1}
-            )`;
-
-        params.push(`%${searchTerm}%`);
-        params.push(`%${searchTerm}%`);
-
-        paramIndex += 2;
+        query += ' AND (p.description LIKE ? OR p.code LIKE ?)';
+        params.push(`%${searchTerm}%`, `%${searchTerm}%`);
     }
 
-    queryText += ` ORDER BY p.code`;
-
-    query(
-        queryText,
-        params,
-        (err, result) => {
-
-            if (err) {
+    database.all(query, params, (err, rows) => {
+        if (err) {
+            callback(err, null);
+        } else {
+            callback(null, rows || []);
+        }
+    });
+}
+
+function getProductById(id, callback) {
+    database.get(
+        `SELECT p.*, c.name as category_name, s.name as store_name
+         FROM product p
+         JOIN category c ON p.category_id = c.category_id
+         JOIN store s ON p.store_id = s.store_id
+         WHERE p.id = ?`,
+        [id],
+        (err, row) => {
+            if (err || !row) {
                 callback(err, null);
             } else {
-                callback(null, result.rows || []);
-            }
-        }
-    );
-}
-
-
-function getProductById(id, callback) {
-
-    query(
-        `SELECT
-            p.*,
-            c.name AS category_name,
-            s.name AS store_name
+                // Get images for product
+                database.all(
+                    'SELECT * FROM image WHERE product_code = ?',
+                    [row.code],
+                    (err, images) => {
+                        if (err) {
+                            callback(err, null);
+                        } else {
+                            row.images = images || [];
+                            // Get colors for product
+                            database.all(
+                                'SELECT * FROM color WHERE product_code = ?',
+                                [row.code],
+                                (err, colors) => {
+                                    if (err) {
+                                        callback(err, null);
+                                    } else {
+                                        row.colors = colors || [];
+                                        callback(null, row);
+                                    }
+                                }
+                            );
+                        }
+                    }
+                );
+            }
+        }
+    );
+}
+
+function getProductByCode(code, callback) {
+    database.get(
+        `SELECT p.*, c.name as category_name, s.name as store_name
          FROM product p
-         JOIN category c
-           ON p.category_id = c.category_id
-         JOIN store s
-           ON p.store_id = s.store_id
-         WHERE p.id = $1`,
-        [id],
-        (err, result) => {
-
-            if (err || result.rows.length === 0) {
+         JOIN category c ON p.category_id = c.category_id
+         JOIN store s ON p.store_id = s.store_id
+         WHERE p.code = ?`,
+        [code],
+        (err, row) => {
+            if (err || !row) {
                 callback(err, null);
-                return;
-            }
-
-            const row = result.rows[0];
-
-            query(
-                `SELECT *
-                 FROM image
-                 WHERE product_code = $1`,
-                [row.code],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
+            } else {
+                // Get images for product
+                database.all(
+                    'SELECT * FROM image WHERE product_code = ?',
+                    [code],
+                    (err, images) => {
+                        if (err) {
+                            callback(err, null);
+                        } else {
+                            row.images = images || [];
+                            // Get colors for product
+                            database.all(
+                                'SELECT * FROM color WHERE product_code = ?',
+                                [code],
+                                (err, colors) => {
+                                    if (err) {
+                                        callback(err, null);
+                                    } else {
+                                        row.colors = colors || [];
+                                        callback(null, row);
+                                    }
+                                }
+                            );
+                        }
                     }
-
-                    row.images = result.rows || [];
-
-                    query(
-                        `SELECT *
-                         FROM color
-                         WHERE product_code = $1`,
-                        [row.code],
-                        (err, result) => {
-
-                            if (err) {
-                                callback(err, null);
-                            } else {
-                                row.colors =
-                                    result.rows || [];
-
-                                callback(null, row);
-                            }
-                        }
-                    );
-                }
-            );
-        }
-    );
-}
-
-
-function getProductByCode(code, callback) {
-
-    query(
-        `SELECT
-            p.*,
-            c.name AS category_name,
-            s.name AS store_name
-         FROM product p
-         JOIN category c
-           ON p.category_id = c.category_id
-         JOIN store s
-           ON p.store_id = s.store_id
-         WHERE p.code = $1`,
-        [code],
-        (err, result) => {
-
-            if (err || result.rows.length === 0) {
-                callback(err, null);
-                return;
-            }
-
-            const row = result.rows[0];
-
-            query(
-                `SELECT *
-                 FROM image
-                 WHERE product_code = $1`,
-                [code],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
-                    }
-
-                    row.images = result.rows || [];
-
-                    query(
-                        `SELECT *
-                         FROM color
-                         WHERE product_code = $1`,
-                        [code],
-                        (err, result) => {
-
-                            if (err) {
-                                callback(err, null);
-                            } else {
-
-                                row.colors =
-                                    result.rows || [];
-
-                                callback(null, row);
-                            }
-                        }
-                    );
-                }
-            );
-        }
-    );
-}
-
+                );
+            }
+        }
+    );
+}
 
 function addProduct(personalId, productData, callback) {
-
     getGeneralCategoryId((err, generalCategoryId) => {
-
         if (err) {
             callback(err, null);
@@ -639,59 +302,24 @@
         }
 
-        const categoryId =
-            productData.category_id || generalCategoryId;
-
+        const categoryId = productData.category_id || generalCategoryId;
+
+        // FIXED: Added validation for required fields
         if (!productData.code) {
-            callback(
-                new Error('Product code is required'),
-                null
-            );
+            callback(new Error('Product code is required'), null);
             return;
         }
 
         if (!productData.store_id) {
-            callback(
-                new Error('Store ID is required'),
-                null
-            );
+            callback(new Error('Store ID is required'), null);
             return;
         }
 
-        const productId =
-            'PROD_' +
-            Date.now().toString().slice(-8);
-
-        query(
-            `INSERT INTO product
-                (
-                    id,
-                    code,
-                    description,
-                    price,
-                    availability,
-                    weight,
-                    dimensions,
-                    production_time,
-                    category_id,
-                    store_id,
-                    created_at
-                )
-             VALUES
-                (
-                    $1,
-                    $2,
-                    $3,
-                    $4,
-                    $5,
-                    $6,
-                    $7,
-                    $8,
-                    $9,
-                    $10,
-                    NOW()
-                )
-             RETURNING id`,
+        database.run(
+            `INSERT INTO product (
+                id, code, description, price, availability, weight, dimensions,
+                production_time, category_id, store_id, created_at
+            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`,
             [
-                productId,
+                'PROD_' + Date.now().toString().slice(-8), // Generate a unique ID
                 productData.code,
                 productData.description || 'No description',
@@ -704,360 +332,44 @@
                 productData.store_id
             ],
-            (err, result) => {
-
+            function(err) {
                 if (err) {
                     callback(err, null);
-                    return;
-                }
-
-                const returnedId = result.rows[0].id;
-
-                /*
-                 * Log product creation
-                 */
-                query(
-                    `INSERT INTO "change"
-                        (date_and_time, product_code, changes)
-                     VALUES
-                        (NOW(), $1, $2)`,
-                    [
-                        productData.code,
-                        'Product created'
-                    ],
-                    (err) => {
-
-                        if (err) {
-                            console.error(
-                                'Error logging product creation:',
-                                err
-                            );
-                        }
-                    }
-                );
-
-                /*
-                 * Log who made the change
-                 */
-                query(
-                    `INSERT INTO makes_change
-                        (
-                            personal_id,
-                            change_date_time,
-                            product_code
-                        )
-                     VALUES
-                        ($1, NOW(), $2)`,
-                    [
-                        personalId,
-                        productData.code
-                    ],
-                    (err) => {
-
-                        if (err) {
-                            console.error(
-                                'Error logging change maker:',
-                                err
-                            );
-                        }
-                    }
-                );
-
-                /*
-                 * Insert images
-                 */
-                if (
-                    productData.images &&
-                    Array.isArray(productData.images) &&
-                    productData.images.length > 0
-                ) {
-
-                    productData.images.forEach(
-                        (imageUrl, index) => {
-
-                            query(
-                                `INSERT INTO image
-                                    (
-                                        product_code,
-                                        image_url,
-                                        is_primary
-                                    )
-                                 VALUES
-                                    ($1, $2, $3)`,
-                                [
-                                    productData.code,
-                                    imageUrl,
-                                    index === 0
-                                ],
-                                (err) => {
-
+                } else {
+                    const productId = this.lastID;
+
+                    // Log the change
+                    database.run(
+                        `INSERT INTO "change" (date_and_time, product_code, changes)
+                         VALUES (datetime('now'), ?, ?)`,
+                        [productData.code, 'Product created'],
+                        function(err) {
+                            if (err) {
+                                console.error('Error logging product creation:', err);
+                            }
+                        }
+                    );
+
+                    // Log who made the change
+                    database.run(
+                        `INSERT INTO makes_change (personal_id, change_date_time, product_code)
+                         VALUES (?, datetime('now'), ?)`,
+                        [personalId, productData.code],
+                        function(err) {
+                            if (err) {
+                                console.error('Error logging change maker:', err);
+                            }
+                        }
+                    );
+
+                    // Insert images if provided
+                    if (productData.images && Array.isArray(productData.images) && productData.images.length > 0) {
+                        productData.images.forEach((imageUrl, index) => {
+                            database.run(
+                                `INSERT INTO image (product_code, image_url, is_primary)
+                                 VALUES (?, ?, ?)`,
+                                [productData.code, imageUrl, index === 0 ? 1 : 0],
+                                function(err) {
                                     if (err) {
-                                        console.error(
-                                            'Error inserting image:',
-                                            err
-                                        );
-                                    }
-                                }
-                            );
-                        }
-                    );
-                }
-
-                /*
-                 * Insert colors
-                 */
-                if (
-                    productData.colors &&
-                    Array.isArray(productData.colors) &&
-                    productData.colors.length > 0
-                ) {
-
-                    productData.colors.forEach(color => {
-
-                        query(
-                            `INSERT INTO color
-                                (product_code, name)
-                             VALUES
-                                ($1, $2)`,
-                            [
-                                productData.code,
-                                color
-                            ],
-                            (err) => {
-
-                                if (err) {
-                                    console.error(
-                                        'Error inserting color:',
-                                        err
-                                    );
-                                }
-                            }
-                        );
-                    });
-                }
-
-                callback(null, returnedId);
-            }
-        );
-    });
-}
-
-
-function updateProduct(
-    personalId,
-    productData,
-    callback
-) {
-
-    const updates = [];
-    const params = [];
-
-    if (productData.description !== undefined) {
-        updates.push(`description = $${params.length + 1}`);
-        params.push(productData.description);
-    }
-
-    if (productData.price !== undefined) {
-        updates.push(`price = $${params.length + 1}`);
-        params.push(productData.price);
-    }
-
-    if (productData.availability !== undefined) {
-        updates.push(`availability = $${params.length + 1}`);
-        params.push(productData.availability);
-    }
-
-    if (productData.weight !== undefined) {
-        updates.push(`weight = $${params.length + 1}`);
-        params.push(productData.weight);
-    }
-
-    if (productData.dimensions !== undefined) {
-        updates.push(`dimensions = $${params.length + 1}`);
-        params.push(productData.dimensions);
-    }
-
-    if (productData.production_time !== undefined) {
-        updates.push(`production_time = $${params.length + 1}`);
-        params.push(productData.production_time);
-    }
-
-    if (productData.category_id !== undefined) {
-        updates.push(`category_id = $${params.length + 1}`);
-        params.push(productData.category_id);
-    }
-
-    if (updates.length === 0) {
-        callback(null, 0);
-        return;
-    }
-
-    params.push(productData.code);
-
-    const codeParameter = params.length;
-
-    query(
-        `UPDATE product
-         SET ${updates.join(', ')}
-         WHERE code = $${codeParameter}`,
-        params,
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            const changesDesc =
-                `Product updated: ${updates.join(', ')}`;
-
-            /*
-             * Log product change
-             */
-            query(
-                `INSERT INTO "change"
-                    (
-                        date_and_time,
-                        product_code,
-                        changes
-                    )
-                 VALUES
-                    (NOW(), $1, $2)`,
-                [
-                    productData.code,
-                    changesDesc
-                ],
-                (err) => {
-
-                    if (err) {
-                        console.error(
-                            'Error logging product update:',
-                            err
-                        );
-                    }
-                }
-            );
-
-            /*
-             * Log who made the change
-             */
-            query(
-                `INSERT INTO makes_change
-                    (
-                        personal_id,
-                        change_date_time,
-                        product_code
-                    )
-                 VALUES
-                    ($1, NOW(), $2)`,
-                [
-                    personalId,
-                    productData.code
-                ],
-                (err) => {
-
-                    if (err) {
-                        console.error(
-                            'Error logging change maker:',
-                            err
-                        );
-                    }
-                }
-            );
-
-            /*
-             * Images
-             */
-            if (
-                productData.images &&
-                Array.isArray(productData.images)
-            ) {
-
-                query(
-                    `DELETE FROM image
-                     WHERE product_code = $1`,
-                    [productData.code],
-                    (err) => {
-
-                        if (err) {
-                            console.error(
-                                'Error deleting old images:',
-                                err
-                            );
-                            return;
-                        }
-
-                        productData.images.forEach(
-                            (image, index) => {
-
-                                query(
-                                    `INSERT INTO image
-                                        (
-                                            product_code,
-                                            image_url,
-                                            is_primary
-                                        )
-                                     VALUES
-                                        ($1, $2, $3)`,
-                                    [
-                                        productData.code,
-                                        image,
-                                        index === 0
-                                    ],
-                                    (err) => {
-
-                                        if (err) {
-                                            console.error(
-                                                'Error inserting image:',
-                                                err
-                                            );
-                                        }
-                                    }
-                                );
-                            }
-                        );
-                    }
-                );
-            }
-
-            /*
-             * Colors
-             */
-            if (
-                productData.colors &&
-                Array.isArray(productData.colors)
-            ) {
-
-                query(
-                    `DELETE FROM color
-                     WHERE product_code = $1`,
-                    [productData.code],
-                    (err) => {
-
-                        if (err) {
-                            console.error(
-                                'Error deleting old colors:',
-                                err
-                            );
-                            return;
-                        }
-
-                        productData.colors.forEach(color => {
-
-                            query(
-                                `INSERT INTO color
-                                    (product_code, name)
-                                 VALUES
-                                    ($1, $2)`,
-                                [
-                                    productData.code,
-                                    color
-                                ],
-                                (err) => {
-
-                                    if (err) {
-                                        console.error(
-                                            'Error inserting color:',
-                                            err
-                                        );
+                                        console.error('Error inserting image:', err);
                                     }
                                 }
@@ -1065,172 +377,218 @@
                         });
                     }
-                );
-            }
-
-            callback(null, result.rowCount);
-        }
-    );
-}
-
-
-function deleteProduct(
-    productCode,
-    storeId,
-    personalId,
-    callback
-) {
-
-    pool.connect()
-        .then(client => {
-
-            return client.query('BEGIN')
-                .then(() => {
-
-                    return client.query(
-                        `INSERT INTO "change"
-                            (
-                                date_and_time,
-                                product_code,
-                                changes
-                            )
-                         VALUES
-                            (NOW(), $1, $2)`,
-                        [
-                            productCode,
-                            'Product deleted'
-                        ]
-                    );
-                })
-                .then(() => {
-
-                    return client.query(
-                        `INSERT INTO makes_change
-                            (
-                                personal_id,
-                                change_date_time,
-                                product_code
-                            )
-                         VALUES
-                            ($1, NOW(), $2)`,
-                        [
-                            personalId,
-                            productCode
-                        ]
-                    );
-                })
-                .then(() => {
-
-                    return client.query(
-                        `DELETE FROM product
-                         WHERE code = $1
-                           AND store_id = $2`,
-                        [
-                            productCode,
-                            storeId
-                        ]
-                    );
-                })
-                .then(result => {
-
-                    return client.query('COMMIT')
-                        .then(() => {
-
-                            client.release();
-
-                            callback(
-                                null,
-                                result.rowCount
+
+                    // Insert colors if provided
+                    if (productData.colors && Array.isArray(productData.colors) && productData.colors.length > 0) {
+                        productData.colors.forEach(color => {
+                            database.run(
+                                `INSERT INTO color (product_code, name)
+                                 VALUES (?, ?)`,
+                                [productData.code, color],
+                                function(err) {
+                                    if (err) {
+                                        console.error('Error inserting color:', err);
+                                    }
+                                }
                             );
                         });
-                })
-                .catch(err => {
-
-                    return client.query('ROLLBACK')
-                        .catch(() => {})
-                        .then(() => {
-
-                            client.release();
-                            callback(err);
-                        });
-                });
-        })
-        .catch(err => {
-            callback(err);
-        });
-}
-
-
-/*
- * ============================================================
- * CATEGORY FUNCTIONS
- * ============================================================
- */
-
-function getCategories(callback) {
-
-    query(
-        `SELECT *
-         FROM category
-         ORDER BY name`,
-        [],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
-
-function getCategoriesWithParents(callback) {
-
-    query(
-        `SELECT
-            c1.*,
-            c2.name AS parent_name
-         FROM category c1
-         LEFT JOIN category c2
-           ON c1.parent_category_id =
-              c2.category_id
-         ORDER BY c1.name`,
-        [],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
-
-function createCategory(categoryData, callback) {
-
-    query(
-        `INSERT INTO category
-            (
-                name,
-                description,
-                parent_category_id
-            )
-         VALUES
-            ($1, $2, $3)
-         RETURNING category_id`,
-        [
-            categoryData.name,
-            categoryData.description || null,
-            categoryData.parent_id || null
-        ],
-        (err, result) => {
-
+                    }
+
+                    callback(null, productId);
+                }
+            }
+        );
+    });
+}
+
+function updateProduct(personalId, productData, callback) {
+    const updates = [];
+    const params = [];
+
+    if (productData.description !== undefined) {
+        updates.push('description = ?');
+        params.push(productData.description);
+    }
+    if (productData.price !== undefined) {
+        updates.push('price = ?');
+        params.push(productData.price);
+    }
+    if (productData.availability !== undefined) {
+        updates.push('availability = ?');
+        params.push(productData.availability);
+    }
+    if (productData.weight !== undefined) {
+        updates.push('weight = ?');
+        params.push(productData.weight);
+    }
+    if (productData.dimensions !== undefined) {
+        updates.push('dimensions = ?');
+        params.push(productData.dimensions);
+    }
+    if (productData.production_time !== undefined) {
+        updates.push('production_time = ?');
+        params.push(productData.production_time);
+    }
+    if (productData.category_id !== undefined) {
+        updates.push('category_id = ?');
+        params.push(productData.category_id);
+    }
+
+    if (updates.length === 0) {
+        callback(null, 0);
+        return;
+    }
+
+    params.push(productData.code);
+
+    database.run(
+        `UPDATE product SET ${updates.join(', ')} WHERE code = ?`,
+        params,
+        function(err) {
             if (err) {
                 callback(err, null);
             } else {
-
+                // Log the change
+                const changesDesc = `Product updated: ${updates.join(', ')}`;
+                database.run(
+                    `INSERT INTO "change" (date_and_time, product_code, changes)
+                     VALUES (datetime('now'), ?, ?)`,
+                    [productData.code, changesDesc],
+                    function(err) {
+                        if (err) {
+                            console.error('Error logging product update:', err);
+                        }
+                        // Log who made the change
+                        database.run(
+                            `INSERT INTO makes_change (personal_id, change_date_time, product_code)
+                             VALUES (?, datetime('now'), ?)`,
+                            [personalId, productData.code],
+                            function(err) {
+                                if (err) {
+                                    console.error('Error logging change maker:', err);
+                                }
+                            }
+                        );
+                    }
+                );
+
+                // Handle images if provided
+                if (productData.images && Array.isArray(productData.images)) {
+                    // Delete old images first
+                    database.run('DELETE FROM image WHERE product_code = ?', [productData.code], (err) => {
+                        if (!err) {
+                            // Insert new images
+                            productData.images.forEach(image => {
+                                database.run(
+                                    'INSERT INTO image (product_code, image) VALUES (?, ?)',
+                                    [productData.code, image]
+                                );
+                            });
+                        }
+                    });
+                }
+
+                // Handle colors if provided
+                if (productData.colors && Array.isArray(productData.colors)) {
+                    // Delete old colors first
+                    database.run('DELETE FROM color WHERE product_code = ?', [productData.code], (err) => {
+                        if (!err) {
+                            // Insert new colors
+                            productData.colors.forEach(color => {
+                                database.run(
+                                    'INSERT INTO color (product_code, color) VALUES (?, ?)',
+                                    [productData.code, color]
+                                );
+                            });
+                        }
+                    });
+                }
+
+                callback(null, this.changes);
+            }
+        }
+    );
+}
+
+function deleteProduct(productCode, storeId, personalId, callback) {
+    database.run('BEGIN TRANSACTION', (err) => {
+        if (err) {
+            callback(err);
+            return;
+        }
+
+        // Log the deletion
+        database.run(
+            `INSERT INTO "change" (date_and_time, product_code, changes)
+             VALUES (datetime('now'), ?, ?)`,
+            [productCode, 'Product deleted'],
+            function(err) {
+                if (err) {
+                    database.run('ROLLBACK');
+                    callback(err);
+                    return;
+                }
+
+                // Log who deleted it
+                database.run(
+                    `INSERT INTO makes_change (personal_id, change_date_time, product_code)
+                     VALUES (?, datetime('now'), ?)`,
+                    [personalId, productCode],
+                    function(err) {
+                        if (err) {
+                            database.run('ROLLBACK');
+                            callback(err);
+                            return;
+                        }
+
+                        // Delete the product (cascades to image, color)
+                        database.run(
+                            'DELETE FROM product WHERE code = ? AND store_id = ?',
+                            [productCode, storeId],
+                            function(err) {
+                                if (err) {
+                                    database.run('ROLLBACK');
+                                    callback(err);
+                                } else {
+                                    database.run('COMMIT', callback);
+                                }
+                            }
+                        );
+                    }
+                );
+            }
+        );
+    });
+}
+
+// Category functions
+function getCategories(callback) {
+    database.all('SELECT * FROM category ORDER BY name', [], (err, rows) => {
+        callback(err, rows || []);
+    });
+}
+
+function getCategoriesWithParents(callback) {
+    database.all(
+        `SELECT c1.*, c2.name as parent_name
+         FROM category c1
+         LEFT JOIN category c2 ON c1.parent_category_id = c2.category_id
+         ORDER BY c1.name`,
+        [],
+        (err, rows) => {
+            callback(err, rows || []);
+        }
+    );
+}
+
+function createCategory(categoryData, callback) {
+    database.run(
+        'INSERT INTO category (name, description, parent_category_id) VALUES (?, ?, ?)',
+        [categoryData.name, categoryData.description || null, categoryData.parent_id || null],
+        function(err) {
+            if (err) {
+                callback(err, null);
+            } else {
                 callback(null, {
-                    id: result.rows[0].category_id,
+                    id: this.lastID,
                     name: categoryData.name,
                     parent_id: categoryData.parent_id,
@@ -1242,136 +600,146 @@
 }
 
-
-/*
- * ============================================================
- * STORE FUNCTIONS
- * ============================================================
- */
-
+// Store functions
 function getStores(callback) {
-
-    query(
-        `SELECT *
-         FROM store
-         ORDER BY name`,
-        [],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
+    database.all('SELECT * FROM store ORDER BY name', [], (err, rows) => {
+        callback(err, rows || []);
+    });
+}
 
 function getStoreProducts(storeId, callback) {
-
-    query(
-        `SELECT
-            p.*,
-            c.name AS category_name
+    database.all(
+        `SELECT p.*, c.name as category_name
          FROM product p
-         JOIN category c
-           ON p.category_id = c.category_id
-         WHERE p.store_id = $1
+         JOIN category c ON p.category_id = c.category_id
+         WHERE p.store_id = ?
          ORDER BY p.code`,
         [storeId],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
+        (err, rows) => {
+            if (err) {
+                callback(err, null);
+            } else {
+                callback(null, rows || []);
+            }
+        }
+    );
+}
 
 function getStoreOrders(storeId, callback) {
-
-    query(
-        `SELECT
-            o.*,
-            c.first_name,
-            c.last_name
+    database.all(
+        `SELECT o.*, c.first_name, c.last_name
          FROM "order" o
-         JOIN client c
-           ON o.client_id = c.client_id
-         WHERE o.store_id = $1
+         JOIN client c ON o.client_id = c.client_id
+         WHERE o.store_id = ?
          ORDER BY o.order_date DESC`,
         [storeId],
-        (err, result) => {
-
+        (err, rows) => {
             if (err) {
                 callback(err, null);
-                return;
-            }
-
-            const orders = result.rows || [];
-
-            if (orders.length === 0) {
-                callback(null, []);
-                return;
-            }
-
-            let completed = 0;
-
-            orders.forEach(order => {
-
-                query(
-                    `SELECT
-                        oi.*,
-                        p.description
-                     FROM order_items oi
-                     JOIN product p
-                       ON oi.product_code = p.code
-                     WHERE oi.order_num = $1`,
-                    [order.order_num],
-                    (err, result) => {
-
-                        if (!err) {
-                            order.items =
-                                result.rows || [];
-                        } else {
-                            order.items = [];
-                        }
-
-                        completed++;
-
-                        if (completed === orders.length) {
-                            callback(null, orders);
-                        }
-                    }
-                );
-            });
-        }
-    );
-}
-
+            } else {
+                // Get order items for each order
+                let completed = 0;
+                const orders = rows || [];
+
+                if (orders.length === 0) {
+                    callback(null, []);
+                    return;
+                }
+
+                orders.forEach(order => {
+                    database.all(
+                        `SELECT oi.*, p.description
+                         FROM order_items oi
+                         JOIN product p ON oi.product_code = p.code
+                         WHERE oi.order_num = ?`,
+                        [order.order_num],
+                        (err, items) => {
+                            if (!err) {
+                                order.items = items || [];
+                            } else {
+                                order.items = [];
+                            }
+
+                            completed++;
+                            if (completed === orders.length) {
+                                callback(null, orders);
+                            }
+                        }
+                    );
+                });
+            }
+        }
+    );
+}
 
 function getStoreEmployees(storeId, callback) {
-
-    query(
-        `SELECT
-            p.*,
-            e.date_of_hire,
-            perm.type AS permission_type,
-            perm.authorisation
+    database.all(
+        `SELECT p.*, e.date_of_hire, perm.type as permission_type, perm.authorisation
          FROM personal p
-         JOIN works_in_store w
-           ON p.id = w.personal_id
-         LEFT JOIN employees e
-           ON p.id = e.employee_id
-         LEFT JOIN permissions perm
-           ON p.id = perm.personal_id
-         WHERE w.store_id = $1`,
+         JOIN works_in_store w ON p.id = w.personal_id
+         LEFT JOIN employees e ON p.id = e.employee_id
+         LEFT JOIN permissions perm ON p.id = perm.personal_id
+         WHERE w.store_id = ?`,
         [storeId],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
+        (err, rows) => {
+            callback(err, rows || []);
+        }
+    );
+}
+
+function getStoreReports(storeId, callback) {
+    database.all(
+        `SELECT * FROM report
+         WHERE store_id = ?
+         ORDER BY generated_at DESC`,
+        [storeId],
+        (err, rows) => {
+            callback(err, rows || []);
+        }
+    );
+}
+
+function getStoreStats(storeId, callback) {
+    const stats = {};
+
+    // Get total products
+    database.get(
+        'SELECT COUNT(*) as total_products FROM product WHERE store_id = ?',
+        [storeId],
+        (err, row) => {
+            stats.total_products = row ? row.total_products : 0;
+
+            // Get total orders
+            database.get(
+                'SELECT COUNT(*) as total_orders FROM "order" WHERE store_id = ?',
+                [storeId],
+                (err, row) => {
+                    stats.total_orders = row ? row.total_orders : 0;
+
+                    // Get total revenue
+                    database.get(
+                        `SELECT SUM(oi.price * oi.quantity) as total_revenue
+                         FROM order_items oi
+                         JOIN "order" o ON oi.order_num = o.order_num
+                         WHERE o.store_id = ?`,
+                        [storeId],
+                        (err, row) => {
+                            stats.total_revenue = row && row.total_revenue ? row.total_revenue : 0;
+
+                            // Get average rating
+                            database.get(
+                                `SELECT AVG(rating) as avg_rating
+                                 FROM review r
+                                 JOIN product p ON r.product_code = p.code
+                                 WHERE p.store_id = ?`,
+                                [storeId],
+                                (err, row) => {
+                                    stats.avg_rating = row && row.avg_rating ? row.avg_rating : 0;
+
+                                    callback(null, stats);
+                                }
+                            );
+                        }
+                    );
+                }
             );
         }
@@ -1379,366 +747,139 @@
 }
 
-
-function getStoreReports(storeId, callback) {
-
-    query(
-        `SELECT
-            r.date,
-            r.store_id,
-            r.overall_profit,
-            r.sales_trend,
-            r.marketing_growth,
-            r.owner_signature
-         FROM report r
-         WHERE r.store_id = $1
-         ORDER BY r.date DESC`,
-        [storeId],
-        (err, result) => {
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
-
-function getStoreStats(storeId, callback) {
-
-    const stats = {};
-
-    query(
-        `SELECT COUNT(DISTINCT se.product_code) AS total_products
-         FROM sells se
-         WHERE se.store_id = $1`,
-        [storeId],
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            stats.total_products = Number(
-                result.rows[0]?.total_products || 0
-            );
-
-            query(
-                `SELECT COUNT(DISTINCT o.order_num) AS total_orders
-                 FROM sells se
-                 JOIN includes i
-                   ON i.product_code = se.product_code
-                 JOIN "order" o
-                   ON o.order_num = i.order_num
-                 WHERE se.store_id = $1`,
-                [storeId],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
-                    }
-
-                    stats.total_orders = Number(
-                        result.rows[0]?.total_orders || 0
-                    );
-
-                    query(
-                        `SELECT
-                            COALESCE(
-                                SUM(
-                                    p.price * i.quantity
-                                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                                ),
-                                0
-                            ) AS total_revenue
-                         FROM sells se
-                         JOIN product p
-                           ON p.code = se.product_code
-                         JOIN includes i
-                           ON i.product_code = se.product_code
-                         JOIN "order" o
-                           ON o.order_num = i.order_num
-                         WHERE se.store_id = $1`,
-                        [storeId],
-                        (err, result) => {
-
+// Order functions
+function createOrderNew(orderData, callback) {
+    database.run('BEGIN TRANSACTION', (err) => {
+        if (err) {
+            callback(err, null);
+            return;
+        }
+
+        database.run(
+            `INSERT INTO "order" (order_num, client_id, order_date, quantity, payment_method,
+                                 discount, delivery_address, store_id)
+             VALUES (?, ?, datetime('now'), ?, ?, ?, ?, ?)`,
+            [
+                orderData.order_num,
+                orderData.client_id,
+                orderData.quantity,
+                orderData.payment_method,
+                orderData.discount,
+                orderData.delivery_address,
+                orderData.store_id
+            ],
+            function(err) {
+                if (err) {
+                    database.run('ROLLBACK');
+                    callback(err, null);
+                    return;
+                }
+
+                let itemsInserted = 0;
+                const items = orderData.items || [];
+
+                if (items.length === 0) {
+                    database.run('COMMIT');
+                    callback(null, orderData.order_num);
+                    return;
+                }
+
+                items.forEach(item => {
+                    database.run(
+                        `INSERT INTO order_items (order_num, product_code, quantity, price)
+                         VALUES (?, ?, ?, ?)`,
+                        [orderData.order_num, item.product_code, item.quantity, item.price],
+                        function(err) {
                             if (err) {
+                                database.run('ROLLBACK');
                                 callback(err, null);
                                 return;
                             }
 
-                            stats.total_revenue = Number(
-                                result.rows[0]?.total_revenue || 0
-                            );
-
-                            query(
-                                `WITH store_reviews AS (
-                                    SELECT DISTINCT
-                                        r.order_num,
-                                        r.rating
-                                    FROM review r
-                                    JOIN includes i
-                                      ON i.order_num = r.order_num
-                                    JOIN sells se
-                                      ON se.product_code = i.product_code
-                                    WHERE se.store_id = $1
-                                )
-                                SELECT COALESCE(AVG(rating), 0) AS avg_rating
-                                FROM store_reviews`,
-                                [storeId],
-                                (err, result) => {
-
+                            itemsInserted++;
+                            if (itemsInserted === items.length) {
+                                database.run('COMMIT', (err) => {
                                     if (err) {
                                         callback(err, null);
-                                        return;
+                                    } else {
+                                        callback(null, orderData.order_num);
                                     }
-
-                                    stats.avg_rating = Number(
-                                        result.rows[0]?.avg_rating || 0
-                                    );
-
-                                    callback(null, stats);
-                                }
-                            );
+                                });
+                            }
                         }
                     );
-                }
-            );
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * ORDER FUNCTIONS
- * ============================================================
- */
-
-function createOrderNew(orderData, callback) {
-
-    pool.connect()
-        .then(client => {
-
-            return client.query('BEGIN')
-                .then(() => {
-
-                    return client.query(
-                        `INSERT INTO "order"
-                            (
-                                order_num,
-                                client_id,
-                                order_date,
-                                quantity,
-                                payment_method,
-                                discount,
-                                delivery_address,
-                                store_id
-                            )
-                         VALUES
-                            (
-                                $1,
-                                $2,
-                                NOW(),
-                                $3,
-                                $4,
-                                $5,
-                                $6,
-                                $7
-                            )`,
-                        [
-                            orderData.order_num,
-                            orderData.client_id,
-                            orderData.quantity,
-                            orderData.payment_method,
-                            orderData.discount,
-                            orderData.delivery_address,
-                            orderData.store_id
-                        ]
-                    );
-                })
-                .then(() => {
-
-                    const items =
-                        orderData.items || [];
-
-                    if (items.length === 0) {
-                        return client.query('COMMIT')
-                            .then(() => {
-
-                                client.release();
-
-                                callback(
-                                    null,
-                                    orderData.order_num
-                                );
-                            });
-                    }
-
-                    return Promise.all(
-                        items.map(item => {
-
-                            return client.query(
-                                `INSERT INTO order_items
-                                    (
-                                        order_num,
-                                        product_code,
-                                        quantity,
-                                        price
-                                    )
-                                 VALUES
-                                    ($1, $2, $3, $4)`,
-                                [
-                                    orderData.order_num,
-                                    item.product_code,
-                                    item.quantity,
-                                    item.price
-                                ]
-                            );
-                        })
-                    )
-                        .then(() => client.query('COMMIT'))
-                        .then(() => {
-
-                            client.release();
-
-                            callback(
-                                null,
-                                orderData.order_num
-                            );
-                        });
-                })
-                .catch(err => {
-
-                    return client.query('ROLLBACK')
-                        .catch(() => {})
-                        .then(() => {
-
-                            client.release();
-                            callback(err, null);
-                        });
                 });
-        })
-        .catch(err => {
-            callback(err, null);
-        });
-}
-
+            }
+        );
+    });
+}
 
 function getOrdersByClient(clientId, callback) {
-
-    query(
-        `SELECT
-            o.*,
-            s.name AS store_name
+    database.all(
+        `SELECT o.*, s.name as store_name
          FROM "order" o
-         JOIN store s
-           ON o.store_id = s.store_id
-         WHERE o.client_id = $1
+         JOIN store s ON o.store_id = s.store_id
+         WHERE o.client_id = ?
          ORDER BY o.order_date DESC`,
         [clientId],
-        (err, result) => {
-
+        (err, rows) => {
             if (err) {
                 callback(err, null);
-                return;
-            }
-
-            const orders = result.rows || [];
-
-            if (orders.length === 0) {
-                callback(null, []);
-                return;
-            }
-
-            let completed = 0;
-
-            orders.forEach(order => {
-
-                query(
-                    `SELECT
-                        oi.*,
-                        p.description
-                     FROM order_items oi
-                     JOIN product p
-                       ON oi.product_code = p.code
-                     WHERE oi.order_num = $1`,
-                    [order.order_num],
-                    (err, result) => {
-
-                        if (!err) {
-                            order.items =
-                                result.rows || [];
-                        } else {
-                            order.items = [];
-                        }
-
-                        completed++;
-
-                        if (completed === orders.length) {
-                            callback(null, orders);
-                        }
-                    }
-                );
-            });
-        }
-    );
-}
-
+            } else {
+                // Get order items for each order
+                let completed = 0;
+                const orders = rows || [];
+
+                if (orders.length === 0) {
+                    callback(null, []);
+                    return;
+                }
+
+                orders.forEach(order => {
+                    database.all(
+                        `SELECT oi.*, p.description
+                         FROM order_items oi
+                         JOIN product p ON oi.product_code = p.code
+                         WHERE oi.order_num = ?`,
+                        [order.order_num],
+                        (err, items) => {
+                            if (!err) {
+                                order.items = items || [];
+                            } else {
+                                order.items = [];
+                            }
+
+                            completed++;
+                            if (completed === orders.length) {
+                                callback(null, orders);
+                            }
+                        }
+                    );
+                });
+            }
+        }
+    );
+}
 
 function getAllOrders(callback) {
-
-    query(
-        `SELECT
-            o.*,
-            c.first_name,
-            c.last_name,
-            s.name AS store_name
+    database.all(
+        `SELECT o.*, c.first_name, c.last_name, s.name as store_name
          FROM "order" o
-         JOIN client c
-           ON o.client_id = c.client_id
-         JOIN store s
-           ON o.store_id = s.store_id
+         JOIN client c ON o.client_id = c.client_id
+         JOIN store s ON o.store_id = s.store_id
          ORDER BY o.order_date DESC`,
         [],
-        (err, result) => {
-
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * REVIEW FUNCTIONS
- * ============================================================
- */
-
+        (err, rows) => {
+            callback(err, rows || []);
+        }
+    );
+}
+
+// Review functions
 function createReviewNew(reviewData, callback) {
-
-    const reviewId =
-        'REV' +
-        Date.now().toString().slice(-8);
-
-    query(
-        `INSERT INTO review
-            (
-                review_id,
-                client_id,
-                product_code,
-                rating,
-                comment,
-                review_date
-            )
-         VALUES
-            ($1, $2, $3, $4, $5, NOW())
-         RETURNING review_id`,
+    database.run(
+        `INSERT INTO review (review_id, client_id, product_code, rating, comment, review_date)
+         VALUES (?, ?, ?, ?, ?, datetime('now'))`,
         [
-            reviewId,
+            'REV' + Date.now().toString().slice(-8),
             reviewData.client_id,
             reviewData.product_code,
@@ -1746,38 +887,19 @@
             reviewData.comment || ''
         ],
-        (err, result) => {
-
+        function(err) {
             if (err) {
                 callback(err, null);
             } else {
-                callback(
-                    null,
-                    result.rows[0].review_id
-                );
-            }
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * REQUEST FUNCTIONS
- * ============================================================
- */
-
+                callback(null, this.lastID);
+            }
+        }
+    );
+}
+
+// Request functions
 function createRequest(requestData, callback) {
-
-    query(
-        `INSERT INTO request
-            (
-                request_num,
-                date_and_time,
-                problem,
-                client_id,
-                store_id
-            )
-         VALUES
-            ($1, $2, $3, $4, $5)`,
+    database.run(
+        `INSERT INTO request (request_num, date_and_time, problem, client_id, store_id)
+         VALUES (?, ?, ?, ?, ?)`,
         [
             requestData.request_num,
@@ -1787,38 +909,19 @@
             requestData.store_id
         ],
-        (err) => {
-
+        function(err) {
             if (err) {
                 callback(err, null);
             } else {
-                callback(
-                    null,
-                    requestData.request_num
-                );
-            }
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * REFUND FUNCTIONS
- * ============================================================
- */
-
+                callback(null, requestData.request_num);
+            }
+        }
+    );
+}
+
+// Refund functions
 function createRefund(refundData, callback) {
-
-    query(
-        `INSERT INTO refund
-            (
-                refund_id,
-                order_num,
-                amount,
-                reason,
-                request_date
-            )
-         VALUES
-            ($1, $2, $3, $4, NOW())`,
+    database.run(
+        `INSERT INTO refund (refund_id, order_num, amount, reason, request_date)
+         VALUES (?, ?, ?, ?, datetime('now'))`,
         [
             refundData.refund_id,
@@ -1827,31 +930,16 @@
             refundData.reason
         ],
-        (err) => {
-
+        function(err) {
             if (err) {
                 callback(err, null);
             } else {
-                callback(
-                    null,
-                    refundData.refund_id
-                );
-            }
-        }
-    );
-}
-
-
-/*
- * ============================================================
- * EMPLOYEE TASKS
- * ============================================================
- */
-
-function getEmployeeTasks(
-    personalId,
-    storeId,
-    callback
-) {
-
+                callback(null, refundData.refund_id);
+            }
+        }
+    );
+}
+
+// Employee task functions
+function getEmployeeTasks(personalId, storeId, callback) {
     const tasks = {
         pending_orders: [],
@@ -1860,88 +948,44 @@
     };
 
-    /*
-     * Pending orders
-     */
-    query(
-        `SELECT
-            o.*,
-            c.first_name,
-            c.last_name
+    // Get pending orders
+    database.all(
+        `SELECT o.*, c.first_name, c.last_name
          FROM "order" o
-         JOIN client c
-           ON o.client_id = c.client_id
-         WHERE o.store_id = $1
-           AND o.status = $2
+         JOIN client c ON o.client_id = c.client_id
+         WHERE o.store_id = ? AND o.status = 'pending'
          ORDER BY o.order_date ASC`,
-        [
-            storeId,
-            'pending'
-        ],
-        (err, result) => {
-
+        [storeId],
+        (err, rows) => {
             if (!err) {
-                tasks.pending_orders =
-                    result.rows || [];
-            }
-
-            /*
-             * Pending requests
-             */
-            query(
-                `SELECT
-                    r.*,
-                    c.first_name,
-                    c.last_name
+                tasks.pending_orders = rows || [];
+            }
+
+            // Get pending requests
+            database.all(
+                `SELECT r.*, c.first_name, c.last_name
                  FROM request r
-                 JOIN client c
-                   ON r.client_id = c.client_id
-                 WHERE r.store_id = $1
-                   AND r.status = $2
+                 JOIN client c ON r.client_id = c.client_id
+                 WHERE r.store_id = ? AND r.status = 'pending'
                  ORDER BY r.date_and_time ASC`,
-                [
-                    storeId,
-                    'pending'
-                ],
-                (err, result) => {
-
+                [storeId],
+                (err, rows) => {
                     if (!err) {
-                        tasks.pending_requests =
-                            result.rows || [];
+                        tasks.pending_requests = rows || [];
                     }
 
-                    /*
-                     * Pending refunds
-                     */
-                    query(
-                        `SELECT
-                            rf.*,
-                            o.client_id,
-                            c.first_name,
-                            c.last_name
+                    // Get pending refunds
+                    database.all(
+                        `SELECT rf.*, o.client_id, c.first_name, c.last_name
                          FROM refund rf
-                         JOIN "order" o
-                           ON rf.order_num =
-                              o.order_num
-                         JOIN client c
-                           ON o.client_id =
-                              c.client_id
-                         WHERE o.store_id = $1
-                           AND rf.status = $2
+                         JOIN "order" o ON rf.order_num = o.order_num
+                         JOIN client c ON o.client_id = c.client_id
+                         WHERE o.store_id = ? AND rf.status = 'pending'
                          ORDER BY rf.request_date ASC`,
-                        [
-                            storeId,
-                            'pending'
-                        ],
-                        (err, result) => {
-
+                        [storeId],
+                        (err, rows) => {
                             if (!err) {
-                                tasks.pending_refunds =
-                                    result.rows || [];
+                                tasks.pending_refunds = rows || [];
                             }
-
-                            callback(
-                                null,
-                                tasks
-                            );
+                            callback(null, tasks);
                         }
                     );
@@ -1952,114 +996,40 @@
 }
 
-
-/*
- * ============================================================
- * CLIENT STATISTICS
- * ============================================================
- */
-
+// Client stats functions
 function getClientStats(clientId, callback) {
-
     const stats = {};
 
-    query(
-        `SELECT COUNT(*) AS total_orders
-         FROM "order"
-         WHERE client_id = $1`,
+    // Get total orders
+    database.get(
+        'SELECT COUNT(*) as total_orders FROM "order" WHERE client_id = ?',
         [clientId],
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            stats.total_orders =
-                Number(
-                    result.rows[0]
-                        ? result.rows[0].total_orders
-                        : 0
-                );
-
-            query(
-                `SELECT
-                    COALESCE(
-                        SUM(
-                            oi.price * oi.quantity
-                        ),
-                        0
-                    ) AS total_spent
+        (err, row) => {
+            stats.total_orders = row ? row.total_orders : 0;
+
+            // Get total spent
+            database.get(
+                `SELECT SUM(oi.price * oi.quantity) as total_spent
                  FROM order_items oi
-                 JOIN "order" o
-                   ON oi.order_num = o.order_num
-                 WHERE o.client_id = $1`,
+                 JOIN "order" o ON oi.order_num = o.order_num
+                 WHERE o.client_id = ?`,
                 [clientId],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
-                    }
-
-                    stats.total_spent =
-                        Number(
-                            result.rows[0]
-                                ? result.rows[0].total_spent
-                                : 0
-                        );
-
-                    query(
-                        `SELECT COUNT(*) AS pending_orders
-                         FROM "order"
-                         WHERE client_id = $1
-                           AND status = $2`,
-                        [
-                            clientId,
-                            'pending'
-                        ],
-                        (err, result) => {
-
-                            if (err) {
-                                callback(err, null);
-                                return;
-                            }
-
-                            stats.pending_orders =
-                                Number(
-                                    result.rows[0]
-                                        ? result.rows[0]
-                                            .pending_orders
-                                        : 0
-                                );
-
-                            query(
-                                `SELECT
-                                    COUNT(*) AS delivered_orders
-                                 FROM "order"
-                                 WHERE client_id = $1
-                                   AND status = $2`,
-                                [
-                                    clientId,
-                                    'delivered'
-                                ],
-                                (err, result) => {
-
-                                    if (err) {
-                                        callback(err, null);
-                                        return;
-                                    }
-
-                                    stats.delivered_orders =
-                                        Number(
-                                            result.rows[0]
-                                                ? result.rows[0]
-                                                    .delivered_orders
-                                                : 0
-                                        );
-
-                                    callback(
-                                        null,
-                                        stats
-                                    );
+                (err, row) => {
+                    stats.total_spent = row && row.total_spent ? row.total_spent : 0;
+
+                    // Get pending orders
+                    database.get(
+                        'SELECT COUNT(*) as pending_orders FROM "order" WHERE client_id = ? AND status = "pending"',
+                        [clientId],
+                        (err, row) => {
+                            stats.pending_orders = row ? row.pending_orders : 0;
+
+                            // Get delivered orders
+                            database.get(
+                                'SELECT COUNT(*) as delivered_orders FROM "order" WHERE client_id = ? AND status = "delivered"',
+                                [clientId],
+                                (err, row) => {
+                                    stats.delivered_orders = row ? row.delivered_orders : 0;
+
+                                    callback(null, stats);
                                 }
                             );
@@ -2072,175 +1042,46 @@
 }
 
-
-/*
- * ============================================================
- * ADMIN USER FUNCTIONS
- * ============================================================
- */
-
+// User functions for admin
 function getAllUsers(callback) {
-
-    query(
-        `SELECT
-            client_id AS id,
-            first_name,
-            last_name,
-            email,
-            'client' AS user_type,
-            NULL AS username,
-            5 AS role_priority
+    const users = [];
+
+    // Get client users
+    database.all(
+        `SELECT client_id as id, first_name, last_name, email, 'client' as user_type
          FROM client
          ORDER BY client_id`,
         [],
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            const usersMap = new Map();
-
-            result.rows.forEach(row => {
-                usersMap.set(row.id, row);
-            });
-
-            /*
-             * Personal users
-             */
-            query(
-                `SELECT
-                    p.id,
-                    p.first_name,
-                    p.last_name,
-                    p.email,
-                    CASE
-                        WHEN b.boss_id IS NOT NULL
-                            THEN 'store_owner'
-                        ELSE 'store_employee'
-                    END AS user_type,
-                    NULL AS username,
-                    CASE
-                        WHEN b.boss_id IS NOT NULL
-                            THEN 2
-                        ELSE 4
-                    END AS role_priority
+        (err, rows) => {
+            if (!err) {
+                users.push(...(rows || []));
+            }
+
+            // Get personal users
+            database.all(
+                `SELECT p.id, p.first_name, p.last_name, p.email,
+                        CASE WHEN b.boss_id IS NOT NULL THEN 'store_owner'
+                             WHEN e.employee_id IS NOT NULL THEN 'store_employee'
+                             ELSE 'personal' END as user_type
                  FROM personal p
-                 LEFT JOIN boss b
-                   ON p.id = b.boss_id
-                 LEFT JOIN employees e
-                   ON p.id = e.employee_id
-                 WHERE b.boss_id IS NOT NULL
-                    OR e.employee_id IS NOT NULL
+                 LEFT JOIN boss b ON p.id = b.boss_id
+                 LEFT JOIN employees e ON p.id = e.employee_id
                  ORDER BY p.id`,
                 [],
-                (err, result) => {
-
-                    if (err) {
-                        callback(err, null);
-                        return;
+                (err, rows) => {
+                    if (!err) {
+                        users.push(...(rows || []));
                     }
 
-                    result.rows.forEach(row => {
-
-                        const existing =
-                            usersMap.get(row.id);
-
-                        if (
-                            !existing ||
-                            (
-                                existing.role_priority &&
-                                row.role_priority <
-                                existing.role_priority
-                            )
-                        ) {
-                            usersMap.set(
-                                row.id,
-                                row
-                            );
-                        }
-                    });
-
-                    /*
-                     * System users
-                     */
-                    query(
-                        `SELECT
-                            id,
-                            username,
-                            email,
-                            user_type,
-                            CASE
-                                WHEN user_type = 'admin'
-                                    THEN 1
-                                ELSE 3
-                            END AS role_priority
+                    // Get system users
+                    database.all(
+                        `SELECT id, username, email, user_type
                          FROM users
                          ORDER BY id`,
                         [],
-                        (err, result) => {
-
-                            if (err) {
-                                callback(err, null);
-                                return;
+                        (err, rows) => {
+                            if (!err) {
+                                users.push(...(rows || []));
                             }
-
-                            result.rows.forEach(row => {
-
-                                const existing =
-                                    usersMap.get(row.id);
-
-                                if (
-                                    !existing ||
-                                    (
-                                        existing.role_priority &&
-                                        row.role_priority <
-                                        existing.role_priority
-                                    )
-                                ) {
-
-                                    const userData = {
-                                        id: row.id,
-                                        username: row.username,
-                                        email: row.email,
-                                        user_type: row.user_type,
-                                        role_priority: row.role_priority
-                                    };
-
-                                    if (
-                                        row.user_type ===
-                                        'admin'
-                                    ) {
-                                        userData.first_name =
-                                            'Admin';
-
-                                        userData.last_name =
-                                            'User';
-                                    }
-
-                                    usersMap.set(
-                                        row.id,
-                                        userData
-                                    );
-                                }
-                            });
-
-                            const users =
-                                Array.from(
-                                    usersMap.values()
-                                ).map(user => {
-
-                                    const {
-                                        role_priority,
-                                        ...userWithoutPriority
-                                    } = user;
-
-                                    return userWithoutPriority;
-                                });
-
-                            callback(
-                                null,
-                                users
-                            );
+                            callback(null, users);
                         }
                     );
@@ -2251,931 +1092,33 @@
 }
 
-
-/*
- * ============================================================
- * AUDIT LOG
- * ============================================================
- */
-
-function logAudit(
-    userId,
-    action,
-    resourceType,
-    resourceId,
-    details,
-    ipAddress
-) {
-
-    query(
-        `INSERT INTO audit_log
-            (
-                user_id,
-                action,
-                resource_type,
-                resource_id,
-                details,
-                ip_address
-            )
-         VALUES
-            ($1, $2, $3, $4, $5, $6)`,
-        [
-            userId,
-            action,
-            resourceType,
-            resourceId,
-            details,
-            ipAddress
-        ],
+// Audit log function
+function logAudit(userId, action, resourceType, resourceId, details, ipAddress) {
+    database.run(
+        `INSERT INTO audit_log (user_id, action, resource_type, resource_id, details, ip_address)
+         VALUES (?, ?, ?, ?, ?, ?)`,
+        [userId, action, resourceType, resourceId, details, ipAddress],
         (err) => {
-
             if (err) {
-                console.error(
-                    'Error logging audit:',
-                    err
-                );
-            }
-        }
-    );
-}
-
-
-
-
-/*
- * ============================================================
- * ADVANCED REPORTS
- * ============================================================
- */
-
-
-const REPORT_FUNCTIONS_SQL = String.raw`
--- ============================================================
--- HANDCRAFT MARKETPLACE REPORT FUNCTIONS
--- PostgreSQL / exact project schema
--- ============================================================
-
-CREATE OR REPLACE FUNCTION get_orders_by_total()
-RETURNS TABLE (
-    order_num VARCHAR(11),
-    client_id INTEGER,
-    client_name TEXT,
-    order_quantity BIGINT,
-    order_status VARCHAR(20),
-    payment_method VARCHAR(250),
-    discount NUMERIC,
-    order_total NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        o.order_num,
-        o.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name) AS client_name,
-        COALESCE(SUM(i.quantity), 0)::BIGINT AS order_quantity,
-        o.status,
-        o.payment_method,
-        COALESCE(o.discount, 0)::NUMERIC AS discount,
-        ROUND(
-            COALESCE(SUM(p.price * i.quantity), 0)
-            * (1 - COALESCE(o.discount, 0) / 100.0),
-            2
-        ) AS order_total
-    FROM "order" o
-    LEFT JOIN client c ON c.client_id = o.client_id
-    LEFT JOIN includes i ON i.order_num = o.order_num
-    LEFT JOIN product p ON p.code = i.product_code
-    GROUP BY
-        o.order_num, o.client_id, c.first_name, c.last_name,
-        o.status, o.payment_method, o.discount
-    ORDER BY order_total DESC, o.order_num;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_by_total_sales()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.price::NUMERIC,
-        COUNT(DISTINCT i.order_num) AS number_of_orders,
-        COALESCE(SUM(i.quantity), 0)::BIGINT AS total_quantity_sold,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        ) AS total_revenue
-    FROM product p
-    LEFT JOIN includes i ON i.product_code = p.code
-    LEFT JOIN "order" o ON o.order_num = i.order_num
-    GROUP BY p.code, p.description, p.price
-    ORDER BY number_of_orders DESC, total_quantity_sold DESC, total_revenue DESC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_low_stock_high_demand_products(
-    p_stock_threshold INTEGER,
-    p_demand_threshold INTEGER
-)
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    current_stock INTEGER,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.availability,
-        COUNT(DISTINCT i.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    GROUP BY p.code, p.description, p.availability
-    HAVING
-        p.availability < p_stock_threshold
-        AND COUNT(DISTINCT i.order_num) >= p_demand_threshold
-    ORDER BY number_of_orders DESC, total_quantity_sold DESC, current_stock ASC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_monthly_sales()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    year INTEGER,
-    month INTEGER,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        EXTRACT(YEAR FROM o.last_date_mod)::INTEGER,
-        EXTRACT(MONTH FROM o.last_date_mod)::INTEGER,
-        COUNT(DISTINCT o.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        )
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    JOIN "order" o ON o.order_num = i.order_num
-    GROUP BY
-        p.code, p.description,
-        EXTRACT(YEAR FROM o.last_date_mod),
-        EXTRACT(MONTH FROM o.last_date_mod)
-    ORDER BY year DESC, month DESC, total_revenue DESC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_last_calendar_year_revenue()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COUNT(DISTINCT o.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        )
-    FROM store s
-    LEFT JOIN sells se ON se.store_id = s.store_id
-    LEFT JOIN product p ON p.code = se.product_code
-    LEFT JOIN includes i ON i.product_code = p.code
-    LEFT JOIN "order" o
-        ON o.order_num = i.order_num
-       AND o.last_date_mod >= DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 year'
-       AND o.last_date_mod < DATE_TRUNC('year', CURRENT_DATE)
-    GROUP BY s.store_id, s.name
-    ORDER BY total_revenue DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_never_ordered()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    current_stock INTEGER
-)
-LANGUAGE sql
-AS $$
-    SELECT p.code, p.description, p.price::NUMERIC, p.availability
-    FROM product p
-    WHERE NOT EXISTS (
-        SELECT 1
-        FROM includes i
-        WHERE i.product_code = p.code
-    )
-    ORDER BY p.code;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_by_number_of_orders()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    number_of_orders BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.price::NUMERIC,
-        COUNT(DISTINCT i.order_num)
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    GROUP BY p.code, p.description, p.price
-    ORDER BY number_of_orders DESC, p.code;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_average_review()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    average_review NUMERIC,
-    number_of_reviews BIGINT
-)
-LANGUAGE sql
-AS $$
-    WITH store_reviews AS (
-        SELECT DISTINCT
-            s.store_id,
-            s.name AS store_name,
-            r.order_num,
-            r.rating
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN review r ON r.order_num = i.order_num
-    )
-    SELECT
-        s.store_id,
-        s.name,
-        COALESCE(ROUND(AVG(sr.rating), 2), 0)::NUMERIC,
-        COUNT(sr.order_num)
-    FROM store s
-    LEFT JOIN store_reviews sr ON sr.store_id = s.store_id
-    GROUP BY s.store_id, s.name
-    ORDER BY average_review DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_store_with_highest_revenue_growth()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    previous_year_revenue NUMERIC,
-    last_year_revenue NUMERIC,
-    revenue_growth NUMERIC
-)
-LANGUAGE sql
-AS $$
-    WITH store_years AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            EXTRACT(YEAR FROM o.last_date_mod)::INTEGER AS sales_year,
-            SUM(
-                p.price * i.quantity
-                * (1 - COALESCE(o.discount, 0) / 100.0)
-            ) AS revenue
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN product p ON p.code = i.product_code
-        JOIN "order" o ON o.order_num = i.order_num
-        WHERE o.last_date_mod >= DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '2 years'
-          AND o.last_date_mod < DATE_TRUNC('year', CURRENT_DATE)
-        GROUP BY s.store_id, s.name, EXTRACT(YEAR FROM o.last_date_mod)
-    ),
-    comparison AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            COALESCE(MAX(CASE
-                WHEN sy.sales_year = EXTRACT(YEAR FROM CURRENT_DATE)::INTEGER - 2
-                THEN sy.revenue ELSE 0 END), 0) AS previous_year_revenue,
-            COALESCE(MAX(CASE
-                WHEN sy.sales_year = EXTRACT(YEAR FROM CURRENT_DATE)::INTEGER - 1
-                THEN sy.revenue ELSE 0 END), 0) AS last_year_revenue
-        FROM store s
-        LEFT JOIN store_years sy ON sy.store_id = s.store_id
-        GROUP BY s.store_id, s.name
-    )
-    SELECT
-        store_id,
-        store_name,
-        ROUND(previous_year_revenue, 2),
-        ROUND(last_year_revenue, 2),
-        ROUND(last_year_revenue - previous_year_revenue, 2)
-    FROM comparison
-    ORDER BY revenue_growth DESC, store_id
-    LIMIT 1;
-$$;
-
-CREATE OR REPLACE FUNCTION get_clients_by_number_of_orders()
-RETURNS TABLE (
-    client_id INTEGER,
-    client_name TEXT,
-    number_of_orders BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        c.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name),
-        COUNT(o.order_num)
-    FROM client c
-    JOIN "order" o ON o.client_id = c.client_id
-    GROUP BY c.client_id, c.first_name, c.last_name
-    ORDER BY number_of_orders DESC, c.client_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_approximate_orders_per_client()
-RETURNS TABLE (
-    total_clients BIGINT,
-    total_orders BIGINT,
-    approximate_orders_per_client NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        (SELECT COUNT(*) FROM client),
-        (SELECT COUNT(*) FROM "order"),
-        ROUND(
-            (SELECT COUNT(*)::NUMERIC FROM "order")
-            / NULLIF((SELECT COUNT(*) FROM client), 0),
-            2
-        );
-$$;
-
-CREATE OR REPLACE FUNCTION get_clients_without_orders()
-RETURNS TABLE (
-    client_id INTEGER,
-    client_name TEXT,
-    email VARCHAR(50)
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        c.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name),
-        c.email
-    FROM client c
-    WHERE NOT EXISTS (
-        SELECT 1 FROM "order" o WHERE o.client_id = c.client_id
-    )
-    ORDER BY c.client_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_store_request_statistics()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    total_requests BIGINT,
-    solved_requests BIGINT,
-    requests_in_progress BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COUNT(r.request_num),
-        COUNT(r.request_num) FILTER (WHERE r.customer_satisfaction > 0),
-        COUNT(r.request_num) FILTER (WHERE r.customer_satisfaction <= 0)
-    FROM store s
-    LEFT JOIN for_store fs ON fs.store_id = s.store_id
-    LEFT JOIN request r ON r.request_num = fs.request_num
-    GROUP BY s.store_id, s.name
-    ORDER BY total_requests DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_top_10_employees_by_requests_last_month()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    number_of_requests BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COUNT(DISTINCT a.request_num)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    JOIN answers a ON a.personal_id = e.employee_id
-    JOIN request r ON r.request_num = a.request_num
-    WHERE r.date_and_time >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-      AND r.date_and_time < DATE_TRUNC('month', CURRENT_DATE)
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY number_of_requests DESC, e.employee_id
-    LIMIT 10;
-$$;
-
-CREATE OR REPLACE FUNCTION get_employees_by_hours_and_pay()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    total_hours_worked NUMERIC,
-    total_pay NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COALESCE(SUM(w.total_hours), 0),
-        COALESCE(SUM(w.wage * w.total_hours), 0)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    LEFT JOIN worked w ON w.personal_id = e.employee_id
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY total_hours_worked DESC, total_pay DESC, e.employee_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_average_pay()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    average_pay NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COALESCE(ROUND(AVG(w.wage), 2), 0)
-    FROM store s
-    LEFT JOIN worked w ON w.store_id = s.store_id
-    GROUP BY s.store_id, s.name
-    ORDER BY average_pay DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_employee_product_changes_last_month()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    number_of_product_changes BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COUNT(mc.change_date_time)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    LEFT JOIN makes_change mc
-        ON mc.personal_id = e.employee_id
-       AND mc.change_date_time >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-       AND mc.change_date_time < DATE_TRUNC('month', CURRENT_DATE)
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY number_of_product_changes DESC, e.employee_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_monthly_profit_and_revenue_growth()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    month_and_year TEXT,
-    monthly_profit NUMERIC,
-    previous_month_revenue NUMERIC,
-    current_month_revenue NUMERIC,
-    revenue_growth NUMERIC
-)
-LANGUAGE sql
-AS $$
-    WITH monthly_revenue AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            DATE_TRUNC('month', o.last_date_mod)::DATE AS month_date,
-            SUM(
-                p.price * i.quantity
-                * (1 - COALESCE(o.discount, 0) / 100.0)
-            ) AS revenue
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN product p ON p.code = i.product_code
-        JOIN "order" o ON o.order_num = i.order_num
-        GROUP BY s.store_id, s.name, DATE_TRUNC('month', o.last_date_mod)
-    ),
-    with_previous AS (
-        SELECT
-            store_id,
-            store_name,
-            month_date,
-            revenue,
-            LAG(revenue) OVER (
-                PARTITION BY store_id
-                ORDER BY month_date
-            ) AS previous_revenue
-        FROM monthly_revenue
-    )
-    SELECT
-        store_id,
-        store_name,
-        TO_CHAR(month_date, 'YYYY-MM'),
-        ROUND(revenue, 2),
-        ROUND(COALESCE(previous_revenue, 0), 2),
-        ROUND(revenue, 2),
-        ROUND(revenue - COALESCE(previous_revenue, 0), 2)
-    FROM with_previous
-    ORDER BY month_date DESC, monthly_profit DESC, store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_unapproved_reports()
-RETURNS TABLE (
-    report_date TIMESTAMP,
-    store_id VARCHAR(3),
-    overall_profit NUMERIC,
-    sales_trend VARCHAR(100),
-    marketing_growth VARCHAR(100),
-    owner_signature VARCHAR(50)
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        r.date,
-        r.store_id,
-        r.overall_profit,
-        r.sales_trend,
-        r.marketing_growth,
-        r.owner_signature
-    FROM report r
-    LEFT JOIN approves a
-        ON a.report_date = r.date
-       AND a.store_id = r.store_id
-    WHERE a.report_date IS NULL
-    ORDER BY r.date DESC, r.store_id;
-$$;
-`;
-
-function installReportFunctions(callback) {
-
-    pool.query(REPORT_FUNCTIONS_SQL)
-        .then(() => {
-            console.log('✅ PostgreSQL report functions installed');
-            if (callback) callback(null);
-        })
-        .catch(err => {
-            console.error('❌ Failed to install PostgreSQL report functions:', err);
-            if (callback) callback(err);
-        });
-}
-
-const REPORT_FUNCTION_NAMES = new Set([
-    'get_orders_by_total',
-    'get_products_by_total_sales',
-    'get_low_stock_high_demand_products',
-    'get_products_monthly_sales',
-    'get_stores_by_last_calendar_year_revenue',
-    'get_products_never_ordered',
-    'get_products_by_number_of_orders',
-    'get_stores_by_average_review',
-    'get_store_with_highest_revenue_growth',
-    'get_clients_by_number_of_orders',
-    'get_approximate_orders_per_client',
-    'get_clients_without_orders',
-    'get_store_request_statistics',
-    'get_top_10_employees_by_requests_last_month',
-    'get_employees_by_hours_and_pay',
-    'get_stores_average_pay',
-    'get_employee_product_changes_last_month',
-    'get_stores_by_monthly_profit_and_revenue_growth',
-    'get_unapproved_reports'
-]);
-
-function runReport(reportName, params, callback) {
-
-    if (!REPORT_FUNCTION_NAMES.has(reportName)) {
-        callback(new Error('Unknown report: ' + reportName), null);
-        return;
-    }
-
-    const values = Array.isArray(params) ? params : [];
-
-    const placeholders = values.map(
-        (_, index) => '$' + (index + 1)
-    ).join(', ');
-
-    query(
-        `SELECT * FROM ${reportName}(${placeholders})`,
-        values,
-        (err, result) => {
-            callback(
-                err,
-                result ? result.rows : []
-            );
-        }
-    );
-}
-
-function generateStoreReport(
-    storeId,
-    startDate,
-    endDate,
-    type,
-    period,
-    ownerSignature,
-    callback
-) {
-
-    query(
-        `WITH sales AS (
-            SELECT
-                COALESCE(
-                    SUM(
-                        p.price * i.quantity
-                        * (1 - COALESCE(o.discount, 0) / 100.0)
-                    ),
-                    0
-                ) AS revenue
-            FROM sells se
-            JOIN product p
-              ON p.code = se.product_code
-            JOIN includes i
-              ON i.product_code = se.product_code
-            JOIN "order" o
-              ON o.order_num = i.order_num
-            WHERE se.store_id = $1
-              AND o.last_date_mod >= $2::timestamp
-              AND o.last_date_mod < ($3::timestamp + INTERVAL '1 day')
-        ),
-        refunds AS (
-            SELECT
-                COALESCE(SUM(rf.amount), 0) AS refund_total
-            FROM refund rf
-            JOIN "order" o
-              ON o.order_num = rf.order_num
-            WHERE LEFT(o.order_num, 3) = $1
-              AND o.last_date_mod >= $2::timestamp
-              AND o.last_date_mod < ($3::timestamp + INTERVAL '1 day')
-              AND rf.status IN ('approved', 'processed')
-        )
-        SELECT
-            sales.revenue,
-            refunds.refund_total,
-            sales.revenue - refunds.refund_total AS net_profit
-        FROM sales CROSS JOIN refunds`,
-        [storeId, startDate, endDate],
-        (err, result) => {
-
-            if (err) {
-                callback(err, null);
-                return;
-            }
-
-            const row = result.rows[0] || {};
-            const revenue = Number(row.revenue || 0);
-            const refundTotal = Number(row.refund_total || 0);
-            const netProfit = Number(row.net_profit || 0);
-
-            const salesTrend =
-                `Revenue ${revenue.toFixed(2)}; Refunds ${refundTotal.toFixed(2)}`;
-
-            query(
-                `SELECT
-                    COALESCE(SUM(
-                        p.price * i.quantity
-                        * (1 - COALESCE(o.discount, 0) / 100.0)
-                    ), 0) AS revenue
-                 FROM sells se
-                 JOIN product p
-                   ON p.code = se.product_code
-                 JOIN includes i
-                   ON i.product_code = se.product_code
-                 JOIN "order" o
-                   ON o.order_num = i.order_num
-                 WHERE se.store_id = $1
-                   AND o.last_date_mod >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-                   AND o.last_date_mod < DATE_TRUNC('month', CURRENT_DATE)`,
-                [storeId],
-                (previousErr, previousResult) => {
-
-                    if (previousErr) {
-                        callback(previousErr, null);
-                        return;
-                    }
-
-                    const previousRevenue =
-                        Number(previousResult.rows[0]?.revenue || 0);
-
-                    const growth =
-                        previousRevenue === 0
-                            ? (revenue > 0 ? 100 : 0)
-                            : ((revenue - previousRevenue) / previousRevenue) * 100;
-
-                    const marketingGrowth =
-                        `${growth.toFixed(2)}%`;
-
-                    query(
-                        `INSERT INTO report
-                            (
-                                date,
-                                store_id,
-                                overall_profit,
-                                sales_trend,
-                                marketing_growth,
-                                owner_signature
-                            )
-                         VALUES
-                            (
-                                CURRENT_TIMESTAMP,
-                                $1,
-                                $2,
-                                $3,
-                                $4,
-                                $5
-                            )
-                         RETURNING
-                            date,
-                            store_id,
-                            overall_profit,
-                            sales_trend,
-                            marketing_growth,
-                            owner_signature`,
-                        [
-                            storeId,
-                            Math.max(0, netProfit),
-                            salesTrend.slice(0, 100),
-                            marketingGrowth.slice(0, 100),
-                            ownerSignature || 'Not signed yet'
-                        ],
-                        (insertErr, insertResult) => {
-
-                            if (insertErr) {
-                                callback(insertErr, null);
-                                return;
-                            }
-
-                            const report = insertResult.rows[0];
-
-                            /*
-                             * monthly_profit has a composite primary key of
-                             * (report_date, store_id), so it can contain one
-                             * summary row per generated report without changing
-                             * the project database structure.
-                             */
-                            query(
-                                `INSERT INTO monthly_profit
-                                    (
-                                        report_date,
-                                        store_id,
-                                        month_and_year,
-                                        profit
-                                    )
-                                 VALUES
-                                    (
-                                        $1,
-                                        $2,
-                                        DATE_TRUNC('month', $3::timestamp)::DATE,
-                                        $4
-                                    )
-                                 ON CONFLICT (report_date, store_id)
-                                 DO UPDATE SET
-                                    month_and_year = EXCLUDED.month_and_year,
-                                    profit = EXCLUDED.profit`,
-                                [
-                                    report.date,
-                                    storeId,
-                                    endDate,
-                                    Math.max(0, netProfit)
-                                ],
-                                (monthlyErr) => {
-
-                                    if (monthlyErr) {
-                                        console.error(
-                                            'Warning inserting monthly profit:',
-                                            monthlyErr
-                                        );
-                                    }
-
-                                    query(
-                                        `INSERT INTO exchanges_data
-                                            (
-                                                report_date,
-                                                store_id,
-                                                monthly_profit,
-                                                date,
-                                                sales,
-                                                damages
-                                            )
-                                         VALUES
-                                            (
-                                                $1,
-                                                $2,
-                                                $3,
-                                                CURRENT_TIMESTAMP,
-                                                $4,
-                                                $5
-                                            )
-                                         ON CONFLICT (report_date, store_id)
-                                         DO UPDATE SET
-                                            monthly_profit = EXCLUDED.monthly_profit,
-                                            date = EXCLUDED.date,
-                                            sales = EXCLUDED.sales,
-                                            damages = EXCLUDED.damages`,
-                                        [
-                                            report.date,
-                                            storeId,
-                                            Math.max(0, netProfit),
-                                            revenue,
-                                            -refundTotal
-                                        ],
-                                        (exchangeErr) => {
-
-                                            if (exchangeErr) {
-                                                console.error(
-                                                    'Warning inserting exchange data:',
-                                                    exchangeErr
-                                                );
-                                            }
-
-                                            callback(
-                                                null,
-                                                report
-                                            );
-                                        }
-                                    );
-                                }
-                            );
-                        }
-                    );
-                }
-            );
-        }
-    );
-}
-/*
- * ============================================================
- * EXPORTS
- * ============================================================
- */
+                console.error('Error logging audit:', err);
+            }
+        }
+    );
+}
 
 module.exports = {
-
-    pool,
-
-    query,
-
+    database,
     ensureGeneralCategory,
     getGeneralCategoryId,
-
     getUserByUsername,
     getUserById,
     createUser,
-
     getClientByEmail,
     getClientById,
     createClient,
     verifyClientPassword,
-
     getPersonalByEmail,
     getPersonalById,
     verifyPassword,
     updatePasswordAndClearForce,
-
     getProducts,
     getProductById,
@@ -3184,9 +1127,7 @@
     updateProduct,
     deleteProduct,
-
     getCategories,
     getCategoriesWithParents,
     createCategory,
-
     getStores,
     getStoreProducts,
@@ -3195,25 +1136,13 @@
     getStoreReports,
     getStoreStats,
-
-    installReportFunctions,
-    runReport,
-    generateStoreReport,
-
     createOrderNew,
     getOrdersByClient,
     getAllOrders,
-
     createReviewNew,
-
     createRequest,
-
     createRefund,
-
     getEmployeeTasks,
-
     getClientStats,
-
     getAllUsers,
-
     logAudit
 };
Index: interfejs/admin.html
===================================================================
--- interfejs/admin.html	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ interfejs/admin.html	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -18,6 +18,4 @@
       <li><a href="products.html">Products</a></li>
       <li><a href="#" id="dashboard-link" class="active">Admin</a></li>
-      <li><a href="change-password.html" class="change-password-btn">🔑 Change Password</a></li>
-      <li><a href="#" id="logout-link">Logout</a></li>
     </ul>
   </nav>
@@ -203,5 +201,4 @@
   document.addEventListener('DOMContentLoaded', async () => {
     const user = await loadUserData();
-
     if (!user || user.userType !== 'admin') {
       window.location.href = 'index.html';
@@ -210,10 +207,4 @@
 
     document.getElementById('admin-name').textContent = user.username || 'Administrator';
-
-    // Logout functionality
-    document.getElementById('logout-link').addEventListener('click', async (e) => {
-      e.preventDefault();
-      await logout();
-    });
 
     // Tab switching
@@ -222,5 +213,4 @@
         document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
         document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
-
         btn.classList.add('active');
         document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active');
@@ -281,17 +271,16 @@
 
       const tbody = document.getElementById('users-list');
-
       if (data.success && data.users.length > 0) {
         tbody.innerHTML = data.users.map(user => `
-                    <tr>
-                        <td>${user.id || user.client_id || 'N/A'}</td>
-                        <td>${user.firstName || user.first_name || user.username || 'N/A'} ${user.lastName || user.last_name || ''}</td>
-                        <td>${user.email || 'N/A'}</td>
-                        <td><span class="status-badge status-${user.user_type || user.userType || 'unknown'}">${user.user_type || user.userType || 'unknown'}</span></td>
-                        <td>
-                            <button class="btn-small" onclick="viewUser('${user.id || user.client_id}')">View</button>
-                        </td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${user.id || user.client_id || 'N/A'}</td>
+                            <td>${user.firstName || user.first_name || user.username || 'N/A'} ${user.lastName || user.last_name || ''}</td>
+                            <td>${user.email || 'N/A'}</td>
+                            <td><span class="status-badge status-${user.user_type || user.userType || 'unknown'}">${user.user_type || user.userType || 'unknown'}</span></td>
+                            <td>
+                                <button class="btn-small" onclick="viewUser('${user.id || user.client_id}')">View</button>
+                            </td>
+                        </tr>
+                    `).join('');
       } else {
         tbody.innerHTML = '<tr><td colspan="5">No users found</td></tr>';
@@ -309,17 +298,16 @@
 
       const tbody = document.getElementById('stores-list');
-
       if (data.success && data.stores.length > 0) {
         tbody.innerHTML = data.stores.map(store => `
-                    <tr>
-                        <td>${store.store_id}</td>
-                        <td>${store.name}</td>
-                        <td>${store.store_email}</td>
-                        <td>${store.rating || '0.0'}</td>
-                        <td>
-                            <button class="btn-small" onclick="viewStore('${store.store_id}')">View</button>
-                        </td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${store.store_id}</td>
+                            <td>${store.name}</td>
+                            <td>${store.store_email}</td>
+                            <td>${store.rating || '0.0'}</td>
+                            <td>
+                                <button class="btn-small" onclick="viewStore('${store.store_id}')">View</button>
+                            </td>
+                        </tr>
+                    `).join('');
       } else {
         tbody.innerHTML = '<tr><td colspan="5">No stores found</td></tr>';
@@ -337,16 +325,15 @@
 
       const tbody = document.getElementById('orders-list');
-
       if (data.success && data.orders.length > 0) {
         tbody.innerHTML = data.orders.map(order => `
-                    <tr>
-                        <td>${order.order_num}</td>
-                        <td>${order.first_name} ${order.last_name}</td>
-                        <td>${order.store_name}</td>
-                        <td>${new Date(order.order_date).toLocaleDateString()}</td>
-                        <td><span class="status-badge status-${order.status}">${order.status}</span></td>
-                        <td>$${parseFloat(order.total || 0).toFixed(2)}</td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${order.order_num}</td>
+                            <td>${order.first_name} ${order.last_name}</td>
+                            <td>${order.store_name}</td>
+                            <td>${new Date(order.order_date).toLocaleDateString()}</td>
+                            <td><span class="status-badge status-${order.status}">${order.status}</span></td>
+                            <td>$${parseFloat(order.total || 0).toFixed(2)}</td>
+                        </tr>
+                    `).join('');
       } else {
         tbody.innerHTML = '<tr><td colspan="6">No orders found</td></tr>';
@@ -375,21 +362,21 @@
     // Mock report generation
     document.getElementById('report-results').innerHTML = `
-            <div class="dashboard-section">
-                <h4>Generated Report: ${type}</h4>
-                <p>Period: ${start} to ${end}</p>
-                <div class="loading">Generating report...</div>
-            </div>
-        `;
+                <div class="dashboard-section">
+                    <h4>Generated Report: ${type}</h4>
+                    <p>Period: ${start} to ${end}</p>
+                    <div class="loading">Generating report...</div>
+                </div>
+            `;
 
     // Simulate report generation
     setTimeout(() => {
       document.getElementById('report-results').innerHTML = `
-                <div class="dashboard-section">
-                    <h4>Report Results</h4>
-                    <p><strong>Total Records:</strong> 42</p>
-                    <p><strong>Summary:</strong> Sample report data for demonstration</p>
-                    <button class="btn-small" onclick="downloadReport()">Download Report</button>
-                </div>
-            `;
+                    <div class="dashboard-section">
+                        <h4>Report Results</h4>
+                        <p><strong>Total Records:</strong> 42</p>
+                        <p><strong>Summary:</strong> Sample report data for demonstration</p>
+                        <button class="btn-small" onclick="downloadReport()">Download Report</button>
+                    </div>
+                `;
     }, 1500);
   }
Index: interfejs/change-password.html
===================================================================
--- interfejs/change-password.html	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ interfejs/change-password.html	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -17,5 +17,5 @@
             <li><a href="index.html">Home</a></li>
             <li><a href="products.html">Products</a></li>
-            <li><a href="#" id="dashboard-link">Dashboard</a></li>
+            <li><a href="login.html">Login</a></li>
         </ul>
     </nav>
@@ -23,12 +23,17 @@
 
 <main>
-    <div class="auth-container">
+    <div class="form-container">
         <h2>Change Password</h2>
-        <div id="password-message" class="message"></div>
+        <p class="form-subtitle" id="password-message">Please set a new password</p>
 
         <form id="change-password-form" class="form">
             <div class="form-group">
+                <label for="current-password">Current Password</label>
+                <input type="password" id="current-password" name="current-password" required>
+            </div>
+
+            <div class="form-group">
                 <label for="new-password">New Password</label>
-                <input type="password" id="new-password" required>
+                <input type="password" id="new-password" name="new-password" required>
                 <small class="password-hint">At least 8 characters with uppercase, lowercase, number, and special character</small>
             </div>
@@ -36,8 +41,10 @@
             <div class="form-group">
                 <label for="confirm-password">Confirm New Password</label>
-                <input type="password" id="confirm-password" required>
+                <input type="password" id="confirm-password" name="confirm-password" required>
             </div>
 
-            <button type="submit" class="btn-primary">Change Password</button>
+            <div class="form-group">
+                <button type="submit" class="btn-primary btn-full">Change Password</button>
+            </div>
         </form>
     </div>
@@ -57,8 +64,4 @@
             </ul>
         </div>
-        <div class="footer-section">
-            <h3>Contact</h3>
-            <p>Email: support@handcraft.com</p>
-        </div>
     </div>
     <div class="footer-bottom">
@@ -69,35 +72,15 @@
 <script src="script.js"></script>
 <script>
-    document.addEventListener('DOMContentLoaded', async function() {
+    document.addEventListener('DOMContentLoaded', () => {
         const urlParams = new URLSearchParams(window.location.search);
-        const forced = urlParams.get('forced');
-        const redirect = urlParams.get('redirect');
+        const isForced = urlParams.get('forced') === 'true';
 
-        // Check if user is authenticated for password change
-        try {
-            const user = await loadUserData();
-            if (!user) {
-                window.location.href = 'login.html';
-                return;
-            }
-        } catch (error) {
-            console.error('Error loading user:', error);
-            window.location.href = 'login.html';
-            return;
+        if (isForced) {
+            document.getElementById('password-message').textContent =
+                'You must change your password before continuing.';
         }
 
-        if (forced === 'true') {
-            const messageDiv = document.getElementById('password-message');
-            messageDiv.className = 'message warning';
-            messageDiv.innerHTML = '⚠️ You are required to change your password before continuing.';
-        }
-
-        // Store redirect URL in session storage
-        if (redirect) {
-            sessionStorage.setItem('passwordChangeRedirect', redirect);
-        }
-
-        // Handle form submission
-        document.getElementById('change-password-form').addEventListener('submit', async function(e) {
+        const form = document.getElementById('change-password-form');
+        form.addEventListener('submit', async (e) => {
             e.preventDefault();
 
@@ -106,17 +89,13 @@
 
             if (newPassword !== confirmPassword) {
-                showMessage('Passwords do not match', 'error');
+                alert('New passwords do not match');
                 return;
             }
 
-            // Password validation
-            const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
-            if (!passwordRegex.test(newPassword)) {
-                showMessage('Password must have at least 8 characters, including uppercase, lowercase, number and special character', 'error');
-                return;
-            }
-
-            // Get redirect from session storage or URL
-            const redirectTo = sessionStorage.getItem('passwordChangeRedirect') || '';
+            const formData = {
+                currentPassword: document.getElementById('current-password').value,
+                newPassword: newPassword,
+                confirmPassword: confirmPassword
+            };
 
             try {
@@ -124,9 +103,5 @@
                     method: 'POST',
                     headers: { 'Content-Type': 'application/json' },
-                    body: JSON.stringify({
-                        newPassword,
-                        confirmPassword,
-                        redirectTo: redirectTo
-                    })
+                    body: JSON.stringify(formData)
                 });
 
@@ -134,25 +109,14 @@
 
                 if (data.success) {
-                    showMessage('Password changed successfully! Redirecting...', 'success');
-                    sessionStorage.removeItem('passwordChangeRedirect');
-
-                    // Redirect to appropriate dashboard
-                    setTimeout(() => {
-                        window.location.href = data.redirectTo || 'dashboard.html';
-                    }, 1500);
+                    alert('Password changed successfully!');
+                    window.location.href = data.redirectTo || 'dashboard.html';
                 } else {
-                    showMessage(data.message || 'Failed to change password', 'error');
+                    alert(data.message || 'Failed to change password');
                 }
             } catch (error) {
-                console.error('Error changing password:', error);
-                showMessage('An error occurred. Please try again.', 'error');
+                console.error('Password change error:', error);
+                alert('An error occurred');
             }
         });
-
-        function showMessage(msg, type) {
-            const messageDiv = document.getElementById('password-message');
-            messageDiv.className = 'message ' + type;
-            messageDiv.textContent = msg;
-        }
     });
 </script>
Index: interfejs/client-dashboard.html
===================================================================
--- interfejs/client-dashboard.html	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ interfejs/client-dashboard.html	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -18,6 +18,4 @@
       <li><a href="products.html">Products</a></li>
       <li><a href="#" id="dashboard-link" class="active">My Dashboard</a></li>
-      <li><a href="change-password.html" class="change-password-btn">🔑 Change Password</a></li>
-      <li><a href="#" id="logout-link">Logout</a></li>
     </ul>
   </nav>
@@ -98,4 +96,5 @@
             <input type="text" id="new-address" required>
           </div>
+
           <div class="form-row">
             <div class="form-group">
@@ -108,12 +107,15 @@
             </div>
           </div>
+
           <div class="form-group">
             <label for="new-country">Country *</label>
             <input type="text" id="new-country" required>
           </div>
+
           <div class="form-group checkbox">
             <input type="checkbox" id="new-is-default">
             <label for="new-is-default">Set as default address</label>
           </div>
+
           <button type="submit" class="btn-primary">Save Address</button>
           <button type="button" class="btn-secondary" id="cancel-add-address">Cancel</button>
@@ -156,8 +158,10 @@
             </select>
           </div>
+
           <div class="form-group">
             <label for="request-problem">Problem Description *</label>
             <textarea id="request-problem" rows="4" required></textarea>
           </div>
+
           <button type="submit" class="btn-primary">Submit Request</button>
           <button type="button" class="btn-secondary" id="cancel-new-request">Cancel</button>
@@ -258,5 +262,4 @@
   document.addEventListener('DOMContentLoaded', async () => {
     const user = await loadUserData();
-
     if (!user || user.userType !== 'client') {
       window.location.href = 'index.html';
@@ -265,10 +268,4 @@
 
     document.getElementById('client-name').textContent = `${user.firstName} ${user.lastName || ''}`;
-
-    // Logout functionality
-    document.getElementById('logout-link').addEventListener('click', async (e) => {
-      e.preventDefault();
-      await logout();
-    });
 
     // Load profile data
@@ -300,5 +297,4 @@
         document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
         document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
-
         btn.classList.add('active');
         document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active');
@@ -356,24 +352,22 @@
 
       const tbody = document.getElementById('orders-list');
-
       if (data.success && data.orders.length > 0) {
         tbody.innerHTML = data.orders.map(order => {
           const total = order.items ? order.items.reduce((sum, item) =>
                   sum + (item.price * item.quantity), 0) : 0;
-
           return `
-                        <tr>
-                            <td>${order.order_num}</td>
-                            <td>${order.store_name || 'Unknown'}</td>
-                            <td>${new Date(order.order_date).toLocaleDateString()}</td>
-                            <td><span class="status-badge status-${order.status}">${order.status}</span></td>
-                            <td>$${total.toFixed(2)}</td>
-                            <td>
-                                <button class="btn-small" onclick="viewOrder('${order.order_num}')">View</button>
-                                ${order.status === 'delivered' ?
+                            <tr>
+                                <td>${order.order_num}</td>
+                                <td>${order.store_name || 'Unknown'}</td>
+                                <td>${new Date(order.order_date).toLocaleDateString()}</td>
+                                <td><span class="status-badge status-${order.status}">${order.status}</span></td>
+                                <td>$${total.toFixed(2)}</td>
+                                <td>
+                                    <button class="btn-small" onclick="viewOrder('${order.order_num}')">View</button>
+                                    ${order.status === 'delivered' ?
                   `<button class="btn-small" onclick="reviewOrder('${order.order_num}')">Review</button>` : ''}
-                            </td>
-                        </tr>
-                    `;
+                                </td>
+                            </tr>
+                        `;
         }).join('');
       } else {
@@ -389,11 +383,11 @@
     // This would need a separate API endpoint
     document.getElementById('addresses-list').innerHTML = `
-            <div class="address-card">
-                <p><strong>Default Address:</strong></p>
-                <p>st. Center num.10, Skopje 1000, North Macedonia</p>
-                <button class="btn-small">Edit</button>
-                <button class="btn-small" style="background: var(--danger);">Delete</button>
-            </div>
-        `;
+                <div class="address-card">
+                    <p><strong>Default Address:</strong></p>
+                    <p>st. Center num.10, Skopje 1000, North Macedonia</p>
+                    <button class="btn-small">Edit</button>
+                    <button class="btn-small" style="background: var(--danger);">Delete</button>
+                </div>
+            `;
   }
 
Index: interfejs/store-employee.html
===================================================================
--- interfejs/store-employee.html	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ interfejs/store-employee.html	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -18,6 +18,4 @@
             <li><a href="products.html">Products</a></li>
             <li><a href="#" id="dashboard-link" class="active">Employee</a></li>
-            <li><a href="change-password.html" class="change-password-btn">🔑 Change Password</a></li>
-            <li><a href="#" id="logout-link">Logout</a></li>
         </ul>
     </nav>
@@ -172,5 +170,4 @@
 </main>
 
-<!-- Respond to Request Modal -->
 <div id="respond-request-modal" class="modal" style="display: none;">
     <div class="modal-content">
@@ -179,8 +176,10 @@
         <form id="respond-request-form" class="form">
             <input type="hidden" id="respond-request-num">
+
             <div class="form-group">
                 <label for="request-response">Your Response</label>
                 <textarea id="request-response" rows="4" required></textarea>
             </div>
+
             <div class="form-group">
                 <label for="request-status">Update Status</label>
@@ -191,4 +190,5 @@
                 </select>
             </div>
+
             <button type="submit" class="btn-primary">Submit Response</button>
         </form>
@@ -196,5 +196,4 @@
 </div>
 
-<!-- Process Refund Modal -->
 <div id="process-refund-modal" class="modal" style="display: none;">
     <div class="modal-content">
@@ -203,4 +202,5 @@
         <form id="process-refund-form" class="form">
             <input type="hidden" id="process-refund-id">
+
             <div class="form-group">
                 <label for="refund-action">Action</label>
@@ -210,8 +210,10 @@
                 </select>
             </div>
+
             <div class="form-group">
                 <label for="refund-notes">Notes</label>
                 <textarea id="refund-notes" rows="3"></textarea>
             </div>
+
             <button type="submit" class="btn-primary">Process Refund</button>
         </form>
@@ -242,5 +244,4 @@
     document.addEventListener('DOMContentLoaded', async () => {
         const user = await loadUserData();
-
         if (!user || user.userType !== 'store_employee') {
             window.location.href = 'index.html';
@@ -249,10 +250,4 @@
 
         document.getElementById('employee-name').textContent = `${user.firstName} ${user.lastName || ''}`;
-
-        // Logout functionality
-        document.getElementById('logout-link').addEventListener('click', async (e) => {
-            e.preventDefault();
-            await logout();
-        });
 
         // Load stores
@@ -282,5 +277,4 @@
                 document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
                 document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
-
                 btn.classList.add('active');
                 document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active');
@@ -322,5 +316,4 @@
                 // Display tasks
                 const tasksList = document.getElementById('tasks-list');
-
                 if (data.tasks.pending_orders.length > 0 || data.tasks.pending_requests.length > 0 || data.tasks.pending_refunds.length > 0) {
                     let tasksHtml = '<div class="task-items">';
@@ -330,9 +323,9 @@
                         data.tasks.pending_orders.forEach(order => {
                             tasksHtml += `
-                                <div class="task-item">
-                                    <p><strong>Order #${order.order_num}</strong> - ${order.first_name} ${order.last_name}</p>
-                                    <button class="btn-small" onclick="updateOrderStatus('${order.order_num}')">Update Status</button>
-                                </div>
-                            `;
+                                    <div class="task-item">
+                                        <p><strong>Order #${order.order_num}</strong> - ${order.first_name} ${order.last_name}</p>
+                                        <button class="btn-small" onclick="updateOrderStatus('${order.order_num}')">Update Status</button>
+                                    </div>
+                                `;
                         });
                     }
@@ -342,10 +335,10 @@
                         data.tasks.pending_requests.forEach(request => {
                             tasksHtml += `
-                                <div class="task-item">
-                                    <p><strong>Request #${request.request_num}</strong> - ${request.first_name} ${request.last_name}</p>
-                                    <p>${request.problem.substring(0, 50)}${request.problem.length > 50 ? '...' : ''}</p>
-                                    <button class="btn-small" onclick="respondToRequest('${request.request_num}')">Respond</button>
-                                </div>
-                            `;
+                                    <div class="task-item">
+                                        <p><strong>Request #${request.request_num}</strong> - ${request.first_name} ${request.last_name}</p>
+                                        <p>${request.problem.substring(0, 50)}${request.problem.length > 50 ? '...' : ''}</p>
+                                        <button class="btn-small" onclick="respondToRequest('${request.request_num}')">Respond</button>
+                                    </div>
+                                `;
                         });
                     }
@@ -355,10 +348,10 @@
                         data.tasks.pending_refunds.forEach(refund => {
                             tasksHtml += `
-                                <div class="task-item">
-                                    <p><strong>Refund #${refund.refund_id}</strong> - Order #${refund.order_num}</p>
-                                    <p>Amount: $${parseFloat(refund.amount).toFixed(2)}</p>
-                                    <button class="btn-small" onclick="processRefund('${refund.refund_id}')">Process</button>
-                                </div>
-                            `;
+                                    <div class="task-item">
+                                        <p><strong>Refund #${refund.refund_id}</strong> - Order #${refund.order_num}</p>
+                                        <p>Amount: $${parseFloat(refund.amount).toFixed(2)}</p>
+                                        <button class="btn-small" onclick="processRefund('${refund.refund_id}')">Process</button>
+                                    </div>
+                                `;
                         });
                     }
@@ -381,23 +374,21 @@
 
             const tbody = document.getElementById('orders-list');
-
             if (data.success && data.orders.length > 0) {
                 tbody.innerHTML = data.orders.map(order => {
                     const total = order.items ? order.items.reduce((sum, item) =>
                         sum + (item.price * item.quantity), 0) : 0;
-
                     return `
-                        <tr>
-                            <td>${order.order_num}</td>
-                            <td>${order.first_name} ${order.last_name}</td>
-                            <td>${new Date(order.order_date).toLocaleDateString()}</td>
-                            <td><span class="status-badge status-${order.status}">${order.status}</span></td>
-                            <td>$${total.toFixed(2)}</td>
-                            <td>
-                                <button class="btn-small" onclick="updateOrderStatus('${order.order_num}')">Update</button>
-                                <button class="btn-small" onclick="viewOrderDetails('${order.order_num}')">View</button>
-                            </td>
-                        </tr>
-                    `;
+                            <tr>
+                                <td>${order.order_num}</td>
+                                <td>${order.first_name} ${order.last_name}</td>
+                                <td>${new Date(order.order_date).toLocaleDateString()}</td>
+                                <td><span class="status-badge status-${order.status}">${order.status}</span></td>
+                                <td>$${total.toFixed(2)}</td>
+                                <td>
+                                    <button class="btn-small" onclick="updateOrderStatus('${order.order_num}')">Update</button>
+                                    <button class="btn-small" onclick="viewOrderDetails('${order.order_num}')">View</button>
+                                </td>
+                            </tr>
+                        `;
                 }).join('');
             } else {
@@ -426,17 +417,16 @@
 
             const tbody = document.getElementById('products-list');
-
             if (data.success && data.products.length > 0) {
                 tbody.innerHTML = data.products.map(product => `
-                    <tr>
-                        <td>${product.code}</td>
-                        <td>${product.description.substring(0, 30)}${product.description.length > 30 ? '...' : ''}</td>
-                        <td>$${parseFloat(product.price).toFixed(2)}</td>
-                        <td>${product.availability}</td>
-                        <td>
-                            <button class="btn-small" onclick="viewProduct('${product.code}')">View</button>
-                        </td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${product.code}</td>
+                            <td>${product.description.substring(0, 30)}${product.description.length > 30 ? '...' : ''}</td>
+                            <td>$${parseFloat(product.price).toFixed(2)}</td>
+                            <td>${product.availability}</td>
+                            <td>
+                                <button class="btn-small" onclick="viewProduct('${product.code}')">View</button>
+                            </td>
+                        </tr>
+                    `).join('');
             } else {
                 tbody.innerHTML = '<tr><td colspan="5">No products found</td></tr>';
Index: interfejs/store-owner.html
===================================================================
--- interfejs/store-owner.html	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ interfejs/store-owner.html	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -18,6 +18,4 @@
             <li><a href="products.html">Products</a></li>
             <li><a href="#" id="dashboard-link" class="active">Store Owner</a></li>
-            <li><a href="change-password.html" class="change-password-btn">🔑 Change Password</a></li>
-            <li><a href="#" id="logout-link">Logout</a></li>
         </ul>
     </nav>
@@ -153,5 +151,4 @@
                     </select>
                 </div>
-
                 <div id="custom-date-range" style="display: none;">
                     <div class="form-row">
@@ -166,5 +163,4 @@
                     </div>
                 </div>
-
                 <div class="form-group">
                     <label for="report-type">Report Type</label>
@@ -176,7 +172,5 @@
                     </select>
                 </div>
-
                 <button id="generate-store-report" class="btn-primary">Generate Report</button>
-
                 <div id="report-results" style="margin-top: 2rem;"></div>
             </div>
@@ -220,12 +214,9 @@
                             <input type="number" id="product-production-time" min="1" required>
                         </div>
-                        <div class="form-group category-group">
+                        <div class="form-group">
                             <label for="product-category">Category *</label>
-                            <div class="category-input-group">
-                                <select id="product-category" required>
-                                    <option value="">Select Category</option>
-                                </select>
-                                <button type="button" id="add-category-btn" class="btn-small btn-secondary">➕ New Category</button>
-                            </div>
+                            <select id="product-category" required>
+                                <option value="">Select Category</option>
+                            </select>
                         </div>
                     </div>
@@ -295,5 +286,4 @@
 </main>
 
-<!-- Edit Product Modal -->
 <div id="edit-product-modal" class="modal" style="display: none;">
     <div class="modal-content modal-large">
@@ -335,12 +325,9 @@
                     <input type="number" id="edit-product-production-time" min="1">
                 </div>
-                <div class="form-group category-group">
+                <div class="form-group">
                     <label for="edit-product-category">Category</label>
-                    <div class="category-input-group">
-                        <select id="edit-product-category">
-                            <option value="">Select Category</option>
-                        </select>
-                        <button type="button" id="edit-add-category-btn" class="btn-small btn-secondary">➕ New Category</button>
-                    </div>
+                    <select id="edit-product-category">
+                        <option value="">Select Category</option>
+                    </select>
                 </div>
             </div>
@@ -361,5 +348,4 @@
 </div>
 
-<!-- Edit Employee Modal -->
 <div id="edit-employee-modal" class="modal" style="display: none;">
     <div class="modal-content">
@@ -395,33 +381,4 @@
 
             <button type="submit" class="btn-primary">Update Employee</button>
-        </form>
-    </div>
-</div>
-
-<!-- Add Category Modal -->
-<div id="add-category-modal" class="modal" style="display: none;">
-    <div class="modal-content">
-        <span class="close">&times;</span>
-        <h2>Create New Category</h2>
-        <form id="add-category-form" class="form">
-            <div class="form-group">
-                <label for="category-name">Category Name *</label>
-                <input type="text" id="category-name" required>
-            </div>
-
-            <div class="form-group">
-                <label for="category-description">Description</label>
-                <textarea id="category-description" rows="3" placeholder="Optional description"></textarea>
-            </div>
-
-            <div class="form-group">
-                <label for="category-parent">Parent Category (optional)</label>
-                <select id="category-parent">
-                    <option value="">None (Top Level Category)</option>
-                </select>
-            </div>
-
-            <button type="submit" class="btn-primary">Create Category</button>
-            <button type="button" id="cancel-category-btn" class="btn-secondary">Cancel</button>
         </form>
     </div>
@@ -451,5 +408,4 @@
     document.addEventListener('DOMContentLoaded', async () => {
         const user = await loadUserData();
-
         if (!user || user.userType !== 'store_owner') {
             window.location.href = 'index.html';
@@ -458,10 +414,4 @@
 
         document.getElementById('owner-name').textContent = `${user.firstName} ${user.lastName || ''}`;
-
-        // Logout functionality
-        document.getElementById('logout-link').addEventListener('click', async (e) => {
-            e.preventDefault();
-            await logout();
-        });
 
         // Load stores
@@ -492,5 +442,4 @@
                 document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
                 document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
-
                 btn.classList.add('active');
                 document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active');
@@ -515,21 +464,4 @@
         // Generate report
         document.getElementById('generate-store-report').addEventListener('click', generateStoreReport);
-
-        // Add Category button functionality
-        document.getElementById('add-category-btn').addEventListener('click', () => {
-            openCategoryModal();
-        });
-
-        document.getElementById('edit-add-category-btn').addEventListener('click', () => {
-            openCategoryModal('edit');
-        });
-
-        // Category form submission
-        document.getElementById('add-category-form').addEventListener('submit', createCategory);
-
-        // Cancel button
-        document.getElementById('cancel-category-btn').addEventListener('click', () => {
-            document.getElementById('add-category-modal').style.display = 'none';
-        });
     });
 
@@ -569,19 +501,18 @@
 
             const tbody = document.getElementById('products-list');
-
             if (data.success && data.products.length > 0) {
                 tbody.innerHTML = data.products.map(product => `
-                    <tr>
-                        <td>${product.code}</td>
-                        <td>${product.description.substring(0, 30)}${product.description.length > 30 ? '...' : ''}</td>
-                        <td>$${parseFloat(product.price).toFixed(2)}</td>
-                        <td>${product.availability}</td>
-                        <td>${product.category_name || 'General'}</td>
-                        <td>
-                            <button class="btn-small" onclick="editProduct('${product.code}')">Edit</button>
-                            <button class="btn-small" style="background: var(--danger);" onclick="deleteProduct('${product.code}', '${storeId}')">Delete</button>
-                        </td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${product.code}</td>
+                            <td>${product.description.substring(0, 30)}${product.description.length > 30 ? '...' : ''}</td>
+                            <td>$${parseFloat(product.price).toFixed(2)}</td>
+                            <td>${product.availability}</td>
+                            <td>${product.category_name || 'General'}</td>
+                            <td>
+                                <button class="btn-small" onclick="editProduct('${product.code}')">Edit</button>
+                                <button class="btn-small" style="background: var(--danger);" onclick="deleteProduct('${product.code}', '${storeId}')">Delete</button>
+                            </td>
+                        </tr>
+                    `).join('');
             } else {
                 tbody.innerHTML = '<tr><td colspan="6">No products found</td></tr>';
@@ -599,22 +530,20 @@
 
             const tbody = document.getElementById('orders-list');
-
             if (data.success && data.orders.length > 0) {
                 tbody.innerHTML = data.orders.map(order => {
                     const total = order.items ? order.items.reduce((sum, item) =>
                         sum + (item.price * item.quantity), 0) : 0;
-
                     return `
-                        <tr>
-                            <td>${order.order_num}</td>
-                            <td>${order.first_name} ${order.last_name}</td>
-                            <td>${new Date(order.order_date).toLocaleDateString()}</td>
-                            <td><span class="status-badge status-${order.status}">${order.status}</span></td>
-                            <td>$${total.toFixed(2)}</td>
-                            <td>
-                                <button class="btn-small" onclick="viewOrder('${order.order_num}')">View</button>
-                            </td>
-                        </tr>
-                    `;
+                            <tr>
+                                <td>${order.order_num}</td>
+                                <td>${order.first_name} ${order.last_name}</td>
+                                <td>${new Date(order.order_date).toLocaleDateString()}</td>
+                                <td><span class="status-badge status-${order.status}">${order.status}</span></td>
+                                <td>$${total.toFixed(2)}</td>
+                                <td>
+                                    <button class="btn-small" onclick="viewOrder('${order.order_num}')">View</button>
+                                </td>
+                            </tr>
+                        `;
                 }).join('');
             } else {
@@ -633,19 +562,18 @@
 
             const tbody = document.getElementById('employees-list');
-
             if (data.success && data.employees.length > 0) {
                 tbody.innerHTML = data.employees.map(emp => `
-                    <tr>
-                        <td>${emp.id}</td>
-                        <td>${emp.first_name} ${emp.last_name}</td>
-                        <td>${emp.email}</td>
-                        <td>${emp.date_of_hire || 'N/A'}</td>
-                        <td><span class="status-badge">${emp.permission_type || 'EMPLOYEE'}</span></td>
-                        <td>
-                            <button class="btn-small" onclick="editEmployee('${emp.id}')">Edit</button>
-                            <button class="btn-small" style="background: var(--danger);" onclick="deleteEmployee('${emp.id}', '${storeId}')">Delete</button>
-                        </td>
-                    </tr>
-                `).join('');
+                        <tr>
+                            <td>${emp.id}</td>
+                            <td>${emp.first_name} ${emp.last_name}</td>
+                            <td>${emp.email}</td>
+                            <td>${emp.date_of_hire || 'N/A'}</td>
+                            <td><span class="status-badge">${emp.permission_type || 'EMPLOYEE'}</span></td>
+                            <td>
+                                <button class="btn-small" onclick="editEmployee('${emp.id}')">Edit</button>
+                                <button class="btn-small" style="background: var(--danger);" onclick="deleteEmployee('${emp.id}', '${storeId}')">Delete</button>
+                            </td>
+                        </tr>
+                    `).join('');
             } else {
                 tbody.innerHTML = '<tr><td colspan="6">No employees found</td></tr>';
@@ -664,76 +592,12 @@
             if (data.success) {
                 const options = data.categories.map(cat =>
-                    `<option value="${cat.category_id}">${cat.name}${cat.parent_name ? ` (subcategory of ${cat.parent_name})` : ''}</option>`
+                    `<option value="${cat.category_id}">${cat.name}</option>`
                 ).join('');
 
                 document.getElementById('product-category').innerHTML = '<option value="">Select Category</option>' + options;
                 document.getElementById('edit-product-category').innerHTML = '<option value="">Select Category</option>' + options;
-
-                // Also load for category parent dropdown
-                const parentOptions = data.categories.map(cat =>
-                    `<option value="${cat.category_id}">${cat.name}</option>`
-                ).join('');
-
-                document.getElementById('category-parent').innerHTML = '<option value="">None (Top Level Category)</option>' + parentOptions;
             }
         } catch (error) {
             console.error('Error loading categories:', error);
-        }
-    }
-
-    function openCategoryModal(source = 'add') {
-        // Store which form triggered this
-        document.getElementById('add-category-modal').dataset.source = source;
-        document.getElementById('add-category-modal').style.display = 'block';
-        document.getElementById('add-category-form').reset();
-    }
-
-    async function createCategory(e) {
-        e.preventDefault();
-
-        const categoryName = document.getElementById('category-name').value.trim();
-        const categoryDescription = document.getElementById('category-description').value.trim();
-        const parentId = document.getElementById('category-parent').value;
-
-        if (!categoryName) {
-            alert('Please enter a category name');
-            return;
-        }
-
-        const categoryData = {
-            name: categoryName,
-            description: categoryDescription,
-            parentId: parentId || null
-        };
-
-        try {
-            const response = await fetch('/api/create-category', {
-                method: 'POST',
-                headers: { 'Content-Type': 'application/json' },
-                body: JSON.stringify(categoryData)
-            });
-
-            const data = await response.json();
-
-            if (data.success) {
-                alert(`Category "${categoryName}" created successfully!`);
-                document.getElementById('add-category-modal').style.display = 'none';
-
-                // Reload categories in all dropdowns
-                await loadCategories();
-
-                // Auto-select the new category if it came from add product form
-                const source = document.getElementById('add-category-modal').dataset.source;
-                if (source === 'edit') {
-                    document.getElementById('edit-product-category').value = data.category.id;
-                } else {
-                    document.getElementById('product-category').value = data.category.id;
-                }
-            } else {
-                alert(data.message || 'Failed to create category');
-            }
-        } catch (error) {
-            console.error('Error creating category:', error);
-            alert('An error occurred while creating the category');
         }
     }
@@ -743,5 +607,4 @@
 
         const storeId = document.getElementById('store-select').value;
-
         if (!storeId) {
             alert('Please select a store first');
@@ -801,5 +664,4 @@
                 document.getElementById('add-product-form').reset();
                 loadProducts(storeId);
-
                 // Switch to products tab
                 document.querySelector('[data-tab="products"]').click();
@@ -817,5 +679,4 @@
 
         const storeId = document.getElementById('store-select').value;
-
         if (!storeId) {
             alert('Please select a store first');
@@ -825,5 +686,4 @@
         const password = document.getElementById('employee-password').value;
         const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
-
         if (!passwordRegex.test(password)) {
             alert('Password must have at least 8 characters, including uppercase, lowercase, number and special character');
@@ -854,5 +714,4 @@
                 document.getElementById('add-employee-form').reset();
                 loadEmployees(storeId);
-
                 // Switch to employees tab
                 document.querySelector('[data-tab="employees"]').click();
@@ -903,5 +762,4 @@
 
         const storeId = document.getElementById('store-select').value;
-
         const formData = {
             code: document.getElementById('edit-product-code').value,
@@ -1002,5 +860,4 @@
 
         const storeId = document.getElementById('store-select').value;
-
         const formData = {
             employeeId: document.getElementById('edit-employee-id').value,
@@ -1040,9 +897,7 @@
 
         let startDate, endDate;
-
         if (period === 'custom') {
             startDate = document.getElementById('report-start').value;
             endDate = document.getElementById('report-end').value;
-
             if (!startDate || !endDate) {
                 alert('Please select start and end dates');
@@ -1077,9 +932,9 @@
 
         document.getElementById('report-results').innerHTML = `
-            <div class="dashboard-section">
-                <h4>Generating Report...</h4>
-                <div class="loading">Please wait</div>
-            </div>
-        `;
+                <div class="dashboard-section">
+                    <h4>Generating Report...</h4>
+                    <div class="loading">Please wait</div>
+                </div>
+            `;
 
         try {
@@ -1100,28 +955,28 @@
             if (data.success) {
                 document.getElementById('report-results').innerHTML = `
-                    <div class="dashboard-section">
-                        <h4>Report Generated Successfully</h4>
-                        <p><strong>Report ID:</strong> ${data.reportId}</p>
-                        <p><strong>Period:</strong> ${data.report.period}</p>
-                        <p><strong>Date Range:</strong> ${data.report.startDate} to ${data.report.endDate}</p>
-                        <p><strong>Type:</strong> ${data.report.type}</p>
-                        <p><strong>Generated:</strong> ${new Date(data.report.generatedAt).toLocaleString()}</p>
-                        <button class="btn-small" onclick="downloadReport('${data.reportId}')">Download Report</button>
-                    </div>
-                `;
+                        <div class="dashboard-section">
+                            <h4>Report Generated Successfully</h4>
+                            <p><strong>Report ID:</strong> ${data.reportId}</p>
+                            <p><strong>Period:</strong> ${data.report.period}</p>
+                            <p><strong>Date Range:</strong> ${data.report.startDate} to ${data.report.endDate}</p>
+                            <p><strong>Type:</strong> ${data.report.type}</p>
+                            <p><strong>Generated:</strong> ${new Date(data.report.generatedAt).toLocaleString()}</p>
+                            <button class="btn-small" onclick="downloadReport('${data.reportId}')">Download Report</button>
+                        </div>
+                    `;
             } else {
                 document.getElementById('report-results').innerHTML = `
-                    <div class="dashboard-section">
-                        <p class="error">Failed to generate report: ${data.message}</p>
-                    </div>
-                `;
+                        <div class="dashboard-section">
+                            <p class="error">Failed to generate report: ${data.message}</p>
+                        </div>
+                    `;
             }
         } catch (error) {
             console.error('Error generating report:', error);
             document.getElementById('report-results').innerHTML = `
-                <div class="dashboard-section">
-                    <p class="error">An error occurred while generating the report</p>
-                </div>
-            `;
+                    <div class="dashboard-section">
+                        <p class="error">An error occurred while generating the report</p>
+                    </div>
+                `;
         }
     }
Index: de_modules/.bin/nodemon
===================================================================
--- node_modules/.bin/nodemon	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../nodemon/bin/nodemon.js" "$@"
-else 
-  exec node  "$basedir/../nodemon/bin/nodemon.js" "$@"
-fi
Index: de_modules/.bin/nodemon.cmd
===================================================================
--- node_modules/.bin/nodemon.cmd	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\nodemon\bin\nodemon.js" %*
Index: de_modules/.bin/nodemon.ps1
===================================================================
--- node_modules/.bin/nodemon.ps1	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,28 +1,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  } else {
-    & "node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
Index: de_modules/.bin/nodetouch
===================================================================
--- node_modules/.bin/nodetouch	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../touch/bin/nodetouch.js" "$@"
-else 
-  exec node  "$basedir/../touch/bin/nodetouch.js" "$@"
-fi
Index: de_modules/.bin/nodetouch.cmd
===================================================================
--- node_modules/.bin/nodetouch.cmd	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\touch\bin\nodetouch.js" %*
Index: de_modules/.bin/nodetouch.ps1
===================================================================
--- node_modules/.bin/nodetouch.ps1	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,28 +1,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  } else {
-    & "node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
Index: de_modules/.bin/semver
===================================================================
--- node_modules/.bin/semver	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../semver/bin/semver.js" "$@"
-else 
-  exec node  "$basedir/../semver/bin/semver.js" "$@"
-fi
Index: de_modules/.bin/semver.cmd
===================================================================
--- node_modules/.bin/semver.cmd	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\semver\bin\semver.js" %*
Index: de_modules/.bin/semver.ps1
===================================================================
--- node_modules/.bin/semver.ps1	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,28 +1,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../semver/bin/semver.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../semver/bin/semver.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../semver/bin/semver.js" $args
-  } else {
-    & "node$exe"  "$basedir/../semver/bin/semver.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
Index: de_modules/.package-lock.json
===================================================================
--- node_modules/.package-lock.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,557 +1,0 @@
-{
-  "name": "handcraft-marketplace",
-  "version": "1.0.0",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "node_modules/anymatch": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
-      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "18 || 20 || >=22"
-      }
-    },
-    "node_modules/bcryptjs": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
-      "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
-      "license": "MIT"
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
-      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/brace-expansion": {
-      "version": "5.0.12",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
-      "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^4.0.2"
-      },
-      "engines": {
-        "node": "20 || >=22"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.4.3",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
-      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/dotenv": {
-      "version": "16.6.1",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
-      "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://dotenvx.com"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "ideallyInert": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ignore-by-default": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "10.2.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
-      "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "brace-expansion": "^5.0.8"
-      },
-      "engines": {
-        "node": "18 || 20 || >=22"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/nodemailer": {
-      "version": "6.10.1",
-      "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz",
-      "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==",
-      "license": "MIT-0",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/nodemon": {
-      "version": "3.1.14",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz",
-      "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chokidar": "^3.5.2",
-        "debug": "^4",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^10.2.1",
-        "pstree.remy": "^1.1.8",
-        "semver": "^7.5.3",
-        "simple-update-notifier": "^2.0.0",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.5"
-      },
-      "bin": {
-        "nodemon": "bin/nodemon.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/nodemon"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pg": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz",
-      "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "pg-connection-string": "^2.14.0",
-        "pg-pool": "^3.14.0",
-        "pg-protocol": "^1.16.0",
-        "pg-types": "2.2.0",
-        "pgpass": "1.0.5"
-      },
-      "engines": {
-        "node": ">= 16.0.0"
-      },
-      "optionalDependencies": {
-        "pg-cloudflare": "^1.4.0"
-      },
-      "peerDependencies": {
-        "pg-native": ">=3.0.1"
-      },
-      "peerDependenciesMeta": {
-        "pg-native": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/pg-cloudflare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz",
-      "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==",
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/pg-connection-string": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz",
-      "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==",
-      "license": "MIT"
-    },
-    "node_modules/pg-int8": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
-      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/pg-pool": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz",
-      "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==",
-      "license": "MIT",
-      "peerDependencies": {
-        "pg": ">=8.0"
-      }
-    },
-    "node_modules/pg-protocol": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz",
-      "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==",
-      "license": "MIT"
-    },
-    "node_modules/pg-types": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
-      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
-      "license": "MIT",
-      "dependencies": {
-        "pg-int8": "1.0.1",
-        "postgres-array": "~2.0.0",
-        "postgres-bytea": "~1.0.0",
-        "postgres-date": "~1.0.4",
-        "postgres-interval": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pgpass": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
-      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
-      "license": "MIT",
-      "dependencies": {
-        "split2": "^4.1.0"
-      }
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
-      "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/postgres-array": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
-      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postgres-bytea": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
-      "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/postgres-date": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
-      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/postgres-interval": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
-      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "xtend": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pstree.remy": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/semver": {
-      "version": "7.8.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
-      "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/simple-update-notifier": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
-      "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.5.3"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/split2": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
-      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
-      "license": "ISC",
-      "engines": {
-        "node": ">= 10.x"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/touch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
-      "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "nodetouch": "bin/nodetouch.js"
-      }
-    },
-    "node_modules/undefsafe": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
-      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4"
-      }
-    }
-  }
-}
Index: de_modules/anymatch/LICENSE
===================================================================
--- node_modules/anymatch/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-The ISC License
-
-Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/anymatch/README.md
===================================================================
--- node_modules/anymatch/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,87 +1,0 @@
-anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master)
-======
-Javascript module to match a string against a regular expression, glob, string,
-or function that takes the string as an argument and returns a truthy or falsy
-value. The matcher can also be an array of any or all of these. Useful for
-allowing a very flexible user-defined config to define things like file paths.
-
-__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__
-
-
-Usage
------
-```sh
-npm install anymatch
-```
-
-#### anymatch(matchers, testString, [returnIndex], [options])
-* __matchers__: (_Array|String|RegExp|Function_)
-String to be directly matched, string with glob patterns, regular expression
-test, function that takes the testString as an argument and returns a truthy
-value if it should be matched, or an array of any number and mix of these types.
-* __testString__: (_String|Array_) The string to test against the matchers. If
-passed as an array, the first element of the array will be used as the
-`testString` for non-function matchers, while the entire array will be applied
-as the arguments for function matchers.
-* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options.
-    * __returnIndex__: (_Boolean [optional]_) If true, return the array index of
-the first matcher that that testString matched, or -1 if no match, instead of a
-boolean result.
-
-```js
-const anymatch = require('anymatch');
-
-const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ;
-
-anymatch(matchers, 'path/to/file.js'); // true
-anymatch(matchers, 'path/anyjs/baz.js'); // true
-anymatch(matchers, 'path/to/foo.js'); // true
-anymatch(matchers, 'path/to/bar.js'); // true
-anymatch(matchers, 'bar.js'); // false
-
-// returnIndex = true
-anymatch(matchers, 'foo.js', {returnIndex: true}); // 2
-anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1
-
-// any picomatc
-
-// using globs to match directories and their children
-anymatch('node_modules', 'node_modules'); // true
-anymatch('node_modules', 'node_modules/somelib/index.js'); // false
-anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true
-anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false
-anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true
-
-const matcher = anymatch(matchers);
-['foo.js', 'bar.js'].filter(matcher);  // [ 'foo.js' ]
-anymatch master* ❯
-
-```
-
-#### anymatch(matchers)
-You can also pass in only your matcher(s) to get a curried function that has
-already been bound to the provided matching criteria. This can be used as an
-`Array#filter` callback.
-
-```js
-var matcher = anymatch(matchers);
-
-matcher('path/to/file.js'); // true
-matcher('path/anyjs/baz.js', true); // 1
-
-['foo.js', 'bar.js'].filter(matcher); // ['foo.js']
-```
-
-Changelog
-----------
-[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases)
-
-- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only.
-- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information).
-- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch)
-for glob pattern matching. Issues with glob pattern matching should be
-reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues).
-
-License
--------
-[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE)
Index: de_modules/anymatch/index.d.ts
===================================================================
--- node_modules/anymatch/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-type AnymatchFn = (testString: string) => boolean;
-type AnymatchPattern = string|RegExp|AnymatchFn;
-type AnymatchMatcher = AnymatchPattern|AnymatchPattern[]
-type AnymatchTester = {
-  (testString: string|any[], returnIndex: true): number;
-  (testString: string|any[]): boolean;
-}
-
-type PicomatchOptions = {dot: boolean};
-
-declare const anymatch: {
-  (matchers: AnymatchMatcher): AnymatchTester;
-  (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester;
-  (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number;
-  (matchers: AnymatchMatcher, testString: string|any[]): boolean;
-}
-
-export {AnymatchMatcher as Matcher}
-export {AnymatchTester as Tester}
-export default anymatch
Index: de_modules/anymatch/index.js
===================================================================
--- node_modules/anymatch/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,104 +1,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", { value: true });
-
-const picomatch = require('picomatch');
-const normalizePath = require('normalize-path');
-
-/**
- * @typedef {(testString: string) => boolean} AnymatchFn
- * @typedef {string|RegExp|AnymatchFn} AnymatchPattern
- * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher
- */
-const BANG = '!';
-const DEFAULT_OPTIONS = {returnIndex: false};
-const arrify = (item) => Array.isArray(item) ? item : [item];
-
-/**
- * @param {AnymatchPattern} matcher
- * @param {object} options
- * @returns {AnymatchFn}
- */
-const createPattern = (matcher, options) => {
-  if (typeof matcher === 'function') {
-    return matcher;
-  }
-  if (typeof matcher === 'string') {
-    const glob = picomatch(matcher, options);
-    return (string) => matcher === string || glob(string);
-  }
-  if (matcher instanceof RegExp) {
-    return (string) => matcher.test(string);
-  }
-  return (string) => false;
-};
-
-/**
- * @param {Array<Function>} patterns
- * @param {Array<Function>} negPatterns
- * @param {String|Array} args
- * @param {Boolean} returnIndex
- * @returns {boolean|number}
- */
-const matchPatterns = (patterns, negPatterns, args, returnIndex) => {
-  const isList = Array.isArray(args);
-  const _path = isList ? args[0] : args;
-  if (!isList && typeof _path !== 'string') {
-    throw new TypeError('anymatch: second argument must be a string: got ' +
-      Object.prototype.toString.call(_path))
-  }
-  const path = normalizePath(_path, false);
-
-  for (let index = 0; index < negPatterns.length; index++) {
-    const nglob = negPatterns[index];
-    if (nglob(path)) {
-      return returnIndex ? -1 : false;
-    }
-  }
-
-  const applied = isList && [path].concat(args.slice(1));
-  for (let index = 0; index < patterns.length; index++) {
-    const pattern = patterns[index];
-    if (isList ? pattern(...applied) : pattern(path)) {
-      return returnIndex ? index : true;
-    }
-  }
-
-  return returnIndex ? -1 : false;
-};
-
-/**
- * @param {AnymatchMatcher} matchers
- * @param {Array|string} testString
- * @param {object} options
- * @returns {boolean|number|Function}
- */
-const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => {
-  if (matchers == null) {
-    throw new TypeError('anymatch: specify first argument');
-  }
-  const opts = typeof options === 'boolean' ? {returnIndex: options} : options;
-  const returnIndex = opts.returnIndex || false;
-
-  // Early cache for matchers.
-  const mtchers = arrify(matchers);
-  const negatedGlobs = mtchers
-    .filter(item => typeof item === 'string' && item.charAt(0) === BANG)
-    .map(item => item.slice(1))
-    .map(item => picomatch(item, opts));
-  const patterns = mtchers
-    .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG))
-    .map(matcher => createPattern(matcher, opts));
-
-  if (testString == null) {
-    return (testString, ri = false) => {
-      const returnIndex = typeof ri === 'boolean' ? ri : false;
-      return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
-    }
-  }
-
-  return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
-};
-
-anymatch.default = anymatch;
-module.exports = anymatch;
Index: de_modules/anymatch/package.json
===================================================================
--- node_modules/anymatch/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,48 +1,0 @@
-{
-  "name": "anymatch",
-  "version": "3.1.3",
-  "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions",
-  "files": [
-    "index.js",
-    "index.d.ts"
-  ],
-  "dependencies": {
-    "normalize-path": "^3.0.0",
-    "picomatch": "^2.0.4"
-  },
-  "author": {
-    "name": "Elan Shanker",
-    "url": "https://github.com/es128"
-  },
-  "license": "ISC",
-  "homepage": "https://github.com/micromatch/anymatch",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/micromatch/anymatch"
-  },
-  "keywords": [
-    "match",
-    "any",
-    "string",
-    "file",
-    "fs",
-    "list",
-    "glob",
-    "regex",
-    "regexp",
-    "regular",
-    "expression",
-    "function"
-  ],
-  "scripts": {
-    "test": "nyc mocha",
-    "mocha": "mocha"
-  },
-  "devDependencies": {
-    "mocha": "^6.1.3",
-    "nyc": "^14.0.0"
-  },
-  "engines": {
-    "node": ">= 8"
-  }
-}
Index: de_modules/balanced-match/LICENSE.md
===================================================================
--- node_modules/balanced-match/LICENSE.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,23 +1,0 @@
-(MIT)
-
-Original code Copyright Julian Gruber <julian@juliangruber.com>
-
-Port to TypeScript Copyright Isaac Z. Schlueter <i@izs.me>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/balanced-match/README.md
===================================================================
--- node_modules/balanced-match/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,57 +1,0 @@
-# balanced-match
-
-Match balanced string pairs, like `{` and `}` or `<b>` and
-`</b>`. Supports regular expressions as well!
-
-## Example
-
-Get the first matching pair of braces:
-
-```js
-import { balanced } from 'balanced-match'
-
-console.log(balanced('{', '}', 'pre{in{nested}}post'))
-console.log(balanced('{', '}', 'pre{first}between{second}post'))
-console.log(
-  balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'),
-)
-```
-
-The matches are:
-
-```bash
-$ node example.js
-{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
-{ start: 3,
-  end: 9,
-  pre: 'pre',
-  body: 'first',
-  post: 'between{second}post' }
-{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
-```
-
-## API
-
-### const m = balanced(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-object with those keys:
-
-- **start** the index of the first match of `a`
-- **end** the index of the matching `b`
-- **pre** the preamble, `a` and `b` not included
-- **body** the match, `a` and `b` not included
-- **post** the postscript, `a` and `b` not included
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
-
-### const r = balanced.range(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-array with indexes: `[ <a index>, <b index> ]`.
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
Index: de_modules/balanced-match/dist/commonjs/index.d.ts
===================================================================
--- node_modules/balanced-match/dist/commonjs/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-export declare const balanced: (a: string | RegExp, b: string | RegExp, str: string) => false | {
-    start: number;
-    end: number;
-    pre: string;
-    body: string;
-    post: string;
-} | undefined;
-export declare const range: (a: string, b: string, str: string) => undefined | [number, number];
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/balanced-match/dist/commonjs/index.d.ts.map
===================================================================
--- node_modules/balanced-match/dist/commonjs/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,GAAG,MAAM,EAClB,GAAG,MAAM,GAAG,MAAM,EAClB,KAAK,MAAM;;;;;;aAgBZ,CAAA;AAOD,eAAO,MAAM,KAAK,GAChB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,KAAK,MAAM,KACV,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CA2C7B,CAAA"}
Index: de_modules/balanced-match/dist/commonjs/index.js
===================================================================
--- node_modules/balanced-match/dist/commonjs/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,59 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.range = exports.balanced = void 0;
-const balanced = (a, b, str) => {
-    const ma = a instanceof RegExp ? maybeMatch(a, str) : a;
-    const mb = b instanceof RegExp ? maybeMatch(b, str) : b;
-    const r = ma !== null && mb != null && (0, exports.range)(ma, mb, str);
-    return (r && {
-        start: r[0],
-        end: r[1],
-        pre: str.slice(0, r[0]),
-        body: str.slice(r[0] + ma.length, r[1]),
-        post: str.slice(r[1] + mb.length),
-    });
-};
-exports.balanced = balanced;
-const maybeMatch = (reg, str) => {
-    const m = str.match(reg);
-    return m ? m[0] : null;
-};
-const range = (a, b, str) => {
-    let begs, beg, left, right = undefined, result;
-    let ai = str.indexOf(a);
-    let bi = str.indexOf(b, ai + 1);
-    let i = ai;
-    if (ai >= 0 && bi > 0) {
-        if (a === b) {
-            return [ai, bi];
-        }
-        begs = [];
-        left = str.length;
-        while (i >= 0 && !result) {
-            if (i === ai) {
-                begs.push(i);
-                ai = str.indexOf(a, i + 1);
-            }
-            else if (begs.length === 1) {
-                const r = begs.pop();
-                if (r !== undefined)
-                    result = [r, bi];
-            }
-            else {
-                beg = begs.pop();
-                if (beg !== undefined && beg < left) {
-                    left = beg;
-                    right = bi;
-                }
-                bi = str.indexOf(b, i + 1);
-            }
-            i = ai < bi && ai >= 0 ? ai : bi;
-        }
-        if (begs.length && right !== undefined) {
-            result = [left, right];
-        }
-    }
-    return result;
-};
-exports.range = range;
-//# sourceMappingURL=index.js.map
Index: de_modules/balanced-match/dist/commonjs/index.js.map
===================================================================
--- node_modules/balanced-match/dist/commonjs/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CACtB,CAAkB,EAClB,CAAkB,EAClB,GAAW,EACX,EAAE;IACF,MAAM,EAAE,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,EAAE,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEvD,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAA,aAAK,EAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAEzD,OAAO,CACL,CAAC,IAAI;QACH,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACX,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACT,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;KAClC,CACF,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB;AAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;IAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACxB,CAAC,CAAA;AAEM,MAAM,KAAK,GAAG,CACnB,CAAS,EACT,CAAS,EACT,GAAW,EACmB,EAAE;IAChC,IAAI,IAAc,EAChB,GAAuB,EACvB,IAAY,EACZ,KAAK,GAAuB,SAAS,EACrC,MAAoC,CAAA;IACtC,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvB,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAA;IAEV,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,GAAG,EAAE,CAAA;QACT,IAAI,GAAG,GAAG,CAAC,MAAM,CAAA;QAEjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACZ,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC5B,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACpB,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAChB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;oBACpC,IAAI,GAAG,GAAG,CAAA;oBACV,KAAK,GAAG,EAAE,CAAA;gBACZ,CAAC;gBAED,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC5B,CAAC;YAED,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA/CY,QAAA,KAAK,SA+CjB","sourcesContent":["export const balanced = (\n  a: string | RegExp,\n  b: string | RegExp,\n  str: string,\n) => {\n  const ma = a instanceof RegExp ? maybeMatch(a, str) : a\n  const mb = b instanceof RegExp ? maybeMatch(b, str) : b\n\n  const r = ma !== null && mb != null && range(ma, mb, str)\n\n  return (\n    r && {\n      start: r[0],\n      end: r[1],\n      pre: str.slice(0, r[0]),\n      body: str.slice(r[0] + ma.length, r[1]),\n      post: str.slice(r[1] + mb.length),\n    }\n  )\n}\n\nconst maybeMatch = (reg: RegExp, str: string) => {\n  const m = str.match(reg)\n  return m ? m[0] : null\n}\n\nexport const range = (\n  a: string,\n  b: string,\n  str: string,\n): undefined | [number, number] => {\n  let begs: number[],\n    beg: number | undefined,\n    left: number,\n    right: number | undefined = undefined,\n    result: undefined | [number, number]\n  let ai = str.indexOf(a)\n  let bi = str.indexOf(b, ai + 1)\n  let i = ai\n\n  if (ai >= 0 && bi > 0) {\n    if (a === b) {\n      return [ai, bi]\n    }\n    begs = []\n    left = str.length\n\n    while (i >= 0 && !result) {\n      if (i === ai) {\n        begs.push(i)\n        ai = str.indexOf(a, i + 1)\n      } else if (begs.length === 1) {\n        const r = begs.pop()\n        if (r !== undefined) result = [r, bi]\n      } else {\n        beg = begs.pop()\n        if (beg !== undefined && beg < left) {\n          left = beg\n          right = bi\n        }\n\n        bi = str.indexOf(b, i + 1)\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi\n    }\n\n    if (begs.length && right !== undefined) {\n      result = [left, right]\n    }\n  }\n\n  return result\n}\n"]}
Index: de_modules/balanced-match/dist/commonjs/package.json
===================================================================
--- node_modules/balanced-match/dist/commonjs/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "commonjs"
-}
Index: de_modules/balanced-match/dist/esm/index.d.ts
===================================================================
--- node_modules/balanced-match/dist/esm/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-export declare const balanced: (a: string | RegExp, b: string | RegExp, str: string) => false | {
-    start: number;
-    end: number;
-    pre: string;
-    body: string;
-    post: string;
-} | undefined;
-export declare const range: (a: string, b: string, str: string) => undefined | [number, number];
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/balanced-match/dist/esm/index.d.ts.map
===================================================================
--- node_modules/balanced-match/dist/esm/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,GAAG,MAAM,EAClB,GAAG,MAAM,GAAG,MAAM,EAClB,KAAK,MAAM;;;;;;aAgBZ,CAAA;AAOD,eAAO,MAAM,KAAK,GAChB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,KAAK,MAAM,KACV,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CA2C7B,CAAA"}
Index: de_modules/balanced-match/dist/esm/index.js
===================================================================
--- node_modules/balanced-match/dist/esm/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,54 +1,0 @@
-export const balanced = (a, b, str) => {
-    const ma = a instanceof RegExp ? maybeMatch(a, str) : a;
-    const mb = b instanceof RegExp ? maybeMatch(b, str) : b;
-    const r = ma !== null && mb != null && range(ma, mb, str);
-    return (r && {
-        start: r[0],
-        end: r[1],
-        pre: str.slice(0, r[0]),
-        body: str.slice(r[0] + ma.length, r[1]),
-        post: str.slice(r[1] + mb.length),
-    });
-};
-const maybeMatch = (reg, str) => {
-    const m = str.match(reg);
-    return m ? m[0] : null;
-};
-export const range = (a, b, str) => {
-    let begs, beg, left, right = undefined, result;
-    let ai = str.indexOf(a);
-    let bi = str.indexOf(b, ai + 1);
-    let i = ai;
-    if (ai >= 0 && bi > 0) {
-        if (a === b) {
-            return [ai, bi];
-        }
-        begs = [];
-        left = str.length;
-        while (i >= 0 && !result) {
-            if (i === ai) {
-                begs.push(i);
-                ai = str.indexOf(a, i + 1);
-            }
-            else if (begs.length === 1) {
-                const r = begs.pop();
-                if (r !== undefined)
-                    result = [r, bi];
-            }
-            else {
-                beg = begs.pop();
-                if (beg !== undefined && beg < left) {
-                    left = beg;
-                    right = bi;
-                }
-                bi = str.indexOf(b, i + 1);
-            }
-            i = ai < bi && ai >= 0 ? ai : bi;
-        }
-        if (begs.length && right !== undefined) {
-            result = [left, right];
-        }
-    }
-    return result;
-};
-//# sourceMappingURL=index.js.map
Index: de_modules/balanced-match/dist/esm/index.js.map
===================================================================
--- node_modules/balanced-match/dist/esm/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export const balanced = (\n  a: string | RegExp,\n  b: string | RegExp,\n  str: string,\n) => {\n  const ma = a instanceof RegExp ? maybeMatch(a, str) : a\n  const mb = b instanceof RegExp ? maybeMatch(b, str) : b\n\n  const r = ma !== null && mb != null && range(ma, mb, str)\n\n  return (\n    r && {\n      start: r[0],\n      end: r[1],\n      pre: str.slice(0, r[0]),\n      body: str.slice(r[0] + ma.length, r[1]),\n      post: str.slice(r[1] + mb.length),\n    }\n  )\n}\n\nconst maybeMatch = (reg: RegExp, str: string) => {\n  const m = str.match(reg)\n  return m ? m[0] : null\n}\n\nexport const range = (\n  a: string,\n  b: string,\n  str: string,\n): undefined | [number, number] => {\n  let begs: number[],\n    beg: number | undefined,\n    left: number,\n    right: number | undefined = undefined,\n    result: undefined | [number, number]\n  let ai = str.indexOf(a)\n  let bi = str.indexOf(b, ai + 1)\n  let i = ai\n\n  if (ai >= 0 && bi > 0) {\n    if (a === b) {\n      return [ai, bi]\n    }\n    begs = []\n    left = str.length\n\n    while (i >= 0 && !result) {\n      if (i === ai) {\n        begs.push(i)\n        ai = str.indexOf(a, i + 1)\n      } else if (begs.length === 1) {\n        const r = begs.pop()\n        if (r !== undefined) result = [r, bi]\n      } else {\n        beg = begs.pop()\n        if (beg !== undefined && beg < left) {\n          left = beg\n          right = bi\n        }\n\n        bi = str.indexOf(b, i + 1)\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi\n    }\n\n    if (begs.length && right !== undefined) {\n      result = [left, right]\n    }\n  }\n\n  return result\n}\n"]}
Index: de_modules/balanced-match/dist/esm/package.json
===================================================================
--- node_modules/balanced-match/dist/esm/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "module"
-}
Index: de_modules/balanced-match/package.json
===================================================================
--- node_modules/balanced-match/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,68 +1,0 @@
-{
-  "name": "balanced-match",
-  "description": "Match balanced character pairs, like \"{\" and \"}\"",
-  "version": "4.0.4",
-  "files": [
-    "dist"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/balanced-match.git"
-  },
-  "exports": {
-    "./package.json": "./package.json",
-    ".": {
-      "import": {
-        "types": "./dist/esm/index.d.ts",
-        "default": "./dist/esm/index.js"
-      },
-      "require": {
-        "types": "./dist/commonjs/index.d.ts",
-        "default": "./dist/commonjs/index.js"
-      }
-    }
-  },
-  "type": "module",
-  "scripts": {
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "prepublishOnly": "git push origin --follow-tags",
-    "prepare": "tshy",
-    "pretest": "npm run prepare",
-    "presnap": "npm run prepare",
-    "test": "tap",
-    "snap": "tap",
-    "format": "prettier --write .",
-    "benchmark": "node benchmark/index.js",
-    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
-  },
-  "devDependencies": {
-    "@types/brace-expansion": "^1.1.2",
-    "@types/node": "^25.2.1",
-    "mkdirp": "^3.0.1",
-    "prettier": "^3.3.2",
-    "tap": "^21.6.2",
-    "tshy": "^3.0.2",
-    "typedoc": "^0.28.5"
-  },
-  "keywords": [
-    "match",
-    "regexp",
-    "test",
-    "balanced",
-    "parse"
-  ],
-  "license": "MIT",
-  "engines": {
-    "node": "18 || 20 || >=22"
-  },
-  "tshy": {
-    "exports": {
-      "./package.json": "./package.json",
-      ".": "./src/index.ts"
-    }
-  },
-  "main": "./dist/commonjs/index.js",
-  "types": "./dist/commonjs/index.d.ts",
-  "module": "./dist/esm/index.js"
-}
Index: de_modules/bcryptjs/.npmignore
===================================================================
--- node_modules/bcryptjs/.npmignore	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,6 +1,0 @@
-node_modules/
-npm-debug.log
-debug.log
-doco/
-tests/bench.js
-*.png
Index: de_modules/bcryptjs/.travis.yml
===================================================================
--- node_modules/bcryptjs/.travis.yml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,18 +1,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-  - 0.12
-  - 4
-  - 6
-
-before_script: npm -g install testjs
-
-env:
-  - CXX=g++-4.8
-addons:
-  apt:
-    sources:
-      - ubuntu-toolchain-r-test
-    packages:
-      - g++-4.8
Index: de_modules/bcryptjs/LICENSE
===================================================================
--- node_modules/bcryptjs/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,50 +1,0 @@
-bcrypt.js
----------
-Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
-Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
-Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
- 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-   derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-isaac.js
---------
-Copyright (c) 2012 Yves-Marie K. Rinquin
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/bcryptjs/README.md
===================================================================
--- node_modules/bcryptjs/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,251 +1,0 @@
-bcrypt.js
-=========
-Optimized bcrypt in JavaScript with zero dependencies. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt)
-binding on node.js and also working in the browser.
-
-<a href="https://travis-ci.org/dcodeIO/bcrypt.js"><img alt="build static" src="https://travis-ci.org/dcodeIO/bcrypt.js.svg?branch=master" /></a> <a href="https://npmjs.org/package/bcryptjs"><img src="https://img.shields.io/npm/v/bcryptjs.svg" alt=""></a> <a href="https://npmjs.org/package/bcryptjs"><img src="https://img.shields.io/npm/dm/bcryptjs.svg" alt=""></a> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=dcode%40dcode.io&item_name=Open%20Source%20Software%20Donation&item_number=dcodeIO%2Fbcrypt.js"><img alt="donate ❤" src="https://img.shields.io/badge/donate-❤-ff2244.svg"></a>
-
-
-Security considerations
------------------------
-Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the
-iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with
-increasing computation power. ([see](http://en.wikipedia.org/wiki/Bcrypt))
-
-While bcrypt.js is compatible to the C++ bcrypt binding, it is written in pure JavaScript and thus slower ([about 30%](https://github.com/dcodeIO/bcrypt.js/wiki/Benchmark)), effectively reducing the number of iterations that can be
-processed in an equal time span.
-
-The maximum input length is 72 bytes (note that UTF8 encoded characters use up to 4 bytes) and the length of generated
-hashes is 60 characters.
-
-Usage
------
-The library is compatible with CommonJS and AMD loaders and is exposed globally as `dcodeIO.bcrypt` if neither is
-available.
-
-### node.js
-
-On node.js, the inbuilt [crypto module](http://nodejs.org/api/crypto.html)'s randomBytes interface is used to obtain
-secure random numbers.
-
-`npm install bcryptjs`
-
-```js
-var bcrypt = require('bcryptjs');
-...
-```
-
-### Browser
-
-In the browser, bcrypt.js relies on [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI)'s getRandomValues
-interface to obtain secure random numbers. If no cryptographically secure source of randomness is available, you may
-specify one through [bcrypt.setRandomFallback](https://github.com/dcodeIO/bcrypt.js#setrandomfallbackrandom).
-
-```js
-var bcrypt = dcodeIO.bcrypt;
-...
-```
-
-or
-
-```js
-require.config({
-    paths: { "bcrypt": "/path/to/bcrypt.js" }
-});
-require(["bcrypt"], function(bcrypt) {
-    ...
-});
-```
-
-Usage - Sync
-------------
-To hash a password: 
-
-```javascript
-var bcrypt = require('bcryptjs');
-var salt = bcrypt.genSaltSync(10);
-var hash = bcrypt.hashSync("B4c0/\/", salt);
-// Store hash in your password DB.
-```
-
-To check a password: 
-
-```javascript
-// Load hash from your password DB.
-bcrypt.compareSync("B4c0/\/", hash); // true
-bcrypt.compareSync("not_bacon", hash); // false
-```
-
-Auto-gen a salt and hash:
-
-```javascript
-var hash = bcrypt.hashSync('bacon', 8);
-```
-
-Usage - Async
--------------
-To hash a password: 
-
-```javascript
-var bcrypt = require('bcryptjs');
-bcrypt.genSalt(10, function(err, salt) {
-    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
-        // Store hash in your password DB.
-    });
-});
-```
-
-To check a password: 
-
-```javascript
-// Load hash from your password DB.
-bcrypt.compare("B4c0/\/", hash, function(err, res) {
-    // res === true
-});
-bcrypt.compare("not_bacon", hash, function(err, res) {
-    // res === false
-});
-
-// As of bcryptjs 2.4.0, compare returns a promise if callback is omitted:
-bcrypt.compare("B4c0/\/", hash).then((res) => {
-    // res === true
-});
-```
-
-Auto-gen a salt and hash:
-
-```javascript
-bcrypt.hash('bacon', 8, function(err, hash) {
-});
-```
-
-**Note:** Under the hood, asynchronisation splits a crypto operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of [JS event loop queue](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop), thus efficiently sharing the computational resources with the other operations in the queue.
-
-API
----
-### setRandomFallback(random)
-
-Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
-API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is
-seeded properly!
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| random          | *function(number):!Array.&lt;number&gt;* | Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. 
-| **@see**        |                 | http://nodejs.org/api/crypto.html 
-| **@see**        |                 | http://www.w3.org/TR/WebCryptoAPI/
-
-**Hint:** You might use [isaac.js](https://github.com/rubycon/isaac.js) as a CSPRNG but you still have to make sure to
-seed it properly.
-
-### genSaltSync(rounds=, seed_length=)
-
-Synchronously generates a salt.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| rounds          | *number*        | Number of rounds to use, defaults to 10 if omitted 
-| seed_length     | *number*        | Not supported. 
-| **@returns**    | *string*        | Resulting salt 
-| **@throws**     | *Error*         | If a random fallback is required but not set 
-
-### genSalt(rounds=, seed_length=, callback)
-
-Asynchronously generates a salt.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| rounds          | *number &#124; function(Error, string=)* | Number of rounds to use, defaults to 10 if omitted 
-| seed_length     | *number &#124; function(Error, string=)* | Not supported. 
-| callback        | *function(Error, string=)* | Callback receiving the error, if any, and the resulting salt 
-| **@returns**    | *Promise*       | If `callback` has been omitted
-| **@throws**     | *Error*         | If `callback` is present but not a function
-
-### hashSync(s, salt=)
-
-Synchronously generates a hash for the given string.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| s               | *string*        | String to hash 
-| salt            | *number &#124; string* | Salt length to generate or salt to use, default to 10 
-| **@returns**    | *string*        | Resulting hash 
-
-### hash(s, salt, callback, progressCallback=)
-
-Asynchronously generates a hash for the given string.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| s               | *string*        | String to hash 
-| salt            | *number &#124; string* | Salt length to generate or salt to use 
-| callback        | *function(Error, string=)* | Callback receiving the error, if any, and the resulting hash 
-| progressCallback | *function(number)* | Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
-| **@returns**    | *Promise*       | If `callback` has been omitted
-| **@throws**     | *Error*         | If `callback` is present but not a function
-
-### compareSync(s, hash)
-
-Synchronously tests a string against a hash.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| s               | *string*        | String to compare 
-| hash            | *string*        | Hash to test against 
-| **@returns**    | *boolean*       | true if matching, otherwise false 
-| **@throws**     | *Error*         | If an argument is illegal 
-
-### compare(s, hash, callback, progressCallback=)
-
-Asynchronously compares the given data against the given hash.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| s               | *string*        | Data to compare 
-| hash            | *string*        | Data to be compared to 
-| callback        | *function(Error, boolean)* | Callback receiving the error, if any, otherwise the result 
-| progressCallback | *function(number)* | Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
-| **@returns**    | *Promise*       | If `callback` has been omitted 
-| **@throws**     | *Error*         | If `callback` is present but not a function
-
-### getRounds(hash)
-
-Gets the number of rounds used to encrypt the specified hash.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| hash            | *string*        | Hash to extract the used number of rounds from 
-| **@returns**    | *number*        | Number of rounds used 
-| **@throws**     | *Error*         | If `hash` is not a string 
-
-### getSalt(hash)
-
-Gets the salt portion from a hash. Does not validate the hash.
-
-| Parameter       | Type            | Description
-|-----------------|-----------------|---------------
-| hash            | *string*        | Hash to extract the salt from 
-| **@returns**    | *string*        | Extracted salt part 
-| **@throws**     | *Error*         | If `hash` is not a string or otherwise invalid 
-
-
-Command line
-------------
-`Usage: bcrypt <input> [salt]`
-
-If the input has spaces inside, simply surround it with quotes.
-
-Downloads
----------
-* [Distributions](https://github.com/dcodeIO/bcrypt.js/tree/master/dist)
-* [ZIP-Archive](https://github.com/dcodeIO/bcrypt.js/archive/master.zip)
-* [Tarball](https://github.com/dcodeIO/bcrypt.js/tarball/master)
-
-Credits
--------
-Based on work started by Shane Girish at [bcrypt-nodejs](https://github.com/shaneGirish/bcrypt-nodejs) (MIT-licensed),
-which is itself based on [javascript-bcrypt](http://code.google.com/p/javascript-bcrypt/) (New BSD-licensed).
-
-License
--------
-New-BSD / MIT ([see](https://github.com/dcodeIO/bcrypt.js/blob/master/LICENSE))
Index: de_modules/bcryptjs/bower.json
===================================================================
--- node_modules/bcryptjs/bower.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-{
-    "name": "bcryptjs",
-    "description": "Optimized bcrypt in plain JavaScript with zero dependencies.",
-    "version": "2.4.3",
-    "main": "dist/bcrypt.min.js",
-    "license": "New-BSD",
-    "homepage": "http://dcode.io/",
-    "repository": {
-        "type": "git",
-        "url": "git://github.com/dcodeIO/bcrypt.js.git"
-    },
-    "keywords": ["bcrypt", "password", "auth", "authentication", "encryption", "crypt", "crypto"],
-    "dependencies": {},
-    "devDependencies": {},
-    "ignore": [
-        "**/.*",
-        "node_modules",
-        "bower_components",
-        "test",
-        "tests"
-    ]
-}
Index: de_modules/bcryptjs/dist/README.md
===================================================================
--- node_modules/bcryptjs/dist/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-Distributions
-=============
-bcrypt.js is available as the following distributions:
-
-* **[bcrypt.js](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.js)**  
-  contains the commented source code.
-
-* **[bcrypt.min.js](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.js)**  
-  has been compiled with Closure Compiler using advanced optimizations.
-
-* **[bcrypt.min.map](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.map)**  
-  contains the source map generated by Closure Compiler.
-
-* **[bcrypt.min.js.gz](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.js.gz)**  
-  has also been gzipped using `-9`.
Index: de_modules/bcryptjs/dist/bcrypt.js
===================================================================
--- node_modules/bcryptjs/dist/bcrypt.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1379 +1,0 @@
-/*
- Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
- Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
- Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @license bcrypt.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
- * Released under the Apache License, Version 2.0
- * see: https://github.com/dcodeIO/bcrypt.js for details
- */
-(function(global, factory) {
-
-    /* AMD */ if (typeof define === 'function' && define["amd"])
-        define([], factory);
-    /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"])
-        module["exports"] = factory();
-    /* Global */ else
-        (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory();
-
-}(this, function() {
-    "use strict";
-
-    /**
-     * bcrypt namespace.
-     * @type {Object.<string,*>}
-     */
-    var bcrypt = {};
-
-    /**
-     * The random implementation to use as a fallback.
-     * @type {?function(number):!Array.<number>}
-     * @inner
-     */
-    var randomFallback = null;
-
-    /**
-     * Generates cryptographically secure random bytes.
-     * @function
-     * @param {number} len Bytes length
-     * @returns {!Array.<number>} Random bytes
-     * @throws {Error} If no random implementation is available
-     * @inner
-     */
-    function random(len) {
-        /* node */ if (typeof module !== 'undefined' && module && module['exports'])
-            try {
-                return require("crypto")['randomBytes'](len);
-            } catch (e) {}
-        /* WCA */ try {
-            var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len));
-            return Array.prototype.slice.call(a);
-        } catch (e) {}
-        /* fallback */ if (!randomFallback)
-            throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative");
-        return randomFallback(len);
-    }
-
-    // Test if any secure randomness source is available
-    var randomAvailable = false;
-    try {
-        random(1);
-        randomAvailable = true;
-    } catch (e) {}
-
-    // Default fallback, if any
-    randomFallback = null;
-    /**
-     * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
-     *  API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it
-     *  is seeded properly!
-     * @param {?function(number):!Array.<number>} random Function taking the number of bytes to generate as its
-     *  sole argument, returning the corresponding array of cryptographically secure random byte values.
-     * @see http://nodejs.org/api/crypto.html
-     * @see http://www.w3.org/TR/WebCryptoAPI/
-     */
-    bcrypt.setRandomFallback = function(random) {
-        randomFallback = random;
-    };
-
-    /**
-     * Synchronously generates a salt.
-     * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted
-     * @param {number=} seed_length Not supported.
-     * @returns {string} Resulting salt
-     * @throws {Error} If a random fallback is required but not set
-     * @expose
-     */
-    bcrypt.genSaltSync = function(rounds, seed_length) {
-        rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS;
-        if (typeof rounds !== 'number')
-            throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length));
-        if (rounds < 4)
-            rounds = 4;
-        else if (rounds > 31)
-            rounds = 31;
-        var salt = [];
-        salt.push("$2a$");
-        if (rounds < 10)
-            salt.push("0");
-        salt.push(rounds.toString());
-        salt.push('$');
-        salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
-        return salt.join('');
-    };
-
-    /**
-     * Asynchronously generates a salt.
-     * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted
-     * @param {(number|function(Error, string=))=} seed_length Not supported.
-     * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt
-     * @returns {!Promise} If `callback` has been omitted
-     * @throws {Error} If `callback` is present but not a function
-     * @expose
-     */
-    bcrypt.genSalt = function(rounds, seed_length, callback) {
-        if (typeof seed_length === 'function')
-            callback = seed_length,
-            seed_length = undefined; // Not supported.
-        if (typeof rounds === 'function')
-            callback = rounds,
-            rounds = undefined;
-        if (typeof rounds === 'undefined')
-            rounds = GENSALT_DEFAULT_LOG2_ROUNDS;
-        else if (typeof rounds !== 'number')
-            throw Error("illegal arguments: "+(typeof rounds));
-
-        function _async(callback) {
-            nextTick(function() { // Pretty thin, but salting is fast enough
-                try {
-                    callback(null, bcrypt.genSaltSync(rounds));
-                } catch (err) {
-                    callback(err);
-                }
-            });
-        }
-
-        if (callback) {
-            if (typeof callback !== 'function')
-                throw Error("Illegal callback: "+typeof(callback));
-            _async(callback);
-        } else
-            return new Promise(function(resolve, reject) {
-                _async(function(err, res) {
-                    if (err) {
-                        reject(err);
-                        return;
-                    }
-                    resolve(res);
-                });
-            });
-    };
-
-    /**
-     * Synchronously generates a hash for the given string.
-     * @param {string} s String to hash
-     * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10
-     * @returns {string} Resulting hash
-     * @expose
-     */
-    bcrypt.hashSync = function(s, salt) {
-        if (typeof salt === 'undefined')
-            salt = GENSALT_DEFAULT_LOG2_ROUNDS;
-        if (typeof salt === 'number')
-            salt = bcrypt.genSaltSync(salt);
-        if (typeof s !== 'string' || typeof salt !== 'string')
-            throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt));
-        return _hash(s, salt);
-    };
-
-    /**
-     * Asynchronously generates a hash for the given string.
-     * @param {string} s String to hash
-     * @param {number|string} salt Salt length to generate or salt to use
-     * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash
-     * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
-     *  (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
-     * @returns {!Promise} If `callback` has been omitted
-     * @throws {Error} If `callback` is present but not a function
-     * @expose
-     */
-    bcrypt.hash = function(s, salt, callback, progressCallback) {
-
-        function _async(callback) {
-            if (typeof s === 'string' && typeof salt === 'number')
-                bcrypt.genSalt(salt, function(err, salt) {
-                    _hash(s, salt, callback, progressCallback);
-                });
-            else if (typeof s === 'string' && typeof salt === 'string')
-                _hash(s, salt, callback, progressCallback);
-            else
-                nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt))));
-        }
-
-        if (callback) {
-            if (typeof callback !== 'function')
-                throw Error("Illegal callback: "+typeof(callback));
-            _async(callback);
-        } else
-            return new Promise(function(resolve, reject) {
-                _async(function(err, res) {
-                    if (err) {
-                        reject(err);
-                        return;
-                    }
-                    resolve(res);
-                });
-            });
-    };
-
-    /**
-     * Compares two strings of the same length in constant time.
-     * @param {string} known Must be of the correct length
-     * @param {string} unknown Must be the same length as `known`
-     * @returns {boolean}
-     * @inner
-     */
-    function safeStringCompare(known, unknown) {
-        var right = 0,
-            wrong = 0;
-        for (var i=0, k=known.length; i<k; ++i) {
-            if (known.charCodeAt(i) === unknown.charCodeAt(i))
-                ++right;
-            else
-                ++wrong;
-        }
-        // Prevent removal of unused variables (never true, actually)
-        if (right < 0)
-            return false;
-        return wrong === 0;
-    }
-
-    /**
-     * Synchronously tests a string against a hash.
-     * @param {string} s String to compare
-     * @param {string} hash Hash to test against
-     * @returns {boolean} true if matching, otherwise false
-     * @throws {Error} If an argument is illegal
-     * @expose
-     */
-    bcrypt.compareSync = function(s, hash) {
-        if (typeof s !== "string" || typeof hash !== "string")
-            throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash));
-        if (hash.length !== 60)
-            return false;
-        return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length-31)), hash);
-    };
-
-    /**
-     * Asynchronously compares the given data against the given hash.
-     * @param {string} s Data to compare
-     * @param {string} hash Data to be compared to
-     * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result
-     * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
-     *  (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
-     * @returns {!Promise} If `callback` has been omitted
-     * @throws {Error} If `callback` is present but not a function
-     * @expose
-     */
-    bcrypt.compare = function(s, hash, callback, progressCallback) {
-
-        function _async(callback) {
-            if (typeof s !== "string" || typeof hash !== "string") {
-                nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hash))));
-                return;
-            }
-            if (hash.length !== 60) {
-                nextTick(callback.bind(this, null, false));
-                return;
-            }
-            bcrypt.hash(s, hash.substr(0, 29), function(err, comp) {
-                if (err)
-                    callback(err);
-                else
-                    callback(null, safeStringCompare(comp, hash));
-            }, progressCallback);
-        }
-
-        if (callback) {
-            if (typeof callback !== 'function')
-                throw Error("Illegal callback: "+typeof(callback));
-            _async(callback);
-        } else
-            return new Promise(function(resolve, reject) {
-                _async(function(err, res) {
-                    if (err) {
-                        reject(err);
-                        return;
-                    }
-                    resolve(res);
-                });
-            });
-    };
-
-    /**
-     * Gets the number of rounds used to encrypt the specified hash.
-     * @param {string} hash Hash to extract the used number of rounds from
-     * @returns {number} Number of rounds used
-     * @throws {Error} If `hash` is not a string
-     * @expose
-     */
-    bcrypt.getRounds = function(hash) {
-        if (typeof hash !== "string")
-            throw Error("Illegal arguments: "+(typeof hash));
-        return parseInt(hash.split("$")[2], 10);
-    };
-
-    /**
-     * Gets the salt portion from a hash. Does not validate the hash.
-     * @param {string} hash Hash to extract the salt from
-     * @returns {string} Extracted salt part
-     * @throws {Error} If `hash` is not a string or otherwise invalid
-     * @expose
-     */
-    bcrypt.getSalt = function(hash) {
-        if (typeof hash !== 'string')
-            throw Error("Illegal arguments: "+(typeof hash));
-        if (hash.length !== 60)
-            throw Error("Illegal hash length: "+hash.length+" != 60");
-        return hash.substring(0, 29);
-    };
-
-    /**
-     * Continues with the callback on the next tick.
-     * @function
-     * @param {function(...[*])} callback Callback to execute
-     * @inner
-     */
-    var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function'
-        ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick)
-        : setTimeout;
-
-    /**
-     * Converts a JavaScript string to UTF8 bytes.
-     * @param {string} str String
-     * @returns {!Array.<number>} UTF8 bytes
-     * @inner
-     */
-    function stringToBytes(str) {
-        var out = [],
-            i = 0;
-        utfx.encodeUTF16toUTF8(function() {
-            if (i >= str.length) return null;
-            return str.charCodeAt(i++);
-        }, function(b) {
-            out.push(b);
-        });
-        return out;
-    }
-
-    // A base64 implementation for the bcrypt algorithm. This is partly non-standard.
-
-    /**
-     * bcrypt's own non-standard base64 dictionary.
-     * @type {!Array.<string>}
-     * @const
-     * @inner
-     **/
-    var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split('');
-
-    /**
-     * @type {!Array.<number>}
-     * @const
-     * @inner
-     **/
-    var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
-        1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1,
-        -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
-        20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30,
-        31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
-        48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1];
-
-    /**
-     * @type {!function(...number):string}
-     * @inner
-     */
-    var stringFromCharCode = String.fromCharCode;
-
-    /**
-     * Encodes a byte array to base64 with up to len bytes of input.
-     * @param {!Array.<number>} b Byte array
-     * @param {number} len Maximum input length
-     * @returns {string}
-     * @inner
-     */
-    function base64_encode(b, len) {
-        var off = 0,
-            rs = [],
-            c1, c2;
-        if (len <= 0 || len > b.length)
-            throw Error("Illegal len: "+len);
-        while (off < len) {
-            c1 = b[off++] & 0xff;
-            rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
-            c1 = (c1 & 0x03) << 4;
-            if (off >= len) {
-                rs.push(BASE64_CODE[c1 & 0x3f]);
-                break;
-            }
-            c2 = b[off++] & 0xff;
-            c1 |= (c2 >> 4) & 0x0f;
-            rs.push(BASE64_CODE[c1 & 0x3f]);
-            c1 = (c2 & 0x0f) << 2;
-            if (off >= len) {
-                rs.push(BASE64_CODE[c1 & 0x3f]);
-                break;
-            }
-            c2 = b[off++] & 0xff;
-            c1 |= (c2 >> 6) & 0x03;
-            rs.push(BASE64_CODE[c1 & 0x3f]);
-            rs.push(BASE64_CODE[c2 & 0x3f]);
-        }
-        return rs.join('');
-    }
-
-    /**
-     * Decodes a base64 encoded string to up to len bytes of output.
-     * @param {string} s String to decode
-     * @param {number} len Maximum output length
-     * @returns {!Array.<number>}
-     * @inner
-     */
-    function base64_decode(s, len) {
-        var off = 0,
-            slen = s.length,
-            olen = 0,
-            rs = [],
-            c1, c2, c3, c4, o, code;
-        if (len <= 0)
-            throw Error("Illegal len: "+len);
-        while (off < slen - 1 && olen < len) {
-            code = s.charCodeAt(off++);
-            c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-            code = s.charCodeAt(off++);
-            c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-            if (c1 == -1 || c2 == -1)
-                break;
-            o = (c1 << 2) >>> 0;
-            o |= (c2 & 0x30) >> 4;
-            rs.push(stringFromCharCode(o));
-            if (++olen >= len || off >= slen)
-                break;
-            code = s.charCodeAt(off++);
-            c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-            if (c3 == -1)
-                break;
-            o = ((c2 & 0x0f) << 4) >>> 0;
-            o |= (c3 & 0x3c) >> 2;
-            rs.push(stringFromCharCode(o));
-            if (++olen >= len || off >= slen)
-                break;
-            code = s.charCodeAt(off++);
-            c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-            o = ((c3 & 0x03) << 6) >>> 0;
-            o |= c4;
-            rs.push(stringFromCharCode(o));
-            ++olen;
-        }
-        var res = [];
-        for (off = 0; off<olen; off++)
-            res.push(rs[off].charCodeAt(0));
-        return res;
-    }
-
-    /**
-     * utfx-embeddable (c) 2014 Daniel Wirtz <dcode@dcode.io>
-     * Released under the Apache License, Version 2.0
-     * see: https://github.com/dcodeIO/utfx for details
-     */
-    var utfx = function() {
-        "use strict";
-
-        /**
-         * utfx namespace.
-         * @inner
-         * @type {!Object.<string,*>}
-         */
-        var utfx = {};
-
-        /**
-         * Maximum valid code point.
-         * @type {number}
-         * @const
-         */
-        utfx.MAX_CODEPOINT = 0x10FFFF;
-
-        /**
-         * Encodes UTF8 code points to UTF8 bytes.
-         * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point
-         *  respectively `null` if there are no more code points left or a single numeric code point.
-         * @param {!function(number)} dst Bytes destination as a function successively called with the next byte
-         */
-        utfx.encodeUTF8 = function(src, dst) {
-            var cp = null;
-            if (typeof src === 'number')
-                cp = src,
-                src = function() { return null; };
-            while (cp !== null || (cp = src()) !== null) {
-                if (cp < 0x80)
-                    dst(cp&0x7F);
-                else if (cp < 0x800)
-                    dst(((cp>>6)&0x1F)|0xC0),
-                    dst((cp&0x3F)|0x80);
-                else if (cp < 0x10000)
-                    dst(((cp>>12)&0x0F)|0xE0),
-                    dst(((cp>>6)&0x3F)|0x80),
-                    dst((cp&0x3F)|0x80);
-                else
-                    dst(((cp>>18)&0x07)|0xF0),
-                    dst(((cp>>12)&0x3F)|0x80),
-                    dst(((cp>>6)&0x3F)|0x80),
-                    dst((cp&0x3F)|0x80);
-                cp = null;
-            }
-        };
-
-        /**
-         * Decodes UTF8 bytes to UTF8 code points.
-         * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there
-         *  are no more bytes left.
-         * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point.
-         * @throws {RangeError} If a starting byte is invalid in UTF8
-         * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the
-         *  remaining bytes.
-         */
-        utfx.decodeUTF8 = function(src, dst) {
-            var a, b, c, d, fail = function(b) {
-                b = b.slice(0, b.indexOf(null));
-                var err = Error(b.toString());
-                err.name = "TruncatedError";
-                err['bytes'] = b;
-                throw err;
-            };
-            while ((a = src()) !== null) {
-                if ((a&0x80) === 0)
-                    dst(a);
-                else if ((a&0xE0) === 0xC0)
-                    ((b = src()) === null) && fail([a, b]),
-                    dst(((a&0x1F)<<6) | (b&0x3F));
-                else if ((a&0xF0) === 0xE0)
-                    ((b=src()) === null || (c=src()) === null) && fail([a, b, c]),
-                    dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F));
-                else if ((a&0xF8) === 0xF0)
-                    ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]),
-                    dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F));
-                else throw RangeError("Illegal starting byte: "+a);
-            }
-        };
-
-        /**
-         * Converts UTF16 characters to UTF8 code points.
-         * @param {!function():number|null} src Characters source as a function returning the next char code respectively
-         *  `null` if there are no more characters left.
-         * @param {!function(number)} dst Code points destination as a function successively called with each converted code
-         *  point.
-         */
-        utfx.UTF16toUTF8 = function(src, dst) {
-            var c1, c2 = null;
-            while (true) {
-                if ((c1 = c2 !== null ? c2 : src()) === null)
-                    break;
-                if (c1 >= 0xD800 && c1 <= 0xDFFF) {
-                    if ((c2 = src()) !== null) {
-                        if (c2 >= 0xDC00 && c2 <= 0xDFFF) {
-                            dst((c1-0xD800)*0x400+c2-0xDC00+0x10000);
-                            c2 = null; continue;
-                        }
-                    }
-                }
-                dst(c1);
-            }
-            if (c2 !== null) dst(c2);
-        };
-
-        /**
-         * Converts UTF8 code points to UTF16 characters.
-         * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point
-         *  respectively `null` if there are no more code points left or a single numeric code point.
-         * @param {!function(number)} dst Characters destination as a function successively called with each converted char code.
-         * @throws {RangeError} If a code point is out of range
-         */
-        utfx.UTF8toUTF16 = function(src, dst) {
-            var cp = null;
-            if (typeof src === 'number')
-                cp = src, src = function() { return null; };
-            while (cp !== null || (cp = src()) !== null) {
-                if (cp <= 0xFFFF)
-                    dst(cp);
-                else
-                    cp -= 0x10000,
-                    dst((cp>>10)+0xD800),
-                    dst((cp%0x400)+0xDC00);
-                cp = null;
-            }
-        };
-
-        /**
-         * Converts and encodes UTF16 characters to UTF8 bytes.
-         * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null`
-         *  if there are no more characters left.
-         * @param {!function(number)} dst Bytes destination as a function successively called with the next byte.
-         */
-        utfx.encodeUTF16toUTF8 = function(src, dst) {
-            utfx.UTF16toUTF8(src, function(cp) {
-                utfx.encodeUTF8(cp, dst);
-            });
-        };
-
-        /**
-         * Decodes and converts UTF8 bytes to UTF16 characters.
-         * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there
-         *  are no more bytes left.
-         * @param {!function(number)} dst Characters destination as a function successively called with each converted char code.
-         * @throws {RangeError} If a starting byte is invalid in UTF8
-         * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes.
-         */
-        utfx.decodeUTF8toUTF16 = function(src, dst) {
-            utfx.decodeUTF8(src, function(cp) {
-                utfx.UTF8toUTF16(cp, dst);
-            });
-        };
-
-        /**
-         * Calculates the byte length of an UTF8 code point.
-         * @param {number} cp UTF8 code point
-         * @returns {number} Byte length
-         */
-        utfx.calculateCodePoint = function(cp) {
-            return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4;
-        };
-
-        /**
-         * Calculates the number of UTF8 bytes required to store UTF8 code points.
-         * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively
-         *  `null` if there are no more code points left.
-         * @returns {number} The number of UTF8 bytes required
-         */
-        utfx.calculateUTF8 = function(src) {
-            var cp, l=0;
-            while ((cp = src()) !== null)
-                l += utfx.calculateCodePoint(cp);
-            return l;
-        };
-
-        /**
-         * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes.
-         * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively
-         *  `null` if there are no more characters left.
-         * @returns {!Array.<number>} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1.
-         */
-        utfx.calculateUTF16asUTF8 = function(src) {
-            var n=0, l=0;
-            utfx.UTF16toUTF8(src, function(cp) {
-                ++n; l += utfx.calculateCodePoint(cp);
-            });
-            return [n,l];
-        };
-
-        return utfx;
-    }();
-
-    Date.now = Date.now || function() { return +new Date; };
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var BCRYPT_SALT_LEN = 16;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var GENSALT_DEFAULT_LOG2_ROUNDS = 10;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var BLOWFISH_NUM_ROUNDS = 16;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var MAX_EXECUTION_TIME = 100;
-
-    /**
-     * @type {Array.<number>}
-     * @const
-     * @inner
-     */
-    var P_ORIG = [
-        0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822,
-        0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
-        0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5,
-        0xb5470917, 0x9216d5d9, 0x8979fb1b
-    ];
-
-    /**
-     * @type {Array.<number>}
-     * @const
-     * @inner
-     */
-    var S_ORIG = [
-        0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed,
-        0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7,
-        0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3,
-        0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
-        0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023,
-        0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
-        0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda,
-        0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
-        0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af,
-        0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6,
-        0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381,
-        0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
-        0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d,
-        0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5,
-        0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a,
-        0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
-        0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c,
-        0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
-        0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3,
-        0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
-        0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724,
-        0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b,
-        0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd,
-        0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
-        0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f,
-        0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd,
-        0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39,
-        0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
-        0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df,
-        0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
-        0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e,
-        0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
-        0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98,
-        0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565,
-        0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341,
-        0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
-        0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0,
-        0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64,
-        0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191,
-        0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
-        0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0,
-        0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
-        0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5,
-        0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
-        0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b,
-        0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f,
-        0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968,
-        0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
-        0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5,
-        0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6,
-        0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799,
-        0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
-        0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71,
-        0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
-        0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6,
-        0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
-        0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f,
-        0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286,
-        0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec,
-        0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
-        0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9,
-        0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,
-        0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e,
-        0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
-        0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290,
-        0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
-        0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6,
-        0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
-        0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847,
-        0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451,
-        0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6,
-        0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
-        0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570,
-        0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa,
-        0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978,
-        0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
-        0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708,
-        0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
-        0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185,
-        0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
-        0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830,
-        0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239,
-        0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab,
-        0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
-        0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19,
-        0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77,
-        0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1,
-        0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
-        0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef,
-        0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
-        0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15,
-        0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
-        0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2,
-        0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492,
-        0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174,
-        0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
-        0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759,
-        0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,
-        0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc,
-        0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
-        0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465,
-        0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
-        0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c,
-        0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
-        0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e,
-        0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,
-        0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0,
-        0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
-        0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462,
-        0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c,
-        0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399,
-        0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
-        0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74,
-        0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
-        0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7,
-        0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
-        0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802,
-        0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22,
-        0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4,
-        0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
-        0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2,
-        0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1,
-        0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c,
-        0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
-        0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341,
-        0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
-        0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b,
-        0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
-        0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88,
-        0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979,
-        0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc,
-        0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
-        0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659,
-        0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f,
-        0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8,
-        0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
-        0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be,
-        0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
-        0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255,
-        0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
-        0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1,
-        0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,
-        0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025,
-        0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
-        0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01,
-        0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641,
-        0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa,
-        0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
-        0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409,
-        0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
-        0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3,
-        0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
-        0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234,
-        0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf,
-        0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740,
-        0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
-        0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f,
-        0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d,
-        0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8,
-        0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
-        0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba,
-        0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
-        0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69,
-        0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
-        0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a,
-        0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b,
-        0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd,
-        0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
-        0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4,
-        0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2,
-        0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb,
-        0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
-        0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751,
-        0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
-        0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369,
-        0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
-        0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd,
-        0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45,
-        0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae,
-        0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
-        0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08,
-        0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d,
-        0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b,
-        0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
-        0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e,
-        0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
-        0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c,
-        0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
-        0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361,
-        0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c,
-        0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be,
-        0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
-        0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d,
-        0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891,
-        0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5,
-        0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
-        0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292,
-        0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
-        0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2,
-        0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
-        0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c,
-        0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8,
-        0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4,
-        0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
-        0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
-    ];
-
-    /**
-     * @type {Array.<number>}
-     * @const
-     * @inner
-     */
-    var C_ORIG = [
-        0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944,
-        0x6f756274
-    ];
-
-    /**
-     * @param {Array.<number>} lr
-     * @param {number} off
-     * @param {Array.<number>} P
-     * @param {Array.<number>} S
-     * @returns {Array.<number>}
-     * @inner
-     */
-    function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
-        var n,
-            l = lr[off],
-            r = lr[off + 1];
-
-        l ^= P[0];
-
-        /*
-        for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;)
-            // Feistel substitution on left word
-            n  = S[l >>> 24],
-            n += S[0x100 | ((l >> 16) & 0xff)],
-            n ^= S[0x200 | ((l >> 8) & 0xff)],
-            n += S[0x300 | (l & 0xff)],
-            r ^= n ^ P[++i],
-            // Feistel substitution on right word
-            n  = S[r >>> 24],
-            n += S[0x100 | ((r >> 16) & 0xff)],
-            n ^= S[0x200 | ((r >> 8) & 0xff)],
-            n += S[0x300 | (r & 0xff)],
-            l ^= n ^ P[++i];
-        */
-
-        //The following is an unrolled version of the above loop.
-        //Iteration 0
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[1];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[2];
-        //Iteration 1
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[3];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[4];
-        //Iteration 2
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[5];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[6];
-        //Iteration 3
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[7];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[8];
-        //Iteration 4
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[9];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[10];
-        //Iteration 5
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[11];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[12];
-        //Iteration 6
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[13];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[14];
-        //Iteration 7
-        n  = S[l >>> 24];
-        n += S[0x100 | ((l >> 16) & 0xff)];
-        n ^= S[0x200 | ((l >> 8) & 0xff)];
-        n += S[0x300 | (l & 0xff)];
-        r ^= n ^ P[15];
-        n  = S[r >>> 24];
-        n += S[0x100 | ((r >> 16) & 0xff)];
-        n ^= S[0x200 | ((r >> 8) & 0xff)];
-        n += S[0x300 | (r & 0xff)];
-        l ^= n ^ P[16];
-
-        lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
-        lr[off + 1] = l;
-        return lr;
-    }
-
-    /**
-     * @param {Array.<number>} data
-     * @param {number} offp
-     * @returns {{key: number, offp: number}}
-     * @inner
-     */
-    function _streamtoword(data, offp) {
-        for (var i = 0, word = 0; i < 4; ++i)
-            word = (word << 8) | (data[offp] & 0xff),
-            offp = (offp + 1) % data.length;
-        return { key: word, offp: offp };
-    }
-
-    /**
-     * @param {Array.<number>} key
-     * @param {Array.<number>} P
-     * @param {Array.<number>} S
-     * @inner
-     */
-    function _key(key, P, S) {
-        var offset = 0,
-            lr = [0, 0],
-            plen = P.length,
-            slen = S.length,
-            sw;
-        for (var i = 0; i < plen; i++)
-            sw = _streamtoword(key, offset),
-            offset = sw.offp,
-            P[i] = P[i] ^ sw.key;
-        for (i = 0; i < plen; i += 2)
-            lr = _encipher(lr, 0, P, S),
-            P[i] = lr[0],
-            P[i + 1] = lr[1];
-        for (i = 0; i < slen; i += 2)
-            lr = _encipher(lr, 0, P, S),
-            S[i] = lr[0],
-            S[i + 1] = lr[1];
-    }
-
-    /**
-     * Expensive key schedule Blowfish.
-     * @param {Array.<number>} data
-     * @param {Array.<number>} key
-     * @param {Array.<number>} P
-     * @param {Array.<number>} S
-     * @inner
-     */
-    function _ekskey(data, key, P, S) {
-        var offp = 0,
-            lr = [0, 0],
-            plen = P.length,
-            slen = S.length,
-            sw;
-        for (var i = 0; i < plen; i++)
-            sw = _streamtoword(key, offp),
-            offp = sw.offp,
-            P[i] = P[i] ^ sw.key;
-        offp = 0;
-        for (i = 0; i < plen; i += 2)
-            sw = _streamtoword(data, offp),
-            offp = sw.offp,
-            lr[0] ^= sw.key,
-            sw = _streamtoword(data, offp),
-            offp = sw.offp,
-            lr[1] ^= sw.key,
-            lr = _encipher(lr, 0, P, S),
-            P[i] = lr[0],
-            P[i + 1] = lr[1];
-        for (i = 0; i < slen; i += 2)
-            sw = _streamtoword(data, offp),
-            offp = sw.offp,
-            lr[0] ^= sw.key,
-            sw = _streamtoword(data, offp),
-            offp = sw.offp,
-            lr[1] ^= sw.key,
-            lr = _encipher(lr, 0, P, S),
-            S[i] = lr[0],
-            S[i + 1] = lr[1];
-    }
-
-    /**
-     * Internaly crypts a string.
-     * @param {Array.<number>} b Bytes to crypt
-     * @param {Array.<number>} salt Salt bytes to use
-     * @param {number} rounds Number of rounds
-     * @param {function(Error, Array.<number>=)=} callback Callback receiving the error, if any, and the resulting bytes. If
-     *  omitted, the operation will be performed synchronously.
-     *  @param {function(number)=} progressCallback Callback called with the current progress
-     * @returns {!Array.<number>|undefined} Resulting bytes if callback has been omitted, otherwise `undefined`
-     * @inner
-     */
-    function _crypt(b, salt, rounds, callback, progressCallback) {
-        var cdata = C_ORIG.slice(),
-            clen = cdata.length,
-            err;
-
-        // Validate
-        if (rounds < 4 || rounds > 31) {
-            err = Error("Illegal number of rounds (4-31): "+rounds);
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            } else
-                throw err;
-        }
-        if (salt.length !== BCRYPT_SALT_LEN) {
-            err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN);
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            } else
-                throw err;
-        }
-        rounds = (1 << rounds) >>> 0;
-
-        var P, S, i = 0, j;
-
-        //Use typed arrays when available - huge speedup!
-        if (Int32Array) {
-            P = new Int32Array(P_ORIG);
-            S = new Int32Array(S_ORIG);
-        } else {
-            P = P_ORIG.slice();
-            S = S_ORIG.slice();
-        }
-
-        _ekskey(salt, b, P, S);
-
-        /**
-         * Calcualtes the next round.
-         * @returns {Array.<number>|undefined} Resulting array if callback has been omitted, otherwise `undefined`
-         * @inner
-         */
-        function next() {
-            if (progressCallback)
-                progressCallback(i / rounds);
-            if (i < rounds) {
-                var start = Date.now();
-                for (; i < rounds;) {
-                    i = i + 1;
-                    _key(b, P, S);
-                    _key(salt, P, S);
-                    if (Date.now() - start > MAX_EXECUTION_TIME)
-                        break;
-                }
-            } else {
-                for (i = 0; i < 64; i++)
-                    for (j = 0; j < (clen >> 1); j++)
-                        _encipher(cdata, j << 1, P, S);
-                var ret = [];
-                for (i = 0; i < clen; i++)
-                    ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
-                    ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
-                    ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
-                    ret.push((cdata[i] & 0xff) >>> 0);
-                if (callback) {
-                    callback(null, ret);
-                    return;
-                } else
-                    return ret;
-            }
-            if (callback)
-                nextTick(next);
-        }
-
-        // Async
-        if (typeof callback !== 'undefined') {
-            next();
-
-            // Sync
-        } else {
-            var res;
-            while (true)
-                if (typeof(res = next()) !== 'undefined')
-                    return res || [];
-        }
-    }
-
-    /**
-     * Internally hashes a string.
-     * @param {string} s String to hash
-     * @param {?string} salt Salt to use, actually never null
-     * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
-     *  hashing is perormed synchronously.
-     *  @param {function(number)=} progressCallback Callback called with the current progress
-     * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
-     * @inner
-     */
-    function _hash(s, salt, callback, progressCallback) {
-        var err;
-        if (typeof s !== 'string' || typeof salt !== 'string') {
-            err = Error("Invalid string / salt: Not a string");
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            }
-            else
-                throw err;
-        }
-
-        // Validate the salt
-        var minor, offset;
-        if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') {
-            err = Error("Invalid salt version: "+salt.substring(0,2));
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            }
-            else
-                throw err;
-        }
-        if (salt.charAt(2) === '$')
-            minor = String.fromCharCode(0),
-            offset = 3;
-        else {
-            minor = salt.charAt(2);
-            if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') {
-                err = Error("Invalid salt revision: "+salt.substring(2,4));
-                if (callback) {
-                    nextTick(callback.bind(this, err));
-                    return;
-                } else
-                    throw err;
-            }
-            offset = 4;
-        }
-
-        // Extract number of rounds
-        if (salt.charAt(offset + 2) > '$') {
-            err = Error("Missing salt rounds");
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            } else
-                throw err;
-        }
-        var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
-            r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
-            rounds = r1 + r2,
-            real_salt = salt.substring(offset + 3, offset + 25);
-        s += minor >= 'a' ? "\x00" : "";
-
-        var passwordb = stringToBytes(s),
-            saltb = base64_decode(real_salt, BCRYPT_SALT_LEN);
-
-        /**
-         * Finishes hashing.
-         * @param {Array.<number>} bytes Byte array
-         * @returns {string}
-         * @inner
-         */
-        function finish(bytes) {
-            var res = [];
-            res.push("$2");
-            if (minor >= 'a')
-                res.push(minor);
-            res.push("$");
-            if (rounds < 10)
-                res.push("0");
-            res.push(rounds.toString());
-            res.push("$");
-            res.push(base64_encode(saltb, saltb.length));
-            res.push(base64_encode(bytes, C_ORIG.length * 4 - 1));
-            return res.join('');
-        }
-
-        // Sync
-        if (typeof callback == 'undefined')
-            return finish(_crypt(passwordb, saltb, rounds));
-
-        // Async
-        else {
-            _crypt(passwordb, saltb, rounds, function(err, bytes) {
-                if (err)
-                    callback(err, null);
-                else
-                    callback(null, finish(bytes));
-            }, progressCallback);
-        }
-    }
-
-    /**
-     * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
-     * @function
-     * @param {!Array.<number>} b Byte array
-     * @param {number} len Maximum input length
-     * @returns {string}
-     * @expose
-     */
-    bcrypt.encodeBase64 = base64_encode;
-
-    /**
-     * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
-     * @function
-     * @param {string} s String to decode
-     * @param {number} len Maximum output length
-     * @returns {!Array.<number>}
-     * @expose
-     */
-    bcrypt.decodeBase64 = base64_decode;
-
-    return bcrypt;
-}));
Index: de_modules/bcryptjs/dist/bcrypt.min.js
===================================================================
--- node_modules/bcryptjs/dist/bcrypt.min.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,48 +1,0 @@
-/*
- bcrypt.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
- Released under the Apache License, Version 2.0
- see: https://github.com/dcodeIO/bcrypt.js for details
-*/
-(function(u,r){"function"===typeof define&&define.amd?define([],r):"function"===typeof require&&"object"===typeof module&&module&&module.exports?module.exports=r():(u.dcodeIO=u.dcodeIO||{}).bcrypt=r()})(this,function(){function u(e){if("undefined"!==typeof module&&module&&module.exports)try{return require("crypto").randomBytes(e)}catch(d){}try{var c;(self.crypto||self.msCrypto).getRandomValues(c=new Uint32Array(e));return Array.prototype.slice.call(c)}catch(b){}if(!w)throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative");
-return w(e)}function r(e,d){for(var c=0,b=0,a=0,f=e.length;a<f;++a)e.charCodeAt(a)===d.charCodeAt(a)?++c:++b;return 0>c?!1:0===b}function H(e){var d=[],c=0;I.encodeUTF16toUTF8(function(){return c>=e.length?null:e.charCodeAt(c++)},function(b){d.push(b)});return d}function x(e,d){var c=0,b=[],a,f;if(0>=d||d>e.length)throw Error("Illegal len: "+d);for(;c<d;){a=e[c++]&255;b.push(s[a>>2&63]);a=(a&3)<<4;if(c>=d){b.push(s[a&63]);break}f=e[c++]&255;a|=f>>4&15;b.push(s[a&63]);a=(f&15)<<2;if(c>=d){b.push(s[a&
-63]);break}f=e[c++]&255;a|=f>>6&3;b.push(s[a&63]);b.push(s[f&63])}return b.join("")}function B(e,d){var c=0,b=e.length,a=0,f=[],g,m,h;if(0>=d)throw Error("Illegal len: "+d);for(;c<b-1&&a<d;){h=e.charCodeAt(c++);g=h<q.length?q[h]:-1;h=e.charCodeAt(c++);m=h<q.length?q[h]:-1;if(-1==g||-1==m)break;h=g<<2>>>0;h|=(m&48)>>4;f.push(z(h));if(++a>=d||c>=b)break;h=e.charCodeAt(c++);g=h<q.length?q[h]:-1;if(-1==g)break;h=(m&15)<<4>>>0;h|=(g&60)>>2;f.push(z(h));if(++a>=d||c>=b)break;h=e.charCodeAt(c++);m=h<q.length?
-q[h]:-1;h=(g&3)<<6>>>0;h|=m;f.push(z(h));++a}b=[];for(c=0;c<a;c++)b.push(f[c].charCodeAt(0));return b}function v(e,d,c,b){var a,f=e[d],g=e[d+1],f=f^c[0];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[1];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[2];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[3];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[4];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|
-f>>8&255];a+=b[768|f&255];g=g^a^c[5];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[6];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[7];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[8];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[9];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[10];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^
-c[11];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[12];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[13];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[14];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[15];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[16];e[d]=g^c[17];e[d+1]=f;return e}function t(e,d){for(var c=0,b=0;4>c;++c)b=b<<8|e[d]&255,d=(d+1)%e.length;
-return{key:b,offp:d}}function C(e,d,c){for(var b=0,a=[0,0],f=d.length,g=c.length,m,h=0;h<f;h++)m=t(e,b),b=m.offp,d[h]^=m.key;for(h=0;h<f;h+=2)a=v(a,0,d,c),d[h]=a[0],d[h+1]=a[1];for(h=0;h<g;h+=2)a=v(a,0,d,c),c[h]=a[0],c[h+1]=a[1]}function J(e,d,c,b){for(var a=0,f=[0,0],g=c.length,m=b.length,h,l=0;l<g;l++)h=t(d,a),a=h.offp,c[l]^=h.key;for(l=a=0;l<g;l+=2)h=t(e,a),a=h.offp,f[0]^=h.key,h=t(e,a),a=h.offp,f[1]^=h.key,f=v(f,0,c,b),c[l]=f[0],c[l+1]=f[1];for(l=0;l<m;l+=2)h=t(e,a),a=h.offp,f[0]^=h.key,h=t(e,
-a),a=h.offp,f[1]^=h.key,f=v(f,0,c,b),b[l]=f[0],b[l+1]=f[1]}function D(e,d,c,b,a){function f(){a&&a(n/c);if(n<c)for(var h=Date.now();n<c&&!(n+=1,C(e,l,k),C(d,l,k),100<Date.now()-h););else{for(n=0;64>n;n++)for(y=0;y<m>>1;y++)v(g,y<<1,l,k);h=[];for(n=0;n<m;n++)h.push((g[n]>>24&255)>>>0),h.push((g[n]>>16&255)>>>0),h.push((g[n]>>8&255)>>>0),h.push((g[n]&255)>>>0);if(b){b(null,h);return}return h}b&&p(f)}var g=E.slice(),m=g.length,h;if(4>c||31<c){h=Error("Illegal number of rounds (4-31): "+c);if(b){p(b.bind(this,
-h));return}throw h;}if(16!==d.length){h=Error("Illegal salt length: "+d.length+" != 16");if(b){p(b.bind(this,h));return}throw h;}c=1<<c>>>0;var l,k,n=0,y;Int32Array?(l=new Int32Array(F),k=new Int32Array(G)):(l=F.slice(),k=G.slice());J(d,e,l,k);if("undefined"!==typeof b)f();else for(;;)if("undefined"!==typeof(h=f()))return h||[]}function A(e,d,c,b){function a(a){var b=[];b.push("$2");"a"<=f&&b.push(f);b.push("$");10>l&&b.push("0");b.push(l.toString());b.push("$");b.push(x(k,k.length));b.push(x(a,4*
-E.length-1));return b.join("")}if("string"!==typeof e||"string"!==typeof d){b=Error("Invalid string / salt: Not a string");if(c){p(c.bind(this,b));return}throw b;}var f,g;if("$"!==d.charAt(0)||"2"!==d.charAt(1)){b=Error("Invalid salt version: "+d.substring(0,2));if(c){p(c.bind(this,b));return}throw b;}if("$"===d.charAt(2))f=String.fromCharCode(0),g=3;else{f=d.charAt(2);if("a"!==f&&"b"!==f&&"y"!==f||"$"!==d.charAt(3)){b=Error("Invalid salt revision: "+d.substring(2,4));if(c){p(c.bind(this,b));return}throw b;
-}g=4}if("$"<d.charAt(g+2)){b=Error("Missing salt rounds");if(c){p(c.bind(this,b));return}throw b;}var m=10*parseInt(d.substring(g,g+1),10),h=parseInt(d.substring(g+1,g+2),10),l=m+h;d=d.substring(g+3,g+25);e=H(e+("a"<=f?"\x00":""));var k=B(d,16);if("undefined"==typeof c)return a(D(e,k,l));D(e,k,l,function(b,d){b?c(b,null):c(null,a(d))},b)}var k={},w=null;try{u(1)}catch(K){}w=null;k.setRandomFallback=function(e){w=e};k.genSaltSync=function(e,d){e=e||10;if("number"!==typeof e)throw Error("Illegal arguments: "+
-typeof e+", "+typeof d);4>e?e=4:31<e&&(e=31);var c=[];c.push("$2a$");10>e&&c.push("0");c.push(e.toString());c.push("$");c.push(x(u(16),16));return c.join("")};k.genSalt=function(e,d,c){function b(a){p(function(){try{a(null,k.genSaltSync(e))}catch(b){a(b)}})}"function"===typeof d&&(c=d,d=void 0);"function"===typeof e&&(c=e,e=void 0);if("undefined"===typeof e)e=10;else if("number"!==typeof e)throw Error("illegal arguments: "+typeof e);if(c){if("function"!==typeof c)throw Error("Illegal callback: "+
-typeof c);b(c)}else return new Promise(function(a,c){b(function(b,d){b?c(b):a(d)})})};k.hashSync=function(e,d){"undefined"===typeof d&&(d=10);"number"===typeof d&&(d=k.genSaltSync(d));if("string"!==typeof e||"string"!==typeof d)throw Error("Illegal arguments: "+typeof e+", "+typeof d);return A(e,d)};k.hash=function(e,d,c,b){function a(a){"string"===typeof e&&"number"===typeof d?k.genSalt(d,function(c,d){A(e,d,a,b)}):"string"===typeof e&&"string"===typeof d?A(e,d,a,b):p(a.bind(this,Error("Illegal arguments: "+
-typeof e+", "+typeof d)))}if(c){if("function"!==typeof c)throw Error("Illegal callback: "+typeof c);a(c)}else return new Promise(function(b,c){a(function(a,d){a?c(a):b(d)})})};k.compareSync=function(e,d){if("string"!==typeof e||"string"!==typeof d)throw Error("Illegal arguments: "+typeof e+", "+typeof d);return 60!==d.length?!1:r(k.hashSync(e,d.substr(0,d.length-31)),d)};k.compare=function(e,d,c,b){function a(a){"string"!==typeof e||"string"!==typeof d?p(a.bind(this,Error("Illegal arguments: "+typeof e+
-", "+typeof d))):60!==d.length?p(a.bind(this,null,!1)):k.hash(e,d.substr(0,29),function(b,c){b?a(b):a(null,r(c,d))},b)}if(c){if("function"!==typeof c)throw Error("Illegal callback: "+typeof c);a(c)}else return new Promise(function(b,c){a(function(a,d){a?c(a):b(d)})})};k.getRounds=function(e){if("string"!==typeof e)throw Error("Illegal arguments: "+typeof e);return parseInt(e.split("$")[2],10)};k.getSalt=function(e){if("string"!==typeof e)throw Error("Illegal arguments: "+typeof e);if(60!==e.length)throw Error("Illegal hash length: "+
-e.length+" != 60");return e.substring(0,29)};var p="undefined"!==typeof process&&process&&"function"===typeof process.nextTick?"function"===typeof setImmediate?setImmediate:process.nextTick:setTimeout,s="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),q=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,
-13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1],z=String.fromCharCode,I=function(){var e={MAX_CODEPOINT:1114111,encodeUTF8:function(d,c){var b=null;"number"===typeof d&&(b=d,d=function(){return null});for(;null!==b||null!==(b=d());)128>b?c(b&127):(2048>b?c(b>>6&31|192):(65536>b?c(b>>12&15|224):(c(b>>18&7|240),c(b>>12&63|128)),c(b>>6&63|128)),c(b&63|128)),b=null},decodeUTF8:function(d,c){for(var b,
-a,f,e,k=function(a){a=a.slice(0,a.indexOf(null));var b=Error(a.toString());b.name="TruncatedError";b.bytes=a;throw b;};null!==(b=d());)if(0===(b&128))c(b);else if(192===(b&224))null===(a=d())&&k([b,a]),c((b&31)<<6|a&63);else if(224===(b&240))null!==(a=d())&&null!==(f=d())||k([b,a,f]),c((b&15)<<12|(a&63)<<6|f&63);else if(240===(b&248))null!==(a=d())&&null!==(f=d())&&null!==(e=d())||k([b,a,f,e]),c((b&7)<<18|(a&63)<<12|(f&63)<<6|e&63);else throw RangeError("Illegal starting byte: "+b);},UTF16toUTF8:function(d,
-c){for(var b,a=null;null!==(b=null!==a?a:d());)55296<=b&&57343>=b&&null!==(a=d())&&56320<=a&&57343>=a?(c(1024*(b-55296)+a-56320+65536),a=null):c(b);null!==a&&c(a)},UTF8toUTF16:function(d,c){var b=null;"number"===typeof d&&(b=d,d=function(){return null});for(;null!==b||null!==(b=d());)65535>=b?c(b):(b-=65536,c((b>>10)+55296),c(b%1024+56320)),b=null},encodeUTF16toUTF8:function(d,c){e.UTF16toUTF8(d,function(b){e.encodeUTF8(b,c)})},decodeUTF8toUTF16:function(d,c){e.decodeUTF8(d,function(b){e.UTF8toUTF16(b,
-c)})},calculateCodePoint:function(d){return 128>d?1:2048>d?2:65536>d?3:4},calculateUTF8:function(d){for(var c,b=0;null!==(c=d());)b+=e.calculateCodePoint(c);return b},calculateUTF16asUTF8:function(d){var c=0,b=0;e.UTF16toUTF8(d,function(a){++c;b+=e.calculateCodePoint(a)});return[c,b]}};return e}();Date.now=Date.now||function(){return+new Date};var F=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,
-3041331479,2450970073,2306472731],G=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,
-289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,
-1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,
-442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,
-3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,
-48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946,1266315497,3048417604,3681880366,3289982499,290971E4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,
-1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,
-613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,
-2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,
-1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,
-4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168,
-2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,
-499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,
-3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,
-309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,
-1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,
-2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,
-2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,
-3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,
-3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409E3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,
-3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,
-1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],E=[1332899944,1700884034,1701343084,1684370003,1668446532,
-1869963892];k.encodeBase64=x;k.decodeBase64=B;return k});
Index: de_modules/bcryptjs/dist/bcrypt.min.map
===================================================================
--- node_modules/bcryptjs/dist/bcrypt.min.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-{
-"version":3,
-"file":"",
-"lineCount":48,
-"mappings":"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",
-"sources":["dist/bcrypt.js"],
-"names":["global","factory","define","require","module","random","len","e","a","self","Uint32Array","Array","prototype","slice","call","randomFallback","Error","safeStringCompare","known","unknown","right","wrong","i","k","length","charCodeAt","stringToBytes","str","out","utfx","encodeUTF16toUTF8","b","push","base64_encode","off","rs","c1","c2","BASE64_CODE","join","base64_decode","s","slen","olen","o","code","BASE64_INDEX","stringFromCharCode","c3","c4","res","_encipher","lr","P","S","n","l","r","_streamtoword","data","offp","word","key","_key","offset","plen","sw","_ekskey","_crypt","salt","rounds","callback","progressCallback","next","start","Date","now","MAX_EXECUTION_TIME","j","clen","cdata","ret","nextTick","C_ORIG","err","bind","BCRYPT_SALT_LEN","Int32Array","P_ORIG","S_ORIG","_hash","finish","bytes","minor","toString","saltb","charAt","substring","String","fromCharCode","r1","parseInt","r2","real_salt","passwordb","bcrypt","setRandomFallback","bcrypt.setRandomFallback","genSaltSync","bcrypt.genSaltSync","seed_length","GENSALT_DEFAULT_LOG2_ROUNDS","genSalt","bcrypt.genSalt","_async","undefined","Promise","resolve","reject","hashSync","bcrypt.hashSync","hash","bcrypt.hash","compareSync","bcrypt.compareSync","substr","compare","bcrypt.compare","comp","getRounds","bcrypt.getRounds","split","getSalt","bcrypt.getSalt","process","setImmediate","setTimeout","utfx.encodeUTF8","src","dst","cp","utfx.decodeUTF8","c","d","fail","indexOf","name","RangeError","utfx.UTF16toUTF8","utfx.UTF8toUTF16","utfx.encodeUTF16toUTF8","UTF16toUTF8","encodeUTF8","utfx.decodeUTF8toUTF16","decodeUTF8","UTF8toUTF16","utfx.calculateCodePoint","utfx.calculateUTF8","calculateCodePoint","utfx.calculateUTF16asUTF8","encodeBase64","decodeBase64"]
-}
Index: de_modules/bcryptjs/externs/bcrypt.js
===================================================================
--- node_modules/bcryptjs/externs/bcrypt.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,91 +1,0 @@
-/*
- * Copyright 2012 The Closure Compiler Authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @fileoverview Definitions for bcrypt.js 2.
- * @externs
- * @author Daniel Wirtz <dcode@dcode.io>
- */
-
-/**
- * @type {Object.<string,*>}
- */
-var bcrypt = {};
-
-/**
- * @param {?function(number):!Array.<number>} random
- */
-bcrypt.setRandomFallback = function(random) {};
-
-/**
- * @param {number=} rounds
- * @param {number=} seed_length
- * @returns {string}
- */
-bcrypt.genSaltSync = function(rounds, seed_length) {};
-
-/**
- * @param {(number|function(Error, ?string))=} rounds
- * @param {(number|function(Error, ?string))=} seed_length
- * @param {function(Error, string=)=} callback
- */
-bcrypt.genSalt = function(rounds, seed_length, callback) {};
-
-/**
- * @param {string} s
- * @param {(number|string)=} salt
- * @returns {?string}
- */
-bcrypt.hashSync = function(s, salt) {};
-
-/**
- * @param {string} s
- * @param {number|string} salt
- * @param {function(Error, string=)} callback
- * @expose
- */
-bcrypt.hash = function(s, salt, callback) {};
-
-/**
- * @param {string} s
- * @param {string} hash
- * @returns {boolean}
- * @throws {Error}
- */
-bcrypt.compareSync = function(s, hash) {};
-
-/**
- * @param {string} s
- * @param {string} hash
- * @param {function(Error, boolean)} callback
- * @throws {Error}
- */
-bcrypt.compare = function(s, hash, callback) {};
-
-/**
- * @param {string} hash
- * @returns {number}
- * @throws {Error}
- */
-bcrypt.getRounds = function(hash) {};
-
-/**
- * @param {string} hash
- * @returns {string}
- * @throws {Error}
- * @expose
- */
-bcrypt.getSalt = function(hash) {};
Index: de_modules/bcryptjs/externs/minimal-env.js
===================================================================
--- node_modules/bcryptjs/externs/minimal-env.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,98 +1,0 @@
-/**
- * @fileoverview Minimal environment for bcrypt.js.
- * @externs
- */
-
-/**
- * @param {string} moduleName
- * returns {*}
- */
-function require(moduleName) {}
-
-/**
- * @constructor
- * @private
- */
-var Module = function() {};
-
-/**
- * @type {*}
- */
-Module.prototype.exports;
-
-/**
- * @type {Module}
- */
-var module;
-
-/**
- * @type {string}
- */
-var __dirname;
-
-/**
- * @type {Object.<string,*>}
- */
-var process = {};
-
-/**
- * @param {function()} func
- */
-process.nextTick = function(func) {};
-
-/**
- * @param {string} s
- * @constructor
- * @extends Array
- */
-var Buffer = function(s) {};
-
-/**
- BEGIN_NODE_INCLUDE
- var crypto = require('crypto');
- END_NODE_INCLUDE
- */
-
-/**
- * @type {Object.<string,*>}
- */
-var crypto = {};
-
-/**
- * @param {number} n
- * @returns {Array.<number>}
- */
-crypto.randomBytes = function(n) {};
-
-/**
- * @type {Object.<string,*>}
- */
-window.crypto = {};
-
-/**
- * @param {Uint8Array|Int8Array|Uint16Array|Int16Array|Uint32Array|Int32Array} array
- */
-window.crypto.getRandomValues = function(array) {};
-
-/**
- * @param {string} name
- * @param {function(...[*]):*} constructor
- */
-var define = function(name, constructor) {};
-
-/**
- * @type {boolean}
- */
-define.amd;
-
-/**
- * @param {...*} var_args
- * @returns {string}
- */
-String.fromCodePoint = function(var_args) {};
-
-/**
- * @param {number} offset
- * @returns {number}
- */
-String.prototype.codePointAt = function(offset) {};
Index: de_modules/bcryptjs/index.js
===================================================================
--- node_modules/bcryptjs/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,29 +1,0 @@
-/*
- Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
- Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
- Copyright (c) 2013 Daniel Wirtz <dcode@dcode.io>
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-module.exports = require("./dist/bcrypt.js");
Index: de_modules/bcryptjs/package.json
===================================================================
--- node_modules/bcryptjs/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,47 +1,0 @@
-{
-  "name": "bcryptjs",
-  "description": "Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.",
-  "version": "2.4.3",
-  "author": "Daniel Wirtz <dcode@dcode.io>",
-  "contributors": [
-    "Shane Girish <shaneGirish@gmail.com> (https://github.com/shaneGirish)",
-    "Alex Murray <> (https://github.com/alexmurray)",
-    "Nicolas Pelletier <> (https://github.com/NicolasPelletier)",
-    "Josh Rogers <> (https://github.com/geekymole)",
-    "Noah Isaacson <noah@nisaacson.com> (https://github.com/nisaacson)"
-  ],
-  "repository": {
-    "type": "url",
-    "url": "https://github.com/dcodeIO/bcrypt.js.git"
-  },
-  "bugs": {
-    "url": "https://github.com/dcodeIO/bcrypt.js/issues"
-  },
-  "keywords": [
-    "bcrypt",
-    "password",
-    "auth",
-    "authentication",
-    "encryption",
-    "crypt",
-    "crypto"
-  ],
-  "main": "index.js",
-  "browser": "dist/bcrypt.js",
-  "dependencies": {},
-  "devDependencies": {
-    "testjs": "~1",
-    "closurecompiler": "~1",
-    "metascript": "~0.18",
-    "bcrypt": "latest",
-    "utfx": "~1"
-  },
-  "license": "MIT",
-  "scripts": {
-    "test": "node node_modules/testjs/bin/testjs",
-    "build": "node scripts/build.js",
-    "compile": "node node_modules/closurecompiler/bin/ccjs dist/bcrypt.js --compilation_level=SIMPLE_OPTIMIZATIONS --create_source_map=dist/bcrypt.min.map > dist/bcrypt.min.js",
-    "compress": "gzip -c -9 dist/bcrypt.min.js > dist/bcrypt.min.js.gz",
-    "make": "npm run build && npm run compile && npm run compress && npm test"
-  }
-}
Index: de_modules/bcryptjs/scripts/build.js
===================================================================
--- node_modules/bcryptjs/scripts/build.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,37 +1,0 @@
-var MetaScript = require("metascript"),
-    path = require("path"),
-    fs = require("fs");
-
-var rootDir = path.join(__dirname, ".."),
-    srcDir = path.join(rootDir, "src"),
-    distDir = path.join(rootDir, "dist"),
-    pkg = require(path.join(rootDir, "package.json")),
-    filename;
-
-var scope = {
-    VERSION: pkg.version,
-    ISAAC: false
-};
-
-// Make standard build
-console.log("Building bcrypt.js with scope", JSON.stringify(scope, null, 2));
-fs.writeFileSync(
-    path.join(distDir, "bcrypt.js"),
-    MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "wrap.js")), filename, scope, srcDir)
-);
-
-// Make isaac build - see: https://github.com/dcodeIO/bcrypt.js/issues/16
-/* scope.ISAAC = true;
-console.log("Building bcrypt-isaac.js with scope", JSON.stringify(scope, null, 2));
-fs.writeFileSync(
-    path.join(distDir, "bcrypt-isaac.js"),
-    MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "bcrypt.js")), filename, scope, srcDir)
-); */
-
-// Update bower.json
-scope = { VERSION: pkg.version };
-console.log("Updating bower.json with scope", JSON.stringify(scope, null, 2));
-fs.writeFileSync(
-    path.join(rootDir, "bower.json"),
-    MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "bower.json")), filename, scope, srcDir)
-);
Index: de_modules/bcryptjs/src/bcrypt.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,327 +1,0 @@
-/**
- * bcrypt namespace.
- * @type {Object.<string,*>}
- */
-var bcrypt = {};
-
-/**
- * The random implementation to use as a fallback.
- * @type {?function(number):!Array.<number>}
- * @inner
- */
-var randomFallback = null;
-
-/**
- * Generates cryptographically secure random bytes.
- * @function
- * @param {number} len Bytes length
- * @returns {!Array.<number>} Random bytes
- * @throws {Error} If no random implementation is available
- * @inner
- */
-function random(len) {
-    /* node */ if (typeof module !== 'undefined' && module && module['exports'])
-        try {
-            return require("crypto")['randomBytes'](len);
-        } catch (e) {}
-    /* WCA */ try {
-        var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len));
-        return Array.prototype.slice.call(a);
-    } catch (e) {}
-    /* fallback */ if (!randomFallback)
-        throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative");
-    return randomFallback(len);
-}
-
-// Test if any secure randomness source is available
-var randomAvailable = false;
-try {
-    random(1);
-    randomAvailable = true;
-} catch (e) {}
-
-// Default fallback, if any
-randomFallback = /*? if (ISAAC) { */function(len) {
-    for (var a=[], i=0; i<len; ++i)
-        a[i] = ((0.5 + isaac() * 2.3283064365386963e-10) * 256) | 0;
-    return a;
-};/*? } else { */null;/*? }*/
-
-/**
- * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
- *  API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it
- *  is seeded properly!
- * @param {?function(number):!Array.<number>} random Function taking the number of bytes to generate as its
- *  sole argument, returning the corresponding array of cryptographically secure random byte values.
- * @see http://nodejs.org/api/crypto.html
- * @see http://www.w3.org/TR/WebCryptoAPI/
- */
-bcrypt.setRandomFallback = function(random) {
-    randomFallback = random;
-};
-
-/**
- * Synchronously generates a salt.
- * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted
- * @param {number=} seed_length Not supported.
- * @returns {string} Resulting salt
- * @throws {Error} If a random fallback is required but not set
- * @expose
- */
-bcrypt.genSaltSync = function(rounds, seed_length) {
-    rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS;
-    if (typeof rounds !== 'number')
-        throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length));
-    if (rounds < 4)
-        rounds = 4;
-    else if (rounds > 31)
-        rounds = 31;
-    var salt = [];
-    salt.push("$2a$");
-    if (rounds < 10)
-        salt.push("0");
-    salt.push(rounds.toString());
-    salt.push('$');
-    salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
-    return salt.join('');
-};
-
-/**
- * Asynchronously generates a salt.
- * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted
- * @param {(number|function(Error, string=))=} seed_length Not supported.
- * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt
- * @returns {!Promise} If `callback` has been omitted
- * @throws {Error} If `callback` is present but not a function
- * @expose
- */
-bcrypt.genSalt = function(rounds, seed_length, callback) {
-    if (typeof seed_length === 'function')
-        callback = seed_length,
-        seed_length = undefined; // Not supported.
-    if (typeof rounds === 'function')
-        callback = rounds,
-        rounds = undefined;
-    if (typeof rounds === 'undefined')
-        rounds = GENSALT_DEFAULT_LOG2_ROUNDS;
-    else if (typeof rounds !== 'number')
-        throw Error("illegal arguments: "+(typeof rounds));
-
-    function _async(callback) {
-        nextTick(function() { // Pretty thin, but salting is fast enough
-            try {
-                callback(null, bcrypt.genSaltSync(rounds));
-            } catch (err) {
-                callback(err);
-            }
-        });
-    }
-
-    if (callback) {
-        if (typeof callback !== 'function')
-            throw Error("Illegal callback: "+typeof(callback));
-        _async(callback);
-    } else
-        return new Promise(function(resolve, reject) {
-            _async(function(err, res) {
-                if (err) {
-                    reject(err);
-                    return;
-                }
-                resolve(res);
-            });
-        });
-};
-
-/**
- * Synchronously generates a hash for the given string.
- * @param {string} s String to hash
- * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10
- * @returns {string} Resulting hash
- * @expose
- */
-bcrypt.hashSync = function(s, salt) {
-    if (typeof salt === 'undefined')
-        salt = GENSALT_DEFAULT_LOG2_ROUNDS;
-    if (typeof salt === 'number')
-        salt = bcrypt.genSaltSync(salt);
-    if (typeof s !== 'string' || typeof salt !== 'string')
-        throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt));
-    return _hash(s, salt);
-};
-
-/**
- * Asynchronously generates a hash for the given string.
- * @param {string} s String to hash
- * @param {number|string} salt Salt length to generate or salt to use
- * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash
- * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
- *  (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
- * @returns {!Promise} If `callback` has been omitted
- * @throws {Error} If `callback` is present but not a function
- * @expose
- */
-bcrypt.hash = function(s, salt, callback, progressCallback) {
-
-    function _async(callback) {
-        if (typeof s === 'string' && typeof salt === 'number')
-            bcrypt.genSalt(salt, function(err, salt) {
-                _hash(s, salt, callback, progressCallback);
-            });
-        else if (typeof s === 'string' && typeof salt === 'string')
-            _hash(s, salt, callback, progressCallback);
-        else
-            nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt))));
-    }
-
-    if (callback) {
-        if (typeof callback !== 'function')
-            throw Error("Illegal callback: "+typeof(callback));
-        _async(callback);
-    } else
-        return new Promise(function(resolve, reject) {
-            _async(function(err, res) {
-                if (err) {
-                    reject(err);
-                    return;
-                }
-                resolve(res);
-            });
-        });
-};
-
-/**
- * Compares two strings of the same length in constant time.
- * @param {string} known Must be of the correct length
- * @param {string} unknown Must be the same length as `known`
- * @returns {boolean}
- * @inner
- */
-function safeStringCompare(known, unknown) {
-    var right = 0,
-        wrong = 0;
-    for (var i=0, k=known.length; i<k; ++i) {
-        if (known.charCodeAt(i) === unknown.charCodeAt(i))
-            ++right;
-        else
-            ++wrong;
-    }
-    // Prevent removal of unused variables (never true, actually)
-    if (right < 0)
-        return false;
-    return wrong === 0;
-}
-
-/**
- * Synchronously tests a string against a hash.
- * @param {string} s String to compare
- * @param {string} hash Hash to test against
- * @returns {boolean} true if matching, otherwise false
- * @throws {Error} If an argument is illegal
- * @expose
- */
-bcrypt.compareSync = function(s, hash) {
-    if (typeof s !== "string" || typeof hash !== "string")
-        throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash));
-    if (hash.length !== 60)
-        return false;
-    return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length-31)), hash);
-};
-
-/**
- * Asynchronously compares the given data against the given hash.
- * @param {string} s Data to compare
- * @param {string} hash Data to be compared to
- * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result
- * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
- *  (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
- * @returns {!Promise} If `callback` has been omitted
- * @throws {Error} If `callback` is present but not a function
- * @expose
- */
-bcrypt.compare = function(s, hash, callback, progressCallback) {
-
-    function _async(callback) {
-        if (typeof s !== "string" || typeof hash !== "string") {
-            nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hash))));
-            return;
-        }
-        if (hash.length !== 60) {
-            nextTick(callback.bind(this, null, false));
-            return;
-        }
-        bcrypt.hash(s, hash.substr(0, 29), function(err, comp) {
-            if (err)
-                callback(err);
-            else
-                callback(null, safeStringCompare(comp, hash));
-        }, progressCallback);
-    }
-
-    if (callback) {
-        if (typeof callback !== 'function')
-            throw Error("Illegal callback: "+typeof(callback));
-        _async(callback);
-    } else
-        return new Promise(function(resolve, reject) {
-            _async(function(err, res) {
-                if (err) {
-                    reject(err);
-                    return;
-                }
-                resolve(res);
-            });
-        });
-};
-
-/**
- * Gets the number of rounds used to encrypt the specified hash.
- * @param {string} hash Hash to extract the used number of rounds from
- * @returns {number} Number of rounds used
- * @throws {Error} If `hash` is not a string
- * @expose
- */
-bcrypt.getRounds = function(hash) {
-    if (typeof hash !== "string")
-        throw Error("Illegal arguments: "+(typeof hash));
-    return parseInt(hash.split("$")[2], 10);
-};
-
-/**
- * Gets the salt portion from a hash. Does not validate the hash.
- * @param {string} hash Hash to extract the salt from
- * @returns {string} Extracted salt part
- * @throws {Error} If `hash` is not a string or otherwise invalid
- * @expose
- */
-bcrypt.getSalt = function(hash) {
-    if (typeof hash !== 'string')
-        throw Error("Illegal arguments: "+(typeof hash));
-    if (hash.length !== 60)
-        throw Error("Illegal hash length: "+hash.length+" != 60");
-    return hash.substring(0, 29);
-};
-
-//? include("bcrypt/util.js");
-
-//? include("bcrypt/impl.js");
-
-/**
- * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
- * @function
- * @param {!Array.<number>} b Byte array
- * @param {number} len Maximum input length
- * @returns {string}
- * @expose
- */
-bcrypt.encodeBase64 = base64_encode;
-
-/**
- * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
- * @function
- * @param {string} s String to decode
- * @param {number} len Maximum output length
- * @returns {!Array.<number>}
- * @expose
- */
-bcrypt.decodeBase64 = base64_decode;
Index: de_modules/bcryptjs/src/bcrypt/impl.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt/impl.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,669 +1,0 @@
-/**
- * @type {number}
- * @const
- * @inner
- */
-var BCRYPT_SALT_LEN = 16;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var GENSALT_DEFAULT_LOG2_ROUNDS = 10;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var BLOWFISH_NUM_ROUNDS = 16;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var MAX_EXECUTION_TIME = 100;
-
-/**
- * @type {Array.<number>}
- * @const
- * @inner
- */
-var P_ORIG = [
-    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822,
-    0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
-    0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5,
-    0xb5470917, 0x9216d5d9, 0x8979fb1b
-];
-
-/**
- * @type {Array.<number>}
- * @const
- * @inner
- */
-var S_ORIG = [
-    0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed,
-    0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7,
-    0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3,
-    0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
-    0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023,
-    0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
-    0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda,
-    0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
-    0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af,
-    0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6,
-    0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381,
-    0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
-    0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d,
-    0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5,
-    0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a,
-    0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
-    0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c,
-    0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
-    0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3,
-    0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
-    0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724,
-    0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b,
-    0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd,
-    0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
-    0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f,
-    0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd,
-    0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39,
-    0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
-    0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df,
-    0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
-    0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e,
-    0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
-    0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98,
-    0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565,
-    0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341,
-    0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
-    0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0,
-    0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64,
-    0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191,
-    0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
-    0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0,
-    0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
-    0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5,
-    0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
-    0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b,
-    0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f,
-    0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968,
-    0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
-    0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5,
-    0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6,
-    0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799,
-    0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
-    0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71,
-    0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
-    0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6,
-    0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
-    0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f,
-    0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286,
-    0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec,
-    0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
-    0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9,
-    0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,
-    0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e,
-    0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
-    0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290,
-    0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
-    0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6,
-    0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
-    0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847,
-    0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451,
-    0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6,
-    0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
-    0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570,
-    0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa,
-    0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978,
-    0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
-    0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708,
-    0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
-    0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185,
-    0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
-    0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830,
-    0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239,
-    0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab,
-    0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
-    0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19,
-    0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77,
-    0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1,
-    0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
-    0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef,
-    0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
-    0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15,
-    0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
-    0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2,
-    0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492,
-    0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174,
-    0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
-    0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759,
-    0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,
-    0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc,
-    0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
-    0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465,
-    0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
-    0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c,
-    0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
-    0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e,
-    0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,
-    0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0,
-    0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
-    0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462,
-    0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c,
-    0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399,
-    0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
-    0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74,
-    0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
-    0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7,
-    0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
-    0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802,
-    0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22,
-    0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4,
-    0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
-    0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2,
-    0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1,
-    0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c,
-    0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
-    0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341,
-    0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
-    0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b,
-    0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
-    0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88,
-    0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979,
-    0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc,
-    0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
-    0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659,
-    0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f,
-    0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8,
-    0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
-    0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be,
-    0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
-    0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255,
-    0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
-    0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1,
-    0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,
-    0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025,
-    0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
-    0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01,
-    0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641,
-    0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa,
-    0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
-    0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409,
-    0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
-    0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3,
-    0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
-    0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234,
-    0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf,
-    0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740,
-    0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
-    0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f,
-    0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d,
-    0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8,
-    0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
-    0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba,
-    0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
-    0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69,
-    0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
-    0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a,
-    0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b,
-    0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd,
-    0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
-    0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4,
-    0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2,
-    0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb,
-    0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
-    0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751,
-    0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
-    0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369,
-    0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
-    0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd,
-    0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45,
-    0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae,
-    0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
-    0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08,
-    0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d,
-    0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b,
-    0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
-    0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e,
-    0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
-    0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c,
-    0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
-    0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361,
-    0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c,
-    0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be,
-    0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
-    0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d,
-    0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891,
-    0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5,
-    0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
-    0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292,
-    0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
-    0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2,
-    0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
-    0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c,
-    0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8,
-    0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4,
-    0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
-    0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
-];
-
-/**
- * @type {Array.<number>}
- * @const
- * @inner
- */
-var C_ORIG = [
-    0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944,
-    0x6f756274
-];
-
-/**
- * @param {Array.<number>} lr
- * @param {number} off
- * @param {Array.<number>} P
- * @param {Array.<number>} S
- * @returns {Array.<number>}
- * @inner
- */
-function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
-    var n,
-        l = lr[off],
-        r = lr[off + 1];
-
-    l ^= P[0];
-
-    /*
-    for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;)
-        // Feistel substitution on left word
-        n  = S[l >>> 24],
-        n += S[0x100 | ((l >> 16) & 0xff)],
-        n ^= S[0x200 | ((l >> 8) & 0xff)],
-        n += S[0x300 | (l & 0xff)],
-        r ^= n ^ P[++i],
-        // Feistel substitution on right word
-        n  = S[r >>> 24],
-        n += S[0x100 | ((r >> 16) & 0xff)],
-        n ^= S[0x200 | ((r >> 8) & 0xff)],
-        n += S[0x300 | (r & 0xff)],
-        l ^= n ^ P[++i];
-    */
-
-    //The following is an unrolled version of the above loop.
-    //Iteration 0
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[1];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[2];
-    //Iteration 1
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[3];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[4];
-    //Iteration 2
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[5];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[6];
-    //Iteration 3
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[7];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[8];
-    //Iteration 4
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[9];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[10];
-    //Iteration 5
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[11];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[12];
-    //Iteration 6
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[13];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[14];
-    //Iteration 7
-    n  = S[l >>> 24];
-    n += S[0x100 | ((l >> 16) & 0xff)];
-    n ^= S[0x200 | ((l >> 8) & 0xff)];
-    n += S[0x300 | (l & 0xff)];
-    r ^= n ^ P[15];
-    n  = S[r >>> 24];
-    n += S[0x100 | ((r >> 16) & 0xff)];
-    n ^= S[0x200 | ((r >> 8) & 0xff)];
-    n += S[0x300 | (r & 0xff)];
-    l ^= n ^ P[16];
-
-    lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
-    lr[off + 1] = l;
-    return lr;
-}
-
-/**
- * @param {Array.<number>} data
- * @param {number} offp
- * @returns {{key: number, offp: number}}
- * @inner
- */
-function _streamtoword(data, offp) {
-    for (var i = 0, word = 0; i < 4; ++i)
-        word = (word << 8) | (data[offp] & 0xff),
-        offp = (offp + 1) % data.length;
-    return { key: word, offp: offp };
-}
-
-/**
- * @param {Array.<number>} key
- * @param {Array.<number>} P
- * @param {Array.<number>} S
- * @inner
- */
-function _key(key, P, S) {
-    var offset = 0,
-        lr = [0, 0],
-        plen = P.length,
-        slen = S.length,
-        sw;
-    for (var i = 0; i < plen; i++)
-        sw = _streamtoword(key, offset),
-        offset = sw.offp,
-        P[i] = P[i] ^ sw.key;
-    for (i = 0; i < plen; i += 2)
-        lr = _encipher(lr, 0, P, S),
-        P[i] = lr[0],
-        P[i + 1] = lr[1];
-    for (i = 0; i < slen; i += 2)
-        lr = _encipher(lr, 0, P, S),
-        S[i] = lr[0],
-        S[i + 1] = lr[1];
-}
-
-/**
- * Expensive key schedule Blowfish.
- * @param {Array.<number>} data
- * @param {Array.<number>} key
- * @param {Array.<number>} P
- * @param {Array.<number>} S
- * @inner
- */
-function _ekskey(data, key, P, S) {
-    var offp = 0,
-        lr = [0, 0],
-        plen = P.length,
-        slen = S.length,
-        sw;
-    for (var i = 0; i < plen; i++)
-        sw = _streamtoword(key, offp),
-        offp = sw.offp,
-        P[i] = P[i] ^ sw.key;
-    offp = 0;
-    for (i = 0; i < plen; i += 2)
-        sw = _streamtoword(data, offp),
-        offp = sw.offp,
-        lr[0] ^= sw.key,
-        sw = _streamtoword(data, offp),
-        offp = sw.offp,
-        lr[1] ^= sw.key,
-        lr = _encipher(lr, 0, P, S),
-        P[i] = lr[0],
-        P[i + 1] = lr[1];
-    for (i = 0; i < slen; i += 2)
-        sw = _streamtoword(data, offp),
-        offp = sw.offp,
-        lr[0] ^= sw.key,
-        sw = _streamtoword(data, offp),
-        offp = sw.offp,
-        lr[1] ^= sw.key,
-        lr = _encipher(lr, 0, P, S),
-        S[i] = lr[0],
-        S[i + 1] = lr[1];
-}
-
-/**
- * Internaly crypts a string.
- * @param {Array.<number>} b Bytes to crypt
- * @param {Array.<number>} salt Salt bytes to use
- * @param {number} rounds Number of rounds
- * @param {function(Error, Array.<number>=)=} callback Callback receiving the error, if any, and the resulting bytes. If
- *  omitted, the operation will be performed synchronously.
- *  @param {function(number)=} progressCallback Callback called with the current progress
- * @returns {!Array.<number>|undefined} Resulting bytes if callback has been omitted, otherwise `undefined`
- * @inner
- */
-function _crypt(b, salt, rounds, callback, progressCallback) {
-    var cdata = C_ORIG.slice(),
-        clen = cdata.length,
-        err;
-
-    // Validate
-    if (rounds < 4 || rounds > 31) {
-        err = Error("Illegal number of rounds (4-31): "+rounds);
-        if (callback) {
-            nextTick(callback.bind(this, err));
-            return;
-        } else
-            throw err;
-    }
-    if (salt.length !== BCRYPT_SALT_LEN) {
-        err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN);
-        if (callback) {
-            nextTick(callback.bind(this, err));
-            return;
-        } else
-            throw err;
-    }
-    rounds = (1 << rounds) >>> 0;
-
-    var P, S, i = 0, j;
-
-    //Use typed arrays when available - huge speedup!
-    if (Int32Array) {
-        P = new Int32Array(P_ORIG);
-        S = new Int32Array(S_ORIG);
-    } else {
-        P = P_ORIG.slice();
-        S = S_ORIG.slice();
-    }
-
-    _ekskey(salt, b, P, S);
-
-    /**
-     * Calcualtes the next round.
-     * @returns {Array.<number>|undefined} Resulting array if callback has been omitted, otherwise `undefined`
-     * @inner
-     */
-    function next() {
-        if (progressCallback)
-            progressCallback(i / rounds);
-        if (i < rounds) {
-            var start = Date.now();
-            for (; i < rounds;) {
-                i = i + 1;
-                _key(b, P, S);
-                _key(salt, P, S);
-                if (Date.now() - start > MAX_EXECUTION_TIME)
-                    break;
-            }
-        } else {
-            for (i = 0; i < 64; i++)
-                for (j = 0; j < (clen >> 1); j++)
-                    _encipher(cdata, j << 1, P, S);
-            var ret = [];
-            for (i = 0; i < clen; i++)
-                ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
-                ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
-                ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
-                ret.push((cdata[i] & 0xff) >>> 0);
-            if (callback) {
-                callback(null, ret);
-                return;
-            } else
-                return ret;
-        }
-        if (callback)
-            nextTick(next);
-    }
-
-    // Async
-    if (typeof callback !== 'undefined') {
-        next();
-
-        // Sync
-    } else {
-        var res;
-        while (true)
-            if (typeof(res = next()) !== 'undefined')
-                return res || [];
-    }
-}
-
-/**
- * Internally hashes a string.
- * @param {string} s String to hash
- * @param {?string} salt Salt to use, actually never null
- * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
- *  hashing is perormed synchronously.
- *  @param {function(number)=} progressCallback Callback called with the current progress
- * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
- * @inner
- */
-function _hash(s, salt, callback, progressCallback) {
-    var err;
-    if (typeof s !== 'string' || typeof salt !== 'string') {
-        err = Error("Invalid string / salt: Not a string");
-        if (callback) {
-            nextTick(callback.bind(this, err));
-            return;
-        }
-        else
-            throw err;
-    }
-
-    // Validate the salt
-    var minor, offset;
-    if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') {
-        err = Error("Invalid salt version: "+salt.substring(0,2));
-        if (callback) {
-            nextTick(callback.bind(this, err));
-            return;
-        }
-        else
-            throw err;
-    }
-    if (salt.charAt(2) === '$')
-        minor = String.fromCharCode(0),
-        offset = 3;
-    else {
-        minor = salt.charAt(2);
-        if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') {
-            err = Error("Invalid salt revision: "+salt.substring(2,4));
-            if (callback) {
-                nextTick(callback.bind(this, err));
-                return;
-            } else
-                throw err;
-        }
-        offset = 4;
-    }
-
-    // Extract number of rounds
-    if (salt.charAt(offset + 2) > '$') {
-        err = Error("Missing salt rounds");
-        if (callback) {
-            nextTick(callback.bind(this, err));
-            return;
-        } else
-            throw err;
-    }
-    var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
-        r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
-        rounds = r1 + r2,
-        real_salt = salt.substring(offset + 3, offset + 25);
-    s += minor >= 'a' ? "\x00" : "";
-
-    var passwordb = stringToBytes(s),
-        saltb = base64_decode(real_salt, BCRYPT_SALT_LEN);
-
-    /**
-     * Finishes hashing.
-     * @param {Array.<number>} bytes Byte array
-     * @returns {string}
-     * @inner
-     */
-    function finish(bytes) {
-        var res = [];
-        res.push("$2");
-        if (minor >= 'a')
-            res.push(minor);
-        res.push("$");
-        if (rounds < 10)
-            res.push("0");
-        res.push(rounds.toString());
-        res.push("$");
-        res.push(base64_encode(saltb, saltb.length));
-        res.push(base64_encode(bytes, C_ORIG.length * 4 - 1));
-        return res.join('');
-    }
-
-    // Sync
-    if (typeof callback == 'undefined')
-        return finish(_crypt(passwordb, saltb, rounds));
-
-    // Async
-    else {
-        _crypt(passwordb, saltb, rounds, function(err, bytes) {
-            if (err)
-                callback(err, null);
-            else
-                callback(null, finish(bytes));
-        }, progressCallback);
-    }
-}
Index: de_modules/bcryptjs/src/bcrypt/prng/README.md
===================================================================
--- node_modules/bcryptjs/src/bcrypt/prng/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-Because of [reasonable security doubts](https://github.com/dcodeIO/bcrypt.js/issues/16), these files, which used to be
-a part of bcrypt-isaac.js, are no longer used but are kept here for reference only.
-
-What is required instead is a proper way to collect entropy sources (using an intermediate stream cipher) which is then
-used to seed the CSPRNG. Pick one and use `bcrypt.setRandomFallback` instead.
Index: de_modules/bcryptjs/src/bcrypt/prng/accum.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt/prng/accum.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,133 +1,0 @@
-/* basic entropy accumulator */
-var accum = (function() {
-
-    var pool,    // randomness pool
-        time,    // start timestamp
-        last;    // last step timestamp
-
-    /* initialize with default pool */
-    function init() {
-        pool = [];
-        time = new Date().getTime();
-        last = time;
-        // use Math.random
-        pool.push((Math.random() * 0xffffffff)|0);
-        // use current time
-        pool.push(time|0);
-    }
-
-    /* perform one step */
-    function step() {
-        if (!to)
-            return;
-        if (pool.length >= 255) { // stop at 255 values (1 more is added on fetch)
-            stop();
-            return;
-        }
-        var now = new Date().getTime();
-        // use actual time difference
-        pool.push(now-last);
-        // always compute, occasionally use Math.random
-        var rnd = (Math.random() * 0xffffffff)|0;
-        if (now % 2)
-            pool[pool.length-1] += rnd;
-        last = now;
-        to = setTimeout(step, 100+Math.random()*512); // use hypothetical time difference
-    }
-
-    var to = null;
-
-    /* starts accumulating */
-    function start() {
-        if (to) return;
-        to = setTimeout(step, 100+Math.random()*512);
-        if (console.log)
-            console.log("bcrypt-isaac: collecting entropy...");
-        // install collectors
-        if (typeof window !== 'undefined' && window && window.addEventListener)
-            window.addEventListener("load", loadCollector, false),
-            window.addEventListener("mousemove", mouseCollector, false),
-            window.addEventListener("touchmove", touchCollector, false);
-        else if (typeof document !== 'undefined' && document && document.attachEvent)
-            document.attachEvent("onload", loadCollector),
-            document.attachEvent("onmousemove", mouseCollector);
-    }
-
-    /* stops accumulating */
-    function stop() {
-        if (!to) return;
-        clearTimeout(to); to = null;
-        // uninstall collectors
-        if (typeof window !== 'undefined' && window && window.removeEventListener)
-            window.removeEventListener("load", loadCollector, false),
-            window.removeEventListener("mousemove", mouseCollector, false),
-            window.removeEventListener("touchmove", touchCollector, false);
-        else if (typeof document !== 'undefined' && document && document.detachEvent)
-            document.detachEvent("onload", loadCollector),
-            document.detachEvent("onmousemove", mouseCollector);
-    }
-
-    /* fetches the randomness pool */
-    function fetch() {
-        // add overall time difference
-        pool.push((new Date().getTime()-time)|0);
-        var res = pool;
-        init();
-        if (console.log)
-            console.log("bcrypt-isaac: using "+res.length+"/256 samples of entropy");
-        // console.log(res);
-        return res;
-    }
-
-    /* adds the current time to the top of the pool */
-    function addTime() {
-        pool[pool.length-1] += new Date().getTime() - time;
-    }
-
-    /* page load collector */
-    function loadCollector() {
-        if (!to || pool.length >= 255)
-            return;
-        pool.push(0);
-        addTime();
-    }
-
-    /* mouse events collector */
-    function mouseCollector(ev) {
-        if (!to || pool.length >= 255)
-            return;
-        try {
-            var x = ev.x || ev.clientX || ev.offsetX || 0,
-                y = ev.y || ev.clientY || ev.offsetY || 0;
-            if (x != 0 || y != 0)
-                pool[pool.length-1] += ((x-mouseCollector.last[0]) ^ (y-mouseCollector.last[1])),
-                addTime(),
-                mouseCollector.last = [x,y];
-        } catch (e) {}
-    }
-    mouseCollector.last = [0,0];
-
-    /* touch events collector */
-    function touchCollector(ev) {
-        if (!to || pool.length >= 255)
-            return;
-        try {
-            var touch = ev.touches[0] || ev.changedTouches[0];
-            var x = touch.pageX || touch.clientX || 0,
-                y = touch.pageY || touch.clientY || 0;
-            if (x != 0 || y != 0)
-                pool[pool.length-1] += (x-touchCollector.last[0]) ^ (y-touchCollector.last[1]),
-                addTime(),
-                touchCollector.last = [x,y];
-        } catch (e) {}
-    }
-    touchCollector.last = [0,0];
-
-    init();
-    return {
-        "start": start,
-        "stop": stop,
-        "fetch": fetch
-    }
-
-})();
Index: de_modules/bcryptjs/src/bcrypt/prng/isaac.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt/prng/isaac.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,140 +1,0 @@
-/*
- isaac.js Copyright (c) 2012 Yves-Marie K. Rinquin
- 
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
- 
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- 
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/* isaac module pattern */
-var isaac = (function(){
-
-    /* internal states */
-    var m = Array(256), // internal memory
-        acc = 0,        // accumulator
-        brs = 0,        // last result
-        cnt = 0,        // counter
-        r = Array(256), // result array
-        gnt = 0,        // generation counter
-        isd = false;    // initially seeded
-
-
-    /* 32-bit integer safe adder */
-    function add(x, y) {
-        var lsb = (x & 0xffff) + (y & 0xffff),
-            msb = (x >>>   16) + (y >>>   16) + (lsb >>> 16);
-        return (msb << 16) | (lsb & 0xffff);
-    }
-
-    /* initialisation */
-    function reset() {
-        acc = brs = cnt = 0;
-        for (var i = 0; i < 256; ++i)
-            m[i] = r[i] = 0;
-        gnt = 0;
-    }
-
-    /* seeding function */
-    function seed(s) {
-        var a, b, c, d, e, f, g, h, i;
-
-        /* seeding the seeds of love */
-        a = b = c = d = e = f = g = h = 0x9e3779b9; /* the golden ratio */
-
-        if (s && typeof(s) === 'number')
-            s = [s];
-
-        if (s instanceof Array) {
-            reset();
-            for (i = 0; i < s.length; ++i)
-                r[i & 0xff] += typeof(s[i]) === 'number' ? s[i] : 0;
-        }
-
-        /* private: seed mixer */
-        function seed_mix() {
-            a ^= b <<  11; d = add(d, a); b = add(b, c);
-            b ^= c >>>  2; e = add(e, b); c = add(c, d);
-            c ^= d <<   8; f = add(f, c); d = add(d, e);
-            d ^= e >>> 16; g = add(g, d); e = add(e, f);
-            e ^= f <<  10; h = add(h, e); f = add(f, g);
-            f ^= g >>>  4; a = add(a, f); g = add(g, h);
-            g ^= h <<   8; b = add(b, g); h = add(h, a);
-            h ^= a >>>  9; c = add(c, h); a = add(a, b);
-        }
-
-        for (i = 0; i < 4; i++) /* scramble it */
-            seed_mix();
-
-        for (i = 0; i < 256; i += 8) {
-            if (s) /* use all the information in the seed */
-                a = add(a, r[i + 0]), b = add(b, r[i + 1]),
-                c = add(c, r[i + 2]), d = add(d, r[i + 3]),
-                e = add(e, r[i + 4]), f = add(f, r[i + 5]),
-                g = add(g, r[i + 6]), h = add(h, r[i + 7]);
-            seed_mix();
-            /* fill in m[] with messy stuff */
-            m[i + 0] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d;
-            m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h;
-        }
-        if (s)
-            /* do a second pass to make all of the seed affect all of m[] */
-            for (i = 0; i < 256; i += 8)
-                a = add(a, m[i + 0]), b = add(b, m[i + 1]),
-                c = add(c, m[i + 2]), d = add(d, m[i + 3]),
-                e = add(e, m[i + 4]), f = add(f, m[i + 5]),
-                g = add(g, m[i + 6]), h = add(h, m[i + 7]),
-                seed_mix(),
-                /* fill in m[] with messy stuff (again) */
-                m[i + 0] = a, m[i + 1] = b, m[i + 2] = c, m[i + 3] = d,
-                m[i + 4] = e, m[i + 5] = f, m[i + 6] = g, m[i + 7] = h;
-        prng(); /* fill in the first set of results */
-        gnt = 256;  /* prepare to use the first set of results */;
-    }
-
-    /* isaac generator, n = number of run */
-    function prng(n) {
-        var i, x, y;
-        n = n && typeof(n) === 'number' ? Math.abs(Math.floor(n)) : 1;
-        while (n--) {
-            cnt = add(cnt,   1);
-            brs = add(brs, cnt);
-            for(i = 0; i < 256; i++) {
-                switch(i & 3) {
-                    case 0: acc ^= acc <<  13; break;
-                    case 1: acc ^= acc >>>  6; break;
-                    case 2: acc ^= acc <<   2; break;
-                    case 3: acc ^= acc >>> 16; break;
-                }
-                acc        = add(m[(i +  128) & 0xff], acc); x = m[i];
-                m[i] =   y = add(m[(x >>>  2) & 0xff], add(acc, brs));
-                r[i] = brs = add(m[(y >>> 10) & 0xff], x);
-            }
-        }
-    }
-
-    /* return a random number between */
-    return function() {
-        if (!isd) // seed from accumulator
-            isd = true,
-            accum.stop(),
-            seed(accum.fetch());
-        if (!gnt--)
-            prng(), gnt = 255;
-        return r[gnt];
-    };
-})();
Index: de_modules/bcryptjs/src/bcrypt/util.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt/util.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,33 +1,0 @@
-/**
- * Continues with the callback on the next tick.
- * @function
- * @param {function(...[*])} callback Callback to execute
- * @inner
- */
-var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function'
-    ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick)
-    : setTimeout;
-
-/**
- * Converts a JavaScript string to UTF8 bytes.
- * @param {string} str String
- * @returns {!Array.<number>} UTF8 bytes
- * @inner
- */
-function stringToBytes(str) {
-    var out = [],
-        i = 0;
-    utfx.encodeUTF16toUTF8(function() {
-        if (i >= str.length) return null;
-        return str.charCodeAt(i++);
-    }, function(b) {
-        out.push(b);
-    });
-    return out;
-}
-
-//? include("util/base64.js");
-
-//? include("../../node_modules/utfx/dist/utfx-embeddable.js");
-
-Date.now = Date.now || function() { return +new Date; }; 
Index: de_modules/bcryptjs/src/bcrypt/util/base64.js
===================================================================
--- node_modules/bcryptjs/src/bcrypt/util/base64.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,115 +1,0 @@
-// A base64 implementation for the bcrypt algorithm. This is partly non-standard.
-
-/**
- * bcrypt's own non-standard base64 dictionary.
- * @type {!Array.<string>}
- * @const
- * @inner
- **/
-var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split('');
-
-/**
- * @type {!Array.<number>}
- * @const
- * @inner
- **/
-var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
-    1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1,
-    -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
-    20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30,
-    31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
-    48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1];
-
-/**
- * @type {!function(...number):string}
- * @inner
- */
-var stringFromCharCode = String.fromCharCode;
-
-/**
- * Encodes a byte array to base64 with up to len bytes of input.
- * @param {!Array.<number>} b Byte array
- * @param {number} len Maximum input length
- * @returns {string}
- * @inner
- */
-function base64_encode(b, len) {
-    var off = 0,
-        rs = [],
-        c1, c2;
-    if (len <= 0 || len > b.length)
-        throw Error("Illegal len: "+len);
-    while (off < len) {
-        c1 = b[off++] & 0xff;
-        rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
-        c1 = (c1 & 0x03) << 4;
-        if (off >= len) {
-            rs.push(BASE64_CODE[c1 & 0x3f]);
-            break;
-        }
-        c2 = b[off++] & 0xff;
-        c1 |= (c2 >> 4) & 0x0f;
-        rs.push(BASE64_CODE[c1 & 0x3f]);
-        c1 = (c2 & 0x0f) << 2;
-        if (off >= len) {
-            rs.push(BASE64_CODE[c1 & 0x3f]);
-            break;
-        }
-        c2 = b[off++] & 0xff;
-        c1 |= (c2 >> 6) & 0x03;
-        rs.push(BASE64_CODE[c1 & 0x3f]);
-        rs.push(BASE64_CODE[c2 & 0x3f]);
-    }
-    return rs.join('');
-}
-
-/**
- * Decodes a base64 encoded string to up to len bytes of output.
- * @param {string} s String to decode
- * @param {number} len Maximum output length
- * @returns {!Array.<number>}
- * @inner
- */
-function base64_decode(s, len) {
-    var off = 0,
-        slen = s.length,
-        olen = 0,
-        rs = [],
-        c1, c2, c3, c4, o, code;
-    if (len <= 0)
-        throw Error("Illegal len: "+len);
-    while (off < slen - 1 && olen < len) {
-        code = s.charCodeAt(off++);
-        c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-        code = s.charCodeAt(off++);
-        c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-        if (c1 == -1 || c2 == -1)
-            break;
-        o = (c1 << 2) >>> 0;
-        o |= (c2 & 0x30) >> 4;
-        rs.push(stringFromCharCode(o));
-        if (++olen >= len || off >= slen)
-            break;
-        code = s.charCodeAt(off++);
-        c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-        if (c3 == -1)
-            break;
-        o = ((c2 & 0x0f) << 4) >>> 0;
-        o |= (c3 & 0x3c) >> 2;
-        rs.push(stringFromCharCode(o));
-        if (++olen >= len || off >= slen)
-            break;
-        code = s.charCodeAt(off++);
-        c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
-        o = ((c3 & 0x03) << 6) >>> 0;
-        o |= c4;
-        rs.push(stringFromCharCode(o));
-        ++olen;
-    }
-    var res = [];
-    for (off = 0; off<olen; off++)
-        res.push(rs[off].charCodeAt(0));
-    return res;
-}
Index: de_modules/bcryptjs/src/bower.json
===================================================================
--- node_modules/bcryptjs/src/bower.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-{
-    "name": "bcryptjs",
-    "description": "Optimized bcrypt in plain JavaScript with zero dependencies.",
-    "version": /*?== VERSION */,
-    "main": "dist/bcrypt.min.js",
-    "license": "New-BSD",
-    "homepage": "http://dcode.io/",
-    "repository": {
-        "type": "git",
-        "url": "git://github.com/dcodeIO/bcrypt.js.git"
-    },
-    "keywords": ["bcrypt", "password", "auth", "authentication", "encryption", "crypt", "crypto"],
-    "dependencies": {},
-    "devDependencies": {},
-    "ignore": [
-        "**/.*",
-        "node_modules",
-        "bower_components",
-        "test",
-        "tests"
-    ]
-}
Index: de_modules/bcryptjs/src/wrap.js
===================================================================
--- node_modules/bcryptjs/src/wrap.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,50 +1,0 @@
-//? if (typeof ISAAC === 'undefined') ISAAC = false;
-/*
- Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
- Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
- Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @license bcrypt.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
- * Released under the Apache License, Version 2.0
- * see: https://github.com/dcodeIO/bcrypt.js for details
- */
-(function(global, factory) {
-
-    /* AMD */ if (typeof define === 'function' && define["amd"])
-        define([], factory);
-    /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"])
-        module["exports"] = factory();
-    /* Global */ else
-        (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory();
-
-}(this, function() {
-    "use strict";
-
-    //? include("bcrypt.js");
-
-    return bcrypt;
-}));
Index: de_modules/bcryptjs/tests/quickbrown.txt
===================================================================
--- node_modules/bcryptjs/tests/quickbrown.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,150 +1,0 @@
-Sentences that contain all letters commonly used in a language
---------------------------------------------------------------
-
-Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -- 2012-04-11
-
-This is an example of a plain-text file encoded in UTF-8.
-
-
-Danish (da)
----------
-
-  Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen
-  Wolther spillede på xylofon.
-  (= Quiz contestants were eating strawbery with cream while Wolther
-  the circus clown played on xylophone.)
-
-German (de)
------------
-
-  Falsches Üben von Xylophonmusik quält jeden größeren Zwerg
-  (= Wrongful practicing of xylophone music tortures every larger dwarf)
-
-  Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich
-  (= Twelve boxing fighters hunted Eva across the dike of Sylt)
-
-  Heizölrückstoßabdämpfung
-  (= fuel oil recoil absorber)
-  (jqvwxy missing, but all non-ASCII letters in one word)
-
-Greek (el)
-----------
-
-  Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο
-  (= No more shall I see acacias or myrtles in the golden clearing)
-
-  Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία
-  (= I uncover the soul-destroying abhorrence)
-
-English (en)
-------------
-
-  The quick brown fox jumps over the lazy dog
-
-Spanish (es)
-------------
-
-  El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y 
-  frío, añoraba a su querido cachorro.
-  (Contains every letter and every accent, but not every combination
-  of vowel + acute.)
-
-French (fr)
------------
-
-  Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à
-  côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce
-  qui lui permet de penser à la cænogenèse de l'être dont il est question
-  dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui,
-  pense-t-il, diminue çà et là la qualité de son œuvre. 
-
-  l'île exiguë
-  Où l'obèse jury mûr
-  Fête l'haï volapük,
-  Âne ex aéquo au whist,
-  Ôtez ce vœu déçu.
-
-  Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en
-  canoë au delà des îles, près du mälström où brûlent les novæ.
-
-Irish Gaelic (ga)
------------------
-
-  D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh
-
-Hungarian (hu)
---------------
-
-  Árvíztűrő tükörfúrógép
-  (= flood-proof mirror-drilling machine, only all non-ASCII letters)
-
-Icelandic (is)
---------------
-
-  Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa
-
-  Sævör grét áðan því úlpan var ónýt
-  (some ASCII letters missing)
-
-Japanese (jp)
--------------
-
-  Hiragana: (Iroha)
-
-  いろはにほへとちりぬるを
-  わかよたれそつねならむ
-  うゐのおくやまけふこえて
-  あさきゆめみしゑひもせす
-
-  Katakana:
-
-  イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
-  ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン
-
-Hebrew (iw)
------------
-
-  ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה
-
-Polish (pl)
------------
-
-  Pchnąć w tę łódź jeża lub ośm skrzyń fig
-  (= To push a hedgehog or eight bins of figs in this boat)
-
-Russian (ru)
-------------
-
-  В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!
-  (= Would a citrus live in the bushes of south? Yes, but only a fake one!)
-
-  Съешь же ещё этих мягких французских булок да выпей чаю
-  (= Eat some more of these fresh French loafs and have some tea) 
-
-Thai (th)
----------
-
-  [--------------------------|------------------------]
-  ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า  กว่าบรรดาฝูงสัตว์เดรัจฉาน
-  จงฝ่าฟันพัฒนาวิชาการ           อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
-  ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า     หัดอภัยเหมือนกีฬาอัชฌาสัย
-  ปฏิบัติประพฤติกฎกำหนดใจ        พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ
-
-  [The copyright for the Thai example is owned by The Computer
-  Association of Thailand under the Royal Patronage of His Majesty the
-  King.]
-
-Turkish (tr)
-------------
-
-  Pijamalı hasta, yağız şoföre çabucak güvendi.
-  (=Patient with pajamas, trusted swarthy driver quickly)
-
-
-Special thanks to the people from all over the world who contributed
-these sentences since 1999.
-
-A much larger collection of such pangrams is now available at
-
-  http://en.wikipedia.org/wiki/List_of_pangrams
-
Index: de_modules/bcryptjs/tests/suite.js
===================================================================
--- node_modules/bcryptjs/tests/suite.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,197 +1,0 @@
-var path = require("path"),
-    fs = require("fs"),
-    binding = require("bcrypt"),
-    bcrypt = require(path.join(__dirname, '..', 'index.js'))/*,
-    isaac = eval(
-        fs.readFileSync(path.join(__dirname, "..", "src", "bcrypt", "prng", "accum.js"))+
-        fs.readFileSync(path.join(__dirname, "..", "src", "bcrypt", "prng", "isaac.js"))+
-        " accum.start();"+
-        " isaac"
-    )*/;
-    
-module.exports = {
-
-    "encodeBase64": function(test) {
-        var str = bcrypt.encodeBase64([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10], 16);
-        test.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu");
-        test.done();
-    },
-
-    "decodeBase64": function(test) {
-        var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16);
-        test.deepEqual(bytes, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]);
-        test.done();
-    },
-    
-    "genSaltSync": function(test) {
-        var salt = bcrypt.genSaltSync(10);
-        test.ok(salt);
-        test.ok(typeof salt == 'string');
-        test.ok(salt.length > 0);
-        test.done();
-    },
-    
-    "genSalt": function(test) {
-        bcrypt.genSalt(10, function(err, salt) {
-            test.ok(salt);
-            test.ok(typeof salt == 'string');
-            test.ok(salt.length > 0);
-            test.done();
-        });
-    },
-    
-    "hashSync": function(test) {
-        test.doesNotThrow(function() {
-            bcrypt.hashSync("hello", 10);
-        });
-        test.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10));
-        test.done();
-    },
-    
-    "hash": function(test) {
-        bcrypt.hash("hello", 10, function(err, hash) {
-            test.notOk(err);
-            test.ok(hash);
-            test.done();
-        });
-    },
-    
-    "compareSync": function(test) {
-        var salt1 = bcrypt.genSaltSync(),
-            hash1 = bcrypt.hashSync("hello", salt1); // $2a$
-        var salt2 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2y$"),
-            hash2 = bcrypt.hashSync("world", salt2);
-        var salt3 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2b$"),
-            hash3 = bcrypt.hashSync("hello world", salt3);
-
-        test.strictEqual(hash1.substring(0,4), "$2a$");
-        test.ok(bcrypt.compareSync("hello", hash1));
-        test.notOk(bcrypt.compareSync("hello", hash2));
-        test.notOk(bcrypt.compareSync("hello", hash3));
-
-        test.strictEqual(hash2.substring(0,4), "$2y$");
-        test.ok(bcrypt.compareSync("world", hash2));
-        test.notOk(bcrypt.compareSync("world", hash1));
-        test.notOk(bcrypt.compareSync("world", hash3));
-
-        test.strictEqual(hash3.substring(0,4), "$2b$");
-        test.ok(bcrypt.compareSync("hello world", hash3));
-        test.notOk(bcrypt.compareSync("hello world", hash1));
-        test.notOk(bcrypt.compareSync("hello world", hash2));
-
-        test.done();
-    },
-    
-    "compare": function(test) {
-        var salt1 = bcrypt.genSaltSync(),
-            hash1 = bcrypt.hashSync("hello", salt1); // $2a$
-        var salt2 = bcrypt.genSaltSync();
-        salt2 = salt2.substring(0,2)+'y'+salt2.substring(3); // $2y$
-        var hash2 = bcrypt.hashSync("world", salt2);
-        bcrypt.compare("hello", hash1, function(err, same) {
-            test.notOk(err);
-            test.ok(same);
-            bcrypt.compare("hello", hash2, function(err, same) {
-                test.notOk(err);
-                test.notOk(same);
-                bcrypt.compare("world", hash2, function(err, same) {
-                    test.notOk(err);
-                    test.ok(same);
-                    bcrypt.compare("world", hash1, function(err, same) {
-                        test.notOk(err);
-                        test.notOk(same);
-                        test.done();
-                    });
-                });
-            });
-        });
-    },
-    
-    "getSalt": function(test) {
-        var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync());
-        var salt = bcrypt.getSalt(hash1);
-        var hash2 = bcrypt.hashSync("hello", salt);
-        test.equal(hash1, hash2);
-        test.done();
-    },
-    
-    "getRounds": function(test) {
-        var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync());
-        test.equal(bcrypt.getRounds(hash1), 10);
-        test.done();
-    },
-   
-    "progress": function(test) {
-        bcrypt.genSalt(12, function(err, salt) {
-            test.ok(!err);
-            var progress = [];
-            bcrypt.hash("hello world", salt, function(err, hash) {
-                test.ok(!err);
-                test.ok(typeof hash === 'string');
-                test.ok(progress.length >= 2);
-                test.strictEqual(progress[0], 0);
-                test.strictEqual(progress[progress.length-1], 1);
-                test.done();
-            }, function(n) {
-                progress.push(n);
-            });
-        });
-    },
-
-    "promise": function(test) {
-        bcrypt.genSalt(10)
-        .then(function(salt) {
-            bcrypt.hash("hello", salt)
-            .then(function(hash) {
-                test.ok(hash);
-                bcrypt.compare("hello", hash)
-                .then(function(result) {
-                    test.ok(result);
-                    bcrypt.genSalt(/* no args */)
-                    .then(function(salt) {
-                        test.ok(salt);
-                        test.done();
-                    }, function(err) {
-                        test.fail(err, null, "promise rejected");
-                    });
-                }, function(err) {
-                    test.fail(err, null, "promise rejected");
-                });
-            }, function(err) {
-                test.fail(err, null, 'promise rejected');
-            });
-        }, function(err) {
-            test.fail(err, null, "promise rejected");
-        });
-    },
-
-    "compat": {
-        "quickbrown": function(test) {
-            var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt"))+"",
-                salt = bcrypt.genSaltSync(),
-                hash1 = binding.hashSync(pass, salt),
-                hash2 = bcrypt.hashSync(pass, salt);
-            test.equal(hash1, hash2);
-            test.done();
-        },
-
-        "roundsOOB": function(test) {
-            var salt1 = bcrypt.genSaltSync(0), // $10$ like not set
-                salt2 = binding.genSaltSync(0);
-            test.strictEqual(salt1.substring(0, 7), "$2a$10$");
-            test.strictEqual(salt2.substring(0, 7), "$2a$10$");
-
-            salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap
-            salt2 = bcrypt.genSaltSync(3);
-            test.strictEqual(salt1.substring(0, 7), "$2a$04$");
-            test.strictEqual(salt2.substring(0, 7), "$2a$04$");
-
-            salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap
-            salt2 = bcrypt.genSaltSync(32);
-            test.strictEqual(salt1.substring(0, 7), "$2a$31$");
-            test.strictEqual(salt2.substring(0, 7), "$2a$31$");
-
-            test.done();
-        }
-    }
-};
Index: de_modules/binary-extensions/binary-extensions.json
===================================================================
--- node_modules/binary-extensions/binary-extensions.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,263 +1,0 @@
-[
-	"3dm",
-	"3ds",
-	"3g2",
-	"3gp",
-	"7z",
-	"a",
-	"aac",
-	"adp",
-	"afdesign",
-	"afphoto",
-	"afpub",
-	"ai",
-	"aif",
-	"aiff",
-	"alz",
-	"ape",
-	"apk",
-	"appimage",
-	"ar",
-	"arj",
-	"asf",
-	"au",
-	"avi",
-	"bak",
-	"baml",
-	"bh",
-	"bin",
-	"bk",
-	"bmp",
-	"btif",
-	"bz2",
-	"bzip2",
-	"cab",
-	"caf",
-	"cgm",
-	"class",
-	"cmx",
-	"cpio",
-	"cr2",
-	"cur",
-	"dat",
-	"dcm",
-	"deb",
-	"dex",
-	"djvu",
-	"dll",
-	"dmg",
-	"dng",
-	"doc",
-	"docm",
-	"docx",
-	"dot",
-	"dotm",
-	"dra",
-	"DS_Store",
-	"dsk",
-	"dts",
-	"dtshd",
-	"dvb",
-	"dwg",
-	"dxf",
-	"ecelp4800",
-	"ecelp7470",
-	"ecelp9600",
-	"egg",
-	"eol",
-	"eot",
-	"epub",
-	"exe",
-	"f4v",
-	"fbs",
-	"fh",
-	"fla",
-	"flac",
-	"flatpak",
-	"fli",
-	"flv",
-	"fpx",
-	"fst",
-	"fvt",
-	"g3",
-	"gh",
-	"gif",
-	"graffle",
-	"gz",
-	"gzip",
-	"h261",
-	"h263",
-	"h264",
-	"icns",
-	"ico",
-	"ief",
-	"img",
-	"ipa",
-	"iso",
-	"jar",
-	"jpeg",
-	"jpg",
-	"jpgv",
-	"jpm",
-	"jxr",
-	"key",
-	"ktx",
-	"lha",
-	"lib",
-	"lvp",
-	"lz",
-	"lzh",
-	"lzma",
-	"lzo",
-	"m3u",
-	"m4a",
-	"m4v",
-	"mar",
-	"mdi",
-	"mht",
-	"mid",
-	"midi",
-	"mj2",
-	"mka",
-	"mkv",
-	"mmr",
-	"mng",
-	"mobi",
-	"mov",
-	"movie",
-	"mp3",
-	"mp4",
-	"mp4a",
-	"mpeg",
-	"mpg",
-	"mpga",
-	"mxu",
-	"nef",
-	"npx",
-	"numbers",
-	"nupkg",
-	"o",
-	"odp",
-	"ods",
-	"odt",
-	"oga",
-	"ogg",
-	"ogv",
-	"otf",
-	"ott",
-	"pages",
-	"pbm",
-	"pcx",
-	"pdb",
-	"pdf",
-	"pea",
-	"pgm",
-	"pic",
-	"png",
-	"pnm",
-	"pot",
-	"potm",
-	"potx",
-	"ppa",
-	"ppam",
-	"ppm",
-	"pps",
-	"ppsm",
-	"ppsx",
-	"ppt",
-	"pptm",
-	"pptx",
-	"psd",
-	"pya",
-	"pyc",
-	"pyo",
-	"pyv",
-	"qt",
-	"rar",
-	"ras",
-	"raw",
-	"resources",
-	"rgb",
-	"rip",
-	"rlc",
-	"rmf",
-	"rmvb",
-	"rpm",
-	"rtf",
-	"rz",
-	"s3m",
-	"s7z",
-	"scpt",
-	"sgi",
-	"shar",
-	"snap",
-	"sil",
-	"sketch",
-	"slk",
-	"smv",
-	"snk",
-	"so",
-	"stl",
-	"suo",
-	"sub",
-	"swf",
-	"tar",
-	"tbz",
-	"tbz2",
-	"tga",
-	"tgz",
-	"thmx",
-	"tif",
-	"tiff",
-	"tlz",
-	"ttc",
-	"ttf",
-	"txz",
-	"udf",
-	"uvh",
-	"uvi",
-	"uvm",
-	"uvp",
-	"uvs",
-	"uvu",
-	"viv",
-	"vob",
-	"war",
-	"wav",
-	"wax",
-	"wbmp",
-	"wdp",
-	"weba",
-	"webm",
-	"webp",
-	"whl",
-	"wim",
-	"wm",
-	"wma",
-	"wmv",
-	"wmx",
-	"woff",
-	"woff2",
-	"wrm",
-	"wvx",
-	"xbm",
-	"xif",
-	"xla",
-	"xlam",
-	"xls",
-	"xlsb",
-	"xlsm",
-	"xlsx",
-	"xlt",
-	"xltm",
-	"xltx",
-	"xm",
-	"xmind",
-	"xpi",
-	"xpm",
-	"xwd",
-	"xz",
-	"z",
-	"zip",
-	"zipx"
-]
Index: de_modules/binary-extensions/binary-extensions.json.d.ts
===================================================================
--- node_modules/binary-extensions/binary-extensions.json.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-declare const binaryExtensionsJson: readonly string[];
-
-export = binaryExtensionsJson;
Index: de_modules/binary-extensions/index.d.ts
===================================================================
--- node_modules/binary-extensions/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-/**
-List of binary file extensions.
-
-@example
-```
-import binaryExtensions = require('binary-extensions');
-
-console.log(binaryExtensions);
-//=> ['3ds', '3g2', …]
-```
-*/
-declare const binaryExtensions: readonly string[];
-
-export = binaryExtensions;
Index: de_modules/binary-extensions/index.js
===================================================================
--- node_modules/binary-extensions/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-module.exports = require('./binary-extensions.json');
Index: de_modules/binary-extensions/license
===================================================================
--- node_modules/binary-extensions/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,10 +1,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
-Copyright (c) Paul Miller (https://paulmillr.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/binary-extensions/package.json
===================================================================
--- node_modules/binary-extensions/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,40 +1,0 @@
-{
-	"name": "binary-extensions",
-	"version": "2.3.0",
-	"description": "List of binary file extensions",
-	"license": "MIT",
-	"repository": "sindresorhus/binary-extensions",
-	"funding": "https://github.com/sponsors/sindresorhus",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "https://sindresorhus.com"
-	},
-	"sideEffects": false,
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts",
-		"binary-extensions.json",
-		"binary-extensions.json.d.ts"
-	],
-	"keywords": [
-		"binary",
-		"extensions",
-		"extension",
-		"file",
-		"json",
-		"list",
-		"array"
-	],
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
Index: de_modules/binary-extensions/readme.md
===================================================================
--- node_modules/binary-extensions/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,25 +1,0 @@
-# binary-extensions
-
-> List of binary file extensions
-
-The list is just a [JSON file](binary-extensions.json) and can be used anywhere.
-
-## Install
-
-```sh
-npm install binary-extensions
-```
-
-## Usage
-
-```js
-const binaryExtensions = require('binary-extensions');
-
-console.log(binaryExtensions);
-//=> ['3ds', '3g2', …]
-```
-
-## Related
-
-- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file
-- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions
Index: de_modules/brace-expansion/LICENSE
===================================================================
--- node_modules/brace-expansion/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,23 +1,0 @@
-MIT License
-
-Copyright Julian Gruber <julian@juliangruber.com>
-
-TypeScript port Copyright Isaac Z. Schlueter <i@izs.me>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/brace-expansion/README.md
===================================================================
--- node_modules/brace-expansion/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,105 +1,0 @@
-# brace-expansion
-
-[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
-as known from sh/bash, in JavaScript.
-
-[![CI](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml/badge.svg)](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml)
-[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
-
-## Example
-
-```js
-import { expand } from 'brace-expansion'
-
-expand('file-{a,b,c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('-v{,,}')
-// => ['-v', '-v', '-v']
-
-expand('file{0..2}.jpg')
-// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
-
-expand('file-{a..c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('file{2..0}.jpg')
-// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
-
-expand('file{0..4..2}.jpg')
-// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
-
-expand('file-{a..e..2}.jpg')
-// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
-
-expand('file{00..10..5}.jpg')
-// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
-
-expand('{{A..C},{a..c}}')
-// => ['A', 'B', 'C', 'a', 'b', 'c']
-
-expand('ppp{,config,oe{,conf}}')
-// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
-```
-
-## API
-
-```js
-import { expand } from 'brace-expansion'
-```
-
-### const expanded = expand(str, [options])
-
-Return an array of all possible and valid expansions of `str`. If
-none are found, `[str]` is returned.
-
-The `options` object can provide a `max` value to cap the number
-of expansions allowed. This is limited to `100_000` by default,
-to prevent DoS attacks.
-
-```js
-const expansions = expand('{1..100}'.repeat(5), {
-  max: 100,
-})
-// expansions.length will be 100, not 100^5
-```
-
-The `options` object can also provide a `maxLength` value to cap the
-total number of characters across all expansions. This is limited to
-`4_000_000` by default, to prevent memory exhaustion from inputs whose
-result count stays under `max` while each result grows very long.
-
-```js
-const expansions = expand('{a,b}'.repeat(1500), {
-  maxLength: 10_000,
-})
-```
-
-Valid expansions are:
-
-```js
-;/^(.*,)+(.+)?$/
-// {a,b,...}
-```
-
-A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
-
-```js
-;/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-A numeric sequence from `x` to `y` inclusive, with optional increment.
-If `x` or `y` start with a leading `0`, all the numbers will be padded
-to have equal length. Negative numbers and backwards iteration work too.
-
-```js
-;/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-An alphabetic sequence from `x` to `y` inclusive, with optional increment.
-`x` and `y` must be exactly one character, and if given, `incr` must be a
-number.
-
-For compatibility reasons, the string `${` is not eligible for brace expansion.
Index: de_modules/brace-expansion/dist/commonjs/index.d.ts
===================================================================
--- node_modules/brace-expansion/dist/commonjs/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-export declare const EXPANSION_MAX = 100000;
-export declare const EXPANSION_MAX_LENGTH = 4000000;
-export declare const EXPANSION_MAX_DEPTH = 1000;
-export declare const EXPANSION_MAX_REWRITES = 1000;
-export type BraceExpansionOptions = {
-    max?: number;
-    maxLength?: number;
-    maxDepth?: number;
-    maxRewrites?: number;
-};
-export declare function expand(str: string, options?: BraceExpansionOptions): string[];
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/brace-expansion/dist/commonjs/index.d.ts.map
===================================================================
--- node_modules/brace-expansion/dist/commonjs/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;AAYpC,eAAO,MAAM,oBAAoB,UAAY,CAAA;AAU7C,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AAUxC,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAyE3C,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,YA+BtE"}
Index: de_modules/brace-expansion/dist/commonjs/index.js
===================================================================
--- node_modules/brace-expansion/dist/commonjs/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,333 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EXPANSION_MAX_REWRITES = exports.EXPANSION_MAX_DEPTH = exports.EXPANSION_MAX_LENGTH = exports.EXPANSION_MAX = void 0;
-exports.expand = expand;
-const balanced_match_1 = require("balanced-match");
-const escSlash = '\0SLASH' + Math.random() + '\0';
-const escOpen = '\0OPEN' + Math.random() + '\0';
-const escClose = '\0CLOSE' + Math.random() + '\0';
-const escComma = '\0COMMA' + Math.random() + '\0';
-const escPeriod = '\0PERIOD' + Math.random() + '\0';
-const escSlashPattern = new RegExp(escSlash, 'g');
-const escOpenPattern = new RegExp(escOpen, 'g');
-const escClosePattern = new RegExp(escClose, 'g');
-const escCommaPattern = new RegExp(escComma, 'g');
-const escPeriodPattern = new RegExp(escPeriod, 'g');
-const slashPattern = /\\\\/g;
-const openPattern = /\\{/g;
-const closePattern = /\\}/g;
-const commaPattern = /\\,/g;
-const periodPattern = /\\\./g;
-exports.EXPANSION_MAX = 100_000;
-// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An
-// input like `'{a,b}'.repeat(1500)` stays under that count - its output is
-// truncated to 100k results - while making every result ~1500 characters
-// long. The result set, and the intermediate arrays built while combining
-// brace sets, then grow large enough to exhaust memory and crash the process
-// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of
-// characters the accumulator may hold at any point, so memory stays flat no
-// matter how many brace groups are chained. The limit sits well above any
-// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M
-// characters) so legitimate input is unaffected.
-exports.EXPANSION_MAX_LENGTH = 4_000_000;
-// `expand_` recurses once per level of brace *nesting* - both when expanding a
-// set's comma members and when re-wrapping a set whose body is a single part.
-// The CVE-2026-14257 fix made the *tail* iterative (recursion on `m.post`, one
-// level per chained group), which left nesting depth unbounded: about 3,100
-// levels of `{{{...a,b...}}}` - only ~6KB of input - exhausted the native stack
-// and crashed the process. `EXPANSION_MAX_DEPTH` bounds how deep the parser
-// will follow nesting. It sits far above any realistic pattern and well below
-// the depth at which the stack runs out.
-exports.EXPANSION_MAX_DEPTH = 1_000;
-// Bash keeps a quirk where a brace group followed by a comma set still expands
-// (`{a},b}`). The parser implements it by rewriting the string and restarting
-// the scan, absorbing one `}` per pass. `n` trailing braces therefore cost `n`
-// full passes over a string that itself grows by one `escClose` sentinel each
-// time - quadratic in `n`, with a ~26x constant from the sentinel's length.
-// 128KB of `'{a}' + '}'.repeat(n) + ',z}'` blocked the event loop for 27
-// seconds to produce two results. `EXPANSION_MAX_REWRITES` bounds how many
-// times the scan may restart. Real `{a},b}` input needs a handful.
-exports.EXPANSION_MAX_REWRITES = 1_000;
-function numeric(str) {
-    return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
-}
-function escapeBraces(str) {
-    return str
-        .replace(slashPattern, escSlash)
-        .replace(openPattern, escOpen)
-        .replace(closePattern, escClose)
-        .replace(commaPattern, escComma)
-        .replace(periodPattern, escPeriod);
-}
-function unescapeBraces(str) {
-    return str
-        .replace(escSlashPattern, '\\')
-        .replace(escOpenPattern, '{')
-        .replace(escClosePattern, '}')
-        .replace(escCommaPattern, ',')
-        .replace(escPeriodPattern, '.');
-}
-// Like `target.push(...items)` but doesn't overflow the stack
-function pushAll(target, items) {
-    for (let i = 0; i < items.length; i++) {
-        target.push(items[i]);
-    }
-}
-/**
- * Basically just str.split(","), but handling cases
- * where we have nested braced sections, which should be
- * treated as individual members, like {a,{b,c},d}
- */
-function parseCommaParts(str) {
-    const parts = [];
-    // Walk the brace groups iteratively. Recursing on `post` once per group let a
-    // chain of them exhaust the stack - the parsing-side counterpart to
-    // the `expand_` overflow fixed for CVE-2026-14257, and not something `max` or
-    // `maxLength` can bound, since it happens before expansion.
-    //
-    // The part the next chunk continues
-    let carry = '';
-    for (;;) {
-        const m = (0, balanced_match_1.balanced)('{', '}', str);
-        if (!m) {
-            const tail = str.split(',');
-            tail[0] = carry + tail[0];
-            pushAll(parts, tail);
-            return parts;
-        }
-        const { pre, body, post } = m;
-        const p = pre.split(',');
-        p[0] = carry + p[0];
-        p[p.length - 1] += '{' + body + '}';
-        if (!post.length) {
-            pushAll(parts, p);
-            return parts;
-        }
-        carry = p.pop();
-        pushAll(parts, p);
-        str = post;
-    }
-}
-function expand(str, options = {}) {
-    if (!str) {
-        return [];
-    }
-    const { max = exports.EXPANSION_MAX, maxLength = exports.EXPANSION_MAX_LENGTH, maxDepth = exports.EXPANSION_MAX_DEPTH, maxRewrites = exports.EXPANSION_MAX_REWRITES, } = options;
-    // I don't know why Bash 4.3 does this, but it does.
-    // Anything starting with {} will have the first two bytes preserved
-    // but *only* at the top level, so {},a}b will not expand to anything,
-    // but a{},b}c will be expanded to [a}c,abc].
-    // One could argue that this is a bug in Bash, but since the goal of
-    // this module is to match Bash's rules, we escape a leading {}
-    if (str.slice(0, 2) === '{}') {
-        str = '\\{\\}' + str.slice(2);
-    }
-    return expand_(escapeBraces(str), max, maxLength, maxDepth, 0, maxRewrites, true).map(unescapeBraces);
-}
-function embrace(str) {
-    return '{' + str + '}';
-}
-function isPadded(el) {
-    return /^-?0\d/.test(el);
-}
-function lte(i, y) {
-    return i <= y;
-}
-function gte(i, y) {
-    return i >= y;
-}
-// Build `{ acc[a] + pre + values[v] }` for every combination, capping the
-// number of results at `max` and the total number of characters at `maxLength`.
-// This is the one place output grows, so bounding it here keeps the single
-// accumulator - and therefore memory - flat regardless of how many brace groups
-// are combined (CVE-2026-14257).
-function combine(acc, pre, values, max, maxLength, dropEmpties) {
-    const out = [];
-    let length = 0;
-    for (let a = 0; a < acc.length; a++) {
-        for (let v = 0; v < values.length; v++) {
-            if (out.length >= max)
-                return out;
-            const expansion = acc[a] + pre + values[v];
-            // Bash drops empty results at the top level. Skip them before they count
-            // against `max`, so `max` bounds the number of *kept* results.
-            if (dropEmpties && !expansion)
-                continue;
-            if (length + expansion.length > maxLength)
-                return out;
-            out.push(expansion);
-            length += expansion.length;
-        }
-    }
-    return out;
-}
-// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)
-// sequence body.
-function expandSequence(body, isAlphaSequence, max, maxLength) {
-    const n = body.split(/\.\./);
-    const N = [];
-    // A sequence body always splits into two or three parts, but the compiler
-    // can't know that.
-    /* c8 ignore start */
-    if (n[0] === undefined || n[1] === undefined) {
-        return N;
-    }
-    /* c8 ignore stop */
-    const x = numeric(n[0]);
-    const y = numeric(n[1]);
-    const width = Math.max(n[0].length, n[1].length);
-    let incr = n.length === 3 && n[2] !== undefined ?
-        Math.max(Math.abs(numeric(n[2])), 1)
-        : 1;
-    let test = lte;
-    const reverse = y < x;
-    if (reverse) {
-        incr *= -1;
-        test = gte;
-    }
-    const pad = n.some(isPadded);
-    let length = 0;
-    for (let i = x; test(i, y) && N.length < max; i += incr) {
-        let c;
-        if (isAlphaSequence) {
-            c = String.fromCharCode(i);
-            if (c === '\\') {
-                c = '';
-            }
-        }
-        else {
-            c = String(i);
-            if (pad) {
-                const need = width - c.length;
-                if (need > 0) {
-                    const z = new Array(need + 1).join('0');
-                    if (i < 0) {
-                        c = '-' + z + c.slice(1);
-                    }
-                    else {
-                        c = z + c;
-                    }
-                }
-            }
-        }
-        if (length + c.length > maxLength)
-            break;
-        N.push(c);
-        length += c.length;
-    }
-    return N;
-}
-function expand_(str, max, maxLength, maxDepth, depth, maxRewrites, isTop) {
-    // Too deeply nested to keep following: treat the rest as literal, the same
-    // way a group that cannot expand is already handled. Truncating rather than
-    // throwing keeps `expand` total, matching `max` and `maxLength`.
-    if (depth > maxDepth) {
-        return [str];
-    }
-    // Consume the string's top-level brace groups left to right, threading a
-    // running set of combined prefixes (`acc`). Expanding the tail iteratively -
-    // rather than recursing on `m.post` once per group - keeps the native stack
-    // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no
-    // longer overflow the stack, and leaves a single accumulator whose size
-    // `maxLength` bounds directly (CVE-2026-14257).
-    let acc = [''];
-    // Bash drops empty results, but only when the *first* top-level group is a
-    // comma set - a sequence like `{a..\}` may legitimately yield ''. The drop
-    // is on the final strings, so it is applied to whichever `combine` produces
-    // them (the one with no brace set left in the tail).
-    // How many times the `{a},b}` rewrite below has restarted the scan. Each pass
-    // re-reads the whole string, so leaving this unbounded is quadratic.
-    let rewrites = 0;
-    let dropEmpties = false;
-    let firstGroup = true;
-    for (;;) {
-        const m = (0, balanced_match_1.balanced)('{', '}', str);
-        // No brace set left: the rest of the string is literal.
-        if (!m) {
-            return combine(acc, str, [''], max, maxLength, dropEmpties);
-        }
-        // no need to expand pre, since it is guaranteed to be free of brace-sets
-        const pre = m.pre;
-        if (/\$$/.test(pre)) {
-            acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);
-            firstGroup = false;
-            if (!m.post.length)
-                break;
-            str = m.post;
-            continue;
-        }
-        const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-        const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-        const isSequence = isNumericSequence || isAlphaSequence;
-        const isOptions = m.body.indexOf(',') >= 0;
-        if (!isSequence && !isOptions) {
-            // {a},b}
-            if (rewrites < maxRewrites && m.post.match(/,(?!,).*\}/)) {
-                rewrites++;
-                str = m.pre + '{' + m.body + escClose + m.post;
-                isTop = true;
-                continue;
-            }
-            // Nothing here expands, so the whole remaining string is literal.
-            return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);
-        }
-        if (firstGroup) {
-            dropEmpties = isTop && !isSequence;
-            firstGroup = false;
-        }
-        let values;
-        if (isSequence) {
-            values = expandSequence(m.body, isAlphaSequence, max, maxLength);
-        }
-        else {
-            let n = parseCommaParts(m.body);
-            if (n.length === 1 && n[0] !== undefined) {
-                // x{{a,b}}y ==> x{a}y x{b}y
-                n = expand_(n[0], max, maxLength, maxDepth, depth + 1, maxRewrites, false).map(embrace);
-                //XXX is this necessary? Can't seem to hit it in tests.
-                /* c8 ignore start */
-                if (n.length === 1) {
-                    acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);
-                    if (!m.post.length)
-                        break;
-                    str = m.post;
-                    continue;
-                }
-                /* c8 ignore stop */
-            }
-            // Values that `combine` is going to drop as empty produce no result, so
-            // they must not count against `max` - otherwise `{a,,b}` with `max: 2`
-            // would stop at `['a', '']` and yield one result instead of two. Skipping
-            // them outright keeps `values` bounded while leaving `max` a bound on
-            // *kept* results.
-            let dropsEmpties = dropEmpties && !m.post.length && !pre;
-            for (let d = 0; dropsEmpties && d < acc.length; d++) {
-                if (acc[d]) {
-                    dropsEmpties = false;
-                }
-            }
-            values = [];
-            let valuesLength = 0;
-            outer: for (let j = 0; j < n.length; j++) {
-                const expanded = expand_(n[j], max, maxLength, maxDepth, depth + 1, maxRewrites, false);
-                for (let k = 0; k < expanded.length; k++) {
-                    const v = expanded[k];
-                    if (dropsEmpties && !v)
-                        continue;
-                    if (values.length >= max ||
-                        valuesLength + v.length > maxLength) {
-                        break outer;
-                    }
-                    values.push(v);
-                    valuesLength += v.length;
-                }
-            }
-        }
-        acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);
-        if (!m.post.length)
-            break;
-        str = m.post;
-    }
-    return acc;
-}
-//# sourceMappingURL=index.js.map
Index: de_modules/brace-expansion/dist/commonjs/index.js.map
===================================================================
--- node_modules/brace-expansion/dist/commonjs/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { balanced } from 'balanced-match'\n\nconst escSlash = '\\0SLASH' + Math.random() + '\\0'\nconst escOpen = '\\0OPEN' + Math.random() + '\\0'\nconst escClose = '\\0CLOSE' + Math.random() + '\\0'\nconst escComma = '\\0COMMA' + Math.random() + '\\0'\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0'\nconst escSlashPattern = new RegExp(escSlash, 'g')\nconst escOpenPattern = new RegExp(escOpen, 'g')\nconst escClosePattern = new RegExp(escClose, 'g')\nconst escCommaPattern = new RegExp(escComma, 'g')\nconst escPeriodPattern = new RegExp(escPeriod, 'g')\nconst slashPattern = /\\\\\\\\/g\nconst openPattern = /\\\\{/g\nconst closePattern = /\\\\}/g\nconst commaPattern = /\\\\,/g\nconst periodPattern = /\\\\\\./g\n\nexport const EXPANSION_MAX = 100_000\n\n// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An\n// input like `'{a,b}'.repeat(1500)` stays under that count - its output is\n// truncated to 100k results - while making every result ~1500 characters\n// long. The result set, and the intermediate arrays built while combining\n// brace sets, then grow large enough to exhaust memory and crash the process\n// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of\n// characters the accumulator may hold at any point, so memory stays flat no\n// matter how many brace groups are chained. The limit sits well above any\n// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M\n// characters) so legitimate input is unaffected.\nexport const EXPANSION_MAX_LENGTH = 4_000_000\n\n// `expand_` recurses once per level of brace *nesting* - both when expanding a\n// set's comma members and when re-wrapping a set whose body is a single part.\n// The CVE-2026-14257 fix made the *tail* iterative (recursion on `m.post`, one\n// level per chained group), which left nesting depth unbounded: about 3,100\n// levels of `{{{...a,b...}}}` - only ~6KB of input - exhausted the native stack\n// and crashed the process. `EXPANSION_MAX_DEPTH` bounds how deep the parser\n// will follow nesting. It sits far above any realistic pattern and well below\n// the depth at which the stack runs out.\nexport const EXPANSION_MAX_DEPTH = 1_000\n\n// Bash keeps a quirk where a brace group followed by a comma set still expands\n// (`{a},b}`). The parser implements it by rewriting the string and restarting\n// the scan, absorbing one `}` per pass. `n` trailing braces therefore cost `n`\n// full passes over a string that itself grows by one `escClose` sentinel each\n// time - quadratic in `n`, with a ~26x constant from the sentinel's length.\n// 128KB of `'{a}' + '}'.repeat(n) + ',z}'` blocked the event loop for 27\n// seconds to produce two results. `EXPANSION_MAX_REWRITES` bounds how many\n// times the scan may restart. Real `{a},b}` input needs a handful.\nexport const EXPANSION_MAX_REWRITES = 1_000\n\nfunction numeric(str: string) {\n  return !isNaN(str as any) ? parseInt(str, 10) : str.charCodeAt(0)\n}\n\nfunction escapeBraces(str: string) {\n  return str\n    .replace(slashPattern, escSlash)\n    .replace(openPattern, escOpen)\n    .replace(closePattern, escClose)\n    .replace(commaPattern, escComma)\n    .replace(periodPattern, escPeriod)\n}\n\nfunction unescapeBraces(str: string) {\n  return str\n    .replace(escSlashPattern, '\\\\')\n    .replace(escOpenPattern, '{')\n    .replace(escClosePattern, '}')\n    .replace(escCommaPattern, ',')\n    .replace(escPeriodPattern, '.')\n}\n\n// Like `target.push(...items)` but doesn't overflow the stack\nfunction pushAll(target: string[], items: string[]) {\n  for (let i = 0; i < items.length; i++) {\n    target.push(items[i] as string)\n  }\n}\n\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str: string) {\n  const parts: string[] = []\n\n  // Walk the brace groups iteratively. Recursing on `post` once per group let a\n  // chain of them exhaust the stack - the parsing-side counterpart to\n  // the `expand_` overflow fixed for CVE-2026-14257, and not something `max` or\n  // `maxLength` can bound, since it happens before expansion.\n  //\n  // The part the next chunk continues\n  let carry = ''\n\n  for (;;) {\n    const m = balanced('{', '}', str)\n\n    if (!m) {\n      const tail = str.split(',')\n      tail[0] = carry + (tail[0] as string)\n      pushAll(parts, tail)\n      return parts\n    }\n\n    const { pre, body, post } = m\n    const p = pre.split(',')\n    p[0] = carry + (p[0] as string)\n    p[p.length - 1] += '{' + body + '}'\n\n    if (!post.length) {\n      pushAll(parts, p)\n      return parts\n    }\n\n    carry = p.pop() as string\n    pushAll(parts, p)\n    str = post\n  }\n}\n\nexport type BraceExpansionOptions = {\n  max?: number\n  maxLength?: number\n  maxDepth?: number\n  maxRewrites?: number\n}\n\nexport function expand(str: string, options: BraceExpansionOptions = {}) {\n  if (!str) {\n    return []\n  }\n\n  const {\n    max = EXPANSION_MAX,\n    maxLength = EXPANSION_MAX_LENGTH,\n    maxDepth = EXPANSION_MAX_DEPTH,\n    maxRewrites = EXPANSION_MAX_REWRITES,\n  } = options\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.slice(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.slice(2)\n  }\n\n  return expand_(\n    escapeBraces(str),\n    max,\n    maxLength,\n    maxDepth,\n    0,\n    maxRewrites,\n    true,\n  ).map(unescapeBraces)\n}\n\nfunction embrace(str: string) {\n  return '{' + str + '}'\n}\n\nfunction isPadded(el: string) {\n  return /^-?0\\d/.test(el)\n}\n\nfunction lte(i: number, y: number) {\n  return i <= y\n}\n\nfunction gte(i: number, y: number) {\n  return i >= y\n}\n\n// Build `{ acc[a] + pre + values[v] }` for every combination, capping the\n// number of results at `max` and the total number of characters at `maxLength`.\n// This is the one place output grows, so bounding it here keeps the single\n// accumulator - and therefore memory - flat regardless of how many brace groups\n// are combined (CVE-2026-14257).\nfunction combine(\n  acc: string[],\n  pre: string,\n  values: string[],\n  max: number,\n  maxLength: number,\n  dropEmpties: boolean,\n): string[] {\n  const out: string[] = []\n  let length = 0\n  for (let a = 0; a < acc.length; a++) {\n    for (let v = 0; v < values.length; v++) {\n      if (out.length >= max) return out\n      const expansion = (acc[a] as string) + pre + values[v]\n      // Bash drops empty results at the top level. Skip them before they count\n      // against `max`, so `max` bounds the number of *kept* results.\n      if (dropEmpties && !expansion) continue\n      if (length + expansion.length > maxLength) return out\n      out.push(expansion)\n      length += expansion.length\n    }\n  }\n  return out\n}\n\n// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)\n// sequence body.\nfunction expandSequence(\n  body: string,\n  isAlphaSequence: boolean,\n  max: number,\n  maxLength: number,\n): string[] {\n  const n = body.split(/\\.\\./)\n  const N: string[] = []\n  // A sequence body always splits into two or three parts, but the compiler\n  // can't know that.\n  /* c8 ignore start */\n  if (n[0] === undefined || n[1] === undefined) {\n    return N\n  }\n  /* c8 ignore stop */\n  const x = numeric(n[0])\n  const y = numeric(n[1])\n  const width = Math.max(n[0].length, n[1].length)\n  let incr =\n    n.length === 3 && n[2] !== undefined ?\n      Math.max(Math.abs(numeric(n[2])), 1)\n    : 1\n  let test = lte\n  const reverse = y < x\n  if (reverse) {\n    incr *= -1\n    test = gte\n  }\n  const pad = n.some(isPadded)\n\n  let length = 0\n  for (let i = x; test(i, y) && N.length < max; i += incr) {\n    let c\n    if (isAlphaSequence) {\n      c = String.fromCharCode(i)\n      if (c === '\\\\') {\n        c = ''\n      }\n    } else {\n      c = String(i)\n      if (pad) {\n        const need = width - c.length\n        if (need > 0) {\n          const z = new Array(need + 1).join('0')\n          if (i < 0) {\n            c = '-' + z + c.slice(1)\n          } else {\n            c = z + c\n          }\n        }\n      }\n    }\n    if (length + c.length > maxLength) break\n    N.push(c)\n    length += c.length\n  }\n  return N\n}\n\nfunction expand_(\n  str: string,\n  max: number,\n  maxLength: number,\n  maxDepth: number,\n  depth: number,\n  maxRewrites: number,\n  isTop: boolean,\n): string[] {\n  // Too deeply nested to keep following: treat the rest as literal, the same\n  // way a group that cannot expand is already handled. Truncating rather than\n  // throwing keeps `expand` total, matching `max` and `maxLength`.\n  if (depth > maxDepth) {\n    return [str]\n  }\n\n  // Consume the string's top-level brace groups left to right, threading a\n  // running set of combined prefixes (`acc`). Expanding the tail iteratively -\n  // rather than recursing on `m.post` once per group - keeps the native stack\n  // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no\n  // longer overflow the stack, and leaves a single accumulator whose size\n  // `maxLength` bounds directly (CVE-2026-14257).\n  let acc: string[] = ['']\n\n  // Bash drops empty results, but only when the *first* top-level group is a\n  // comma set - a sequence like `{a..\\}` may legitimately yield ''. The drop\n  // is on the final strings, so it is applied to whichever `combine` produces\n  // them (the one with no brace set left in the tail).\n  // How many times the `{a},b}` rewrite below has restarted the scan. Each pass\n  // re-reads the whole string, so leaving this unbounded is quadratic.\n  let rewrites = 0\n  let dropEmpties = false\n  let firstGroup = true\n\n  for (;;) {\n    const m = balanced('{', '}', str)\n\n    // No brace set left: the rest of the string is literal.\n    if (!m) {\n      return combine(acc, str, [''], max, maxLength, dropEmpties)\n    }\n\n    // no need to expand pre, since it is guaranteed to be free of brace-sets\n    const pre = m.pre\n\n    if (/\\$$/.test(pre)) {\n      acc = combine(\n        acc,\n        pre + '{' + m.body + '}',\n        [''],\n        max,\n        maxLength,\n        dropEmpties && !m.post.length,\n      )\n      firstGroup = false\n      if (!m.post.length) break\n      str = m.post\n      continue\n    }\n\n    const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body)\n    const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(\n      m.body,\n    )\n    const isSequence = isNumericSequence || isAlphaSequence\n    const isOptions = m.body.indexOf(',') >= 0\n    if (!isSequence && !isOptions) {\n      // {a},b}\n      if (rewrites < maxRewrites && m.post.match(/,(?!,).*\\}/)) {\n        rewrites++\n        str = m.pre + '{' + m.body + escClose + m.post\n        isTop = true\n        continue\n      }\n      // Nothing here expands, so the whole remaining string is literal.\n      return combine(\n        acc,\n        pre + '{' + m.body + '}' + m.post,\n        [''],\n        max,\n        maxLength,\n        dropEmpties,\n      )\n    }\n\n    if (firstGroup) {\n      dropEmpties = isTop && !isSequence\n      firstGroup = false\n    }\n\n    let values: string[]\n    if (isSequence) {\n      values = expandSequence(m.body, isAlphaSequence, max, maxLength)\n    } else {\n      let n = parseCommaParts(m.body)\n      if (n.length === 1 && n[0] !== undefined) {\n        // x{{a,b}}y ==> x{a}y x{b}y\n        n = expand_(\n          n[0],\n          max,\n          maxLength,\n          maxDepth,\n          depth + 1,\n          maxRewrites,\n          false,\n        ).map(embrace)\n        //XXX is this necessary? Can't seem to hit it in tests.\n        /* c8 ignore start */\n        if (n.length === 1) {\n          acc = combine(\n            acc,\n            pre + n[0],\n            [''],\n            max,\n            maxLength,\n            dropEmpties && !m.post.length,\n          )\n          if (!m.post.length) break\n          str = m.post\n          continue\n        }\n        /* c8 ignore stop */\n      }\n\n      // Values that `combine` is going to drop as empty produce no result, so\n      // they must not count against `max` - otherwise `{a,,b}` with `max: 2`\n      // would stop at `['a', '']` and yield one result instead of two. Skipping\n      // them outright keeps `values` bounded while leaving `max` a bound on\n      // *kept* results.\n      let dropsEmpties = dropEmpties && !m.post.length && !pre\n      for (let d = 0; dropsEmpties && d < acc.length; d++) {\n        if (acc[d]) {\n          dropsEmpties = false\n        }\n      }\n\n      values = []\n      let valuesLength = 0\n      outer: for (let j = 0; j < n.length; j++) {\n        const expanded = expand_(\n          n[j] as string,\n          max,\n          maxLength,\n          maxDepth,\n          depth + 1,\n          maxRewrites,\n          false,\n        )\n        for (let k = 0; k < expanded.length; k++) {\n          const v = expanded[k] as string\n          if (dropsEmpties && !v) continue\n          if (\n            values.length >= max ||\n            valuesLength + v.length > maxLength\n          ) {\n            break outer\n          }\n          values.push(v)\n          valuesLength += v.length\n        }\n      }\n    }\n\n    acc = combine(\n      acc,\n      pre,\n      values,\n      max,\n      maxLength,\n      dropEmpties && !m.post.length,\n    )\n    if (!m.post.length) break\n    str = m.post\n  }\n\n  return acc\n}\n"]}
Index: de_modules/brace-expansion/dist/commonjs/package.json
===================================================================
--- node_modules/brace-expansion/dist/commonjs/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "commonjs"
-}
Index: de_modules/brace-expansion/dist/esm/index.d.ts
===================================================================
--- node_modules/brace-expansion/dist/esm/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-export declare const EXPANSION_MAX = 100000;
-export declare const EXPANSION_MAX_LENGTH = 4000000;
-export declare const EXPANSION_MAX_DEPTH = 1000;
-export declare const EXPANSION_MAX_REWRITES = 1000;
-export type BraceExpansionOptions = {
-    max?: number;
-    maxLength?: number;
-    maxDepth?: number;
-    maxRewrites?: number;
-};
-export declare function expand(str: string, options?: BraceExpansionOptions): string[];
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/brace-expansion/dist/esm/index.d.ts.map
===================================================================
--- node_modules/brace-expansion/dist/esm/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;AAYpC,eAAO,MAAM,oBAAoB,UAAY,CAAA;AAU7C,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AAUxC,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAyE3C,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,YA+BtE"}
Index: de_modules/brace-expansion/dist/esm/index.js
===================================================================
--- node_modules/brace-expansion/dist/esm/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,329 +1,0 @@
-import { balanced } from 'balanced-match';
-const escSlash = '\0SLASH' + Math.random() + '\0';
-const escOpen = '\0OPEN' + Math.random() + '\0';
-const escClose = '\0CLOSE' + Math.random() + '\0';
-const escComma = '\0COMMA' + Math.random() + '\0';
-const escPeriod = '\0PERIOD' + Math.random() + '\0';
-const escSlashPattern = new RegExp(escSlash, 'g');
-const escOpenPattern = new RegExp(escOpen, 'g');
-const escClosePattern = new RegExp(escClose, 'g');
-const escCommaPattern = new RegExp(escComma, 'g');
-const escPeriodPattern = new RegExp(escPeriod, 'g');
-const slashPattern = /\\\\/g;
-const openPattern = /\\{/g;
-const closePattern = /\\}/g;
-const commaPattern = /\\,/g;
-const periodPattern = /\\\./g;
-export const EXPANSION_MAX = 100_000;
-// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An
-// input like `'{a,b}'.repeat(1500)` stays under that count - its output is
-// truncated to 100k results - while making every result ~1500 characters
-// long. The result set, and the intermediate arrays built while combining
-// brace sets, then grow large enough to exhaust memory and crash the process
-// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of
-// characters the accumulator may hold at any point, so memory stays flat no
-// matter how many brace groups are chained. The limit sits well above any
-// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M
-// characters) so legitimate input is unaffected.
-export const EXPANSION_MAX_LENGTH = 4_000_000;
-// `expand_` recurses once per level of brace *nesting* - both when expanding a
-// set's comma members and when re-wrapping a set whose body is a single part.
-// The CVE-2026-14257 fix made the *tail* iterative (recursion on `m.post`, one
-// level per chained group), which left nesting depth unbounded: about 3,100
-// levels of `{{{...a,b...}}}` - only ~6KB of input - exhausted the native stack
-// and crashed the process. `EXPANSION_MAX_DEPTH` bounds how deep the parser
-// will follow nesting. It sits far above any realistic pattern and well below
-// the depth at which the stack runs out.
-export const EXPANSION_MAX_DEPTH = 1_000;
-// Bash keeps a quirk where a brace group followed by a comma set still expands
-// (`{a},b}`). The parser implements it by rewriting the string and restarting
-// the scan, absorbing one `}` per pass. `n` trailing braces therefore cost `n`
-// full passes over a string that itself grows by one `escClose` sentinel each
-// time - quadratic in `n`, with a ~26x constant from the sentinel's length.
-// 128KB of `'{a}' + '}'.repeat(n) + ',z}'` blocked the event loop for 27
-// seconds to produce two results. `EXPANSION_MAX_REWRITES` bounds how many
-// times the scan may restart. Real `{a},b}` input needs a handful.
-export const EXPANSION_MAX_REWRITES = 1_000;
-function numeric(str) {
-    return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
-}
-function escapeBraces(str) {
-    return str
-        .replace(slashPattern, escSlash)
-        .replace(openPattern, escOpen)
-        .replace(closePattern, escClose)
-        .replace(commaPattern, escComma)
-        .replace(periodPattern, escPeriod);
-}
-function unescapeBraces(str) {
-    return str
-        .replace(escSlashPattern, '\\')
-        .replace(escOpenPattern, '{')
-        .replace(escClosePattern, '}')
-        .replace(escCommaPattern, ',')
-        .replace(escPeriodPattern, '.');
-}
-// Like `target.push(...items)` but doesn't overflow the stack
-function pushAll(target, items) {
-    for (let i = 0; i < items.length; i++) {
-        target.push(items[i]);
-    }
-}
-/**
- * Basically just str.split(","), but handling cases
- * where we have nested braced sections, which should be
- * treated as individual members, like {a,{b,c},d}
- */
-function parseCommaParts(str) {
-    const parts = [];
-    // Walk the brace groups iteratively. Recursing on `post` once per group let a
-    // chain of them exhaust the stack - the parsing-side counterpart to
-    // the `expand_` overflow fixed for CVE-2026-14257, and not something `max` or
-    // `maxLength` can bound, since it happens before expansion.
-    //
-    // The part the next chunk continues
-    let carry = '';
-    for (;;) {
-        const m = balanced('{', '}', str);
-        if (!m) {
-            const tail = str.split(',');
-            tail[0] = carry + tail[0];
-            pushAll(parts, tail);
-            return parts;
-        }
-        const { pre, body, post } = m;
-        const p = pre.split(',');
-        p[0] = carry + p[0];
-        p[p.length - 1] += '{' + body + '}';
-        if (!post.length) {
-            pushAll(parts, p);
-            return parts;
-        }
-        carry = p.pop();
-        pushAll(parts, p);
-        str = post;
-    }
-}
-export function expand(str, options = {}) {
-    if (!str) {
-        return [];
-    }
-    const { max = EXPANSION_MAX, maxLength = EXPANSION_MAX_LENGTH, maxDepth = EXPANSION_MAX_DEPTH, maxRewrites = EXPANSION_MAX_REWRITES, } = options;
-    // I don't know why Bash 4.3 does this, but it does.
-    // Anything starting with {} will have the first two bytes preserved
-    // but *only* at the top level, so {},a}b will not expand to anything,
-    // but a{},b}c will be expanded to [a}c,abc].
-    // One could argue that this is a bug in Bash, but since the goal of
-    // this module is to match Bash's rules, we escape a leading {}
-    if (str.slice(0, 2) === '{}') {
-        str = '\\{\\}' + str.slice(2);
-    }
-    return expand_(escapeBraces(str), max, maxLength, maxDepth, 0, maxRewrites, true).map(unescapeBraces);
-}
-function embrace(str) {
-    return '{' + str + '}';
-}
-function isPadded(el) {
-    return /^-?0\d/.test(el);
-}
-function lte(i, y) {
-    return i <= y;
-}
-function gte(i, y) {
-    return i >= y;
-}
-// Build `{ acc[a] + pre + values[v] }` for every combination, capping the
-// number of results at `max` and the total number of characters at `maxLength`.
-// This is the one place output grows, so bounding it here keeps the single
-// accumulator - and therefore memory - flat regardless of how many brace groups
-// are combined (CVE-2026-14257).
-function combine(acc, pre, values, max, maxLength, dropEmpties) {
-    const out = [];
-    let length = 0;
-    for (let a = 0; a < acc.length; a++) {
-        for (let v = 0; v < values.length; v++) {
-            if (out.length >= max)
-                return out;
-            const expansion = acc[a] + pre + values[v];
-            // Bash drops empty results at the top level. Skip them before they count
-            // against `max`, so `max` bounds the number of *kept* results.
-            if (dropEmpties && !expansion)
-                continue;
-            if (length + expansion.length > maxLength)
-                return out;
-            out.push(expansion);
-            length += expansion.length;
-        }
-    }
-    return out;
-}
-// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)
-// sequence body.
-function expandSequence(body, isAlphaSequence, max, maxLength) {
-    const n = body.split(/\.\./);
-    const N = [];
-    // A sequence body always splits into two or three parts, but the compiler
-    // can't know that.
-    /* c8 ignore start */
-    if (n[0] === undefined || n[1] === undefined) {
-        return N;
-    }
-    /* c8 ignore stop */
-    const x = numeric(n[0]);
-    const y = numeric(n[1]);
-    const width = Math.max(n[0].length, n[1].length);
-    let incr = n.length === 3 && n[2] !== undefined ?
-        Math.max(Math.abs(numeric(n[2])), 1)
-        : 1;
-    let test = lte;
-    const reverse = y < x;
-    if (reverse) {
-        incr *= -1;
-        test = gte;
-    }
-    const pad = n.some(isPadded);
-    let length = 0;
-    for (let i = x; test(i, y) && N.length < max; i += incr) {
-        let c;
-        if (isAlphaSequence) {
-            c = String.fromCharCode(i);
-            if (c === '\\') {
-                c = '';
-            }
-        }
-        else {
-            c = String(i);
-            if (pad) {
-                const need = width - c.length;
-                if (need > 0) {
-                    const z = new Array(need + 1).join('0');
-                    if (i < 0) {
-                        c = '-' + z + c.slice(1);
-                    }
-                    else {
-                        c = z + c;
-                    }
-                }
-            }
-        }
-        if (length + c.length > maxLength)
-            break;
-        N.push(c);
-        length += c.length;
-    }
-    return N;
-}
-function expand_(str, max, maxLength, maxDepth, depth, maxRewrites, isTop) {
-    // Too deeply nested to keep following: treat the rest as literal, the same
-    // way a group that cannot expand is already handled. Truncating rather than
-    // throwing keeps `expand` total, matching `max` and `maxLength`.
-    if (depth > maxDepth) {
-        return [str];
-    }
-    // Consume the string's top-level brace groups left to right, threading a
-    // running set of combined prefixes (`acc`). Expanding the tail iteratively -
-    // rather than recursing on `m.post` once per group - keeps the native stack
-    // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no
-    // longer overflow the stack, and leaves a single accumulator whose size
-    // `maxLength` bounds directly (CVE-2026-14257).
-    let acc = [''];
-    // Bash drops empty results, but only when the *first* top-level group is a
-    // comma set - a sequence like `{a..\}` may legitimately yield ''. The drop
-    // is on the final strings, so it is applied to whichever `combine` produces
-    // them (the one with no brace set left in the tail).
-    // How many times the `{a},b}` rewrite below has restarted the scan. Each pass
-    // re-reads the whole string, so leaving this unbounded is quadratic.
-    let rewrites = 0;
-    let dropEmpties = false;
-    let firstGroup = true;
-    for (;;) {
-        const m = balanced('{', '}', str);
-        // No brace set left: the rest of the string is literal.
-        if (!m) {
-            return combine(acc, str, [''], max, maxLength, dropEmpties);
-        }
-        // no need to expand pre, since it is guaranteed to be free of brace-sets
-        const pre = m.pre;
-        if (/\$$/.test(pre)) {
-            acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);
-            firstGroup = false;
-            if (!m.post.length)
-                break;
-            str = m.post;
-            continue;
-        }
-        const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-        const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-        const isSequence = isNumericSequence || isAlphaSequence;
-        const isOptions = m.body.indexOf(',') >= 0;
-        if (!isSequence && !isOptions) {
-            // {a},b}
-            if (rewrites < maxRewrites && m.post.match(/,(?!,).*\}/)) {
-                rewrites++;
-                str = m.pre + '{' + m.body + escClose + m.post;
-                isTop = true;
-                continue;
-            }
-            // Nothing here expands, so the whole remaining string is literal.
-            return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);
-        }
-        if (firstGroup) {
-            dropEmpties = isTop && !isSequence;
-            firstGroup = false;
-        }
-        let values;
-        if (isSequence) {
-            values = expandSequence(m.body, isAlphaSequence, max, maxLength);
-        }
-        else {
-            let n = parseCommaParts(m.body);
-            if (n.length === 1 && n[0] !== undefined) {
-                // x{{a,b}}y ==> x{a}y x{b}y
-                n = expand_(n[0], max, maxLength, maxDepth, depth + 1, maxRewrites, false).map(embrace);
-                //XXX is this necessary? Can't seem to hit it in tests.
-                /* c8 ignore start */
-                if (n.length === 1) {
-                    acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);
-                    if (!m.post.length)
-                        break;
-                    str = m.post;
-                    continue;
-                }
-                /* c8 ignore stop */
-            }
-            // Values that `combine` is going to drop as empty produce no result, so
-            // they must not count against `max` - otherwise `{a,,b}` with `max: 2`
-            // would stop at `['a', '']` and yield one result instead of two. Skipping
-            // them outright keeps `values` bounded while leaving `max` a bound on
-            // *kept* results.
-            let dropsEmpties = dropEmpties && !m.post.length && !pre;
-            for (let d = 0; dropsEmpties && d < acc.length; d++) {
-                if (acc[d]) {
-                    dropsEmpties = false;
-                }
-            }
-            values = [];
-            let valuesLength = 0;
-            outer: for (let j = 0; j < n.length; j++) {
-                const expanded = expand_(n[j], max, maxLength, maxDepth, depth + 1, maxRewrites, false);
-                for (let k = 0; k < expanded.length; k++) {
-                    const v = expanded[k];
-                    if (dropsEmpties && !v)
-                        continue;
-                    if (values.length >= max ||
-                        valuesLength + v.length > maxLength) {
-                        break outer;
-                    }
-                    values.push(v);
-                    valuesLength += v.length;
-                }
-            }
-        }
-        acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);
-        if (!m.post.length)
-            break;
-        str = m.post;
-    }
-    return acc;
-}
-//# sourceMappingURL=index.js.map
Index: de_modules/brace-expansion/dist/esm/index.js.map
===================================================================
--- node_modules/brace-expansion/dist/esm/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { balanced } from 'balanced-match'\n\nconst escSlash = '\\0SLASH' + Math.random() + '\\0'\nconst escOpen = '\\0OPEN' + Math.random() + '\\0'\nconst escClose = '\\0CLOSE' + Math.random() + '\\0'\nconst escComma = '\\0COMMA' + Math.random() + '\\0'\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0'\nconst escSlashPattern = new RegExp(escSlash, 'g')\nconst escOpenPattern = new RegExp(escOpen, 'g')\nconst escClosePattern = new RegExp(escClose, 'g')\nconst escCommaPattern = new RegExp(escComma, 'g')\nconst escPeriodPattern = new RegExp(escPeriod, 'g')\nconst slashPattern = /\\\\\\\\/g\nconst openPattern = /\\\\{/g\nconst closePattern = /\\\\}/g\nconst commaPattern = /\\\\,/g\nconst periodPattern = /\\\\\\./g\n\nexport const EXPANSION_MAX = 100_000\n\n// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An\n// input like `'{a,b}'.repeat(1500)` stays under that count - its output is\n// truncated to 100k results - while making every result ~1500 characters\n// long. The result set, and the intermediate arrays built while combining\n// brace sets, then grow large enough to exhaust memory and crash the process\n// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of\n// characters the accumulator may hold at any point, so memory stays flat no\n// matter how many brace groups are chained. The limit sits well above any\n// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M\n// characters) so legitimate input is unaffected.\nexport const EXPANSION_MAX_LENGTH = 4_000_000\n\n// `expand_` recurses once per level of brace *nesting* - both when expanding a\n// set's comma members and when re-wrapping a set whose body is a single part.\n// The CVE-2026-14257 fix made the *tail* iterative (recursion on `m.post`, one\n// level per chained group), which left nesting depth unbounded: about 3,100\n// levels of `{{{...a,b...}}}` - only ~6KB of input - exhausted the native stack\n// and crashed the process. `EXPANSION_MAX_DEPTH` bounds how deep the parser\n// will follow nesting. It sits far above any realistic pattern and well below\n// the depth at which the stack runs out.\nexport const EXPANSION_MAX_DEPTH = 1_000\n\n// Bash keeps a quirk where a brace group followed by a comma set still expands\n// (`{a},b}`). The parser implements it by rewriting the string and restarting\n// the scan, absorbing one `}` per pass. `n` trailing braces therefore cost `n`\n// full passes over a string that itself grows by one `escClose` sentinel each\n// time - quadratic in `n`, with a ~26x constant from the sentinel's length.\n// 128KB of `'{a}' + '}'.repeat(n) + ',z}'` blocked the event loop for 27\n// seconds to produce two results. `EXPANSION_MAX_REWRITES` bounds how many\n// times the scan may restart. Real `{a},b}` input needs a handful.\nexport const EXPANSION_MAX_REWRITES = 1_000\n\nfunction numeric(str: string) {\n  return !isNaN(str as any) ? parseInt(str, 10) : str.charCodeAt(0)\n}\n\nfunction escapeBraces(str: string) {\n  return str\n    .replace(slashPattern, escSlash)\n    .replace(openPattern, escOpen)\n    .replace(closePattern, escClose)\n    .replace(commaPattern, escComma)\n    .replace(periodPattern, escPeriod)\n}\n\nfunction unescapeBraces(str: string) {\n  return str\n    .replace(escSlashPattern, '\\\\')\n    .replace(escOpenPattern, '{')\n    .replace(escClosePattern, '}')\n    .replace(escCommaPattern, ',')\n    .replace(escPeriodPattern, '.')\n}\n\n// Like `target.push(...items)` but doesn't overflow the stack\nfunction pushAll(target: string[], items: string[]) {\n  for (let i = 0; i < items.length; i++) {\n    target.push(items[i] as string)\n  }\n}\n\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str: string) {\n  const parts: string[] = []\n\n  // Walk the brace groups iteratively. Recursing on `post` once per group let a\n  // chain of them exhaust the stack - the parsing-side counterpart to\n  // the `expand_` overflow fixed for CVE-2026-14257, and not something `max` or\n  // `maxLength` can bound, since it happens before expansion.\n  //\n  // The part the next chunk continues\n  let carry = ''\n\n  for (;;) {\n    const m = balanced('{', '}', str)\n\n    if (!m) {\n      const tail = str.split(',')\n      tail[0] = carry + (tail[0] as string)\n      pushAll(parts, tail)\n      return parts\n    }\n\n    const { pre, body, post } = m\n    const p = pre.split(',')\n    p[0] = carry + (p[0] as string)\n    p[p.length - 1] += '{' + body + '}'\n\n    if (!post.length) {\n      pushAll(parts, p)\n      return parts\n    }\n\n    carry = p.pop() as string\n    pushAll(parts, p)\n    str = post\n  }\n}\n\nexport type BraceExpansionOptions = {\n  max?: number\n  maxLength?: number\n  maxDepth?: number\n  maxRewrites?: number\n}\n\nexport function expand(str: string, options: BraceExpansionOptions = {}) {\n  if (!str) {\n    return []\n  }\n\n  const {\n    max = EXPANSION_MAX,\n    maxLength = EXPANSION_MAX_LENGTH,\n    maxDepth = EXPANSION_MAX_DEPTH,\n    maxRewrites = EXPANSION_MAX_REWRITES,\n  } = options\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.slice(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.slice(2)\n  }\n\n  return expand_(\n    escapeBraces(str),\n    max,\n    maxLength,\n    maxDepth,\n    0,\n    maxRewrites,\n    true,\n  ).map(unescapeBraces)\n}\n\nfunction embrace(str: string) {\n  return '{' + str + '}'\n}\n\nfunction isPadded(el: string) {\n  return /^-?0\\d/.test(el)\n}\n\nfunction lte(i: number, y: number) {\n  return i <= y\n}\n\nfunction gte(i: number, y: number) {\n  return i >= y\n}\n\n// Build `{ acc[a] + pre + values[v] }` for every combination, capping the\n// number of results at `max` and the total number of characters at `maxLength`.\n// This is the one place output grows, so bounding it here keeps the single\n// accumulator - and therefore memory - flat regardless of how many brace groups\n// are combined (CVE-2026-14257).\nfunction combine(\n  acc: string[],\n  pre: string,\n  values: string[],\n  max: number,\n  maxLength: number,\n  dropEmpties: boolean,\n): string[] {\n  const out: string[] = []\n  let length = 0\n  for (let a = 0; a < acc.length; a++) {\n    for (let v = 0; v < values.length; v++) {\n      if (out.length >= max) return out\n      const expansion = (acc[a] as string) + pre + values[v]\n      // Bash drops empty results at the top level. Skip them before they count\n      // against `max`, so `max` bounds the number of *kept* results.\n      if (dropEmpties && !expansion) continue\n      if (length + expansion.length > maxLength) return out\n      out.push(expansion)\n      length += expansion.length\n    }\n  }\n  return out\n}\n\n// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)\n// sequence body.\nfunction expandSequence(\n  body: string,\n  isAlphaSequence: boolean,\n  max: number,\n  maxLength: number,\n): string[] {\n  const n = body.split(/\\.\\./)\n  const N: string[] = []\n  // A sequence body always splits into two or three parts, but the compiler\n  // can't know that.\n  /* c8 ignore start */\n  if (n[0] === undefined || n[1] === undefined) {\n    return N\n  }\n  /* c8 ignore stop */\n  const x = numeric(n[0])\n  const y = numeric(n[1])\n  const width = Math.max(n[0].length, n[1].length)\n  let incr =\n    n.length === 3 && n[2] !== undefined ?\n      Math.max(Math.abs(numeric(n[2])), 1)\n    : 1\n  let test = lte\n  const reverse = y < x\n  if (reverse) {\n    incr *= -1\n    test = gte\n  }\n  const pad = n.some(isPadded)\n\n  let length = 0\n  for (let i = x; test(i, y) && N.length < max; i += incr) {\n    let c\n    if (isAlphaSequence) {\n      c = String.fromCharCode(i)\n      if (c === '\\\\') {\n        c = ''\n      }\n    } else {\n      c = String(i)\n      if (pad) {\n        const need = width - c.length\n        if (need > 0) {\n          const z = new Array(need + 1).join('0')\n          if (i < 0) {\n            c = '-' + z + c.slice(1)\n          } else {\n            c = z + c\n          }\n        }\n      }\n    }\n    if (length + c.length > maxLength) break\n    N.push(c)\n    length += c.length\n  }\n  return N\n}\n\nfunction expand_(\n  str: string,\n  max: number,\n  maxLength: number,\n  maxDepth: number,\n  depth: number,\n  maxRewrites: number,\n  isTop: boolean,\n): string[] {\n  // Too deeply nested to keep following: treat the rest as literal, the same\n  // way a group that cannot expand is already handled. Truncating rather than\n  // throwing keeps `expand` total, matching `max` and `maxLength`.\n  if (depth > maxDepth) {\n    return [str]\n  }\n\n  // Consume the string's top-level brace groups left to right, threading a\n  // running set of combined prefixes (`acc`). Expanding the tail iteratively -\n  // rather than recursing on `m.post` once per group - keeps the native stack\n  // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no\n  // longer overflow the stack, and leaves a single accumulator whose size\n  // `maxLength` bounds directly (CVE-2026-14257).\n  let acc: string[] = ['']\n\n  // Bash drops empty results, but only when the *first* top-level group is a\n  // comma set - a sequence like `{a..\\}` may legitimately yield ''. The drop\n  // is on the final strings, so it is applied to whichever `combine` produces\n  // them (the one with no brace set left in the tail).\n  // How many times the `{a},b}` rewrite below has restarted the scan. Each pass\n  // re-reads the whole string, so leaving this unbounded is quadratic.\n  let rewrites = 0\n  let dropEmpties = false\n  let firstGroup = true\n\n  for (;;) {\n    const m = balanced('{', '}', str)\n\n    // No brace set left: the rest of the string is literal.\n    if (!m) {\n      return combine(acc, str, [''], max, maxLength, dropEmpties)\n    }\n\n    // no need to expand pre, since it is guaranteed to be free of brace-sets\n    const pre = m.pre\n\n    if (/\\$$/.test(pre)) {\n      acc = combine(\n        acc,\n        pre + '{' + m.body + '}',\n        [''],\n        max,\n        maxLength,\n        dropEmpties && !m.post.length,\n      )\n      firstGroup = false\n      if (!m.post.length) break\n      str = m.post\n      continue\n    }\n\n    const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body)\n    const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(\n      m.body,\n    )\n    const isSequence = isNumericSequence || isAlphaSequence\n    const isOptions = m.body.indexOf(',') >= 0\n    if (!isSequence && !isOptions) {\n      // {a},b}\n      if (rewrites < maxRewrites && m.post.match(/,(?!,).*\\}/)) {\n        rewrites++\n        str = m.pre + '{' + m.body + escClose + m.post\n        isTop = true\n        continue\n      }\n      // Nothing here expands, so the whole remaining string is literal.\n      return combine(\n        acc,\n        pre + '{' + m.body + '}' + m.post,\n        [''],\n        max,\n        maxLength,\n        dropEmpties,\n      )\n    }\n\n    if (firstGroup) {\n      dropEmpties = isTop && !isSequence\n      firstGroup = false\n    }\n\n    let values: string[]\n    if (isSequence) {\n      values = expandSequence(m.body, isAlphaSequence, max, maxLength)\n    } else {\n      let n = parseCommaParts(m.body)\n      if (n.length === 1 && n[0] !== undefined) {\n        // x{{a,b}}y ==> x{a}y x{b}y\n        n = expand_(\n          n[0],\n          max,\n          maxLength,\n          maxDepth,\n          depth + 1,\n          maxRewrites,\n          false,\n        ).map(embrace)\n        //XXX is this necessary? Can't seem to hit it in tests.\n        /* c8 ignore start */\n        if (n.length === 1) {\n          acc = combine(\n            acc,\n            pre + n[0],\n            [''],\n            max,\n            maxLength,\n            dropEmpties && !m.post.length,\n          )\n          if (!m.post.length) break\n          str = m.post\n          continue\n        }\n        /* c8 ignore stop */\n      }\n\n      // Values that `combine` is going to drop as empty produce no result, so\n      // they must not count against `max` - otherwise `{a,,b}` with `max: 2`\n      // would stop at `['a', '']` and yield one result instead of two. Skipping\n      // them outright keeps `values` bounded while leaving `max` a bound on\n      // *kept* results.\n      let dropsEmpties = dropEmpties && !m.post.length && !pre\n      for (let d = 0; dropsEmpties && d < acc.length; d++) {\n        if (acc[d]) {\n          dropsEmpties = false\n        }\n      }\n\n      values = []\n      let valuesLength = 0\n      outer: for (let j = 0; j < n.length; j++) {\n        const expanded = expand_(\n          n[j] as string,\n          max,\n          maxLength,\n          maxDepth,\n          depth + 1,\n          maxRewrites,\n          false,\n        )\n        for (let k = 0; k < expanded.length; k++) {\n          const v = expanded[k] as string\n          if (dropsEmpties && !v) continue\n          if (\n            values.length >= max ||\n            valuesLength + v.length > maxLength\n          ) {\n            break outer\n          }\n          values.push(v)\n          valuesLength += v.length\n        }\n      }\n    }\n\n    acc = combine(\n      acc,\n      pre,\n      values,\n      max,\n      maxLength,\n      dropEmpties && !m.post.length,\n    )\n    if (!m.post.length) break\n    str = m.post\n  }\n\n  return acc\n}\n"]}
Index: de_modules/brace-expansion/dist/esm/package.json
===================================================================
--- node_modules/brace-expansion/dist/esm/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "module"
-}
Index: de_modules/brace-expansion/package.json
===================================================================
--- node_modules/brace-expansion/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,65 +1,0 @@
-{
-  "name": "brace-expansion",
-  "description": "Brace expansion as known from sh/bash",
-  "version": "5.0.12",
-  "files": [
-    "dist"
-  ],
-  "exports": {
-    "./package.json": "./package.json",
-    ".": {
-      "import": {
-        "types": "./dist/esm/index.d.ts",
-        "default": "./dist/esm/index.js"
-      },
-      "require": {
-        "types": "./dist/commonjs/index.d.ts",
-        "default": "./dist/commonjs/index.js"
-      }
-    }
-  },
-  "type": "module",
-  "scripts": {
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "prepublishOnly": "git push origin --follow-tags",
-    "prepare": "tshy",
-    "pretest": "npm run prepare",
-    "presnap": "npm run prepare",
-    "test": "tap",
-    "snap": "tap",
-    "format": "prettier --write .",
-    "format:check": "prettier --check .",
-    "benchmark": "node benchmark/index.js",
-    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
-  },
-  "devDependencies": {
-    "@types/brace-expansion": "^1.1.2",
-    "@types/node": "^25.2.1",
-    "mkdirp": "^3.0.1",
-    "prettier": "^3.3.2",
-    "tap": "^21.6.2",
-    "tshy": "^3.0.2",
-    "typedoc": "^0.28.5"
-  },
-  "dependencies": {
-    "balanced-match": "^4.0.2"
-  },
-  "license": "MIT",
-  "engines": {
-    "node": "20 || >=22"
-  },
-  "tshy": {
-    "exports": {
-      "./package.json": "./package.json",
-      ".": "./src/index.ts"
-    }
-  },
-  "main": "./dist/commonjs/index.js",
-  "types": "./dist/commonjs/index.d.ts",
-  "module": "./dist/esm/index.js",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/juliangruber/brace-expansion.git"
-  }
-}
Index: de_modules/braces/LICENSE
===================================================================
--- node_modules/braces/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/braces/README.md
===================================================================
--- node_modules/braces/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,586 +1,0 @@
-# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces)
-
-> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save braces
-```
-
-## v3.0.0 Released!!
-
-See the [changelog](CHANGELOG.md) for details.
-
-## Why use braces?
-
-Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters.
-
-- **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests)
-- **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity.
-- **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up.
-- **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written).
-- **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)).
-- [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']`
-- [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']`
-- [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']`
-- [Supports escaping](#escaping) - To prevent evaluation of special characters.
-
-## Usage
-
-The main export is a function that takes one or more brace `patterns` and `options`.
-
-```js
-const braces = require('braces');
-// braces(patterns[, options]);
-
-console.log(braces(['{01..05}', '{a..e}']));
-//=> ['(0[1-5])', '([a-e])']
-
-console.log(braces(['{01..05}', '{a..e}'], { expand: true }));
-//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e']
-```
-
-### Brace Expansion vs. Compilation
-
-By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching.
-
-**Compiled**
-
-```js
-console.log(braces('a/{x,y,z}/b'));
-//=> ['a/(x|y|z)/b']
-console.log(braces(['a/{01..20}/b', 'a/{1..5}/b']));
-//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ]
-```
-
-**Expanded**
-
-Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)):
-
-```js
-console.log(braces('a/{x,y,z}/b', { expand: true }));
-//=> ['a/x/b', 'a/y/b', 'a/z/b']
-
-console.log(braces.expand('{01..10}'));
-//=> ['01','02','03','04','05','06','07','08','09','10']
-```
-
-### Lists
-
-Expand lists (like Bash "sets"):
-
-```js
-console.log(braces('a/{foo,bar,baz}/*.js'));
-//=> ['a/(foo|bar|baz)/*.js']
-
-console.log(braces.expand('a/{foo,bar,baz}/*.js'));
-//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js']
-```
-
-### Sequences
-
-Expand ranges of characters (like Bash "sequences"):
-
-```js
-console.log(braces.expand('{1..3}')); // ['1', '2', '3']
-console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b']
-console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c']
-console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c']
-
-// supports zero-padded ranges
-console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b']
-console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b']
-```
-
-See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options.
-
-### Steppped ranges
-
-Steps, or increments, may be used with ranges:
-
-```js
-console.log(braces.expand('{2..10..2}'));
-//=> ['2', '4', '6', '8', '10']
-
-console.log(braces('{2..10..2}'));
-//=> ['(2|4|6|8|10)']
-```
-
-When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion.
-
-### Nesting
-
-Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved.
-
-**"Expanded" braces**
-
-```js
-console.log(braces.expand('a{b,c,/{x,y}}/e'));
-//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e']
-
-console.log(braces.expand('a/{x,{1..5},y}/c'));
-//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c']
-```
-
-**"Optimized" braces**
-
-```js
-console.log(braces('a{b,c,/{x,y}}/e'));
-//=> ['a(b|c|/(x|y))/e']
-
-console.log(braces('a/{x,{1..5},y}/c'));
-//=> ['a/(x|([1-5])|y)/c']
-```
-
-### Escaping
-
-**Escaping braces**
-
-A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_:
-
-```js
-console.log(braces.expand('a\\{d,c,b}e'));
-//=> ['a{d,c,b}e']
-
-console.log(braces.expand('a{d,c,b\\}e'));
-//=> ['a{d,c,b}e']
-```
-
-**Escaping commas**
-
-Commas inside braces may also be escaped:
-
-```js
-console.log(braces.expand('a{b\\,c}d'));
-//=> ['a{b,c}d']
-
-console.log(braces.expand('a{d\\,c,b}e'));
-//=> ['ad,ce', 'abe']
-```
-
-**Single items**
-
-Following bash conventions, a brace pattern is also not expanded when it contains a single character:
-
-```js
-console.log(braces.expand('a{b}c'));
-//=> ['a{b}c']
-```
-
-## Options
-
-### options.maxLength
-
-**Type**: `Number`
-
-**Default**: `10,000`
-
-**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera.
-
-```js
-console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error
-```
-
-### options.expand
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing).
-
-```js
-console.log(braces('a/{b,c}/d', { expand: true }));
-//=> [ 'a/b/d', 'a/c/d' ]
-```
-
-### options.nodupes
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Remove duplicates from the returned array.
-
-### options.rangeLimit
-
-**Type**: `Number`
-
-**Default**: `1000`
-
-**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`.
-
-You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether.
-
-**Examples**
-
-```js
-// pattern exceeds the "rangeLimit", so it's optimized automatically
-console.log(braces.expand('{1..1000}'));
-//=> ['([1-9]|[1-9][0-9]{1,2}|1000)']
-
-// pattern does not exceed "rangeLimit", so it's NOT optimized
-console.log(braces.expand('{1..100}'));
-//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100']
-```
-
-### options.transform
-
-**Type**: `Function`
-
-**Default**: `undefined`
-
-**Description**: Customize range expansion.
-
-**Example: Transforming non-numeric values**
-
-```js
-const alpha = braces.expand('x/{a..e}/y', {
-  transform(value, index) {
-    // When non-numeric values are passed, "value" is a character code.
-    return 'foo/' + String.fromCharCode(value) + '-' + index;
-  },
-});
-console.log(alpha);
-//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ]
-```
-
-**Example: Transforming numeric values**
-
-```js
-const numeric = braces.expand('{1..5}', {
-  transform(value) {
-    // when numeric values are passed, "value" is a number
-    return 'foo/' + value * 2;
-  },
-});
-console.log(numeric);
-//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ]
-```
-
-### options.quantifiers
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times.
-
-Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists)
-
-The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists.
-
-**Examples**
-
-```js
-const braces = require('braces');
-console.log(braces('a/b{1,3}/{x,y,z}'));
-//=> [ 'a/b(1|3)/(x|y|z)' ]
-console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true }));
-//=> [ 'a/b{1,3}/(x|y|z)' ]
-console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true, expand: true }));
-//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ]
-```
-
-### options.keepEscaping
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Do not strip backslashes that were used for escaping from the result.
-
-## What is "brace expansion"?
-
-Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs).
-
-In addition to "expansion", braces are also used for matching. In other words:
-
-- [brace expansion](#brace-expansion) is for generating new lists
-- [brace matching](#brace-matching) is for filtering existing lists
-
-<details>
-<summary><strong>More about brace expansion</strong> (click to expand)</summary>
-
-There are two main types of brace expansion:
-
-1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}`
-2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges".
-
-Here are some example brace patterns to illustrate how they work:
-
-**Sets**
-
-```
-{a,b,c}       => a b c
-{a,b,c}{1,2}  => a1 a2 b1 b2 c1 c2
-```
-
-**Sequences**
-
-```
-{1..9}        => 1 2 3 4 5 6 7 8 9
-{4..-4}       => 4 3 2 1 0 -1 -2 -3 -4
-{1..20..3}    => 1 4 7 10 13 16 19
-{a..j}        => a b c d e f g h i j
-{j..a}        => j i h g f e d c b a
-{a..z..3}     => a d g j m p s v y
-```
-
-**Combination**
-
-Sets and sequences can be mixed together or used along with any other strings.
-
-```
-{a,b,c}{1..3}   => a1 a2 a3 b1 b2 b3 c1 c2 c3
-foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar
-```
-
-The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases.
-
-## Brace matching
-
-In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching.
-
-For example, the pattern `foo/{1..3}/bar` would match any of following strings:
-
-```
-foo/1/bar
-foo/2/bar
-foo/3/bar
-```
-
-But not:
-
-```
-baz/1/qux
-baz/2/qux
-baz/3/qux
-```
-
-Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings:
-
-```
-foo/1/bar
-foo/2/bar
-foo/3/bar
-baz/1/qux
-baz/2/qux
-baz/3/qux
-```
-
-## Brace matching pitfalls
-
-Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of.
-
-### tldr
-
-**"brace bombs"**
-
-- brace expansion can eat up a huge amount of processing resources
-- as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially
-- users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!)
-
-For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section.
-
-### The solution
-
-Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries.
-
-### Geometric complexity
-
-At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`.
-
-For example, the following sets demonstrate quadratic (`O(n^2)`) complexity:
-
-```
-{1,2}{3,4}      => (2X2)    => 13 14 23 24
-{1,2}{3,4}{5,6} => (2X2X2)  => 135 136 145 146 235 236 245 246
-```
-
-But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity:
-
-```
-{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248
-                                    249 257 258 259 267 268 269 347 348 349 357
-                                    358 359 367 368 369
-```
-
-Now, imagine how this complexity grows given that each element is a n-tuple:
-
-```
-{1..100}{1..100}         => (100X100)     => 10,000 elements (38.4 kB)
-{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB)
-```
-
-Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control.
-
-**More information**
-
-Interested in learning more about brace expansion?
-
-- [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion)
-- [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion)
-- [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product)
-
-</details>
-
-## Performance
-
-Braces is not only screaming fast, it's also more accurate the other brace expansion libraries.
-
-### Better algorithms
-
-Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_.
-
-Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently.
-
-**The proof is in the numbers**
-
-Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively.
-
-| **Pattern**                 | **braces**          | **[minimatch][]**            |
-| --------------------------- | ------------------- | ---------------------------- |
-| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs) | N/A (freezes)                |
-| `{1..1000000000000000}`     | `41 B` (1ms 15μs)   | N/A (freezes)                |
-| `{1..100000000000000}`      | `40 B` (890μs)      | N/A (freezes)                |
-| `{1..10000000000000}`       | `39 B` (2ms 49μs)   | N/A (freezes)                |
-| `{1..1000000000000}`        | `38 B` (608μs)      | N/A (freezes)                |
-| `{1..100000000000}`         | `37 B` (397μs)      | N/A (freezes)                |
-| `{1..10000000000}`          | `35 B` (983μs)      | N/A (freezes)                |
-| `{1..1000000000}`           | `34 B` (798μs)      | N/A (freezes)                |
-| `{1..100000000}`            | `33 B` (733μs)      | N/A (freezes)                |
-| `{1..10000000}`             | `32 B` (5ms 632μs)  | `78.89 MB` (16s 388ms 569μs) |
-| `{1..1000000}`              | `31 B` (1ms 381μs)  | `6.89 MB` (1s 496ms 887μs)   |
-| `{1..100000}`               | `30 B` (950μs)      | `588.89 kB` (146ms 921μs)    |
-| `{1..10000}`                | `29 B` (1ms 114μs)  | `48.89 kB` (14ms 187μs)      |
-| `{1..1000}`                 | `28 B` (760μs)      | `3.89 kB` (1ms 453μs)        |
-| `{1..100}`                  | `22 B` (345μs)      | `291 B` (196μs)              |
-| `{1..10}`                   | `10 B` (533μs)      | `20 B` (37μs)                |
-| `{1..3}`                    | `7 B` (190μs)       | `5 B` (27μs)                 |
-
-### Faster algorithms
-
-When you need expansion, braces is still much faster.
-
-_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_
-
-| **Pattern**     | **braces**                  | **[minimatch][]**            |
-| --------------- | --------------------------- | ---------------------------- |
-| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) |
-| `{1..1000000}`  | `6.89 MB` (458ms 576μs)     | `6.89 MB` (1s 491ms 621μs)   |
-| `{1..100000}`   | `588.89 kB` (20ms 728μs)    | `588.89 kB` (156ms 919μs)    |
-| `{1..10000}`    | `48.89 kB` (2ms 202μs)      | `48.89 kB` (13ms 641μs)      |
-| `{1..1000}`     | `3.89 kB` (1ms 796μs)       | `3.89 kB` (1ms 958μs)        |
-| `{1..100}`      | `291 B` (424μs)             | `291 B` (211μs)              |
-| `{1..10}`       | `20 B` (487μs)              | `20 B` (72μs)                |
-| `{1..3}`        | `5 B` (166μs)               | `5 B` (27μs)                 |
-
-If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js).
-
-## Benchmarks
-
-### Running benchmarks
-
-Install dev dependencies:
-
-```bash
-npm i -d && npm benchmark
-```
-
-### Latest results
-
-Braces is more accurate, without sacrificing performance.
-
-```bash
-● expand - range (expanded)
-     braces x 53,167 ops/sec ±0.12% (102 runs sampled)
-  minimatch x 11,378 ops/sec ±0.10% (102 runs sampled)
-● expand - range (optimized for regex)
-     braces x 373,442 ops/sec ±0.04% (100 runs sampled)
-  minimatch x 3,262 ops/sec ±0.18% (100 runs sampled)
-● expand - nested ranges (expanded)
-     braces x 33,921 ops/sec ±0.09% (99 runs sampled)
-  minimatch x 10,855 ops/sec ±0.28% (100 runs sampled)
-● expand - nested ranges (optimized for regex)
-     braces x 287,479 ops/sec ±0.52% (98 runs sampled)
-  minimatch x 3,219 ops/sec ±0.28% (101 runs sampled)
-● expand - set (expanded)
-     braces x 238,243 ops/sec ±0.19% (97 runs sampled)
-  minimatch x 538,268 ops/sec ±0.31% (96 runs sampled)
-● expand - set (optimized for regex)
-     braces x 321,844 ops/sec ±0.10% (97 runs sampled)
-  minimatch x 140,600 ops/sec ±0.15% (100 runs sampled)
-● expand - nested sets (expanded)
-     braces x 165,371 ops/sec ±0.42% (96 runs sampled)
-  minimatch x 337,720 ops/sec ±0.28% (100 runs sampled)
-● expand - nested sets (optimized for regex)
-     braces x 242,948 ops/sec ±0.12% (99 runs sampled)
-  minimatch x 87,403 ops/sec ±0.79% (96 runs sampled)
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Contributors
-
-| **Commits** | **Contributor**                                               |
-| ----------- | ------------------------------------------------------------- |
-| 197         | [jonschlinkert](https://github.com/jonschlinkert)             |
-| 4           | [doowb](https://github.com/doowb)                             |
-| 1           | [es128](https://github.com/es128)                             |
-| 1           | [eush77](https://github.com/eush77)                           |
-| 1           | [hemanth](https://github.com/hemanth)                         |
-| 1           | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
-
-### Author
-
-**Jon Schlinkert**
-
-- [GitHub Profile](https://github.com/jonschlinkert)
-- [Twitter Profile](https://twitter.com/jonschlinkert)
-- [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
----
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._
Index: de_modules/braces/index.js
===================================================================
--- node_modules/braces/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,170 +1,0 @@
-'use strict';
-
-const stringify = require('./lib/stringify');
-const compile = require('./lib/compile');
-const expand = require('./lib/expand');
-const parse = require('./lib/parse');
-
-/**
- * Expand the given pattern or create a regex-compatible string.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']
- * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']
- * ```
- * @param {String} `str`
- * @param {Object} `options`
- * @return {String}
- * @api public
- */
-
-const braces = (input, options = {}) => {
-  let output = [];
-
-  if (Array.isArray(input)) {
-    for (const pattern of input) {
-      const result = braces.create(pattern, options);
-      if (Array.isArray(result)) {
-        output.push(...result);
-      } else {
-        output.push(result);
-      }
-    }
-  } else {
-    output = [].concat(braces.create(input, options));
-  }
-
-  if (options && options.expand === true && options.nodupes === true) {
-    output = [...new Set(output)];
-  }
-  return output;
-};
-
-/**
- * Parse the given `str` with the given `options`.
- *
- * ```js
- * // braces.parse(pattern, [, options]);
- * const ast = braces.parse('a/{b,c}/d');
- * console.log(ast);
- * ```
- * @param {String} pattern Brace pattern to parse
- * @param {Object} options
- * @return {Object} Returns an AST
- * @api public
- */
-
-braces.parse = (input, options = {}) => parse(input, options);
-
-/**
- * Creates a braces string from an AST, or an AST node.
- *
- * ```js
- * const braces = require('braces');
- * let ast = braces.parse('foo/{a,b}/bar');
- * console.log(stringify(ast.nodes[2])); //=> '{a,b}'
- * ```
- * @param {String} `input` Brace pattern or AST.
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.stringify = (input, options = {}) => {
-  if (typeof input === 'string') {
-    return stringify(braces.parse(input, options), options);
-  }
-  return stringify(input, options);
-};
-
-/**
- * Compiles a brace pattern into a regex-compatible, optimized string.
- * This method is called by the main [braces](#braces) function by default.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.compile('a/{b,c}/d'));
- * //=> ['a/(b|c)/d']
- * ```
- * @param {String} `input` Brace pattern or AST.
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.compile = (input, options = {}) => {
-  if (typeof input === 'string') {
-    input = braces.parse(input, options);
-  }
-  return compile(input, options);
-};
-
-/**
- * Expands a brace pattern into an array. This method is called by the
- * main [braces](#braces) function when `options.expand` is true. Before
- * using this method it's recommended that you read the [performance notes](#performance))
- * and advantages of using [.compile](#compile) instead.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.expand('a/{b,c}/d'));
- * //=> ['a/b/d', 'a/c/d'];
- * ```
- * @param {String} `pattern` Brace pattern
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.expand = (input, options = {}) => {
-  if (typeof input === 'string') {
-    input = braces.parse(input, options);
-  }
-
-  let result = expand(input, options);
-
-  // filter out empty strings if specified
-  if (options.noempty === true) {
-    result = result.filter(Boolean);
-  }
-
-  // filter out duplicates if specified
-  if (options.nodupes === true) {
-    result = [...new Set(result)];
-  }
-
-  return result;
-};
-
-/**
- * Processes a brace pattern and returns either an expanded array
- * (if `options.expand` is true), a highly optimized regex-compatible string.
- * This method is called by the main [braces](#braces) function.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))
- * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'
- * ```
- * @param {String} `pattern` Brace pattern
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.create = (input, options = {}) => {
-  if (input === '' || input.length < 3) {
-    return [input];
-  }
-
-  return options.expand !== true
-    ? braces.compile(input, options)
-    : braces.expand(input, options);
-};
-
-/**
- * Expose "braces"
- */
-
-module.exports = braces;
Index: de_modules/braces/lib/compile.js
===================================================================
--- node_modules/braces/lib/compile.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,60 +1,0 @@
-'use strict';
-
-const fill = require('fill-range');
-const utils = require('./utils');
-
-const compile = (ast, options = {}) => {
-  const walk = (node, parent = {}) => {
-    const invalidBlock = utils.isInvalidBrace(parent);
-    const invalidNode = node.invalid === true && options.escapeInvalid === true;
-    const invalid = invalidBlock === true || invalidNode === true;
-    const prefix = options.escapeInvalid === true ? '\\' : '';
-    let output = '';
-
-    if (node.isOpen === true) {
-      return prefix + node.value;
-    }
-
-    if (node.isClose === true) {
-      console.log('node.isClose', prefix, node.value);
-      return prefix + node.value;
-    }
-
-    if (node.type === 'open') {
-      return invalid ? prefix + node.value : '(';
-    }
-
-    if (node.type === 'close') {
-      return invalid ? prefix + node.value : ')';
-    }
-
-    if (node.type === 'comma') {
-      return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';
-    }
-
-    if (node.value) {
-      return node.value;
-    }
-
-    if (node.nodes && node.ranges > 0) {
-      const args = utils.reduce(node.nodes);
-      const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });
-
-      if (range.length !== 0) {
-        return args.length > 1 && range.length > 1 ? `(${range})` : range;
-      }
-    }
-
-    if (node.nodes) {
-      for (const child of node.nodes) {
-        output += walk(child, node);
-      }
-    }
-
-    return output;
-  };
-
-  return walk(ast);
-};
-
-module.exports = compile;
Index: de_modules/braces/lib/constants.js
===================================================================
--- node_modules/braces/lib/constants.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,57 +1,0 @@
-'use strict';
-
-module.exports = {
-  MAX_LENGTH: 10000,
-
-  // Digits
-  CHAR_0: '0', /* 0 */
-  CHAR_9: '9', /* 9 */
-
-  // Alphabet chars.
-  CHAR_UPPERCASE_A: 'A', /* A */
-  CHAR_LOWERCASE_A: 'a', /* a */
-  CHAR_UPPERCASE_Z: 'Z', /* Z */
-  CHAR_LOWERCASE_Z: 'z', /* z */
-
-  CHAR_LEFT_PARENTHESES: '(', /* ( */
-  CHAR_RIGHT_PARENTHESES: ')', /* ) */
-
-  CHAR_ASTERISK: '*', /* * */
-
-  // Non-alphabetic chars.
-  CHAR_AMPERSAND: '&', /* & */
-  CHAR_AT: '@', /* @ */
-  CHAR_BACKSLASH: '\\', /* \ */
-  CHAR_BACKTICK: '`', /* ` */
-  CHAR_CARRIAGE_RETURN: '\r', /* \r */
-  CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */
-  CHAR_COLON: ':', /* : */
-  CHAR_COMMA: ',', /* , */
-  CHAR_DOLLAR: '$', /* . */
-  CHAR_DOT: '.', /* . */
-  CHAR_DOUBLE_QUOTE: '"', /* " */
-  CHAR_EQUAL: '=', /* = */
-  CHAR_EXCLAMATION_MARK: '!', /* ! */
-  CHAR_FORM_FEED: '\f', /* \f */
-  CHAR_FORWARD_SLASH: '/', /* / */
-  CHAR_HASH: '#', /* # */
-  CHAR_HYPHEN_MINUS: '-', /* - */
-  CHAR_LEFT_ANGLE_BRACKET: '<', /* < */
-  CHAR_LEFT_CURLY_BRACE: '{', /* { */
-  CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */
-  CHAR_LINE_FEED: '\n', /* \n */
-  CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */
-  CHAR_PERCENT: '%', /* % */
-  CHAR_PLUS: '+', /* + */
-  CHAR_QUESTION_MARK: '?', /* ? */
-  CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */
-  CHAR_RIGHT_CURLY_BRACE: '}', /* } */
-  CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */
-  CHAR_SEMICOLON: ';', /* ; */
-  CHAR_SINGLE_QUOTE: '\'', /* ' */
-  CHAR_SPACE: ' ', /*   */
-  CHAR_TAB: '\t', /* \t */
-  CHAR_UNDERSCORE: '_', /* _ */
-  CHAR_VERTICAL_LINE: '|', /* | */
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */
-};
Index: de_modules/braces/lib/expand.js
===================================================================
--- node_modules/braces/lib/expand.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,113 +1,0 @@
-'use strict';
-
-const fill = require('fill-range');
-const stringify = require('./stringify');
-const utils = require('./utils');
-
-const append = (queue = '', stash = '', enclose = false) => {
-  const result = [];
-
-  queue = [].concat(queue);
-  stash = [].concat(stash);
-
-  if (!stash.length) return queue;
-  if (!queue.length) {
-    return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;
-  }
-
-  for (const item of queue) {
-    if (Array.isArray(item)) {
-      for (const value of item) {
-        result.push(append(value, stash, enclose));
-      }
-    } else {
-      for (let ele of stash) {
-        if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;
-        result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);
-      }
-    }
-  }
-  return utils.flatten(result);
-};
-
-const expand = (ast, options = {}) => {
-  const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;
-
-  const walk = (node, parent = {}) => {
-    node.queue = [];
-
-    let p = parent;
-    let q = parent.queue;
-
-    while (p.type !== 'brace' && p.type !== 'root' && p.parent) {
-      p = p.parent;
-      q = p.queue;
-    }
-
-    if (node.invalid || node.dollar) {
-      q.push(append(q.pop(), stringify(node, options)));
-      return;
-    }
-
-    if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {
-      q.push(append(q.pop(), ['{}']));
-      return;
-    }
-
-    if (node.nodes && node.ranges > 0) {
-      const args = utils.reduce(node.nodes);
-
-      if (utils.exceedsLimit(...args, options.step, rangeLimit)) {
-        throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
-      }
-
-      let range = fill(...args, options);
-      if (range.length === 0) {
-        range = stringify(node, options);
-      }
-
-      q.push(append(q.pop(), range));
-      node.nodes = [];
-      return;
-    }
-
-    const enclose = utils.encloseBrace(node);
-    let queue = node.queue;
-    let block = node;
-
-    while (block.type !== 'brace' && block.type !== 'root' && block.parent) {
-      block = block.parent;
-      queue = block.queue;
-    }
-
-    for (let i = 0; i < node.nodes.length; i++) {
-      const child = node.nodes[i];
-
-      if (child.type === 'comma' && node.type === 'brace') {
-        if (i === 1) queue.push('');
-        queue.push('');
-        continue;
-      }
-
-      if (child.type === 'close') {
-        q.push(append(q.pop(), queue, enclose));
-        continue;
-      }
-
-      if (child.value && child.type !== 'open') {
-        queue.push(append(queue.pop(), child.value));
-        continue;
-      }
-
-      if (child.nodes) {
-        walk(child, node);
-      }
-    }
-
-    return queue;
-  };
-
-  return utils.flatten(walk(ast));
-};
-
-module.exports = expand;
Index: de_modules/braces/lib/parse.js
===================================================================
--- node_modules/braces/lib/parse.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,331 +1,0 @@
-'use strict';
-
-const stringify = require('./stringify');
-
-/**
- * Constants
- */
-
-const {
-  MAX_LENGTH,
-  CHAR_BACKSLASH, /* \ */
-  CHAR_BACKTICK, /* ` */
-  CHAR_COMMA, /* , */
-  CHAR_DOT, /* . */
-  CHAR_LEFT_PARENTHESES, /* ( */
-  CHAR_RIGHT_PARENTHESES, /* ) */
-  CHAR_LEFT_CURLY_BRACE, /* { */
-  CHAR_RIGHT_CURLY_BRACE, /* } */
-  CHAR_LEFT_SQUARE_BRACKET, /* [ */
-  CHAR_RIGHT_SQUARE_BRACKET, /* ] */
-  CHAR_DOUBLE_QUOTE, /* " */
-  CHAR_SINGLE_QUOTE, /* ' */
-  CHAR_NO_BREAK_SPACE,
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE
-} = require('./constants');
-
-/**
- * parse
- */
-
-const parse = (input, options = {}) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected a string');
-  }
-
-  const opts = options || {};
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-  if (input.length > max) {
-    throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);
-  }
-
-  const ast = { type: 'root', input, nodes: [] };
-  const stack = [ast];
-  let block = ast;
-  let prev = ast;
-  let brackets = 0;
-  const length = input.length;
-  let index = 0;
-  let depth = 0;
-  let value;
-
-  /**
-   * Helpers
-   */
-
-  const advance = () => input[index++];
-  const push = node => {
-    if (node.type === 'text' && prev.type === 'dot') {
-      prev.type = 'text';
-    }
-
-    if (prev && prev.type === 'text' && node.type === 'text') {
-      prev.value += node.value;
-      return;
-    }
-
-    block.nodes.push(node);
-    node.parent = block;
-    node.prev = prev;
-    prev = node;
-    return node;
-  };
-
-  push({ type: 'bos' });
-
-  while (index < length) {
-    block = stack[stack.length - 1];
-    value = advance();
-
-    /**
-     * Invalid chars
-     */
-
-    if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {
-      continue;
-    }
-
-    /**
-     * Escaped chars
-     */
-
-    if (value === CHAR_BACKSLASH) {
-      push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });
-      continue;
-    }
-
-    /**
-     * Right square bracket (literal): ']'
-     */
-
-    if (value === CHAR_RIGHT_SQUARE_BRACKET) {
-      push({ type: 'text', value: '\\' + value });
-      continue;
-    }
-
-    /**
-     * Left square bracket: '['
-     */
-
-    if (value === CHAR_LEFT_SQUARE_BRACKET) {
-      brackets++;
-
-      let next;
-
-      while (index < length && (next = advance())) {
-        value += next;
-
-        if (next === CHAR_LEFT_SQUARE_BRACKET) {
-          brackets++;
-          continue;
-        }
-
-        if (next === CHAR_BACKSLASH) {
-          value += advance();
-          continue;
-        }
-
-        if (next === CHAR_RIGHT_SQUARE_BRACKET) {
-          brackets--;
-
-          if (brackets === 0) {
-            break;
-          }
-        }
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Parentheses
-     */
-
-    if (value === CHAR_LEFT_PARENTHESES) {
-      block = push({ type: 'paren', nodes: [] });
-      stack.push(block);
-      push({ type: 'text', value });
-      continue;
-    }
-
-    if (value === CHAR_RIGHT_PARENTHESES) {
-      if (block.type !== 'paren') {
-        push({ type: 'text', value });
-        continue;
-      }
-      block = stack.pop();
-      push({ type: 'text', value });
-      block = stack[stack.length - 1];
-      continue;
-    }
-
-    /**
-     * Quotes: '|"|`
-     */
-
-    if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {
-      const open = value;
-      let next;
-
-      if (options.keepQuotes !== true) {
-        value = '';
-      }
-
-      while (index < length && (next = advance())) {
-        if (next === CHAR_BACKSLASH) {
-          value += next + advance();
-          continue;
-        }
-
-        if (next === open) {
-          if (options.keepQuotes === true) value += next;
-          break;
-        }
-
-        value += next;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Left curly brace: '{'
-     */
-
-    if (value === CHAR_LEFT_CURLY_BRACE) {
-      depth++;
-
-      const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;
-      const brace = {
-        type: 'brace',
-        open: true,
-        close: false,
-        dollar,
-        depth,
-        commas: 0,
-        ranges: 0,
-        nodes: []
-      };
-
-      block = push(brace);
-      stack.push(block);
-      push({ type: 'open', value });
-      continue;
-    }
-
-    /**
-     * Right curly brace: '}'
-     */
-
-    if (value === CHAR_RIGHT_CURLY_BRACE) {
-      if (block.type !== 'brace') {
-        push({ type: 'text', value });
-        continue;
-      }
-
-      const type = 'close';
-      block = stack.pop();
-      block.close = true;
-
-      push({ type, value });
-      depth--;
-
-      block = stack[stack.length - 1];
-      continue;
-    }
-
-    /**
-     * Comma: ','
-     */
-
-    if (value === CHAR_COMMA && depth > 0) {
-      if (block.ranges > 0) {
-        block.ranges = 0;
-        const open = block.nodes.shift();
-        block.nodes = [open, { type: 'text', value: stringify(block) }];
-      }
-
-      push({ type: 'comma', value });
-      block.commas++;
-      continue;
-    }
-
-    /**
-     * Dot: '.'
-     */
-
-    if (value === CHAR_DOT && depth > 0 && block.commas === 0) {
-      const siblings = block.nodes;
-
-      if (depth === 0 || siblings.length === 0) {
-        push({ type: 'text', value });
-        continue;
-      }
-
-      if (prev.type === 'dot') {
-        block.range = [];
-        prev.value += value;
-        prev.type = 'range';
-
-        if (block.nodes.length !== 3 && block.nodes.length !== 5) {
-          block.invalid = true;
-          block.ranges = 0;
-          prev.type = 'text';
-          continue;
-        }
-
-        block.ranges++;
-        block.args = [];
-        continue;
-      }
-
-      if (prev.type === 'range') {
-        siblings.pop();
-
-        const before = siblings[siblings.length - 1];
-        before.value += prev.value + value;
-        prev = before;
-        block.ranges--;
-        continue;
-      }
-
-      push({ type: 'dot', value });
-      continue;
-    }
-
-    /**
-     * Text
-     */
-
-    push({ type: 'text', value });
-  }
-
-  // Mark imbalanced braces and brackets as invalid
-  do {
-    block = stack.pop();
-
-    if (block.type !== 'root') {
-      block.nodes.forEach(node => {
-        if (!node.nodes) {
-          if (node.type === 'open') node.isOpen = true;
-          if (node.type === 'close') node.isClose = true;
-          if (!node.nodes) node.type = 'text';
-          node.invalid = true;
-        }
-      });
-
-      // get the location of the block on parent.nodes (block's siblings)
-      const parent = stack[stack.length - 1];
-      const index = parent.nodes.indexOf(block);
-      // replace the (invalid) block with it's nodes
-      parent.nodes.splice(index, 1, ...block.nodes);
-    }
-  } while (stack.length > 0);
-
-  push({ type: 'eos' });
-  return ast;
-};
-
-module.exports = parse;
Index: de_modules/braces/lib/stringify.js
===================================================================
--- node_modules/braces/lib/stringify.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,32 +1,0 @@
-'use strict';
-
-const utils = require('./utils');
-
-module.exports = (ast, options = {}) => {
-  const stringify = (node, parent = {}) => {
-    const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);
-    const invalidNode = node.invalid === true && options.escapeInvalid === true;
-    let output = '';
-
-    if (node.value) {
-      if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {
-        return '\\' + node.value;
-      }
-      return node.value;
-    }
-
-    if (node.value) {
-      return node.value;
-    }
-
-    if (node.nodes) {
-      for (const child of node.nodes) {
-        output += stringify(child);
-      }
-    }
-    return output;
-  };
-
-  return stringify(ast);
-};
-
Index: de_modules/braces/lib/utils.js
===================================================================
--- node_modules/braces/lib/utils.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,122 +1,0 @@
-'use strict';
-
-exports.isInteger = num => {
-  if (typeof num === 'number') {
-    return Number.isInteger(num);
-  }
-  if (typeof num === 'string' && num.trim() !== '') {
-    return Number.isInteger(Number(num));
-  }
-  return false;
-};
-
-/**
- * Find a node of the given type
- */
-
-exports.find = (node, type) => node.nodes.find(node => node.type === type);
-
-/**
- * Find a node of the given type
- */
-
-exports.exceedsLimit = (min, max, step = 1, limit) => {
-  if (limit === false) return false;
-  if (!exports.isInteger(min) || !exports.isInteger(max)) return false;
-  return ((Number(max) - Number(min)) / Number(step)) >= limit;
-};
-
-/**
- * Escape the given node with '\\' before node.value
- */
-
-exports.escapeNode = (block, n = 0, type) => {
-  const node = block.nodes[n];
-  if (!node) return;
-
-  if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {
-    if (node.escaped !== true) {
-      node.value = '\\' + node.value;
-      node.escaped = true;
-    }
-  }
-};
-
-/**
- * Returns true if the given brace node should be enclosed in literal braces
- */
-
-exports.encloseBrace = node => {
-  if (node.type !== 'brace') return false;
-  if ((node.commas >> 0 + node.ranges >> 0) === 0) {
-    node.invalid = true;
-    return true;
-  }
-  return false;
-};
-
-/**
- * Returns true if a brace node is invalid.
- */
-
-exports.isInvalidBrace = block => {
-  if (block.type !== 'brace') return false;
-  if (block.invalid === true || block.dollar) return true;
-  if ((block.commas >> 0 + block.ranges >> 0) === 0) {
-    block.invalid = true;
-    return true;
-  }
-  if (block.open !== true || block.close !== true) {
-    block.invalid = true;
-    return true;
-  }
-  return false;
-};
-
-/**
- * Returns true if a node is an open or close node
- */
-
-exports.isOpenOrClose = node => {
-  if (node.type === 'open' || node.type === 'close') {
-    return true;
-  }
-  return node.open === true || node.close === true;
-};
-
-/**
- * Reduce an array of text nodes.
- */
-
-exports.reduce = nodes => nodes.reduce((acc, node) => {
-  if (node.type === 'text') acc.push(node.value);
-  if (node.type === 'range') node.type = 'text';
-  return acc;
-}, []);
-
-/**
- * Flatten an array
- */
-
-exports.flatten = (...args) => {
-  const result = [];
-
-  const flat = arr => {
-    for (let i = 0; i < arr.length; i++) {
-      const ele = arr[i];
-
-      if (Array.isArray(ele)) {
-        flat(ele);
-        continue;
-      }
-
-      if (ele !== undefined) {
-        result.push(ele);
-      }
-    }
-    return result;
-  };
-
-  flat(args);
-  return result;
-};
Index: de_modules/braces/package.json
===================================================================
--- node_modules/braces/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,77 +1,0 @@
-{
-  "name": "braces",
-  "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.",
-  "version": "3.0.3",
-  "homepage": "https://github.com/micromatch/braces",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Brian Woodward (https://twitter.com/doowb)",
-    "Elan Shanker (https://github.com/es128)",
-    "Eugene Sharygin (https://github.com/eush77)",
-    "hemanth.hm (http://h3manth.com)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "micromatch/braces",
-  "bugs": {
-    "url": "https://github.com/micromatch/braces/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js",
-    "lib"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8"
-  },
-  "scripts": {
-    "test": "mocha",
-    "benchmark": "node benchmark"
-  },
-  "dependencies": {
-    "fill-range": "^7.1.1"
-  },
-  "devDependencies": {
-    "ansi-colors": "^3.2.4",
-    "bash-path": "^2.0.1",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.1.1"
-  },
-  "keywords": [
-    "alpha",
-    "alphabetical",
-    "bash",
-    "brace",
-    "braces",
-    "expand",
-    "expansion",
-    "filepath",
-    "fill",
-    "fs",
-    "glob",
-    "globbing",
-    "letter",
-    "match",
-    "matches",
-    "matching",
-    "number",
-    "numerical",
-    "path",
-    "range",
-    "ranges",
-    "sh"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "plugins": [
-      "gulp-format-md"
-    ]
-  }
-}
Index: de_modules/chokidar/LICENSE
===================================================================
--- node_modules/chokidar/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the “Software”), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/chokidar/README.md
===================================================================
--- node_modules/chokidar/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,308 +1,0 @@
-# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar)
-
-> Minimal and efficient cross-platform file watching library
-
-[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar)
-
-## Why?
-
-Node.js `fs.watch`:
-
-* Doesn't report filenames on MacOS.
-* Doesn't report events at all when using editors like Sublime on MacOS.
-* Often reports events twice.
-* Emits most changes as `rename`.
-* Does not provide an easy way to recursively watch file trees.
-* Does not support recursive watching on Linux.
-
-Node.js `fs.watchFile`:
-
-* Almost as bad at event handling.
-* Also does not provide any recursive watching.
-* Results in high CPU utilization.
-
-Chokidar resolves these problems.
-
-Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in
-[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode),
-[gulp](https://github.com/gulpjs/gulp/),
-[karma](https://karma-runner.github.io/),
-[PM2](https://github.com/Unitech/PM2),
-[browserify](http://browserify.org/),
-[webpack](https://webpack.github.io/),
-[BrowserSync](https://www.browsersync.io/),
-and [many others](https://www.npmjs.com/browse/depended/chokidar).
-It has proven itself in production environments.
-
-Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/)
-
-## How?
-
-Chokidar does still rely on the Node.js core `fs` module, but when using
-`fs.watch` and `fs.watchFile` for watching, it normalizes the events it
-receives, often checking for truth by getting file stats and/or dir contents.
-
-On MacOS, chokidar by default uses a native extension exposing the Darwin
-`FSEvents` API. This provides very efficient recursive watching compared with
-implementations like `kqueue` available on most \*nix platforms. Chokidar still
-does have to do some work to normalize the events received that way as well.
-
-On most other platforms, the `fs.watch`-based implementation is the default, which
-avoids polling and keeps CPU usage down. Be advised that chokidar will initiate
-watchers recursively for everything within scope of the paths that have been
-specified, so be judicious about not wasting system resources by watching much
-more than needed.
-
-## Getting started
-
-Install with npm:
-
-```sh
-npm install chokidar
-```
-
-Then `require` and use it in your code:
-
-```javascript
-const chokidar = require('chokidar');
-
-// One-liner for current directory
-chokidar.watch('.').on('all', (event, path) => {
-  console.log(event, path);
-});
-```
-
-## API
-
-```javascript
-// Example of a more typical implementation structure
-
-// Initialize watcher.
-const watcher = chokidar.watch('file, dir, glob, or array', {
-  ignored: /(^|[\/\\])\../, // ignore dotfiles
-  persistent: true
-});
-
-// Something to use when events are received.
-const log = console.log.bind(console);
-// Add event listeners.
-watcher
-  .on('add', path => log(`File ${path} has been added`))
-  .on('change', path => log(`File ${path} has been changed`))
-  .on('unlink', path => log(`File ${path} has been removed`));
-
-// More possible events.
-watcher
-  .on('addDir', path => log(`Directory ${path} has been added`))
-  .on('unlinkDir', path => log(`Directory ${path} has been removed`))
-  .on('error', error => log(`Watcher error: ${error}`))
-  .on('ready', () => log('Initial scan complete. Ready for changes'))
-  .on('raw', (event, path, details) => { // internal
-    log('Raw event info:', event, path, details);
-  });
-
-// 'add', 'addDir' and 'change' events also receive stat() results as second
-// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats
-watcher.on('change', (path, stats) => {
-  if (stats) console.log(`File ${path} changed size to ${stats.size}`);
-});
-
-// Watch new files.
-watcher.add('new-file');
-watcher.add(['new-file-2', 'new-file-3', '**/other-file*']);
-
-// Get list of actual paths being watched on the filesystem
-var watchedPaths = watcher.getWatched();
-
-// Un-watch some files.
-await watcher.unwatch('new-file*');
-
-// Stop watching.
-// The method is async!
-watcher.close().then(() => console.log('closed'));
-
-// Full list of options. See below for descriptions.
-// Do not use this example!
-chokidar.watch('file', {
-  persistent: true,
-
-  ignored: '*.txt',
-  ignoreInitial: false,
-  followSymlinks: true,
-  cwd: '.',
-  disableGlobbing: false,
-
-  usePolling: false,
-  interval: 100,
-  binaryInterval: 300,
-  alwaysStat: false,
-  depth: 99,
-  awaitWriteFinish: {
-    stabilityThreshold: 2000,
-    pollInterval: 100
-  },
-
-  ignorePermissionErrors: false,
-  atomic: true // or a custom 'atomicity delay', in milliseconds (default 100)
-});
-
-```
-
-`chokidar.watch(paths, [options])`
-
-* `paths` (string or array of strings). Paths to files, dirs to be watched
-recursively, or glob patterns.
-    - Note: globs must not contain windows separators (`\`),
-    because that's how they work by the standard —
-    you'll need to replace them with forward slashes (`/`).
-    - Note 2: for additional glob documentation, check out low-level
-    library: [picomatch](https://github.com/micromatch/picomatch).
-* `options` (object) Options object as defined below:
-
-#### Persistence
-
-* `persistent` (default: `true`). Indicates whether the process
-should continue to run as long as files are being watched. If set to
-`false` when using `fsevents` to watch, no more events will be emitted
-after `ready`, even if the process continues to run.
-
-#### Path filtering
-
-* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition)
-Defines files/paths to be ignored. The whole relative or absolute path is
-tested, not just filename. If a function with two arguments is provided, it
-gets called twice per path - once with a single argument (the path), second
-time with two arguments (the path and the
-[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)
-object of that path).
-* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while
-instantiating the watching as chokidar discovers these file paths (before the `ready` event).
-* `followSymlinks` (default: `true`). When `false`, only the
-symlinks themselves will be watched for changes instead of following
-the link references and bubbling events through the link's path.
-* `cwd` (no default). The base directory from which watch `paths` are to be
-derived. Paths emitted with events will be relative to this.
-* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as
-literal path names, even if they look like globs.
-
-#### Performance
-
-* `usePolling` (default: `false`).
-Whether to use fs.watchFile (backed by polling), or fs.watch. If polling
-leads to high CPU utilization, consider setting this to `false`. It is
-typically necessary to **set this to `true` to successfully watch files over
-a network**, and it may be necessary to successfully watch files in other
-non-standard situations. Setting to `true` explicitly on MacOS overrides the
-`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable
-to true (1) or false (0) in order to override this option.
-* _Polling-specific settings_ (effective when `usePolling: true`)
-  * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also
-    set the CHOKIDAR_INTERVAL env variable to override this option.
-  * `binaryInterval` (default: `300`). Interval of file system
-  polling for binary files.
-  ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json))
-* `useFsEvents` (default: `true` on MacOS). Whether to use the
-`fsevents` watching interface if available. When set to `true` explicitly
-and `fsevents` is available this supercedes the `usePolling` setting. When
-set to `false` on MacOS, `usePolling: true` becomes the default.
-* `alwaysStat` (default: `false`). If relying upon the
-[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)
-object that may get passed with `add`, `addDir`, and `change` events, set
-this to `true` to ensure it is provided even in cases where it wasn't
-already available from the underlying watch events.
-* `depth` (default: `undefined`). If set, limits how many levels of
-subdirectories will be traversed.
-* `awaitWriteFinish` (default: `false`).
-By default, the `add` event will fire when a file first appears on disk, before
-the entire file has been written. Furthermore, in some cases some `change`
-events will be emitted while the file is being written. In some cases,
-especially when watching for large files there will be a need to wait for the
-write operation to finish before responding to a file creation or modification.
-Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size,
-holding its `add` and `change` events until the size does not change for a
-configurable amount of time. The appropriate duration setting is heavily
-dependent on the OS and hardware. For accurate detection this parameter should
-be relatively high, making file watching much less responsive.
-Use with caution.
-  * *`options.awaitWriteFinish` can be set to an object in order to adjust
-  timing params:*
-  * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in
-  milliseconds for a file size to remain constant before emitting its event.
-  * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds.
-
-#### Errors
-
-* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files
-that don't have read permissions if possible. If watching fails due to `EPERM`
-or `EACCES` with this set to `true`, the errors will be suppressed silently.
-* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`).
-Automatically filters out artifacts that occur when using editors that use
-"atomic writes" instead of writing directly to the source file. If a file is
-re-added within 100 ms of being deleted, Chokidar emits a `change` event
-rather than `unlink` then `add`. If the default of 100 ms does not work well
-for you, you can override it by setting `atomic` to a custom value, in
-milliseconds.
-
-### Methods & Events
-
-`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`:
-
-* `.add(path / paths)`: Add files, directories, or glob patterns for tracking.
-Takes an array of strings or just one string.
-* `.on(event, callback)`: Listen for an FS event.
-Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`,
-`raw`, `error`.
-Additionally `all` is available which gets emitted with the underlying event
-name and path for every event other than `ready`, `raw`, and `error`.  `raw` is internal, use it carefully.
-* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns.
-Takes an array of strings or just one string.
-* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen.
-* `.getWatched()`: Returns an object representing all the paths on the file
-system being watched by this `FSWatcher` instance. The object's keys are all the
-directories (using absolute paths unless the `cwd` option was used), and the
-values are arrays of the names of the items contained in each directory.
-
-## CLI
-
-If you need a CLI interface for your file watching, check out
-[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to
-execute a command on each change, or get a stdio stream of change events.
-
-## Install Troubleshooting
-
-* `npm WARN optional dep failed, continuing fsevents@n.n.n`
-  * This message is normal part of how `npm` handles optional dependencies and is
-    not indicative of a problem. Even if accompanied by other related error messages,
-    Chokidar should function properly.
-
-* `TypeError: fsevents is not a constructor`
-  * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar.
-
-* Chokidar is producing `ENOSP` error on Linux, like this:
-  * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell`
-  `Error: watch /home/ ENOSPC`
-  * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal:
-  `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p`
-
-## Changelog
-
-For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md).
-- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks.
-- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement.
-- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method.
-- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions.
-- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%.
-- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher.
-- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes.
-- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported
-- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66)
-
-## Also
-
-Why was chokidar named this way? What's the meaning behind it?
-
->Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. 
-
-## License
-
-MIT (c) Paul Miller (<https://paulmillr.com>), see [LICENSE](LICENSE) file.
Index: de_modules/chokidar/index.js
===================================================================
--- node_modules/chokidar/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,973 +1,0 @@
-'use strict';
-
-const { EventEmitter } = require('events');
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-const readdirp = require('readdirp');
-const anymatch = require('anymatch').default;
-const globParent = require('glob-parent');
-const isGlob = require('is-glob');
-const braces = require('braces');
-const normalizePath = require('normalize-path');
-
-const NodeFsHandler = require('./lib/nodefs-handler');
-const FsEventsHandler = require('./lib/fsevents-handler');
-const {
-  EV_ALL,
-  EV_READY,
-  EV_ADD,
-  EV_CHANGE,
-  EV_UNLINK,
-  EV_ADD_DIR,
-  EV_UNLINK_DIR,
-  EV_RAW,
-  EV_ERROR,
-
-  STR_CLOSE,
-  STR_END,
-
-  BACK_SLASH_RE,
-  DOUBLE_SLASH_RE,
-  SLASH_OR_BACK_SLASH_RE,
-  DOT_RE,
-  REPLACER_RE,
-
-  SLASH,
-  SLASH_SLASH,
-  BRACE_START,
-  BANG,
-  ONE_DOT,
-  TWO_DOTS,
-  GLOBSTAR,
-  SLASH_GLOBSTAR,
-  ANYMATCH_OPTS,
-  STRING_TYPE,
-  FUNCTION_TYPE,
-  EMPTY_STR,
-  EMPTY_FN,
-
-  isWindows,
-  isMacos,
-  isIBMi
-} = require('./lib/constants');
-
-const stat = promisify(fs.stat);
-const readdir = promisify(fs.readdir);
-
-/**
- * @typedef {String} Path
- * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName
- * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType
- */
-
-/**
- *
- * @typedef {Object} WatchHelpers
- * @property {Boolean} followSymlinks
- * @property {'stat'|'lstat'} statMethod
- * @property {Path} path
- * @property {Path} watchPath
- * @property {Function} entryPath
- * @property {Boolean} hasGlob
- * @property {Object} globFilter
- * @property {Function} filterPath
- * @property {Function} filterDir
- */
-
-const arrify = (value = []) => Array.isArray(value) ? value : [value];
-const flatten = (list, result = []) => {
-  list.forEach(item => {
-    if (Array.isArray(item)) {
-      flatten(item, result);
-    } else {
-      result.push(item);
-    }
-  });
-  return result;
-};
-
-const unifyPaths = (paths_) => {
-  /**
-   * @type {Array<String>}
-   */
-  const paths = flatten(arrify(paths_));
-  if (!paths.every(p => typeof p === STRING_TYPE)) {
-    throw new TypeError(`Non-string provided as watch path: ${paths}`);
-  }
-  return paths.map(normalizePathToUnix);
-};
-
-// If SLASH_SLASH occurs at the beginning of path, it is not replaced
-//     because "//StoragePC/DrivePool/Movies" is a valid network path
-const toUnix = (string) => {
-  let str = string.replace(BACK_SLASH_RE, SLASH);
-  let prepend = false;
-  if (str.startsWith(SLASH_SLASH)) {
-    prepend = true;
-  }
-  while (str.match(DOUBLE_SLASH_RE)) {
-    str = str.replace(DOUBLE_SLASH_RE, SLASH);
-  }
-  if (prepend) {
-    str = SLASH + str;
-  }
-  return str;
-};
-
-// Our version of upath.normalize
-// TODO: this is not equal to path-normalize module - investigate why
-const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));
-
-const normalizeIgnored = (cwd = EMPTY_STR) => (path) => {
-  if (typeof path !== STRING_TYPE) return path;
-  return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));
-};
-
-const getAbsolutePath = (path, cwd) => {
-  if (sysPath.isAbsolute(path)) {
-    return path;
-  }
-  if (path.startsWith(BANG)) {
-    return BANG + sysPath.join(cwd, path.slice(1));
-  }
-  return sysPath.join(cwd, path);
-};
-
-const undef = (opts, key) => opts[key] === undefined;
-
-/**
- * Directory entry.
- * @property {Path} path
- * @property {Set<Path>} items
- */
-class DirEntry {
-  /**
-   * @param {Path} dir
-   * @param {Function} removeWatcher
-   */
-  constructor(dir, removeWatcher) {
-    this.path = dir;
-    this._removeWatcher = removeWatcher;
-    /** @type {Set<Path>} */
-    this.items = new Set();
-  }
-
-  add(item) {
-    const {items} = this;
-    if (!items) return;
-    if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item);
-  }
-
-  async remove(item) {
-    const {items} = this;
-    if (!items) return;
-    items.delete(item);
-    if (items.size > 0) return;
-
-    const dir = this.path;
-    try {
-      await readdir(dir);
-    } catch (err) {
-      if (this._removeWatcher) {
-        this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));
-      }
-    }
-  }
-
-  has(item) {
-    const {items} = this;
-    if (!items) return;
-    return items.has(item);
-  }
-
-  /**
-   * @returns {Array<String>}
-   */
-  getChildren() {
-    const {items} = this;
-    if (!items) return;
-    return [...items.values()];
-  }
-
-  dispose() {
-    this.items.clear();
-    delete this.path;
-    delete this._removeWatcher;
-    delete this.items;
-    Object.freeze(this);
-  }
-}
-
-const STAT_METHOD_F = 'stat';
-const STAT_METHOD_L = 'lstat';
-class WatchHelper {
-  constructor(path, watchPath, follow, fsw) {
-    this.fsw = fsw;
-    this.path = path = path.replace(REPLACER_RE, EMPTY_STR);
-    this.watchPath = watchPath;
-    this.fullWatchPath = sysPath.resolve(watchPath);
-    this.hasGlob = watchPath !== path;
-    /** @type {object|boolean} */
-    if (path === EMPTY_STR) this.hasGlob = false;
-    this.globSymlink = this.hasGlob && follow ? undefined : false;
-    this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false;
-    this.dirParts = this.getDirParts(path);
-    this.dirParts.forEach((parts) => {
-      if (parts.length > 1) parts.pop();
-    });
-    this.followSymlinks = follow;
-    this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;
-  }
-
-  checkGlobSymlink(entry) {
-    // only need to resolve once
-    // first entry should always have entry.parentDir === EMPTY_STR
-    if (this.globSymlink === undefined) {
-      this.globSymlink = entry.fullParentDir === this.fullWatchPath ?
-        false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath};
-    }
-
-    if (this.globSymlink) {
-      return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath);
-    }
-
-    return entry.fullPath;
-  }
-
-  entryPath(entry) {
-    return sysPath.join(this.watchPath,
-      sysPath.relative(this.watchPath, this.checkGlobSymlink(entry))
-    );
-  }
-
-  filterPath(entry) {
-    const {stats} = entry;
-    if (stats && stats.isSymbolicLink()) return this.filterDir(entry);
-    const resolvedPath = this.entryPath(entry);
-    const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ?
-      this.globFilter(resolvedPath) : true;
-    return matchesGlob &&
-      this.fsw._isntIgnored(resolvedPath, stats) &&
-      this.fsw._hasReadPermissions(stats);
-  }
-
-  getDirParts(path) {
-    if (!this.hasGlob) return [];
-    const parts = [];
-    const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path];
-    expandedPath.forEach((path) => {
-      parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE));
-    });
-    return parts;
-  }
-
-  filterDir(entry) {
-    if (this.hasGlob) {
-      const entryParts = this.getDirParts(this.checkGlobSymlink(entry));
-      let globstar = false;
-      this.unmatchedGlob = !this.dirParts.some((parts) => {
-        return parts.every((part, i) => {
-          if (part === GLOBSTAR) globstar = true;
-          return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS);
-        });
-      });
-    }
-    return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats);
-  }
-}
-
-/**
- * Watches files & directories for changes. Emitted events:
- * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`
- *
- *     new FSWatcher()
- *       .add(directories)
- *       .on('add', path => log('File', path, 'was added'))
- */
-class FSWatcher extends EventEmitter {
-// Not indenting methods for history sake; for now.
-constructor(_opts) {
-  super();
-
-  const opts = {};
-  if (_opts) Object.assign(opts, _opts); // for frozen objects
-
-  /** @type {Map<String, DirEntry>} */
-  this._watched = new Map();
-  /** @type {Map<String, Array>} */
-  this._closers = new Map();
-  /** @type {Set<String>} */
-  this._ignoredPaths = new Set();
-
-  /** @type {Map<ThrottleType, Map>} */
-  this._throttled = new Map();
-
-  /** @type {Map<Path, String|Boolean>} */
-  this._symlinkPaths = new Map();
-
-  this._streams = new Set();
-  this.closed = false;
-
-  // Set up default options.
-  if (undef(opts, 'persistent')) opts.persistent = true;
-  if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false;
-  if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false;
-  if (undef(opts, 'interval')) opts.interval = 100;
-  if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300;
-  if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false;
-  opts.enableBinaryInterval = opts.binaryInterval !== opts.interval;
-
-  // Enable fsevents on OS X when polling isn't explicitly enabled.
-  if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling;
-
-  // If we can't use fsevents, ensure the options reflect it's disabled.
-  const canUseFsEvents = FsEventsHandler.canUse();
-  if (!canUseFsEvents) opts.useFsEvents = false;
-
-  // Use polling on Mac if not using fsevents.
-  // Other platforms use non-polling fs_watch.
-  if (undef(opts, 'usePolling') && !opts.useFsEvents) {
-    opts.usePolling = isMacos;
-  }
-
-  // Always default to polling on IBM i because fs.watch() is not available on IBM i.
-  if(isIBMi) {
-    opts.usePolling = true;
-  }
-
-  // Global override (useful for end-developers that need to force polling for all
-  // instances of chokidar, regardless of usage/dependency depth)
-  const envPoll = process.env.CHOKIDAR_USEPOLLING;
-  if (envPoll !== undefined) {
-    const envLower = envPoll.toLowerCase();
-
-    if (envLower === 'false' || envLower === '0') {
-      opts.usePolling = false;
-    } else if (envLower === 'true' || envLower === '1') {
-      opts.usePolling = true;
-    } else {
-      opts.usePolling = !!envLower;
-    }
-  }
-  const envInterval = process.env.CHOKIDAR_INTERVAL;
-  if (envInterval) {
-    opts.interval = Number.parseInt(envInterval, 10);
-  }
-
-  // Editor atomic write normalization enabled by default with fs.watch
-  if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents;
-  if (opts.atomic) this._pendingUnlinks = new Map();
-
-  if (undef(opts, 'followSymlinks')) opts.followSymlinks = true;
-
-  if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false;
-  if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {};
-  const awf = opts.awaitWriteFinish;
-  if (awf) {
-    if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000;
-    if (!awf.pollInterval) awf.pollInterval = 100;
-    this._pendingWrites = new Map();
-  }
-  if (opts.ignored) opts.ignored = arrify(opts.ignored);
-
-  let readyCalls = 0;
-  this._emitReady = () => {
-    readyCalls++;
-    if (readyCalls >= this._readyCount) {
-      this._emitReady = EMPTY_FN;
-      this._readyEmitted = true;
-      // use process.nextTick to allow time for listener to be bound
-      process.nextTick(() => this.emit(EV_READY));
-    }
-  };
-  this._emitRaw = (...args) => this.emit(EV_RAW, ...args);
-  this._readyEmitted = false;
-  this.options = opts;
-
-  // Initialize with proper watcher.
-  if (opts.useFsEvents) {
-    this._fsEventsHandler = new FsEventsHandler(this);
-  } else {
-    this._nodeFsHandler = new NodeFsHandler(this);
-  }
-
-  // You’re frozen when your heart’s not open.
-  Object.freeze(opts);
-}
-
-// Public methods
-
-/**
- * Adds paths to be watched on an existing FSWatcher instance
- * @param {Path|Array<Path>} paths_
- * @param {String=} _origAdd private; for handling non-existent paths to be watched
- * @param {Boolean=} _internal private; indicates a non-user add
- * @returns {FSWatcher} for chaining
- */
-add(paths_, _origAdd, _internal) {
-  const {cwd, disableGlobbing} = this.options;
-  this.closed = false;
-  let paths = unifyPaths(paths_);
-  if (cwd) {
-    paths = paths.map((path) => {
-      const absPath = getAbsolutePath(path, cwd);
-
-      // Check `path` instead of `absPath` because the cwd portion can't be a glob
-      if (disableGlobbing || !isGlob(path)) {
-        return absPath;
-      }
-      return normalizePath(absPath);
-    });
-  }
-
-  // set aside negated glob strings
-  paths = paths.filter((path) => {
-    if (path.startsWith(BANG)) {
-      this._ignoredPaths.add(path.slice(1));
-      return false;
-    }
-
-    // if a path is being added that was previously ignored, stop ignoring it
-    this._ignoredPaths.delete(path);
-    this._ignoredPaths.delete(path + SLASH_GLOBSTAR);
-
-    // reset the cached userIgnored anymatch fn
-    // to make ignoredPaths changes effective
-    this._userIgnored = undefined;
-
-    return true;
-  });
-
-  if (this.options.useFsEvents && this._fsEventsHandler) {
-    if (!this._readyCount) this._readyCount = paths.length;
-    if (this.options.persistent) this._readyCount += paths.length;
-    paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path));
-  } else {
-    if (!this._readyCount) this._readyCount = 0;
-    this._readyCount += paths.length;
-    Promise.all(
-      paths.map(async path => {
-        const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd);
-        if (res) this._emitReady();
-        return res;
-      })
-    ).then(results => {
-      if (this.closed) return;
-      results.filter(item => item).forEach(item => {
-        this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));
-      });
-    });
-  }
-
-  return this;
-}
-
-/**
- * Close watchers or start ignoring events from specified paths.
- * @param {Path|Array<Path>} paths_ - string or array of strings, file/directory paths and/or globs
- * @returns {FSWatcher} for chaining
-*/
-unwatch(paths_) {
-  if (this.closed) return this;
-  const paths = unifyPaths(paths_);
-  const {cwd} = this.options;
-
-  paths.forEach((path) => {
-    // convert to absolute path unless relative path already matches
-    if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {
-      if (cwd) path = sysPath.join(cwd, path);
-      path = sysPath.resolve(path);
-    }
-
-    this._closePath(path);
-
-    this._ignoredPaths.add(path);
-    if (this._watched.has(path)) {
-      this._ignoredPaths.add(path + SLASH_GLOBSTAR);
-    }
-
-    // reset the cached userIgnored anymatch fn
-    // to make ignoredPaths changes effective
-    this._userIgnored = undefined;
-  });
-
-  return this;
-}
-
-/**
- * Close watchers and remove all listeners from watched paths.
- * @returns {Promise<void>}.
-*/
-close() {
-  if (this.closed) return this._closePromise;
-  this.closed = true;
-
-  // Memory management.
-  this.removeAllListeners();
-  const closers = [];
-  this._closers.forEach(closerList => closerList.forEach(closer => {
-    const promise = closer();
-    if (promise instanceof Promise) closers.push(promise);
-  }));
-  this._streams.forEach(stream => stream.destroy());
-  this._userIgnored = undefined;
-  this._readyCount = 0;
-  this._readyEmitted = false;
-  this._watched.forEach(dirent => dirent.dispose());
-  ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => {
-    this[`_${key}`].clear();
-  });
-
-  this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve();
-  return this._closePromise;
-}
-
-/**
- * Expose list of watched paths
- * @returns {Object} for chaining
-*/
-getWatched() {
-  const watchList = {};
-  this._watched.forEach((entry, dir) => {
-    const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;
-    watchList[key || ONE_DOT] = entry.getChildren().sort();
-  });
-  return watchList;
-}
-
-emitWithAll(event, args) {
-  this.emit(...args);
-  if (event !== EV_ERROR) this.emit(EV_ALL, ...args);
-}
-
-// Common helpers
-// --------------
-
-/**
- * Normalize and emit events.
- * Calling _emit DOES NOT MEAN emit() would be called!
- * @param {EventName} event Type of event
- * @param {Path} path File or directory path
- * @param {*=} val1 arguments to be passed with event
- * @param {*=} val2
- * @param {*=} val3
- * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag
- */
-async _emit(event, path, val1, val2, val3) {
-  if (this.closed) return;
-
-  const opts = this.options;
-  if (isWindows) path = sysPath.normalize(path);
-  if (opts.cwd) path = sysPath.relative(opts.cwd, path);
-  /** @type Array<any> */
-  const args = [event, path];
-  if (val3 !== undefined) args.push(val1, val2, val3);
-  else if (val2 !== undefined) args.push(val1, val2);
-  else if (val1 !== undefined) args.push(val1);
-
-  const awf = opts.awaitWriteFinish;
-  let pw;
-  if (awf && (pw = this._pendingWrites.get(path))) {
-    pw.lastChange = new Date();
-    return this;
-  }
-
-  if (opts.atomic) {
-    if (event === EV_UNLINK) {
-      this._pendingUnlinks.set(path, args);
-      setTimeout(() => {
-        this._pendingUnlinks.forEach((entry, path) => {
-          this.emit(...entry);
-          this.emit(EV_ALL, ...entry);
-          this._pendingUnlinks.delete(path);
-        });
-      }, typeof opts.atomic === 'number' ? opts.atomic : 100);
-      return this;
-    }
-    if (event === EV_ADD && this._pendingUnlinks.has(path)) {
-      event = args[0] = EV_CHANGE;
-      this._pendingUnlinks.delete(path);
-    }
-  }
-
-  if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) {
-    const awfEmit = (err, stats) => {
-      if (err) {
-        event = args[0] = EV_ERROR;
-        args[1] = err;
-        this.emitWithAll(event, args);
-      } else if (stats) {
-        // if stats doesn't exist the file must have been deleted
-        if (args.length > 2) {
-          args[2] = stats;
-        } else {
-          args.push(stats);
-        }
-        this.emitWithAll(event, args);
-      }
-    };
-
-    this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);
-    return this;
-  }
-
-  if (event === EV_CHANGE) {
-    const isThrottled = !this._throttle(EV_CHANGE, path, 50);
-    if (isThrottled) return this;
-  }
-
-  if (opts.alwaysStat && val1 === undefined &&
-    (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE)
-  ) {
-    const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;
-    let stats;
-    try {
-      stats = await stat(fullPath);
-    } catch (err) {}
-    // Suppress event when fs_stat fails, to avoid sending undefined 'stat'
-    if (!stats || this.closed) return;
-    args.push(stats);
-  }
-  this.emitWithAll(event, args);
-
-  return this;
-}
-
-/**
- * Common handler for errors
- * @param {Error} error
- * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag
- */
-_handleError(error) {
-  const code = error && error.code;
-  if (error && code !== 'ENOENT' && code !== 'ENOTDIR' &&
-    (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))
-  ) {
-    this.emit(EV_ERROR, error);
-  }
-  return error || this.closed;
-}
-
-/**
- * Helper utility for throttling
- * @param {ThrottleType} actionType type being throttled
- * @param {Path} path being acted upon
- * @param {Number} timeout duration of time to suppress duplicate actions
- * @returns {Object|false} tracking object or false if action should be suppressed
- */
-_throttle(actionType, path, timeout) {
-  if (!this._throttled.has(actionType)) {
-    this._throttled.set(actionType, new Map());
-  }
-
-  /** @type {Map<Path, Object>} */
-  const action = this._throttled.get(actionType);
-  /** @type {Object} */
-  const actionPath = action.get(path);
-
-  if (actionPath) {
-    actionPath.count++;
-    return false;
-  }
-
-  let timeoutObject;
-  const clear = () => {
-    const item = action.get(path);
-    const count = item ? item.count : 0;
-    action.delete(path);
-    clearTimeout(timeoutObject);
-    if (item) clearTimeout(item.timeoutObject);
-    return count;
-  };
-  timeoutObject = setTimeout(clear, timeout);
-  const thr = {timeoutObject, clear, count: 0};
-  action.set(path, thr);
-  return thr;
-}
-
-_incrReadyCount() {
-  return this._readyCount++;
-}
-
-/**
- * Awaits write operation to finish.
- * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.
- * @param {Path} path being acted upon
- * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished
- * @param {EventName} event
- * @param {Function} awfEmit Callback to be called when ready for event to be emitted.
- */
-_awaitWriteFinish(path, threshold, event, awfEmit) {
-  let timeoutHandler;
-
-  let fullPath = path;
-  if (this.options.cwd && !sysPath.isAbsolute(path)) {
-    fullPath = sysPath.join(this.options.cwd, path);
-  }
-
-  const now = new Date();
-
-  const awaitWriteFinish = (prevStat) => {
-    fs.stat(fullPath, (err, curStat) => {
-      if (err || !this._pendingWrites.has(path)) {
-        if (err && err.code !== 'ENOENT') awfEmit(err);
-        return;
-      }
-
-      const now = Number(new Date());
-
-      if (prevStat && curStat.size !== prevStat.size) {
-        this._pendingWrites.get(path).lastChange = now;
-      }
-      const pw = this._pendingWrites.get(path);
-      const df = now - pw.lastChange;
-
-      if (df >= threshold) {
-        this._pendingWrites.delete(path);
-        awfEmit(undefined, curStat);
-      } else {
-        timeoutHandler = setTimeout(
-          awaitWriteFinish,
-          this.options.awaitWriteFinish.pollInterval,
-          curStat
-        );
-      }
-    });
-  };
-
-  if (!this._pendingWrites.has(path)) {
-    this._pendingWrites.set(path, {
-      lastChange: now,
-      cancelWait: () => {
-        this._pendingWrites.delete(path);
-        clearTimeout(timeoutHandler);
-        return event;
-      }
-    });
-    timeoutHandler = setTimeout(
-      awaitWriteFinish,
-      this.options.awaitWriteFinish.pollInterval
-    );
-  }
-}
-
-_getGlobIgnored() {
-  return [...this._ignoredPaths.values()];
-}
-
-/**
- * Determines whether user has asked to ignore this path.
- * @param {Path} path filepath or dir
- * @param {fs.Stats=} stats result of fs.stat
- * @returns {Boolean}
- */
-_isIgnored(path, stats) {
-  if (this.options.atomic && DOT_RE.test(path)) return true;
-  if (!this._userIgnored) {
-    const {cwd} = this.options;
-    const ign = this.options.ignored;
-
-    const ignored = ign && ign.map(normalizeIgnored(cwd));
-    const paths = arrify(ignored)
-      .filter((path) => typeof path === STRING_TYPE && !isGlob(path))
-      .map((path) => path + SLASH_GLOBSTAR);
-    const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths);
-    this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS);
-  }
-
-  return this._userIgnored([path, stats]);
-}
-
-_isntIgnored(path, stat) {
-  return !this._isIgnored(path, stat);
-}
-
-/**
- * Provides a set of common helpers and properties relating to symlink and glob handling.
- * @param {Path} path file, directory, or glob pattern being watched
- * @param {Number=} depth at any depth > 0, this isn't a glob
- * @returns {WatchHelper} object containing helpers for this path
- */
-_getWatchHelpers(path, depth) {
-  const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path);
-  const follow = this.options.followSymlinks;
-
-  return new WatchHelper(path, watchPath, follow, this);
-}
-
-// Directory helpers
-// -----------------
-
-/**
- * Provides directory tracking objects
- * @param {String} directory path of the directory
- * @returns {DirEntry} the directory's tracking object
- */
-_getWatchedDir(directory) {
-  if (!this._boundRemove) this._boundRemove = this._remove.bind(this);
-  const dir = sysPath.resolve(directory);
-  if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove));
-  return this._watched.get(dir);
-}
-
-// File helpers
-// ------------
-
-/**
- * Check for read permissions.
- * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405
- * @param {fs.Stats} stats - object, result of fs_stat
- * @returns {Boolean} indicates whether the file can be read
-*/
-_hasReadPermissions(stats) {
-  if (this.options.ignorePermissionErrors) return true;
-
-  // stats.mode may be bigint
-  const md = stats && Number.parseInt(stats.mode, 10);
-  const st = md & 0o777;
-  const it = Number.parseInt(st.toString(8)[0], 10);
-  return Boolean(4 & it);
-}
-
-/**
- * Handles emitting unlink events for
- * files and directories, and via recursion, for
- * files and directories within directories that are unlinked
- * @param {String} directory within which the following item is located
- * @param {String} item      base path of item/directory
- * @returns {void}
-*/
-_remove(directory, item, isDirectory) {
-  // if what is being deleted is a directory, get that directory's paths
-  // for recursive deleting and cleaning of watched object
-  // if it is not a directory, nestedDirectoryChildren will be empty array
-  const path = sysPath.join(directory, item);
-  const fullPath = sysPath.resolve(path);
-  isDirectory = isDirectory != null
-    ? isDirectory
-    : this._watched.has(path) || this._watched.has(fullPath);
-
-  // prevent duplicate handling in case of arriving here nearly simultaneously
-  // via multiple paths (such as _handleFile and _handleDir)
-  if (!this._throttle('remove', path, 100)) return;
-
-  // if the only watched file is removed, watch for its return
-  if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) {
-    this.add(directory, item, true);
-  }
-
-  // This will create a new entry in the watched object in either case
-  // so we got to do the directory check beforehand
-  const wp = this._getWatchedDir(path);
-  const nestedDirectoryChildren = wp.getChildren();
-
-  // Recursively remove children directories / files.
-  nestedDirectoryChildren.forEach(nested => this._remove(path, nested));
-
-  // Check if item was on the watched list and remove it
-  const parent = this._getWatchedDir(directory);
-  const wasTracked = parent.has(item);
-  parent.remove(item);
-
-  // Fixes issue #1042 -> Relative paths were detected and added as symlinks
-  // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),
-  // but never removed from the map in case the path was deleted.
-  // This leads to an incorrect state if the path was recreated:
-  // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553
-  if (this._symlinkPaths.has(fullPath)) {
-    this._symlinkPaths.delete(fullPath);
-  }
-
-  // If we wait for this file to be fully written, cancel the wait.
-  let relPath = path;
-  if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path);
-  if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {
-    const event = this._pendingWrites.get(relPath).cancelWait();
-    if (event === EV_ADD) return;
-  }
-
-  // The Entry will either be a directory that just got removed
-  // or a bogus entry to a file, in either case we have to remove it
-  this._watched.delete(path);
-  this._watched.delete(fullPath);
-  const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK;
-  if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path);
-
-  // Avoid conflicts if we later create another file with the same name
-  if (!this.options.useFsEvents) {
-    this._closePath(path);
-  }
-}
-
-/**
- * Closes all watchers for a path
- * @param {Path} path
- */
-_closePath(path) {
-  this._closeFile(path)
-  const dir = sysPath.dirname(path);
-  this._getWatchedDir(dir).remove(sysPath.basename(path));
-}
-
-/**
- * Closes only file-specific watchers
- * @param {Path} path
- */
-_closeFile(path) {
-  const closers = this._closers.get(path);
-  if (!closers) return;
-  closers.forEach(closer => closer());
-  this._closers.delete(path);
-}
-
-/**
- *
- * @param {Path} path
- * @param {Function} closer
- */
-_addPathCloser(path, closer) {
-  if (!closer) return;
-  let list = this._closers.get(path);
-  if (!list) {
-    list = [];
-    this._closers.set(path, list);
-  }
-  list.push(closer);
-}
-
-_readdirp(root, opts) {
-  if (this.closed) return;
-  const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts};
-  let stream = readdirp(root, options);
-  this._streams.add(stream);
-  stream.once(STR_CLOSE, () => {
-    stream = undefined;
-  });
-  stream.once(STR_END, () => {
-    if (stream) {
-      this._streams.delete(stream);
-      stream = undefined;
-    }
-  });
-  return stream;
-}
-
-}
-
-// Export FSWatcher class
-exports.FSWatcher = FSWatcher;
-
-/**
- * Instantiates watcher with paths to be tracked.
- * @param {String|Array<String>} paths file/directory paths and/or globs
- * @param {Object=} options chokidar opts
- * @returns an instance of FSWatcher for chaining.
- */
-const watch = (paths, options) => {
-  const watcher = new FSWatcher(options);
-  watcher.add(paths);
-  return watcher;
-};
-
-exports.watch = watch;
Index: de_modules/chokidar/lib/constants.js
===================================================================
--- node_modules/chokidar/lib/constants.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,66 +1,0 @@
-'use strict';
-
-const {sep} = require('path');
-const {platform} = process;
-const os = require('os');
-
-exports.EV_ALL = 'all';
-exports.EV_READY = 'ready';
-exports.EV_ADD = 'add';
-exports.EV_CHANGE = 'change';
-exports.EV_ADD_DIR = 'addDir';
-exports.EV_UNLINK = 'unlink';
-exports.EV_UNLINK_DIR = 'unlinkDir';
-exports.EV_RAW = 'raw';
-exports.EV_ERROR = 'error';
-
-exports.STR_DATA = 'data';
-exports.STR_END = 'end';
-exports.STR_CLOSE = 'close';
-
-exports.FSEVENT_CREATED = 'created';
-exports.FSEVENT_MODIFIED = 'modified';
-exports.FSEVENT_DELETED = 'deleted';
-exports.FSEVENT_MOVED = 'moved';
-exports.FSEVENT_CLONED = 'cloned';
-exports.FSEVENT_UNKNOWN = 'unknown';
-exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1;
-exports.FSEVENT_TYPE_FILE = 'file';
-exports.FSEVENT_TYPE_DIRECTORY = 'directory';
-exports.FSEVENT_TYPE_SYMLINK = 'symlink';
-
-exports.KEY_LISTENERS = 'listeners';
-exports.KEY_ERR = 'errHandlers';
-exports.KEY_RAW = 'rawEmitters';
-exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW];
-
-exports.DOT_SLASH = `.${sep}`;
-
-exports.BACK_SLASH_RE = /\\/g;
-exports.DOUBLE_SLASH_RE = /\/\//;
-exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/;
-exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/;
-exports.REPLACER_RE = /^\.[/\\]/;
-
-exports.SLASH = '/';
-exports.SLASH_SLASH = '//';
-exports.BRACE_START = '{';
-exports.BANG = '!';
-exports.ONE_DOT = '.';
-exports.TWO_DOTS = '..';
-exports.STAR = '*';
-exports.GLOBSTAR = '**';
-exports.ROOT_GLOBSTAR = '/**/*';
-exports.SLASH_GLOBSTAR = '/**';
-exports.DIR_SUFFIX = 'Dir';
-exports.ANYMATCH_OPTS = {dot: true};
-exports.STRING_TYPE = 'string';
-exports.FUNCTION_TYPE = 'function';
-exports.EMPTY_STR = '';
-exports.EMPTY_FN = () => {};
-exports.IDENTITY_FN = val => val;
-
-exports.isWindows = platform === 'win32';
-exports.isMacos = platform === 'darwin';
-exports.isLinux = platform === 'linux';
-exports.isIBMi = os.type() === 'OS400';
Index: de_modules/chokidar/lib/fsevents-handler.js
===================================================================
--- node_modules/chokidar/lib/fsevents-handler.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,526 +1,0 @@
-'use strict';
-
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-
-let fsevents;
-try {
-  fsevents = require('fsevents');
-} catch (error) {
-  if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error);
-}
-
-if (fsevents) {
-  // TODO: real check
-  const mtch = process.version.match(/v(\d+)\.(\d+)/);
-  if (mtch && mtch[1] && mtch[2]) {
-    const maj = Number.parseInt(mtch[1], 10);
-    const min = Number.parseInt(mtch[2], 10);
-    if (maj === 8 && min < 16) {
-      fsevents = undefined;
-    }
-  }
-}
-
-const {
-  EV_ADD,
-  EV_CHANGE,
-  EV_ADD_DIR,
-  EV_UNLINK,
-  EV_ERROR,
-  STR_DATA,
-  STR_END,
-  FSEVENT_CREATED,
-  FSEVENT_MODIFIED,
-  FSEVENT_DELETED,
-  FSEVENT_MOVED,
-  // FSEVENT_CLONED,
-  FSEVENT_UNKNOWN,
-  FSEVENT_FLAG_MUST_SCAN_SUBDIRS,
-  FSEVENT_TYPE_FILE,
-  FSEVENT_TYPE_DIRECTORY,
-  FSEVENT_TYPE_SYMLINK,
-
-  ROOT_GLOBSTAR,
-  DIR_SUFFIX,
-  DOT_SLASH,
-  FUNCTION_TYPE,
-  EMPTY_FN,
-  IDENTITY_FN
-} = require('./constants');
-
-const Depth = (value) => isNaN(value) ? {} : {depth: value};
-
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const realpath = promisify(fs.realpath);
-
-const statMethods = { stat, lstat };
-
-/**
- * @typedef {String} Path
- */
-
-/**
- * @typedef {Object} FsEventsWatchContainer
- * @property {Set<Function>} listeners
- * @property {Function} rawEmitter
- * @property {{stop: Function}} watcher
- */
-
-// fsevents instance helper functions
-/**
- * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances)
- * @type {Map<Path,FsEventsWatchContainer>}
- */
-const FSEventsWatchers = new Map();
-
-// Threshold of duplicate path prefixes at which to start
-// consolidating going forward
-const consolidateThreshhold = 10;
-
-const wrongEventFlags = new Set([
-  69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912
-]);
-
-/**
- * Instantiates the fsevents interface
- * @param {Path} path path to be watched
- * @param {Function} callback called when fsevents is bound and ready
- * @returns {{stop: Function}} new fsevents instance
- */
-const createFSEventsInstance = (path, callback) => {
-  const stop = fsevents.watch(path, callback);
-  return {stop};
-};
-
-/**
- * Instantiates the fsevents interface or binds listeners to an existing one covering
- * the same file tree.
- * @param {Path} path           - to be watched
- * @param {Path} realPath       - real path for symlinks
- * @param {Function} listener   - called when fsevents emits events
- * @param {Function} rawEmitter - passes data to listeners of the 'raw' event
- * @returns {Function} closer
- */
-function setFSEventsListener(path, realPath, listener, rawEmitter) {
-  let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath;
-
-  const parentPath = sysPath.dirname(watchPath);
-  let cont = FSEventsWatchers.get(watchPath);
-
-  // If we've accumulated a substantial number of paths that
-  // could have been consolidated by watching one directory
-  // above the current one, create a watcher on the parent
-  // path instead, so that we do consolidate going forward.
-  if (couldConsolidate(parentPath)) {
-    watchPath = parentPath;
-  }
-
-  const resolvedPath = sysPath.resolve(path);
-  const hasSymlink = resolvedPath !== realPath;
-
-  const filteredListener = (fullPath, flags, info) => {
-    if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath);
-    if (
-      fullPath === resolvedPath ||
-      !fullPath.indexOf(resolvedPath + sysPath.sep)
-    ) listener(fullPath, flags, info);
-  };
-
-  // check if there is already a watcher on a parent path
-  // modifies `watchPath` to the parent path when it finds a match
-  let watchedParent = false;
-  for (const watchedPath of FSEventsWatchers.keys()) {
-    if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) {
-      watchPath = watchedPath;
-      cont = FSEventsWatchers.get(watchPath);
-      watchedParent = true;
-      break;
-    }
-  }
-
-  if (cont || watchedParent) {
-    cont.listeners.add(filteredListener);
-  } else {
-    cont = {
-      listeners: new Set([filteredListener]),
-      rawEmitter,
-      watcher: createFSEventsInstance(watchPath, (fullPath, flags) => {
-        if (!cont.listeners.size) return;
-        if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return;
-        const info = fsevents.getInfo(fullPath, flags);
-        cont.listeners.forEach(list => {
-          list(fullPath, flags, info);
-        });
-
-        cont.rawEmitter(info.event, fullPath, info);
-      })
-    };
-    FSEventsWatchers.set(watchPath, cont);
-  }
-
-  // removes this instance's listeners and closes the underlying fsevents
-  // instance if there are no more listeners left
-  return () => {
-    const lst = cont.listeners;
-
-    lst.delete(filteredListener);
-    if (!lst.size) {
-      FSEventsWatchers.delete(watchPath);
-      if (cont.watcher) return cont.watcher.stop().then(() => {
-        cont.rawEmitter = cont.watcher = undefined;
-        Object.freeze(cont);
-      });
-    }
-  };
-}
-
-// Decide whether or not we should start a new higher-level
-// parent watcher
-const couldConsolidate = (path) => {
-  let count = 0;
-  for (const watchPath of FSEventsWatchers.keys()) {
-    if (watchPath.indexOf(path) === 0) {
-      count++;
-      if (count >= consolidateThreshhold) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-};
-
-// returns boolean indicating whether fsevents can be used
-const canUse = () => fsevents && FSEventsWatchers.size < 128;
-
-// determines subdirectory traversal levels from root to path
-const calcDepth = (path, root) => {
-  let i = 0;
-  while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++;
-  return i;
-};
-
-// returns boolean indicating whether the fsevents' event info has the same type
-// as the one returned by fs.stat
-const sameTypes = (info, stats) => (
-  info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() ||
-  info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() ||
-  info.type === FSEVENT_TYPE_FILE && stats.isFile()
-)
-
-/**
- * @mixin
- */
-class FsEventsHandler {
-
-/**
- * @param {import('../index').FSWatcher} fsw
- */
-constructor(fsw) {
-  this.fsw = fsw;
-}
-checkIgnored(path, stats) {
-  const ipaths = this.fsw._ignoredPaths;
-  if (this.fsw._isIgnored(path, stats)) {
-    ipaths.add(path);
-    if (stats && stats.isDirectory()) {
-      ipaths.add(path + ROOT_GLOBSTAR);
-    }
-    return true;
-  }
-
-  ipaths.delete(path);
-  ipaths.delete(path + ROOT_GLOBSTAR);
-}
-
-addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD;
-  this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-}
-
-async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  try {
-    const stats = await stat(path)
-    if (this.fsw.closed) return;
-    if (sameTypes(info, stats)) {
-      this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    } else {
-      this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    }
-  } catch (error) {
-    if (error.code === 'EACCES') {
-      this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    } else {
-      this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    }
-  }
-}
-
-handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  if (this.fsw.closed || this.checkIgnored(path)) return;
-
-  if (event === EV_UNLINK) {
-    const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY
-    // suppress unlink events on never before seen files
-    if (isDirectory || watchedDir.has(item)) {
-      this.fsw._remove(parent, item, isDirectory);
-    }
-  } else {
-    if (event === EV_ADD) {
-      // track new directories
-      if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path);
-
-      if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) {
-        // push symlinks back to the top of the stack to get handled
-        const curDepth = opts.depth === undefined ?
-          undefined : calcDepth(fullPath, realPath) + 1;
-        return this._addToFsEvents(path, false, true, curDepth);
-      }
-
-      // track new paths
-      // (other than symlinks being followed, which will be tracked soon)
-      this.fsw._getWatchedDir(parent).add(item);
-    }
-    /**
-     * @type {'add'|'addDir'|'unlink'|'unlinkDir'}
-     */
-    const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event;
-    this.fsw._emit(eventName, path);
-    if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true);
-  }
-}
-
-/**
- * Handle symlinks encountered during directory scan
- * @param {String} watchPath  - file/dir path to be watched with fsevents
- * @param {String} realPath   - real path (in case of symlinks)
- * @param {Function} transform  - path transformer
- * @param {Function} globFilter - path filter in case a glob pattern was provided
- * @returns {Function} closer for the watcher instance
-*/
-_watchWithFsEvents(watchPath, realPath, transform, globFilter) {
-  if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return;
-  const opts = this.fsw.options;
-  const watchCallback = async (fullPath, flags, info) => {
-    if (this.fsw.closed) return;
-    if (
-      opts.depth !== undefined &&
-      calcDepth(fullPath, realPath) > opts.depth
-    ) return;
-    const path = transform(sysPath.join(
-      watchPath, sysPath.relative(watchPath, fullPath)
-    ));
-    if (globFilter && !globFilter(path)) return;
-    // ensure directories are tracked
-    const parent = sysPath.dirname(path);
-    const item = sysPath.basename(path);
-    const watchedDir = this.fsw._getWatchedDir(
-      info.type === FSEVENT_TYPE_DIRECTORY ? path : parent
-    );
-
-    // correct for wrong events emitted
-    if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) {
-      if (typeof opts.ignored === FUNCTION_TYPE) {
-        let stats;
-        try {
-          stats = await stat(path);
-        } catch (error) {}
-        if (this.fsw.closed) return;
-        if (this.checkIgnored(path, stats)) return;
-        if (sameTypes(info, stats)) {
-          this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-        } else {
-          this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-        }
-      } else {
-        this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      }
-    } else {
-      switch (info.event) {
-      case FSEVENT_CREATED:
-      case FSEVENT_MODIFIED:
-        return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      case FSEVENT_DELETED:
-      case FSEVENT_MOVED:
-        return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      }
-    }
-  };
-
-  const closer = setFSEventsListener(
-    watchPath,
-    realPath,
-    watchCallback,
-    this.fsw._emitRaw
-  );
-
-  this.fsw._emitReady();
-  return closer;
-}
-
-/**
- * Handle symlinks encountered during directory scan
- * @param {String} linkPath path to symlink
- * @param {String} fullPath absolute path to the symlink
- * @param {Function} transform pre-existing path transformer
- * @param {Number} curDepth level of subdirectories traversed to where symlink is
- * @returns {Promise<void>}
- */
-async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) {
-  // don't follow the same symlink more than once
-  if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return;
-
-  this.fsw._symlinkPaths.set(fullPath, true);
-  this.fsw._incrReadyCount();
-
-  try {
-    const linkTarget = await realpath(linkPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(linkTarget)) {
-      return this.fsw._emitReady();
-    }
-
-    this.fsw._incrReadyCount();
-
-    // add the linkTarget for watching with a wrapper for transform
-    // that causes emitted paths to incorporate the link's path
-    this._addToFsEvents(linkTarget || linkPath, (path) => {
-      let aliasedPath = linkPath;
-      if (linkTarget && linkTarget !== DOT_SLASH) {
-        aliasedPath = path.replace(linkTarget, linkPath);
-      } else if (path !== DOT_SLASH) {
-        aliasedPath = sysPath.join(linkPath, path);
-      }
-      return transform(aliasedPath);
-    }, false, curDepth);
-  } catch(error) {
-    if (this.fsw._handleError(error)) {
-      return this.fsw._emitReady();
-    }
-  }
-}
-
-/**
- *
- * @param {Path} newPath
- * @param {fs.Stats} stats
- */
-emitAdd(newPath, stats, processPath, opts, forceAdd) {
-  const pp = processPath(newPath);
-  const isDir = stats.isDirectory();
-  const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp));
-  const base = sysPath.basename(pp);
-
-  // ensure empty dirs get tracked
-  if (isDir) this.fsw._getWatchedDir(pp);
-  if (dirObj.has(base)) return;
-  dirObj.add(base);
-
-  if (!opts.ignoreInitial || forceAdd === true) {
-    this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats);
-  }
-}
-
-initWatch(realPath, path, wh, processPath) {
-  if (this.fsw.closed) return;
-  const closer = this._watchWithFsEvents(
-    wh.watchPath,
-    sysPath.resolve(realPath || wh.watchPath),
-    processPath,
-    wh.globFilter
-  );
-  this.fsw._addPathCloser(path, closer);
-}
-
-/**
- * Handle added path with fsevents
- * @param {String} path file/dir path or glob pattern
- * @param {Function|Boolean=} transform converts working path to what the user expects
- * @param {Boolean=} forceAdd ensure add is emitted
- * @param {Number=} priorDepth Level of subdirectories already traversed.
- * @returns {Promise<void>}
- */
-async _addToFsEvents(path, transform, forceAdd, priorDepth) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const opts = this.fsw.options;
-  const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN;
-
-  const wh = this.fsw._getWatchHelpers(path);
-
-  // evaluate what is at the path we're being asked to watch
-  try {
-    const stats = await statMethods[wh.statMethod](wh.watchPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(wh.watchPath, stats)) {
-      throw null;
-    }
-    if (stats.isDirectory()) {
-      // emit addDir unless this is a glob parent
-      if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd);
-
-      // don't recurse further if it would exceed depth setting
-      if (priorDepth && priorDepth > opts.depth) return;
-
-      // scan the contents of the dir
-      this.fsw._readdirp(wh.watchPath, {
-        fileFilter: entry => wh.filterPath(entry),
-        directoryFilter: entry => wh.filterDir(entry),
-        ...Depth(opts.depth - (priorDepth || 0))
-      }).on(STR_DATA, (entry) => {
-        // need to check filterPath on dirs b/c filterDir is less restrictive
-        if (this.fsw.closed) {
-          return;
-        }
-        if (entry.stats.isDirectory() && !wh.filterPath(entry)) return;
-
-        const joinedPath = sysPath.join(wh.watchPath, entry.path);
-        const {fullPath} = entry;
-
-        if (wh.followSymlinks && entry.stats.isSymbolicLink()) {
-          // preserve the current depth here since it can't be derived from
-          // real paths past the symlink
-          const curDepth = opts.depth === undefined ?
-            undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1;
-
-          this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth);
-        } else {
-          this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd);
-        }
-      }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => {
-        this.fsw._emitReady();
-      });
-    } else {
-      this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd);
-      this.fsw._emitReady();
-    }
-  } catch (error) {
-    if (!error || this.fsw._handleError(error)) {
-      // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__-
-      this.fsw._emitReady();
-      this.fsw._emitReady();
-    }
-  }
-
-  if (opts.persistent && forceAdd !== true) {
-    if (typeof transform === FUNCTION_TYPE) {
-      // realpath has already been resolved
-      this.initWatch(undefined, path, wh, processPath);
-    } else {
-      let realPath;
-      try {
-        realPath = await realpath(wh.watchPath);
-      } catch (e) {}
-      this.initWatch(realPath, path, wh, processPath);
-    }
-  }
-}
-
-}
-
-module.exports = FsEventsHandler;
-module.exports.canUse = canUse;
Index: de_modules/chokidar/lib/nodefs-handler.js
===================================================================
--- node_modules/chokidar/lib/nodefs-handler.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,654 +1,0 @@
-'use strict';
-
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-const isBinaryPath = require('is-binary-path');
-const {
-  isWindows,
-  isLinux,
-  EMPTY_FN,
-  EMPTY_STR,
-  KEY_LISTENERS,
-  KEY_ERR,
-  KEY_RAW,
-  HANDLER_KEYS,
-  EV_CHANGE,
-  EV_ADD,
-  EV_ADD_DIR,
-  EV_ERROR,
-  STR_DATA,
-  STR_END,
-  BRACE_START,
-  STAR
-} = require('./constants');
-
-const THROTTLE_MODE_WATCH = 'watch';
-
-const open = promisify(fs.open);
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const close = promisify(fs.close);
-const fsrealpath = promisify(fs.realpath);
-
-const statMethods = { lstat, stat };
-
-// TODO: emit errors properly. Example: EMFILE on Macos.
-const foreach = (val, fn) => {
-  if (val instanceof Set) {
-    val.forEach(fn);
-  } else {
-    fn(val);
-  }
-};
-
-const addAndConvert = (main, prop, item) => {
-  let container = main[prop];
-  if (!(container instanceof Set)) {
-    main[prop] = container = new Set([container]);
-  }
-  container.add(item);
-};
-
-const clearItem = cont => key => {
-  const set = cont[key];
-  if (set instanceof Set) {
-    set.clear();
-  } else {
-    delete cont[key];
-  }
-};
-
-const delFromSet = (main, prop, item) => {
-  const container = main[prop];
-  if (container instanceof Set) {
-    container.delete(item);
-  } else if (container === item) {
-    delete main[prop];
-  }
-};
-
-const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val;
-
-/**
- * @typedef {String} Path
- */
-
-// fs_watch helpers
-
-// object to hold per-process fs_watch instances
-// (may be shared across chokidar FSWatcher instances)
-
-/**
- * @typedef {Object} FsWatchContainer
- * @property {Set} listeners
- * @property {Set} errHandlers
- * @property {Set} rawEmitters
- * @property {fs.FSWatcher=} watcher
- * @property {Boolean=} watcherUnusable
- */
-
-/**
- * @type {Map<String,FsWatchContainer>}
- */
-const FsWatchInstances = new Map();
-
-/**
- * Instantiates the fs_watch interface
- * @param {String} path to be watched
- * @param {Object} options to be passed to fs_watch
- * @param {Function} listener main event handler
- * @param {Function} errHandler emits info about errors
- * @param {Function} emitRaw emits raw event data
- * @returns {fs.FSWatcher} new fsevents instance
- */
-function createFsWatchInstance(path, options, listener, errHandler, emitRaw) {
-  const handleEvent = (rawEvent, evPath) => {
-    listener(path);
-    emitRaw(rawEvent, evPath, {watchedPath: path});
-
-    // emit based on events occurring for files from a directory's watcher in
-    // case the file's watcher misses it (and rely on throttling to de-dupe)
-    if (evPath && path !== evPath) {
-      fsWatchBroadcast(
-        sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath)
-      );
-    }
-  };
-  try {
-    return fs.watch(path, options, handleEvent);
-  } catch (error) {
-    errHandler(error);
-  }
-}
-
-/**
- * Helper for passing fs_watch event data to a collection of listeners
- * @param {Path} fullPath absolute path bound to fs_watch instance
- * @param {String} type listener type
- * @param {*=} val1 arguments to be passed to listeners
- * @param {*=} val2
- * @param {*=} val3
- */
-const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => {
-  const cont = FsWatchInstances.get(fullPath);
-  if (!cont) return;
-  foreach(cont[type], (listener) => {
-    listener(val1, val2, val3);
-  });
-};
-
-/**
- * Instantiates the fs_watch interface or binds listeners
- * to an existing one covering the same file system entry
- * @param {String} path
- * @param {String} fullPath absolute path
- * @param {Object} options to be passed to fs_watch
- * @param {Object} handlers container for event listener functions
- */
-const setFsWatchListener = (path, fullPath, options, handlers) => {
-  const {listener, errHandler, rawEmitter} = handlers;
-  let cont = FsWatchInstances.get(fullPath);
-
-  /** @type {fs.FSWatcher=} */
-  let watcher;
-  if (!options.persistent) {
-    watcher = createFsWatchInstance(
-      path, options, listener, errHandler, rawEmitter
-    );
-    return watcher.close.bind(watcher);
-  }
-  if (cont) {
-    addAndConvert(cont, KEY_LISTENERS, listener);
-    addAndConvert(cont, KEY_ERR, errHandler);
-    addAndConvert(cont, KEY_RAW, rawEmitter);
-  } else {
-    watcher = createFsWatchInstance(
-      path,
-      options,
-      fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS),
-      errHandler, // no need to use broadcast here
-      fsWatchBroadcast.bind(null, fullPath, KEY_RAW)
-    );
-    if (!watcher) return;
-    watcher.on(EV_ERROR, async (error) => {
-      const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);
-      cont.watcherUnusable = true; // documented since Node 10.4.1
-      // Workaround for https://github.com/joyent/node/issues/4337
-      if (isWindows && error.code === 'EPERM') {
-        try {
-          const fd = await open(path, 'r');
-          await close(fd);
-          broadcastErr(error);
-        } catch (err) {}
-      } else {
-        broadcastErr(error);
-      }
-    });
-    cont = {
-      listeners: listener,
-      errHandlers: errHandler,
-      rawEmitters: rawEmitter,
-      watcher
-    };
-    FsWatchInstances.set(fullPath, cont);
-  }
-  // const index = cont.listeners.indexOf(listener);
-
-  // removes this instance's listeners and closes the underlying fs_watch
-  // instance if there are no more listeners left
-  return () => {
-    delFromSet(cont, KEY_LISTENERS, listener);
-    delFromSet(cont, KEY_ERR, errHandler);
-    delFromSet(cont, KEY_RAW, rawEmitter);
-    if (isEmptySet(cont.listeners)) {
-      // Check to protect against issue gh-730.
-      // if (cont.watcherUnusable) {
-      cont.watcher.close();
-      // }
-      FsWatchInstances.delete(fullPath);
-      HANDLER_KEYS.forEach(clearItem(cont));
-      cont.watcher = undefined;
-      Object.freeze(cont);
-    }
-  };
-};
-
-// fs_watchFile helpers
-
-// object to hold per-process fs_watchFile instances
-// (may be shared across chokidar FSWatcher instances)
-const FsWatchFileInstances = new Map();
-
-/**
- * Instantiates the fs_watchFile interface or binds listeners
- * to an existing one covering the same file system entry
- * @param {String} path to be watched
- * @param {String} fullPath absolute path
- * @param {Object} options options to be passed to fs_watchFile
- * @param {Object} handlers container for event listener functions
- * @returns {Function} closer
- */
-const setFsWatchFileListener = (path, fullPath, options, handlers) => {
-  const {listener, rawEmitter} = handlers;
-  let cont = FsWatchFileInstances.get(fullPath);
-
-  /* eslint-disable no-unused-vars, prefer-destructuring */
-  let listeners = new Set();
-  let rawEmitters = new Set();
-
-  const copts = cont && cont.options;
-  if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {
-    // "Upgrade" the watcher to persistence or a quicker interval.
-    // This creates some unlikely edge case issues if the user mixes
-    // settings in a very weird way, but solving for those cases
-    // doesn't seem worthwhile for the added complexity.
-    listeners = cont.listeners;
-    rawEmitters = cont.rawEmitters;
-    fs.unwatchFile(fullPath);
-    cont = undefined;
-  }
-
-  /* eslint-enable no-unused-vars, prefer-destructuring */
-
-  if (cont) {
-    addAndConvert(cont, KEY_LISTENERS, listener);
-    addAndConvert(cont, KEY_RAW, rawEmitter);
-  } else {
-    // TODO
-    // listeners.add(listener);
-    // rawEmitters.add(rawEmitter);
-    cont = {
-      listeners: listener,
-      rawEmitters: rawEmitter,
-      options,
-      watcher: fs.watchFile(fullPath, options, (curr, prev) => {
-        foreach(cont.rawEmitters, (rawEmitter) => {
-          rawEmitter(EV_CHANGE, fullPath, {curr, prev});
-        });
-        const currmtime = curr.mtimeMs;
-        if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {
-          foreach(cont.listeners, (listener) => listener(path, curr));
-        }
-      })
-    };
-    FsWatchFileInstances.set(fullPath, cont);
-  }
-  // const index = cont.listeners.indexOf(listener);
-
-  // Removes this instance's listeners and closes the underlying fs_watchFile
-  // instance if there are no more listeners left.
-  return () => {
-    delFromSet(cont, KEY_LISTENERS, listener);
-    delFromSet(cont, KEY_RAW, rawEmitter);
-    if (isEmptySet(cont.listeners)) {
-      FsWatchFileInstances.delete(fullPath);
-      fs.unwatchFile(fullPath);
-      cont.options = cont.watcher = undefined;
-      Object.freeze(cont);
-    }
-  };
-};
-
-/**
- * @mixin
- */
-class NodeFsHandler {
-
-/**
- * @param {import("../index").FSWatcher} fsW
- */
-constructor(fsW) {
-  this.fsw = fsW;
-  this._boundHandleError = (error) => fsW._handleError(error);
-}
-
-/**
- * Watch file for changes with fs_watchFile or fs_watch.
- * @param {String} path to file or dir
- * @param {Function} listener on fs change
- * @returns {Function} closer for the watcher instance
- */
-_watchWithNodeFs(path, listener) {
-  const opts = this.fsw.options;
-  const directory = sysPath.dirname(path);
-  const basename = sysPath.basename(path);
-  const parent = this.fsw._getWatchedDir(directory);
-  parent.add(basename);
-  const absolutePath = sysPath.resolve(path);
-  const options = {persistent: opts.persistent};
-  if (!listener) listener = EMPTY_FN;
-
-  let closer;
-  if (opts.usePolling) {
-    options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ?
-      opts.binaryInterval : opts.interval;
-    closer = setFsWatchFileListener(path, absolutePath, options, {
-      listener,
-      rawEmitter: this.fsw._emitRaw
-    });
-  } else {
-    closer = setFsWatchListener(path, absolutePath, options, {
-      listener,
-      errHandler: this._boundHandleError,
-      rawEmitter: this.fsw._emitRaw
-    });
-  }
-  return closer;
-}
-
-/**
- * Watch a file and emit add event if warranted.
- * @param {Path} file Path
- * @param {fs.Stats} stats result of fs_stat
- * @param {Boolean} initialAdd was the file added at watch instantiation?
- * @returns {Function} closer for the watcher instance
- */
-_handleFile(file, stats, initialAdd) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const dirname = sysPath.dirname(file);
-  const basename = sysPath.basename(file);
-  const parent = this.fsw._getWatchedDir(dirname);
-  // stats is always present
-  let prevStats = stats;
-
-  // if the file is already being watched, do nothing
-  if (parent.has(basename)) return;
-
-  const listener = async (path, newStats) => {
-    if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return;
-    if (!newStats || newStats.mtimeMs === 0) {
-      try {
-        const newStats = await stat(file);
-        if (this.fsw.closed) return;
-        // Check that change event was not fired because of changed only accessTime.
-        const at = newStats.atimeMs;
-        const mt = newStats.mtimeMs;
-        if (!at || at <= mt || mt !== prevStats.mtimeMs) {
-          this.fsw._emit(EV_CHANGE, file, newStats);
-        }
-        if (isLinux && prevStats.ino !== newStats.ino) {
-          this.fsw._closeFile(path)
-          prevStats = newStats;
-          this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener));
-        } else {
-          prevStats = newStats;
-        }
-      } catch (error) {
-        // Fix issues where mtime is null but file is still present
-        this.fsw._remove(dirname, basename);
-      }
-      // add is about to be emitted if file not already tracked in parent
-    } else if (parent.has(basename)) {
-      // Check that change event was not fired because of changed only accessTime.
-      const at = newStats.atimeMs;
-      const mt = newStats.mtimeMs;
-      if (!at || at <= mt || mt !== prevStats.mtimeMs) {
-        this.fsw._emit(EV_CHANGE, file, newStats);
-      }
-      prevStats = newStats;
-    }
-  }
-  // kick off the watcher
-  const closer = this._watchWithNodeFs(file, listener);
-
-  // emit an add event if we're supposed to
-  if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {
-    if (!this.fsw._throttle(EV_ADD, file, 0)) return;
-    this.fsw._emit(EV_ADD, file, stats);
-  }
-
-  return closer;
-}
-
-/**
- * Handle symlinks encountered while reading a dir.
- * @param {Object} entry returned by readdirp
- * @param {String} directory path of dir being read
- * @param {String} path of this item
- * @param {String} item basename of this item
- * @returns {Promise<Boolean>} true if no more processing is needed for this entry.
- */
-async _handleSymlink(entry, directory, path, item) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const full = entry.fullPath;
-  const dir = this.fsw._getWatchedDir(directory);
-
-  if (!this.fsw.options.followSymlinks) {
-    // watch symlink directly (don't follow) and detect changes
-    this.fsw._incrReadyCount();
-
-    let linkPath;
-    try {
-      linkPath = await fsrealpath(path);
-    } catch (e) {
-      this.fsw._emitReady();
-      return true;
-    }
-
-    if (this.fsw.closed) return;
-    if (dir.has(item)) {
-      if (this.fsw._symlinkPaths.get(full) !== linkPath) {
-        this.fsw._symlinkPaths.set(full, linkPath);
-        this.fsw._emit(EV_CHANGE, path, entry.stats);
-      }
-    } else {
-      dir.add(item);
-      this.fsw._symlinkPaths.set(full, linkPath);
-      this.fsw._emit(EV_ADD, path, entry.stats);
-    }
-    this.fsw._emitReady();
-    return true;
-  }
-
-  // don't follow the same symlink more than once
-  if (this.fsw._symlinkPaths.has(full)) {
-    return true;
-  }
-
-  this.fsw._symlinkPaths.set(full, true);
-}
-
-_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {
-  // Normalize the directory name on Windows
-  directory = sysPath.join(directory, EMPTY_STR);
-
-  if (!wh.hasGlob) {
-    throttler = this.fsw._throttle('readdir', directory, 1000);
-    if (!throttler) return;
-  }
-
-  const previous = this.fsw._getWatchedDir(wh.path);
-  const current = new Set();
-
-  let stream = this.fsw._readdirp(directory, {
-    fileFilter: entry => wh.filterPath(entry),
-    directoryFilter: entry => wh.filterDir(entry),
-    depth: 0
-  }).on(STR_DATA, async (entry) => {
-    if (this.fsw.closed) {
-      stream = undefined;
-      return;
-    }
-    const item = entry.path;
-    let path = sysPath.join(directory, item);
-    current.add(item);
-
-    if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) {
-      return;
-    }
-
-    if (this.fsw.closed) {
-      stream = undefined;
-      return;
-    }
-    // Files that present in current directory snapshot
-    // but absent in previous are added to watch list and
-    // emit `add` event.
-    if (item === target || !target && !previous.has(item)) {
-      this.fsw._incrReadyCount();
-
-      // ensure relativeness of path is preserved in case of watcher reuse
-      path = sysPath.join(dir, sysPath.relative(dir, path));
-
-      this._addToNodeFs(path, initialAdd, wh, depth + 1);
-    }
-  }).on(EV_ERROR, this._boundHandleError);
-
-  return new Promise(resolve =>
-    stream.once(STR_END, () => {
-      if (this.fsw.closed) {
-        stream = undefined;
-        return;
-      }
-      const wasThrottled = throttler ? throttler.clear() : false;
-
-      resolve();
-
-      // Files that absent in current directory snapshot
-      // but present in previous emit `remove` event
-      // and are removed from @watched[directory].
-      previous.getChildren().filter((item) => {
-        return item !== directory &&
-          !current.has(item) &&
-          // in case of intersecting globs;
-          // a path may have been filtered out of this readdir, but
-          // shouldn't be removed because it matches a different glob
-          (!wh.hasGlob || wh.filterPath({
-            fullPath: sysPath.resolve(directory, item)
-          }));
-      }).forEach((item) => {
-        this.fsw._remove(directory, item);
-      });
-
-      stream = undefined;
-
-      // one more time for any missed in case changes came in extremely quickly
-      if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler);
-    })
-  );
-}
-
-/**
- * Read directory to add / remove files from `@watched` list and re-read it on change.
- * @param {String} dir fs path
- * @param {fs.Stats} stats
- * @param {Boolean} initialAdd
- * @param {Number} depth relative to user-supplied path
- * @param {String} target child path targeted for watch
- * @param {Object} wh Common watch helpers for this path
- * @param {String} realpath
- * @returns {Promise<Function>} closer for the watcher instance.
- */
-async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {
-  const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));
-  const tracked = parentDir.has(sysPath.basename(dir));
-  if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {
-    if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats);
-  }
-
-  // ensure dir is tracked (harmless if redundant)
-  parentDir.add(sysPath.basename(dir));
-  this.fsw._getWatchedDir(dir);
-  let throttler;
-  let closer;
-
-  const oDepth = this.fsw.options.depth;
-  if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {
-    if (!target) {
-      await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);
-      if (this.fsw.closed) return;
-    }
-
-    closer = this._watchWithNodeFs(dir, (dirPath, stats) => {
-      // if current directory is removed, do nothing
-      if (stats && stats.mtimeMs === 0) return;
-
-      this._handleRead(dirPath, false, wh, target, dir, depth, throttler);
-    });
-  }
-  return closer;
-}
-
-/**
- * Handle added file, directory, or glob pattern.
- * Delegates call to _handleFile / _handleDir after checks.
- * @param {String} path to file or ir
- * @param {Boolean} initialAdd was the file added at watch instantiation?
- * @param {Object} priorWh depth relative to user-supplied path
- * @param {Number} depth Child path actually targeted for watch
- * @param {String=} target Child path actually targeted for watch
- * @returns {Promise}
- */
-async _addToNodeFs(path, initialAdd, priorWh, depth, target) {
-  const ready = this.fsw._emitReady;
-  if (this.fsw._isIgnored(path) || this.fsw.closed) {
-    ready();
-    return false;
-  }
-
-  const wh = this.fsw._getWatchHelpers(path, depth);
-  if (!wh.hasGlob && priorWh) {
-    wh.hasGlob = priorWh.hasGlob;
-    wh.globFilter = priorWh.globFilter;
-    wh.filterPath = entry => priorWh.filterPath(entry);
-    wh.filterDir = entry => priorWh.filterDir(entry);
-  }
-
-  // evaluate what is at the path we're being asked to watch
-  try {
-    const stats = await statMethods[wh.statMethod](wh.watchPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(wh.watchPath, stats)) {
-      ready();
-      return false;
-    }
-
-    const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START);
-    let closer;
-    if (stats.isDirectory()) {
-      const absPath = sysPath.resolve(path);
-      const targetPath = follow ? await fsrealpath(path) : path;
-      if (this.fsw.closed) return;
-      closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);
-      if (this.fsw.closed) return;
-      // preserve this symlink's target path
-      if (absPath !== targetPath && targetPath !== undefined) {
-        this.fsw._symlinkPaths.set(absPath, targetPath);
-      }
-    } else if (stats.isSymbolicLink()) {
-      const targetPath = follow ? await fsrealpath(path) : path;
-      if (this.fsw.closed) return;
-      const parent = sysPath.dirname(wh.watchPath);
-      this.fsw._getWatchedDir(parent).add(wh.watchPath);
-      this.fsw._emit(EV_ADD, wh.watchPath, stats);
-      closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);
-      if (this.fsw.closed) return;
-
-      // preserve this symlink's target path
-      if (targetPath !== undefined) {
-        this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);
-      }
-    } else {
-      closer = this._handleFile(wh.watchPath, stats, initialAdd);
-    }
-    ready();
-
-    this.fsw._addPathCloser(path, closer);
-    return false;
-
-  } catch (error) {
-    if (this.fsw._handleError(error)) {
-      ready();
-      return path;
-    }
-  }
-}
-
-}
-
-module.exports = NodeFsHandler;
Index: de_modules/chokidar/package.json
===================================================================
--- node_modules/chokidar/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,70 +1,0 @@
-{
-  "name": "chokidar",
-  "description": "Minimal and efficient cross-platform file watching library",
-  "version": "3.6.0",
-  "homepage": "https://github.com/paulmillr/chokidar",
-  "author": "Paul Miller (https://paulmillr.com)",
-  "contributors": [
-    "Paul Miller (https://paulmillr.com)",
-    "Elan Shanker"
-  ],
-  "engines": {
-    "node": ">= 8.10.0"
-  },
-  "main": "index.js",
-  "types": "./types/index.d.ts",
-  "dependencies": {
-    "anymatch": "~3.1.2",
-    "braces": "~3.0.2",
-    "glob-parent": "~5.1.2",
-    "is-binary-path": "~2.1.0",
-    "is-glob": "~4.0.1",
-    "normalize-path": "~3.0.0",
-    "readdirp": "~3.6.0"
-  },
-  "optionalDependencies": {
-    "fsevents": "~2.3.2"
-  },
-  "devDependencies": {
-    "@types/node": "^14",
-    "chai": "^4.3",
-    "dtslint": "^3.3.0",
-    "eslint": "^7.0.0",
-    "mocha": "^7.0.0",
-    "rimraf": "^3.0.0",
-    "sinon": "^9.0.1",
-    "sinon-chai": "^3.3.0",
-    "typescript": "^4.4.3",
-    "upath": "^1.2.0"
-  },
-  "files": [
-    "index.js",
-    "lib/*.js",
-    "types/index.d.ts"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/paulmillr/chokidar.git"
-  },
-  "bugs": {
-    "url": "https://github.com/paulmillr/chokidar/issues"
-  },
-  "license": "MIT",
-  "scripts": {
-    "dtslint": "dtslint types",
-    "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .",
-    "build": "npm ls",
-    "mocha": "mocha --exit --timeout 90000",
-    "test": "npm run lint && npm run mocha"
-  },
-  "keywords": [
-    "fs",
-    "watch",
-    "watchFile",
-    "watcher",
-    "watching",
-    "file",
-    "fsevents"
-  ],
-  "funding": "https://paulmillr.com/funding/"
-}
Index: de_modules/chokidar/types/index.d.ts
===================================================================
--- node_modules/chokidar/types/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,192 +1,0 @@
-// TypeScript Version: 3.0
-
-/// <reference types="node" />
-
-import * as fs from "fs";
-import { EventEmitter } from "events";
-import { Matcher } from 'anymatch';
-
-export class FSWatcher extends EventEmitter implements fs.FSWatcher {
-  options: WatchOptions;
-
-  /**
-   * Constructs a new FSWatcher instance with optional WatchOptions parameter.
-   */
-  constructor(options?: WatchOptions);
-
-  /**
-   * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one
-   * string.
-   */
-  add(paths: string | ReadonlyArray<string>): this;
-
-  /**
-   * Stop watching files, directories, or glob patterns. Takes an array of strings or just one
-   * string.
-   */
-  unwatch(paths: string | ReadonlyArray<string>): this;
-
-  /**
-   * Returns an object representing all the paths on the file system being watched by this
-   * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless
-   * the `cwd` option was used), and the values are arrays of the names of the items contained in
-   * each directory.
-   */
-  getWatched(): {
-    [directory: string]: string[];
-  };
-
-  /**
-   * Removes all listeners from watched files.
-   */
-  close(): Promise<void>;
-
-  on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this;
-
-  on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this;
-
-  /**
-   * Error occurred
-   */
-  on(event: 'error', listener: (error: Error) => void): this;
-
-  /**
-   * Exposes the native Node `fs.FSWatcher events`
-   */
-  on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this;
-
-  /**
-   * Fires when the initial scan is complete
-   */
-  on(event: 'ready', listener: () => void): this;
-
-  on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-
-  ref(): this;
-  
-  unref(): this;
-}
-
-export interface WatchOptions {
-  /**
-   * Indicates whether the process should continue to run as long as files are being watched. If
-   * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`,
-   * even if the process continues to run.
-   */
-  persistent?: boolean;
-
-  /**
-   * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to
-   * be ignored. The whole relative or absolute path is tested, not just filename. If a function
-   * with two arguments is provided, it gets called twice per path - once with a single argument
-   * (the path), second time with two arguments (the path and the
-   * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path).
-   */
-  ignored?: Matcher;
-
-  /**
-   * If set to `false` then `add`/`addDir` events are also emitted for matching paths while
-   * instantiating the watching as chokidar discovers these file paths (before the `ready` event).
-   */
-  ignoreInitial?: boolean;
-
-  /**
-   * When `false`, only the symlinks themselves will be watched for changes instead of following
-   * the link references and bubbling events through the link's path.
-   */
-  followSymlinks?: boolean;
-
-  /**
-   * The base directory from which watch `paths` are to be derived. Paths emitted with events will
-   * be relative to this.
-   */
-  cwd?: string;
-
-  /**
-   *  If set to true then the strings passed to .watch() and .add() are treated as literal path
-   *  names, even if they look like globs. Default: false.
-   */
-  disableGlobbing?: boolean;
-
-  /**
-   * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU
-   * utilization, consider setting this to `false`. It is typically necessary to **set this to
-   * `true` to successfully watch files over a network**, and it may be necessary to successfully
-   * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides
-   * the `useFsEvents` default.
-   */
-  usePolling?: boolean;
-
-  /**
-   * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly
-   * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on
-   * OS X, `usePolling: true` becomes the default.
-   */
-  useFsEvents?: boolean;
-
-  /**
-   * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that
-   * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is
-   * provided even in cases where it wasn't already available from the underlying watch events.
-   */
-  alwaysStat?: boolean;
-
-  /**
-   * If set, limits how many levels of subdirectories will be traversed.
-   */
-  depth?: number;
-
-  /**
-   * Interval of file system polling.
-   */
-  interval?: number;
-
-  /**
-   * Interval of file system polling for binary files. ([see list of binary extensions](https://gi
-   * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json))
-   */
-  binaryInterval?: number;
-
-  /**
-   *  Indicates whether to watch files that don't have read permissions if possible. If watching
-   *  fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed
-   *  silently.
-   */
-  ignorePermissionErrors?: boolean;
-
-  /**
-   * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts
-   * that occur when using editors that use "atomic writes" instead of writing directly to the
-   * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change`
-   * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you,
-   * you can override it by setting `atomic` to a custom value, in milliseconds.
-   */
-  atomic?: boolean | number;
-
-  /**
-   * can be set to an object in order to adjust timing params:
-   */
-  awaitWriteFinish?: AwaitWriteFinishOptions | boolean;
-}
-
-export interface AwaitWriteFinishOptions {
-  /**
-   * Amount of time in milliseconds for a file size to remain constant before emitting its event.
-   */
-  stabilityThreshold?: number;
-
-  /**
-   * File size polling interval.
-   */
-  pollInterval?: number;
-}
-
-/**
- * produces an instance of `FSWatcher`.
- */
-export function watch(
-  paths: string | ReadonlyArray<string>,
-  options?: WatchOptions
-): FSWatcher;
Index: de_modules/debug/LICENSE
===================================================================
--- node_modules/debug/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2018-2021 Josh Junon
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-and associated documentation files (the 'Software'), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial
-portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
Index: de_modules/debug/README.md
===================================================================
--- node_modules/debug/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,481 +1,0 @@
-# debug
-[![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
-[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
-
-<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
-
-A tiny JavaScript debugging utility modelled after Node.js core's debugging
-technique. Works in Node.js and web browsers.
-
-## Installation
-
-```bash
-$ npm install debug
-```
-
-## Usage
-
-`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
-
-Example [_app.js_](./examples/node/app.js):
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %o', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example [_worker.js_](./examples/node/worker.js):
-
-```js
-var a = require('debug')('worker:a')
-  , b = require('debug')('worker:b');
-
-function work() {
-  a('doing lots of uninteresting work');
-  setTimeout(work, Math.random() * 1000);
-}
-
-work();
-
-function workb() {
-  b('doing some work');
-  setTimeout(workb, Math.random() * 2000);
-}
-
-workb();
-```
-
-The `DEBUG` environment variable is then used to enable these based on space or
-comma-delimited names.
-
-Here are some examples:
-
-<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
-<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
-<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
-
-#### Windows command prompt notes
-
-##### CMD
-
-On Windows the environment variable is set using the `set` command.
-
-```cmd
-set DEBUG=*,-not_this
-```
-
-Example:
-
-```cmd
-set DEBUG=* & node app.js
-```
-
-##### PowerShell (VS Code default)
-
-PowerShell uses different syntax to set environment variables.
-
-```cmd
-$env:DEBUG = "*,-not_this"
-```
-
-Example:
-
-```cmd
-$env:DEBUG='app';node app.js
-```
-
-Then, run the program to be debugged as usual.
-
-npm script example:
-```js
-  "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
-```
-
-## Namespace Colors
-
-Every debug instance has a color generated for it based on its namespace name.
-This helps when visually parsing the debug output to identify which debug instance
-a debug line belongs to.
-
-#### Node.js
-
-In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
-the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
-otherwise debug will only use a small handful of basic colors.
-
-<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
-
-#### Web Browser
-
-Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-option. These are WebKit web inspectors, Firefox ([since version
-31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-and the Firebug plugin for Firefox (any version).
-
-<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
-
-
-## Millisecond diff
-
-When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
-
-When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
-
-<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png">
-
-
-## Conventions
-
-If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".  If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable.  You can then use it for normal output as well as debug output.
-
-## Wildcards
-
-The `*` character may be used as a wildcard. Suppose for example your library has
-debuggers named "connect:bodyParser", "connect:compress", "connect:session",
-instead of listing all three with
-`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do
-`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-You can also exclude specific debuggers by prefixing them with a "-" character.
-For example, `DEBUG=*,-connect:*` would include all debuggers except those
-starting with "connect:".
-
-## Environment Variables
-
-When running through Node.js, you can set a few environment variables that will
-change the behavior of the debug logging:
-
-| Name      | Purpose                                         |
-|-----------|-------------------------------------------------|
-| `DEBUG`   | Enables/disables specific debugging namespaces. |
-| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY).  |
-| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
-| `DEBUG_DEPTH` | Object inspection depth.                    |
-| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
-
-
-__Note:__ The environment variables beginning with `DEBUG_` end up being
-converted into an Options object that gets used with `%o`/`%O` formatters.
-See the Node.js documentation for
-[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
-for the complete list.
-
-## Formatters
-
-Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
-Below are the officially supported formatters:
-
-| Formatter | Representation |
-|-----------|----------------|
-| `%O`      | Pretty-print an Object on multiple lines. |
-| `%o`      | Pretty-print an Object all on a single line. |
-| `%s`      | String. |
-| `%d`      | Number (both integer and float). |
-| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
-| `%%`      | Single percent sign ('%'). This does not consume an argument. |
-
-
-### Custom formatters
-
-You can add custom formatters by extending the `debug.formatters` object.
-For example, if you wanted to add support for rendering a Buffer as hex with
-`%h`, you could do something like:
-
-```js
-const createDebug = require('debug')
-createDebug.formatters.h = (v) => {
-  return v.toString('hex')
-}
-
-// …elsewhere
-const debug = createDebug('foo')
-debug('this is hex: %h', new Buffer('hello world'))
-//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
-```
-
-
-## Browser Support
-
-You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
-or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
-if you don't want to build it yourself.
-
-Debug's enable state is currently persisted by `localStorage`.
-Consider the situation shown below where you have `worker:a` and `worker:b`,
-and wish to debug both. You can enable this using `localStorage.debug`:
-
-```js
-localStorage.debug = 'worker:*'
-```
-
-And then refresh the page.
-
-```js
-a = debug('worker:a');
-b = debug('worker:b');
-
-setInterval(function(){
-  a('doing some work');
-}, 1000);
-
-setInterval(function(){
-  b('doing some work');
-}, 1200);
-```
-
-In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_.
-
-<img width="647" src="https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.png">
-
-## Output streams
-
-  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
-
-Example [_stdout.js_](./examples/node/stdout.js):
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-## Extend
-You can simply extend debugger 
-```js
-const log = require('debug')('auth');
-
-//creates new debug instance with extended namespace
-const logSign = log.extend('sign');
-const logLogin = log.extend('login');
-
-log('hello'); // auth hello
-logSign('hello'); //auth:sign hello
-logLogin('hello'); //auth:login hello
-```
-
-## Set dynamically
-
-You can also enable debug dynamically by calling the `enable()` method :
-
-```js
-let debug = require('debug');
-
-console.log(1, debug.enabled('test'));
-
-debug.enable('test');
-console.log(2, debug.enabled('test'));
-
-debug.disable();
-console.log(3, debug.enabled('test'));
-
-```
-
-print :   
-```
-1 false
-2 true
-3 false
-```
-
-Usage :  
-`enable(namespaces)`  
-`namespaces` can include modes separated by a colon and wildcards.
-   
-Note that calling `enable()` completely overrides previously set DEBUG variable : 
-
-```
-$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
-=> false
-```
-
-`disable()`
-
-Will disable all namespaces. The functions returns the namespaces currently
-enabled (and skipped). This can be useful if you want to disable debugging
-temporarily without knowing what was enabled to begin with.
-
-For example:
-
-```js
-let debug = require('debug');
-debug.enable('foo:*,-foo:bar');
-let namespaces = debug.disable();
-debug.enable(namespaces);
-```
-
-Note: There is no guarantee that the string will be identical to the initial
-enable string, but semantically they will be identical.
-
-## Checking whether a debug target is enabled
-
-After you've created a debug instance, you can determine whether or not it is
-enabled by checking the `enabled` property:
-
-```javascript
-const debug = require('debug')('http');
-
-if (debug.enabled) {
-  // do stuff...
-}
-```
-
-You can also manually toggle this property to force the debug instance to be
-enabled or disabled.
-
-## Usage in child processes
-
-Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process.  
-For example:
-
-```javascript
-worker = fork(WORKER_WRAP_PATH, [workerPath], {
-  stdio: [
-    /* stdin: */ 0,
-    /* stdout: */ 'pipe',
-    /* stderr: */ 'pipe',
-    'ipc',
-  ],
-  env: Object.assign({}, process.env, {
-    DEBUG_COLORS: 1 // without this settings, colors won't be shown
-  }),
-});
-
-worker.stderr.pipe(process.stderr, { end: false });
-```
-
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
- - Andrew Rhyne
- - Josh Junon
-
-## Backers
-
-Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
-
-<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
-
-
-## Sponsors
-
-Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
-
-<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-Copyright (c) 2018-2021 Josh Junon
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/debug/package.json
===================================================================
--- node_modules/debug/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,64 +1,0 @@
-{
-  "name": "debug",
-  "version": "4.4.3",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/debug-js/debug.git"
-  },
-  "description": "Lightweight debugging utility for Node.js and the browser",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "files": [
-    "src",
-    "LICENSE",
-    "README.md"
-  ],
-  "author": "Josh Junon (https://github.com/qix-)",
-  "contributors": [
-    "TJ Holowaychuk <tj@vision-media.ca>",
-    "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
-    "Andrew Rhyne <rhyneandrew@gmail.com>"
-  ],
-  "license": "MIT",
-  "scripts": {
-    "lint": "xo",
-    "test": "npm run test:node && npm run test:browser && npm run lint",
-    "test:node": "mocha test.js test.node.js",
-    "test:browser": "karma start --single-run",
-    "test:coverage": "cat ./coverage/lcov.info | coveralls"
-  },
-  "dependencies": {
-    "ms": "^2.1.3"
-  },
-  "devDependencies": {
-    "brfs": "^2.0.1",
-    "browserify": "^16.2.3",
-    "coveralls": "^3.0.2",
-    "karma": "^3.1.4",
-    "karma-browserify": "^6.0.0",
-    "karma-chrome-launcher": "^2.2.0",
-    "karma-mocha": "^1.3.0",
-    "mocha": "^5.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "sinon": "^14.0.0",
-    "xo": "^0.23.0"
-  },
-  "peerDependenciesMeta": {
-    "supports-color": {
-      "optional": true
-    }
-  },
-  "main": "./src/index.js",
-  "browser": "./src/browser.js",
-  "engines": {
-    "node": ">=6.0"
-  },
-  "xo": {
-    "rules": {
-      "import/extensions": "off"
-    }
-  }
-}
Index: de_modules/debug/src/browser.js
===================================================================
--- node_modules/debug/src/browser.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,272 +1,0 @@
-/* eslint-env browser */
-
-/**
- * This is the web browser implementation of `debug()`.
- */
-
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = localstorage();
-exports.destroy = (() => {
-	let warned = false;
-
-	return () => {
-		if (!warned) {
-			warned = true;
-			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-		}
-	};
-})();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-	'#0000CC',
-	'#0000FF',
-	'#0033CC',
-	'#0033FF',
-	'#0066CC',
-	'#0066FF',
-	'#0099CC',
-	'#0099FF',
-	'#00CC00',
-	'#00CC33',
-	'#00CC66',
-	'#00CC99',
-	'#00CCCC',
-	'#00CCFF',
-	'#3300CC',
-	'#3300FF',
-	'#3333CC',
-	'#3333FF',
-	'#3366CC',
-	'#3366FF',
-	'#3399CC',
-	'#3399FF',
-	'#33CC00',
-	'#33CC33',
-	'#33CC66',
-	'#33CC99',
-	'#33CCCC',
-	'#33CCFF',
-	'#6600CC',
-	'#6600FF',
-	'#6633CC',
-	'#6633FF',
-	'#66CC00',
-	'#66CC33',
-	'#9900CC',
-	'#9900FF',
-	'#9933CC',
-	'#9933FF',
-	'#99CC00',
-	'#99CC33',
-	'#CC0000',
-	'#CC0033',
-	'#CC0066',
-	'#CC0099',
-	'#CC00CC',
-	'#CC00FF',
-	'#CC3300',
-	'#CC3333',
-	'#CC3366',
-	'#CC3399',
-	'#CC33CC',
-	'#CC33FF',
-	'#CC6600',
-	'#CC6633',
-	'#CC9900',
-	'#CC9933',
-	'#CCCC00',
-	'#CCCC33',
-	'#FF0000',
-	'#FF0033',
-	'#FF0066',
-	'#FF0099',
-	'#FF00CC',
-	'#FF00FF',
-	'#FF3300',
-	'#FF3333',
-	'#FF3366',
-	'#FF3399',
-	'#FF33CC',
-	'#FF33FF',
-	'#FF6600',
-	'#FF6633',
-	'#FF9900',
-	'#FF9933',
-	'#FFCC00',
-	'#FFCC33'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-// eslint-disable-next-line complexity
-function useColors() {
-	// NB: In an Electron preload script, document will be defined but not fully
-	// initialized. Since we know we're in Chrome, we'll just detect this case
-	// explicitly
-	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
-		return true;
-	}
-
-	// Internet Explorer and Edge do not support colors.
-	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
-		return false;
-	}
-
-	let m;
-
-	// Is webkit? http://stackoverflow.com/a/16459606/376773
-	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-	// eslint-disable-next-line no-return-assign
-	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
-		// Is firebug? http://stackoverflow.com/a/398120/376773
-		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
-		// Is firefox >= v31?
-		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-		(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) ||
-		// Double check webkit in userAgent just in case we are in a worker
-		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-	args[0] = (this.useColors ? '%c' : '') +
-		this.namespace +
-		(this.useColors ? ' %c' : ' ') +
-		args[0] +
-		(this.useColors ? '%c ' : ' ') +
-		'+' + module.exports.humanize(this.diff);
-
-	if (!this.useColors) {
-		return;
-	}
-
-	const c = 'color: ' + this.color;
-	args.splice(1, 0, c, 'color: inherit');
-
-	// The final "%c" is somewhat tricky, because there could be other
-	// arguments passed either before or after the %c, so we need to
-	// figure out the correct index to insert the CSS into
-	let index = 0;
-	let lastC = 0;
-	args[0].replace(/%[a-zA-Z%]/g, match => {
-		if (match === '%%') {
-			return;
-		}
-		index++;
-		if (match === '%c') {
-			// We only are interested in the *last* %c
-			// (the user may have provided their own)
-			lastC = index;
-		}
-	});
-
-	args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.debug()` when available.
- * No-op when `console.debug` is not a "function".
- * If `console.debug` is not available, falls back
- * to `console.log`.
- *
- * @api public
- */
-exports.log = console.debug || console.log || (() => {});
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-function save(namespaces) {
-	try {
-		if (namespaces) {
-			exports.storage.setItem('debug', namespaces);
-		} else {
-			exports.storage.removeItem('debug');
-		}
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-function load() {
-	let r;
-	try {
-		r = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-
-	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-	if (!r && typeof process !== 'undefined' && 'env' in process) {
-		r = process.env.DEBUG;
-	}
-
-	return r;
-}
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-	try {
-		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
-		// The Browser also has localStorage in the global context.
-		return localStorage;
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-}
-
-module.exports = require('./common')(exports);
-
-const {formatters} = module.exports;
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-formatters.j = function (v) {
-	try {
-		return JSON.stringify(v);
-	} catch (error) {
-		return '[UnexpectedJSONParseError]: ' + error.message;
-	}
-};
Index: de_modules/debug/src/common.js
===================================================================
--- node_modules/debug/src/common.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,292 +1,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- */
-
-function setup(env) {
-	createDebug.debug = createDebug;
-	createDebug.default = createDebug;
-	createDebug.coerce = coerce;
-	createDebug.disable = disable;
-	createDebug.enable = enable;
-	createDebug.enabled = enabled;
-	createDebug.humanize = require('ms');
-	createDebug.destroy = destroy;
-
-	Object.keys(env).forEach(key => {
-		createDebug[key] = env[key];
-	});
-
-	/**
-	* The currently active debug mode names, and names to skip.
-	*/
-
-	createDebug.names = [];
-	createDebug.skips = [];
-
-	/**
-	* Map of special "%n" handling functions, for the debug "format" argument.
-	*
-	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
-	*/
-	createDebug.formatters = {};
-
-	/**
-	* Selects a color for a debug namespace
-	* @param {String} namespace The namespace string for the debug instance to be colored
-	* @return {Number|String} An ANSI color code for the given namespace
-	* @api private
-	*/
-	function selectColor(namespace) {
-		let hash = 0;
-
-		for (let i = 0; i < namespace.length; i++) {
-			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
-			hash |= 0; // Convert to 32bit integer
-		}
-
-		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
-	}
-	createDebug.selectColor = selectColor;
-
-	/**
-	* Create a debugger with the given `namespace`.
-	*
-	* @param {String} namespace
-	* @return {Function}
-	* @api public
-	*/
-	function createDebug(namespace) {
-		let prevTime;
-		let enableOverride = null;
-		let namespacesCache;
-		let enabledCache;
-
-		function debug(...args) {
-			// Disabled?
-			if (!debug.enabled) {
-				return;
-			}
-
-			const self = debug;
-
-			// Set `diff` timestamp
-			const curr = Number(new Date());
-			const ms = curr - (prevTime || curr);
-			self.diff = ms;
-			self.prev = prevTime;
-			self.curr = curr;
-			prevTime = curr;
-
-			args[0] = createDebug.coerce(args[0]);
-
-			if (typeof args[0] !== 'string') {
-				// Anything else let's inspect with %O
-				args.unshift('%O');
-			}
-
-			// Apply any `formatters` transformations
-			let index = 0;
-			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
-				// If we encounter an escaped % then don't increase the array index
-				if (match === '%%') {
-					return '%';
-				}
-				index++;
-				const formatter = createDebug.formatters[format];
-				if (typeof formatter === 'function') {
-					const val = args[index];
-					match = formatter.call(self, val);
-
-					// Now we need to remove `args[index]` since it's inlined in the `format`
-					args.splice(index, 1);
-					index--;
-				}
-				return match;
-			});
-
-			// Apply env-specific formatting (colors, etc.)
-			createDebug.formatArgs.call(self, args);
-
-			const logFn = self.log || createDebug.log;
-			logFn.apply(self, args);
-		}
-
-		debug.namespace = namespace;
-		debug.useColors = createDebug.useColors();
-		debug.color = createDebug.selectColor(namespace);
-		debug.extend = extend;
-		debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
-
-		Object.defineProperty(debug, 'enabled', {
-			enumerable: true,
-			configurable: false,
-			get: () => {
-				if (enableOverride !== null) {
-					return enableOverride;
-				}
-				if (namespacesCache !== createDebug.namespaces) {
-					namespacesCache = createDebug.namespaces;
-					enabledCache = createDebug.enabled(namespace);
-				}
-
-				return enabledCache;
-			},
-			set: v => {
-				enableOverride = v;
-			}
-		});
-
-		// Env-specific initialization logic for debug instances
-		if (typeof createDebug.init === 'function') {
-			createDebug.init(debug);
-		}
-
-		return debug;
-	}
-
-	function extend(namespace, delimiter) {
-		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
-		newDebug.log = this.log;
-		return newDebug;
-	}
-
-	/**
-	* Enables a debug mode by namespaces. This can include modes
-	* separated by a colon and wildcards.
-	*
-	* @param {String} namespaces
-	* @api public
-	*/
-	function enable(namespaces) {
-		createDebug.save(namespaces);
-		createDebug.namespaces = namespaces;
-
-		createDebug.names = [];
-		createDebug.skips = [];
-
-		const split = (typeof namespaces === 'string' ? namespaces : '')
-			.trim()
-			.replace(/\s+/g, ',')
-			.split(',')
-			.filter(Boolean);
-
-		for (const ns of split) {
-			if (ns[0] === '-') {
-				createDebug.skips.push(ns.slice(1));
-			} else {
-				createDebug.names.push(ns);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the given string matches a namespace template, honoring
-	 * asterisks as wildcards.
-	 *
-	 * @param {String} search
-	 * @param {String} template
-	 * @return {Boolean}
-	 */
-	function matchesTemplate(search, template) {
-		let searchIndex = 0;
-		let templateIndex = 0;
-		let starIndex = -1;
-		let matchIndex = 0;
-
-		while (searchIndex < search.length) {
-			if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
-				// Match character or proceed with wildcard
-				if (template[templateIndex] === '*') {
-					starIndex = templateIndex;
-					matchIndex = searchIndex;
-					templateIndex++; // Skip the '*'
-				} else {
-					searchIndex++;
-					templateIndex++;
-				}
-			} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
-				// Backtrack to the last '*' and try to match more characters
-				templateIndex = starIndex + 1;
-				matchIndex++;
-				searchIndex = matchIndex;
-			} else {
-				return false; // No match
-			}
-		}
-
-		// Handle trailing '*' in template
-		while (templateIndex < template.length && template[templateIndex] === '*') {
-			templateIndex++;
-		}
-
-		return templateIndex === template.length;
-	}
-
-	/**
-	* Disable debug output.
-	*
-	* @return {String} namespaces
-	* @api public
-	*/
-	function disable() {
-		const namespaces = [
-			...createDebug.names,
-			...createDebug.skips.map(namespace => '-' + namespace)
-		].join(',');
-		createDebug.enable('');
-		return namespaces;
-	}
-
-	/**
-	* Returns true if the given mode name is enabled, false otherwise.
-	*
-	* @param {String} name
-	* @return {Boolean}
-	* @api public
-	*/
-	function enabled(name) {
-		for (const skip of createDebug.skips) {
-			if (matchesTemplate(name, skip)) {
-				return false;
-			}
-		}
-
-		for (const ns of createDebug.names) {
-			if (matchesTemplate(name, ns)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	* Coerce `val`.
-	*
-	* @param {Mixed} val
-	* @return {Mixed}
-	* @api private
-	*/
-	function coerce(val) {
-		if (val instanceof Error) {
-			return val.stack || val.message;
-		}
-		return val;
-	}
-
-	/**
-	* XXX DO NOT USE. This is a temporary stub function.
-	* XXX It WILL be removed in the next major release.
-	*/
-	function destroy() {
-		console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-	}
-
-	createDebug.enable(createDebug.load());
-
-	return createDebug;
-}
-
-module.exports = setup;
Index: de_modules/debug/src/index.js
===================================================================
--- node_modules/debug/src/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,10 +1,0 @@
-/**
- * Detect Electron renderer / nwjs process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
-	module.exports = require('./browser.js');
-} else {
-	module.exports = require('./node.js');
-}
Index: de_modules/debug/src/node.js
===================================================================
--- node_modules/debug/src/node.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,263 +1,0 @@
-/**
- * Module dependencies.
- */
-
-const tty = require('tty');
-const util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- */
-
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.destroy = util.deprecate(
-	() => {},
-	'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
-);
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-try {
-	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
-	// eslint-disable-next-line import/no-extraneous-dependencies
-	const supportsColor = require('supports-color');
-
-	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
-		exports.colors = [
-			20,
-			21,
-			26,
-			27,
-			32,
-			33,
-			38,
-			39,
-			40,
-			41,
-			42,
-			43,
-			44,
-			45,
-			56,
-			57,
-			62,
-			63,
-			68,
-			69,
-			74,
-			75,
-			76,
-			77,
-			78,
-			79,
-			80,
-			81,
-			92,
-			93,
-			98,
-			99,
-			112,
-			113,
-			128,
-			129,
-			134,
-			135,
-			148,
-			149,
-			160,
-			161,
-			162,
-			163,
-			164,
-			165,
-			166,
-			167,
-			168,
-			169,
-			170,
-			171,
-			172,
-			173,
-			178,
-			179,
-			184,
-			185,
-			196,
-			197,
-			198,
-			199,
-			200,
-			201,
-			202,
-			203,
-			204,
-			205,
-			206,
-			207,
-			208,
-			209,
-			214,
-			215,
-			220,
-			221
-		];
-	}
-} catch (error) {
-	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
-}
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(key => {
-	return /^debug_/i.test(key);
-}).reduce((obj, key) => {
-	// Camel-case
-	const prop = key
-		.substring(6)
-		.toLowerCase()
-		.replace(/_([a-z])/g, (_, k) => {
-			return k.toUpperCase();
-		});
-
-	// Coerce string value into JS value
-	let val = process.env[key];
-	if (/^(yes|on|true|enabled)$/i.test(val)) {
-		val = true;
-	} else if (/^(no|off|false|disabled)$/i.test(val)) {
-		val = false;
-	} else if (val === 'null') {
-		val = null;
-	} else {
-		val = Number(val);
-	}
-
-	obj[prop] = val;
-	return obj;
-}, {});
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-	return 'colors' in exports.inspectOpts ?
-		Boolean(exports.inspectOpts.colors) :
-		tty.isatty(process.stderr.fd);
-}
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-	const {namespace: name, useColors} = this;
-
-	if (useColors) {
-		const c = this.color;
-		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
-		const prefix = `  ${colorCode};1m${name} \u001B[0m`;
-
-		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
-	} else {
-		args[0] = getDate() + name + ' ' + args[0];
-	}
-}
-
-function getDate() {
-	if (exports.inspectOpts.hideDate) {
-		return '';
-	}
-	return new Date().toISOString() + ' ';
-}
-
-/**
- * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.
- */
-
-function log(...args) {
-	return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-function save(namespaces) {
-	if (namespaces) {
-		process.env.DEBUG = namespaces;
-	} else {
-		// If you set a process.env field to null or undefined, it gets cast to the
-		// string 'null' or 'undefined'. Just delete instead.
-		delete process.env.DEBUG;
-	}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-	return process.env.DEBUG;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init(debug) {
-	debug.inspectOpts = {};
-
-	const keys = Object.keys(exports.inspectOpts);
-	for (let i = 0; i < keys.length; i++) {
-		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-	}
-}
-
-module.exports = require('./common')(exports);
-
-const {formatters} = module.exports;
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-formatters.o = function (v) {
-	this.inspectOpts.colors = this.useColors;
-	return util.inspect(v, this.inspectOpts)
-		.split('\n')
-		.map(str => str.trim())
-		.join(' ');
-};
-
-/**
- * Map %O to `util.inspect()`, allowing multiple lines if needed.
- */
-
-formatters.O = function (v) {
-	this.inspectOpts.colors = this.useColors;
-	return util.inspect(v, this.inspectOpts);
-};
Index: de_modules/dotenv/CHANGELOG.md
===================================================================
--- node_modules/dotenv/CHANGELOG.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,520 +1,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
-
-## [Unreleased](https://github.com/motdotla/dotenv/compare/v16.6.1...master)
-
-## [16.6.1](https://github.com/motdotla/dotenv/compare/v16.6.0...v16.6.1) (2025-06-27)
-
-### Changed
-
-- Default `quiet` to true – hiding the runtime log message ([#874](https://github.com/motdotla/dotenv/pull/874))
-- NOTICE: 17.0.0 will be released with quiet defaulting to false. Use `config({ quiet: true })` to suppress.
-- And check out the new [dotenvx](https://github.com/dotenvx/dotenvx). As coding workflows evolve and agents increasingly handle secrets, encrypted .env files offer a much safer way to deploy both agents and code together with secure secrets. Simply switch `require('dotenv').config()` for `require('@dotenvx/dotenvx').config()`.
-
-## [16.6.0](https://github.com/motdotla/dotenv/compare/v16.5.0...v16.6.0) (2025-06-26)
-
-### Added
-
-- Default log helpful message `[dotenv@16.6.0] injecting env (1) from .env` ([#870](https://github.com/motdotla/dotenv/pull/870))
-- Use `{ quiet: true }` to suppress
-- Aligns dotenv more closely with [dotenvx](https://github.com/dotenvx/dotenvx).
-
-## [16.5.0](https://github.com/motdotla/dotenv/compare/v16.4.7...v16.5.0) (2025-04-07)
-
-### Added
-
-- 🎉 Added new sponsor [Graphite](https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv) - *the AI developer productivity platform helping teams on GitHub ship higher quality software, faster*.
-
-> [!TIP]
-> **[Become a sponsor](https://github.com/sponsors/motdotla)**
-> 
-> The dotenvx README is viewed thousands of times DAILY on GitHub and NPM.
-> Sponsoring dotenv is a great way to get in front of developers and give back to the developer community at the same time.
-
-### Changed
-
-- Remove `_log` method. Use `_debug` [#862](https://github.com/motdotla/dotenv/pull/862)
-
-## [16.4.7](https://github.com/motdotla/dotenv/compare/v16.4.6...v16.4.7) (2024-12-03)
-
-### Changed
-
-- Ignore `.tap` folder when publishing. (oops, sorry about that everyone. - @motdotla) [#848](https://github.com/motdotla/dotenv/pull/848)
-
-## [16.4.6](https://github.com/motdotla/dotenv/compare/v16.4.5...v16.4.6) (2024-12-02)
-
-### Changed
-
-- Clean up stale dev dependencies [#847](https://github.com/motdotla/dotenv/pull/847)
-- Various README updates clarifying usage and alternative solutions using [dotenvx](https://github.com/dotenvx/dotenvx)
-
-## [16.4.5](https://github.com/motdotla/dotenv/compare/v16.4.4...v16.4.5) (2024-02-19)
-
-### Changed
-
-- 🐞 Fix recent regression when using `path` option. return to historical behavior: do not attempt to auto find `.env` if `path` set. (regression was introduced in `16.4.3`) [#814](https://github.com/motdotla/dotenv/pull/814)
-
-## [16.4.4](https://github.com/motdotla/dotenv/compare/v16.4.3...v16.4.4) (2024-02-13)
-
-### Changed
-
-- 🐞 Replaced chaining operator `?.` with old school `&&` (fixing node 12 failures) [#812](https://github.com/motdotla/dotenv/pull/812)
-
-## [16.4.3](https://github.com/motdotla/dotenv/compare/v16.4.2...v16.4.3) (2024-02-12)
-
-### Changed
-
-- Fixed processing of multiple files in `options.path` [#805](https://github.com/motdotla/dotenv/pull/805)
-
-## [16.4.2](https://github.com/motdotla/dotenv/compare/v16.4.1...v16.4.2) (2024-02-10)
-
-### Changed
-
-- Changed funding link in package.json to [`dotenvx.com`](https://dotenvx.com)
-
-## [16.4.1](https://github.com/motdotla/dotenv/compare/v16.4.0...v16.4.1) (2024-01-24)
-
-- Patch support for array as `path` option [#797](https://github.com/motdotla/dotenv/pull/797)
-
-## [16.4.0](https://github.com/motdotla/dotenv/compare/v16.3.2...v16.4.0) (2024-01-23)
-
-- Add `error.code` to error messages around `.env.vault` decryption handling [#795](https://github.com/motdotla/dotenv/pull/795)
-- Add ability to find `.env.vault` file when filename(s) passed as an array [#784](https://github.com/motdotla/dotenv/pull/784)
-
-## [16.3.2](https://github.com/motdotla/dotenv/compare/v16.3.1...v16.3.2) (2024-01-18)
-
-### Added
-
-- Add debug message when no encoding set [#735](https://github.com/motdotla/dotenv/pull/735)
-
-### Changed
-
-- Fix output typing for `populate` [#792](https://github.com/motdotla/dotenv/pull/792)
-- Use subarray instead of slice [#793](https://github.com/motdotla/dotenv/pull/793)
-
-## [16.3.1](https://github.com/motdotla/dotenv/compare/v16.3.0...v16.3.1) (2023-06-17)
-
-### Added
-
-- Add missing type definitions for `processEnv` and `DOTENV_KEY` options. [#756](https://github.com/motdotla/dotenv/pull/756)
-
-## [16.3.0](https://github.com/motdotla/dotenv/compare/v16.2.0...v16.3.0) (2023-06-16)
-
-### Added
-
-- Optionally pass `DOTENV_KEY` to options rather than relying on `process.env.DOTENV_KEY`. Defaults to `process.env.DOTENV_KEY` [#754](https://github.com/motdotla/dotenv/pull/754)
-
-## [16.2.0](https://github.com/motdotla/dotenv/compare/v16.1.4...v16.2.0) (2023-06-15)
-
-### Added
-
-- Optionally write to your own target object rather than `process.env`. Defaults to `process.env`. [#753](https://github.com/motdotla/dotenv/pull/753)
-- Add import type URL to types file [#751](https://github.com/motdotla/dotenv/pull/751)
-
-## [16.1.4](https://github.com/motdotla/dotenv/compare/v16.1.3...v16.1.4) (2023-06-04)
-
-### Added
-
-- Added `.github/` to `.npmignore` [#747](https://github.com/motdotla/dotenv/pull/747)
-
-## [16.1.3](https://github.com/motdotla/dotenv/compare/v16.1.2...v16.1.3) (2023-05-31)
-
-### Removed
-
-- Removed `browser` keys for `path`, `os`, and `crypto` in package.json. These were set to false incorrectly as of 16.1. Instead, if using dotenv on the front-end make sure to include polyfills for `path`, `os`, and `crypto`. [node-polyfill-webpack-plugin](https://github.com/Richienb/node-polyfill-webpack-plugin) provides these.
-
-## [16.1.2](https://github.com/motdotla/dotenv/compare/v16.1.1...v16.1.2) (2023-05-31)
-
-### Changed
-
-- Exposed private function `_configDotenv` as `configDotenv`. [#744](https://github.com/motdotla/dotenv/pull/744)
-
-## [16.1.1](https://github.com/motdotla/dotenv/compare/v16.1.0...v16.1.1) (2023-05-30)
-
-### Added
-
-- Added type definition for `decrypt` function
-
-### Changed
-
-- Fixed `{crypto: false}` in `packageJson.browser`
-
-## [16.1.0](https://github.com/motdotla/dotenv/compare/v16.0.3...v16.1.0) (2023-05-30)
-
-### Added
-
-- Add `populate` convenience method [#733](https://github.com/motdotla/dotenv/pull/733)
-- Accept URL as path option [#720](https://github.com/motdotla/dotenv/pull/720)
-- Add dotenv to `npm fund` command
-- Spanish language README [#698](https://github.com/motdotla/dotenv/pull/698)
-- Add `.env.vault` support. 🎉 ([#730](https://github.com/motdotla/dotenv/pull/730))
-
-ℹ️ `.env.vault` extends the `.env` file format standard with a localized encrypted vault file. Package it securely with your production code deploys. It's cloud agnostic so that you can deploy your secrets anywhere – without [risky third-party integrations](https://techcrunch.com/2023/01/05/circleci-breach/). [read more](https://github.com/motdotla/dotenv#-deploying)
-
-### Changed
-
-- Fixed "cannot resolve 'fs'" error on tools like Replit [#693](https://github.com/motdotla/dotenv/pull/693)
-
-## [16.0.3](https://github.com/motdotla/dotenv/compare/v16.0.2...v16.0.3) (2022-09-29)
-
-### Changed
-
-- Added library version to debug logs ([#682](https://github.com/motdotla/dotenv/pull/682))
-
-## [16.0.2](https://github.com/motdotla/dotenv/compare/v16.0.1...v16.0.2) (2022-08-30)
-
-### Added
-
-- Export `env-options.js` and `cli-options.js` in package.json for use with downstream [dotenv-expand](https://github.com/motdotla/dotenv-expand) module
-
-## [16.0.1](https://github.com/motdotla/dotenv/compare/v16.0.0...v16.0.1) (2022-05-10)
-
-### Changed
-
-- Minor README clarifications
-- Development ONLY: updated devDependencies as recommended for development only security risks ([#658](https://github.com/motdotla/dotenv/pull/658))
-
-## [16.0.0](https://github.com/motdotla/dotenv/compare/v15.0.1...v16.0.0) (2022-02-02)
-
-### Added
-
-- _Breaking:_ Backtick support 🎉 ([#615](https://github.com/motdotla/dotenv/pull/615))
-
-If you had values containing the backtick character, please quote those values with either single or double quotes.
-
-## [15.0.1](https://github.com/motdotla/dotenv/compare/v15.0.0...v15.0.1) (2022-02-02)
-
-### Changed
-
-- Properly parse empty single or double quoted values 🐞 ([#614](https://github.com/motdotla/dotenv/pull/614))
-
-## [15.0.0](https://github.com/motdotla/dotenv/compare/v14.3.2...v15.0.0) (2022-01-31)
-
-`v15.0.0` is a major new release with some important breaking changes.
-
-### Added
-
-- _Breaking:_ Multiline parsing support (just works. no need for the flag.)
-
-### Changed
-
-- _Breaking:_ `#` marks the beginning of a comment (UNLESS the value is wrapped in quotes. Please update your `.env` files to wrap in quotes any values containing `#`. For example: `SECRET_HASH="something-with-a-#-hash"`).
-
-..Understandably, (as some teams have noted) this is tedious to do across the entire team. To make it less tedious, we recommend using [dotenv cli](https://github.com/dotenv-org/cli) going forward. It's an optional plugin that will keep your `.env` files in sync between machines, environments, or team members.
-
-### Removed
-
-- _Breaking:_ Remove multiline option (just works out of the box now. no need for the flag.)
-
-## [14.3.2](https://github.com/motdotla/dotenv/compare/v14.3.1...v14.3.2) (2022-01-25)
-
-### Changed
-
-- Preserve backwards compatibility on values containing `#` 🐞 ([#603](https://github.com/motdotla/dotenv/pull/603))
-
-## [14.3.1](https://github.com/motdotla/dotenv/compare/v14.3.0...v14.3.1) (2022-01-25)
-
-### Changed
-
-- Preserve backwards compatibility on exports by re-introducing the prior in-place exports 🐞 ([#606](https://github.com/motdotla/dotenv/pull/606))
-
-## [14.3.0](https://github.com/motdotla/dotenv/compare/v14.2.0...v14.3.0) (2022-01-24)
-
-### Added
-
-- Add `multiline` option 🎉 ([#486](https://github.com/motdotla/dotenv/pull/486))
-
-## [14.2.0](https://github.com/motdotla/dotenv/compare/v14.1.1...v14.2.0) (2022-01-17)
-
-### Added
-
-- Add `dotenv_config_override` cli option
-- Add `DOTENV_CONFIG_OVERRIDE` command line env option
-
-## [14.1.1](https://github.com/motdotla/dotenv/compare/v14.1.0...v14.1.1) (2022-01-17)
-
-### Added
-
-- Add React gotcha to FAQ on README
-
-## [14.1.0](https://github.com/motdotla/dotenv/compare/v14.0.1...v14.1.0) (2022-01-17)
-
-### Added
-
-- Add `override` option 🎉 ([#595](https://github.com/motdotla/dotenv/pull/595))
-
-## [14.0.1](https://github.com/motdotla/dotenv/compare/v14.0.0...v14.0.1) (2022-01-16)
-
-### Added
-
-- Log error on failure to load `.env` file ([#594](https://github.com/motdotla/dotenv/pull/594))
-
-## [14.0.0](https://github.com/motdotla/dotenv/compare/v13.0.1...v14.0.0) (2022-01-16)
-
-### Added
-
-- _Breaking:_ Support inline comments for the parser 🎉 ([#568](https://github.com/motdotla/dotenv/pull/568))
-
-## [13.0.1](https://github.com/motdotla/dotenv/compare/v13.0.0...v13.0.1) (2022-01-16)
-
-### Changed
-
-* Hide comments and newlines from debug output ([#404](https://github.com/motdotla/dotenv/pull/404))
-
-## [13.0.0](https://github.com/motdotla/dotenv/compare/v12.0.4...v13.0.0) (2022-01-16)
-
-### Added
-
-* _Breaking:_ Add type file for `config.js` ([#539](https://github.com/motdotla/dotenv/pull/539))
-
-## [12.0.4](https://github.com/motdotla/dotenv/compare/v12.0.3...v12.0.4) (2022-01-16)
-
-### Changed
-
-* README updates
-* Minor order adjustment to package json format
-
-## [12.0.3](https://github.com/motdotla/dotenv/compare/v12.0.2...v12.0.3) (2022-01-15)
-
-### Changed
-
-* Simplified jsdoc for consistency across editors
-
-## [12.0.2](https://github.com/motdotla/dotenv/compare/v12.0.1...v12.0.2) (2022-01-15)
-
-### Changed
-
-* Improve embedded jsdoc type documentation
-
-## [12.0.1](https://github.com/motdotla/dotenv/compare/v12.0.0...v12.0.1) (2022-01-15)
-
-### Changed
-
-* README updates and clarifications
-
-## [12.0.0](https://github.com/motdotla/dotenv/compare/v11.0.0...v12.0.0) (2022-01-15)
-
-### Removed
-
-- _Breaking:_ drop support for Flow static type checker ([#584](https://github.com/motdotla/dotenv/pull/584))
-
-### Changed
-
-- Move types/index.d.ts to lib/main.d.ts ([#585](https://github.com/motdotla/dotenv/pull/585))
-- Typescript cleanup ([#587](https://github.com/motdotla/dotenv/pull/587))
-- Explicit typescript inclusion in package.json ([#566](https://github.com/motdotla/dotenv/pull/566))
-
-## [11.0.0](https://github.com/motdotla/dotenv/compare/v10.0.0...v11.0.0) (2022-01-11)
-
-### Changed
-
-- _Breaking:_ drop support for Node v10 ([#558](https://github.com/motdotla/dotenv/pull/558))
-- Patch debug option ([#550](https://github.com/motdotla/dotenv/pull/550))
-
-## [10.0.0](https://github.com/motdotla/dotenv/compare/v9.0.2...v10.0.0) (2021-05-20)
-
-### Added
-
-- Add generic support to parse function
-- Allow for import "dotenv/config.js"
-- Add support to resolve home directory in path via ~
-
-## [9.0.2](https://github.com/motdotla/dotenv/compare/v9.0.1...v9.0.2) (2021-05-10)
-
-### Changed
-
-- Support windows newlines with debug mode
-
-## [9.0.1](https://github.com/motdotla/dotenv/compare/v9.0.0...v9.0.1) (2021-05-08)
-
-### Changed
-
-- Updates to README
-
-## [9.0.0](https://github.com/motdotla/dotenv/compare/v8.6.0...v9.0.0) (2021-05-05)
-
-### Changed
-
-- _Breaking:_ drop support for Node v8
-
-## [8.6.0](https://github.com/motdotla/dotenv/compare/v8.5.1...v8.6.0) (2021-05-05)
-
-### Added
-
-- define package.json in exports
-
-## [8.5.1](https://github.com/motdotla/dotenv/compare/v8.5.0...v8.5.1) (2021-05-05)
-
-### Changed
-
-- updated dev dependencies via npm audit
-
-## [8.5.0](https://github.com/motdotla/dotenv/compare/v8.4.0...v8.5.0) (2021-05-05)
-
-### Added
-
-- allow for `import "dotenv/config"`
-
-## [8.4.0](https://github.com/motdotla/dotenv/compare/v8.3.0...v8.4.0) (2021-05-05)
-
-### Changed
-
-- point to exact types file to work with VS Code
-
-## [8.3.0](https://github.com/motdotla/dotenv/compare/v8.2.0...v8.3.0) (2021-05-05)
-
-### Changed
-
-- _Breaking:_ drop support for Node v8 (mistake to be released as minor bump. later bumped to 9.0.0. see above.)
-
-## [8.2.0](https://github.com/motdotla/dotenv/compare/v8.1.0...v8.2.0) (2019-10-16)
-
-### Added
-
-- TypeScript types
-
-## [8.1.0](https://github.com/motdotla/dotenv/compare/v8.0.0...v8.1.0) (2019-08-18)
-
-### Changed
-
-- _Breaking:_ drop support for Node v6 ([#392](https://github.com/motdotla/dotenv/issues/392))
-
-# [8.0.0](https://github.com/motdotla/dotenv/compare/v7.0.0...v8.0.0) (2019-05-02)
-
-### Changed
-
-- _Breaking:_ drop support for Node v6 ([#302](https://github.com/motdotla/dotenv/issues/392))
-
-## [7.0.0] - 2019-03-12
-
-### Fixed
-
-- Fix removing unbalanced quotes ([#376](https://github.com/motdotla/dotenv/pull/376))
-
-### Removed
-
-- Removed `load` alias for `config` for consistency throughout code and documentation.
-
-## [6.2.0] - 2018-12-03
-
-### Added
-
-- Support preload configuration via environment variables ([#351](https://github.com/motdotla/dotenv/issues/351))
-
-## [6.1.0] - 2018-10-08
-
-### Added
-
-- `debug` option for `config` and `parse` methods will turn on logging
-
-## [6.0.0] - 2018-06-02
-
-### Changed
-
-- _Breaking:_ drop support for Node v4 ([#304](https://github.com/motdotla/dotenv/pull/304))
-
-## [5.0.0] - 2018-01-29
-
-### Added
-
-- Testing against Node v8 and v9
-- Documentation on trim behavior of values
-- Documentation on how to use with `import`
-
-### Changed
-
-- _Breaking_: default `path` is now `path.resolve(process.cwd(), '.env')`
-- _Breaking_: does not write over keys already in `process.env` if the key has a falsy value
-- using `const` and `let` instead of `var`
-
-### Removed
-
-- Testing against Node v7
-
-## [4.0.0] - 2016-12-23
-
-### Changed
-
-- Return Object with parsed content or error instead of false ([#165](https://github.com/motdotla/dotenv/pull/165)).
-
-### Removed
-
-- `verbose` option removed in favor of returning result.
-
-## [3.0.0] - 2016-12-20
-
-### Added
-
-- `verbose` option will log any error messages. Off by default.
-- parses email addresses correctly
-- allow importing config method directly in ES6
-
-### Changed
-
-- Suppress error messages by default ([#154](https://github.com/motdotla/dotenv/pull/154))
-- Ignoring more files for NPM to make package download smaller
-
-### Fixed
-
-- False positive test due to case-sensitive variable ([#124](https://github.com/motdotla/dotenv/pull/124))
-
-### Removed
-
-- `silent` option removed in favor of `verbose`
-
-## [2.0.0] - 2016-01-20
-
-### Added
-
-- CHANGELOG to ["make it easier for users and contributors to see precisely what notable changes have been made between each release"](http://keepachangelog.com/). Linked to from README
-- LICENSE to be more explicit about what was defined in `package.json`. Linked to from README
-- Testing nodejs v4 on travis-ci
-- added examples of how to use dotenv in different ways
-- return parsed object on success rather than boolean true
-
-### Changed
-
-- README has shorter description not referencing ruby gem since we don't have or want feature parity
-
-### Removed
-
-- Variable expansion and escaping so environment variables are encouraged to be fully orthogonal
-
-## [1.2.0] - 2015-06-20
-
-### Added
-
-- Preload hook to require dotenv without including it in your code
-
-### Changed
-
-- clarified license to be "BSD-2-Clause" in `package.json`
-
-### Fixed
-
-- retain spaces in string vars
-
-## [1.1.0] - 2015-03-31
-
-### Added
-
-- Silent option to silence `console.log` when `.env` missing
-
-## [1.0.0] - 2015-03-13
-
-### Removed
-
-- support for multiple `.env` files. should always use one `.env` file for the current environment
-
-[7.0.0]: https://github.com/motdotla/dotenv/compare/v6.2.0...v7.0.0
-[6.2.0]: https://github.com/motdotla/dotenv/compare/v6.1.0...v6.2.0
-[6.1.0]: https://github.com/motdotla/dotenv/compare/v6.0.0...v6.1.0
-[6.0.0]: https://github.com/motdotla/dotenv/compare/v5.0.0...v6.0.0
-[5.0.0]: https://github.com/motdotla/dotenv/compare/v4.0.0...v5.0.0
-[4.0.0]: https://github.com/motdotla/dotenv/compare/v3.0.0...v4.0.0
-[3.0.0]: https://github.com/motdotla/dotenv/compare/v2.0.0...v3.0.0
-[2.0.0]: https://github.com/motdotla/dotenv/compare/v1.2.0...v2.0.0
-[1.2.0]: https://github.com/motdotla/dotenv/compare/v1.1.0...v1.2.0
-[1.1.0]: https://github.com/motdotla/dotenv/compare/v1.0.0...v1.1.0
-[1.0.0]: https://github.com/motdotla/dotenv/compare/v0.4.0...v1.0.0
Index: de_modules/dotenv/LICENSE
===================================================================
--- node_modules/dotenv/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,23 +1,0 @@
-Copyright (c) 2015, Scott Motte
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: de_modules/dotenv/README-es.md
===================================================================
--- node_modules/dotenv/README-es.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,411 +1,0 @@
-<div align="center">
-🎉 announcing <a href="https://github.com/dotenvx/dotenvx">dotenvx</a>. <em>run anywhere, multi-environment, encrypted envs</em>.
-</div>
-
-&nbsp;
-
-<div align="center">
-
-<p>
-  <sup>
-    <a href="https://github.com/sponsors/motdotla">Dotenv es apoyado por la comunidad.</a>
-  </sup>
-</p>
-<sup>Gracias espaciales a:</sup>
-<br>
-<br>
-
-<a href="https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv"><img src="https://res.cloudinary.com/dotenv-org/image/upload/v1744035073/graphite_lgsrl8.gif" width="240" alt="Graphite" /></a>
-
-<a href="https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv">
-  <b>Graphite is the AI developer productivity platform helping teams on GitHub ship higher quality software, faster.</b>
-</a>
-<hr>
-</div>
-
-# dotenv [![NPM version](https://img.shields.io/npm/v/dotenv.svg?style=flat-square)](https://www.npmjs.com/package/dotenv)
-
-<img src="https://raw.githubusercontent.com/motdotla/dotenv/master/dotenv.svg" alt="dotenv" align="right" width="200" />
-
-Dotenv es un módulo de dependencia cero que carga las variables de entorno desde un archivo `.env` en [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env). El almacenamiento de la configuración del entorno separado del código está basado en la metodología [The Twelve-Factor App](http://12factor.net/config).
-
-[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
-[![LICENSE](https://img.shields.io/github/license/motdotla/dotenv.svg)](LICENSE)
-
-## Instalación
-
-```bash
-# instalación local (recomendado)
-npm install dotenv --save
-```
-
-O installación con yarn? `yarn add dotenv`
-
-## Uso
-
-Cree un archivo `.env` en la raíz de su proyecto:
-
-```dosini
-S3_BUCKET="YOURS3BUCKET"
-SECRET_KEY="YOURSECRETKEYGOESHERE"
-```
-
-Tan prónto como sea posible en su aplicación, importe y configure dotenv:
-
-```javascript
-require('dotenv').config()
-console.log(process.env) // elimine esto después que haya confirmado que esta funcionando
-```
-
-.. o usa ES6?
-
-```javascript
-import * as dotenv from 'dotenv' // vea en https://github.com/motdotla/dotenv#como-uso-dotenv-con-import
-// REVISAR LINK DE REFERENCIA DE IMPORTACIÓN
-dotenv.config()
-import express from 'express'
-```
-
-Eso es todo. `process.env` ahora tiene las claves y los valores que definiste en tu archivo `.env`:
-
-```javascript
-require('dotenv').config()
-
-...
-
-s3.getBucketCors({Bucket: process.env.S3_BUCKET}, function(err, data) {})
-```
-
-### Valores multilínea
-
-Si necesita variables de varias líneas, por ejemplo, claves privadas, ahora se admiten en la versión (`>= v15.0.0`) con saltos de línea:
-
-```dosini
-PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
-...
-Kh9NV...
-...
------END RSA PRIVATE KEY-----"
-```
-
-Alternativamente, puede usar comillas dobles y usar el carácter `\n`:
-
-```dosini
-PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n"
-```
-
-### Comentarios
-
-Los comentarios pueden ser agregados en tu archivo o en la misma línea:
-
-```dosini
-# This is a comment
-SECRET_KEY=YOURSECRETKEYGOESHERE # comment
-SECRET_HASH="something-with-a-#-hash"
-```
-
-Los comentarios comienzan donde existe un `#`, entonces, si su valor contiene un `#`, enciérrelo entre comillas. Este es un cambio importante desde la versión `>= v15.0.0` en adelante.
-
-### Análisis
-
-El motor que analiza el contenido de su archivo que contiene variables de entorno está disponible para su uso. Este Acepta una Cadena o un Búfer y devolverá un Objeto con las claves y los valores analizados.
-
-```javascript
-const dotenv = require('dotenv')
-const buf = Buffer.from('BASICO=basico')
-const config = dotenv.parse(buf) // devolverá un objeto
-console.log(typeof config, config) // objeto { BASICO : 'basico' }
-```
-
-### Precarga
-
-Puede usar el `--require` (`-r`) [opción de línea de comando](https://nodejs.org/api/cli.html#-r---require-module) para precargar dotenv. Al hacer esto, no necesita requerir ni cargar dotnev en el código de su aplicación.
-
-```bash
-$ node -r dotenv/config tu_script.js
-```
-
-Las opciones de configuración a continuación se admiten como argumentos de línea de comandos en el formato `dotenv_config_<option>=value`
-
-```bash
-$ node -r dotenv/config tu_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true
-```
-
-Además, puede usar variables de entorno para establecer opciones de configuración. Los argumentos de línea de comandos precederán a estos.
-
-```bash
-$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config tu_script.js
-```
-
-```bash
-$ DOTENV_CONFIG_ENCODING=latin1 DOTENV_CONFIG_DEBUG=true node -r dotenv/config tu_script.js dotenv_config_path=/custom/path/to/.env
-```
-
-### Expansión Variable
-
-Necesitaras agregar el valor de otro variable en una de sus variables? Usa [dotenv-expand](https://github.com/motdotla/dotenv-expand).
-
-## Ejemplos
-
-Vea [ejemplos](https://github.com/dotenv-org/examples) sobre el uso de dotenv con varios frameworks, lenguajes y configuraciones.
-
-* [nodejs](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs)
-* [nodejs (depurar en)](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs-debug)
-* [nodejs (anular en)](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs-override)
-* [esm](https://github.com/dotenv-org/examples/tree/master/dotenv-esm)
-* [esm (precarga)](https://github.com/dotenv-org/examples/tree/master/dotenv-esm-preload)
-* [typescript](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript)
-* [typescript parse](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript-parse)
-* [typescript config](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript-config)
-* [webpack](https://github.com/dotenv-org/examples/tree/master/dotenv-webpack)
-* [webpack (plugin)](https://github.com/dotenv-org/examples/tree/master/dotenv-webpack2)
-* [react](https://github.com/dotenv-org/examples/tree/master/dotenv-react)
-* [react (typescript)](https://github.com/dotenv-org/examples/tree/master/dotenv-react-typescript)
-* [express](https://github.com/dotenv-org/examples/tree/master/dotenv-express)
-* [nestjs](https://github.com/dotenv-org/examples/tree/master/dotenv-nestjs)
-
-## Documentación
-
-Dotenv expone dos funciones:
-
-* `configuración`
-* `analizar`
-
-### Configuración
-
-`Configuración` leerá su archivo `.env`, analizará el contenido, lo asignará a [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env),
-y devolverá un Objeto con una clave `parsed` que contiene el contenido cargado o una clave `error` si falla.
-
-```js
-const result = dotenv.config()
-
-if (result.error) {
-  throw result.error
-}
-
-console.log(result.parsed)
-```
-
-Adicionalmente, puede pasar opciones a `configuracion`.
-
-#### Opciones
-
-##### Ruta
-
-Por defecto: `path.resolve(process.cwd(), '.env')`
-
-Especifique una ruta personalizada si el archivo que contiene las variables de entorno se encuentra localizado en otro lugar.
-
-```js
-require('dotenv').config({ path: '/personalizado/ruta/a/.env' })
-```
-
-##### Codificación
-
-Por defecto: `utf8`
-
-Especifique la codificación del archivo que contiene las variables de entorno.
-
-```js
-require('dotenv').config({ encoding: 'latin1' })
-```
-
-##### Depurar
-
-Por defecto: `false`
-
-Active el registro de ayuda para depurar por qué ciertas claves o valores no se inician como lo esperabas.
-
-```js
-require('dotenv').config({ debug: process.env.DEBUG })
-```
-
-##### Anular
-
-Por defecto: `false`
-
-Anule cualquier variable de entorno que ya se haya configurada en su maquina con los valores de su archivo .env.
-
-```js
-require('dotenv').config({ override: true })
-```
-
-### Analizar
-
-El motor que analiza el contenido del archivo que contiene las variables de entorno está disponible para su uso. Acepta una Cadena o un Búfer y retornará un objecto con los valores analizados.
-
-```js
-const dotenv = require('dotenv')
-const buf = Buffer.from('BASICO=basico')
-const config = dotenv.parse(buf) // devolverá un objeto
-console.log(typeof config, config) // objeto { BASICO : 'basico' }
-```
-
-#### Opciones
-
-##### Depurar
-
-Por defecto: `false`
-
-Active el registro de ayuda para depurar por qué ciertas claves o valores no se inician como lo esperabas.
-
-```js
-const dotenv = require('dotenv')
-const buf = Buffer.from('hola mundo')
-const opt = { debug: true }
-const config = dotenv.parse(buf, opt)
-// espere por un mensaje de depuración porque el búfer no esta listo KEY=VAL
-```
-
-## FAQ
-
-### ¿Por qué el archivo `.env` no carga mis variables de entorno correctamente?
-
-Lo más probable es que su archivo `.env` no esté en el lugar correcto. [Vea este stack overflow](https://stackoverflow.com/questions/42335016/dotenv-file-is-not-loading-environment-variables).
-
-Active el modo de depuración y vuelva a intentarlo...
-
-```js
-require('dotenv').config({ debug: true })
-```
-
-Recibirá un error apropiado en su consola.
-
-### ¿Debo confirmar mi archivo `.env`?
-
-No. Recomendamos **enfáticamente** no enviar su archivo `.env` a la versión de control. Solo debe incluir los valores especificos del entorno, como la base de datos, contraseñas o claves API.
-
-### ¿Debería tener multiples archivos `.env`?
-
-No. Recomendamos **enfáticamente** no tener un archivo `.env` "principal" y un archivo `.env` de "entorno" como `.env.test`. Su configuración debe variar entre implementaciones y no debe compartir valores entre entornos.
-
-> En una Aplicación de Doce Factores, las variables de entorno son controles diferenciados, cada uno totalmente independiente a otras variables de entorno. Nunca se agrupan como "entornos", sino que se gestionan de manera independiente para cada despliegue. Este es un modelo que se escala sin problemas a medida que la aplicación se expande de forma natural en más despliegues a lo largo de su vida.
->
-> – [La Apliación de los Doce Factores](https://12factor.net/es/)
-
-### ¿Qué reglas sigue el motor de análisis?
-
-El motor de análisis actualmente admite las siguientes reglas:
-
-- `BASICO=basico` se convierte en `{BASICO: 'basico'}`
-- las líneas vacías se saltan
-- las líneas que comienzan con `#` se tratan como comentarios
-- `#` marca el comienzo de un comentario (a menos que el valor esté entre comillas)
-- valores vacíos se convierten en cadenas vacías (`VACIO=` se convierte en `{VACIO: ''}`)
-- las comillas internas se mantienen (piensa en JSON) (`JSON={"foo": "bar"}` se convierte en `{JSON:"{\"foo\": \"bar\"}"`)
-- los espacios en blanco se eliminan de ambos extremos de los valores no citanos (aprende más en [`trim`](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)) (`FOO=  algo ` se convierte en `{FOO: 'algo'}`)
-- los valores entre comillas simples y dobles se escapan (`CITA_SIMPLE='citado'` se convierte en `{CITA_SIMPLE: "citado"}`)
-- los valores entre comillas simples y dobles mantienen los espacios en blanco en ambos extremos  (`FOO="  algo  "` se convierte en `{FOO: '  algo  '}`)
-- los valores entre comillas dobles expanden nuevas líneas (`MULTILINEA="nueva\nlínea"` se convierte en
-
-```
-{MULTILINEA: 'nueva
-línea'}
-```
-
-- se admite la comilla simple invertida (`` SIGNO_ACENTO=`Esto tiene comillas 'simples' y "dobles" en su interior.` ``)
-
-### ¿Qué sucede con las variables de entorno que ya estaban configuradas?
-
-Por defecto, nunca modificaremos ninguna variable de entorno que ya haya sido establecida. En particular, si hay una variable en su archivo `.env` que colisiona con una que ya existe en su entorno, entonces esa variable se omitirá.
-
-Si por el contrario, quieres anular `process.env` utiliza la opción `override`.
-
-```javascript
-require('dotenv').config({ override: true })
-```
-
-### ¿Por qué mis variables de entorno no aparecen para React?
-
-Su código React se ejecuta en Webpack, donde el módulo `fs` o incluso el propio `process` global no son accesibles fuera-de-la-caja. El módulo `process.env` sólo puede ser inyectado a través de la configuración de Webpack.
-
-Si estás usando [`react-scripts`](https://www.npmjs.com/package/react-scripts), el cual se distribuye a través de [`create-react-app`](https://create-react-app.dev/), tiene dotenv incorporado pero con una singularidad. Escriba sus variables de entorno con `REACT_APP_`. Vea [este stack overflow](https://stackoverflow.com/questions/42182577/is-it-possible-to-use-dotenv-in-a-react-project) para más detalles.
-
-Si estás utilizando otros frameworks (por ejemplo, Next.js, Gatsby...), debes consultar su documentación para saber cómo injectar variables de entorno en el cliente.
-
-### ¿Puedo personalizar/escribir plugins para dotenv?
-
-Sí! `dotenv.config()` devuelve un objeto que representa el archivo `.env` analizado. Esto te da todo lo que necesitas para poder establecer valores en `process.env`. Por ejemplo:
-
-```js
-const dotenv = require('dotenv')
-const variableExpansion = require('dotenv-expand')
-const miEnv = dotenv.config()
-variableExpansion(miEnv)
-```
-
-### Cómo uso dotnev con `import`?
-
-Simplemente..
-
-```javascript
-// index.mjs (ESM)
-import * as dotenv from 'dotenv' // vea https://github.com/motdotla/dotenv#como-uso-dotenv-con-import
-dotenv.config()
-import express from 'express'
-```
-
-Un poco de historia...
-
-> Cuando se ejecuta un módulo que contiene una sentencia `import`, los módulos que importa serán cargados primero, y luego se ejecuta cada bloque del módulo en un recorrido en profundidad del gráfico de dependencias, evitando los ciclos al saltarse todo lo que ya se ha ejecutado.
->
-> – [ES6 en Profundidad: Módulos](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/)
-
-¿Qué significa esto en lenguaje sencillo? Significa que se podrías pensar que lo siguiente funcionaría pero no lo hará.
-
-```js
-// notificarError.mjs
-import { Cliente } from 'mejor-servicio-para-notificar-error'
-
-export default new Client(process.env.CLAVE_API)
-
-// index.mjs
-import dotenv from 'dotenv'
-dotenv.config()
-
-import notificarError from './notificarError.mjs'
-notificarError.report(new Error('ejemplo documentado'))
-```
-
-`process.env.CLAVE_API` será vacio.
-
-En su lugar, el código anterior debe ser escrito como...
-
-```js
-// notificarError.mjs
-import { Cliente } from 'mejor-servicio-para-notificar-errores'
-
-export default new Client(process.env.CLAVE_API)
-
-// index.mjs
-import * as dotenv from 'dotenv'
-dotenv.config()
-
-import notificarError from './notificarError.mjs'
-notificarError.report(new Error('ejemplo documentado'))
-```
-
-¿Esto tiene algo de sentido? Esto es poco poco intuitivo, pero es como funciona la importación de módulos en ES6. Aquí hay un ejemplo [ejemplo práctico de esta trampa](https://github.com/dotenv-org/examples/tree/master/dotenv-es6-import-pitfall).
-
-Existen dos arternativas a este planteamiento:
-
-1. Precarga dotenv: `node --require dotenv/config index.js` (_Nota: no es necesario usar `import` dotenv con este método_)
-2. Cree un archivo separado que ejecutará `config` primero como se describe en [este comentario #133](https://github.com/motdotla/dotenv/issues/133#issuecomment-255298822)
-
-### ¿Qué pasa con la expansión de variable?
-
-Prueba [dotenv-expand](https://github.com/motdotla/dotenv-expand)
-
-## Guía de contribución
-
-Vea [CONTRIBUTING.md](CONTRIBUTING.md)
-
-## REGISTRO DE CAMBIOS
-
-Vea [CHANGELOG.md](CHANGELOG.md)
-
-## ¿Quiénes utilizan dotenv?
-
-[Estos módulos npm dependen de él.](https://www.npmjs.com/browse/depended/dotenv)
-
-Los proyectos que lo amplían suelen utilizar la [palabra clave "dotenv" en npm](https://www.npmjs.com/search?q=keywords:dotenv).
Index: de_modules/dotenv/README.md
===================================================================
--- node_modules/dotenv/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,645 +1,0 @@
-<div align="center">
-🎉 announcing <a href="https://github.com/dotenvx/dotenvx">dotenvx</a>. <em>run anywhere, multi-environment, encrypted envs</em>.
-</div>
-
-&nbsp;
-
-<div align="center">
-
-**Special thanks to [our sponsors](https://github.com/sponsors/motdotla)**
-
-<br>
-<a href="https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv"><img src="https://res.cloudinary.com/dotenv-org/image/upload/v1744035073/graphite_lgsrl8.gif" width="240" alt="Graphite" /></a>
-<br>
-<a href="https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv">
-  <b>Graphite is the AI developer productivity platform helping teams on GitHub ship higher quality software, faster.</b>
-</a>
-<hr>
-</div>
-
-# dotenv [![NPM version](https://img.shields.io/npm/v/dotenv.svg?style=flat-square)](https://www.npmjs.com/package/dotenv)
-
-<img src="https://raw.githubusercontent.com/motdotla/dotenv/master/dotenv.svg" alt="dotenv" align="right" width="200" />
-
-Dotenv is a zero-dependency module that loads environment variables from a `.env` file into [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env). Storing configuration in the environment separate from code is based on [The Twelve-Factor App](https://12factor.net/config) methodology.
-
-[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
-[![LICENSE](https://img.shields.io/github/license/motdotla/dotenv.svg)](LICENSE)
-[![codecov](https://codecov.io/gh/motdotla/dotenv-expand/graph/badge.svg?token=pawWEyaMfg)](https://codecov.io/gh/motdotla/dotenv-expand)
-
-* [🌱 Install](#-install)
-* [🏗️ Usage (.env)](#%EF%B8%8F-usage)
-* [🌴 Multiple Environments 🆕](#-manage-multiple-environments)
-* [🚀 Deploying (encryption) 🆕](#-deploying)
-* [📚 Examples](#-examples)
-* [📖 Docs](#-documentation)
-* [❓ FAQ](#-faq)
-* [⏱️ Changelog](./CHANGELOG.md)
-
-## 🌱 Install
-
-```bash
-npm install dotenv --save
-```
-
-You can also use an npm-compatible package manager like yarn, bun or pnpm:
-
-```bash
-yarn add dotenv
-```
-```bash
-bun add dotenv
-```
-```bash
-pnpm add dotenv
-```
-
-## 🏗️ Usage
-
-<a href="https://www.youtube.com/watch?v=YtkZR0NFd1g">
-<div align="right">
-<img src="https://img.youtube.com/vi/YtkZR0NFd1g/hqdefault.jpg" alt="how to use dotenv video tutorial" align="right" width="330" />
-<img src="https://simpleicons.vercel.app/youtube/ff0000" alt="youtube/@dotenvorg" align="right" width="24" />
-</div>
-</a>
-
-Create a `.env` file in the root of your project (if using a monorepo structure like `apps/backend/app.js`, put it in the root of the folder where your `app.js` process runs):
-
-```dosini
-S3_BUCKET="YOURS3BUCKET"
-SECRET_KEY="YOURSECRETKEYGOESHERE"
-```
-
-As early as possible in your application, import and configure dotenv:
-
-```javascript
-require('dotenv').config()
-console.log(process.env) // remove this after you've confirmed it is working
-```
-
-.. [or using ES6?](#how-do-i-use-dotenv-with-import)
-
-```javascript
-import 'dotenv/config'
-```
-
-That's it. `process.env` now has the keys and values you defined in your `.env` file:
-
-```javascript
-require('dotenv').config()
-// or import 'dotenv/config' if you're using ES6
-
-...
-
-s3.getBucketCors({Bucket: process.env.S3_BUCKET}, function(err, data) {})
-```
-
-### Multiline values
-
-If you need multiline variables, for example private keys, those are now supported (`>= v15.0.0`) with line breaks:
-
-```dosini
-PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
-...
-Kh9NV...
-...
------END RSA PRIVATE KEY-----"
-```
-
-Alternatively, you can double quote strings and use the `\n` character:
-
-```dosini
-PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n"
-```
-
-### Comments
-
-Comments may be added to your file on their own line or inline:
-
-```dosini
-# This is a comment
-SECRET_KEY=YOURSECRETKEYGOESHERE # comment
-SECRET_HASH="something-with-a-#-hash"
-```
-
-Comments begin where a `#` exists, so if your value contains a `#` please wrap it in quotes. This is a breaking change from `>= v15.0.0` and on.
-
-### Parsing
-
-The engine which parses the contents of your file containing environment variables is available to use. It accepts a String or Buffer and will return an Object with the parsed keys and values.
-
-```javascript
-const dotenv = require('dotenv')
-const buf = Buffer.from('BASIC=basic')
-const config = dotenv.parse(buf) // will return an object
-console.log(typeof config, config) // object { BASIC : 'basic' }
-```
-
-### Preload
-
-> Note: Consider using [`dotenvx`](https://github.com/dotenvx/dotenvx) instead of preloading. I am now doing (and recommending) so.
->
-> It serves the same purpose (you do not need to require and load dotenv), adds better debugging, and works with ANY language, framework, or platform. – [motdotla](https://github.com/motdotla)
-
-You can use the `--require` (`-r`) [command line option](https://nodejs.org/api/cli.html#-r---require-module) to preload dotenv. By doing this, you do not need to require and load dotenv in your application code.
-
-```bash
-$ node -r dotenv/config your_script.js
-```
-
-The configuration options below are supported as command line arguments in the format `dotenv_config_<option>=value`
-
-```bash
-$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true
-```
-
-Additionally, you can use environment variables to set configuration options. Command line arguments will precede these.
-
-```bash
-$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js
-```
-
-```bash
-$ DOTENV_CONFIG_ENCODING=latin1 DOTENV_CONFIG_DEBUG=true node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env
-```
-
-### Variable Expansion
-
-You need to add the value of another variable in one of your variables? Use [dotenv-expand](https://github.com/motdotla/dotenv-expand).
-
-### Command Substitution
-
-Use [dotenvx](https://github.com/dotenvx/dotenvx) to use command substitution.
-
-Add the output of a command to one of your variables in your .env file.
-
-```ini
-# .env
-DATABASE_URL="postgres://$(whoami)@localhost/my_database"
-```
-```js
-// index.js
-console.log('DATABASE_URL', process.env.DATABASE_URL)
-```
-```sh
-$ dotenvx run --debug -- node index.js
-[dotenvx@0.14.1] injecting env (1) from .env
-DATABASE_URL postgres://yourusername@localhost/my_database
-```
-
-### Syncing
-
-You need to keep `.env` files in sync between machines, environments, or team members? Use [dotenvx](https://github.com/dotenvx/dotenvx) to encrypt your `.env` files and safely include them in source control. This still subscribes to the twelve-factor app rules by generating a decryption key separate from code.
-
-### Multiple Environments
-
-Use [dotenvx](https://github.com/dotenvx/dotenvx) to generate `.env.ci`, `.env.production` files, and more.
-
-### Deploying
-
-You need to deploy your secrets in a cloud-agnostic manner? Use [dotenvx](https://github.com/dotenvx/dotenvx) to generate a private decryption key that is set on your production server.
-
-## 🌴 Manage Multiple Environments
-
-Use [dotenvx](https://github.com/dotenvx/dotenvx)
-
-Run any environment locally. Create a `.env.ENVIRONMENT` file and use `--env-file` to load it. It's straightforward, yet flexible.
-
-```bash
-$ echo "HELLO=production" > .env.production
-$ echo "console.log('Hello ' + process.env.HELLO)" > index.js
-
-$ dotenvx run --env-file=.env.production -- node index.js
-Hello production
-> ^^
-```
-
-or with multiple .env files
-
-```bash
-$ echo "HELLO=local" > .env.local
-$ echo "HELLO=World" > .env
-$ echo "console.log('Hello ' + process.env.HELLO)" > index.js
-
-$ dotenvx run --env-file=.env.local --env-file=.env -- node index.js
-Hello local
-```
-
-[more environment examples](https://dotenvx.com/docs/quickstart/environments)
-
-## 🚀 Deploying
-
-Use [dotenvx](https://github.com/dotenvx/dotenvx).
-
-Add encryption to your `.env` files with a single command. Pass the `--encrypt` flag.
-
-```
-$ dotenvx set HELLO Production --encrypt -f .env.production
-$ echo "console.log('Hello ' + process.env.HELLO)" > index.js
-
-$ DOTENV_PRIVATE_KEY_PRODUCTION="<.env.production private key>" dotenvx run -- node index.js
-[dotenvx] injecting env (2) from .env.production
-Hello Production
-```
-
-[learn more](https://github.com/dotenvx/dotenvx?tab=readme-ov-file#encryption)
-
-## 📚 Examples
-
-See [examples](https://github.com/dotenv-org/examples) of using dotenv with various frameworks, languages, and configurations.
-
-* [nodejs](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-nodejs)
-* [nodejs (debug on)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-nodejs-debug)
-* [nodejs (override on)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-nodejs-override)
-* [nodejs (processEnv override)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-custom-target)
-* [esm](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-esm)
-* [esm (preload)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-esm-preload)
-* [typescript](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-typescript)
-* [typescript parse](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-typescript-parse)
-* [typescript config](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-typescript-config)
-* [webpack](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-webpack)
-* [webpack (plugin)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-webpack2)
-* [react](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-react)
-* [react (typescript)](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-react-typescript)
-* [express](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-express)
-* [nestjs](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-nestjs)
-* [fastify](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-fastify)
-
-## 📖 Documentation
-
-Dotenv exposes four functions:
-
-* `config`
-* `parse`
-* `populate`
-* `decrypt`
-
-### Config
-
-`config` will read your `.env` file, parse the contents, assign it to
-[`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env),
-and return an Object with a `parsed` key containing the loaded content or an `error` key if it failed.
-
-```js
-const result = dotenv.config()
-
-if (result.error) {
-  throw result.error
-}
-
-console.log(result.parsed)
-```
-
-You can additionally, pass options to `config`.
-
-#### Options
-
-##### path
-
-Default: `path.resolve(process.cwd(), '.env')`
-
-Specify a custom path if your file containing environment variables is located elsewhere.
-
-```js
-require('dotenv').config({ path: '/custom/path/to/.env' })
-```
-
-By default, `config` will look for a file called .env in the current working directory.
-
-Pass in multiple files as an array, and they will be parsed in order and combined with `process.env` (or `option.processEnv`, if set). The first value set for a variable will win, unless the `options.override` flag is set, in which case the last value set will win.  If a value already exists in `process.env` and the `options.override` flag is NOT set, no changes will be made to that value. 
-
-```js  
-require('dotenv').config({ path: ['.env.local', '.env'] })
-```
-
-##### encoding
-
-Default: `utf8`
-
-Specify the encoding of your file containing environment variables.
-
-```js
-require('dotenv').config({ encoding: 'latin1' })
-```
-
-##### debug
-
-Default: `false`
-
-Turn on logging to help debug why certain keys or values are not being set as you expect.
-
-```js
-require('dotenv').config({ debug: process.env.DEBUG })
-```
-
-##### override
-
-Default: `false`
-
-Override any environment variables that have already been set on your machine with values from your .env file(s). If multiple files have been provided in `option.path` the override will also be used as each file is combined with the next. Without `override` being set, the first value wins. With `override` set the last value wins. 
-
-```js
-require('dotenv').config({ override: true })
-```
-
-##### processEnv
-
-Default: `process.env`
-
-Specify an object to write your environment variables to. Defaults to `process.env` environment variables.
-
-```js
-const myObject = {}
-require('dotenv').config({ processEnv: myObject })
-
-console.log(myObject) // values from .env
-console.log(process.env) // this was not changed or written to
-```
-
-### Parse
-
-The engine which parses the contents of your file containing environment
-variables is available to use. It accepts a String or Buffer and will return
-an Object with the parsed keys and values.
-
-```js
-const dotenv = require('dotenv')
-const buf = Buffer.from('BASIC=basic')
-const config = dotenv.parse(buf) // will return an object
-console.log(typeof config, config) // object { BASIC : 'basic' }
-```
-
-#### Options
-
-##### debug
-
-Default: `false`
-
-Turn on logging to help debug why certain keys or values are not being set as you expect.
-
-```js
-const dotenv = require('dotenv')
-const buf = Buffer.from('hello world')
-const opt = { debug: true }
-const config = dotenv.parse(buf, opt)
-// expect a debug message because the buffer is not in KEY=VAL form
-```
-
-### Populate
-
-The engine which populates the contents of your .env file to `process.env` is available for use. It accepts a target, a source, and options. This is useful for power users who want to supply their own objects.
-
-For example, customizing the source:
-
-```js
-const dotenv = require('dotenv')
-const parsed = { HELLO: 'world' }
-
-dotenv.populate(process.env, parsed)
-
-console.log(process.env.HELLO) // world
-```
-
-For example, customizing the source AND target:
-
-```js
-const dotenv = require('dotenv')
-const parsed = { HELLO: 'universe' }
-const target = { HELLO: 'world' } // empty object
-
-dotenv.populate(target, parsed, { override: true, debug: true })
-
-console.log(target) // { HELLO: 'universe' }
-```
-
-#### options
-
-##### Debug
-
-Default: `false`
-
-Turn on logging to help debug why certain keys or values are not being populated as you expect.
-
-##### override
-
-Default: `false`
-
-Override any environment variables that have already been set.
-
-## ❓ FAQ
-
-### Why is the `.env` file not loading my environment variables successfully?
-
-Most likely your `.env` file is not in the correct place. [See this stack overflow](https://stackoverflow.com/questions/42335016/dotenv-file-is-not-loading-environment-variables).
-
-Turn on debug mode and try again..
-
-```js
-require('dotenv').config({ debug: true })
-```
-
-You will receive a helpful error outputted to your console.
-
-### Should I commit my `.env` file?
-
-No. We **strongly** recommend against committing your `.env` file to version
-control. It should only include environment-specific values such as database
-passwords or API keys. Your production database should have a different
-password than your development database.
-
-### Should I have multiple `.env` files?
-
-We recommend creating one `.env` file per environment. Use `.env` for local/development, `.env.production` for production and so on. This still follows the twelve factor principles as each is attributed individually to its own environment. Avoid custom set ups that work in inheritance somehow (`.env.production` inherits values form `.env` for example). It is better to duplicate values if necessary across each `.env.environment` file.
-
-> In a twelve-factor app, env vars are granular controls, each fully orthogonal to other env vars. They are never grouped together as “environments”, but instead are independently managed for each deploy. This is a model that scales up smoothly as the app naturally expands into more deploys over its lifetime.
->
-> – [The Twelve-Factor App](http://12factor.net/config)
-
-### What rules does the parsing engine follow?
-
-The parsing engine currently supports the following rules:
-
-- `BASIC=basic` becomes `{BASIC: 'basic'}`
-- empty lines are skipped
-- lines beginning with `#` are treated as comments
-- `#` marks the beginning of a comment (unless when the value is wrapped in quotes)
-- empty values become empty strings (`EMPTY=` becomes `{EMPTY: ''}`)
-- inner quotes are maintained (think JSON) (`JSON={"foo": "bar"}` becomes `{JSON:"{\"foo\": \"bar\"}"`)
-- whitespace is removed from both ends of unquoted values (see more on [`trim`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)) (`FOO=  some value  ` becomes `{FOO: 'some value'}`)
-- single and double quoted values are escaped (`SINGLE_QUOTE='quoted'` becomes `{SINGLE_QUOTE: "quoted"}`)
-- single and double quoted values maintain whitespace from both ends (`FOO="  some value  "` becomes `{FOO: '  some value  '}`)
-- double quoted values expand new lines (`MULTILINE="new\nline"` becomes
-
-```
-{MULTILINE: 'new
-line'}
-```
-
-- backticks are supported (`` BACKTICK_KEY=`This has 'single' and "double" quotes inside of it.` ``)
-
-### What happens to environment variables that were already set?
-
-By default, we will never modify any environment variables that have already been set. In particular, if there is a variable in your `.env` file which collides with one that already exists in your environment, then that variable will be skipped.
-
-If instead, you want to override `process.env` use the `override` option.
-
-```javascript
-require('dotenv').config({ override: true })
-```
-
-### How come my environment variables are not showing up for React?
-
-Your React code is run in Webpack, where the `fs` module or even the `process` global itself are not accessible out-of-the-box. `process.env` can only be injected through Webpack configuration.
-
-If you are using [`react-scripts`](https://www.npmjs.com/package/react-scripts), which is distributed through [`create-react-app`](https://create-react-app.dev/), it has dotenv built in but with a quirk. Preface your environment variables with `REACT_APP_`. See [this stack overflow](https://stackoverflow.com/questions/42182577/is-it-possible-to-use-dotenv-in-a-react-project) for more details.
-
-If you are using other frameworks (e.g. Next.js, Gatsby...), you need to consult their documentation for how to inject environment variables into the client.
-
-### Can I customize/write plugins for dotenv?
-
-Yes! `dotenv.config()` returns an object representing the parsed `.env` file. This gives you everything you need to continue setting values on `process.env`. For example:
-
-```js
-const dotenv = require('dotenv')
-const variableExpansion = require('dotenv-expand')
-const myEnv = dotenv.config()
-variableExpansion(myEnv)
-```
-
-### How do I use dotenv with `import`?
-
-Simply..
-
-```javascript
-// index.mjs (ESM)
-import 'dotenv/config' // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import
-import express from 'express'
-```
-
-A little background..
-
-> When you run a module containing an `import` declaration, the modules it imports are loaded first, then each module body is executed in a depth-first traversal of the dependency graph, avoiding cycles by skipping anything already executed.
->
-> – [ES6 In Depth: Modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/)
-
-What does this mean in plain language? It means you would think the following would work but it won't.
-
-`errorReporter.mjs`:
-```js
-class Client {
-  constructor (apiKey) {
-    console.log('apiKey', apiKey)
-
-    this.apiKey = apiKey
-  }
-}
-
-export default new Client(process.env.API_KEY)
-```
-`index.mjs`:
-```js
-// Note: this is INCORRECT and will not work
-import * as dotenv from 'dotenv'
-dotenv.config()
-
-import errorReporter from './errorReporter.mjs' // process.env.API_KEY will be blank!
-```
-
-`process.env.API_KEY` will be blank.
-
-Instead, `index.mjs` should be written as..
-
-```js
-import 'dotenv/config'
-
-import errorReporter from './errorReporter.mjs'
-```
-
-Does that make sense? It's a bit unintuitive, but it is how importing of ES6 modules work. Here is a [working example of this pitfall](https://github.com/dotenv-org/examples/tree/master/usage/dotenv-es6-import-pitfall).
-
-There are two alternatives to this approach:
-
-1. Preload dotenv: `node --require dotenv/config index.js` (_Note: you do not need to `import` dotenv with this approach_)
-2. Create a separate file that will execute `config` first as outlined in [this comment on #133](https://github.com/motdotla/dotenv/issues/133#issuecomment-255298822)
-
-### Why am I getting the error `Module not found: Error: Can't resolve 'crypto|os|path'`?
-
-You are using dotenv on the front-end and have not included a polyfill. Webpack < 5 used to include these for you. Do the following:
-
-```bash
-npm install node-polyfill-webpack-plugin
-```
-
-Configure your `webpack.config.js` to something like the following.
-
-```js
-require('dotenv').config()
-
-const path = require('path');
-const webpack = require('webpack')
-
-const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
-
-module.exports = {
-  mode: 'development',
-  entry: './src/index.ts',
-  output: {
-    filename: 'bundle.js',
-    path: path.resolve(__dirname, 'dist'),
-  },
-  plugins: [
-    new NodePolyfillPlugin(),
-    new webpack.DefinePlugin({
-      'process.env': {
-        HELLO: JSON.stringify(process.env.HELLO)
-      }
-    }),
-  ]
-};
-```
-
-Alternatively, just use [dotenv-webpack](https://github.com/mrsteele/dotenv-webpack) which does this and more behind the scenes for you.
-
-### What about variable expansion?
-
-Try [dotenv-expand](https://github.com/motdotla/dotenv-expand)
-
-### What about syncing and securing .env files?
-
-Use [dotenvx](https://github.com/dotenvx/dotenvx)
-
-### What if I accidentally commit my `.env` file to code?
-
-Remove it, [remove git history](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository) and then install the [git pre-commit hook](https://github.com/dotenvx/dotenvx#pre-commit) to prevent this from ever happening again. 
-
-```
-brew install dotenvx/brew/dotenvx
-dotenvx precommit --install
-```
-
-### How can I prevent committing my `.env` file to a Docker build?
-
-Use the [docker prebuild hook](https://dotenvx.com/docs/features/prebuild).
-
-```bash
-# Dockerfile
-...
-RUN curl -fsS https://dotenvx.sh/ | sh
-...
-RUN dotenvx prebuild
-CMD ["dotenvx", "run", "--", "node", "index.js"]
-```
-
-## Contributing Guide
-
-See [CONTRIBUTING.md](CONTRIBUTING.md)
-
-## CHANGELOG
-
-See [CHANGELOG.md](CHANGELOG.md)
-
-## Who's using dotenv?
-
-[These npm modules depend on it.](https://www.npmjs.com/browse/depended/dotenv)
-
-Projects that expand it often use the [keyword "dotenv" on npm](https://www.npmjs.com/search?q=keywords:dotenv).
Index: de_modules/dotenv/SECURITY.md
===================================================================
--- node_modules/dotenv/SECURITY.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-Please report any security vulnerabilities to security@dotenvx.com. 
Index: de_modules/dotenv/config.d.ts
===================================================================
--- node_modules/dotenv/config.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export {};
Index: de_modules/dotenv/config.js
===================================================================
--- node_modules/dotenv/config.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-(function () {
-  require('./lib/main').config(
-    Object.assign(
-      {},
-      require('./lib/env-options'),
-      require('./lib/cli-options')(process.argv)
-    )
-  )
-})()
Index: de_modules/dotenv/lib/cli-options.js
===================================================================
--- node_modules/dotenv/lib/cli-options.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-const re = /^dotenv_config_(encoding|path|quiet|debug|override|DOTENV_KEY)=(.+)$/
-
-module.exports = function optionMatcher (args) {
-  const options = args.reduce(function (acc, cur) {
-    const matches = cur.match(re)
-    if (matches) {
-      acc[matches[1]] = matches[2]
-    }
-    return acc
-  }, {})
-
-  if (!('quiet' in options)) {
-    options.quiet = 'true'
-  }
-
-  return options
-}
Index: de_modules/dotenv/lib/env-options.js
===================================================================
--- node_modules/dotenv/lib/env-options.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,28 +1,0 @@
-// ../config.js accepts options via environment variables
-const options = {}
-
-if (process.env.DOTENV_CONFIG_ENCODING != null) {
-  options.encoding = process.env.DOTENV_CONFIG_ENCODING
-}
-
-if (process.env.DOTENV_CONFIG_PATH != null) {
-  options.path = process.env.DOTENV_CONFIG_PATH
-}
-
-if (process.env.DOTENV_CONFIG_QUIET != null) {
-  options.quiet = process.env.DOTENV_CONFIG_QUIET
-}
-
-if (process.env.DOTENV_CONFIG_DEBUG != null) {
-  options.debug = process.env.DOTENV_CONFIG_DEBUG
-}
-
-if (process.env.DOTENV_CONFIG_OVERRIDE != null) {
-  options.override = process.env.DOTENV_CONFIG_OVERRIDE
-}
-
-if (process.env.DOTENV_CONFIG_DOTENV_KEY != null) {
-  options.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY
-}
-
-module.exports = options
Index: de_modules/dotenv/lib/main.d.ts
===================================================================
--- node_modules/dotenv/lib/main.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,162 +1,0 @@
-// TypeScript Version: 3.0
-/// <reference types="node" />
-import type { URL } from 'url';
-
-export interface DotenvParseOutput {
-  [name: string]: string;
-}
-
-/**
- * Parses a string or buffer in the .env file format into an object.
- *
- * See https://dotenvx.com/docs
- *
- * @param src - contents to be parsed. example: `'DB_HOST=localhost'`
- * @returns an object with keys and values based on `src`. example: `{ DB_HOST : 'localhost' }`
- */
-export function parse<T extends DotenvParseOutput = DotenvParseOutput>(
-  src: string | Buffer
-): T;
-
-export interface DotenvConfigOptions {
-  /**
-   * Default: `path.resolve(process.cwd(), '.env')`
-   *
-   * Specify a custom path if your file containing environment variables is located elsewhere.
-   * Can also be an array of strings, specifying multiple paths.
-   *
-   * example: `require('dotenv').config({ path: '/custom/path/to/.env' })`
-   * example: `require('dotenv').config({ path: ['/path/to/first.env', '/path/to/second.env'] })`
-   */
-  path?: string | string[] | URL;
-
-  /**
-   * Default: `utf8`
-   *
-   * Specify the encoding of your file containing environment variables.
-   *
-   * example: `require('dotenv').config({ encoding: 'latin1' })`
-   */
-  encoding?: string;
-
-  /**
-   * Default: `false`
-   *
-   * Suppress all output (except errors).
-   *
-   * example: `require('dotenv').config({ quiet: true })`
-   */
-  quiet?: boolean;
-
-  /**
-   * Default: `false`
-   *
-   * Turn on logging to help debug why certain keys or values are not being set as you expect.
-   *
-   * example: `require('dotenv').config({ debug: process.env.DEBUG })`
-   */
-  debug?: boolean;
-
-  /**
-   * Default: `false`
-   *
-   * Override any environment variables that have already been set on your machine with values from your .env file.
-   *
-   * example: `require('dotenv').config({ override: true })`
-   */
-  override?: boolean;
-
-  /**
-   * Default: `process.env`
-   *
-   * Specify an object to write your secrets to. Defaults to process.env environment variables.
-   *
-   * example: `const processEnv = {}; require('dotenv').config({ processEnv: processEnv })`
-   */
-  processEnv?: DotenvPopulateInput;
-
-  /**
-   * Default: `undefined`
-   *
-   * Pass the DOTENV_KEY directly to config options. Defaults to looking for process.env.DOTENV_KEY environment variable. Note this only applies to decrypting .env.vault files. If passed as null or undefined, or not passed at all, dotenv falls back to its traditional job of parsing a .env file.
-   *
-   * example: `require('dotenv').config({ DOTENV_KEY: 'dotenv://:key_1234…@dotenvx.com/vault/.env.vault?environment=production' })`
-   */
-  DOTENV_KEY?: string;
-}
-
-export interface DotenvConfigOutput {
-  error?: Error;
-  parsed?: DotenvParseOutput;
-}
-
-export interface DotenvPopulateOptions {
-  /**
-   * Default: `false`
-   *
-   * Turn on logging to help debug why certain keys or values are not being set as you expect.
-   *
-   * example: `require('dotenv').config({ debug: process.env.DEBUG })`
-   */
-  debug?: boolean;
-
-  /**
-   * Default: `false`
-   *
-   * Override any environment variables that have already been set on your machine with values from your .env file.
-   *
-   * example: `require('dotenv').config({ override: true })`
-   */
-  override?: boolean;
-}
-
-export interface DotenvPopulateInput {
-  [name: string]: string;
-}
-
-/**
- * Loads `.env` file contents into process.env by default. If `DOTENV_KEY` is present, it smartly attempts to load encrypted `.env.vault` file contents into process.env.
- *
- * See https://dotenvx.com/docs
- *
- * @param options - additional options. example: `{ path: './custom/path', encoding: 'latin1', quiet: false, debug: true, override: false }`
- * @returns an object with a `parsed` key if successful or `error` key if an error occurred. example: { parsed: { KEY: 'value' } }
- *
- */
-export function config(options?: DotenvConfigOptions): DotenvConfigOutput;
-
-/**
- * Loads `.env` file contents into process.env.
- *
- * See https://dotenvx.com/docs
- *
- * @param options - additional options. example: `{ path: './custom/path', encoding: 'latin1', quiet: false, debug: true, override: false }`
- * @returns an object with a `parsed` key if successful or `error` key if an error occurred. example: { parsed: { KEY: 'value' } }
- *
- */
-export function configDotenv(options?: DotenvConfigOptions): DotenvConfigOutput;
-
-/**
- * Loads `source` json contents into `target` like process.env.
- *
- * See https://dotenvx.com/docs
- *
- * @param processEnv - the target JSON object. in most cases use process.env but you can also pass your own JSON object
- * @param parsed - the source JSON object
- * @param options - additional options. example: `{ quiet: false, debug: true, override: false }`
- * @returns {void}
- *
- */
-export function populate(processEnv: DotenvPopulateInput, parsed: DotenvPopulateInput, options?: DotenvConfigOptions): void;
-
-/**
- * Decrypt ciphertext
- *
- * See https://dotenvx.com/docs
- *
- * @param encrypted - the encrypted ciphertext string
- * @param keyStr - the decryption key string
- * @returns {string}
- *
- */
-export function decrypt(encrypted: string, keyStr: string): string;
Index: de_modules/dotenv/lib/main.js
===================================================================
--- node_modules/dotenv/lib/main.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,386 +1,0 @@
-const fs = require('fs')
-const path = require('path')
-const os = require('os')
-const crypto = require('crypto')
-const packageJson = require('../package.json')
-
-const version = packageJson.version
-
-const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg
-
-// Parse src into an Object
-function parse (src) {
-  const obj = {}
-
-  // Convert buffer to string
-  let lines = src.toString()
-
-  // Convert line breaks to same format
-  lines = lines.replace(/\r\n?/mg, '\n')
-
-  let match
-  while ((match = LINE.exec(lines)) != null) {
-    const key = match[1]
-
-    // Default undefined or null to empty string
-    let value = (match[2] || '')
-
-    // Remove whitespace
-    value = value.trim()
-
-    // Check if double quoted
-    const maybeQuote = value[0]
-
-    // Remove surrounding quotes
-    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')
-
-    // Expand newlines if double quoted
-    if (maybeQuote === '"') {
-      value = value.replace(/\\n/g, '\n')
-      value = value.replace(/\\r/g, '\r')
-    }
-
-    // Add to object
-    obj[key] = value
-  }
-
-  return obj
-}
-
-function _parseVault (options) {
-  options = options || {}
-
-  const vaultPath = _vaultPath(options)
-  options.path = vaultPath // parse .env.vault
-  const result = DotenvModule.configDotenv(options)
-  if (!result.parsed) {
-    const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)
-    err.code = 'MISSING_DATA'
-    throw err
-  }
-
-  // handle scenario for comma separated keys - for use with key rotation
-  // example: DOTENV_KEY="dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod"
-  const keys = _dotenvKey(options).split(',')
-  const length = keys.length
-
-  let decrypted
-  for (let i = 0; i < length; i++) {
-    try {
-      // Get full key
-      const key = keys[i].trim()
-
-      // Get instructions for decrypt
-      const attrs = _instructions(result, key)
-
-      // Decrypt
-      decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)
-
-      break
-    } catch (error) {
-      // last key
-      if (i + 1 >= length) {
-        throw error
-      }
-      // try next key
-    }
-  }
-
-  // Parse decrypted .env string
-  return DotenvModule.parse(decrypted)
-}
-
-function _warn (message) {
-  console.log(`[dotenv@${version}][WARN] ${message}`)
-}
-
-function _debug (message) {
-  console.log(`[dotenv@${version}][DEBUG] ${message}`)
-}
-
-function _log (message) {
-  console.log(`[dotenv@${version}] ${message}`)
-}
-
-function _dotenvKey (options) {
-  // prioritize developer directly setting options.DOTENV_KEY
-  if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {
-    return options.DOTENV_KEY
-  }
-
-  // secondary infra already contains a DOTENV_KEY environment variable
-  if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {
-    return process.env.DOTENV_KEY
-  }
-
-  // fallback to empty string
-  return ''
-}
-
-function _instructions (result, dotenvKey) {
-  // Parse DOTENV_KEY. Format is a URI
-  let uri
-  try {
-    uri = new URL(dotenvKey)
-  } catch (error) {
-    if (error.code === 'ERR_INVALID_URL') {
-      const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')
-      err.code = 'INVALID_DOTENV_KEY'
-      throw err
-    }
-
-    throw error
-  }
-
-  // Get decrypt key
-  const key = uri.password
-  if (!key) {
-    const err = new Error('INVALID_DOTENV_KEY: Missing key part')
-    err.code = 'INVALID_DOTENV_KEY'
-    throw err
-  }
-
-  // Get environment
-  const environment = uri.searchParams.get('environment')
-  if (!environment) {
-    const err = new Error('INVALID_DOTENV_KEY: Missing environment part')
-    err.code = 'INVALID_DOTENV_KEY'
-    throw err
-  }
-
-  // Get ciphertext payload
-  const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`
-  const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION
-  if (!ciphertext) {
-    const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)
-    err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'
-    throw err
-  }
-
-  return { ciphertext, key }
-}
-
-function _vaultPath (options) {
-  let possibleVaultPath = null
-
-  if (options && options.path && options.path.length > 0) {
-    if (Array.isArray(options.path)) {
-      for (const filepath of options.path) {
-        if (fs.existsSync(filepath)) {
-          possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`
-        }
-      }
-    } else {
-      possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`
-    }
-  } else {
-    possibleVaultPath = path.resolve(process.cwd(), '.env.vault')
-  }
-
-  if (fs.existsSync(possibleVaultPath)) {
-    return possibleVaultPath
-  }
-
-  return null
-}
-
-function _resolveHome (envPath) {
-  return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath
-}
-
-function _configVault (options) {
-  const debug = Boolean(options && options.debug)
-  const quiet = options && 'quiet' in options ? options.quiet : true
-
-  if (debug || !quiet) {
-    _log('Loading env from encrypted .env.vault')
-  }
-
-  const parsed = DotenvModule._parseVault(options)
-
-  let processEnv = process.env
-  if (options && options.processEnv != null) {
-    processEnv = options.processEnv
-  }
-
-  DotenvModule.populate(processEnv, parsed, options)
-
-  return { parsed }
-}
-
-function configDotenv (options) {
-  const dotenvPath = path.resolve(process.cwd(), '.env')
-  let encoding = 'utf8'
-  const debug = Boolean(options && options.debug)
-  const quiet = options && 'quiet' in options ? options.quiet : true
-
-  if (options && options.encoding) {
-    encoding = options.encoding
-  } else {
-    if (debug) {
-      _debug('No encoding is specified. UTF-8 is used by default')
-    }
-  }
-
-  let optionPaths = [dotenvPath] // default, look for .env
-  if (options && options.path) {
-    if (!Array.isArray(options.path)) {
-      optionPaths = [_resolveHome(options.path)]
-    } else {
-      optionPaths = [] // reset default
-      for (const filepath of options.path) {
-        optionPaths.push(_resolveHome(filepath))
-      }
-    }
-  }
-
-  // Build the parsed data in a temporary object (because we need to return it).  Once we have the final
-  // parsed data, we will combine it with process.env (or options.processEnv if provided).
-  let lastError
-  const parsedAll = {}
-  for (const path of optionPaths) {
-    try {
-      // Specifying an encoding returns a string instead of a buffer
-      const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))
-
-      DotenvModule.populate(parsedAll, parsed, options)
-    } catch (e) {
-      if (debug) {
-        _debug(`Failed to load ${path} ${e.message}`)
-      }
-      lastError = e
-    }
-  }
-
-  let processEnv = process.env
-  if (options && options.processEnv != null) {
-    processEnv = options.processEnv
-  }
-
-  DotenvModule.populate(processEnv, parsedAll, options)
-
-  if (debug || !quiet) {
-    const keysCount = Object.keys(parsedAll).length
-    const shortPaths = []
-    for (const filePath of optionPaths) {
-      try {
-        const relative = path.relative(process.cwd(), filePath)
-        shortPaths.push(relative)
-      } catch (e) {
-        if (debug) {
-          _debug(`Failed to load ${filePath} ${e.message}`)
-        }
-        lastError = e
-      }
-    }
-
-    _log(`injecting env (${keysCount}) from ${shortPaths.join(',')}`)
-  }
-
-  if (lastError) {
-    return { parsed: parsedAll, error: lastError }
-  } else {
-    return { parsed: parsedAll }
-  }
-}
-
-// Populates process.env from .env file
-function config (options) {
-  // fallback to original dotenv if DOTENV_KEY is not set
-  if (_dotenvKey(options).length === 0) {
-    return DotenvModule.configDotenv(options)
-  }
-
-  const vaultPath = _vaultPath(options)
-
-  // dotenvKey exists but .env.vault file does not exist
-  if (!vaultPath) {
-    _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)
-
-    return DotenvModule.configDotenv(options)
-  }
-
-  return DotenvModule._configVault(options)
-}
-
-function decrypt (encrypted, keyStr) {
-  const key = Buffer.from(keyStr.slice(-64), 'hex')
-  let ciphertext = Buffer.from(encrypted, 'base64')
-
-  const nonce = ciphertext.subarray(0, 12)
-  const authTag = ciphertext.subarray(-16)
-  ciphertext = ciphertext.subarray(12, -16)
-
-  try {
-    const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)
-    aesgcm.setAuthTag(authTag)
-    return `${aesgcm.update(ciphertext)}${aesgcm.final()}`
-  } catch (error) {
-    const isRange = error instanceof RangeError
-    const invalidKeyLength = error.message === 'Invalid key length'
-    const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'
-
-    if (isRange || invalidKeyLength) {
-      const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')
-      err.code = 'INVALID_DOTENV_KEY'
-      throw err
-    } else if (decryptionFailed) {
-      const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')
-      err.code = 'DECRYPTION_FAILED'
-      throw err
-    } else {
-      throw error
-    }
-  }
-}
-
-// Populate process.env with parsed values
-function populate (processEnv, parsed, options = {}) {
-  const debug = Boolean(options && options.debug)
-  const override = Boolean(options && options.override)
-
-  if (typeof parsed !== 'object') {
-    const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')
-    err.code = 'OBJECT_REQUIRED'
-    throw err
-  }
-
-  // Set process.env
-  for (const key of Object.keys(parsed)) {
-    if (Object.prototype.hasOwnProperty.call(processEnv, key)) {
-      if (override === true) {
-        processEnv[key] = parsed[key]
-      }
-
-      if (debug) {
-        if (override === true) {
-          _debug(`"${key}" is already defined and WAS overwritten`)
-        } else {
-          _debug(`"${key}" is already defined and was NOT overwritten`)
-        }
-      }
-    } else {
-      processEnv[key] = parsed[key]
-    }
-  }
-}
-
-const DotenvModule = {
-  configDotenv,
-  _configVault,
-  _parseVault,
-  config,
-  decrypt,
-  parse,
-  populate
-}
-
-module.exports.configDotenv = DotenvModule.configDotenv
-module.exports._configVault = DotenvModule._configVault
-module.exports._parseVault = DotenvModule._parseVault
-module.exports.config = DotenvModule.config
-module.exports.decrypt = DotenvModule.decrypt
-module.exports.parse = DotenvModule.parse
-module.exports.populate = DotenvModule.populate
-
-module.exports = DotenvModule
Index: de_modules/dotenv/package.json
===================================================================
--- node_modules/dotenv/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,62 +1,0 @@
-{
-  "name": "dotenv",
-  "version": "16.6.1",
-  "description": "Loads environment variables from .env file",
-  "main": "lib/main.js",
-  "types": "lib/main.d.ts",
-  "exports": {
-    ".": {
-      "types": "./lib/main.d.ts",
-      "require": "./lib/main.js",
-      "default": "./lib/main.js"
-    },
-    "./config": "./config.js",
-    "./config.js": "./config.js",
-    "./lib/env-options": "./lib/env-options.js",
-    "./lib/env-options.js": "./lib/env-options.js",
-    "./lib/cli-options": "./lib/cli-options.js",
-    "./lib/cli-options.js": "./lib/cli-options.js",
-    "./package.json": "./package.json"
-  },
-  "scripts": {
-    "dts-check": "tsc --project tests/types/tsconfig.json",
-    "lint": "standard",
-    "pretest": "npm run lint && npm run dts-check",
-    "test": "tap run --allow-empty-coverage --disable-coverage --timeout=60000",
-    "test:coverage": "tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",
-    "prerelease": "npm test",
-    "release": "standard-version"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/motdotla/dotenv.git"
-  },
-  "homepage": "https://github.com/motdotla/dotenv#readme",
-  "funding": "https://dotenvx.com",
-  "keywords": [
-    "dotenv",
-    "env",
-    ".env",
-    "environment",
-    "variables",
-    "config",
-    "settings"
-  ],
-  "readmeFilename": "README.md",
-  "license": "BSD-2-Clause",
-  "devDependencies": {
-    "@types/node": "^18.11.3",
-    "decache": "^4.6.2",
-    "sinon": "^14.0.1",
-    "standard": "^17.0.0",
-    "standard-version": "^9.5.0",
-    "tap": "^19.2.0",
-    "typescript": "^4.8.4"
-  },
-  "engines": {
-    "node": ">=12"
-  },
-  "browser": {
-    "fs": false
-  }
-}
Index: de_modules/fill-range/LICENSE
===================================================================
--- node_modules/fill-range/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/fill-range/README.md
===================================================================
--- node_modules/fill-range/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,237 +1,0 @@
-# fill-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/fill-range.svg?style=flat)](https://www.npmjs.com/package/fill-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![NPM total downloads](https://img.shields.io/npm/dt/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/fill-range.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/fill-range)
-
-> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save fill-range
-```
-
-## Usage
-
-Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_.
-
-```js
-const fill = require('fill-range');
-// fill(from, to[, step, options]);
-
-console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
-console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10
-```
-
-**Params**
-
-* `from`: **{String|Number}** the number or letter to start with
-* `to`: **{String|Number}** the number or letter to end with
-* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use.
-* `options`: **{Object|Function}**: See all available [options](#options)
-
-## Examples
-
-By default, an array of values is returned.
-
-**Alphabetical ranges**
-
-```js
-console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e']
-console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ]
-```
-
-**Numerical ranges**
-
-Numbers can be defined as actual numbers or strings.
-
-```js
-console.log(fill(1, 5));     //=> [ 1, 2, 3, 4, 5 ]
-console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ]
-```
-
-**Negative ranges**
-
-Numbers can be defined as actual numbers or strings.
-
-```js
-console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ]
-console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ]
-```
-
-**Steps (increments)**
-
-```js
-// numerical ranges with increments
-console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ]
-console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ]
-console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ]
-
-// alphabetical ranges with increments
-console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ]
-console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
-console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ]
-```
-
-## Options
-
-### options.step
-
-**Type**: `number` (formatted as a string or number)
-
-**Default**: `undefined`
-
-**Description**: The increment to use for the range. Can be used with letters or numbers.
-
-**Example(s)**
-
-```js
-// numbers
-console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ]
-console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ]
-console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ]
-
-// letters
-console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
-console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ]
-console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ]
-```
-
-### options.strictRanges
-
-**Type**: `boolean`
-
-**Default**: `false`
-
-**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges.
-
-**Example(s)**
-
-The following are all invalid:
-
-```js
-fill('1.1', '2');   // decimals not supported in ranges
-fill('a', '2');     // incompatible range values
-fill(1, 10, 'foo'); // invalid "step" argument
-```
-
-### options.stringify
-
-**Type**: `boolean`
-
-**Default**: `undefined`
-
-**Description**: Cast all returned values to strings. By default, integers are returned as numbers.
-
-**Example(s)**
-
-```js
-console.log(fill(1, 5));                    //=> [ 1, 2, 3, 4, 5 ]
-console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ]
-```
-
-### options.toRegex
-
-**Type**: `boolean`
-
-**Default**: `undefined`
-
-**Description**: Create a regex-compatible source string, instead of expanding values to an array.
-
-**Example(s)**
-
-```js
-// alphabetical range
-console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]'
-// alphabetical with step
-console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y'
-// numerical range
-console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100'
-// numerical range with zero padding
-console.log(fill('000001', '100000', { toRegex: true }));
-//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000'
-```
-
-### options.transform
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_.
-
-**Example(s)**
-
-```js
-// add zero padding
-console.log(fill(1, 5, value => String(value).padStart(4, '0')));
-//=> ['0001', '0002', '0003', '0004', '0005']
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 116 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 4   | [paulmillr](https://github.com/paulmillr) |  
-| 2   | [realityking](https://github.com/realityking) |  
-| 2   | [bluelovers](https://github.com/bluelovers) |  
-| 1   | [edorivai](https://github.com/edorivai) |  
-| 1   | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)!
-
-<a href="https://www.patreon.com/jonschlinkert">
-<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="50">
-</a>
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._
Index: de_modules/fill-range/index.js
===================================================================
--- node_modules/fill-range/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,248 +1,0 @@
-/*!
- * fill-range <https://github.com/jonschlinkert/fill-range>
- *
- * Copyright (c) 2014-present, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-
-'use strict';
-
-const util = require('util');
-const toRegexRange = require('to-regex-range');
-
-const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
-
-const transform = toNumber => {
-  return value => toNumber === true ? Number(value) : String(value);
-};
-
-const isValidValue = value => {
-  return typeof value === 'number' || (typeof value === 'string' && value !== '');
-};
-
-const isNumber = num => Number.isInteger(+num);
-
-const zeros = input => {
-  let value = `${input}`;
-  let index = -1;
-  if (value[0] === '-') value = value.slice(1);
-  if (value === '0') return false;
-  while (value[++index] === '0');
-  return index > 0;
-};
-
-const stringify = (start, end, options) => {
-  if (typeof start === 'string' || typeof end === 'string') {
-    return true;
-  }
-  return options.stringify === true;
-};
-
-const pad = (input, maxLength, toNumber) => {
-  if (maxLength > 0) {
-    let dash = input[0] === '-' ? '-' : '';
-    if (dash) input = input.slice(1);
-    input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));
-  }
-  if (toNumber === false) {
-    return String(input);
-  }
-  return input;
-};
-
-const toMaxLen = (input, maxLength) => {
-  let negative = input[0] === '-' ? '-' : '';
-  if (negative) {
-    input = input.slice(1);
-    maxLength--;
-  }
-  while (input.length < maxLength) input = '0' + input;
-  return negative ? ('-' + input) : input;
-};
-
-const toSequence = (parts, options, maxLen) => {
-  parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
-  parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
-
-  let prefix = options.capture ? '' : '?:';
-  let positives = '';
-  let negatives = '';
-  let result;
-
-  if (parts.positives.length) {
-    positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');
-  }
-
-  if (parts.negatives.length) {
-    negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;
-  }
-
-  if (positives && negatives) {
-    result = `${positives}|${negatives}`;
-  } else {
-    result = positives || negatives;
-  }
-
-  if (options.wrap) {
-    return `(${prefix}${result})`;
-  }
-
-  return result;
-};
-
-const toRange = (a, b, isNumbers, options) => {
-  if (isNumbers) {
-    return toRegexRange(a, b, { wrap: false, ...options });
-  }
-
-  let start = String.fromCharCode(a);
-  if (a === b) return start;
-
-  let stop = String.fromCharCode(b);
-  return `[${start}-${stop}]`;
-};
-
-const toRegex = (start, end, options) => {
-  if (Array.isArray(start)) {
-    let wrap = options.wrap === true;
-    let prefix = options.capture ? '' : '?:';
-    return wrap ? `(${prefix}${start.join('|')})` : start.join('|');
-  }
-  return toRegexRange(start, end, options);
-};
-
-const rangeError = (...args) => {
-  return new RangeError('Invalid range arguments: ' + util.inspect(...args));
-};
-
-const invalidRange = (start, end, options) => {
-  if (options.strictRanges === true) throw rangeError([start, end]);
-  return [];
-};
-
-const invalidStep = (step, options) => {
-  if (options.strictRanges === true) {
-    throw new TypeError(`Expected step "${step}" to be a number`);
-  }
-  return [];
-};
-
-const fillNumbers = (start, end, step = 1, options = {}) => {
-  let a = Number(start);
-  let b = Number(end);
-
-  if (!Number.isInteger(a) || !Number.isInteger(b)) {
-    if (options.strictRanges === true) throw rangeError([start, end]);
-    return [];
-  }
-
-  // fix negative zero
-  if (a === 0) a = 0;
-  if (b === 0) b = 0;
-
-  let descending = a > b;
-  let startString = String(start);
-  let endString = String(end);
-  let stepString = String(step);
-  step = Math.max(Math.abs(step), 1);
-
-  let padded = zeros(startString) || zeros(endString) || zeros(stepString);
-  let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;
-  let toNumber = padded === false && stringify(start, end, options) === false;
-  let format = options.transform || transform(toNumber);
-
-  if (options.toRegex && step === 1) {
-    return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);
-  }
-
-  let parts = { negatives: [], positives: [] };
-  let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));
-  let range = [];
-  let index = 0;
-
-  while (descending ? a >= b : a <= b) {
-    if (options.toRegex === true && step > 1) {
-      push(a);
-    } else {
-      range.push(pad(format(a, index), maxLen, toNumber));
-    }
-    a = descending ? a - step : a + step;
-    index++;
-  }
-
-  if (options.toRegex === true) {
-    return step > 1
-      ? toSequence(parts, options, maxLen)
-      : toRegex(range, null, { wrap: false, ...options });
-  }
-
-  return range;
-};
-
-const fillLetters = (start, end, step = 1, options = {}) => {
-  if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {
-    return invalidRange(start, end, options);
-  }
-
-  let format = options.transform || (val => String.fromCharCode(val));
-  let a = `${start}`.charCodeAt(0);
-  let b = `${end}`.charCodeAt(0);
-
-  let descending = a > b;
-  let min = Math.min(a, b);
-  let max = Math.max(a, b);
-
-  if (options.toRegex && step === 1) {
-    return toRange(min, max, false, options);
-  }
-
-  let range = [];
-  let index = 0;
-
-  while (descending ? a >= b : a <= b) {
-    range.push(format(a, index));
-    a = descending ? a - step : a + step;
-    index++;
-  }
-
-  if (options.toRegex === true) {
-    return toRegex(range, null, { wrap: false, options });
-  }
-
-  return range;
-};
-
-const fill = (start, end, step, options = {}) => {
-  if (end == null && isValidValue(start)) {
-    return [start];
-  }
-
-  if (!isValidValue(start) || !isValidValue(end)) {
-    return invalidRange(start, end, options);
-  }
-
-  if (typeof step === 'function') {
-    return fill(start, end, 1, { transform: step });
-  }
-
-  if (isObject(step)) {
-    return fill(start, end, 0, step);
-  }
-
-  let opts = { ...options };
-  if (opts.capture === true) opts.wrap = true;
-  step = step || opts.step || 1;
-
-  if (!isNumber(step)) {
-    if (step != null && !isObject(step)) return invalidStep(step, opts);
-    return fill(start, end, 1, step);
-  }
-
-  if (isNumber(start) && isNumber(end)) {
-    return fillNumbers(start, end, step, opts);
-  }
-
-  return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);
-};
-
-module.exports = fill;
Index: de_modules/fill-range/package.json
===================================================================
--- node_modules/fill-range/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,74 +1,0 @@
-{
-  "name": "fill-range",
-  "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`",
-  "version": "7.1.1",
-  "homepage": "https://github.com/jonschlinkert/fill-range",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Edo Rivai (edo.rivai.nl)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Paul Miller (paulmillr.com)",
-    "Rouven Weßling (www.rouvenwessling.de)",
-    "(https://github.com/wtgtybhertgeghgtwtg)"
-  ],
-  "repository": "jonschlinkert/fill-range",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/fill-range/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8"
-  },
-  "scripts": {
-    "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
-    "mocha": "mocha --reporter dot",
-    "test": "npm run lint && npm run mocha",
-    "test:ci": "npm run test:cover",
-    "test:cover": "nyc npm run mocha"
-  },
-  "dependencies": {
-    "to-regex-range": "^5.0.1"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.1.1",
-    "nyc": "^15.1.0"
-  },
-  "keywords": [
-    "alpha",
-    "alphabetical",
-    "array",
-    "bash",
-    "brace",
-    "expand",
-    "expansion",
-    "fill",
-    "glob",
-    "match",
-    "matches",
-    "matching",
-    "number",
-    "numerical",
-    "range",
-    "ranges",
-    "regex",
-    "sh"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
Index: de_modules/glob-parent/CHANGELOG.md
===================================================================
--- node_modules/glob-parent/CHANGELOG.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,110 +1,0 @@
-### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06)
-
-
-### Bug Fixes
-
-* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366))
-
-### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27)
-
-
-### Bug Fixes
-
-* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb))
-
-## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27)
-
-
-### Features
-
-* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3))
-
-## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* Drop support for node <6 & bump dependencies
-
-### Miscellaneous Chores
-
-* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a))
-
-## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* question marks are valid path characters on Windows so avoid flagging as a glob when alone
-* Update is-glob dependency
-
-### Features
-
-* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e))
-* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841))
-* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281))
-
-## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27)
-
-
-### Features
-
-* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b))
-* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd))
-* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be))
-* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388))
-* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76))
-
-
-### Bug Fixes
-
-* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf))
-
-### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27)
-
-
-### Features
-
-* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc))
-
-
-### Bug Fixes
-
-* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030))
-
-## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* update is-glob dependency
-
-### Features
-
-* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd))
-
-## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27)
-
-
-### Features
-
-* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2))
-
-## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27)
-
-## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27)
-
-
-### Reverts
-
-* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0))
-
-## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27)
-
-
-### Features
-
-* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233))
-
-## 1.0.0 (2021-01-27)
-
Index: de_modules/glob-parent/LICENSE
===================================================================
--- node_modules/glob-parent/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-The ISC License
-
-Copyright (c) 2015, 2019 Elan Shanker
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/glob-parent/README.md
===================================================================
--- node_modules/glob-parent/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,137 +1,0 @@
-<p align="center">
-  <a href="https://gulpjs.com">
-    <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png">
-  </a>
-</p>
-
-# glob-parent
-
-[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url]
-
-Extract the non-magic parent path from a glob string.
-
-## Usage
-
-```js
-var globParent = require('glob-parent');
-
-globParent('path/to/*.js'); // 'path/to'
-globParent('/root/path/to/*.js'); // '/root/path/to'
-globParent('/*.js'); // '/'
-globParent('*.js'); // '.'
-globParent('**/*.js'); // '.'
-globParent('path/{to,from}'); // 'path'
-globParent('path/!(to|from)'); // 'path'
-globParent('path/?(to|from)'); // 'path'
-globParent('path/+(to|from)'); // 'path'
-globParent('path/*(to|from)'); // 'path'
-globParent('path/@(to|from)'); // 'path'
-globParent('path/**/*'); // 'path'
-
-// if provided a non-glob path, returns the nearest dir
-globParent('path/foo/bar.js'); // 'path/foo'
-globParent('path/foo/'); // 'path/foo'
-globParent('path/foo'); // 'path' (see issue #3 for details)
-```
-
-## API
-
-### `globParent(maybeGlobString, [options])`
-
-Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below.
-
-#### options
-
-```js
-{
-  // Disables the automatic conversion of slashes for Windows
-  flipBackslashes: true
-}
-```
-
-## Escaping
-
-The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters:
-
-- `?` (question mark) unless used as a path segment alone
-- `*` (asterisk)
-- `|` (pipe)
-- `(` (opening parenthesis)
-- `)` (closing parenthesis)
-- `{` (opening curly brace)
-- `}` (closing curly brace)
-- `[` (opening bracket)
-- `]` (closing bracket)
-
-**Example**
-
-```js
-globParent('foo/[bar]/') // 'foo'
-globParent('foo/\\[bar]/') // 'foo/[bar]'
-```
-
-## Limitations
-
-### Braces & Brackets
-This library attempts a quick and imperfect method of determining which path
-parts have glob magic without fully parsing/lexing the pattern. There are some
-advanced use cases that can trip it up, such as nested braces where the outer
-pair is escaped and the inner one contains a path separator. If you find
-yourself in the unlikely circumstance of being affected by this or need to
-ensure higher-fidelity glob handling in your library, it is recommended that you
-pre-process your input with [expand-braces] and/or [expand-brackets].
-
-### Windows
-Backslashes are not valid path separators for globs. If a path with backslashes
-is provided anyway, for simple cases, glob-parent will replace the path
-separator for you and return the non-glob parent path (now with
-forward-slashes, which are still valid as Windows path separators).
-
-This cannot be used in conjunction with escape characters.
-
-```js
-// BAD
-globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)'
-
-// GOOD
-globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)'
-```
-
-If you are using escape characters for a pattern without path parts (i.e.
-relative to `cwd`), prefix with `./` to avoid confusing glob-parent.
-
-```js
-// BAD
-globParent('foo \\[bar]') // 'foo '
-globParent('foo \\[bar]*') // 'foo '
-
-// GOOD
-globParent('./foo \\[bar]') // 'foo [bar]'
-globParent('./foo \\[bar]*') // '.'
-```
-
-## License
-
-ISC
-
-[expand-braces]: https://github.com/jonschlinkert/expand-braces
-[expand-brackets]: https://github.com/jonschlinkert/expand-brackets
-
-[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg
-[npm-url]: https://www.npmjs.com/package/glob-parent
-[npm-image]: https://img.shields.io/npm/v/glob-parent.svg
-
-[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master
-[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master
-
-[travis-url]: https://travis-ci.org/gulpjs/glob-parent
-[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci
-
-[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent
-[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor
-
-[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent
-[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg
-
-[gitter-url]: https://gitter.im/gulpjs/gulp
-[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg
Index: de_modules/glob-parent/index.js
===================================================================
--- node_modules/glob-parent/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,42 +1,0 @@
-'use strict';
-
-var isGlob = require('is-glob');
-var pathPosixDirname = require('path').posix.dirname;
-var isWin32 = require('os').platform() === 'win32';
-
-var slash = '/';
-var backslash = /\\/g;
-var enclosure = /[\{\[].*[\}\]]$/;
-var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;
-var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
-
-/**
- * @param {string} str
- * @param {Object} opts
- * @param {boolean} [opts.flipBackslashes=true]
- * @returns {string}
- */
-module.exports = function globParent(str, opts) {
-  var options = Object.assign({ flipBackslashes: true }, opts);
-
-  // flip windows path separators
-  if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {
-    str = str.replace(backslash, slash);
-  }
-
-  // special case for strings ending in enclosure containing path separator
-  if (enclosure.test(str)) {
-    str += slash;
-  }
-
-  // preserves full path in case of trailing path separator
-  str += 'a';
-
-  // remove path parts that are globby
-  do {
-    str = pathPosixDirname(str);
-  } while (isGlob(str) || globby.test(str));
-
-  // remove escape chars and return result
-  return str.replace(escaped, '$1');
-};
Index: de_modules/glob-parent/package.json
===================================================================
--- node_modules/glob-parent/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,48 +1,0 @@
-{
-  "name": "glob-parent",
-  "version": "5.1.2",
-  "description": "Extract the non-magic parent path from a glob string.",
-  "author": "Gulp Team <team@gulpjs.com> (https://gulpjs.com/)",
-  "contributors": [
-    "Elan Shanker (https://github.com/es128)",
-    "Blaine Bublitz <blaine.bublitz@gmail.com>"
-  ],
-  "repository": "gulpjs/glob-parent",
-  "license": "ISC",
-  "engines": {
-    "node": ">= 6"
-  },
-  "main": "index.js",
-  "files": [
-    "LICENSE",
-    "index.js"
-  ],
-  "scripts": {
-    "lint": "eslint .",
-    "pretest": "npm run lint",
-    "test": "nyc mocha --async-only",
-    "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit",
-    "coveralls": "nyc report --reporter=text-lcov | coveralls"
-  },
-  "dependencies": {
-    "is-glob": "^4.0.1"
-  },
-  "devDependencies": {
-    "coveralls": "^3.0.11",
-    "eslint": "^2.13.1",
-    "eslint-config-gulp": "^3.0.1",
-    "expect": "^1.20.2",
-    "mocha": "^6.0.2",
-    "nyc": "^13.3.0"
-  },
-  "keywords": [
-    "glob",
-    "parent",
-    "strip",
-    "path",
-    "dirname",
-    "directory",
-    "base",
-    "wildcard"
-  ]
-}
Index: de_modules/has-flag/index.js
===================================================================
--- node_modules/has-flag/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict';
-module.exports = (flag, argv) => {
-	argv = argv || process.argv;
-	const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
-	const pos = argv.indexOf(prefix + flag);
-	const terminatorPos = argv.indexOf('--');
-	return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
-};
Index: de_modules/has-flag/license
===================================================================
--- node_modules/has-flag/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/has-flag/package.json
===================================================================
--- node_modules/has-flag/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,44 +1,0 @@
-{
-  "name": "has-flag",
-  "version": "3.0.0",
-  "description": "Check if argv has a specific flag",
-  "license": "MIT",
-  "repository": "sindresorhus/has-flag",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "has",
-    "check",
-    "detect",
-    "contains",
-    "find",
-    "flag",
-    "cli",
-    "command-line",
-    "argv",
-    "process",
-    "arg",
-    "args",
-    "argument",
-    "arguments",
-    "getopt",
-    "minimist",
-    "optimist"
-  ],
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  }
-}
Index: de_modules/has-flag/readme.md
===================================================================
--- node_modules/has-flag/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,70 +1,0 @@
-# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag)
-
-> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag
-
-Correctly stops looking after an `--` argument terminator.
-
-
-## Install
-
-```
-$ npm install has-flag
-```
-
-
-## Usage
-
-```js
-// foo.js
-const hasFlag = require('has-flag');
-
-hasFlag('unicorn');
-//=> true
-
-hasFlag('--unicorn');
-//=> true
-
-hasFlag('f');
-//=> true
-
-hasFlag('-f');
-//=> true
-
-hasFlag('foo=bar');
-//=> true
-
-hasFlag('foo');
-//=> false
-
-hasFlag('rainbow');
-//=> false
-```
-
-```
-$ node foo.js -f --unicorn --foo=bar -- --rainbow
-```
-
-
-## API
-
-### hasFlag(flag, [argv])
-
-Returns a boolean for whether the flag exists.
-
-#### flag
-
-Type: `string`
-
-CLI flag to look for. The `--` prefix is optional.
-
-#### argv
-
-Type: `string[]`<br>
-Default: `process.argv`
-
-CLI arguments.
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
Index: de_modules/ignore-by-default/LICENSE
===================================================================
--- node_modules/ignore-by-default/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-ISC License (ISC)
-Copyright (c) 2016, Mark Wubben
-
-Permission to use, copy, modify, and/or distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright notice
-and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
Index: de_modules/ignore-by-default/README.md
===================================================================
--- node_modules/ignore-by-default/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,26 +1,0 @@
-# ignore-by-default
-
-This is a package aimed at Node.js development tools. It provides a list of
-directories that should probably be ignored by such tools, e.g. when watching
-for file changes.
-
-It's used by [AVA](https://www.npmjs.com/package/ava) and
-[nodemon](https://www.npmjs.com/package/nodemon).
-
-[Please contribute!](./CONTRIBUTING.md)
-
-## Installation
-
-```
-npm install --save ignore-by-default
-```
-
-## Usage
-
-The `ignore-by-default` module exports a `directories()` function, which will
-return an array of directory names. These are the ones you should ignore.
-
-```js
-// ['.git', '.sass_cache', …]
-var ignoredDirectories = require('ignore-by-default').directories()
-```
Index: de_modules/ignore-by-default/index.js
===================================================================
--- node_modules/ignore-by-default/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-'use strict'
-
-exports.directories = function () {
-  return [
-    '.git', // Git repository files, see <https://git-scm.com/>
-    '.nyc_output', // Temporary directory where nyc stores coverage data, see <https://github.com/bcoe/nyc>
-    '.sass-cache', // Cache folder for node-sass, see <https://github.com/sass/node-sass>
-    'bower_components', // Where Bower packages are installed, see <http://bower.io/>
-    'coverage', // Standard output directory for code coverage reports, see <https://github.com/gotwarlost/istanbul>
-    'node_modules' // Where Node modules are installed, see <https://nodejs.org/>
-  ]
-}
Index: de_modules/ignore-by-default/package.json
===================================================================
--- node_modules/ignore-by-default/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-{
-  "name": "ignore-by-default",
-  "version": "1.0.1",
-  "description": "A list of directories you should ignore by default",
-  "main": "index.js",
-  "files": [
-    "index.js"
-  ],
-  "scripts": {
-    "test": "standard && node test.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/novemberborn/ignore-by-default.git"
-  },
-  "keywords": [
-    "ignore",
-    "chokidar",
-    "watcher",
-    "exclude",
-    "glob",
-    "pattern"
-  ],
-  "author": "Mark Wubben (https://novemberborn.net/)",
-  "license": "ISC",
-  "bugs": {
-    "url": "https://github.com/novemberborn/ignore-by-default/issues"
-  },
-  "homepage": "https://github.com/novemberborn/ignore-by-default#readme",
-  "devDependencies": {
-    "figures": "^1.4.0",
-    "standard": "^6.0.4"
-  }
-}
Index: de_modules/is-binary-path/index.d.ts
===================================================================
--- node_modules/is-binary-path/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-/**
-Check if a file path is a binary file.
-
-@example
-```
-import isBinaryPath = require('is-binary-path');
-
-isBinaryPath('source/unicorn.png');
-//=> true
-
-isBinaryPath('source/unicorn.txt');
-//=> false
-```
-*/
-declare function isBinaryPath(filePath: string): boolean;
-
-export = isBinaryPath;
Index: de_modules/is-binary-path/index.js
===================================================================
--- node_modules/is-binary-path/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-'use strict';
-const path = require('path');
-const binaryExtensions = require('binary-extensions');
-
-const extensions = new Set(binaryExtensions);
-
-module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase());
Index: de_modules/is-binary-path/license
===================================================================
--- node_modules/is-binary-path/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-MIT License
-
-Copyright (c) 2019 Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com), Paul Miller (https://paulmillr.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/is-binary-path/package.json
===================================================================
--- node_modules/is-binary-path/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,40 +1,0 @@
-{
-	"name": "is-binary-path",
-	"version": "2.1.0",
-	"description": "Check if a file path is a binary file",
-	"license": "MIT",
-	"repository": "sindresorhus/is-binary-path",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"binary",
-		"extensions",
-		"extension",
-		"file",
-		"path",
-		"check",
-		"detect",
-		"is"
-	],
-	"dependencies": {
-		"binary-extensions": "^2.0.0"
-	},
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
Index: de_modules/is-binary-path/readme.md
===================================================================
--- node_modules/is-binary-path/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-# is-binary-path [![Build Status](https://travis-ci.org/sindresorhus/is-binary-path.svg?branch=master)](https://travis-ci.org/sindresorhus/is-binary-path)
-
-> Check if a file path is a binary file
-
-
-## Install
-
-```
-$ npm install is-binary-path
-```
-
-
-## Usage
-
-```js
-const isBinaryPath = require('is-binary-path');
-
-isBinaryPath('source/unicorn.png');
-//=> true
-
-isBinaryPath('source/unicorn.txt');
-//=> false
-```
-
-
-## Related
-
-- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions
-- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com)
Index: de_modules/is-extglob/LICENSE
===================================================================
--- node_modules/is-extglob/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2016, Jon Schlinkert
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/is-extglob/README.md
===================================================================
--- node_modules/is-extglob/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,107 +1,0 @@
-# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob)
-
-> Returns true if a string has an extglob.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-extglob
-```
-
-## Usage
-
-```js
-var isExtglob = require('is-extglob');
-```
-
-**True**
-
-```js
-isExtglob('?(abc)');
-isExtglob('@(abc)');
-isExtglob('!(abc)');
-isExtglob('*(abc)');
-isExtglob('+(abc)');
-```
-
-**False**
-
-Escaped extglobs:
-
-```js
-isExtglob('\\?(abc)');
-isExtglob('\\@(abc)');
-isExtglob('\\!(abc)');
-isExtglob('\\*(abc)');
-isExtglob('\\+(abc)');
-```
-
-Everything else...
-
-```js
-isExtglob('foo.js');
-isExtglob('!foo.js');
-isExtglob('*.js');
-isExtglob('**/abc.js');
-isExtglob('abc/*.js');
-isExtglob('abc/(aaa|bbb).js');
-isExtglob('abc/[a-z].js');
-isExtglob('abc/{a,b}.js');
-isExtglob('abc/?.js');
-isExtglob('abc.js');
-isExtglob('abc/def/ghi.js');
-```
-
-## History
-
-**v2.0**
-
-Adds support for escaping. Escaped exglobs no longer return true.
-
-## About
-
-### Related projects
-
-* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.")
-* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
-* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
-
-### Contributing
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-### Building docs
-
-_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
-
-To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
-
-```sh
-$ npm install -g verb verb-generate-readme && verb
-```
-
-### Running tests
-
-Install dev dependencies:
-
-```sh
-$ npm install -d && npm test
-```
-
-### Author
-
-**Jon Schlinkert**
-
-* [github/jonschlinkert](https://github.com/jonschlinkert)
-* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._
Index: de_modules/is-extglob/index.js
===================================================================
--- node_modules/is-extglob/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-/*!
- * is-extglob <https://github.com/jonschlinkert/is-extglob>
- *
- * Copyright (c) 2014-2016, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-
-module.exports = function isExtglob(str) {
-  if (typeof str !== 'string' || str === '') {
-    return false;
-  }
-
-  var match;
-  while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) {
-    if (match[2]) return true;
-    str = str.slice(match.index + match[0].length);
-  }
-
-  return false;
-};
Index: de_modules/is-extglob/package.json
===================================================================
--- node_modules/is-extglob/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,69 +1,0 @@
-{
-  "name": "is-extglob",
-  "description": "Returns true if a string has an extglob.",
-  "version": "2.1.1",
-  "homepage": "https://github.com/jonschlinkert/is-extglob",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "repository": "jonschlinkert/is-extglob",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/is-extglob/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^0.1.10",
-    "mocha": "^3.0.2"
-  },
-  "keywords": [
-    "bash",
-    "braces",
-    "check",
-    "exec",
-    "expression",
-    "extglob",
-    "glob",
-    "globbing",
-    "globstar",
-    "is",
-    "match",
-    "matches",
-    "pattern",
-    "regex",
-    "regular",
-    "string",
-    "test"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "list": [
-        "has-glob",
-        "is-glob",
-        "micromatch"
-      ]
-    },
-    "reflinks": [
-      "verb",
-      "verb-generate-readme"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
Index: de_modules/is-glob/LICENSE
===================================================================
--- node_modules/is-glob/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2017, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/is-glob/README.md
===================================================================
--- node_modules/is-glob/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,206 +1,0 @@
-# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![NPM total downloads](https://img.shields.io/npm/dt/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/github/workflow/status/micromatch/is-glob/dev)](https://github.com/micromatch/is-glob/actions)
-
-> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-glob
-```
-
-You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob).
-
-## Usage
-
-```js
-var isGlob = require('is-glob');
-```
-
-### Default behavior
-
-**True**
-
-Patterns that have glob characters or regex patterns will return `true`:
-
-```js
-isGlob('!foo.js');
-isGlob('*.js');
-isGlob('**/abc.js');
-isGlob('abc/*.js');
-isGlob('abc/(aaa|bbb).js');
-isGlob('abc/[a-z].js');
-isGlob('abc/{a,b}.js');
-//=> true
-```
-
-Extglobs
-
-```js
-isGlob('abc/@(a).js');
-isGlob('abc/!(a).js');
-isGlob('abc/+(a).js');
-isGlob('abc/*(a).js');
-isGlob('abc/?(a).js');
-//=> true
-```
-
-**False**
-
-Escaped globs or extglobs return `false`:
-
-```js
-isGlob('abc/\\@(a).js');
-isGlob('abc/\\!(a).js');
-isGlob('abc/\\+(a).js');
-isGlob('abc/\\*(a).js');
-isGlob('abc/\\?(a).js');
-isGlob('\\!foo.js');
-isGlob('\\*.js');
-isGlob('\\*\\*/abc.js');
-isGlob('abc/\\*.js');
-isGlob('abc/\\(aaa|bbb).js');
-isGlob('abc/\\[a-z].js');
-isGlob('abc/\\{a,b}.js');
-//=> false
-```
-
-Patterns that do not have glob patterns return `false`:
-
-```js
-isGlob('abc.js');
-isGlob('abc/def/ghi.js');
-isGlob('foo.js');
-isGlob('abc/@.js');
-isGlob('abc/+.js');
-isGlob('abc/?.js');
-isGlob();
-isGlob(null);
-//=> false
-```
-
-Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)):
-
-```js
-isGlob(['**/*.js']);
-isGlob(['foo.js']);
-//=> false
-```
-
-### Option strict
-
-When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that
-some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not.
-
-**True**
-
-Patterns that have glob characters or regex patterns will return `true`:
-
-```js
-isGlob('!foo.js', {strict: false});
-isGlob('*.js', {strict: false});
-isGlob('**/abc.js', {strict: false});
-isGlob('abc/*.js', {strict: false});
-isGlob('abc/(aaa|bbb).js', {strict: false});
-isGlob('abc/[a-z].js', {strict: false});
-isGlob('abc/{a,b}.js', {strict: false});
-//=> true
-```
-
-Extglobs
-
-```js
-isGlob('abc/@(a).js', {strict: false});
-isGlob('abc/!(a).js', {strict: false});
-isGlob('abc/+(a).js', {strict: false});
-isGlob('abc/*(a).js', {strict: false});
-isGlob('abc/?(a).js', {strict: false});
-//=> true
-```
-
-**False**
-
-Escaped globs or extglobs return `false`:
-
-```js
-isGlob('\\!foo.js', {strict: false});
-isGlob('\\*.js', {strict: false});
-isGlob('\\*\\*/abc.js', {strict: false});
-isGlob('abc/\\*.js', {strict: false});
-isGlob('abc/\\(aaa|bbb).js', {strict: false});
-isGlob('abc/\\[a-z].js', {strict: false});
-isGlob('abc/\\{a,b}.js', {strict: false});
-//=> false
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit")
-* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks")
-* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.")
-* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.")
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 47 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 5  | [doowb](https://github.com/doowb) |  
-| 1  | [phated](https://github.com/phated) |  
-| 1  | [danhper](https://github.com/danhper) |  
-| 1  | [paulmillr](https://github.com/paulmillr) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._
Index: de_modules/is-glob/index.js
===================================================================
--- node_modules/is-glob/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,150 +1,0 @@
-/*!
- * is-glob <https://github.com/jonschlinkert/is-glob>
- *
- * Copyright (c) 2014-2017, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-var isExtglob = require('is-extglob');
-var chars = { '{': '}', '(': ')', '[': ']'};
-var strictCheck = function(str) {
-  if (str[0] === '!') {
-    return true;
-  }
-  var index = 0;
-  var pipeIndex = -2;
-  var closeSquareIndex = -2;
-  var closeCurlyIndex = -2;
-  var closeParenIndex = -2;
-  var backSlashIndex = -2;
-  while (index < str.length) {
-    if (str[index] === '*') {
-      return true;
-    }
-
-    if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) {
-      return true;
-    }
-
-    if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {
-      if (closeSquareIndex < index) {
-        closeSquareIndex = str.indexOf(']', index);
-      }
-      if (closeSquareIndex > index) {
-        if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
-          return true;
-        }
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {
-      closeCurlyIndex = str.indexOf('}', index);
-      if (closeCurlyIndex > index) {
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {
-      closeParenIndex = str.indexOf(')', index);
-      if (closeParenIndex > index) {
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {
-      if (pipeIndex < index) {
-        pipeIndex = str.indexOf('|', index);
-      }
-      if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {
-        closeParenIndex = str.indexOf(')', pipeIndex);
-        if (closeParenIndex > pipeIndex) {
-          backSlashIndex = str.indexOf('\\', pipeIndex);
-          if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
-            return true;
-          }
-        }
-      }
-    }
-
-    if (str[index] === '\\') {
-      var open = str[index + 1];
-      index += 2;
-      var close = chars[open];
-
-      if (close) {
-        var n = str.indexOf(close, index);
-        if (n !== -1) {
-          index = n + 1;
-        }
-      }
-
-      if (str[index] === '!') {
-        return true;
-      }
-    } else {
-      index++;
-    }
-  }
-  return false;
-};
-
-var relaxedCheck = function(str) {
-  if (str[0] === '!') {
-    return true;
-  }
-  var index = 0;
-  while (index < str.length) {
-    if (/[*?{}()[\]]/.test(str[index])) {
-      return true;
-    }
-
-    if (str[index] === '\\') {
-      var open = str[index + 1];
-      index += 2;
-      var close = chars[open];
-
-      if (close) {
-        var n = str.indexOf(close, index);
-        if (n !== -1) {
-          index = n + 1;
-        }
-      }
-
-      if (str[index] === '!') {
-        return true;
-      }
-    } else {
-      index++;
-    }
-  }
-  return false;
-};
-
-module.exports = function isGlob(str, options) {
-  if (typeof str !== 'string' || str === '') {
-    return false;
-  }
-
-  if (isExtglob(str)) {
-    return true;
-  }
-
-  var check = strictCheck;
-
-  // optionally relax check
-  if (options && options.strict === false) {
-    check = relaxedCheck;
-  }
-
-  return check(str);
-};
Index: de_modules/is-glob/package.json
===================================================================
--- node_modules/is-glob/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,81 +1,0 @@
-{
-  "name": "is-glob",
-  "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.",
-  "version": "4.0.3",
-  "homepage": "https://github.com/micromatch/is-glob",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Brian Woodward (https://twitter.com/doowb)",
-    "Daniel Perez (https://tuvistavie.com)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "micromatch/is-glob",
-  "bugs": {
-    "url": "https://github.com/micromatch/is-glob/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha && node benchmark.js"
-  },
-  "dependencies": {
-    "is-extglob": "^2.1.1"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^0.1.10",
-    "mocha": "^3.0.2"
-  },
-  "keywords": [
-    "bash",
-    "braces",
-    "check",
-    "exec",
-    "expression",
-    "extglob",
-    "glob",
-    "globbing",
-    "globstar",
-    "is",
-    "match",
-    "matches",
-    "pattern",
-    "regex",
-    "regular",
-    "string",
-    "test"
-  ],
-  "verb": {
-    "layout": "default",
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "list": [
-        "assemble",
-        "base",
-        "update",
-        "verb"
-      ]
-    },
-    "reflinks": [
-      "assemble",
-      "bach",
-      "base",
-      "composer",
-      "gulp",
-      "has-glob",
-      "is-valid-glob",
-      "micromatch",
-      "npm",
-      "scaffold",
-      "verb",
-      "vinyl"
-    ]
-  }
-}
Index: de_modules/is-number/LICENSE
===================================================================
--- node_modules/is-number/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/is-number/README.md
===================================================================
--- node_modules/is-number/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,187 +1,0 @@
-# is-number [![NPM version](https://img.shields.io/npm/v/is-number.svg?style=flat)](https://www.npmjs.com/package/is-number) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![NPM total downloads](https://img.shields.io/npm/dt/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-number.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-number)
-
-> Returns true if the value is a finite number.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-number
-```
-
-## Why is this needed?
-
-In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results:
-
-```js
-console.log(+[]); //=> 0
-console.log(+''); //=> 0
-console.log(+'   '); //=> 0
-console.log(typeof NaN); //=> 'number'
-```
-
-This library offers a performant way to smooth out edge cases like these.
-
-## Usage
-
-```js
-const isNumber = require('is-number');
-```
-
-See the [tests](./test.js) for more examples.
-
-### true
-
-```js
-isNumber(5e3);               // true
-isNumber(0xff);              // true
-isNumber(-1.1);              // true
-isNumber(0);                 // true
-isNumber(1);                 // true
-isNumber(1.1);               // true
-isNumber(10);                // true
-isNumber(10.10);             // true
-isNumber(100);               // true
-isNumber('-1.1');            // true
-isNumber('0');               // true
-isNumber('012');             // true
-isNumber('0xff');            // true
-isNumber('1');               // true
-isNumber('1.1');             // true
-isNumber('10');              // true
-isNumber('10.10');           // true
-isNumber('100');             // true
-isNumber('5e3');             // true
-isNumber(parseInt('012'));   // true
-isNumber(parseFloat('012')); // true
-```
-
-### False
-
-Everything else is false, as you would expect:
-
-```js
-isNumber(Infinity);          // false
-isNumber(NaN);               // false
-isNumber(null);              // false
-isNumber(undefined);         // false
-isNumber('');                // false
-isNumber('   ');             // false
-isNumber('foo');             // false
-isNumber([1]);               // false
-isNumber([]);                // false
-isNumber(function () {});    // false
-isNumber({});                // false
-```
-
-## Release history
-
-### 7.0.0
-
-* Refactor. Now uses `.isFinite` if it exists.
-* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number.
-
-### 6.0.0
-
-* Optimizations, thanks to @benaadams.
-
-### 5.0.0
-
-**Breaking changes**
-
-* removed support for `instanceof Number` and `instanceof String`
-
-## Benchmarks
-
-As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail.
-
-```
-# all
-v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled)
-v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled)
-parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled)
-fastest is 'v7.0'
-
-# string
-v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled)
-v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled)
-parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled)
-fastest is 'parseFloat,v7.0'
-
-# number
-v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled)
-v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled)
-parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled)
-fastest is 'v6.0'
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.")
-* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive.  | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
-* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.")
-* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.")
-
-### Contributors
-
-| **Commits** | **Contributor** | 
-| --- | --- |
-| 49 | [jonschlinkert](https://github.com/jonschlinkert) |
-| 5 | [charlike-old](https://github.com/charlike-old) |
-| 1 | [benaadams](https://github.com/benaadams) |
-| 1 | [realityking](https://github.com/realityking) |
-
-### Author
-
-**Jon Schlinkert**
-
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._
Index: de_modules/is-number/index.js
===================================================================
--- node_modules/is-number/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,18 +1,0 @@
-/*!
- * is-number <https://github.com/jonschlinkert/is-number>
- *
- * Copyright (c) 2014-present, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-'use strict';
-
-module.exports = function(num) {
-  if (typeof num === 'number') {
-    return num - num === 0;
-  }
-  if (typeof num === 'string' && num.trim() !== '') {
-    return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
-  }
-  return false;
-};
Index: de_modules/is-number/package.json
===================================================================
--- node_modules/is-number/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-{
-  "name": "is-number",
-  "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.",
-  "version": "7.0.0",
-  "homepage": "https://github.com/jonschlinkert/is-number",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Olsten Larck (https://i.am.charlike.online)",
-    "Rouven Weßling (www.rouvenwessling.de)"
-  ],
-  "repository": "jonschlinkert/is-number",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/is-number/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.12.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "ansi": "^0.3.1",
-    "benchmark": "^2.1.4",
-    "gulp-format-md": "^1.0.0",
-    "mocha": "^3.5.3"
-  },
-  "keywords": [
-    "cast",
-    "check",
-    "coerce",
-    "coercion",
-    "finite",
-    "integer",
-    "is",
-    "isnan",
-    "is-nan",
-    "is-num",
-    "is-number",
-    "isnumber",
-    "isfinite",
-    "istype",
-    "kind",
-    "math",
-    "nan",
-    "num",
-    "number",
-    "numeric",
-    "parseFloat",
-    "parseInt",
-    "test",
-    "type",
-    "typeof",
-    "value"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "related": {
-      "list": [
-        "is-plain-object",
-        "is-primitive",
-        "isobject",
-        "kind-of"
-      ]
-    },
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
Index: de_modules/minimatch/LICENSE.md
===================================================================
--- node_modules/minimatch/LICENSE.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,55 +1,0 @@
-# Blue Oak Model License
-
-Version 1.0.0
-
-## Purpose
-
-This license gives everyone as much permission to work with
-this software as possible, while protecting contributors
-from liability.
-
-## Acceptance
-
-In order to receive this license, you must agree to its
-rules. The rules of this license are both obligations
-under that agreement and conditions to your license.
-You must not do anything with this software that triggers
-a rule that you cannot or will not follow.
-
-## Copyright
-
-Each contributor licenses you to do everything with this
-software that would otherwise infringe that contributor's
-copyright in it.
-
-## Notices
-
-You must ensure that everyone who gets a copy of
-any part of this software from you, with or without
-changes, also gets the text of this license or a link to
-<https://blueoakcouncil.org/license/1.0.0>.
-
-## Excuse
-
-If anyone notifies you in writing that you have not
-complied with [Notices](#notices), you can keep your
-license by taking all practical steps to comply within 30
-days after the notice. If you do not do so, your license
-ends immediately.
-
-## Patent
-
-Each contributor licenses you to do everything with this
-software that would otherwise infringe any patent claims
-they can license or become able to license.
-
-## Reliability
-
-No contributor can revoke this license.
-
-## No Liability
-
-**_As far as the law allows, this software comes as is,
-without any warranty or condition, and no contributor
-will be liable to anyone for any damages related to this
-software or this license, under any kind of legal claim._**
Index: de_modules/minimatch/README.md
===================================================================
--- node_modules/minimatch/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,528 +1,0 @@
-# minimatch
-
-A minimal matching utility.
-
-This is the matching library used internally by npm.
-
-It works by converting glob expressions into JavaScript `RegExp`
-objects.
-
-## Important Security Consideration!
-
-> [!WARNING]  
-> This library uses JavaScript regular expressions. Please read
-> the following warning carefully, and be thoughtful about what
-> you provide to this library in production systems.
-
-_Any_ library in JavaScript that deals with matching string
-patterns using regular expressions will be subject to
-[ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
-if the pattern is generated using untrusted input.
-
-Efforts have been made to mitigate risk as much as is feasible in
-such a library, providing maximum recursion depths and so forth,
-but these measures can only ultimately protect against accidents,
-not malice. A dedicated attacker can _always_ find patterns that
-cannot be defended against by a bash-compatible glob pattern
-matching system that uses JavaScript regular expressions.
-
-To be extremely clear:
-
-> [!WARNING]  
-> **If you create a system where you take user input, and use
-> that input as the source of a Regular Expression pattern, in
-> this or any extant glob matcher in JavaScript, you will be
-> pwned.**
-
-A future version of this library _may_ use a different matching
-algorithm which does not exhibit backtracking problems. If and
-when that happens, it will likely be a sweeping change, and those
-improvements will **not** be backported to legacy versions.
-
-In the near term, it is not reasonable to continue to play
-whack-a-mole with security advisories, and so any future ReDoS
-reports will be considered "working as intended", and resolved
-entirely by this warning.
-
-## Usage
-
-```js
-// hybrid module, load with require() or import
-import { minimatch } from 'minimatch'
-// or:
-const { minimatch } = require('minimatch')
-
-minimatch('bar.foo', '*.foo') // true!
-minimatch('bar.foo', '*.bar') // false!
-minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // true, and noisy!
-```
-
-## Features
-
-Supports these glob features:
-
-- Brace Expansion
-- Extended glob matching
-- "Globstar" `**` matching
-- [Posix character
-  classes](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html),
-  like `[[:alpha:]]`, supporting the full range of Unicode
-  characters. For example, `[[:alpha:]]` will match against
-  `'é'`, though `[a-zA-Z]` will not. Collating symbol and set
-  matching is not supported, so `[[=e=]]` will _not_ match `'é'`
-  and `[[.ch.]]` will not match `'ch'` in locales where `ch` is
-  considered a single character.
-
-See:
-
-- `man sh`
-- `man bash` [Pattern
-  Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
-- `man 3 fnmatch`
-- `man 5 gitignore`
-
-## Windows
-
-**Please only use forward-slashes in glob expressions.**
-
-Though windows uses either `/` or `\` as its path separator, only `/`
-characters are used by this glob implementation. You must use
-forward-slashes **only** in glob expressions. Back-slashes in patterns
-will always be interpreted as escape characters, not path separators.
-
-Note that `\` or `/` _will_ be interpreted as path separators in paths on
-Windows, and will match against `/` in glob expressions.
-
-So just always use `/` in patterns.
-
-### UNC Paths
-
-On Windows, UNC paths like `//?/c:/...` or
-`//ComputerName/Share/...` are handled specially.
-
-- Patterns starting with a double-slash followed by some
-  non-slash characters will preserve their double-slash. As a
-  result, a pattern like `//*` will match `//x`, but not `/x`.
-- Patterns staring with `//?/<drive letter>:` will _not_ treat
-  the `?` as a wildcard character. Instead, it will be treated
-  as a normal string.
-- Patterns starting with `//?/<drive letter>:/...` will match
-  file paths starting with `<drive letter>:/...`, and vice versa,
-  as if the `//?/` was not present. This behavior only is
-  present when the drive letters are a case-insensitive match to
-  one another. The remaining portions of the path/pattern are
-  compared case sensitively, unless `nocase:true` is set.
-
-Note that specifying a UNC path using `\` characters as path
-separators is always allowed in the file path argument, but only
-allowed in the pattern argument when `windowsPathsNoEscape: true`
-is set in the options.
-
-## Minimatch Class
-
-Create a minimatch object by instantiating the `minimatch.Minimatch` class.
-
-```javascript
-var Minimatch = require('minimatch').Minimatch
-var mm = new Minimatch(pattern, options)
-```
-
-### Properties
-
-- `pattern` The original pattern the minimatch object represents.
-- `options` The options supplied to the constructor.
-- `set` A 2-dimensional array of regexp or string expressions.
-  Each row in the
-  array corresponds to a brace-expanded pattern. Each item in the row
-  corresponds to a single path-part. For example, the pattern
-  `{a,b/c}/d` would expand to a set of patterns like:
-
-        [ [ a, d ]
-        , [ b, c, d ] ]
-
-  If a portion of the pattern doesn't have any "magic" in it
-  (that is, it's something like `"foo"` rather than `fo*o?`), then it
-  will be left as a string rather than converted to a regular
-  expression.
-
-- `regexp` Created by the `makeRe` method. A single regular expression
-  expressing the entire pattern. This is useful in cases where you wish
-  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
-- `negate` True if the pattern is negated.
-- `comment` True if the pattern is a comment.
-- `empty` True if the pattern is `""`.
-
-### Methods
-
-- `makeRe()` Generate the `regexp` member if necessary, and return it.
-  Will return `false` if the pattern is invalid.
-- `match(fname)` Return true if the filename matches the pattern, or
-  false otherwise.
-- `matchOne(fileArray, patternArray, partial)` Take a `/`-split
-  filename, and match it against a single row in the `regExpSet`. This
-  method is mainly for internal use, but is exposed so that it can be
-  used by a glob-walker that needs to avoid excessive filesystem calls.
-- `hasMagic()` Returns true if the parsed pattern contains any
-  magic characters. Returns false if all comparator parts are
-  string literals. If the `magicalBraces` option is set on the
-  constructor, then it will consider brace expansions which are
-  not otherwise magical to be magic. If not set, then a pattern
-  like `a{b,c}d` will return `false`, because neither `abd` nor
-  `acd` contain any special glob characters.
-
-  This does **not** mean that the pattern string can be used as a
-  literal filename, as it may contain magic glob characters that
-  are escaped. For example, the pattern `\\*` or `[*]` would not
-  be considered to have magic, as the matching portion parses to
-  the literal string `'*'` and would match a path named `'*'`,
-  not `'\\*'` or `'[*]'`. The `minimatch.unescape()` method may
-  be used to remove escape characters.
-
-All other methods are internal, and will be called as necessary.
-
-### minimatch(path, pattern, options)
-
-Main export. Tests a path against the pattern using the options.
-
-```javascript
-var isJS = minimatch(file, '*.js', { matchBase: true })
-```
-
-### minimatch.filter(pattern, options)
-
-Returns a function that tests its
-supplied argument, suitable for use with `Array.filter`. Example:
-
-```javascript
-var javascripts = fileList.filter(
-  minimatch.filter('*.js', { matchBase: true }),
-)
-```
-
-### minimatch.escape(pattern, options = {})
-
-Escape all magic characters in a glob pattern, so that it will
-only ever match literal strings.
-
-If the `windowsPathsNoEscape` option is used, then characters are
-escaped by wrapping in `[]`, because a magic character wrapped in
-a character class can only be satisfied by that exact character.
-
-Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
-be escaped or unescaped.
-
-### minimatch.unescape(pattern, options = {})
-
-Un-escape a glob string that may contain some escaped characters.
-
-If the `windowsPathsNoEscape` option is used, then square-brace
-escapes are removed, but not backslash escapes. For example, it
-will turn the string `'[*]'` into `*`, but it will not turn
-`'\\*'` into `'*'`, because `\` is a path separator in
-`windowsPathsNoEscape` mode.
-
-When `windowsPathsNoEscape` is not set, then both brace escapes
-and backslash escapes are removed.
-
-Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
-be escaped or unescaped.
-
-### minimatch.match(list, pattern, options)
-
-Match against the list of
-files, in the style of fnmatch or glob. If nothing is matched, and
-options.nonull is set, then return a list containing the pattern itself.
-
-```javascript
-var javascripts = minimatch.match(fileList, '*.js', { matchBase: true })
-```
-
-### minimatch.makeRe(pattern, options)
-
-Make a regular expression object from the pattern.
-
-## Options
-
-All options are `false` by default.
-
-### debug
-
-Dump a ton of stuff to stderr.
-
-### nobrace
-
-Do not expand `{a,b}` and `{1..3}` brace sets.
-
-### noglobstar
-
-Disable `**` matching against multiple folder names.
-
-### dot
-
-Allow patterns to match filenames starting with a period, even if
-the pattern does not explicitly have a period in that spot.
-
-Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
-is set.
-
-### noext
-
-Disable "extglob" style patterns like `+(a|b)`.
-
-### nocase
-
-Perform a case-insensitive match.
-
-### nocaseMagicOnly
-
-When used with `{nocase: true}`, create regular expressions that
-are case-insensitive, but leave string match portions untouched.
-Has no effect when used without `{nocase: true}`.
-
-Useful when some other form of case-insensitive matching is used,
-or if the original string representation is useful in some other
-way.
-
-### nonull
-
-When a match is not found by `minimatch.match`, return a list containing
-the pattern itself if this option is set. When not set, an empty list
-is returned if there are no matches.
-
-### magicalBraces
-
-This only affects the results of the `Minimatch.hasMagic` method.
-
-If the pattern contains brace expansions, such as `a{b,c}d`, but
-no other magic characters, then the `Minimatch.hasMagic()` method
-will return `false` by default. When this option set, it will
-return `true` for brace expansion as well as other magic glob
-characters.
-
-### matchBase
-
-If set, then patterns without slashes will be matched
-against the basename of the path if it contains slashes. For example,
-`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
-
-### nocomment
-
-Suppress the behavior of treating `#` at the start of a pattern as a
-comment.
-
-### nonegate
-
-Suppress the behavior of treating a leading `!` character as negation.
-
-### flipNegate
-
-Returns from negate expressions the same as if they were not negated.
-(Ie, true on a hit, false on a miss.)
-
-### partial
-
-Compare a partial path to a pattern. As long as the parts of the path that
-are present are not contradicted by the pattern, it will be treated as a
-match. This is useful in applications where you're walking through a
-folder structure, and don't yet have the full path, but want to ensure that
-you do not walk down paths that can never be a match.
-
-For example,
-
-```js
-minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d
-minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d
-minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a
-```
-
-### windowsPathsNoEscape
-
-Use `\\` as a path separator _only_, and _never_ as an escape
-character. If set, all `\\` characters are replaced with `/` in
-the pattern. Note that this makes it **impossible** to match
-against paths containing literal glob pattern characters, but
-allows matching with patterns constructed using `path.join()` and
-`path.resolve()` on Windows platforms, mimicking the (buggy!)
-behavior of earlier versions on Windows. Please use with
-caution, and be mindful of [the caveat about Windows
-paths](#windows).
-
-For legacy reasons, this is also set if
-`options.allowWindowsEscape` is set to the exact value `false`.
-
-### windowsNoMagicRoot
-
-When a pattern starts with a UNC path or drive letter, and in
-`nocase:true` mode, do not convert the root portions of the
-pattern into a case-insensitive regular expression, and instead
-leave them as strings.
-
-This is the default when the platform is `win32` and
-`nocase:true` is set.
-
-### preserveMultipleSlashes
-
-By default, multiple `/` characters (other than the leading `//`
-in a UNC path, see "UNC Paths" above) are treated as a single
-`/`.
-
-That is, a pattern like `a///b` will match the file path `a/b`.
-
-Set `preserveMultipleSlashes: true` to suppress this behavior.
-
-### optimizationLevel
-
-A number indicating the level of optimization that should be done
-to the pattern prior to parsing and using it for matches.
-
-Globstar parts `**` are always converted to `*` when `noglobstar`
-is set, and multiple adjacent `**` parts are converted into a
-single `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this
-is equivalent in all cases).
-
-- `0` - Make no further changes. In this mode, `.` and `..` are
-  maintained in the pattern, meaning that they must also appear
-  in the same position in the test path string. Eg, a pattern
-  like `a/*/../c` will match the string `a/b/../c` but not the
-  string `a/c`.
-- `1` - (default) Remove cases where a double-dot `..` follows a
-  pattern portion that is not `**`, `.`, `..`, or empty `''`. For
-  example, the pattern `./a/b/../*` is converted to `./a/*`, and
-  so it will match the path string `./a/c`, but not the path
-  string `./a/b/../c`. Dots and empty path portions in the
-  pattern are preserved.
-- `2` (or higher) - Much more aggressive optimizations, suitable
-  for use with file-walking cases:
-  - Remove cases where a double-dot `..` follows a pattern
-    portion that is not `**`, `.`, or empty `''`. Remove empty
-    and `.` portions of the pattern, where safe to do so (ie,
-    anywhere other than the last position, the first position, or
-    the second position in a pattern starting with `/`, as this
-    may indicate a UNC path on Windows).
-  - Convert patterns containing `<pre>/**/../<p>/<rest>` into the
-    equivalent `<pre>/{..,**}/<p>/<rest>`, where `<p>` is a
-    a pattern portion other than `.`, `..`, `**`, or empty
-    `''`.
-  - Dedupe patterns where a `**` portion is present in one and
-    omitted in another, and it is not the final path portion, and
-    they are otherwise equivalent. So `{a/**/b,a/b}` becomes
-    `a/**/b`, because `**` matches against an empty path portion.
-  - Dedupe patterns where a `*` portion is present in one, and a
-    non-dot pattern other than `**`, `.`, `..`, or `''` is in the
-    same position in the other. So `a/{*,x}/b` becomes `a/*/b`,
-    because `*` can match against `x`.
-
-  While these optimizations improve the performance of
-  file-walking use cases such as [glob](http://npm.im/glob) (ie,
-  the reason this module exists), there are cases where it will
-  fail to match a literal string that would have been matched in
-  optimization level 1 or 0.
-
-  Specifically, while the `Minimatch.match()` method will
-  optimize the file path string in the same ways, resulting in
-  the same matches, it will fail when tested with the regular
-  expression provided by `Minimatch.makeRe()`, unless the path
-  string is first processed with
-  `minimatch.levelTwoFileOptimize()` or similar.
-
-### platform
-
-When set to `win32`, this will trigger all windows-specific
-behaviors (special handling for UNC paths, and treating `\` as
-separators in file paths for comparison.)
-
-Defaults to the value of `process.platform`.
-
-### maxGlobstarRecursion
-
-Max number of non-adjacent `**` patterns to recursively walk
-down.
-
-The default of `200` is almost certainly high enough for most
-purposes, and can handle absurdly excessive patterns.
-
-If the limit is exceeded (which would require very excessively
-long patterns and paths containing lots of `**` patterns!), then
-it is treated as non-matching, even if the path would normally
-match the pattern provided.
-
-That is, this is an intentional false negative, deemed an
-acceptable break in correctness for security and performance.
-
-### maxExtglobRecursion
-
-Max depth to traverse for nested extglobs like `*(a|b|c)`
-
-Default is 2, which is quite low, but any higher value swiftly
-results in punishing performance impacts. Note that this is _not_
-relevant when the globstar types can be safely coalesced into a
-single set.
-
-For example, `*(a|@(b|c)|d)` would be flattened into
-`*(a|b|c|d)`. Thus, many common extglobs will retain good
-performance and never hit this limit, even if they are
-excessively deep and complicated.
-
-If the limit is hit, then the extglob characters are simply not
-parsed, and the pattern effectively switches into `noextglob:
-true` mode for the contents of that nested sub-pattern. This will
-typically _not_ result in a match, but is considered a valid
-trade-off for security and performance.
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a
-worthwhile goal, some discrepancies exist between minimatch and
-other implementations. Some are intentional, and some are
-unavoidable.
-
-If the pattern starts with a `!` character, then it is negated. Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally. This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything. Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set. This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes. For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`. This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern. Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity. Since those two are valid, matching proceeds.
-
-Negated extglob patterns are handled as closely as possible to
-Bash semantics, but there are some cases with negative extglobs
-which are exceedingly difficult to express in a JavaScript
-regular expression. In particular the negated pattern
-`<start>!(<pattern>*|)*` will in bash match anything that does
-not start with `<start><pattern>`. However,
-`<start>!(<pattern>*)*` _will_ match paths starting with
-`<start><pattern>`, because the empty string can match against
-the negated portion. In this library, `<start>!(<pattern>*|)*`
-will _not_ match any pattern starting with `<start>`, due to a
-difference in precisely which patterns are considered "greedy" in
-Regular Expressions vs bash path expansion. This may be fixable,
-but not without incurring some complexity and performance costs,
-and the trade-off seems to not be worth pursuing.
-
-Note that `fnmatch(3)` in libc is an extremely naive string comparison
-matcher, which does not do anything special for slashes. This library is
-designed to be used in glob searching and file walkers, and so it does do
-special things with `/`. Thus, `foo*` will not match `foo/bar` in this
-library, even though it would in `fnmatch(3)`.
Index: de_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,2 +1,0 @@
-export declare const assertValidPattern: (pattern: unknown) => void;
-//# sourceMappingURL=assert-valid-pattern.d.ts.map
Index: de_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"}
Index: de_modules/minimatch/dist/commonjs/assert-valid-pattern.js
===================================================================
--- node_modules/minimatch/dist/commonjs/assert-valid-pattern.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.assertValidPattern = void 0;
-const MAX_PATTERN_LENGTH = 1024 * 64;
-const assertValidPattern = (pattern) => {
-    if (typeof pattern !== 'string') {
-        throw new TypeError('invalid pattern');
-    }
-    if (pattern.length > MAX_PATTERN_LENGTH) {
-        throw new TypeError('pattern is too long');
-    }
-};
-exports.assertValidPattern = assertValidPattern;
-//# sourceMappingURL=assert-valid-pattern.js.map
Index: de_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n  pattern: unknown,\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n"]}
Index: de_modules/minimatch/dist/commonjs/ast.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/ast.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import type { MinimatchOptions, MMRegExp } from './index.js';
-export type ExtglobType = '!' | '?' | '+' | '*' | '@';
-export declare class AST {
-    #private;
-    type: ExtglobType | null;
-    id: number;
-    get depth(): number;
-    constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions);
-    get hasMagic(): boolean | undefined;
-    toString(): string;
-    push(...parts: (string | AST)[]): void;
-    toJSON(): unknown[];
-    isStart(): boolean;
-    isEnd(): boolean;
-    copyIn(part: AST | string): void;
-    clone(parent: AST): AST;
-    static fromGlob(pattern: string, options?: MinimatchOptions): AST;
-    toMMPattern(): MMRegExp | string;
-    get options(): MinimatchOptions;
-    toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean];
-}
-//# sourceMappingURL=ast.d.ts.map
Index: de_modules/minimatch/dist/commonjs/ast.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/ast.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwC5D,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAgJrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IAkDlB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"}
Index: de_modules/minimatch/dist/commonjs/ast.js
===================================================================
--- node_modules/minimatch/dist/commonjs/ast.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,845 +1,0 @@
-"use strict";
-// parse a single path portion
-var _a;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AST = void 0;
-const brace_expressions_js_1 = require("./brace-expressions.js");
-const unescape_js_1 = require("./unescape.js");
-const types = new Set(['!', '?', '+', '*', '@']);
-const isExtglobType = (c) => types.has(c);
-const isExtglobAST = (c) => isExtglobType(c.type);
-// Map of which extglob types can adopt the children of a nested extglob
-//
-// anything but ! can adopt a matching type:
-// +(a|+(b|c)|d) => +(a|b|c|d)
-// *(a|*(b|c)|d) => *(a|b|c|d)
-// @(a|@(b|c)|d) => @(a|b|c|d)
-// ?(a|?(b|c)|d) => ?(a|b|c|d)
-//
-// * can adopt anything, because 0 or repetition is allowed
-// *(a|?(b|c)|d) => *(a|b|c|d)
-// *(a|+(b|c)|d) => *(a|b|c|d)
-// *(a|@(b|c)|d) => *(a|b|c|d)
-//
-// + can adopt @, because 1 or repetition is allowed
-// +(a|@(b|c)|d) => +(a|b|c|d)
-//
-// + and @ CANNOT adopt *, because 0 would be allowed
-// +(a|*(b|c)|d) => would match "", on *(b|c)
-// @(a|*(b|c)|d) => would match "", on *(b|c)
-//
-// + and @ CANNOT adopt ?, because 0 would be allowed
-// +(a|?(b|c)|d) => would match "", on ?(b|c)
-// @(a|?(b|c)|d) => would match "", on ?(b|c)
-//
-// ? can adopt @, because 0 or 1 is allowed
-// ?(a|@(b|c)|d) => ?(a|b|c|d)
-//
-// ? and @ CANNOT adopt * or +, because >1 would be allowed
-// ?(a|*(b|c)|d) => would match bbb on *(b|c)
-// @(a|*(b|c)|d) => would match bbb on *(b|c)
-// ?(a|+(b|c)|d) => would match bbb on +(b|c)
-// @(a|+(b|c)|d) => would match bbb on +(b|c)
-//
-// ! CANNOT adopt ! (nothing else can either)
-// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)
-//
-// ! can adopt @
-// !(a|@(b|c)|d) => !(a|b|c|d)
-//
-// ! CANNOT adopt *
-// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
-//
-// ! CANNOT adopt +
-// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
-//
-// ! CANNOT adopt ?
-// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x"
-const adoptionMap = new Map([
-    ['!', ['@']],
-    ['?', ['?', '@']],
-    ['@', ['@']],
-    ['*', ['*', '+', '?', '@']],
-    ['+', ['+', '@']],
-]);
-// nested extglobs that can be adopted in, but with the addition of
-// a blank '' element.
-const adoptionWithSpaceMap = new Map([
-    ['!', ['?']],
-    ['@', ['?']],
-    ['+', ['?', '*']],
-]);
-// union of the previous two maps
-const adoptionAnyMap = new Map([
-    ['!', ['?', '@']],
-    ['?', ['?', '@']],
-    ['@', ['?', '@']],
-    ['*', ['*', '+', '?', '@']],
-    ['+', ['+', '@', '?', '*']],
-]);
-// Extglobs that can take over their parent if they are the only child
-// the key is parent, value maps child to resulting extglob parent type
-// '@' is omitted because it's a special case. An `@` extglob with a single
-// member can always be usurped by that subpattern.
-const usurpMap = new Map([
-    ['!', new Map([['!', '@']])],
-    [
-        '?',
-        new Map([
-            ['*', '*'],
-            ['+', '*'],
-        ]),
-    ],
-    [
-        '@',
-        new Map([
-            ['!', '!'],
-            ['?', '?'],
-            ['@', '@'],
-            ['*', '*'],
-            ['+', '+'],
-        ]),
-    ],
-    [
-        '+',
-        new Map([
-            ['?', '*'],
-            ['*', '*'],
-        ]),
-    ],
-]);
-// Patterns that get prepended to bind to the start of either the
-// entire string, or just a single path portion, to prevent dots
-// and/or traversal patterns, when needed.
-// Exts don't need the ^ or / bit, because the root binds that already.
-const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
-const startNoDot = '(?!\\.)';
-// characters that indicate a start of pattern needs the "no dots" bit,
-// because a dot *might* be matched. ( is not in the list, because in
-// the case of a child extglob, it will handle the prevention itself.
-const addPatternStart = new Set(['[', '.']);
-// cases where traversal is A-OK, no dot prevention needed
-const justDots = new Set(['..', '.']);
-const reSpecials = new Set('().*{}+?[]^$\\!');
-const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-// any single thing other than /
-const qmark = '[^/]';
-// * => any number of characters
-const star = qmark + '*?';
-// use + when we need to ensure that *something* matches, because the * is
-// the only thing in the path portion.
-const starNoEmpty = qmark + '+?';
-// remove the \ chars that we added if we end up doing a nonmagic compare
-// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
-let ID = 0;
-class AST {
-    type;
-    #root;
-    #hasMagic;
-    #uflag = false;
-    #parts = [];
-    #parent;
-    #parentIndex;
-    #negs;
-    #filledNegs = false;
-    #options;
-    #toString;
-    // set to true if it's an extglob with no children
-    // (which really means one child of '')
-    #emptyExt = false;
-    id = ++ID;
-    get depth() {
-        return (this.#parent?.depth ?? -1) + 1;
-    }
-    [Symbol.for('nodejs.util.inspect.custom')]() {
-        return {
-            '@@type': 'AST',
-            id: this.id,
-            type: this.type,
-            root: this.#root.id,
-            parent: this.#parent?.id,
-            depth: this.depth,
-            partsLength: this.#parts.length,
-            parts: this.#parts,
-        };
-    }
-    constructor(type, parent, options = {}) {
-        this.type = type;
-        // extglobs are inherently magical
-        if (type)
-            this.#hasMagic = true;
-        this.#parent = parent;
-        this.#root = this.#parent ? this.#parent.#root : this;
-        this.#options = this.#root === this ? options : this.#root.#options;
-        this.#negs = this.#root === this ? [] : this.#root.#negs;
-        if (type === '!' && !this.#root.#filledNegs)
-            this.#negs.push(this);
-        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
-    }
-    get hasMagic() {
-        /* c8 ignore start */
-        if (this.#hasMagic !== undefined)
-            return this.#hasMagic;
-        /* c8 ignore stop */
-        for (const p of this.#parts) {
-            if (typeof p === 'string')
-                continue;
-            if (p.type || p.hasMagic)
-                return (this.#hasMagic = true);
-        }
-        // note: will be undefined until we generate the regexp src and find out
-        return this.#hasMagic;
-    }
-    // reconstructs the pattern
-    toString() {
-        return (this.#toString !== undefined ? this.#toString
-            : !this.type ?
-                (this.#toString = this.#parts.map(p => String(p)).join(''))
-                : (this.#toString =
-                    this.type +
-                        '(' +
-                        this.#parts.map(p => String(p)).join('|') +
-                        ')'));
-    }
-    #fillNegs() {
-        /* c8 ignore start */
-        if (this !== this.#root)
-            throw new Error('should only call on root');
-        if (this.#filledNegs)
-            return this;
-        /* c8 ignore stop */
-        // call toString() once to fill this out
-        this.toString();
-        this.#filledNegs = true;
-        let n;
-        while ((n = this.#negs.pop())) {
-            if (n.type !== '!')
-                continue;
-            // walk up the tree, appending everthing that comes AFTER parentIndex
-            let p = n;
-            let pp = p.#parent;
-            while (pp) {
-                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
-                    for (const part of n.#parts) {
-                        /* c8 ignore start */
-                        if (typeof part === 'string') {
-                            throw new Error('string part in extglob AST??');
-                        }
-                        /* c8 ignore stop */
-                        part.copyIn(pp.#parts[i]);
-                    }
-                }
-                p = pp;
-                pp = p.#parent;
-            }
-        }
-        return this;
-    }
-    push(...parts) {
-        for (const p of parts) {
-            if (p === '')
-                continue;
-            /* c8 ignore start */
-            if (typeof p !== 'string' &&
-                !(p instanceof _a && p.#parent === this)) {
-                throw new Error('invalid part: ' + p);
-            }
-            /* c8 ignore stop */
-            this.#parts.push(p);
-        }
-    }
-    toJSON() {
-        const ret = this.type === null ?
-            this.#parts
-                .slice()
-                .map(p => (typeof p === 'string' ? p : p.toJSON()))
-            : [this.type, ...this.#parts.map(p => p.toJSON())];
-        if (this.isStart() && !this.type)
-            ret.unshift([]);
-        if (this.isEnd() &&
-            (this === this.#root ||
-                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
-            ret.push({});
-        }
-        return ret;
-    }
-    isStart() {
-        if (this.#root === this)
-            return true;
-        // if (this.type) return !!this.#parent?.isStart()
-        if (!this.#parent?.isStart())
-            return false;
-        if (this.#parentIndex === 0)
-            return true;
-        // if everything AHEAD of this is a negation, then it's still the "start"
-        const p = this.#parent;
-        for (let i = 0; i < this.#parentIndex; i++) {
-            const pp = p.#parts[i];
-            if (!(pp instanceof _a && pp.type === '!')) {
-                return false;
-            }
-        }
-        return true;
-    }
-    isEnd() {
-        if (this.#root === this)
-            return true;
-        if (this.#parent?.type === '!')
-            return true;
-        if (!this.#parent?.isEnd())
-            return false;
-        if (!this.type)
-            return this.#parent?.isEnd();
-        // if not root, it'll always have a parent
-        /* c8 ignore start */
-        const pl = this.#parent ? this.#parent.#parts.length : 0;
-        /* c8 ignore stop */
-        return this.#parentIndex === pl - 1;
-    }
-    copyIn(part) {
-        if (typeof part === 'string')
-            this.push(part);
-        else
-            this.push(part.clone(this));
-    }
-    clone(parent) {
-        const c = new _a(this.type, parent);
-        for (const p of this.#parts) {
-            c.copyIn(p);
-        }
-        return c;
-    }
-    static #parseAST(str, ast, pos, opt, extDepth) {
-        const maxDepth = opt.maxExtglobRecursion ?? 2;
-        let escaping = false;
-        let inBrace = false;
-        let braceStart = -1;
-        let braceNeg = false;
-        if (ast.type === null) {
-            // outside of a extglob, append until we find a start
-            let i = pos;
-            let acc = '';
-            while (i < str.length) {
-                const c = str.charAt(i++);
-                // still accumulate escapes at this point, but we do ignore
-                // starts that are escaped
-                if (escaping || c === '\\') {
-                    escaping = !escaping;
-                    acc += c;
-                    continue;
-                }
-                if (inBrace) {
-                    if (i === braceStart + 1) {
-                        if (c === '^' || c === '!') {
-                            braceNeg = true;
-                        }
-                    }
-                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-                        inBrace = false;
-                    }
-                    acc += c;
-                    continue;
-                }
-                else if (c === '[') {
-                    inBrace = true;
-                    braceStart = i;
-                    braceNeg = false;
-                    acc += c;
-                    continue;
-                }
-                // we don't have to check for adoption here, because that's
-                // done at the other recursion point.
-                const doRecurse = !opt.noext &&
-                    isExtglobType(c) &&
-                    str.charAt(i) === '(' &&
-                    extDepth <= maxDepth;
-                if (doRecurse) {
-                    ast.push(acc);
-                    acc = '';
-                    const ext = new _a(c, ast);
-                    i = _a.#parseAST(str, ext, i, opt, extDepth + 1);
-                    ast.push(ext);
-                    continue;
-                }
-                acc += c;
-            }
-            ast.push(acc);
-            return i;
-        }
-        // some kind of extglob, pos is at the (
-        // find the next | or )
-        let i = pos + 1;
-        let part = new _a(null, ast);
-        const parts = [];
-        let acc = '';
-        while (i < str.length) {
-            const c = str.charAt(i++);
-            // still accumulate escapes at this point, but we do ignore
-            // starts that are escaped
-            if (escaping || c === '\\') {
-                escaping = !escaping;
-                acc += c;
-                continue;
-            }
-            if (inBrace) {
-                if (i === braceStart + 1) {
-                    if (c === '^' || c === '!') {
-                        braceNeg = true;
-                    }
-                }
-                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-                    inBrace = false;
-                }
-                acc += c;
-                continue;
-            }
-            else if (c === '[') {
-                inBrace = true;
-                braceStart = i;
-                braceNeg = false;
-                acc += c;
-                continue;
-            }
-            const doRecurse = !opt.noext &&
-                isExtglobType(c) &&
-                str.charAt(i) === '(' &&
-                /* c8 ignore start - the maxDepth is sufficient here */
-                (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)));
-            /* c8 ignore stop */
-            if (doRecurse) {
-                const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1;
-                part.push(acc);
-                acc = '';
-                const ext = new _a(c, part);
-                part.push(ext);
-                i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd);
-                continue;
-            }
-            if (c === '|') {
-                part.push(acc);
-                acc = '';
-                parts.push(part);
-                part = new _a(null, ast);
-                continue;
-            }
-            if (c === ')') {
-                if (acc === '' && ast.#parts.length === 0) {
-                    ast.#emptyExt = true;
-                }
-                part.push(acc);
-                acc = '';
-                ast.push(...parts, part);
-                return i;
-            }
-            acc += c;
-        }
-        // unfinished extglob
-        // if we got here, it was a malformed extglob! not an extglob, but
-        // maybe something else in there.
-        ast.type = null;
-        ast.#hasMagic = undefined;
-        ast.#parts = [str.substring(pos - 1)];
-        return i;
-    }
-    #canAdoptWithSpace(child) {
-        return this.#canAdopt(child, adoptionWithSpaceMap);
-    }
-    #canAdopt(child, map = adoptionMap) {
-        if (!child ||
-            typeof child !== 'object' ||
-            child.type !== null ||
-            child.#parts.length !== 1 ||
-            this.type === null) {
-            return false;
-        }
-        const gc = child.#parts[0];
-        if (!gc || typeof gc !== 'object' || gc.type === null) {
-            return false;
-        }
-        return this.#canAdoptType(gc.type, map);
-    }
-    #canAdoptType(c, map = adoptionAnyMap) {
-        return !!map.get(this.type)?.includes(c);
-    }
-    #adoptWithSpace(child, index) {
-        const gc = child.#parts[0];
-        const blank = new _a(null, gc, this.options);
-        blank.#parts.push('');
-        gc.push(blank);
-        this.#adopt(child, index);
-    }
-    #adopt(child, index) {
-        const gc = child.#parts[0];
-        this.#parts.splice(index, 1, ...gc.#parts);
-        for (const p of gc.#parts) {
-            if (typeof p === 'object')
-                p.#parent = this;
-        }
-        this.#toString = undefined;
-    }
-    #canUsurpType(c) {
-        const m = usurpMap.get(this.type);
-        return !!m?.has(c);
-    }
-    #canUsurp(child) {
-        if (!child ||
-            typeof child !== 'object' ||
-            child.type !== null ||
-            child.#parts.length !== 1 ||
-            this.type === null ||
-            this.#parts.length !== 1) {
-            return false;
-        }
-        const gc = child.#parts[0];
-        if (!gc || typeof gc !== 'object' || gc.type === null) {
-            return false;
-        }
-        return this.#canUsurpType(gc.type);
-    }
-    #usurp(child) {
-        const m = usurpMap.get(this.type);
-        const gc = child.#parts[0];
-        const nt = m?.get(gc.type);
-        /* c8 ignore start - impossible */
-        if (!nt)
-            return false;
-        /* c8 ignore stop */
-        this.#parts = gc.#parts;
-        for (const p of this.#parts) {
-            if (typeof p === 'object') {
-                p.#parent = this;
-            }
-        }
-        this.type = nt;
-        this.#toString = undefined;
-        this.#emptyExt = false;
-    }
-    static fromGlob(pattern, options = {}) {
-        const ast = new _a(null, undefined, options);
-        _a.#parseAST(pattern, ast, 0, options, 0);
-        return ast;
-    }
-    // returns the regular expression if there's magic, or the unescaped
-    // string if not.
-    toMMPattern() {
-        // should only be called on root
-        /* c8 ignore start */
-        if (this !== this.#root)
-            return this.#root.toMMPattern();
-        /* c8 ignore stop */
-        const glob = this.toString();
-        const [re, body, hasMagic, uflag] = this.toRegExpSource();
-        // if we're in nocase mode, and not nocaseMagicOnly, then we do
-        // still need a regular expression if we have to case-insensitively
-        // match capital/lowercase characters.
-        const anyMagic = hasMagic ||
-            this.#hasMagic ||
-            (this.#options.nocase &&
-                !this.#options.nocaseMagicOnly &&
-                glob.toUpperCase() !== glob.toLowerCase());
-        if (!anyMagic) {
-            return body;
-        }
-        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
-        return Object.assign(new RegExp(`^${re}$`, flags), {
-            _src: re,
-            _glob: glob,
-        });
-    }
-    get options() {
-        return this.#options;
-    }
-    // returns the string match, the regexp source, whether there's magic
-    // in the regexp (so a regular expression is required) and whether or
-    // not the uflag is needed for the regular expression (for posix classes)
-    // TODO: instead of injecting the start/end at this point, just return
-    // the BODY of the regexp, along with the start/end portions suitable
-    // for binding the start/end in either a joined full-path makeRe context
-    // (where we bind to (^|/), or a standalone matchPart context (where
-    // we bind to ^, and not /).  Otherwise slashes get duped!
-    //
-    // In part-matching mode, the start is:
-    // - if not isStart: nothing
-    // - if traversal possible, but not allowed: ^(?!\.\.?$)
-    // - if dots allowed or not possible: ^
-    // - if dots possible and not allowed: ^(?!\.)
-    // end is:
-    // - if not isEnd(): nothing
-    // - else: $
-    //
-    // In full-path matching mode, we put the slash at the START of the
-    // pattern, so start is:
-    // - if first pattern: same as part-matching mode
-    // - if not isStart(): nothing
-    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
-    // - if dots allowed or not possible: /
-    // - if dots possible and not allowed: /(?!\.)
-    // end is:
-    // - if last pattern, same as part-matching mode
-    // - else nothing
-    //
-    // Always put the (?:$|/) on negated tails, though, because that has to be
-    // there to bind the end of the negated pattern portion, and it's easier to
-    // just stick it in now rather than try to inject it later in the middle of
-    // the pattern.
-    //
-    // We can just always return the same end, and leave it up to the caller
-    // to know whether it's going to be used joined or in parts.
-    // And, if the start is adjusted slightly, can do the same there:
-    // - if not isStart: nothing
-    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
-    // - if dots allowed or not possible: (?:/|^)
-    // - if dots possible and not allowed: (?:/|^)(?!\.)
-    //
-    // But it's better to have a simpler binding without a conditional, for
-    // performance, so probably better to return both start options.
-    //
-    // Then the caller just ignores the end if it's not the first pattern,
-    // and the start always gets applied.
-    //
-    // But that's always going to be $ if it's the ending pattern, or nothing,
-    // so the caller can just attach $ at the end of the pattern when building.
-    //
-    // So the todo is:
-    // - better detect what kind of start is needed
-    // - return both flavors of starting pattern
-    // - attach $ at the end of the pattern when creating the actual RegExp
-    //
-    // Ah, but wait, no, that all only applies to the root when the first pattern
-    // is not an extglob. If the first pattern IS an extglob, then we need all
-    // that dot prevention biz to live in the extglob portions, because eg
-    // +(*|.x*) can match .xy but not .yx.
-    //
-    // So, return the two flavors if it's #root and the first child is not an
-    // AST, otherwise leave it to the child AST to handle it, and there,
-    // use the (?:^|/) style of start binding.
-    //
-    // Even simplified further:
-    // - Since the start for a join is eg /(?!\.) and the start for a part
-    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
-    // or start or whatever) and prepend ^ or / at the Regexp construction.
-    toRegExpSource(allowDot) {
-        const dot = allowDot ?? !!this.#options.dot;
-        if (this.#root === this) {
-            this.#flatten();
-            this.#fillNegs();
-        }
-        if (!isExtglobAST(this)) {
-            const noEmpty = this.isStart() &&
-                this.isEnd() &&
-                !this.#parts.some(s => typeof s !== 'string');
-            const src = this.#parts
-                .map(p => {
-                const [re, _, hasMagic, uflag] = typeof p === 'string' ?
-                    _a.#parseGlob(p, this.#hasMagic, noEmpty)
-                    : p.toRegExpSource(allowDot);
-                this.#hasMagic = this.#hasMagic || hasMagic;
-                this.#uflag = this.#uflag || uflag;
-                return re;
-            })
-                .join('');
-            let start = '';
-            if (this.isStart()) {
-                if (typeof this.#parts[0] === 'string') {
-                    // this is the string that will match the start of the pattern,
-                    // so we need to protect against dots and such.
-                    // '.' and '..' cannot match unless the pattern is that exactly,
-                    // even if it starts with . or dot:true is set.
-                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
-                    if (!dotTravAllowed) {
-                        const aps = addPatternStart;
-                        // check if we have a possibility of matching . or ..,
-                        // and prevent that.
-                        const needNoTrav = 
-                        // dots are allowed, and the pattern starts with [ or .
-                        (dot && aps.has(src.charAt(0))) ||
-                            // the pattern starts with \., and then [ or .
-                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
-                            // the pattern starts with \.\., and then [ or .
-                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
-                        // no need to prevent dots if it can't match a dot, or if a
-                        // sub-pattern will be preventing it anyway.
-                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
-                        start =
-                            needNoTrav ? startNoTraversal
-                                : needNoDot ? startNoDot
-                                    : '';
-                    }
-                }
-            }
-            // append the "end of path portion" pattern to negation tails
-            let end = '';
-            if (this.isEnd() &&
-                this.#root.#filledNegs &&
-                this.#parent?.type === '!') {
-                end = '(?:$|\\/)';
-            }
-            const final = start + src + end;
-            return [
-                final,
-                (0, unescape_js_1.unescape)(src),
-                (this.#hasMagic = !!this.#hasMagic),
-                this.#uflag,
-            ];
-        }
-        // We need to calculate the body *twice* if it's a repeat pattern
-        // at the start, once in nodot mode, then again in dot mode, so a
-        // pattern like *(?) can match 'x.y'
-        const repeated = this.type === '*' || this.type === '+';
-        // some kind of extglob
-        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
-        let body = this.#partsToRegExp(dot);
-        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
-            // invalid extglob, has to at least be *something* present, if it's
-            // the entire path portion.
-            const s = this.toString();
-            const me = this;
-            me.#parts = [s];
-            me.type = null;
-            me.#hasMagic = undefined;
-            return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];
-        }
-        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ?
-            ''
-            : this.#partsToRegExp(true);
-        if (bodyDotAllowed === body) {
-            bodyDotAllowed = '';
-        }
-        if (bodyDotAllowed) {
-            body = `(?:${body})(?:${bodyDotAllowed})*?`;
-        }
-        // an empty !() is exactly equivalent to a starNoEmpty
-        let final = '';
-        if (this.type === '!' && this.#emptyExt) {
-            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
-        }
-        else {
-            const close = this.type === '!' ?
-                // !() must match something,but !(x) can match ''
-                '))' +
-                    (this.isStart() && !dot && !allowDot ? startNoDot : '') +
-                    star +
-                    ')'
-                : this.type === '@' ? ')'
-                    : this.type === '?' ? ')?'
-                        : this.type === '+' && bodyDotAllowed ? ')'
-                            : this.type === '*' && bodyDotAllowed ? `)?`
-                                : `)${this.type}`;
-            final = start + body + close;
-        }
-        return [
-            final,
-            (0, unescape_js_1.unescape)(body),
-            (this.#hasMagic = !!this.#hasMagic),
-            this.#uflag,
-        ];
-    }
-    #flatten() {
-        if (!isExtglobAST(this)) {
-            for (const p of this.#parts) {
-                if (typeof p === 'object') {
-                    p.#flatten();
-                }
-            }
-        }
-        else {
-            // do up to 10 passes to flatten as much as possible
-            let iterations = 0;
-            let done = false;
-            do {
-                done = true;
-                for (let i = 0; i < this.#parts.length; i++) {
-                    const c = this.#parts[i];
-                    if (typeof c === 'object') {
-                        c.#flatten();
-                        if (this.#canAdopt(c)) {
-                            done = false;
-                            this.#adopt(c, i);
-                        }
-                        else if (this.#canAdoptWithSpace(c)) {
-                            done = false;
-                            this.#adoptWithSpace(c, i);
-                        }
-                        else if (this.#canUsurp(c)) {
-                            done = false;
-                            this.#usurp(c);
-                        }
-                    }
-                }
-            } while (!done && ++iterations < 10);
-        }
-        this.#toString = undefined;
-    }
-    #partsToRegExp(dot) {
-        return this.#parts
-            .map(p => {
-            // extglob ASTs should only contain parent ASTs
-            /* c8 ignore start */
-            if (typeof p === 'string') {
-                throw new Error('string type in extglob ast??');
-            }
-            /* c8 ignore stop */
-            // can ignore hasMagic, because extglobs are already always magic
-            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
-            this.#uflag = this.#uflag || uflag;
-            return re;
-        })
-            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
-            .join('|');
-    }
-    static #parseGlob(glob, hasMagic, noEmpty = false) {
-        let escaping = false;
-        let re = '';
-        let uflag = false;
-        // multiple stars that aren't globstars coalesce into one *
-        let inStar = false;
-        for (let i = 0; i < glob.length; i++) {
-            const c = glob.charAt(i);
-            if (escaping) {
-                escaping = false;
-                re += (reSpecials.has(c) ? '\\' : '') + c;
-                continue;
-            }
-            if (c === '*') {
-                if (inStar)
-                    continue;
-                inStar = true;
-                re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star;
-                hasMagic = true;
-                continue;
-            }
-            else {
-                inStar = false;
-            }
-            if (c === '\\') {
-                if (i === glob.length - 1) {
-                    re += '\\\\';
-                }
-                else {
-                    escaping = true;
-                }
-                continue;
-            }
-            if (c === '[') {
-                const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);
-                if (consumed) {
-                    re += src;
-                    uflag = uflag || needUflag;
-                    i += consumed - 1;
-                    hasMagic = hasMagic || magic;
-                    continue;
-                }
-            }
-            if (c === '?') {
-                re += qmark;
-                hasMagic = true;
-                continue;
-            }
-            re += regExpEscape(c);
-        }
-        return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];
-    }
-}
-exports.AST = AST;
-_a = AST;
-//# sourceMappingURL=ast.js.map
Index: de_modules/minimatch/dist/commonjs/ast.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/ast.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport type { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n  types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n  isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['@']],\n  ['?', ['?', '@']],\n  ['@', ['@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['?']],\n  ['@', ['?']],\n  ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['?', '@']],\n  ['?', ['?', '@']],\n  ['@', ['?', '@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<\n  ExtglobType,\n  Map<ExtglobType | null, ExtglobType | null>\n>([\n  ['!', new Map([['!', '@']])],\n  [\n    '?',\n    new Map([\n      ['*', '*'],\n      ['+', '*'],\n    ]),\n  ],\n  [\n    '@',\n    new Map([\n      ['!', '!'],\n      ['?', '?'],\n      ['@', '@'],\n      ['*', '*'],\n      ['+', '+'],\n    ]),\n  ],\n  [\n    '+',\n    new Map([\n      ['?', '*'],\n      ['*', '*'],\n    ]),\n  ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  #parent?: AST\n  #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n  id = ++ID\n\n  get depth(): number {\n    return (this.#parent?.depth ?? -1) + 1\n  }\n\n  [Symbol.for('nodejs.util.inspect.custom')]() {\n    return {\n      '@@type': 'AST',\n      id: this.id,\n      type: this.type,\n      root: this.#root.id,\n      parent: this.#parent?.id,\n      depth: this.depth,\n      partsLength: this.#parts.length,\n      parts: this.#parts,\n    }\n  }\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {},\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    return (\n      this.#toString !== undefined ? this.#toString\n      : !this.type ?\n        (this.#toString = this.#parts.map(p => String(p)).join(''))\n      : (this.#toString =\n          this.type +\n          '(' +\n          this.#parts.map(p => String(p)).join('|') +\n          ')')\n    )\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (\n        typeof p !== 'string' &&\n        !(p instanceof AST && p.#parent === this)\n      ) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: unknown[] =\n      this.type === null ?\n        this.#parts\n          .slice()\n          .map(p => (typeof p === 'string' ? p : p.toJSON()))\n      : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions,\n    extDepth: number,\n  ): number {\n    const maxDepth = opt.maxExtglobRecursion ?? 2\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        // we don't have to check for adoption here, because that's\n        // done at the other recursion point.\n        const doRecurse =\n          !opt.noext &&\n          isExtglobType(c) &&\n          str.charAt(i) === '(' &&\n          extDepth <= maxDepth\n        if (doRecurse) {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      const doRecurse =\n        !opt.noext &&\n        isExtglobType(c) &&\n        str.charAt(i) === '(' &&\n        /* c8 ignore start - the maxDepth is sufficient here */\n        (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n      /* c8 ignore stop */\n      if (doRecurse) {\n        const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  #canAdoptWithSpace(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    return this.#canAdopt(child, adoptionWithSpaceMap)\n  }\n\n  #canAdopt(\n    child?: AST | string,\n    map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n  ): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canAdoptType(\n      gc.type,\n      map,\n    )\n  }\n  #canAdoptType(\n    c: string,\n    map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n  ): c is ExtglobType {\n    return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n  }\n\n  #adoptWithSpace(\n    this: AST & { type: ExtglobType },\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const blank = new AST(null, gc, this.options)\n    blank.#parts.push('')\n    gc.push(blank)\n    this.#adopt(child, index)\n  }\n\n  #adopt(\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    this.#parts.splice(index, 1, ...gc.#parts)\n    for (const p of gc.#parts) {\n      if (typeof p === 'object') p.#parent = this\n    }\n    this.#toString = undefined\n  }\n\n  #canUsurpType(c: string): boolean {\n    const m = usurpMap.get(this.type as ExtglobType)\n    return !!m?.has(c as ExtglobType)\n  }\n\n  #canUsurp(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null ||\n      this.#parts.length !== 1\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n  }\n\n  #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n    const m = usurpMap.get(this.type as ExtglobType)\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const nt = m?.get(gc.type)\n    /* c8 ignore start - impossible */\n    if (!nt) return false\n    /* c8 ignore stop */\n    this.#parts = gc.#parts\n    for (const p of this.#parts) {\n      if (typeof p === 'object') {\n        p.#parent = this\n      }\n    }\n    this.type = nt\n    this.#toString = undefined\n    this.#emptyExt = false\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options, 0)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  get options() {\n    return this.#options\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(\n    allowDot?: boolean,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    const dot = allowDot ?? !!this.#options.dot\n    if (this.#root === this) {\n      this.#flatten()\n      this.#fillNegs()\n    }\n    if (!isExtglobAST(this)) {\n      const noEmpty =\n        this.isStart() &&\n        this.isEnd() &&\n        !this.#parts.some(s => typeof s !== 'string')\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string' ?\n              AST.#parseGlob(p, this.#hasMagic, noEmpty)\n            : p.toRegExpSource(allowDot)\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n            start =\n              needNoTrav ? startNoTraversal\n              : needNoDot ? startNoDot\n              : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // We need to calculate the body *twice* if it's a repeat pattern\n    // at the start, once in nodot mode, then again in dot mode, so a\n    // pattern like *(?) can match 'x.y'\n\n    const repeated = this.type === '*' || this.type === '+'\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    let body = (this as AST & { type: ExtglobType }).#partsToRegExp(dot)\n\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      const me = this as AST\n      me.#parts = [s]\n      me.type = null\n      me.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n\n    let bodyDotAllowed =\n      !repeated || allowDot || dot || !startNoDot ?\n        ''\n      : this.#partsToRegExp(true)\n    if (bodyDotAllowed === body) {\n      bodyDotAllowed = ''\n    }\n    if (bodyDotAllowed) {\n      body = `(?:${body})(?:${bodyDotAllowed})*?`\n    }\n\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!' ?\n          // !() must match something,but !(x) can match ''\n          '))' +\n          (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n          star +\n          ')'\n        : this.type === '@' ? ')'\n        : this.type === '?' ? ')?'\n        : this.type === '+' && bodyDotAllowed ? ')'\n        : this.type === '*' && bodyDotAllowed ? `)?`\n        : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  #flatten() {\n    if (!isExtglobAST(this)) {\n      for (const p of this.#parts) {\n        if (typeof p === 'object') {\n          p.#flatten()\n        }\n      }\n    } else {\n      // do up to 10 passes to flatten as much as possible\n      let iterations = 0\n      let done = false\n      do {\n        done = true\n        for (let i = 0; i < this.#parts.length; i++) {\n          const c = this.#parts[i]\n          if (typeof c === 'object') {\n            c.#flatten()\n            if (this.#canAdopt(c)) {\n              done = false\n              this.#adopt(c, i)\n            } else if (this.#canAdoptWithSpace(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#adoptWithSpace(c, i)\n            } else if (this.#canUsurp(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#usurp(c)\n            }\n          }\n        }\n      } while (!done && ++iterations < 10)\n    }\n    this.#toString = undefined\n  }\n\n  #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n    return this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    // multiple stars that aren't globstars coalesce into one *\n    let inStar = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '*') {\n        if (inStar) continue\n        inStar = true\n        re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n        hasMagic = true\n        continue\n      } else {\n        inStar = false\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n"]}
Index: de_modules/minimatch/dist/commonjs/brace-expressions.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/brace-expressions.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-export type ParseClassResult = [
-    src: string,
-    uFlag: boolean,
-    consumed: number,
-    hasMagic: boolean
-];
-export declare const parseClass: (glob: string, position: number) => ParseClassResult;
-//# sourceMappingURL=brace-expressions.d.ts.map
Index: de_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"}
Index: de_modules/minimatch/dist/commonjs/brace-expressions.js
===================================================================
--- node_modules/minimatch/dist/commonjs/brace-expressions.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,150 +1,0 @@
-"use strict";
-// translate the various posix character classes into unicode properties
-// this works across all unicode locales
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.parseClass = void 0;
-// { <posix class>: [<translation>, /u flag required, negated]
-const posixClasses = {
-    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
-    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
-    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
-    '[:blank:]': ['\\p{Zs}\\t', true],
-    '[:cntrl:]': ['\\p{Cc}', true],
-    '[:digit:]': ['\\p{Nd}', true],
-    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
-    '[:lower:]': ['\\p{Ll}', true],
-    '[:print:]': ['\\p{C}', true],
-    '[:punct:]': ['\\p{P}', true],
-    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
-    '[:upper:]': ['\\p{Lu}', true],
-    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
-    '[:xdigit:]': ['A-Fa-f0-9', false],
-};
-// only need to escape a few things inside of brace expressions
-// escapes: [ \ ] -
-const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
-// escape all regexp magic characters
-const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-// everything has already been escaped, we just have to join
-const rangesToString = (ranges) => ranges.join('');
-// takes a glob string at a posix brace expression, and returns
-// an equivalent regular expression source, and boolean indicating
-// whether the /u flag needs to be applied, and the number of chars
-// consumed to parse the character class.
-// This also removes out of order ranges, and returns ($.) if the
-// entire class just no good.
-const parseClass = (glob, position) => {
-    const pos = position;
-    /* c8 ignore start */
-    if (glob.charAt(pos) !== '[') {
-        throw new Error('not in a brace expression');
-    }
-    /* c8 ignore stop */
-    const ranges = [];
-    const negs = [];
-    let i = pos + 1;
-    let sawStart = false;
-    let uflag = false;
-    let escaping = false;
-    let negate = false;
-    let endPos = pos;
-    let rangeStart = '';
-    WHILE: while (i < glob.length) {
-        const c = glob.charAt(i);
-        if ((c === '!' || c === '^') && i === pos + 1) {
-            negate = true;
-            i++;
-            continue;
-        }
-        if (c === ']' && sawStart && !escaping) {
-            endPos = i + 1;
-            break;
-        }
-        sawStart = true;
-        if (c === '\\') {
-            if (!escaping) {
-                escaping = true;
-                i++;
-                continue;
-            }
-            // escaped \ char, fall through and treat like normal char
-        }
-        if (c === '[' && !escaping) {
-            // either a posix class, a collation equivalent, or just a [
-            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
-                if (glob.startsWith(cls, i)) {
-                    // invalid, [a-[] is fine, but not [a-[:alpha]]
-                    if (rangeStart) {
-                        return ['$.', false, glob.length - pos, true];
-                    }
-                    i += cls.length;
-                    if (neg)
-                        negs.push(unip);
-                    else
-                        ranges.push(unip);
-                    uflag = uflag || u;
-                    continue WHILE;
-                }
-            }
-        }
-        // now it's just a normal character, effectively
-        escaping = false;
-        if (rangeStart) {
-            // throw this range away if it's not valid, but others
-            // can still match.
-            if (c > rangeStart) {
-                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
-            }
-            else if (c === rangeStart) {
-                ranges.push(braceEscape(c));
-            }
-            rangeStart = '';
-            i++;
-            continue;
-        }
-        // now might be the start of a range.
-        // can be either c-d or c-] or c<more...>] or c] at this point
-        if (glob.startsWith('-]', i + 1)) {
-            ranges.push(braceEscape(c + '-'));
-            i += 2;
-            continue;
-        }
-        if (glob.startsWith('-', i + 1)) {
-            rangeStart = c;
-            i += 2;
-            continue;
-        }
-        // not the start of a range, just a single character
-        ranges.push(braceEscape(c));
-        i++;
-    }
-    if (endPos < i) {
-        // didn't see the end of the class, not a valid class,
-        // but might still be valid as a literal match.
-        return ['', false, 0, false];
-    }
-    // if we got no ranges and no negates, then we have a range that
-    // cannot possibly match anything, and that poisons the whole glob
-    if (!ranges.length && !negs.length) {
-        return ['$.', false, glob.length - pos, true];
-    }
-    // if we got one positive range, and it's a single character, then that's
-    // not actually a magic pattern, it's just that one literal character.
-    // we should not treat that as "magic", we should just return the literal
-    // character. [_] is a perfectly valid way to escape glob magic chars.
-    if (negs.length === 0 &&
-        ranges.length === 1 &&
-        /^\\?.$/.test(ranges[0]) &&
-        !negate) {
-        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
-        return [regexpEscape(r), false, endPos - pos, false];
-    }
-    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
-    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
-    const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'
-        : ranges.length ? sranges
-            : snegs;
-    return [comb, uflag, endPos - pos, true];
-};
-exports.parseClass = parseClass;
-//# sourceMappingURL=brace-expressions.js.map
Index: de_modules/minimatch/dist/commonjs/brace-expressions.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/brace-expressions.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n  {\n    '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n    '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n    '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n    '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n    '[:cntrl:]': ['\\\\p{Cc}', true],\n    '[:digit:]': ['\\\\p{Nd}', true],\n    '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n    '[:lower:]': ['\\\\p{Ll}', true],\n    '[:print:]': ['\\\\p{C}', true],\n    '[:punct:]': ['\\\\p{P}', true],\n    '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n    '[:upper:]': ['\\\\p{Lu}', true],\n    '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n    '[:xdigit:]': ['A-Fa-f0-9', false],\n  }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number,\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c<more...>] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n    : ranges.length ? sranges\n    : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n"]}
Index: de_modules/minimatch/dist/commonjs/escape.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/escape.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-import type { MinimatchOptions } from './index.js';
-/**
- * Escape all magic characters in a glob pattern.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape}
- * option is used, then characters are escaped by wrapping in `[]`, because
- * a magic character wrapped in a character class can only be satisfied by
- * that exact character.  In this mode, `\` is _not_ escaped, because it is
- * not interpreted as a magic character, but instead as a path separator.
- *
- * If the {@link MinimatchOptions.magicalBraces} option is used,
- * then braces (`{` and `}`) will be escaped.
- */
-export declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-//# sourceMappingURL=escape.d.ts.map
Index: de_modules/minimatch/dist/commonjs/escape.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/escape.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"}
Index: de_modules/minimatch/dist/commonjs/escape.js
===================================================================
--- node_modules/minimatch/dist/commonjs/escape.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,30 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.escape = void 0;
-/**
- * Escape all magic characters in a glob pattern.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape}
- * option is used, then characters are escaped by wrapping in `[]`, because
- * a magic character wrapped in a character class can only be satisfied by
- * that exact character.  In this mode, `\` is _not_ escaped, because it is
- * not interpreted as a magic character, but instead as a path separator.
- *
- * If the {@link MinimatchOptions.magicalBraces} option is used,
- * then braces (`{` and `}`) will be escaped.
- */
-const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => {
-    // don't need to escape +@! because we escape the parens
-    // that make those magic, and escaping ! as [!] isn't valid,
-    // because [!]] is a valid glob class meaning not ']'.
-    if (magicalBraces) {
-        return windowsPathsNoEscape ?
-            s.replace(/[?*()[\]{}]/g, '[$&]')
-            : s.replace(/[?*()[\]\\{}]/g, '\\$&');
-    }
-    return windowsPathsNoEscape ?
-        s.replace(/[?*()[\]]/g, '[$&]')
-        : s.replace(/[?*()[\]\\]/g, '\\$&');
-};
-exports.escape = escape;
-//# sourceMappingURL=escape.js.map
Index: de_modules/minimatch/dist/commonjs/escape.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/escape.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAlBY,QAAA,MAAM,UAkBlB","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = false,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/[?*()[\\]{}]/g, '[$&]')\n      : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]}
Index: de_modules/minimatch/dist/commonjs/index.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,174 +1,0 @@
-import { AST } from './ast.js';
-export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd';
-export interface MinimatchOptions {
-    /** do not expand `{x,y}` style braces */
-    nobrace?: boolean;
-    /** do not treat patterns starting with `#` as a comment */
-    nocomment?: boolean;
-    /** do not treat patterns starting with `!` as a negation */
-    nonegate?: boolean;
-    /** print LOTS of debugging output */
-    debug?: boolean;
-    /** treat `**` the same as `*` */
-    noglobstar?: boolean;
-    /** do not expand extglobs like `+(a|b)` */
-    noext?: boolean;
-    /** return the pattern if nothing matches */
-    nonull?: boolean;
-    /** treat `\\` as a path separator, not an escape character */
-    windowsPathsNoEscape?: boolean;
-    /**
-     * inverse of {@link MinimatchOptions.windowsPathsNoEscape}
-     * @deprecated
-     */
-    allowWindowsEscape?: boolean;
-    /**
-     * Compare a partial path to a pattern. As long as the parts
-     * of the path that are present are not contradicted by the
-     * pattern, it will be treated as a match. This is useful in
-     * applications where you're walking through a folder structure,
-     * and don't yet have the full path, but want to ensure that you
-     * do not walk down paths that can never be a match.
-     */
-    partial?: boolean;
-    /** allow matches that start with `.` even if the pattern does not */
-    dot?: boolean;
-    /** ignore case */
-    nocase?: boolean;
-    /** ignore case only in wildcard patterns */
-    nocaseMagicOnly?: boolean;
-    /** consider braces to be "magic" for the purpose of `hasMagic` */
-    magicalBraces?: boolean;
-    /**
-     * If set, then patterns without slashes will be matched
-     * against the basename of the path if it contains slashes.
-     * For example, `a?b` would match the path `/xyz/123/acb`, but
-     * not `/xyz/acb/123`.
-     */
-    matchBase?: boolean;
-    /** invert the results of negated matches */
-    flipNegate?: boolean;
-    /** do not collapse multiple `/` into a single `/` */
-    preserveMultipleSlashes?: boolean;
-    /**
-     * A number indicating the level of optimization that should be done
-     * to the pattern prior to parsing and using it for matches.
-     */
-    optimizationLevel?: number;
-    /** operating system platform */
-    platform?: Platform;
-    /**
-     * When a pattern starts with a UNC path or drive letter, and in
-     * `nocase:true` mode, do not convert the root portions of the
-     * pattern into a case-insensitive regular expression, and instead
-     * leave them as strings.
-     *
-     * This is the default when the platform is `win32` and
-     * `nocase:true` is set.
-     */
-    windowsNoMagicRoot?: boolean;
-    /**
-     * max number of `{...}` patterns to expand. Default 100_000.
-     */
-    braceExpandMax?: number;
-    /**
-     * Max number of non-adjacent `**` patterns to recursively walk down.
-     *
-     * The default of 200 is almost certainly high enough for most purposes,
-     * and can handle absurdly excessive patterns.
-     */
-    maxGlobstarRecursion?: number;
-    /**
-     * Max depth to traverse for nested extglobs like `*(a|b|c)`
-     *
-     * Default is 2, which is quite low, but any higher value
-     * swiftly results in punishing performance impacts. Note
-     * that this is *not*  relevant when the globstar types can
-     * be safely coalesced into a single set.
-     *
-     * For example, `*(a|@(b|c)|d)` would be flattened into
-     * `*(a|b|c|d)`. Thus, many common extglobs will retain good
-     * performance and  never hit this limit, even if they are
-     * excessively deep and complicated.
-     *
-     * If the limit is hit, then the extglob characters are simply
-     * not parsed, and the pattern effectively switches into
-     * `noextglob: true` mode for the contents of that nested
-     * sub-pattern. This will typically _not_ result in a match,
-     * but is considered a valid trade-off for security and
-     * performance.
-     */
-    maxExtglobRecursion?: number;
-}
-export declare const minimatch: {
-    (p: string, pattern: string, options?: MinimatchOptions): boolean;
-    sep: Sep;
-    GLOBSTAR: typeof GLOBSTAR;
-    filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
-    defaults: (def: MinimatchOptions) => typeof minimatch;
-    braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
-    makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
-    match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
-    AST: typeof AST;
-    Minimatch: typeof Minimatch;
-    escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-    unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-};
-export type Sep = '\\' | '/';
-export declare const sep: Sep;
-export declare const GLOBSTAR: unique symbol;
-export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
-export declare const defaults: (def: MinimatchOptions) => typeof minimatch;
-export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
-export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
-export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
-export type MMRegExp = RegExp & {
-    _src?: string;
-    _glob?: string;
-};
-export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR;
-export type ParseReturn = ParseReturnFiltered | false;
-export declare class Minimatch {
-    #private;
-    options: MinimatchOptions;
-    set: ParseReturnFiltered[][];
-    pattern: string;
-    windowsPathsNoEscape: boolean;
-    nonegate: boolean;
-    negate: boolean;
-    comment: boolean;
-    empty: boolean;
-    preserveMultipleSlashes: boolean;
-    partial: boolean;
-    globSet: string[];
-    globParts: string[][];
-    nocase: boolean;
-    isWindows: boolean;
-    platform: Platform;
-    windowsNoMagicRoot: boolean;
-    maxGlobstarRecursion: number;
-    regexp: false | null | MMRegExp;
-    constructor(pattern: string, options?: MinimatchOptions);
-    hasMagic(): boolean;
-    debug(..._: unknown[]): void;
-    make(): void;
-    preprocess(globParts: string[][]): string[][];
-    adjascentGlobstarOptimize(globParts: string[][]): string[][];
-    levelOneOptimize(globParts: string[][]): string[][];
-    levelTwoFileOptimize(parts: string | string[]): string[];
-    firstPhasePreProcess(globParts: string[][]): string[][];
-    secondPhasePreProcess(globParts: string[][]): string[][];
-    partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[];
-    parseNegate(): void;
-    matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean;
-    braceExpand(): string[];
-    parse(pattern: string): ParseReturn;
-    makeRe(): false | MMRegExp;
-    slashSplit(p: string): string[];
-    match(f: string, partial?: boolean): boolean;
-    static defaults(def: MinimatchOptions): typeof Minimatch;
-}
-export { AST } from './ast.js';
-export { escape } from './escape.js';
-export { unescape } from './unescape.js';
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/minimatch/dist/commonjs/index.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
Index: de_modules/minimatch/dist/commonjs/index.js
===================================================================
--- node_modules/minimatch/dist/commonjs/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1127 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
-const brace_expansion_1 = require("brace-expansion");
-const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js");
-const ast_js_1 = require("./ast.js");
-const escape_js_1 = require("./escape.js");
-const unescape_js_1 = require("./unescape.js");
-const minimatch = (p, pattern, options = {}) => {
-    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-    // shortcut: comments match nothing.
-    if (!options.nocomment && pattern.charAt(0) === '#') {
-        return false;
-    }
-    return new Minimatch(pattern, options).match(p);
-};
-exports.minimatch = minimatch;
-// Optimized checking for the most common glob patterns.
-const starDotExtRE = /^\*+([^+@!?*[(]*)$/;
-const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
-const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
-const starDotExtTestNocase = (ext) => {
-    ext = ext.toLowerCase();
-    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
-};
-const starDotExtTestNocaseDot = (ext) => {
-    ext = ext.toLowerCase();
-    return (f) => f.toLowerCase().endsWith(ext);
-};
-const starDotStarRE = /^\*+\.\*+$/;
-const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
-const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
-const dotStarRE = /^\.\*+$/;
-const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
-const starRE = /^\*+$/;
-const starTest = (f) => f.length !== 0 && !f.startsWith('.');
-const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
-const qmarksRE = /^\?+([^+@!?*[(]*)?$/;
-const qmarksTestNocase = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExt([$0]);
-    if (!ext)
-        return noext;
-    ext = ext.toLowerCase();
-    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-};
-const qmarksTestNocaseDot = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExtDot([$0]);
-    if (!ext)
-        return noext;
-    ext = ext.toLowerCase();
-    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-};
-const qmarksTestDot = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExtDot([$0]);
-    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-};
-const qmarksTest = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExt([$0]);
-    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-};
-const qmarksTestNoExt = ([$0]) => {
-    const len = $0.length;
-    return (f) => f.length === len && !f.startsWith('.');
-};
-const qmarksTestNoExtDot = ([$0]) => {
-    const len = $0.length;
-    return (f) => f.length === len && f !== '.' && f !== '..';
-};
-/* c8 ignore start */
-const defaultPlatform = (typeof process === 'object' && process ?
-    (typeof process.env === 'object' &&
-        process.env &&
-        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
-        process.platform
-    : 'posix');
-const path = {
-    win32: { sep: '\\' },
-    posix: { sep: '/' },
-};
-/* c8 ignore stop */
-exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
-exports.minimatch.sep = exports.sep;
-exports.GLOBSTAR = Symbol('globstar **');
-exports.minimatch.GLOBSTAR = exports.GLOBSTAR;
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-const qmark = '[^/]';
-// * => any number of characters
-const star = qmark + '*?';
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
-const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options);
-exports.filter = filter;
-exports.minimatch.filter = exports.filter;
-const ext = (a, b = {}) => Object.assign({}, a, b);
-const defaults = (def) => {
-    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
-        return exports.minimatch;
-    }
-    const orig = exports.minimatch;
-    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
-    return Object.assign(m, {
-        Minimatch: class Minimatch extends orig.Minimatch {
-            constructor(pattern, options = {}) {
-                super(pattern, ext(def, options));
-            }
-            static defaults(options) {
-                return orig.defaults(ext(def, options)).Minimatch;
-            }
-        },
-        AST: class AST extends orig.AST {
-            /* c8 ignore start */
-            constructor(type, parent, options = {}) {
-                super(type, parent, ext(def, options));
-            }
-            /* c8 ignore stop */
-            static fromGlob(pattern, options = {}) {
-                return orig.AST.fromGlob(pattern, ext(def, options));
-            }
-        },
-        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
-        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
-        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
-        defaults: (options) => orig.defaults(ext(def, options)),
-        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
-        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
-        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
-        sep: orig.sep,
-        GLOBSTAR: exports.GLOBSTAR,
-    });
-};
-exports.defaults = defaults;
-exports.minimatch.defaults = exports.defaults;
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-const braceExpand = (pattern, options = {}) => {
-    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-    // Thanks to Yeting Li <https://github.com/yetingli> for
-    // improving this regexp to avoid a ReDOS vulnerability.
-    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
-        // shortcut. no need to expand.
-        return [pattern];
-    }
-    return (0, brace_expansion_1.expand)(pattern, { max: options.braceExpandMax });
-};
-exports.braceExpand = braceExpand;
-exports.minimatch.braceExpand = exports.braceExpand;
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
-exports.makeRe = makeRe;
-exports.minimatch.makeRe = exports.makeRe;
-const match = (list, pattern, options = {}) => {
-    const mm = new Minimatch(pattern, options);
-    list = list.filter(f => mm.match(f));
-    if (mm.options.nonull && !list.length) {
-        list.push(pattern);
-    }
-    return list;
-};
-exports.match = match;
-exports.minimatch.match = exports.match;
-// replace stuff like \* with *
-const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
-const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-class Minimatch {
-    options;
-    set;
-    pattern;
-    windowsPathsNoEscape;
-    nonegate;
-    negate;
-    comment;
-    empty;
-    preserveMultipleSlashes;
-    partial;
-    globSet;
-    globParts;
-    nocase;
-    isWindows;
-    platform;
-    windowsNoMagicRoot;
-    maxGlobstarRecursion;
-    regexp;
-    constructor(pattern, options = {}) {
-        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-        options = options || {};
-        this.options = options;
-        this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200;
-        this.pattern = pattern;
-        this.platform = options.platform || defaultPlatform;
-        this.isWindows = this.platform === 'win32';
-        // avoid the annoying deprecation flag lol
-        const awe = ('allowWindow' + 'sEscape');
-        this.windowsPathsNoEscape =
-            !!options.windowsPathsNoEscape || options[awe] === false;
-        if (this.windowsPathsNoEscape) {
-            this.pattern = this.pattern.replace(/\\/g, '/');
-        }
-        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
-        this.regexp = null;
-        this.negate = false;
-        this.nonegate = !!options.nonegate;
-        this.comment = false;
-        this.empty = false;
-        this.partial = !!options.partial;
-        this.nocase = !!this.options.nocase;
-        this.windowsNoMagicRoot =
-            options.windowsNoMagicRoot !== undefined ?
-                options.windowsNoMagicRoot
-                : !!(this.isWindows && this.nocase);
-        this.globSet = [];
-        this.globParts = [];
-        this.set = [];
-        // make the set of regexps etc.
-        this.make();
-    }
-    hasMagic() {
-        if (this.options.magicalBraces && this.set.length > 1) {
-            return true;
-        }
-        for (const pattern of this.set) {
-            for (const part of pattern) {
-                if (typeof part !== 'string')
-                    return true;
-            }
-        }
-        return false;
-    }
-    debug(..._) { }
-    make() {
-        const pattern = this.pattern;
-        const options = this.options;
-        // empty patterns and comments match nothing.
-        if (!options.nocomment && pattern.charAt(0) === '#') {
-            this.comment = true;
-            return;
-        }
-        if (!pattern) {
-            this.empty = true;
-            return;
-        }
-        // step 1: figure out negation, etc.
-        this.parseNegate();
-        // step 2: expand braces
-        this.globSet = [...new Set(this.braceExpand())];
-        if (options.debug) {
-            //oxlint-disable-next-line no-console
-            this.debug = (...args) => console.error(...args);
-        }
-        this.debug(this.pattern, this.globSet);
-        // step 3: now we have a set, so turn each one into a series of
-        // path-portion matching patterns.
-        // These will be regexps, except in the case of "**", which is
-        // set to the GLOBSTAR object for globstar behavior,
-        // and will not contain any / characters
-        //
-        // First, we preprocess to make the glob pattern sets a bit simpler
-        // and deduped.  There are some perf-killing patterns that can cause
-        // problems with a glob walk, but we can simplify them down a bit.
-        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
-        this.globParts = this.preprocess(rawGlobParts);
-        this.debug(this.pattern, this.globParts);
-        // glob --> regexps
-        let set = this.globParts.map((s, _, __) => {
-            if (this.isWindows && this.windowsNoMagicRoot) {
-                // check if it's a drive or unc path.
-                const isUNC = s[0] === '' &&
-                    s[1] === '' &&
-                    (s[2] === '?' || !globMagic.test(s[2])) &&
-                    !globMagic.test(s[3]);
-                const isDrive = /^[a-z]:/i.test(s[0]);
-                if (isUNC) {
-                    return [
-                        ...s.slice(0, 4),
-                        ...s.slice(4).map(ss => this.parse(ss)),
-                    ];
-                }
-                else if (isDrive) {
-                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
-                }
-            }
-            return s.map(ss => this.parse(ss));
-        });
-        this.debug(this.pattern, set);
-        // filter out everything that didn't compile properly.
-        this.set = set.filter(s => s.indexOf(false) === -1);
-        // do not treat the ? in UNC paths as magic
-        if (this.isWindows) {
-            for (let i = 0; i < this.set.length; i++) {
-                const p = this.set[i];
-                if (p[0] === '' &&
-                    p[1] === '' &&
-                    this.globParts[i][2] === '?' &&
-                    typeof p[3] === 'string' &&
-                    /^[a-z]:$/i.test(p[3])) {
-                    p[2] = '?';
-                }
-            }
-        }
-        this.debug(this.pattern, this.set);
-    }
-    // various transforms to equivalent pattern sets that are
-    // faster to process in a filesystem walk.  The goal is to
-    // eliminate what we can, and push all ** patterns as far
-    // to the right as possible, even if it increases the number
-    // of patterns that we have to process.
-    preprocess(globParts) {
-        // if we're not in globstar mode, then turn ** into *
-        if (this.options.noglobstar) {
-            for (const partset of globParts) {
-                for (let j = 0; j < partset.length; j++) {
-                    if (partset[j] === '**') {
-                        partset[j] = '*';
-                    }
-                }
-            }
-        }
-        const { optimizationLevel = 1 } = this.options;
-        if (optimizationLevel >= 2) {
-            // aggressive optimization for the purpose of fs walking
-            globParts = this.firstPhasePreProcess(globParts);
-            globParts = this.secondPhasePreProcess(globParts);
-        }
-        else if (optimizationLevel >= 1) {
-            // just basic optimizations to remove some .. parts
-            globParts = this.levelOneOptimize(globParts);
-        }
-        else {
-            // just collapse multiple ** portions into one
-            globParts = this.adjascentGlobstarOptimize(globParts);
-        }
-        return globParts;
-    }
-    // just get rid of adjascent ** portions
-    adjascentGlobstarOptimize(globParts) {
-        return globParts.map(parts => {
-            let gs = -1;
-            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
-                let i = gs;
-                while (parts[i + 1] === '**') {
-                    i++;
-                }
-                if (i !== gs) {
-                    parts.splice(gs, i - gs);
-                }
-            }
-            return parts;
-        });
-    }
-    // get rid of adjascent ** and resolve .. portions
-    levelOneOptimize(globParts) {
-        return globParts.map(parts => {
-            parts = parts.reduce((set, part) => {
-                const prev = set[set.length - 1];
-                if (part === '**' && prev === '**') {
-                    return set;
-                }
-                if (part === '..') {
-                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
-                        set.pop();
-                        return set;
-                    }
-                }
-                set.push(part);
-                return set;
-            }, []);
-            return parts.length === 0 ? [''] : parts;
-        });
-    }
-    levelTwoFileOptimize(parts) {
-        if (!Array.isArray(parts)) {
-            parts = this.slashSplit(parts);
-        }
-        let didSomething = false;
-        do {
-            didSomething = false;
-            // <pre>/<e>/<rest> -> <pre>/<rest>
-            if (!this.preserveMultipleSlashes) {
-                for (let i = 1; i < parts.length - 1; i++) {
-                    const p = parts[i];
-                    // don't squeeze out UNC patterns
-                    if (i === 1 && p === '' && parts[0] === '')
-                        continue;
-                    if (p === '.' || p === '') {
-                        didSomething = true;
-                        parts.splice(i, 1);
-                        i--;
-                    }
-                }
-                if (parts[0] === '.' &&
-                    parts.length === 2 &&
-                    (parts[1] === '.' || parts[1] === '')) {
-                    didSomething = true;
-                    parts.pop();
-                }
-            }
-            // <pre>/<p>/../<rest> -> <pre>/<rest>
-            let dd = 0;
-            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-                const p = parts[dd - 1];
-                if (p &&
-                    p !== '.' &&
-                    p !== '..' &&
-                    p !== '**' &&
-                    !(this.isWindows && /^[a-z]:$/i.test(p))) {
-                    didSomething = true;
-                    parts.splice(dd - 1, 2);
-                    dd -= 2;
-                }
-            }
-        } while (didSomething);
-        return parts.length === 0 ? [''] : parts;
-    }
-    // First phase: single-pattern processing
-    // <pre> is 1 or more portions
-    // <rest> is 1 or more portions
-    // <p> is any portion other than ., .., '', or **
-    // <e> is . or ''
-    //
-    // **/.. is *brutal* for filesystem walking performance, because
-    // it effectively resets the recursive walk each time it occurs,
-    // and ** cannot be reduced out by a .. pattern part like a regexp
-    // or most strings (other than .., ., and '') can be.
-    //
-    // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}
-    // <pre>/<e>/<rest> -> <pre>/<rest>
-    // <pre>/<p>/../<rest> -> <pre>/<rest>
-    // **/**/<rest> -> **/<rest>
-    //
-    // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow
-    // this WOULD be allowed if ** did follow symlinks, or * didn't
-    firstPhasePreProcess(globParts) {
-        let didSomething = false;
-        do {
-            didSomething = false;
-            // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}
-            for (let parts of globParts) {
-                let gs = -1;
-                while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
-                    let gss = gs;
-                    while (parts[gss + 1] === '**') {
-                        // <pre>/**/**/<rest> -> <pre>/**/<rest>
-                        gss++;
-                    }
-                    // eg, if gs is 2 and gss is 4, that means we have 3 **
-                    // parts, and can remove 2 of them.
-                    if (gss > gs) {
-                        parts.splice(gs + 1, gss - gs);
-                    }
-                    let next = parts[gs + 1];
-                    const p = parts[gs + 2];
-                    const p2 = parts[gs + 3];
-                    if (next !== '..')
-                        continue;
-                    if (!p ||
-                        p === '.' ||
-                        p === '..' ||
-                        !p2 ||
-                        p2 === '.' ||
-                        p2 === '..') {
-                        continue;
-                    }
-                    didSomething = true;
-                    // edit parts in place, and push the new one
-                    parts.splice(gs, 1);
-                    const other = parts.slice(0);
-                    other[gs] = '**';
-                    globParts.push(other);
-                    gs--;
-                }
-                // <pre>/<e>/<rest> -> <pre>/<rest>
-                if (!this.preserveMultipleSlashes) {
-                    for (let i = 1; i < parts.length - 1; i++) {
-                        const p = parts[i];
-                        // don't squeeze out UNC patterns
-                        if (i === 1 && p === '' && parts[0] === '')
-                            continue;
-                        if (p === '.' || p === '') {
-                            didSomething = true;
-                            parts.splice(i, 1);
-                            i--;
-                        }
-                    }
-                    if (parts[0] === '.' &&
-                        parts.length === 2 &&
-                        (parts[1] === '.' || parts[1] === '')) {
-                        didSomething = true;
-                        parts.pop();
-                    }
-                }
-                // <pre>/<p>/../<rest> -> <pre>/<rest>
-                let dd = 0;
-                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-                    const p = parts[dd - 1];
-                    if (p && p !== '.' && p !== '..' && p !== '**') {
-                        didSomething = true;
-                        const needDot = dd === 1 && parts[dd + 1] === '**';
-                        const splin = needDot ? ['.'] : [];
-                        parts.splice(dd - 1, 2, ...splin);
-                        if (parts.length === 0)
-                            parts.push('');
-                        dd -= 2;
-                    }
-                }
-            }
-        } while (didSomething);
-        return globParts;
-    }
-    // second phase: multi-pattern dedupes
-    // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>
-    // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>
-    // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>
-    //
-    // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>
-    // ^-- not valid because ** doens't follow symlinks
-    secondPhasePreProcess(globParts) {
-        for (let i = 0; i < globParts.length - 1; i++) {
-            for (let j = i + 1; j < globParts.length; j++) {
-                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
-                if (matched) {
-                    globParts[i] = [];
-                    globParts[j] = matched;
-                    break;
-                }
-            }
-        }
-        return globParts.filter(gs => gs.length);
-    }
-    partsMatch(a, b, emptyGSMatch = false) {
-        let ai = 0;
-        let bi = 0;
-        let result = [];
-        let which = '';
-        while (ai < a.length && bi < b.length) {
-            if (a[ai] === b[bi]) {
-                result.push(which === 'b' ? b[bi] : a[ai]);
-                ai++;
-                bi++;
-            }
-            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
-                result.push(a[ai]);
-                ai++;
-            }
-            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
-                result.push(b[bi]);
-                bi++;
-            }
-            else if (a[ai] === '*' &&
-                b[bi] &&
-                (this.options.dot || !b[bi].startsWith('.')) &&
-                b[bi] !== '**') {
-                if (which === 'b')
-                    return false;
-                which = 'a';
-                result.push(a[ai]);
-                ai++;
-                bi++;
-            }
-            else if (b[bi] === '*' &&
-                a[ai] &&
-                (this.options.dot || !a[ai].startsWith('.')) &&
-                a[ai] !== '**') {
-                if (which === 'a')
-                    return false;
-                which = 'b';
-                result.push(b[bi]);
-                ai++;
-                bi++;
-            }
-            else {
-                return false;
-            }
-        }
-        // if we fall out of the loop, it means they two are identical
-        // as long as their lengths match
-        return a.length === b.length && result;
-    }
-    parseNegate() {
-        if (this.nonegate)
-            return;
-        const pattern = this.pattern;
-        let negate = false;
-        let negateOffset = 0;
-        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
-            negate = !negate;
-            negateOffset++;
-        }
-        if (negateOffset)
-            this.pattern = pattern.slice(negateOffset);
-        this.negate = negate;
-    }
-    // set partial to true to test if, for example,
-    // "/a/b" matches the start of "/*/b/*/d"
-    // Partial means, if you run out of file before you run
-    // out of pattern, then that's fine, as long as all
-    // the parts match.
-    matchOne(file, pattern, partial = false) {
-        let fileStartIndex = 0;
-        let patternStartIndex = 0;
-        // UNC paths like //?/X:/... can match X:/... and vice versa
-        // Drive letters in absolute drive or unc paths are always compared
-        // case-insensitively.
-        if (this.isWindows) {
-            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
-            const fileUNC = !fileDrive &&
-                file[0] === '' &&
-                file[1] === '' &&
-                file[2] === '?' &&
-                /^[a-z]:$/i.test(file[3]);
-            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
-            const patternUNC = !patternDrive &&
-                pattern[0] === '' &&
-                pattern[1] === '' &&
-                pattern[2] === '?' &&
-                typeof pattern[3] === 'string' &&
-                /^[a-z]:$/i.test(pattern[3]);
-            const fdi = fileUNC ? 3
-                : fileDrive ? 0
-                    : undefined;
-            const pdi = patternUNC ? 3
-                : patternDrive ? 0
-                    : undefined;
-            if (typeof fdi === 'number' && typeof pdi === 'number') {
-                const [fd, pd] = [
-                    file[fdi],
-                    pattern[pdi],
-                ];
-                // start matching at the drive letter index of each
-                if (fd.toLowerCase() === pd.toLowerCase()) {
-                    pattern[pdi] = fd;
-                    patternStartIndex = pdi;
-                    fileStartIndex = fdi;
-                }
-            }
-        }
-        // resolve and reduce . and .. portions in the file as well.
-        // don't need to do the second phase, because it's only one string[]
-        const { optimizationLevel = 1 } = this.options;
-        if (optimizationLevel >= 2) {
-            file = this.levelTwoFileOptimize(file);
-        }
-        if (pattern.includes(exports.GLOBSTAR)) {
-            return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex);
-        }
-        return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex);
-    }
-    #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) {
-        // split the pattern into head, tail, and middle of ** delimited parts
-        const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex);
-        const lastgs = pattern.lastIndexOf(exports.GLOBSTAR);
-        // split the pattern up into globstar-delimited sections
-        // the tail has to be at the end, and the others just have
-        // to be found in order from the head.
-        const [head, body, tail] = partial ?
-            [
-                pattern.slice(patternIndex, firstgs),
-                pattern.slice(firstgs + 1),
-                [],
-            ]
-            : [
-                pattern.slice(patternIndex, firstgs),
-                pattern.slice(firstgs + 1, lastgs),
-                pattern.slice(lastgs + 1),
-            ];
-        // check the head, from the current file/pattern index.
-        if (head.length) {
-            const fileHead = file.slice(fileIndex, fileIndex + head.length);
-            if (!this.#matchOne(fileHead, head, partial, 0, 0)) {
-                return false;
-            }
-            fileIndex += head.length;
-            patternIndex += head.length;
-        }
-        // now we know the head matches!
-        // if the last portion is not empty, it MUST match the end
-        // check the tail
-        let fileTailMatch = 0;
-        if (tail.length) {
-            // if head + tail > file, then we cannot possibly match
-            if (tail.length + fileIndex > file.length)
-                return false;
-            // try to match the tail
-            let tailStart = file.length - tail.length;
-            if (this.#matchOne(file, tail, partial, tailStart, 0)) {
-                fileTailMatch = tail.length;
-            }
-            else {
-                // affordance for stuff like a/**/* matching a/b/
-                // if the last file portion is '', and there's more to the pattern
-                // then try without the '' bit.
-                if (file[file.length - 1] !== '' ||
-                    fileIndex + tail.length === file.length) {
-                    return false;
-                }
-                tailStart--;
-                if (!this.#matchOne(file, tail, partial, tailStart, 0)) {
-                    return false;
-                }
-                fileTailMatch = tail.length + 1;
-            }
-        }
-        // now we know the tail matches!
-        // the middle is zero or more portions wrapped in **, possibly
-        // containing more ** sections.
-        // so a/**/b/**/c/**/d has become **/b/**/c/**
-        // if it's empty, it means a/**/b, just verify we have no bad dots
-        // if there's no tail, so it ends on /**, then we must have *something*
-        // after the head, or it's not a matc
-        if (!body.length) {
-            let sawSome = !!fileTailMatch;
-            for (let i = fileIndex; i < file.length - fileTailMatch; i++) {
-                const f = String(file[i]);
-                sawSome = true;
-                if (f === '.' ||
-                    f === '..' ||
-                    (!this.options.dot && f.startsWith('.'))) {
-                    return false;
-                }
-            }
-            // in partial mode, we just need to get past all file parts
-            return partial || sawSome;
-        }
-        // now we know that there's one or more body sections, which can
-        // be matched anywhere from the 0 index (because the head was pruned)
-        // through to the length-fileTailMatch index.
-        // split the body up into sections, and note the minimum index it can
-        // be found at (start with the length of all previous segments)
-        // [section, before, after]
-        const bodySegments = [[[], 0]];
-        let currentBody = bodySegments[0];
-        let nonGsParts = 0;
-        const nonGsPartsSums = [0];
-        for (const b of body) {
-            if (b === exports.GLOBSTAR) {
-                nonGsPartsSums.push(nonGsParts);
-                currentBody = [[], 0];
-                bodySegments.push(currentBody);
-            }
-            else {
-                currentBody[0].push(b);
-                nonGsParts++;
-            }
-        }
-        let i = bodySegments.length - 1;
-        const fileLength = file.length - fileTailMatch;
-        for (const b of bodySegments) {
-            b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length);
-        }
-        return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch);
-    }
-    // return false for "nope, not matching"
-    // return null for "not matching, cannot keep trying"
-    #matchGlobStarBodySections(file, 
-    // pattern section, last possible position for it
-    bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) {
-        // take the first body segment, and walk from fileIndex to its "after"
-        // value at the end
-        // If it doesn't match at that position, we increment, until we hit
-        // that final possible position, and give up.
-        // If it does match, then advance and try to rest.
-        // If any of them fail we keep walking forward.
-        // this is still a bit recursively painful, but it's more constrained
-        // than previous implementations, because we never test something that
-        // can't possibly be a valid matching condition.
-        const bs = bodySegments[bodyIndex];
-        if (!bs) {
-            // just make sure that there's no bad dots
-            for (let i = fileIndex; i < file.length; i++) {
-                sawTail = true;
-                const f = file[i];
-                if (f === '.' ||
-                    f === '..' ||
-                    (!this.options.dot && f.startsWith('.'))) {
-                    return false;
-                }
-            }
-            return sawTail;
-        }
-        // have a non-globstar body section to test
-        const [body, after] = bs;
-        while (fileIndex <= after) {
-            const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0);
-            // if limit exceeded, no match. intentional false negative,
-            // acceptable break in correctness for security.
-            if (m && globStarDepth < this.maxGlobstarRecursion) {
-                // match! see if the rest match. if so, we're done!
-                const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail);
-                if (sub !== false) {
-                    return sub;
-                }
-            }
-            const f = file[fileIndex];
-            if (f === '.' ||
-                f === '..' ||
-                (!this.options.dot && f.startsWith('.'))) {
-                return false;
-            }
-            fileIndex++;
-        }
-        // walked off. no point continuing
-        return partial || null;
-    }
-    #matchOne(file, pattern, partial, fileIndex, patternIndex) {
-        let fi;
-        let pi;
-        let pl;
-        let fl;
-        for (fi = fileIndex,
-            pi = patternIndex,
-            fl = file.length,
-            pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
-            this.debug('matchOne loop');
-            let p = pattern[pi];
-            let f = file[fi];
-            this.debug(pattern, p, f);
-            // should be impossible.
-            // some invalid regexp stuff in the set.
-            /* c8 ignore start */
-            if (p === false || p === exports.GLOBSTAR) {
-                return false;
-            }
-            /* c8 ignore stop */
-            // something other than **
-            // non-magic patterns just have to match exactly
-            // patterns with magic have been turned into regexps.
-            let hit;
-            if (typeof p === 'string') {
-                hit = f === p;
-                this.debug('string match', p, f, hit);
-            }
-            else {
-                hit = p.test(f);
-                this.debug('pattern match', p, f, hit);
-            }
-            if (!hit)
-                return false;
-        }
-        // Note: ending in / means that we'll get a final ""
-        // at the end of the pattern.  This can only match a
-        // corresponding "" at the end of the file.
-        // If the file ends in /, then it can only match a
-        // a pattern that ends in /, unless the pattern just
-        // doesn't have any more for it. But, a/b/ should *not*
-        // match "a/b/*", even though "" matches against the
-        // [^/]*? pattern, except in partial mode, where it might
-        // simply not be reached yet.
-        // However, a/b/ should still satisfy a/*
-        // now either we fell off the end of the pattern, or we're done.
-        if (fi === fl && pi === pl) {
-            // ran out of pattern and filename at the same time.
-            // an exact hit!
-            return true;
-        }
-        else if (fi === fl) {
-            // ran out of file, but still had pattern left.
-            // this is ok if we're doing the match as part of
-            // a glob fs traversal.
-            return partial;
-        }
-        else if (pi === pl) {
-            // ran out of pattern, still have file left.
-            // this is only acceptable if we're on the very last
-            // empty segment of a file with a trailing slash.
-            // a/* should match a/b/
-            return fi === fl - 1 && file[fi] === '';
-            /* c8 ignore start */
-        }
-        else {
-            // should be unreachable.
-            throw new Error('wtf?');
-        }
-        /* c8 ignore stop */
-    }
-    braceExpand() {
-        return (0, exports.braceExpand)(this.pattern, this.options);
-    }
-    parse(pattern) {
-        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-        const options = this.options;
-        // shortcuts
-        if (pattern === '**')
-            return exports.GLOBSTAR;
-        if (pattern === '')
-            return '';
-        // far and away, the most common glob pattern parts are
-        // *, *.*, and *.<ext>  Add a fast check method for those.
-        let m;
-        let fastTest = null;
-        if ((m = pattern.match(starRE))) {
-            fastTest = options.dot ? starTestDot : starTest;
-        }
-        else if ((m = pattern.match(starDotExtRE))) {
-            fastTest = (options.nocase ?
-                options.dot ?
-                    starDotExtTestNocaseDot
-                    : starDotExtTestNocase
-                : options.dot ? starDotExtTestDot
-                    : starDotExtTest)(m[1]);
-        }
-        else if ((m = pattern.match(qmarksRE))) {
-            fastTest = (options.nocase ?
-                options.dot ?
-                    qmarksTestNocaseDot
-                    : qmarksTestNocase
-                : options.dot ? qmarksTestDot
-                    : qmarksTest)(m);
-        }
-        else if ((m = pattern.match(starDotStarRE))) {
-            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
-        }
-        else if ((m = pattern.match(dotStarRE))) {
-            fastTest = dotStarTest;
-        }
-        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
-        if (fastTest && typeof re === 'object') {
-            // Avoids overriding in frozen environments
-            Reflect.defineProperty(re, 'test', { value: fastTest });
-        }
-        return re;
-    }
-    makeRe() {
-        if (this.regexp || this.regexp === false)
-            return this.regexp;
-        // at this point, this.set is a 2d array of partial
-        // pattern strings, or "**".
-        //
-        // It's better to use .match().  This function shouldn't
-        // be used, really, but it's pretty convenient sometimes,
-        // when you just want to work with a regex.
-        const set = this.set;
-        if (!set.length) {
-            this.regexp = false;
-            return this.regexp;
-        }
-        const options = this.options;
-        const twoStar = options.noglobstar ? star
-            : options.dot ? twoStarDot
-                : twoStarNoDot;
-        const flags = new Set(options.nocase ? ['i'] : []);
-        // regexpify non-globstar patterns
-        // if ** is only item, then we just do one twoStar
-        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
-        // if ** is last, append (\/twoStar|) to previous
-        // if ** is in the middle, append (\/|\/twoStar\/) to previous
-        // then filter out GLOBSTAR symbols
-        let re = set
-            .map(pattern => {
-            const pp = pattern.map(p => {
-                if (p instanceof RegExp) {
-                    for (const f of p.flags.split(''))
-                        flags.add(f);
-                }
-                return (typeof p === 'string' ? regExpEscape(p)
-                    : p === exports.GLOBSTAR ? exports.GLOBSTAR
-                        : p._src);
-            });
-            pp.forEach((p, i) => {
-                const next = pp[i + 1];
-                const prev = pp[i - 1];
-                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
-                    return;
-                }
-                if (prev === undefined) {
-                    if (next !== undefined && next !== exports.GLOBSTAR) {
-                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
-                    }
-                    else {
-                        pp[i] = twoStar;
-                    }
-                }
-                else if (next === undefined) {
-                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?';
-                }
-                else if (next !== exports.GLOBSTAR) {
-                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
-                    pp[i + 1] = exports.GLOBSTAR;
-                }
-            });
-            const filtered = pp.filter(p => p !== exports.GLOBSTAR);
-            // For partial matches, we need to make the pattern match
-            // any prefix of the full path. We do this by generating
-            // alternative patterns that match progressively longer prefixes.
-            if (this.partial && filtered.length >= 1) {
-                const prefixes = [];
-                for (let i = 1; i <= filtered.length; i++) {
-                    prefixes.push(filtered.slice(0, i).join('/'));
-                }
-                return '(?:' + prefixes.join('|') + ')';
-            }
-            return filtered.join('/');
-        })
-            .join('|');
-        // need to wrap in parens if we had more than one thing with |,
-        // otherwise only the first will be anchored to ^ and the last to $
-        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
-        // must match entire pattern
-        // ending in a * or ** will make it less strict.
-        re = '^' + open + re + close + '$';
-        // In partial mode, '/' should always match as it's a valid prefix for any pattern
-        if (this.partial) {
-            re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$';
-        }
-        // can match anything, as long as it's not this.
-        if (this.negate)
-            re = '^(?!' + re + ').+$';
-        try {
-            this.regexp = new RegExp(re, [...flags].join(''));
-            /* c8 ignore start */
-        }
-        catch {
-            // should be impossible
-            this.regexp = false;
-        }
-        /* c8 ignore stop */
-        return this.regexp;
-    }
-    slashSplit(p) {
-        // if p starts with // on windows, we preserve that
-        // so that UNC paths aren't broken.  Otherwise, any number of
-        // / characters are coalesced into one, unless
-        // preserveMultipleSlashes is set to true.
-        if (this.preserveMultipleSlashes) {
-            return p.split('/');
-        }
-        else if (this.isWindows && /^\/\/[^/]+/.test(p)) {
-            // add an extra '' for the one we lose
-            return ['', ...p.split(/\/+/)];
-        }
-        else {
-            return p.split(/\/+/);
-        }
-    }
-    match(f, partial = this.partial) {
-        this.debug('match', f, this.pattern);
-        // short-circuit in the case of busted things.
-        // comments, etc.
-        if (this.comment) {
-            return false;
-        }
-        if (this.empty) {
-            return f === '';
-        }
-        if (f === '/' && partial) {
-            return true;
-        }
-        const options = this.options;
-        // windows: need to use /, not \
-        if (this.isWindows) {
-            f = f.split('\\').join('/');
-        }
-        // treat the test path as a set of pathparts.
-        const ff = this.slashSplit(f);
-        this.debug(this.pattern, 'split', ff);
-        // just ONE of the pattern sets in this.set needs to match
-        // in order for it to be valid.  If negating, then just one
-        // match means that we have failed.
-        // Either way, return on the first hit.
-        const set = this.set;
-        this.debug(this.pattern, 'set', set);
-        // Find the basename of the path by looking for the last non-empty segment
-        let filename = ff[ff.length - 1];
-        if (!filename) {
-            for (let i = ff.length - 2; !filename && i >= 0; i--) {
-                filename = ff[i];
-            }
-        }
-        for (const pattern of set) {
-            let file = ff;
-            if (options.matchBase && pattern.length === 1) {
-                file = [filename];
-            }
-            const hit = this.matchOne(file, pattern, partial);
-            if (hit) {
-                if (options.flipNegate) {
-                    return true;
-                }
-                return !this.negate;
-            }
-        }
-        // didn't get any hits.  this is success if it's a negative
-        // pattern, failure otherwise.
-        if (options.flipNegate) {
-            return false;
-        }
-        return this.negate;
-    }
-    static defaults(def) {
-        return exports.minimatch.defaults(def).Minimatch;
-    }
-}
-exports.Minimatch = Minimatch;
-/* c8 ignore start */
-var ast_js_2 = require("./ast.js");
-Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
-var escape_js_2 = require("./escape.js");
-Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
-var unescape_js_2 = require("./unescape.js");
-Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
-/* c8 ignore stop */
-exports.minimatch.AST = ast_js_1.AST;
-exports.minimatch.Minimatch = Minimatch;
-exports.minimatch.escape = escape_js_1.escape;
-exports.minimatch.unescape = unescape_js_1.unescape;
-//# sourceMappingURL=index.js.map
Index: de_modules/minimatch/dist/commonjs/index.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport type { ExtglobType } from './ast.js'\nimport { AST } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  /** do not expand `{x,y}` style braces */\n  nobrace?: boolean\n  /** do not treat patterns starting with `#` as a comment */\n  nocomment?: boolean\n  /** do not treat patterns starting with `!` as a negation */\n  nonegate?: boolean\n  /** print LOTS of debugging output */\n  debug?: boolean\n  /** treat `**` the same as `*` */\n  noglobstar?: boolean\n  /** do not expand extglobs like `+(a|b)` */\n  noext?: boolean\n  /** return the pattern if nothing matches */\n  nonull?: boolean\n  /** treat `\\\\` as a path separator, not an escape character */\n  windowsPathsNoEscape?: boolean\n  /**\n   * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n  /**\n   * Compare a partial path to a pattern. As long as the parts\n   * of the path that are present are not contradicted by the\n   * pattern, it will be treated as a match. This is useful in\n   * applications where you're walking through a folder structure,\n   * and don't yet have the full path, but want to ensure that you\n   * do not walk down paths that can never be a match.\n   */\n  partial?: boolean\n  /** allow matches that start with `.` even if the pattern does not */\n  dot?: boolean\n  /** ignore case */\n  nocase?: boolean\n  /** ignore case only in wildcard patterns */\n  nocaseMagicOnly?: boolean\n  /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n  magicalBraces?: boolean\n  /**\n   * If set, then patterns without slashes will be matched\n   * against the basename of the path if it contains slashes.\n   * For example, `a?b` would match the path `/xyz/123/acb`, but\n   * not `/xyz/acb/123`.\n   */\n  matchBase?: boolean\n  /** invert the results of negated matches */\n  flipNegate?: boolean\n  /** do not collapse multiple `/` into a single `/` */\n  preserveMultipleSlashes?: boolean\n  /**\n   * A number indicating the level of optimization that should be done\n   * to the pattern prior to parsing and using it for matches.\n   */\n  optimizationLevel?: number\n  /** operating system platform */\n  platform?: Platform\n  /**\n   * When a pattern starts with a UNC path or drive letter, and in\n   * `nocase:true` mode, do not convert the root portions of the\n   * pattern into a case-insensitive regular expression, and instead\n   * leave them as strings.\n   *\n   * This is the default when the platform is `win32` and\n   * `nocase:true` is set.\n   */\n  windowsNoMagicRoot?: boolean\n  /**\n   * max number of `{...}` patterns to expand. Default 100_000.\n   */\n  braceExpandMax?: number\n  /**\n   * Max number of non-adjacent `**` patterns to recursively walk down.\n   *\n   * The default of 200 is almost certainly high enough for most purposes,\n   * and can handle absurdly excessive patterns.\n   */\n  maxGlobstarRecursion?: number\n\n  /**\n   * Max depth to traverse for nested extglobs like `*(a|b|c)`\n   *\n   * Default is 2, which is quite low, but any higher value\n   * swiftly results in punishing performance impacts. Note\n   * that this is *not*  relevant when the globstar types can\n   * be safely coalesced into a single set.\n   *\n   * For example, `*(a|@(b|c)|d)` would be flattened into\n   * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n   * performance and  never hit this limit, even if they are\n   * excessively deep and complicated.\n   *\n   * If the limit is hit, then the extglob characters are simply\n   * not parsed, and the pattern effectively switches into\n   * `noextglob: true` mode for the contents of that nested\n   * sub-pattern. This will typically _not_ result in a match,\n   * but is considered a valid trade-off for security and\n   * performance.\n   */\n  maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?*[(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n  !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n  f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n  f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?*[(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process ?\n    (typeof process.env === 'object' &&\n      process.env &&\n      process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n    process.platform\n  : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n  defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {},\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) =>\n      orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (\n      list: string[],\n      pattern: string,\n      options: MinimatchOptions = {},\n    ) => orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li <https://github.com/yetingli> for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n  maxGlobstarRecursion: number\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    // avoid the annoying deprecation flag lol\n    const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options[awe] === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined ?\n        options.windowsNoMagicRoot\n      : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: unknown[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      //oxlint-disable-next-line no-console\n      this.debug = (...args: unknown[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [\n            ...s.slice(0, 4),\n            ...s.slice(4).map(ss => this.parse(ss)),\n          ]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1,\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn ** into *\n    if (this.options.noglobstar) {\n      for (const partset of globParts) {\n        for (let j = 0; j < partset.length; j++) {\n          if (partset[j] === '**') {\n            partset[j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n\n    do {\n      didSomething = false\n      // <pre>/<e>/<rest> -> <pre>/<rest>\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // <pre>/<p>/../<rest> -> <pre>/<rest>\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (\n          p &&\n          p !== '.' &&\n          p !== '..' &&\n          p !== '**' &&\n          !(this.isWindows && /^[a-z]:$/i.test(p))\n        ) {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // <pre> is 1 or more portions\n  // <rest> is 1 or more portions\n  // <p> is any portion other than ., .., '', or **\n  // <e> is . or ''\n  //\n  // **/.. is *brutal* for filesystem walking performance, because\n  // it effectively resets the recursive walk each time it occurs,\n  // and ** cannot be reduced out by a .. pattern part like a regexp\n  // or most strings (other than .., ., and '') can be.\n  //\n  // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n  // <pre>/<e>/<rest> -> <pre>/<rest>\n  // <pre>/<p>/../<rest> -> <pre>/<rest>\n  // **/**/<rest> -> **/<rest>\n  //\n  // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n      for (let parts of globParts) {\n        let gs: number = -1\n        while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n          let gss: number = gs\n          while (parts[gss + 1] === '**') {\n            // <pre>/**/**/<rest> -> <pre>/**/<rest>\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // <pre>/<e>/<rest> -> <pre>/<rest>\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // <pre>/<p>/../<rest> -> <pre>/<rest>\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n  // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n  // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n  //\n  // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes,\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false,\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean = false,\n  ) {\n    let fileStartIndex = 0\n    let patternStartIndex = 0\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive =\n        typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi =\n        fileUNC ? 3\n        : fileDrive ? 0\n        : undefined\n      const pdi =\n        patternUNC ? 3\n        : patternDrive ? 0\n        : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [\n          file[fdi],\n          pattern[pdi] as string,\n        ]\n        // start matching at the drive letter index of each\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          patternStartIndex = pdi\n          fileStartIndex = fdi\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // don't need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    if (pattern.includes(GLOBSTAR)) {\n      return this.#matchGlobstar(\n        file,\n        pattern,\n        partial,\n        fileStartIndex,\n        patternStartIndex,\n      )\n    }\n\n    return this.#matchOne(\n      file,\n      pattern,\n      partial,\n      fileStartIndex,\n      patternStartIndex,\n    )\n  }\n\n  #matchGlobstar(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    // split the pattern into head, tail, and middle of ** delimited parts\n    const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n    const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n    // split the pattern up into globstar-delimited sections\n    // the tail has to be at the end, and the others just have\n    // to be found in order from the head.\n    const [head, body, tail] =\n      partial ?\n        [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1),\n          [],\n        ]\n      : [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1, lastgs),\n          pattern.slice(lastgs + 1),\n        ]\n\n    // check the head, from the current file/pattern index.\n    if (head.length) {\n      const fileHead = file.slice(fileIndex, fileIndex + head.length)\n      if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n        return false\n      }\n      fileIndex += head.length\n      patternIndex += head.length\n    }\n    // now we know the head matches!\n\n    // if the last portion is not empty, it MUST match the end\n    // check the tail\n    let fileTailMatch: number = 0\n    if (tail.length) {\n      // if head + tail > file, then we cannot possibly match\n      if (tail.length + fileIndex > file.length) return false\n\n      // try to match the tail\n      let tailStart = file.length - tail.length\n      if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n        fileTailMatch = tail.length\n      } else {\n        // affordance for stuff like a/**/* matching a/b/\n        // if the last file portion is '', and there's more to the pattern\n        // then try without the '' bit.\n        if (\n          file[file.length - 1] !== '' ||\n          fileIndex + tail.length === file.length\n        ) {\n          return false\n        }\n        tailStart--\n        if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n          return false\n        }\n        fileTailMatch = tail.length + 1\n      }\n    }\n\n    // now we know the tail matches!\n\n    // the middle is zero or more portions wrapped in **, possibly\n    // containing more ** sections.\n    // so a/**/b/**/c/**/d has become **/b/**/c/**\n    // if it's empty, it means a/**/b, just verify we have no bad dots\n    // if there's no tail, so it ends on /**, then we must have *something*\n    // after the head, or it's not a matc\n    if (!body.length) {\n      let sawSome = !!fileTailMatch\n      for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n        const f = String(file[i])\n        sawSome = true\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      // in partial mode, we just need to get past all file parts\n      return partial || sawSome\n    }\n\n    // now we know that there's one or more body sections, which can\n    // be matched anywhere from the 0 index (because the head was pruned)\n    // through to the length-fileTailMatch index.\n    // split the body up into sections, and note the minimum index it can\n    // be found at (start with the length of all previous segments)\n    // [section, before, after]\n    const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n    let currentBody: [ParseReturn[], number] = bodySegments[0]\n    let nonGsParts = 0\n    const nonGsPartsSums: number[] = [0]\n    for (const b of body) {\n      if (b === GLOBSTAR) {\n        nonGsPartsSums.push(nonGsParts)\n        currentBody = [[], 0]\n        bodySegments.push(currentBody)\n      } else {\n        currentBody[0].push(b)\n        nonGsParts++\n      }\n    }\n    let i = bodySegments.length - 1\n    const fileLength = file.length - fileTailMatch\n    for (const b of bodySegments) {\n      b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n    }\n\n    return !!this.#matchGlobStarBodySections(\n      file,\n      bodySegments,\n      fileIndex,\n      0,\n      partial,\n      0,\n      !!fileTailMatch,\n    )\n  }\n\n  // return false for \"nope, not matching\"\n  // return null for \"not matching, cannot keep trying\"\n  #matchGlobStarBodySections(\n    file: string[],\n    // pattern section, last possible position for it\n    bodySegments: [ParseReturn[], number][],\n    fileIndex: number,\n    bodyIndex: number,\n    partial: boolean,\n    globStarDepth: number,\n    sawTail: boolean,\n  ): boolean | null {\n    // take the first body segment, and walk from fileIndex to its \"after\"\n    // value at the end\n    // If it doesn't match at that position, we increment, until we hit\n    // that final possible position, and give up.\n    // If it does match, then advance and try to rest.\n    // If any of them fail we keep walking forward.\n    // this is still a bit recursively painful, but it's more constrained\n    // than previous implementations, because we never test something that\n    // can't possibly be a valid matching condition.\n    const bs = bodySegments[bodyIndex]\n    if (!bs) {\n      // just make sure that there's no bad dots\n      for (let i = fileIndex; i < file.length; i++) {\n        sawTail = true\n        const f = file[i]\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      return sawTail\n    }\n\n    // have a non-globstar body section to test\n    const [body, after] = bs\n    while (fileIndex <= after) {\n      const m = this.#matchOne(\n        file.slice(0, fileIndex + body.length),\n        body,\n        partial,\n        fileIndex,\n        0,\n      )\n      // if limit exceeded, no match. intentional false negative,\n      // acceptable break in correctness for security.\n      if (m && globStarDepth < this.maxGlobstarRecursion) {\n        // match! see if the rest match. if so, we're done!\n        const sub = this.#matchGlobStarBodySections(\n          file,\n          bodySegments,\n          fileIndex + body.length,\n          bodyIndex + 1,\n          partial,\n          globStarDepth + 1,\n          sawTail,\n        )\n        if (sub !== false) {\n          return sub\n        }\n      }\n      const f = file[fileIndex]\n      if (\n        f === '.' ||\n        f === '..' ||\n        (!this.options.dot && f.startsWith('.'))\n      ) {\n        return false\n      }\n\n      fileIndex++\n    }\n    // walked off. no point continuing\n    return partial || null\n  }\n\n  #matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    let fi: number\n    let pi: number\n    let pl: number\n    let fl: number\n    for (\n      fi = fileIndex,\n        pi = patternIndex,\n        fl = file.length,\n        pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      let p = pattern[pi]\n      let f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false || p === GLOBSTAR) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.<ext>  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            starDotExtTestNocaseDot\n          : starDotExtTestNocase\n        : options.dot ? starDotExtTestDot\n        : starDotExtTest)(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            qmarksTestNocaseDot\n          : qmarksTestNocase\n        : options.dot ? qmarksTestDot\n        : qmarksTest)(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar =\n      options.noglobstar ? star\n      : options.dot ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return (\n            typeof p === 'string' ? regExpEscape(p)\n            : p === GLOBSTAR ? GLOBSTAR\n            : p._src\n          )\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        const filtered = pp.filter(p => p !== GLOBSTAR)\n\n        // For partial matches, we need to make the pattern match\n        // any prefix of the full path. We do this by generating\n        // alternative patterns that match progressively longer prefixes.\n        if (this.partial && filtered.length >= 1) {\n          const prefixes: string[] = []\n          for (let i = 1; i <= filtered.length; i++) {\n            prefixes.push(filtered.slice(0, i).join('/'))\n          }\n          return '(?:' + prefixes.join('|') + ')'\n        }\n\n        return filtered.join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // In partial mode, '/' should always match as it's a valid prefix for any pattern\n    if (this.partial) {\n      re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n    }\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (const pattern of set) {\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
Index: de_modules/minimatch/dist/commonjs/package.json
===================================================================
--- node_modules/minimatch/dist/commonjs/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "commonjs"
-}
Index: de_modules/minimatch/dist/commonjs/unescape.d.ts
===================================================================
--- node_modules/minimatch/dist/commonjs/unescape.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import type { MinimatchOptions } from './index.js';
-/**
- * Un-escape a string that has been escaped with {@link escape}.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
- * square-bracket escapes are removed, but not backslash escapes.
- *
- * For example, it will turn the string `'[*]'` into `*`, but it will not
- * turn `'\\*'` into `'*'`, because `\` is a path separator in
- * `windowsPathsNoEscape` mode.
- *
- * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
- * backslash escapes are removed.
- *
- * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
- * or unescaped.
- *
- * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
- * unescaped.
- */
-export declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-//# sourceMappingURL=unescape.d.ts.map
Index: de_modules/minimatch/dist/commonjs/unescape.d.ts.map
===================================================================
--- node_modules/minimatch/dist/commonjs/unescape.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"}
Index: de_modules/minimatch/dist/commonjs/unescape.js
===================================================================
--- node_modules/minimatch/dist/commonjs/unescape.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,38 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.unescape = void 0;
-/**
- * Un-escape a string that has been escaped with {@link escape}.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
- * square-bracket escapes are removed, but not backslash escapes.
- *
- * For example, it will turn the string `'[*]'` into `*`, but it will not
- * turn `'\\*'` into `'*'`, because `\` is a path separator in
- * `windowsPathsNoEscape` mode.
- *
- * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
- * backslash escapes are removed.
- *
- * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
- * or unescaped.
- *
- * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
- * unescaped.
- */
-const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => {
-    if (magicalBraces) {
-        return windowsPathsNoEscape ?
-            s.replace(/\[([^/\\])\]/g, '$1')
-            : s
-                .replace(/((?!\\).|^)\[([^/\\])\]/g, '$1$2')
-                .replace(/\\([^/])/g, '$1');
-    }
-    return windowsPathsNoEscape ?
-        s.replace(/\[([^/\\{}])\]/g, '$1')
-        : s
-            .replace(/((?!\\).|^)\[([^/\\{}])\]/g, '$1$2')
-            .replace(/\\([^/{}])/g, '$1');
-};
-exports.unescape = unescape;
-//# sourceMappingURL=unescape.js.map
Index: de_modules/minimatch/dist/commonjs/unescape.js.map
===================================================================
--- node_modules/minimatch/dist/commonjs/unescape.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;iBAC3C,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC;aAC7C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = true,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/\\[([^/\\\\])\\]/g, '$1')\n      : s\n          .replace(/((?!\\\\).|^)\\[([^/\\\\])\\]/g, '$1$2')\n          .replace(/\\\\([^/])/g, '$1')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/\\[([^/\\\\{}])\\]/g, '$1')\n    : s\n        .replace(/((?!\\\\).|^)\\[([^/\\\\{}])\\]/g, '$1$2')\n        .replace(/\\\\([^/{}])/g, '$1')\n}\n"]}
Index: de_modules/minimatch/dist/esm/assert-valid-pattern.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,2 +1,0 @@
-export declare const assertValidPattern: (pattern: unknown) => void;
-//# sourceMappingURL=assert-valid-pattern.d.ts.map
Index: de_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"}
Index: de_modules/minimatch/dist/esm/assert-valid-pattern.js
===================================================================
--- node_modules/minimatch/dist/esm/assert-valid-pattern.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,10 +1,0 @@
-const MAX_PATTERN_LENGTH = 1024 * 64;
-export const assertValidPattern = (pattern) => {
-    if (typeof pattern !== 'string') {
-        throw new TypeError('invalid pattern');
-    }
-    if (pattern.length > MAX_PATTERN_LENGTH) {
-        throw new TypeError('pattern is too long');
-    }
-};
-//# sourceMappingURL=assert-valid-pattern.js.map
Index: de_modules/minimatch/dist/esm/assert-valid-pattern.js.map
===================================================================
--- node_modules/minimatch/dist/esm/assert-valid-pattern.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n  pattern: unknown,\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n"]}
Index: de_modules/minimatch/dist/esm/ast.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/ast.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import type { MinimatchOptions, MMRegExp } from './index.js';
-export type ExtglobType = '!' | '?' | '+' | '*' | '@';
-export declare class AST {
-    #private;
-    type: ExtglobType | null;
-    id: number;
-    get depth(): number;
-    constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions);
-    get hasMagic(): boolean | undefined;
-    toString(): string;
-    push(...parts: (string | AST)[]): void;
-    toJSON(): unknown[];
-    isStart(): boolean;
-    isEnd(): boolean;
-    copyIn(part: AST | string): void;
-    clone(parent: AST): AST;
-    static fromGlob(pattern: string, options?: MinimatchOptions): AST;
-    toMMPattern(): MMRegExp | string;
-    get options(): MinimatchOptions;
-    toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean];
-}
-//# sourceMappingURL=ast.d.ts.map
Index: de_modules/minimatch/dist/esm/ast.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/ast.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwC5D,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAgJrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IAkDlB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"}
Index: de_modules/minimatch/dist/esm/ast.js
===================================================================
--- node_modules/minimatch/dist/esm/ast.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,841 +1,0 @@
-// parse a single path portion
-var _a;
-import { parseClass } from './brace-expressions.js';
-import { unescape } from './unescape.js';
-const types = new Set(['!', '?', '+', '*', '@']);
-const isExtglobType = (c) => types.has(c);
-const isExtglobAST = (c) => isExtglobType(c.type);
-// Map of which extglob types can adopt the children of a nested extglob
-//
-// anything but ! can adopt a matching type:
-// +(a|+(b|c)|d) => +(a|b|c|d)
-// *(a|*(b|c)|d) => *(a|b|c|d)
-// @(a|@(b|c)|d) => @(a|b|c|d)
-// ?(a|?(b|c)|d) => ?(a|b|c|d)
-//
-// * can adopt anything, because 0 or repetition is allowed
-// *(a|?(b|c)|d) => *(a|b|c|d)
-// *(a|+(b|c)|d) => *(a|b|c|d)
-// *(a|@(b|c)|d) => *(a|b|c|d)
-//
-// + can adopt @, because 1 or repetition is allowed
-// +(a|@(b|c)|d) => +(a|b|c|d)
-//
-// + and @ CANNOT adopt *, because 0 would be allowed
-// +(a|*(b|c)|d) => would match "", on *(b|c)
-// @(a|*(b|c)|d) => would match "", on *(b|c)
-//
-// + and @ CANNOT adopt ?, because 0 would be allowed
-// +(a|?(b|c)|d) => would match "", on ?(b|c)
-// @(a|?(b|c)|d) => would match "", on ?(b|c)
-//
-// ? can adopt @, because 0 or 1 is allowed
-// ?(a|@(b|c)|d) => ?(a|b|c|d)
-//
-// ? and @ CANNOT adopt * or +, because >1 would be allowed
-// ?(a|*(b|c)|d) => would match bbb on *(b|c)
-// @(a|*(b|c)|d) => would match bbb on *(b|c)
-// ?(a|+(b|c)|d) => would match bbb on +(b|c)
-// @(a|+(b|c)|d) => would match bbb on +(b|c)
-//
-// ! CANNOT adopt ! (nothing else can either)
-// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)
-//
-// ! can adopt @
-// !(a|@(b|c)|d) => !(a|b|c|d)
-//
-// ! CANNOT adopt *
-// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
-//
-// ! CANNOT adopt +
-// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
-//
-// ! CANNOT adopt ?
-// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x"
-const adoptionMap = new Map([
-    ['!', ['@']],
-    ['?', ['?', '@']],
-    ['@', ['@']],
-    ['*', ['*', '+', '?', '@']],
-    ['+', ['+', '@']],
-]);
-// nested extglobs that can be adopted in, but with the addition of
-// a blank '' element.
-const adoptionWithSpaceMap = new Map([
-    ['!', ['?']],
-    ['@', ['?']],
-    ['+', ['?', '*']],
-]);
-// union of the previous two maps
-const adoptionAnyMap = new Map([
-    ['!', ['?', '@']],
-    ['?', ['?', '@']],
-    ['@', ['?', '@']],
-    ['*', ['*', '+', '?', '@']],
-    ['+', ['+', '@', '?', '*']],
-]);
-// Extglobs that can take over their parent if they are the only child
-// the key is parent, value maps child to resulting extglob parent type
-// '@' is omitted because it's a special case. An `@` extglob with a single
-// member can always be usurped by that subpattern.
-const usurpMap = new Map([
-    ['!', new Map([['!', '@']])],
-    [
-        '?',
-        new Map([
-            ['*', '*'],
-            ['+', '*'],
-        ]),
-    ],
-    [
-        '@',
-        new Map([
-            ['!', '!'],
-            ['?', '?'],
-            ['@', '@'],
-            ['*', '*'],
-            ['+', '+'],
-        ]),
-    ],
-    [
-        '+',
-        new Map([
-            ['?', '*'],
-            ['*', '*'],
-        ]),
-    ],
-]);
-// Patterns that get prepended to bind to the start of either the
-// entire string, or just a single path portion, to prevent dots
-// and/or traversal patterns, when needed.
-// Exts don't need the ^ or / bit, because the root binds that already.
-const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
-const startNoDot = '(?!\\.)';
-// characters that indicate a start of pattern needs the "no dots" bit,
-// because a dot *might* be matched. ( is not in the list, because in
-// the case of a child extglob, it will handle the prevention itself.
-const addPatternStart = new Set(['[', '.']);
-// cases where traversal is A-OK, no dot prevention needed
-const justDots = new Set(['..', '.']);
-const reSpecials = new Set('().*{}+?[]^$\\!');
-const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-// any single thing other than /
-const qmark = '[^/]';
-// * => any number of characters
-const star = qmark + '*?';
-// use + when we need to ensure that *something* matches, because the * is
-// the only thing in the path portion.
-const starNoEmpty = qmark + '+?';
-// remove the \ chars that we added if we end up doing a nonmagic compare
-// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
-let ID = 0;
-export class AST {
-    type;
-    #root;
-    #hasMagic;
-    #uflag = false;
-    #parts = [];
-    #parent;
-    #parentIndex;
-    #negs;
-    #filledNegs = false;
-    #options;
-    #toString;
-    // set to true if it's an extglob with no children
-    // (which really means one child of '')
-    #emptyExt = false;
-    id = ++ID;
-    get depth() {
-        return (this.#parent?.depth ?? -1) + 1;
-    }
-    [Symbol.for('nodejs.util.inspect.custom')]() {
-        return {
-            '@@type': 'AST',
-            id: this.id,
-            type: this.type,
-            root: this.#root.id,
-            parent: this.#parent?.id,
-            depth: this.depth,
-            partsLength: this.#parts.length,
-            parts: this.#parts,
-        };
-    }
-    constructor(type, parent, options = {}) {
-        this.type = type;
-        // extglobs are inherently magical
-        if (type)
-            this.#hasMagic = true;
-        this.#parent = parent;
-        this.#root = this.#parent ? this.#parent.#root : this;
-        this.#options = this.#root === this ? options : this.#root.#options;
-        this.#negs = this.#root === this ? [] : this.#root.#negs;
-        if (type === '!' && !this.#root.#filledNegs)
-            this.#negs.push(this);
-        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
-    }
-    get hasMagic() {
-        /* c8 ignore start */
-        if (this.#hasMagic !== undefined)
-            return this.#hasMagic;
-        /* c8 ignore stop */
-        for (const p of this.#parts) {
-            if (typeof p === 'string')
-                continue;
-            if (p.type || p.hasMagic)
-                return (this.#hasMagic = true);
-        }
-        // note: will be undefined until we generate the regexp src and find out
-        return this.#hasMagic;
-    }
-    // reconstructs the pattern
-    toString() {
-        return (this.#toString !== undefined ? this.#toString
-            : !this.type ?
-                (this.#toString = this.#parts.map(p => String(p)).join(''))
-                : (this.#toString =
-                    this.type +
-                        '(' +
-                        this.#parts.map(p => String(p)).join('|') +
-                        ')'));
-    }
-    #fillNegs() {
-        /* c8 ignore start */
-        if (this !== this.#root)
-            throw new Error('should only call on root');
-        if (this.#filledNegs)
-            return this;
-        /* c8 ignore stop */
-        // call toString() once to fill this out
-        this.toString();
-        this.#filledNegs = true;
-        let n;
-        while ((n = this.#negs.pop())) {
-            if (n.type !== '!')
-                continue;
-            // walk up the tree, appending everthing that comes AFTER parentIndex
-            let p = n;
-            let pp = p.#parent;
-            while (pp) {
-                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
-                    for (const part of n.#parts) {
-                        /* c8 ignore start */
-                        if (typeof part === 'string') {
-                            throw new Error('string part in extglob AST??');
-                        }
-                        /* c8 ignore stop */
-                        part.copyIn(pp.#parts[i]);
-                    }
-                }
-                p = pp;
-                pp = p.#parent;
-            }
-        }
-        return this;
-    }
-    push(...parts) {
-        for (const p of parts) {
-            if (p === '')
-                continue;
-            /* c8 ignore start */
-            if (typeof p !== 'string' &&
-                !(p instanceof _a && p.#parent === this)) {
-                throw new Error('invalid part: ' + p);
-            }
-            /* c8 ignore stop */
-            this.#parts.push(p);
-        }
-    }
-    toJSON() {
-        const ret = this.type === null ?
-            this.#parts
-                .slice()
-                .map(p => (typeof p === 'string' ? p : p.toJSON()))
-            : [this.type, ...this.#parts.map(p => p.toJSON())];
-        if (this.isStart() && !this.type)
-            ret.unshift([]);
-        if (this.isEnd() &&
-            (this === this.#root ||
-                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
-            ret.push({});
-        }
-        return ret;
-    }
-    isStart() {
-        if (this.#root === this)
-            return true;
-        // if (this.type) return !!this.#parent?.isStart()
-        if (!this.#parent?.isStart())
-            return false;
-        if (this.#parentIndex === 0)
-            return true;
-        // if everything AHEAD of this is a negation, then it's still the "start"
-        const p = this.#parent;
-        for (let i = 0; i < this.#parentIndex; i++) {
-            const pp = p.#parts[i];
-            if (!(pp instanceof _a && pp.type === '!')) {
-                return false;
-            }
-        }
-        return true;
-    }
-    isEnd() {
-        if (this.#root === this)
-            return true;
-        if (this.#parent?.type === '!')
-            return true;
-        if (!this.#parent?.isEnd())
-            return false;
-        if (!this.type)
-            return this.#parent?.isEnd();
-        // if not root, it'll always have a parent
-        /* c8 ignore start */
-        const pl = this.#parent ? this.#parent.#parts.length : 0;
-        /* c8 ignore stop */
-        return this.#parentIndex === pl - 1;
-    }
-    copyIn(part) {
-        if (typeof part === 'string')
-            this.push(part);
-        else
-            this.push(part.clone(this));
-    }
-    clone(parent) {
-        const c = new _a(this.type, parent);
-        for (const p of this.#parts) {
-            c.copyIn(p);
-        }
-        return c;
-    }
-    static #parseAST(str, ast, pos, opt, extDepth) {
-        const maxDepth = opt.maxExtglobRecursion ?? 2;
-        let escaping = false;
-        let inBrace = false;
-        let braceStart = -1;
-        let braceNeg = false;
-        if (ast.type === null) {
-            // outside of a extglob, append until we find a start
-            let i = pos;
-            let acc = '';
-            while (i < str.length) {
-                const c = str.charAt(i++);
-                // still accumulate escapes at this point, but we do ignore
-                // starts that are escaped
-                if (escaping || c === '\\') {
-                    escaping = !escaping;
-                    acc += c;
-                    continue;
-                }
-                if (inBrace) {
-                    if (i === braceStart + 1) {
-                        if (c === '^' || c === '!') {
-                            braceNeg = true;
-                        }
-                    }
-                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-                        inBrace = false;
-                    }
-                    acc += c;
-                    continue;
-                }
-                else if (c === '[') {
-                    inBrace = true;
-                    braceStart = i;
-                    braceNeg = false;
-                    acc += c;
-                    continue;
-                }
-                // we don't have to check for adoption here, because that's
-                // done at the other recursion point.
-                const doRecurse = !opt.noext &&
-                    isExtglobType(c) &&
-                    str.charAt(i) === '(' &&
-                    extDepth <= maxDepth;
-                if (doRecurse) {
-                    ast.push(acc);
-                    acc = '';
-                    const ext = new _a(c, ast);
-                    i = _a.#parseAST(str, ext, i, opt, extDepth + 1);
-                    ast.push(ext);
-                    continue;
-                }
-                acc += c;
-            }
-            ast.push(acc);
-            return i;
-        }
-        // some kind of extglob, pos is at the (
-        // find the next | or )
-        let i = pos + 1;
-        let part = new _a(null, ast);
-        const parts = [];
-        let acc = '';
-        while (i < str.length) {
-            const c = str.charAt(i++);
-            // still accumulate escapes at this point, but we do ignore
-            // starts that are escaped
-            if (escaping || c === '\\') {
-                escaping = !escaping;
-                acc += c;
-                continue;
-            }
-            if (inBrace) {
-                if (i === braceStart + 1) {
-                    if (c === '^' || c === '!') {
-                        braceNeg = true;
-                    }
-                }
-                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-                    inBrace = false;
-                }
-                acc += c;
-                continue;
-            }
-            else if (c === '[') {
-                inBrace = true;
-                braceStart = i;
-                braceNeg = false;
-                acc += c;
-                continue;
-            }
-            const doRecurse = !opt.noext &&
-                isExtglobType(c) &&
-                str.charAt(i) === '(' &&
-                /* c8 ignore start - the maxDepth is sufficient here */
-                (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)));
-            /* c8 ignore stop */
-            if (doRecurse) {
-                const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1;
-                part.push(acc);
-                acc = '';
-                const ext = new _a(c, part);
-                part.push(ext);
-                i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd);
-                continue;
-            }
-            if (c === '|') {
-                part.push(acc);
-                acc = '';
-                parts.push(part);
-                part = new _a(null, ast);
-                continue;
-            }
-            if (c === ')') {
-                if (acc === '' && ast.#parts.length === 0) {
-                    ast.#emptyExt = true;
-                }
-                part.push(acc);
-                acc = '';
-                ast.push(...parts, part);
-                return i;
-            }
-            acc += c;
-        }
-        // unfinished extglob
-        // if we got here, it was a malformed extglob! not an extglob, but
-        // maybe something else in there.
-        ast.type = null;
-        ast.#hasMagic = undefined;
-        ast.#parts = [str.substring(pos - 1)];
-        return i;
-    }
-    #canAdoptWithSpace(child) {
-        return this.#canAdopt(child, adoptionWithSpaceMap);
-    }
-    #canAdopt(child, map = adoptionMap) {
-        if (!child ||
-            typeof child !== 'object' ||
-            child.type !== null ||
-            child.#parts.length !== 1 ||
-            this.type === null) {
-            return false;
-        }
-        const gc = child.#parts[0];
-        if (!gc || typeof gc !== 'object' || gc.type === null) {
-            return false;
-        }
-        return this.#canAdoptType(gc.type, map);
-    }
-    #canAdoptType(c, map = adoptionAnyMap) {
-        return !!map.get(this.type)?.includes(c);
-    }
-    #adoptWithSpace(child, index) {
-        const gc = child.#parts[0];
-        const blank = new _a(null, gc, this.options);
-        blank.#parts.push('');
-        gc.push(blank);
-        this.#adopt(child, index);
-    }
-    #adopt(child, index) {
-        const gc = child.#parts[0];
-        this.#parts.splice(index, 1, ...gc.#parts);
-        for (const p of gc.#parts) {
-            if (typeof p === 'object')
-                p.#parent = this;
-        }
-        this.#toString = undefined;
-    }
-    #canUsurpType(c) {
-        const m = usurpMap.get(this.type);
-        return !!m?.has(c);
-    }
-    #canUsurp(child) {
-        if (!child ||
-            typeof child !== 'object' ||
-            child.type !== null ||
-            child.#parts.length !== 1 ||
-            this.type === null ||
-            this.#parts.length !== 1) {
-            return false;
-        }
-        const gc = child.#parts[0];
-        if (!gc || typeof gc !== 'object' || gc.type === null) {
-            return false;
-        }
-        return this.#canUsurpType(gc.type);
-    }
-    #usurp(child) {
-        const m = usurpMap.get(this.type);
-        const gc = child.#parts[0];
-        const nt = m?.get(gc.type);
-        /* c8 ignore start - impossible */
-        if (!nt)
-            return false;
-        /* c8 ignore stop */
-        this.#parts = gc.#parts;
-        for (const p of this.#parts) {
-            if (typeof p === 'object') {
-                p.#parent = this;
-            }
-        }
-        this.type = nt;
-        this.#toString = undefined;
-        this.#emptyExt = false;
-    }
-    static fromGlob(pattern, options = {}) {
-        const ast = new _a(null, undefined, options);
-        _a.#parseAST(pattern, ast, 0, options, 0);
-        return ast;
-    }
-    // returns the regular expression if there's magic, or the unescaped
-    // string if not.
-    toMMPattern() {
-        // should only be called on root
-        /* c8 ignore start */
-        if (this !== this.#root)
-            return this.#root.toMMPattern();
-        /* c8 ignore stop */
-        const glob = this.toString();
-        const [re, body, hasMagic, uflag] = this.toRegExpSource();
-        // if we're in nocase mode, and not nocaseMagicOnly, then we do
-        // still need a regular expression if we have to case-insensitively
-        // match capital/lowercase characters.
-        const anyMagic = hasMagic ||
-            this.#hasMagic ||
-            (this.#options.nocase &&
-                !this.#options.nocaseMagicOnly &&
-                glob.toUpperCase() !== glob.toLowerCase());
-        if (!anyMagic) {
-            return body;
-        }
-        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
-        return Object.assign(new RegExp(`^${re}$`, flags), {
-            _src: re,
-            _glob: glob,
-        });
-    }
-    get options() {
-        return this.#options;
-    }
-    // returns the string match, the regexp source, whether there's magic
-    // in the regexp (so a regular expression is required) and whether or
-    // not the uflag is needed for the regular expression (for posix classes)
-    // TODO: instead of injecting the start/end at this point, just return
-    // the BODY of the regexp, along with the start/end portions suitable
-    // for binding the start/end in either a joined full-path makeRe context
-    // (where we bind to (^|/), or a standalone matchPart context (where
-    // we bind to ^, and not /).  Otherwise slashes get duped!
-    //
-    // In part-matching mode, the start is:
-    // - if not isStart: nothing
-    // - if traversal possible, but not allowed: ^(?!\.\.?$)
-    // - if dots allowed or not possible: ^
-    // - if dots possible and not allowed: ^(?!\.)
-    // end is:
-    // - if not isEnd(): nothing
-    // - else: $
-    //
-    // In full-path matching mode, we put the slash at the START of the
-    // pattern, so start is:
-    // - if first pattern: same as part-matching mode
-    // - if not isStart(): nothing
-    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
-    // - if dots allowed or not possible: /
-    // - if dots possible and not allowed: /(?!\.)
-    // end is:
-    // - if last pattern, same as part-matching mode
-    // - else nothing
-    //
-    // Always put the (?:$|/) on negated tails, though, because that has to be
-    // there to bind the end of the negated pattern portion, and it's easier to
-    // just stick it in now rather than try to inject it later in the middle of
-    // the pattern.
-    //
-    // We can just always return the same end, and leave it up to the caller
-    // to know whether it's going to be used joined or in parts.
-    // And, if the start is adjusted slightly, can do the same there:
-    // - if not isStart: nothing
-    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
-    // - if dots allowed or not possible: (?:/|^)
-    // - if dots possible and not allowed: (?:/|^)(?!\.)
-    //
-    // But it's better to have a simpler binding without a conditional, for
-    // performance, so probably better to return both start options.
-    //
-    // Then the caller just ignores the end if it's not the first pattern,
-    // and the start always gets applied.
-    //
-    // But that's always going to be $ if it's the ending pattern, or nothing,
-    // so the caller can just attach $ at the end of the pattern when building.
-    //
-    // So the todo is:
-    // - better detect what kind of start is needed
-    // - return both flavors of starting pattern
-    // - attach $ at the end of the pattern when creating the actual RegExp
-    //
-    // Ah, but wait, no, that all only applies to the root when the first pattern
-    // is not an extglob. If the first pattern IS an extglob, then we need all
-    // that dot prevention biz to live in the extglob portions, because eg
-    // +(*|.x*) can match .xy but not .yx.
-    //
-    // So, return the two flavors if it's #root and the first child is not an
-    // AST, otherwise leave it to the child AST to handle it, and there,
-    // use the (?:^|/) style of start binding.
-    //
-    // Even simplified further:
-    // - Since the start for a join is eg /(?!\.) and the start for a part
-    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
-    // or start or whatever) and prepend ^ or / at the Regexp construction.
-    toRegExpSource(allowDot) {
-        const dot = allowDot ?? !!this.#options.dot;
-        if (this.#root === this) {
-            this.#flatten();
-            this.#fillNegs();
-        }
-        if (!isExtglobAST(this)) {
-            const noEmpty = this.isStart() &&
-                this.isEnd() &&
-                !this.#parts.some(s => typeof s !== 'string');
-            const src = this.#parts
-                .map(p => {
-                const [re, _, hasMagic, uflag] = typeof p === 'string' ?
-                    _a.#parseGlob(p, this.#hasMagic, noEmpty)
-                    : p.toRegExpSource(allowDot);
-                this.#hasMagic = this.#hasMagic || hasMagic;
-                this.#uflag = this.#uflag || uflag;
-                return re;
-            })
-                .join('');
-            let start = '';
-            if (this.isStart()) {
-                if (typeof this.#parts[0] === 'string') {
-                    // this is the string that will match the start of the pattern,
-                    // so we need to protect against dots and such.
-                    // '.' and '..' cannot match unless the pattern is that exactly,
-                    // even if it starts with . or dot:true is set.
-                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
-                    if (!dotTravAllowed) {
-                        const aps = addPatternStart;
-                        // check if we have a possibility of matching . or ..,
-                        // and prevent that.
-                        const needNoTrav = 
-                        // dots are allowed, and the pattern starts with [ or .
-                        (dot && aps.has(src.charAt(0))) ||
-                            // the pattern starts with \., and then [ or .
-                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
-                            // the pattern starts with \.\., and then [ or .
-                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
-                        // no need to prevent dots if it can't match a dot, or if a
-                        // sub-pattern will be preventing it anyway.
-                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
-                        start =
-                            needNoTrav ? startNoTraversal
-                                : needNoDot ? startNoDot
-                                    : '';
-                    }
-                }
-            }
-            // append the "end of path portion" pattern to negation tails
-            let end = '';
-            if (this.isEnd() &&
-                this.#root.#filledNegs &&
-                this.#parent?.type === '!') {
-                end = '(?:$|\\/)';
-            }
-            const final = start + src + end;
-            return [
-                final,
-                unescape(src),
-                (this.#hasMagic = !!this.#hasMagic),
-                this.#uflag,
-            ];
-        }
-        // We need to calculate the body *twice* if it's a repeat pattern
-        // at the start, once in nodot mode, then again in dot mode, so a
-        // pattern like *(?) can match 'x.y'
-        const repeated = this.type === '*' || this.type === '+';
-        // some kind of extglob
-        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
-        let body = this.#partsToRegExp(dot);
-        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
-            // invalid extglob, has to at least be *something* present, if it's
-            // the entire path portion.
-            const s = this.toString();
-            const me = this;
-            me.#parts = [s];
-            me.type = null;
-            me.#hasMagic = undefined;
-            return [s, unescape(this.toString()), false, false];
-        }
-        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ?
-            ''
-            : this.#partsToRegExp(true);
-        if (bodyDotAllowed === body) {
-            bodyDotAllowed = '';
-        }
-        if (bodyDotAllowed) {
-            body = `(?:${body})(?:${bodyDotAllowed})*?`;
-        }
-        // an empty !() is exactly equivalent to a starNoEmpty
-        let final = '';
-        if (this.type === '!' && this.#emptyExt) {
-            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
-        }
-        else {
-            const close = this.type === '!' ?
-                // !() must match something,but !(x) can match ''
-                '))' +
-                    (this.isStart() && !dot && !allowDot ? startNoDot : '') +
-                    star +
-                    ')'
-                : this.type === '@' ? ')'
-                    : this.type === '?' ? ')?'
-                        : this.type === '+' && bodyDotAllowed ? ')'
-                            : this.type === '*' && bodyDotAllowed ? `)?`
-                                : `)${this.type}`;
-            final = start + body + close;
-        }
-        return [
-            final,
-            unescape(body),
-            (this.#hasMagic = !!this.#hasMagic),
-            this.#uflag,
-        ];
-    }
-    #flatten() {
-        if (!isExtglobAST(this)) {
-            for (const p of this.#parts) {
-                if (typeof p === 'object') {
-                    p.#flatten();
-                }
-            }
-        }
-        else {
-            // do up to 10 passes to flatten as much as possible
-            let iterations = 0;
-            let done = false;
-            do {
-                done = true;
-                for (let i = 0; i < this.#parts.length; i++) {
-                    const c = this.#parts[i];
-                    if (typeof c === 'object') {
-                        c.#flatten();
-                        if (this.#canAdopt(c)) {
-                            done = false;
-                            this.#adopt(c, i);
-                        }
-                        else if (this.#canAdoptWithSpace(c)) {
-                            done = false;
-                            this.#adoptWithSpace(c, i);
-                        }
-                        else if (this.#canUsurp(c)) {
-                            done = false;
-                            this.#usurp(c);
-                        }
-                    }
-                }
-            } while (!done && ++iterations < 10);
-        }
-        this.#toString = undefined;
-    }
-    #partsToRegExp(dot) {
-        return this.#parts
-            .map(p => {
-            // extglob ASTs should only contain parent ASTs
-            /* c8 ignore start */
-            if (typeof p === 'string') {
-                throw new Error('string type in extglob ast??');
-            }
-            /* c8 ignore stop */
-            // can ignore hasMagic, because extglobs are already always magic
-            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
-            this.#uflag = this.#uflag || uflag;
-            return re;
-        })
-            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
-            .join('|');
-    }
-    static #parseGlob(glob, hasMagic, noEmpty = false) {
-        let escaping = false;
-        let re = '';
-        let uflag = false;
-        // multiple stars that aren't globstars coalesce into one *
-        let inStar = false;
-        for (let i = 0; i < glob.length; i++) {
-            const c = glob.charAt(i);
-            if (escaping) {
-                escaping = false;
-                re += (reSpecials.has(c) ? '\\' : '') + c;
-                continue;
-            }
-            if (c === '*') {
-                if (inStar)
-                    continue;
-                inStar = true;
-                re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star;
-                hasMagic = true;
-                continue;
-            }
-            else {
-                inStar = false;
-            }
-            if (c === '\\') {
-                if (i === glob.length - 1) {
-                    re += '\\\\';
-                }
-                else {
-                    escaping = true;
-                }
-                continue;
-            }
-            if (c === '[') {
-                const [src, needUflag, consumed, magic] = parseClass(glob, i);
-                if (consumed) {
-                    re += src;
-                    uflag = uflag || needUflag;
-                    i += consumed - 1;
-                    hasMagic = hasMagic || magic;
-                    continue;
-                }
-            }
-            if (c === '?') {
-                re += qmark;
-                hasMagic = true;
-                continue;
-            }
-            re += regExpEscape(c);
-        }
-        return [re, unescape(glob), !!hasMagic, uflag];
-    }
-}
-_a = AST;
-//# sourceMappingURL=ast.js.map
Index: de_modules/minimatch/dist/esm/ast.js.map
===================================================================
--- node_modules/minimatch/dist/esm/ast.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport type { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n  types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n  isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['@']],\n  ['?', ['?', '@']],\n  ['@', ['@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['?']],\n  ['@', ['?']],\n  ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n  ['!', ['?', '@']],\n  ['?', ['?', '@']],\n  ['@', ['?', '@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<\n  ExtglobType,\n  Map<ExtglobType | null, ExtglobType | null>\n>([\n  ['!', new Map([['!', '@']])],\n  [\n    '?',\n    new Map([\n      ['*', '*'],\n      ['+', '*'],\n    ]),\n  ],\n  [\n    '@',\n    new Map([\n      ['!', '!'],\n      ['?', '?'],\n      ['@', '@'],\n      ['*', '*'],\n      ['+', '+'],\n    ]),\n  ],\n  [\n    '+',\n    new Map([\n      ['?', '*'],\n      ['*', '*'],\n    ]),\n  ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  #parent?: AST\n  #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n  id = ++ID\n\n  get depth(): number {\n    return (this.#parent?.depth ?? -1) + 1\n  }\n\n  [Symbol.for('nodejs.util.inspect.custom')]() {\n    return {\n      '@@type': 'AST',\n      id: this.id,\n      type: this.type,\n      root: this.#root.id,\n      parent: this.#parent?.id,\n      depth: this.depth,\n      partsLength: this.#parts.length,\n      parts: this.#parts,\n    }\n  }\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {},\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    return (\n      this.#toString !== undefined ? this.#toString\n      : !this.type ?\n        (this.#toString = this.#parts.map(p => String(p)).join(''))\n      : (this.#toString =\n          this.type +\n          '(' +\n          this.#parts.map(p => String(p)).join('|') +\n          ')')\n    )\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (\n        typeof p !== 'string' &&\n        !(p instanceof AST && p.#parent === this)\n      ) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: unknown[] =\n      this.type === null ?\n        this.#parts\n          .slice()\n          .map(p => (typeof p === 'string' ? p : p.toJSON()))\n      : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions,\n    extDepth: number,\n  ): number {\n    const maxDepth = opt.maxExtglobRecursion ?? 2\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        // we don't have to check for adoption here, because that's\n        // done at the other recursion point.\n        const doRecurse =\n          !opt.noext &&\n          isExtglobType(c) &&\n          str.charAt(i) === '(' &&\n          extDepth <= maxDepth\n        if (doRecurse) {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      const doRecurse =\n        !opt.noext &&\n        isExtglobType(c) &&\n        str.charAt(i) === '(' &&\n        /* c8 ignore start - the maxDepth is sufficient here */\n        (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n      /* c8 ignore stop */\n      if (doRecurse) {\n        const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  #canAdoptWithSpace(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    return this.#canAdopt(child, adoptionWithSpaceMap)\n  }\n\n  #canAdopt(\n    child?: AST | string,\n    map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n  ): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canAdoptType(\n      gc.type,\n      map,\n    )\n  }\n  #canAdoptType(\n    c: string,\n    map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n  ): c is ExtglobType {\n    return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n  }\n\n  #adoptWithSpace(\n    this: AST & { type: ExtglobType },\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const blank = new AST(null, gc, this.options)\n    blank.#parts.push('')\n    gc.push(blank)\n    this.#adopt(child, index)\n  }\n\n  #adopt(\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    this.#parts.splice(index, 1, ...gc.#parts)\n    for (const p of gc.#parts) {\n      if (typeof p === 'object') p.#parent = this\n    }\n    this.#toString = undefined\n  }\n\n  #canUsurpType(c: string): boolean {\n    const m = usurpMap.get(this.type as ExtglobType)\n    return !!m?.has(c as ExtglobType)\n  }\n\n  #canUsurp(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null ||\n      this.#parts.length !== 1\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n  }\n\n  #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n    const m = usurpMap.get(this.type as ExtglobType)\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const nt = m?.get(gc.type)\n    /* c8 ignore start - impossible */\n    if (!nt) return false\n    /* c8 ignore stop */\n    this.#parts = gc.#parts\n    for (const p of this.#parts) {\n      if (typeof p === 'object') {\n        p.#parent = this\n      }\n    }\n    this.type = nt\n    this.#toString = undefined\n    this.#emptyExt = false\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options, 0)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  get options() {\n    return this.#options\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(\n    allowDot?: boolean,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    const dot = allowDot ?? !!this.#options.dot\n    if (this.#root === this) {\n      this.#flatten()\n      this.#fillNegs()\n    }\n    if (!isExtglobAST(this)) {\n      const noEmpty =\n        this.isStart() &&\n        this.isEnd() &&\n        !this.#parts.some(s => typeof s !== 'string')\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string' ?\n              AST.#parseGlob(p, this.#hasMagic, noEmpty)\n            : p.toRegExpSource(allowDot)\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n            start =\n              needNoTrav ? startNoTraversal\n              : needNoDot ? startNoDot\n              : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // We need to calculate the body *twice* if it's a repeat pattern\n    // at the start, once in nodot mode, then again in dot mode, so a\n    // pattern like *(?) can match 'x.y'\n\n    const repeated = this.type === '*' || this.type === '+'\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    let body = (this as AST & { type: ExtglobType }).#partsToRegExp(dot)\n\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      const me = this as AST\n      me.#parts = [s]\n      me.type = null\n      me.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n\n    let bodyDotAllowed =\n      !repeated || allowDot || dot || !startNoDot ?\n        ''\n      : this.#partsToRegExp(true)\n    if (bodyDotAllowed === body) {\n      bodyDotAllowed = ''\n    }\n    if (bodyDotAllowed) {\n      body = `(?:${body})(?:${bodyDotAllowed})*?`\n    }\n\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!' ?\n          // !() must match something,but !(x) can match ''\n          '))' +\n          (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n          star +\n          ')'\n        : this.type === '@' ? ')'\n        : this.type === '?' ? ')?'\n        : this.type === '+' && bodyDotAllowed ? ')'\n        : this.type === '*' && bodyDotAllowed ? `)?`\n        : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  #flatten() {\n    if (!isExtglobAST(this)) {\n      for (const p of this.#parts) {\n        if (typeof p === 'object') {\n          p.#flatten()\n        }\n      }\n    } else {\n      // do up to 10 passes to flatten as much as possible\n      let iterations = 0\n      let done = false\n      do {\n        done = true\n        for (let i = 0; i < this.#parts.length; i++) {\n          const c = this.#parts[i]\n          if (typeof c === 'object') {\n            c.#flatten()\n            if (this.#canAdopt(c)) {\n              done = false\n              this.#adopt(c, i)\n            } else if (this.#canAdoptWithSpace(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#adoptWithSpace(c, i)\n            } else if (this.#canUsurp(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#usurp(c)\n            }\n          }\n        }\n      } while (!done && ++iterations < 10)\n    }\n    this.#toString = undefined\n  }\n\n  #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n    return this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    // multiple stars that aren't globstars coalesce into one *\n    let inStar = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '*') {\n        if (inStar) continue\n        inStar = true\n        re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n        hasMagic = true\n        continue\n      } else {\n        inStar = false\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n"]}
Index: de_modules/minimatch/dist/esm/brace-expressions.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/brace-expressions.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-export type ParseClassResult = [
-    src: string,
-    uFlag: boolean,
-    consumed: number,
-    hasMagic: boolean
-];
-export declare const parseClass: (glob: string, position: number) => ParseClassResult;
-//# sourceMappingURL=brace-expressions.d.ts.map
Index: de_modules/minimatch/dist/esm/brace-expressions.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/brace-expressions.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"}
Index: de_modules/minimatch/dist/esm/brace-expressions.js
===================================================================
--- node_modules/minimatch/dist/esm/brace-expressions.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,146 +1,0 @@
-// translate the various posix character classes into unicode properties
-// this works across all unicode locales
-// { <posix class>: [<translation>, /u flag required, negated]
-const posixClasses = {
-    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
-    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
-    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
-    '[:blank:]': ['\\p{Zs}\\t', true],
-    '[:cntrl:]': ['\\p{Cc}', true],
-    '[:digit:]': ['\\p{Nd}', true],
-    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
-    '[:lower:]': ['\\p{Ll}', true],
-    '[:print:]': ['\\p{C}', true],
-    '[:punct:]': ['\\p{P}', true],
-    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
-    '[:upper:]': ['\\p{Lu}', true],
-    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
-    '[:xdigit:]': ['A-Fa-f0-9', false],
-};
-// only need to escape a few things inside of brace expressions
-// escapes: [ \ ] -
-const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
-// escape all regexp magic characters
-const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-// everything has already been escaped, we just have to join
-const rangesToString = (ranges) => ranges.join('');
-// takes a glob string at a posix brace expression, and returns
-// an equivalent regular expression source, and boolean indicating
-// whether the /u flag needs to be applied, and the number of chars
-// consumed to parse the character class.
-// This also removes out of order ranges, and returns ($.) if the
-// entire class just no good.
-export const parseClass = (glob, position) => {
-    const pos = position;
-    /* c8 ignore start */
-    if (glob.charAt(pos) !== '[') {
-        throw new Error('not in a brace expression');
-    }
-    /* c8 ignore stop */
-    const ranges = [];
-    const negs = [];
-    let i = pos + 1;
-    let sawStart = false;
-    let uflag = false;
-    let escaping = false;
-    let negate = false;
-    let endPos = pos;
-    let rangeStart = '';
-    WHILE: while (i < glob.length) {
-        const c = glob.charAt(i);
-        if ((c === '!' || c === '^') && i === pos + 1) {
-            negate = true;
-            i++;
-            continue;
-        }
-        if (c === ']' && sawStart && !escaping) {
-            endPos = i + 1;
-            break;
-        }
-        sawStart = true;
-        if (c === '\\') {
-            if (!escaping) {
-                escaping = true;
-                i++;
-                continue;
-            }
-            // escaped \ char, fall through and treat like normal char
-        }
-        if (c === '[' && !escaping) {
-            // either a posix class, a collation equivalent, or just a [
-            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
-                if (glob.startsWith(cls, i)) {
-                    // invalid, [a-[] is fine, but not [a-[:alpha]]
-                    if (rangeStart) {
-                        return ['$.', false, glob.length - pos, true];
-                    }
-                    i += cls.length;
-                    if (neg)
-                        negs.push(unip);
-                    else
-                        ranges.push(unip);
-                    uflag = uflag || u;
-                    continue WHILE;
-                }
-            }
-        }
-        // now it's just a normal character, effectively
-        escaping = false;
-        if (rangeStart) {
-            // throw this range away if it's not valid, but others
-            // can still match.
-            if (c > rangeStart) {
-                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
-            }
-            else if (c === rangeStart) {
-                ranges.push(braceEscape(c));
-            }
-            rangeStart = '';
-            i++;
-            continue;
-        }
-        // now might be the start of a range.
-        // can be either c-d or c-] or c<more...>] or c] at this point
-        if (glob.startsWith('-]', i + 1)) {
-            ranges.push(braceEscape(c + '-'));
-            i += 2;
-            continue;
-        }
-        if (glob.startsWith('-', i + 1)) {
-            rangeStart = c;
-            i += 2;
-            continue;
-        }
-        // not the start of a range, just a single character
-        ranges.push(braceEscape(c));
-        i++;
-    }
-    if (endPos < i) {
-        // didn't see the end of the class, not a valid class,
-        // but might still be valid as a literal match.
-        return ['', false, 0, false];
-    }
-    // if we got no ranges and no negates, then we have a range that
-    // cannot possibly match anything, and that poisons the whole glob
-    if (!ranges.length && !negs.length) {
-        return ['$.', false, glob.length - pos, true];
-    }
-    // if we got one positive range, and it's a single character, then that's
-    // not actually a magic pattern, it's just that one literal character.
-    // we should not treat that as "magic", we should just return the literal
-    // character. [_] is a perfectly valid way to escape glob magic chars.
-    if (negs.length === 0 &&
-        ranges.length === 1 &&
-        /^\\?.$/.test(ranges[0]) &&
-        !negate) {
-        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
-        return [regexpEscape(r), false, endPos - pos, false];
-    }
-    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
-    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
-    const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'
-        : ranges.length ? sranges
-            : snegs;
-    return [comb, uflag, endPos - pos, true];
-};
-//# sourceMappingURL=brace-expressions.js.map
Index: de_modules/minimatch/dist/esm/brace-expressions.js.map
===================================================================
--- node_modules/minimatch/dist/esm/brace-expressions.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n  {\n    '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n    '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n    '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n    '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n    '[:cntrl:]': ['\\\\p{Cc}', true],\n    '[:digit:]': ['\\\\p{Nd}', true],\n    '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n    '[:lower:]': ['\\\\p{Ll}', true],\n    '[:print:]': ['\\\\p{C}', true],\n    '[:punct:]': ['\\\\p{P}', true],\n    '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n    '[:upper:]': ['\\\\p{Lu}', true],\n    '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n    '[:xdigit:]': ['A-Fa-f0-9', false],\n  }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number,\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c<more...>] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n    : ranges.length ? sranges\n    : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n"]}
Index: de_modules/minimatch/dist/esm/escape.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/escape.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-import type { MinimatchOptions } from './index.js';
-/**
- * Escape all magic characters in a glob pattern.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape}
- * option is used, then characters are escaped by wrapping in `[]`, because
- * a magic character wrapped in a character class can only be satisfied by
- * that exact character.  In this mode, `\` is _not_ escaped, because it is
- * not interpreted as a magic character, but instead as a path separator.
- *
- * If the {@link MinimatchOptions.magicalBraces} option is used,
- * then braces (`{` and `}`) will be escaped.
- */
-export declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-//# sourceMappingURL=escape.d.ts.map
Index: de_modules/minimatch/dist/esm/escape.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/escape.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"}
Index: de_modules/minimatch/dist/esm/escape.js
===================================================================
--- node_modules/minimatch/dist/esm/escape.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,26 +1,0 @@
-/**
- * Escape all magic characters in a glob pattern.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape}
- * option is used, then characters are escaped by wrapping in `[]`, because
- * a magic character wrapped in a character class can only be satisfied by
- * that exact character.  In this mode, `\` is _not_ escaped, because it is
- * not interpreted as a magic character, but instead as a path separator.
- *
- * If the {@link MinimatchOptions.magicalBraces} option is used,
- * then braces (`{` and `}`) will be escaped.
- */
-export const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => {
-    // don't need to escape +@! because we escape the parens
-    // that make those magic, and escaping ! as [!] isn't valid,
-    // because [!]] is a valid glob class meaning not ']'.
-    if (magicalBraces) {
-        return windowsPathsNoEscape ?
-            s.replace(/[?*()[\]{}]/g, '[$&]')
-            : s.replace(/[?*()[\]\\{}]/g, '\\$&');
-    }
-    return windowsPathsNoEscape ?
-        s.replace(/[?*()[\]]/g, '[$&]')
-        : s.replace(/[?*()[\]\\]/g, '\\$&');
-};
-//# sourceMappingURL=escape.js.map
Index: de_modules/minimatch/dist/esm/escape.js.map
===================================================================
--- node_modules/minimatch/dist/esm/escape.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = false,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/[?*()[\\]{}]/g, '[$&]')\n      : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]}
Index: de_modules/minimatch/dist/esm/index.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,174 +1,0 @@
-import { AST } from './ast.js';
-export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd';
-export interface MinimatchOptions {
-    /** do not expand `{x,y}` style braces */
-    nobrace?: boolean;
-    /** do not treat patterns starting with `#` as a comment */
-    nocomment?: boolean;
-    /** do not treat patterns starting with `!` as a negation */
-    nonegate?: boolean;
-    /** print LOTS of debugging output */
-    debug?: boolean;
-    /** treat `**` the same as `*` */
-    noglobstar?: boolean;
-    /** do not expand extglobs like `+(a|b)` */
-    noext?: boolean;
-    /** return the pattern if nothing matches */
-    nonull?: boolean;
-    /** treat `\\` as a path separator, not an escape character */
-    windowsPathsNoEscape?: boolean;
-    /**
-     * inverse of {@link MinimatchOptions.windowsPathsNoEscape}
-     * @deprecated
-     */
-    allowWindowsEscape?: boolean;
-    /**
-     * Compare a partial path to a pattern. As long as the parts
-     * of the path that are present are not contradicted by the
-     * pattern, it will be treated as a match. This is useful in
-     * applications where you're walking through a folder structure,
-     * and don't yet have the full path, but want to ensure that you
-     * do not walk down paths that can never be a match.
-     */
-    partial?: boolean;
-    /** allow matches that start with `.` even if the pattern does not */
-    dot?: boolean;
-    /** ignore case */
-    nocase?: boolean;
-    /** ignore case only in wildcard patterns */
-    nocaseMagicOnly?: boolean;
-    /** consider braces to be "magic" for the purpose of `hasMagic` */
-    magicalBraces?: boolean;
-    /**
-     * If set, then patterns without slashes will be matched
-     * against the basename of the path if it contains slashes.
-     * For example, `a?b` would match the path `/xyz/123/acb`, but
-     * not `/xyz/acb/123`.
-     */
-    matchBase?: boolean;
-    /** invert the results of negated matches */
-    flipNegate?: boolean;
-    /** do not collapse multiple `/` into a single `/` */
-    preserveMultipleSlashes?: boolean;
-    /**
-     * A number indicating the level of optimization that should be done
-     * to the pattern prior to parsing and using it for matches.
-     */
-    optimizationLevel?: number;
-    /** operating system platform */
-    platform?: Platform;
-    /**
-     * When a pattern starts with a UNC path or drive letter, and in
-     * `nocase:true` mode, do not convert the root portions of the
-     * pattern into a case-insensitive regular expression, and instead
-     * leave them as strings.
-     *
-     * This is the default when the platform is `win32` and
-     * `nocase:true` is set.
-     */
-    windowsNoMagicRoot?: boolean;
-    /**
-     * max number of `{...}` patterns to expand. Default 100_000.
-     */
-    braceExpandMax?: number;
-    /**
-     * Max number of non-adjacent `**` patterns to recursively walk down.
-     *
-     * The default of 200 is almost certainly high enough for most purposes,
-     * and can handle absurdly excessive patterns.
-     */
-    maxGlobstarRecursion?: number;
-    /**
-     * Max depth to traverse for nested extglobs like `*(a|b|c)`
-     *
-     * Default is 2, which is quite low, but any higher value
-     * swiftly results in punishing performance impacts. Note
-     * that this is *not*  relevant when the globstar types can
-     * be safely coalesced into a single set.
-     *
-     * For example, `*(a|@(b|c)|d)` would be flattened into
-     * `*(a|b|c|d)`. Thus, many common extglobs will retain good
-     * performance and  never hit this limit, even if they are
-     * excessively deep and complicated.
-     *
-     * If the limit is hit, then the extglob characters are simply
-     * not parsed, and the pattern effectively switches into
-     * `noextglob: true` mode for the contents of that nested
-     * sub-pattern. This will typically _not_ result in a match,
-     * but is considered a valid trade-off for security and
-     * performance.
-     */
-    maxExtglobRecursion?: number;
-}
-export declare const minimatch: {
-    (p: string, pattern: string, options?: MinimatchOptions): boolean;
-    sep: Sep;
-    GLOBSTAR: typeof GLOBSTAR;
-    filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
-    defaults: (def: MinimatchOptions) => typeof minimatch;
-    braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
-    makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
-    match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
-    AST: typeof AST;
-    Minimatch: typeof Minimatch;
-    escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-    unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-};
-export type Sep = '\\' | '/';
-export declare const sep: Sep;
-export declare const GLOBSTAR: unique symbol;
-export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
-export declare const defaults: (def: MinimatchOptions) => typeof minimatch;
-export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
-export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
-export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
-export type MMRegExp = RegExp & {
-    _src?: string;
-    _glob?: string;
-};
-export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR;
-export type ParseReturn = ParseReturnFiltered | false;
-export declare class Minimatch {
-    #private;
-    options: MinimatchOptions;
-    set: ParseReturnFiltered[][];
-    pattern: string;
-    windowsPathsNoEscape: boolean;
-    nonegate: boolean;
-    negate: boolean;
-    comment: boolean;
-    empty: boolean;
-    preserveMultipleSlashes: boolean;
-    partial: boolean;
-    globSet: string[];
-    globParts: string[][];
-    nocase: boolean;
-    isWindows: boolean;
-    platform: Platform;
-    windowsNoMagicRoot: boolean;
-    maxGlobstarRecursion: number;
-    regexp: false | null | MMRegExp;
-    constructor(pattern: string, options?: MinimatchOptions);
-    hasMagic(): boolean;
-    debug(..._: unknown[]): void;
-    make(): void;
-    preprocess(globParts: string[][]): string[][];
-    adjascentGlobstarOptimize(globParts: string[][]): string[][];
-    levelOneOptimize(globParts: string[][]): string[][];
-    levelTwoFileOptimize(parts: string | string[]): string[];
-    firstPhasePreProcess(globParts: string[][]): string[][];
-    secondPhasePreProcess(globParts: string[][]): string[][];
-    partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[];
-    parseNegate(): void;
-    matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean;
-    braceExpand(): string[];
-    parse(pattern: string): ParseReturn;
-    makeRe(): false | MMRegExp;
-    slashSplit(p: string): string[];
-    match(f: string, partial?: boolean): boolean;
-    static defaults(def: MinimatchOptions): typeof Minimatch;
-}
-export { AST } from './ast.js';
-export { escape } from './escape.js';
-export { unescape } from './unescape.js';
-//# sourceMappingURL=index.d.ts.map
Index: de_modules/minimatch/dist/esm/index.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/index.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
Index: de_modules/minimatch/dist/esm/index.js
===================================================================
--- node_modules/minimatch/dist/esm/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1114 +1,0 @@
-import { expand } from 'brace-expansion';
-import { assertValidPattern } from './assert-valid-pattern.js';
-import { AST } from './ast.js';
-import { escape } from './escape.js';
-import { unescape } from './unescape.js';
-export const minimatch = (p, pattern, options = {}) => {
-    assertValidPattern(pattern);
-    // shortcut: comments match nothing.
-    if (!options.nocomment && pattern.charAt(0) === '#') {
-        return false;
-    }
-    return new Minimatch(pattern, options).match(p);
-};
-// Optimized checking for the most common glob patterns.
-const starDotExtRE = /^\*+([^+@!?*[(]*)$/;
-const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
-const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
-const starDotExtTestNocase = (ext) => {
-    ext = ext.toLowerCase();
-    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
-};
-const starDotExtTestNocaseDot = (ext) => {
-    ext = ext.toLowerCase();
-    return (f) => f.toLowerCase().endsWith(ext);
-};
-const starDotStarRE = /^\*+\.\*+$/;
-const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
-const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
-const dotStarRE = /^\.\*+$/;
-const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
-const starRE = /^\*+$/;
-const starTest = (f) => f.length !== 0 && !f.startsWith('.');
-const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
-const qmarksRE = /^\?+([^+@!?*[(]*)?$/;
-const qmarksTestNocase = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExt([$0]);
-    if (!ext)
-        return noext;
-    ext = ext.toLowerCase();
-    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-};
-const qmarksTestNocaseDot = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExtDot([$0]);
-    if (!ext)
-        return noext;
-    ext = ext.toLowerCase();
-    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-};
-const qmarksTestDot = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExtDot([$0]);
-    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-};
-const qmarksTest = ([$0, ext = '']) => {
-    const noext = qmarksTestNoExt([$0]);
-    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-};
-const qmarksTestNoExt = ([$0]) => {
-    const len = $0.length;
-    return (f) => f.length === len && !f.startsWith('.');
-};
-const qmarksTestNoExtDot = ([$0]) => {
-    const len = $0.length;
-    return (f) => f.length === len && f !== '.' && f !== '..';
-};
-/* c8 ignore start */
-const defaultPlatform = (typeof process === 'object' && process ?
-    (typeof process.env === 'object' &&
-        process.env &&
-        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
-        process.platform
-    : 'posix');
-const path = {
-    win32: { sep: '\\' },
-    posix: { sep: '/' },
-};
-/* c8 ignore stop */
-export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
-minimatch.sep = sep;
-export const GLOBSTAR = Symbol('globstar **');
-minimatch.GLOBSTAR = GLOBSTAR;
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-const qmark = '[^/]';
-// * => any number of characters
-const star = qmark + '*?';
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
-export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
-minimatch.filter = filter;
-const ext = (a, b = {}) => Object.assign({}, a, b);
-export const defaults = (def) => {
-    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
-        return minimatch;
-    }
-    const orig = minimatch;
-    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
-    return Object.assign(m, {
-        Minimatch: class Minimatch extends orig.Minimatch {
-            constructor(pattern, options = {}) {
-                super(pattern, ext(def, options));
-            }
-            static defaults(options) {
-                return orig.defaults(ext(def, options)).Minimatch;
-            }
-        },
-        AST: class AST extends orig.AST {
-            /* c8 ignore start */
-            constructor(type, parent, options = {}) {
-                super(type, parent, ext(def, options));
-            }
-            /* c8 ignore stop */
-            static fromGlob(pattern, options = {}) {
-                return orig.AST.fromGlob(pattern, ext(def, options));
-            }
-        },
-        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
-        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
-        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
-        defaults: (options) => orig.defaults(ext(def, options)),
-        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
-        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
-        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
-        sep: orig.sep,
-        GLOBSTAR: GLOBSTAR,
-    });
-};
-minimatch.defaults = defaults;
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-export const braceExpand = (pattern, options = {}) => {
-    assertValidPattern(pattern);
-    // Thanks to Yeting Li <https://github.com/yetingli> for
-    // improving this regexp to avoid a ReDOS vulnerability.
-    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
-        // shortcut. no need to expand.
-        return [pattern];
-    }
-    return expand(pattern, { max: options.braceExpandMax });
-};
-minimatch.braceExpand = braceExpand;
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
-minimatch.makeRe = makeRe;
-export const match = (list, pattern, options = {}) => {
-    const mm = new Minimatch(pattern, options);
-    list = list.filter(f => mm.match(f));
-    if (mm.options.nonull && !list.length) {
-        list.push(pattern);
-    }
-    return list;
-};
-minimatch.match = match;
-// replace stuff like \* with *
-const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
-const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-export class Minimatch {
-    options;
-    set;
-    pattern;
-    windowsPathsNoEscape;
-    nonegate;
-    negate;
-    comment;
-    empty;
-    preserveMultipleSlashes;
-    partial;
-    globSet;
-    globParts;
-    nocase;
-    isWindows;
-    platform;
-    windowsNoMagicRoot;
-    maxGlobstarRecursion;
-    regexp;
-    constructor(pattern, options = {}) {
-        assertValidPattern(pattern);
-        options = options || {};
-        this.options = options;
-        this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200;
-        this.pattern = pattern;
-        this.platform = options.platform || defaultPlatform;
-        this.isWindows = this.platform === 'win32';
-        // avoid the annoying deprecation flag lol
-        const awe = ('allowWindow' + 'sEscape');
-        this.windowsPathsNoEscape =
-            !!options.windowsPathsNoEscape || options[awe] === false;
-        if (this.windowsPathsNoEscape) {
-            this.pattern = this.pattern.replace(/\\/g, '/');
-        }
-        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
-        this.regexp = null;
-        this.negate = false;
-        this.nonegate = !!options.nonegate;
-        this.comment = false;
-        this.empty = false;
-        this.partial = !!options.partial;
-        this.nocase = !!this.options.nocase;
-        this.windowsNoMagicRoot =
-            options.windowsNoMagicRoot !== undefined ?
-                options.windowsNoMagicRoot
-                : !!(this.isWindows && this.nocase);
-        this.globSet = [];
-        this.globParts = [];
-        this.set = [];
-        // make the set of regexps etc.
-        this.make();
-    }
-    hasMagic() {
-        if (this.options.magicalBraces && this.set.length > 1) {
-            return true;
-        }
-        for (const pattern of this.set) {
-            for (const part of pattern) {
-                if (typeof part !== 'string')
-                    return true;
-            }
-        }
-        return false;
-    }
-    debug(..._) { }
-    make() {
-        const pattern = this.pattern;
-        const options = this.options;
-        // empty patterns and comments match nothing.
-        if (!options.nocomment && pattern.charAt(0) === '#') {
-            this.comment = true;
-            return;
-        }
-        if (!pattern) {
-            this.empty = true;
-            return;
-        }
-        // step 1: figure out negation, etc.
-        this.parseNegate();
-        // step 2: expand braces
-        this.globSet = [...new Set(this.braceExpand())];
-        if (options.debug) {
-            //oxlint-disable-next-line no-console
-            this.debug = (...args) => console.error(...args);
-        }
-        this.debug(this.pattern, this.globSet);
-        // step 3: now we have a set, so turn each one into a series of
-        // path-portion matching patterns.
-        // These will be regexps, except in the case of "**", which is
-        // set to the GLOBSTAR object for globstar behavior,
-        // and will not contain any / characters
-        //
-        // First, we preprocess to make the glob pattern sets a bit simpler
-        // and deduped.  There are some perf-killing patterns that can cause
-        // problems with a glob walk, but we can simplify them down a bit.
-        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
-        this.globParts = this.preprocess(rawGlobParts);
-        this.debug(this.pattern, this.globParts);
-        // glob --> regexps
-        let set = this.globParts.map((s, _, __) => {
-            if (this.isWindows && this.windowsNoMagicRoot) {
-                // check if it's a drive or unc path.
-                const isUNC = s[0] === '' &&
-                    s[1] === '' &&
-                    (s[2] === '?' || !globMagic.test(s[2])) &&
-                    !globMagic.test(s[3]);
-                const isDrive = /^[a-z]:/i.test(s[0]);
-                if (isUNC) {
-                    return [
-                        ...s.slice(0, 4),
-                        ...s.slice(4).map(ss => this.parse(ss)),
-                    ];
-                }
-                else if (isDrive) {
-                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
-                }
-            }
-            return s.map(ss => this.parse(ss));
-        });
-        this.debug(this.pattern, set);
-        // filter out everything that didn't compile properly.
-        this.set = set.filter(s => s.indexOf(false) === -1);
-        // do not treat the ? in UNC paths as magic
-        if (this.isWindows) {
-            for (let i = 0; i < this.set.length; i++) {
-                const p = this.set[i];
-                if (p[0] === '' &&
-                    p[1] === '' &&
-                    this.globParts[i][2] === '?' &&
-                    typeof p[3] === 'string' &&
-                    /^[a-z]:$/i.test(p[3])) {
-                    p[2] = '?';
-                }
-            }
-        }
-        this.debug(this.pattern, this.set);
-    }
-    // various transforms to equivalent pattern sets that are
-    // faster to process in a filesystem walk.  The goal is to
-    // eliminate what we can, and push all ** patterns as far
-    // to the right as possible, even if it increases the number
-    // of patterns that we have to process.
-    preprocess(globParts) {
-        // if we're not in globstar mode, then turn ** into *
-        if (this.options.noglobstar) {
-            for (const partset of globParts) {
-                for (let j = 0; j < partset.length; j++) {
-                    if (partset[j] === '**') {
-                        partset[j] = '*';
-                    }
-                }
-            }
-        }
-        const { optimizationLevel = 1 } = this.options;
-        if (optimizationLevel >= 2) {
-            // aggressive optimization for the purpose of fs walking
-            globParts = this.firstPhasePreProcess(globParts);
-            globParts = this.secondPhasePreProcess(globParts);
-        }
-        else if (optimizationLevel >= 1) {
-            // just basic optimizations to remove some .. parts
-            globParts = this.levelOneOptimize(globParts);
-        }
-        else {
-            // just collapse multiple ** portions into one
-            globParts = this.adjascentGlobstarOptimize(globParts);
-        }
-        return globParts;
-    }
-    // just get rid of adjascent ** portions
-    adjascentGlobstarOptimize(globParts) {
-        return globParts.map(parts => {
-            let gs = -1;
-            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
-                let i = gs;
-                while (parts[i + 1] === '**') {
-                    i++;
-                }
-                if (i !== gs) {
-                    parts.splice(gs, i - gs);
-                }
-            }
-            return parts;
-        });
-    }
-    // get rid of adjascent ** and resolve .. portions
-    levelOneOptimize(globParts) {
-        return globParts.map(parts => {
-            parts = parts.reduce((set, part) => {
-                const prev = set[set.length - 1];
-                if (part === '**' && prev === '**') {
-                    return set;
-                }
-                if (part === '..') {
-                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
-                        set.pop();
-                        return set;
-                    }
-                }
-                set.push(part);
-                return set;
-            }, []);
-            return parts.length === 0 ? [''] : parts;
-        });
-    }
-    levelTwoFileOptimize(parts) {
-        if (!Array.isArray(parts)) {
-            parts = this.slashSplit(parts);
-        }
-        let didSomething = false;
-        do {
-            didSomething = false;
-            // <pre>/<e>/<rest> -> <pre>/<rest>
-            if (!this.preserveMultipleSlashes) {
-                for (let i = 1; i < parts.length - 1; i++) {
-                    const p = parts[i];
-                    // don't squeeze out UNC patterns
-                    if (i === 1 && p === '' && parts[0] === '')
-                        continue;
-                    if (p === '.' || p === '') {
-                        didSomething = true;
-                        parts.splice(i, 1);
-                        i--;
-                    }
-                }
-                if (parts[0] === '.' &&
-                    parts.length === 2 &&
-                    (parts[1] === '.' || parts[1] === '')) {
-                    didSomething = true;
-                    parts.pop();
-                }
-            }
-            // <pre>/<p>/../<rest> -> <pre>/<rest>
-            let dd = 0;
-            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-                const p = parts[dd - 1];
-                if (p &&
-                    p !== '.' &&
-                    p !== '..' &&
-                    p !== '**' &&
-                    !(this.isWindows && /^[a-z]:$/i.test(p))) {
-                    didSomething = true;
-                    parts.splice(dd - 1, 2);
-                    dd -= 2;
-                }
-            }
-        } while (didSomething);
-        return parts.length === 0 ? [''] : parts;
-    }
-    // First phase: single-pattern processing
-    // <pre> is 1 or more portions
-    // <rest> is 1 or more portions
-    // <p> is any portion other than ., .., '', or **
-    // <e> is . or ''
-    //
-    // **/.. is *brutal* for filesystem walking performance, because
-    // it effectively resets the recursive walk each time it occurs,
-    // and ** cannot be reduced out by a .. pattern part like a regexp
-    // or most strings (other than .., ., and '') can be.
-    //
-    // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}
-    // <pre>/<e>/<rest> -> <pre>/<rest>
-    // <pre>/<p>/../<rest> -> <pre>/<rest>
-    // **/**/<rest> -> **/<rest>
-    //
-    // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow
-    // this WOULD be allowed if ** did follow symlinks, or * didn't
-    firstPhasePreProcess(globParts) {
-        let didSomething = false;
-        do {
-            didSomething = false;
-            // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}
-            for (let parts of globParts) {
-                let gs = -1;
-                while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
-                    let gss = gs;
-                    while (parts[gss + 1] === '**') {
-                        // <pre>/**/**/<rest> -> <pre>/**/<rest>
-                        gss++;
-                    }
-                    // eg, if gs is 2 and gss is 4, that means we have 3 **
-                    // parts, and can remove 2 of them.
-                    if (gss > gs) {
-                        parts.splice(gs + 1, gss - gs);
-                    }
-                    let next = parts[gs + 1];
-                    const p = parts[gs + 2];
-                    const p2 = parts[gs + 3];
-                    if (next !== '..')
-                        continue;
-                    if (!p ||
-                        p === '.' ||
-                        p === '..' ||
-                        !p2 ||
-                        p2 === '.' ||
-                        p2 === '..') {
-                        continue;
-                    }
-                    didSomething = true;
-                    // edit parts in place, and push the new one
-                    parts.splice(gs, 1);
-                    const other = parts.slice(0);
-                    other[gs] = '**';
-                    globParts.push(other);
-                    gs--;
-                }
-                // <pre>/<e>/<rest> -> <pre>/<rest>
-                if (!this.preserveMultipleSlashes) {
-                    for (let i = 1; i < parts.length - 1; i++) {
-                        const p = parts[i];
-                        // don't squeeze out UNC patterns
-                        if (i === 1 && p === '' && parts[0] === '')
-                            continue;
-                        if (p === '.' || p === '') {
-                            didSomething = true;
-                            parts.splice(i, 1);
-                            i--;
-                        }
-                    }
-                    if (parts[0] === '.' &&
-                        parts.length === 2 &&
-                        (parts[1] === '.' || parts[1] === '')) {
-                        didSomething = true;
-                        parts.pop();
-                    }
-                }
-                // <pre>/<p>/../<rest> -> <pre>/<rest>
-                let dd = 0;
-                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-                    const p = parts[dd - 1];
-                    if (p && p !== '.' && p !== '..' && p !== '**') {
-                        didSomething = true;
-                        const needDot = dd === 1 && parts[dd + 1] === '**';
-                        const splin = needDot ? ['.'] : [];
-                        parts.splice(dd - 1, 2, ...splin);
-                        if (parts.length === 0)
-                            parts.push('');
-                        dd -= 2;
-                    }
-                }
-            }
-        } while (didSomething);
-        return globParts;
-    }
-    // second phase: multi-pattern dedupes
-    // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>
-    // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>
-    // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>
-    //
-    // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>
-    // ^-- not valid because ** doens't follow symlinks
-    secondPhasePreProcess(globParts) {
-        for (let i = 0; i < globParts.length - 1; i++) {
-            for (let j = i + 1; j < globParts.length; j++) {
-                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
-                if (matched) {
-                    globParts[i] = [];
-                    globParts[j] = matched;
-                    break;
-                }
-            }
-        }
-        return globParts.filter(gs => gs.length);
-    }
-    partsMatch(a, b, emptyGSMatch = false) {
-        let ai = 0;
-        let bi = 0;
-        let result = [];
-        let which = '';
-        while (ai < a.length && bi < b.length) {
-            if (a[ai] === b[bi]) {
-                result.push(which === 'b' ? b[bi] : a[ai]);
-                ai++;
-                bi++;
-            }
-            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
-                result.push(a[ai]);
-                ai++;
-            }
-            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
-                result.push(b[bi]);
-                bi++;
-            }
-            else if (a[ai] === '*' &&
-                b[bi] &&
-                (this.options.dot || !b[bi].startsWith('.')) &&
-                b[bi] !== '**') {
-                if (which === 'b')
-                    return false;
-                which = 'a';
-                result.push(a[ai]);
-                ai++;
-                bi++;
-            }
-            else if (b[bi] === '*' &&
-                a[ai] &&
-                (this.options.dot || !a[ai].startsWith('.')) &&
-                a[ai] !== '**') {
-                if (which === 'a')
-                    return false;
-                which = 'b';
-                result.push(b[bi]);
-                ai++;
-                bi++;
-            }
-            else {
-                return false;
-            }
-        }
-        // if we fall out of the loop, it means they two are identical
-        // as long as their lengths match
-        return a.length === b.length && result;
-    }
-    parseNegate() {
-        if (this.nonegate)
-            return;
-        const pattern = this.pattern;
-        let negate = false;
-        let negateOffset = 0;
-        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
-            negate = !negate;
-            negateOffset++;
-        }
-        if (negateOffset)
-            this.pattern = pattern.slice(negateOffset);
-        this.negate = negate;
-    }
-    // set partial to true to test if, for example,
-    // "/a/b" matches the start of "/*/b/*/d"
-    // Partial means, if you run out of file before you run
-    // out of pattern, then that's fine, as long as all
-    // the parts match.
-    matchOne(file, pattern, partial = false) {
-        let fileStartIndex = 0;
-        let patternStartIndex = 0;
-        // UNC paths like //?/X:/... can match X:/... and vice versa
-        // Drive letters in absolute drive or unc paths are always compared
-        // case-insensitively.
-        if (this.isWindows) {
-            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
-            const fileUNC = !fileDrive &&
-                file[0] === '' &&
-                file[1] === '' &&
-                file[2] === '?' &&
-                /^[a-z]:$/i.test(file[3]);
-            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
-            const patternUNC = !patternDrive &&
-                pattern[0] === '' &&
-                pattern[1] === '' &&
-                pattern[2] === '?' &&
-                typeof pattern[3] === 'string' &&
-                /^[a-z]:$/i.test(pattern[3]);
-            const fdi = fileUNC ? 3
-                : fileDrive ? 0
-                    : undefined;
-            const pdi = patternUNC ? 3
-                : patternDrive ? 0
-                    : undefined;
-            if (typeof fdi === 'number' && typeof pdi === 'number') {
-                const [fd, pd] = [
-                    file[fdi],
-                    pattern[pdi],
-                ];
-                // start matching at the drive letter index of each
-                if (fd.toLowerCase() === pd.toLowerCase()) {
-                    pattern[pdi] = fd;
-                    patternStartIndex = pdi;
-                    fileStartIndex = fdi;
-                }
-            }
-        }
-        // resolve and reduce . and .. portions in the file as well.
-        // don't need to do the second phase, because it's only one string[]
-        const { optimizationLevel = 1 } = this.options;
-        if (optimizationLevel >= 2) {
-            file = this.levelTwoFileOptimize(file);
-        }
-        if (pattern.includes(GLOBSTAR)) {
-            return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex);
-        }
-        return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex);
-    }
-    #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) {
-        // split the pattern into head, tail, and middle of ** delimited parts
-        const firstgs = pattern.indexOf(GLOBSTAR, patternIndex);
-        const lastgs = pattern.lastIndexOf(GLOBSTAR);
-        // split the pattern up into globstar-delimited sections
-        // the tail has to be at the end, and the others just have
-        // to be found in order from the head.
-        const [head, body, tail] = partial ?
-            [
-                pattern.slice(patternIndex, firstgs),
-                pattern.slice(firstgs + 1),
-                [],
-            ]
-            : [
-                pattern.slice(patternIndex, firstgs),
-                pattern.slice(firstgs + 1, lastgs),
-                pattern.slice(lastgs + 1),
-            ];
-        // check the head, from the current file/pattern index.
-        if (head.length) {
-            const fileHead = file.slice(fileIndex, fileIndex + head.length);
-            if (!this.#matchOne(fileHead, head, partial, 0, 0)) {
-                return false;
-            }
-            fileIndex += head.length;
-            patternIndex += head.length;
-        }
-        // now we know the head matches!
-        // if the last portion is not empty, it MUST match the end
-        // check the tail
-        let fileTailMatch = 0;
-        if (tail.length) {
-            // if head + tail > file, then we cannot possibly match
-            if (tail.length + fileIndex > file.length)
-                return false;
-            // try to match the tail
-            let tailStart = file.length - tail.length;
-            if (this.#matchOne(file, tail, partial, tailStart, 0)) {
-                fileTailMatch = tail.length;
-            }
-            else {
-                // affordance for stuff like a/**/* matching a/b/
-                // if the last file portion is '', and there's more to the pattern
-                // then try without the '' bit.
-                if (file[file.length - 1] !== '' ||
-                    fileIndex + tail.length === file.length) {
-                    return false;
-                }
-                tailStart--;
-                if (!this.#matchOne(file, tail, partial, tailStart, 0)) {
-                    return false;
-                }
-                fileTailMatch = tail.length + 1;
-            }
-        }
-        // now we know the tail matches!
-        // the middle is zero or more portions wrapped in **, possibly
-        // containing more ** sections.
-        // so a/**/b/**/c/**/d has become **/b/**/c/**
-        // if it's empty, it means a/**/b, just verify we have no bad dots
-        // if there's no tail, so it ends on /**, then we must have *something*
-        // after the head, or it's not a matc
-        if (!body.length) {
-            let sawSome = !!fileTailMatch;
-            for (let i = fileIndex; i < file.length - fileTailMatch; i++) {
-                const f = String(file[i]);
-                sawSome = true;
-                if (f === '.' ||
-                    f === '..' ||
-                    (!this.options.dot && f.startsWith('.'))) {
-                    return false;
-                }
-            }
-            // in partial mode, we just need to get past all file parts
-            return partial || sawSome;
-        }
-        // now we know that there's one or more body sections, which can
-        // be matched anywhere from the 0 index (because the head was pruned)
-        // through to the length-fileTailMatch index.
-        // split the body up into sections, and note the minimum index it can
-        // be found at (start with the length of all previous segments)
-        // [section, before, after]
-        const bodySegments = [[[], 0]];
-        let currentBody = bodySegments[0];
-        let nonGsParts = 0;
-        const nonGsPartsSums = [0];
-        for (const b of body) {
-            if (b === GLOBSTAR) {
-                nonGsPartsSums.push(nonGsParts);
-                currentBody = [[], 0];
-                bodySegments.push(currentBody);
-            }
-            else {
-                currentBody[0].push(b);
-                nonGsParts++;
-            }
-        }
-        let i = bodySegments.length - 1;
-        const fileLength = file.length - fileTailMatch;
-        for (const b of bodySegments) {
-            b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length);
-        }
-        return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch);
-    }
-    // return false for "nope, not matching"
-    // return null for "not matching, cannot keep trying"
-    #matchGlobStarBodySections(file, 
-    // pattern section, last possible position for it
-    bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) {
-        // take the first body segment, and walk from fileIndex to its "after"
-        // value at the end
-        // If it doesn't match at that position, we increment, until we hit
-        // that final possible position, and give up.
-        // If it does match, then advance and try to rest.
-        // If any of them fail we keep walking forward.
-        // this is still a bit recursively painful, but it's more constrained
-        // than previous implementations, because we never test something that
-        // can't possibly be a valid matching condition.
-        const bs = bodySegments[bodyIndex];
-        if (!bs) {
-            // just make sure that there's no bad dots
-            for (let i = fileIndex; i < file.length; i++) {
-                sawTail = true;
-                const f = file[i];
-                if (f === '.' ||
-                    f === '..' ||
-                    (!this.options.dot && f.startsWith('.'))) {
-                    return false;
-                }
-            }
-            return sawTail;
-        }
-        // have a non-globstar body section to test
-        const [body, after] = bs;
-        while (fileIndex <= after) {
-            const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0);
-            // if limit exceeded, no match. intentional false negative,
-            // acceptable break in correctness for security.
-            if (m && globStarDepth < this.maxGlobstarRecursion) {
-                // match! see if the rest match. if so, we're done!
-                const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail);
-                if (sub !== false) {
-                    return sub;
-                }
-            }
-            const f = file[fileIndex];
-            if (f === '.' ||
-                f === '..' ||
-                (!this.options.dot && f.startsWith('.'))) {
-                return false;
-            }
-            fileIndex++;
-        }
-        // walked off. no point continuing
-        return partial || null;
-    }
-    #matchOne(file, pattern, partial, fileIndex, patternIndex) {
-        let fi;
-        let pi;
-        let pl;
-        let fl;
-        for (fi = fileIndex,
-            pi = patternIndex,
-            fl = file.length,
-            pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
-            this.debug('matchOne loop');
-            let p = pattern[pi];
-            let f = file[fi];
-            this.debug(pattern, p, f);
-            // should be impossible.
-            // some invalid regexp stuff in the set.
-            /* c8 ignore start */
-            if (p === false || p === GLOBSTAR) {
-                return false;
-            }
-            /* c8 ignore stop */
-            // something other than **
-            // non-magic patterns just have to match exactly
-            // patterns with magic have been turned into regexps.
-            let hit;
-            if (typeof p === 'string') {
-                hit = f === p;
-                this.debug('string match', p, f, hit);
-            }
-            else {
-                hit = p.test(f);
-                this.debug('pattern match', p, f, hit);
-            }
-            if (!hit)
-                return false;
-        }
-        // Note: ending in / means that we'll get a final ""
-        // at the end of the pattern.  This can only match a
-        // corresponding "" at the end of the file.
-        // If the file ends in /, then it can only match a
-        // a pattern that ends in /, unless the pattern just
-        // doesn't have any more for it. But, a/b/ should *not*
-        // match "a/b/*", even though "" matches against the
-        // [^/]*? pattern, except in partial mode, where it might
-        // simply not be reached yet.
-        // However, a/b/ should still satisfy a/*
-        // now either we fell off the end of the pattern, or we're done.
-        if (fi === fl && pi === pl) {
-            // ran out of pattern and filename at the same time.
-            // an exact hit!
-            return true;
-        }
-        else if (fi === fl) {
-            // ran out of file, but still had pattern left.
-            // this is ok if we're doing the match as part of
-            // a glob fs traversal.
-            return partial;
-        }
-        else if (pi === pl) {
-            // ran out of pattern, still have file left.
-            // this is only acceptable if we're on the very last
-            // empty segment of a file with a trailing slash.
-            // a/* should match a/b/
-            return fi === fl - 1 && file[fi] === '';
-            /* c8 ignore start */
-        }
-        else {
-            // should be unreachable.
-            throw new Error('wtf?');
-        }
-        /* c8 ignore stop */
-    }
-    braceExpand() {
-        return braceExpand(this.pattern, this.options);
-    }
-    parse(pattern) {
-        assertValidPattern(pattern);
-        const options = this.options;
-        // shortcuts
-        if (pattern === '**')
-            return GLOBSTAR;
-        if (pattern === '')
-            return '';
-        // far and away, the most common glob pattern parts are
-        // *, *.*, and *.<ext>  Add a fast check method for those.
-        let m;
-        let fastTest = null;
-        if ((m = pattern.match(starRE))) {
-            fastTest = options.dot ? starTestDot : starTest;
-        }
-        else if ((m = pattern.match(starDotExtRE))) {
-            fastTest = (options.nocase ?
-                options.dot ?
-                    starDotExtTestNocaseDot
-                    : starDotExtTestNocase
-                : options.dot ? starDotExtTestDot
-                    : starDotExtTest)(m[1]);
-        }
-        else if ((m = pattern.match(qmarksRE))) {
-            fastTest = (options.nocase ?
-                options.dot ?
-                    qmarksTestNocaseDot
-                    : qmarksTestNocase
-                : options.dot ? qmarksTestDot
-                    : qmarksTest)(m);
-        }
-        else if ((m = pattern.match(starDotStarRE))) {
-            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
-        }
-        else if ((m = pattern.match(dotStarRE))) {
-            fastTest = dotStarTest;
-        }
-        const re = AST.fromGlob(pattern, this.options).toMMPattern();
-        if (fastTest && typeof re === 'object') {
-            // Avoids overriding in frozen environments
-            Reflect.defineProperty(re, 'test', { value: fastTest });
-        }
-        return re;
-    }
-    makeRe() {
-        if (this.regexp || this.regexp === false)
-            return this.regexp;
-        // at this point, this.set is a 2d array of partial
-        // pattern strings, or "**".
-        //
-        // It's better to use .match().  This function shouldn't
-        // be used, really, but it's pretty convenient sometimes,
-        // when you just want to work with a regex.
-        const set = this.set;
-        if (!set.length) {
-            this.regexp = false;
-            return this.regexp;
-        }
-        const options = this.options;
-        const twoStar = options.noglobstar ? star
-            : options.dot ? twoStarDot
-                : twoStarNoDot;
-        const flags = new Set(options.nocase ? ['i'] : []);
-        // regexpify non-globstar patterns
-        // if ** is only item, then we just do one twoStar
-        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
-        // if ** is last, append (\/twoStar|) to previous
-        // if ** is in the middle, append (\/|\/twoStar\/) to previous
-        // then filter out GLOBSTAR symbols
-        let re = set
-            .map(pattern => {
-            const pp = pattern.map(p => {
-                if (p instanceof RegExp) {
-                    for (const f of p.flags.split(''))
-                        flags.add(f);
-                }
-                return (typeof p === 'string' ? regExpEscape(p)
-                    : p === GLOBSTAR ? GLOBSTAR
-                        : p._src);
-            });
-            pp.forEach((p, i) => {
-                const next = pp[i + 1];
-                const prev = pp[i - 1];
-                if (p !== GLOBSTAR || prev === GLOBSTAR) {
-                    return;
-                }
-                if (prev === undefined) {
-                    if (next !== undefined && next !== GLOBSTAR) {
-                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
-                    }
-                    else {
-                        pp[i] = twoStar;
-                    }
-                }
-                else if (next === undefined) {
-                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?';
-                }
-                else if (next !== GLOBSTAR) {
-                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
-                    pp[i + 1] = GLOBSTAR;
-                }
-            });
-            const filtered = pp.filter(p => p !== GLOBSTAR);
-            // For partial matches, we need to make the pattern match
-            // any prefix of the full path. We do this by generating
-            // alternative patterns that match progressively longer prefixes.
-            if (this.partial && filtered.length >= 1) {
-                const prefixes = [];
-                for (let i = 1; i <= filtered.length; i++) {
-                    prefixes.push(filtered.slice(0, i).join('/'));
-                }
-                return '(?:' + prefixes.join('|') + ')';
-            }
-            return filtered.join('/');
-        })
-            .join('|');
-        // need to wrap in parens if we had more than one thing with |,
-        // otherwise only the first will be anchored to ^ and the last to $
-        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
-        // must match entire pattern
-        // ending in a * or ** will make it less strict.
-        re = '^' + open + re + close + '$';
-        // In partial mode, '/' should always match as it's a valid prefix for any pattern
-        if (this.partial) {
-            re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$';
-        }
-        // can match anything, as long as it's not this.
-        if (this.negate)
-            re = '^(?!' + re + ').+$';
-        try {
-            this.regexp = new RegExp(re, [...flags].join(''));
-            /* c8 ignore start */
-        }
-        catch {
-            // should be impossible
-            this.regexp = false;
-        }
-        /* c8 ignore stop */
-        return this.regexp;
-    }
-    slashSplit(p) {
-        // if p starts with // on windows, we preserve that
-        // so that UNC paths aren't broken.  Otherwise, any number of
-        // / characters are coalesced into one, unless
-        // preserveMultipleSlashes is set to true.
-        if (this.preserveMultipleSlashes) {
-            return p.split('/');
-        }
-        else if (this.isWindows && /^\/\/[^/]+/.test(p)) {
-            // add an extra '' for the one we lose
-            return ['', ...p.split(/\/+/)];
-        }
-        else {
-            return p.split(/\/+/);
-        }
-    }
-    match(f, partial = this.partial) {
-        this.debug('match', f, this.pattern);
-        // short-circuit in the case of busted things.
-        // comments, etc.
-        if (this.comment) {
-            return false;
-        }
-        if (this.empty) {
-            return f === '';
-        }
-        if (f === '/' && partial) {
-            return true;
-        }
-        const options = this.options;
-        // windows: need to use /, not \
-        if (this.isWindows) {
-            f = f.split('\\').join('/');
-        }
-        // treat the test path as a set of pathparts.
-        const ff = this.slashSplit(f);
-        this.debug(this.pattern, 'split', ff);
-        // just ONE of the pattern sets in this.set needs to match
-        // in order for it to be valid.  If negating, then just one
-        // match means that we have failed.
-        // Either way, return on the first hit.
-        const set = this.set;
-        this.debug(this.pattern, 'set', set);
-        // Find the basename of the path by looking for the last non-empty segment
-        let filename = ff[ff.length - 1];
-        if (!filename) {
-            for (let i = ff.length - 2; !filename && i >= 0; i--) {
-                filename = ff[i];
-            }
-        }
-        for (const pattern of set) {
-            let file = ff;
-            if (options.matchBase && pattern.length === 1) {
-                file = [filename];
-            }
-            const hit = this.matchOne(file, pattern, partial);
-            if (hit) {
-                if (options.flipNegate) {
-                    return true;
-                }
-                return !this.negate;
-            }
-        }
-        // didn't get any hits.  this is success if it's a negative
-        // pattern, failure otherwise.
-        if (options.flipNegate) {
-            return false;
-        }
-        return this.negate;
-    }
-    static defaults(def) {
-        return minimatch.defaults(def).Minimatch;
-    }
-}
-/* c8 ignore start */
-export { AST } from './ast.js';
-export { escape } from './escape.js';
-export { unescape } from './unescape.js';
-/* c8 ignore stop */
-minimatch.AST = AST;
-minimatch.Minimatch = Minimatch;
-minimatch.escape = escape;
-minimatch.unescape = unescape;
-//# sourceMappingURL=index.js.map
Index: de_modules/minimatch/dist/esm/index.js.map
===================================================================
--- node_modules/minimatch/dist/esm/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport type { ExtglobType } from './ast.js'\nimport { AST } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  /** do not expand `{x,y}` style braces */\n  nobrace?: boolean\n  /** do not treat patterns starting with `#` as a comment */\n  nocomment?: boolean\n  /** do not treat patterns starting with `!` as a negation */\n  nonegate?: boolean\n  /** print LOTS of debugging output */\n  debug?: boolean\n  /** treat `**` the same as `*` */\n  noglobstar?: boolean\n  /** do not expand extglobs like `+(a|b)` */\n  noext?: boolean\n  /** return the pattern if nothing matches */\n  nonull?: boolean\n  /** treat `\\\\` as a path separator, not an escape character */\n  windowsPathsNoEscape?: boolean\n  /**\n   * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n  /**\n   * Compare a partial path to a pattern. As long as the parts\n   * of the path that are present are not contradicted by the\n   * pattern, it will be treated as a match. This is useful in\n   * applications where you're walking through a folder structure,\n   * and don't yet have the full path, but want to ensure that you\n   * do not walk down paths that can never be a match.\n   */\n  partial?: boolean\n  /** allow matches that start with `.` even if the pattern does not */\n  dot?: boolean\n  /** ignore case */\n  nocase?: boolean\n  /** ignore case only in wildcard patterns */\n  nocaseMagicOnly?: boolean\n  /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n  magicalBraces?: boolean\n  /**\n   * If set, then patterns without slashes will be matched\n   * against the basename of the path if it contains slashes.\n   * For example, `a?b` would match the path `/xyz/123/acb`, but\n   * not `/xyz/acb/123`.\n   */\n  matchBase?: boolean\n  /** invert the results of negated matches */\n  flipNegate?: boolean\n  /** do not collapse multiple `/` into a single `/` */\n  preserveMultipleSlashes?: boolean\n  /**\n   * A number indicating the level of optimization that should be done\n   * to the pattern prior to parsing and using it for matches.\n   */\n  optimizationLevel?: number\n  /** operating system platform */\n  platform?: Platform\n  /**\n   * When a pattern starts with a UNC path or drive letter, and in\n   * `nocase:true` mode, do not convert the root portions of the\n   * pattern into a case-insensitive regular expression, and instead\n   * leave them as strings.\n   *\n   * This is the default when the platform is `win32` and\n   * `nocase:true` is set.\n   */\n  windowsNoMagicRoot?: boolean\n  /**\n   * max number of `{...}` patterns to expand. Default 100_000.\n   */\n  braceExpandMax?: number\n  /**\n   * Max number of non-adjacent `**` patterns to recursively walk down.\n   *\n   * The default of 200 is almost certainly high enough for most purposes,\n   * and can handle absurdly excessive patterns.\n   */\n  maxGlobstarRecursion?: number\n\n  /**\n   * Max depth to traverse for nested extglobs like `*(a|b|c)`\n   *\n   * Default is 2, which is quite low, but any higher value\n   * swiftly results in punishing performance impacts. Note\n   * that this is *not*  relevant when the globstar types can\n   * be safely coalesced into a single set.\n   *\n   * For example, `*(a|@(b|c)|d)` would be flattened into\n   * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n   * performance and  never hit this limit, even if they are\n   * excessively deep and complicated.\n   *\n   * If the limit is hit, then the extglob characters are simply\n   * not parsed, and the pattern effectively switches into\n   * `noextglob: true` mode for the contents of that nested\n   * sub-pattern. This will typically _not_ result in a match,\n   * but is considered a valid trade-off for security and\n   * performance.\n   */\n  maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?*[(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n  !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n  f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n  f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?*[(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process ?\n    (typeof process.env === 'object' &&\n      process.env &&\n      process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n    process.platform\n  : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n  defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {},\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) =>\n      orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (\n      list: string[],\n      pattern: string,\n      options: MinimatchOptions = {},\n    ) => orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li <https://github.com/yetingli> for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n  maxGlobstarRecursion: number\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    // avoid the annoying deprecation flag lol\n    const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options[awe] === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined ?\n        options.windowsNoMagicRoot\n      : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: unknown[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      //oxlint-disable-next-line no-console\n      this.debug = (...args: unknown[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [\n            ...s.slice(0, 4),\n            ...s.slice(4).map(ss => this.parse(ss)),\n          ]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1,\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn ** into *\n    if (this.options.noglobstar) {\n      for (const partset of globParts) {\n        for (let j = 0; j < partset.length; j++) {\n          if (partset[j] === '**') {\n            partset[j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n\n    do {\n      didSomething = false\n      // <pre>/<e>/<rest> -> <pre>/<rest>\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // <pre>/<p>/../<rest> -> <pre>/<rest>\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (\n          p &&\n          p !== '.' &&\n          p !== '..' &&\n          p !== '**' &&\n          !(this.isWindows && /^[a-z]:$/i.test(p))\n        ) {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // <pre> is 1 or more portions\n  // <rest> is 1 or more portions\n  // <p> is any portion other than ., .., '', or **\n  // <e> is . or ''\n  //\n  // **/.. is *brutal* for filesystem walking performance, because\n  // it effectively resets the recursive walk each time it occurs,\n  // and ** cannot be reduced out by a .. pattern part like a regexp\n  // or most strings (other than .., ., and '') can be.\n  //\n  // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n  // <pre>/<e>/<rest> -> <pre>/<rest>\n  // <pre>/<p>/../<rest> -> <pre>/<rest>\n  // **/**/<rest> -> **/<rest>\n  //\n  // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n      for (let parts of globParts) {\n        let gs: number = -1\n        while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n          let gss: number = gs\n          while (parts[gss + 1] === '**') {\n            // <pre>/**/**/<rest> -> <pre>/**/<rest>\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // <pre>/<e>/<rest> -> <pre>/<rest>\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // <pre>/<p>/../<rest> -> <pre>/<rest>\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n  // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n  // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n  //\n  // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes,\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false,\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean = false,\n  ) {\n    let fileStartIndex = 0\n    let patternStartIndex = 0\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive =\n        typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi =\n        fileUNC ? 3\n        : fileDrive ? 0\n        : undefined\n      const pdi =\n        patternUNC ? 3\n        : patternDrive ? 0\n        : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [\n          file[fdi],\n          pattern[pdi] as string,\n        ]\n        // start matching at the drive letter index of each\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          patternStartIndex = pdi\n          fileStartIndex = fdi\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // don't need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    if (pattern.includes(GLOBSTAR)) {\n      return this.#matchGlobstar(\n        file,\n        pattern,\n        partial,\n        fileStartIndex,\n        patternStartIndex,\n      )\n    }\n\n    return this.#matchOne(\n      file,\n      pattern,\n      partial,\n      fileStartIndex,\n      patternStartIndex,\n    )\n  }\n\n  #matchGlobstar(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    // split the pattern into head, tail, and middle of ** delimited parts\n    const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n    const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n    // split the pattern up into globstar-delimited sections\n    // the tail has to be at the end, and the others just have\n    // to be found in order from the head.\n    const [head, body, tail] =\n      partial ?\n        [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1),\n          [],\n        ]\n      : [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1, lastgs),\n          pattern.slice(lastgs + 1),\n        ]\n\n    // check the head, from the current file/pattern index.\n    if (head.length) {\n      const fileHead = file.slice(fileIndex, fileIndex + head.length)\n      if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n        return false\n      }\n      fileIndex += head.length\n      patternIndex += head.length\n    }\n    // now we know the head matches!\n\n    // if the last portion is not empty, it MUST match the end\n    // check the tail\n    let fileTailMatch: number = 0\n    if (tail.length) {\n      // if head + tail > file, then we cannot possibly match\n      if (tail.length + fileIndex > file.length) return false\n\n      // try to match the tail\n      let tailStart = file.length - tail.length\n      if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n        fileTailMatch = tail.length\n      } else {\n        // affordance for stuff like a/**/* matching a/b/\n        // if the last file portion is '', and there's more to the pattern\n        // then try without the '' bit.\n        if (\n          file[file.length - 1] !== '' ||\n          fileIndex + tail.length === file.length\n        ) {\n          return false\n        }\n        tailStart--\n        if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n          return false\n        }\n        fileTailMatch = tail.length + 1\n      }\n    }\n\n    // now we know the tail matches!\n\n    // the middle is zero or more portions wrapped in **, possibly\n    // containing more ** sections.\n    // so a/**/b/**/c/**/d has become **/b/**/c/**\n    // if it's empty, it means a/**/b, just verify we have no bad dots\n    // if there's no tail, so it ends on /**, then we must have *something*\n    // after the head, or it's not a matc\n    if (!body.length) {\n      let sawSome = !!fileTailMatch\n      for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n        const f = String(file[i])\n        sawSome = true\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      // in partial mode, we just need to get past all file parts\n      return partial || sawSome\n    }\n\n    // now we know that there's one or more body sections, which can\n    // be matched anywhere from the 0 index (because the head was pruned)\n    // through to the length-fileTailMatch index.\n    // split the body up into sections, and note the minimum index it can\n    // be found at (start with the length of all previous segments)\n    // [section, before, after]\n    const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n    let currentBody: [ParseReturn[], number] = bodySegments[0]\n    let nonGsParts = 0\n    const nonGsPartsSums: number[] = [0]\n    for (const b of body) {\n      if (b === GLOBSTAR) {\n        nonGsPartsSums.push(nonGsParts)\n        currentBody = [[], 0]\n        bodySegments.push(currentBody)\n      } else {\n        currentBody[0].push(b)\n        nonGsParts++\n      }\n    }\n    let i = bodySegments.length - 1\n    const fileLength = file.length - fileTailMatch\n    for (const b of bodySegments) {\n      b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n    }\n\n    return !!this.#matchGlobStarBodySections(\n      file,\n      bodySegments,\n      fileIndex,\n      0,\n      partial,\n      0,\n      !!fileTailMatch,\n    )\n  }\n\n  // return false for \"nope, not matching\"\n  // return null for \"not matching, cannot keep trying\"\n  #matchGlobStarBodySections(\n    file: string[],\n    // pattern section, last possible position for it\n    bodySegments: [ParseReturn[], number][],\n    fileIndex: number,\n    bodyIndex: number,\n    partial: boolean,\n    globStarDepth: number,\n    sawTail: boolean,\n  ): boolean | null {\n    // take the first body segment, and walk from fileIndex to its \"after\"\n    // value at the end\n    // If it doesn't match at that position, we increment, until we hit\n    // that final possible position, and give up.\n    // If it does match, then advance and try to rest.\n    // If any of them fail we keep walking forward.\n    // this is still a bit recursively painful, but it's more constrained\n    // than previous implementations, because we never test something that\n    // can't possibly be a valid matching condition.\n    const bs = bodySegments[bodyIndex]\n    if (!bs) {\n      // just make sure that there's no bad dots\n      for (let i = fileIndex; i < file.length; i++) {\n        sawTail = true\n        const f = file[i]\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      return sawTail\n    }\n\n    // have a non-globstar body section to test\n    const [body, after] = bs\n    while (fileIndex <= after) {\n      const m = this.#matchOne(\n        file.slice(0, fileIndex + body.length),\n        body,\n        partial,\n        fileIndex,\n        0,\n      )\n      // if limit exceeded, no match. intentional false negative,\n      // acceptable break in correctness for security.\n      if (m && globStarDepth < this.maxGlobstarRecursion) {\n        // match! see if the rest match. if so, we're done!\n        const sub = this.#matchGlobStarBodySections(\n          file,\n          bodySegments,\n          fileIndex + body.length,\n          bodyIndex + 1,\n          partial,\n          globStarDepth + 1,\n          sawTail,\n        )\n        if (sub !== false) {\n          return sub\n        }\n      }\n      const f = file[fileIndex]\n      if (\n        f === '.' ||\n        f === '..' ||\n        (!this.options.dot && f.startsWith('.'))\n      ) {\n        return false\n      }\n\n      fileIndex++\n    }\n    // walked off. no point continuing\n    return partial || null\n  }\n\n  #matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    let fi: number\n    let pi: number\n    let pl: number\n    let fl: number\n    for (\n      fi = fileIndex,\n        pi = patternIndex,\n        fl = file.length,\n        pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      let p = pattern[pi]\n      let f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false || p === GLOBSTAR) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.<ext>  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            starDotExtTestNocaseDot\n          : starDotExtTestNocase\n        : options.dot ? starDotExtTestDot\n        : starDotExtTest)(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            qmarksTestNocaseDot\n          : qmarksTestNocase\n        : options.dot ? qmarksTestDot\n        : qmarksTest)(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar =\n      options.noglobstar ? star\n      : options.dot ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return (\n            typeof p === 'string' ? regExpEscape(p)\n            : p === GLOBSTAR ? GLOBSTAR\n            : p._src\n          )\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        const filtered = pp.filter(p => p !== GLOBSTAR)\n\n        // For partial matches, we need to make the pattern match\n        // any prefix of the full path. We do this by generating\n        // alternative patterns that match progressively longer prefixes.\n        if (this.partial && filtered.length >= 1) {\n          const prefixes: string[] = []\n          for (let i = 1; i <= filtered.length; i++) {\n            prefixes.push(filtered.slice(0, i).join('/'))\n          }\n          return '(?:' + prefixes.join('|') + ')'\n        }\n\n        return filtered.join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // In partial mode, '/' should always match as it's a valid prefix for any pattern\n    if (this.partial) {\n      re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n    }\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (const pattern of set) {\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
Index: de_modules/minimatch/dist/esm/package.json
===================================================================
--- node_modules/minimatch/dist/esm/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "module"
-}
Index: de_modules/minimatch/dist/esm/unescape.d.ts
===================================================================
--- node_modules/minimatch/dist/esm/unescape.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import type { MinimatchOptions } from './index.js';
-/**
- * Un-escape a string that has been escaped with {@link escape}.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
- * square-bracket escapes are removed, but not backslash escapes.
- *
- * For example, it will turn the string `'[*]'` into `*`, but it will not
- * turn `'\\*'` into `'*'`, because `\` is a path separator in
- * `windowsPathsNoEscape` mode.
- *
- * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
- * backslash escapes are removed.
- *
- * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
- * or unescaped.
- *
- * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
- * unescaped.
- */
-export declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string;
-//# sourceMappingURL=unescape.d.ts.map
Index: de_modules/minimatch/dist/esm/unescape.d.ts.map
===================================================================
--- node_modules/minimatch/dist/esm/unescape.d.ts.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"}
Index: de_modules/minimatch/dist/esm/unescape.js
===================================================================
--- node_modules/minimatch/dist/esm/unescape.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-/**
- * Un-escape a string that has been escaped with {@link escape}.
- *
- * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
- * square-bracket escapes are removed, but not backslash escapes.
- *
- * For example, it will turn the string `'[*]'` into `*`, but it will not
- * turn `'\\*'` into `'*'`, because `\` is a path separator in
- * `windowsPathsNoEscape` mode.
- *
- * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
- * backslash escapes are removed.
- *
- * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
- * or unescaped.
- *
- * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
- * unescaped.
- */
-export const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => {
-    if (magicalBraces) {
-        return windowsPathsNoEscape ?
-            s.replace(/\[([^/\\])\]/g, '$1')
-            : s
-                .replace(/((?!\\).|^)\[([^/\\])\]/g, '$1$2')
-                .replace(/\\([^/])/g, '$1');
-    }
-    return windowsPathsNoEscape ?
-        s.replace(/\[([^/\\{}])\]/g, '$1')
-        : s
-            .replace(/((?!\\).|^)\[([^/\\{}])\]/g, '$1$2')
-            .replace(/\\([^/{}])/g, '$1');
-};
-//# sourceMappingURL=unescape.js.map
Index: de_modules/minimatch/dist/esm/unescape.js.map
===================================================================
--- node_modules/minimatch/dist/esm/unescape.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;iBAC3C,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC;aAC7C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = true,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/\\[([^/\\\\])\\]/g, '$1')\n      : s\n          .replace(/((?!\\\\).|^)\\[([^/\\\\])\\]/g, '$1$2')\n          .replace(/\\\\([^/])/g, '$1')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/\\[([^/\\\\{}])\\]/g, '$1')\n    : s\n        .replace(/((?!\\\\).|^)\\[([^/\\\\{}])\\]/g, '$1$2')\n        .replace(/\\\\([^/{}])/g, '$1')\n}\n"]}
Index: de_modules/minimatch/package.json
===================================================================
--- node_modules/minimatch/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,73 +1,0 @@
-{
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
-  "name": "minimatch",
-  "description": "a glob matcher in javascript",
-  "version": "10.2.6",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:isaacs/minimatch"
-  },
-  "main": "./dist/commonjs/index.js",
-  "types": "./dist/commonjs/index.d.ts",
-  "exports": {
-    "./package.json": "./package.json",
-    ".": {
-      "import": {
-        "types": "./dist/esm/index.d.ts",
-        "default": "./dist/esm/index.js"
-      },
-      "require": {
-        "types": "./dist/commonjs/index.d.ts",
-        "default": "./dist/commonjs/index.js"
-      }
-    }
-  },
-  "files": [
-    "dist"
-  ],
-  "scripts": {
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "prepublishOnly": "git push origin --follow-tags",
-    "prepare": "tshy",
-    "pretest": "npm run prepare",
-    "presnap": "npm run prepare",
-    "test": "tap",
-    "snap": "tap",
-    "format": "prettier --write .",
-    "benchmark": "node benchmark/index.js",
-    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts",
-    "lint": "oxlint --fix src test",
-    "postsnap": "npm run lint",
-    "postlint": "npm run format"
-  },
-  "engines": {
-    "node": "18 || 20 || >=22"
-  },
-  "devDependencies": {
-    "@types/node": "^26.1.2",
-    "mkdirp": "^3.0.1",
-    "oxlint": "^1.76.0",
-    "oxlint-tsgolint": "^7.0.2001",
-    "prettier": "^3.9.6",
-    "tap": "^21.7.5",
-    "tshy": "^4.1.3",
-    "typedoc": "^0.28.20"
-  },
-  "funding": {
-    "url": "https://github.com/sponsors/isaacs"
-  },
-  "license": "BlueOak-1.0.0",
-  "tshy": {
-    "exports": {
-      "./package.json": "./package.json",
-      ".": "./src/index.ts"
-    },
-    "selfLink": false
-  },
-  "type": "module",
-  "module": "./dist/esm/index.js",
-  "dependencies": {
-    "brace-expansion": "^5.0.8"
-  }
-}
Index: de_modules/ms/index.js
===================================================================
--- node_modules/ms/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,162 +1,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var w = d * 7;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function (val, options) {
-  options = options || {};
-  var type = typeof val;
-  if (type === 'string' && val.length > 0) {
-    return parse(val);
-  } else if (type === 'number' && isFinite(val)) {
-    return options.long ? fmtLong(val) : fmtShort(val);
-  }
-  throw new Error(
-    'val is not a non-empty string or a valid number. val=' +
-      JSON.stringify(val)
-  );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = String(str);
-  if (str.length > 100) {
-    return;
-  }
-  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'weeks':
-    case 'week':
-    case 'w':
-      return n * w;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (msAbs >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (msAbs >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (msAbs >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return plural(ms, msAbs, d, 'day');
-  }
-  if (msAbs >= h) {
-    return plural(ms, msAbs, h, 'hour');
-  }
-  if (msAbs >= m) {
-    return plural(ms, msAbs, m, 'minute');
-  }
-  if (msAbs >= s) {
-    return plural(ms, msAbs, s, 'second');
-  }
-  return ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, msAbs, n, name) {
-  var isPlural = msAbs >= n * 1.5;
-  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-}
Index: de_modules/ms/license.md
===================================================================
--- node_modules/ms/license.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2020 Vercel, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/ms/package.json
===================================================================
--- node_modules/ms/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,38 +1,0 @@
-{
-  "name": "ms",
-  "version": "2.1.3",
-  "description": "Tiny millisecond conversion utility",
-  "repository": "vercel/ms",
-  "main": "./index",
-  "files": [
-    "index.js"
-  ],
-  "scripts": {
-    "precommit": "lint-staged",
-    "lint": "eslint lib/* bin/*",
-    "test": "mocha tests.js"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "eslint": "4.18.2",
-    "expect.js": "0.3.1",
-    "husky": "0.14.3",
-    "lint-staged": "5.0.0",
-    "mocha": "4.0.1",
-    "prettier": "2.0.5"
-  }
-}
Index: de_modules/ms/readme.md
===================================================================
--- node_modules/ms/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,59 +1,0 @@
-# ms
-
-![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)
-
-Use this package to easily convert various time formats to milliseconds.
-
-## Examples
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('1y')      // 31557600000
-ms('100')     // 100
-ms('-3 days') // -259200000
-ms('-1h')     // -3600000
-ms('-200')    // -200
-```
-
-### Convert from Milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(-3 * 60000)        // "-3m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time Format Written-Out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(-3 * 60000, { long: true })        // "-3 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [Node.js](https://nodejs.org) and in the browser
-- If a number is supplied to `ms`, a string with a unit is returned
-- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
-- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
-
-## Related Packages
-
-- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
-
-## Caught a Bug?
-
-1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
-2. Link the package to the global module directory: `npm link`
-3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
Index: de_modules/nodemailer/.gitattributes
===================================================================
--- node_modules/nodemailer/.gitattributes	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,6 +1,0 @@
-*.js text eol=lf
-*.txt text eol=lf
-*.html text eol=lf
-*.htm text eol=lf
-*.ics -text
-*.bin -text
Index: de_modules/nodemailer/.ncurc.js
===================================================================
--- node_modules/nodemailer/.ncurc.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,11 +1,0 @@
-module.exports = {
-    upgrade: true,
-    reject: [
-        // API changes break existing tests
-        'proxy',
-
-        // API changes
-        'eslint',
-        'eslint-config-prettier'
-    ]
-};
Index: de_modules/nodemailer/.prettierrc.js
===================================================================
--- node_modules/nodemailer/.prettierrc.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-module.exports = {
-    printWidth: 160,
-    tabWidth: 4,
-    singleQuote: true,
-    endOfLine: 'lf',
-    trailingComma: 'none',
-    arrowParens: 'avoid'
-};
Index: de_modules/nodemailer/CHANGELOG.md
===================================================================
--- node_modules/nodemailer/CHANGELOG.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,848 +1,0 @@
-# CHANGELOG
-
-## [6.10.1](https://github.com/nodemailer/nodemailer/compare/v6.10.0...v6.10.1) (2025-02-06)
-
-
-### Bug Fixes
-
-* close correct socket ([a18062c](https://github.com/nodemailer/nodemailer/commit/a18062c04d0e05ca4357fbe8f0a59b690fa5391e))
-
-## [6.10.0](https://github.com/nodemailer/nodemailer/compare/v6.9.16...v6.10.0) (2025-01-23)
-
-
-### Features
-
-* **services:** add Seznam email service configuration ([#1695](https://github.com/nodemailer/nodemailer/issues/1695)) ([d1ae0a8](https://github.com/nodemailer/nodemailer/commit/d1ae0a86883ba6011a49a5bbdf076098e2e3637a))
-
-
-### Bug Fixes
-
-* **proxy:** Set error and timeout errors for proxied sockets ([aa0c99c](https://github.com/nodemailer/nodemailer/commit/aa0c99c8f25440bb3dc91f4f3448777c800604d7))
-
-## [6.9.16](https://github.com/nodemailer/nodemailer/compare/v6.9.15...v6.9.16) (2024-10-28)
-
-
-### Bug Fixes
-
-* **addressparser:** Correctly detect if user local part is attached to domain part ([f2096c5](https://github.com/nodemailer/nodemailer/commit/f2096c51b92a69ecfbcc15884c28cb2c2f00b826))
-
-## [6.9.15](https://github.com/nodemailer/nodemailer/compare/v6.9.14...v6.9.15) (2024-08-08)
-
-
-### Bug Fixes
-
-* Fix memory leak ([#1667](https://github.com/nodemailer/nodemailer/issues/1667)) ([baa28f6](https://github.com/nodemailer/nodemailer/commit/baa28f659641a4bc30360633673d851618f8e8bd))
-* **mime:** Added GeoJSON closes [#1637](https://github.com/nodemailer/nodemailer/issues/1637) ([#1665](https://github.com/nodemailer/nodemailer/issues/1665)) ([79b8293](https://github.com/nodemailer/nodemailer/commit/79b8293ad557d36f066b4675e649dd80362fd45b))
-
-## [6.9.14](https://github.com/nodemailer/nodemailer/compare/v6.9.13...v6.9.14) (2024-06-19)
-
-
-### Bug Fixes
-
-* **api:** Added support for Ethereal authentication ([56b2205](https://github.com/nodemailer/nodemailer/commit/56b22052a98de9e363f6c4d26d1512925349c3f3))
-* **services.json:** Add Email Services Provider Feishu Mail (CN) ([#1648](https://github.com/nodemailer/nodemailer/issues/1648)) ([e9e9ecc](https://github.com/nodemailer/nodemailer/commit/e9e9ecc99b352948a912868c7912b280a05178c6))
-* **services.json:** update Mailtrap host and port in well known ([#1652](https://github.com/nodemailer/nodemailer/issues/1652)) ([fc2c9ea](https://github.com/nodemailer/nodemailer/commit/fc2c9ea0b4c4f4e514143d2a138c9a23095fc827))
-* **well-known-services:** Add Loopia in well known services ([#1655](https://github.com/nodemailer/nodemailer/issues/1655)) ([21a28a1](https://github.com/nodemailer/nodemailer/commit/21a28a18fc9fdf8e0e86ddd846e54641395b2cb6))
-
-## [6.9.13](https://github.com/nodemailer/nodemailer/compare/v6.9.12...v6.9.13) (2024-03-20)
-
-
-### Bug Fixes
-
-* **tls:** Ensure servername for SMTP ([d66fdd3](https://github.com/nodemailer/nodemailer/commit/d66fdd3dccacc4bc79d697fe9009204cc8d4bde0))
-
-## [6.9.12](https://github.com/nodemailer/nodemailer/compare/v6.9.11...v6.9.12) (2024-03-08)
-
-
-### Bug Fixes
-
-* **message-generation:** Escape single quote in address names ([4ae5fad](https://github.com/nodemailer/nodemailer/commit/4ae5fadeaac70ba91abf529fcaae65f829a39101))
-
-## [6.9.11](https://github.com/nodemailer/nodemailer/compare/v6.9.10...v6.9.11) (2024-02-29)
-
-
-### Bug Fixes
-
-* **headers:** Ensure that Content-type is the bottom header ([c7cf97e](https://github.com/nodemailer/nodemailer/commit/c7cf97e5ecc83f8eee773359951df995c9945446))
-
-## [6.9.10](https://github.com/nodemailer/nodemailer/compare/v6.9.9...v6.9.10) (2024-02-22)
-
-
-### Bug Fixes
-
-* **data-uri:** Do not use regular expressions for parsing data URI schemes ([12e65e9](https://github.com/nodemailer/nodemailer/commit/12e65e975d80efe6bafe6de4590829b3b5ebb492))
-* **data-uri:** Moved all data-uri regexes to use the non-regex parseDataUri method ([edd5dfe](https://github.com/nodemailer/nodemailer/commit/edd5dfe5ce9b725f8b8ae2830797f65b2a2b0a33))
-
-## [6.9.9](https://github.com/nodemailer/nodemailer/compare/v6.9.8...v6.9.9) (2024-02-01)
-
-
-### Bug Fixes
-
-* **security:** Fix issues described in GHSA-9h6g-pr28-7cqp. Do not use eternal matching pattern if only a few occurences are expected ([dd8f5e8](https://github.com/nodemailer/nodemailer/commit/dd8f5e8a4ddc99992e31df76bcff9c590035cd4a))
-* **tests:** Use native node test runner, added code coverage support, removed grunt ([#1604](https://github.com/nodemailer/nodemailer/issues/1604)) ([be45c1b](https://github.com/nodemailer/nodemailer/commit/be45c1b299d012358d69247019391a02734d70af))
-
-## [6.9.8](https://github.com/nodemailer/nodemailer/compare/v6.9.7...v6.9.8) (2023-12-30)
-
-
-### Bug Fixes
-
-* **punycode:** do not use native punycode module ([b4d0e0c](https://github.com/nodemailer/nodemailer/commit/b4d0e0c7cc4b15bc4d9e287f91d1bcaca87508b0))
-
-## [6.9.7](https://github.com/nodemailer/nodemailer/compare/v6.9.6...v6.9.7) (2023-10-22)
-
-
-### Bug Fixes
-
-* **customAuth:** Do not require user and pass to be set for custom authentication schemes (fixes [#1584](https://github.com/nodemailer/nodemailer/issues/1584)) ([41d482c](https://github.com/nodemailer/nodemailer/commit/41d482c3f01e26111b06f3e46351b193db3fb5cb))
-
-## [6.9.6](https://github.com/nodemailer/nodemailer/compare/v6.9.5...v6.9.6) (2023-10-09)
-
-
-### Bug Fixes
-
-* **inline:** Use 'inline' as the default Content Dispostion value for embedded images ([db32c93](https://github.com/nodemailer/nodemailer/commit/db32c93fefee527bcc239f13056e5d9181a4d8af))
-* **tests:** Removed Node v12 from test matrix as it is not compatible with the test framework anymore ([7fe0a60](https://github.com/nodemailer/nodemailer/commit/7fe0a608ed6bcb70dc6b2de543ebfc3a30abf984))
-
-## [6.9.5](https://github.com/nodemailer/nodemailer/compare/v6.9.4...v6.9.5) (2023-09-06)
-
-
-### Bug Fixes
-
-* **license:** Updated license year ([da4744e](https://github.com/nodemailer/nodemailer/commit/da4744e491f3a68f4f68e4073684370592630e01))
-
-## 6.9.4 2023-07-19
-
--   Renamed SendinBlue to Brevo
-
-## 6.9.3 2023-05-29
-
--   Specified license identifier (was defined as MIT, actual value MIT-0)
--   If SMTP server disconnects with a message, process it and include as part of the response error
-
-## 6.9.2 2023-05-11
-
--   Fix uncaught exception on invalid attachment content payload
-
-## 6.9.1 2023-01-27
-
--   Fix base64 encoding for emoji bytes in encoded words
-
-## 6.9.0 2023-01-12
-
--   Do not throw if failed to resolve IPv4 addresses
--   Include EHLO extensions in the send response
--   fix sendMail function: callback should be optional
-
-## 6.8.0 2022-09-28
-
--   Add DNS timeout (huksley)
--   add dns.REFUSED (lucagianfelici)
-
-## 6.7.8 2022-08-11
-
--   Allow to use multiple Reply-To addresses
-
-## 6.7.7 2022-07-06
-
--   Resolver fixes
-
-## 6.7.5 2022-05-04
-
--   No changes, pushing a new README to npmjs.org
-
-## 6.7.4 2022-04-29
-
--   Ensure compatibility with Node 18
--   Replaced Travis with Github Actions
-
-## 6.7.3 2022-03-21
-
--   Typo fixes
--   Added stale issue automation fir Github
--   Add Infomaniak config to well known service (popod)
--   Update Outlook/Hotmail host in well known services (popod)
--   fix: DSN recipient gets ignored (KornKalle)
-
-## 6.7.2 2021-11-26
-
--   Fix proxies for account verification
-
-## 6.7.1 2021-11-15
-
--   fix verify on ses-transport (stanofsky)
-
-## 6.7.0 2021-10-11
-
--   Updated DNS resolving logic. If there are multiple responses for a A/AAAA record, then loop these randomly instead of only caching the first one
-
-## 6.6.5 2021-09-23
-
--   Replaced Object.values() and Array.flat() with polyfills to allow using Nodemailer in Node v6+
-
-## 6.6.4 2021-09-22
-
--   Better compatibility with IPv6-only SMTP hosts (oxzi)
--   Fix ses verify for sdk v3 (hannesvdvreken)
--   Added SECURITY.txt for contact info
-
-## 6.6.3 2021-07-14
-
--   Do not show passwords in SMTP transaction logs. All passwords used in logging are replaced by `"/* secret */"`
-
-## 6.6.1 2021-05-23
-
--   Fixed address formatting issue where newlines in an email address, if provided via address object, were not properly removed. Reported by tmazeika (#1289)
-
-## 6.6.0 2021-04-28
-
--   Added new option `newline` for MailComposer
--   aws ses connection verification (Ognjen Jevremovic)
-
-## 6.5.0 2021-02-26
-
--   Pass through textEncoding to subnodes
--   Added support for AWS SES v3 SDK
--   Fixed tests
-
-## 6.4.18 2021-02-11
-
--   Updated README
-
-## 6.4.17 2020-12-11
-
--   Allow mixing attachments with caendar alternatives
-
-## 6.4.16 2020-11-12
-
--   Applied updated prettier formating rules
-
-## 6.4.15 2020-11-06
-
--   Minor changes in header key casing
-
-## 6.4.14 2020-10-14
-
--   Disabled postinstall script
-
-## 6.4.13 2020-10-02
-
--   Fix normalizeHeaderKey method for single node messages
-
-## 6.4.12 2020-09-30
-
--   Better handling of attachment filenames that include quote symbols
--   Includes all information from the oath2 error response in the error message (Normal Gaussian) [1787f227]
-
-## 6.4.11 2020-07-29
-
--   Fixed escape sequence handling in address parsing
-
-## 6.4.10 2020-06-17
-
--   Fixed RFC822 output for MailComposer when using invalid content-type value. Mostly relevant if message attachments have stragne content-type values set.
-
-## 6.4.7 2020-05-28
-
--   Always set charset=utf-8 for Content-Type headers
--   Catch error when using invalid crypto.sign input
-
-## 6.4.6 2020-03-20
-
--   fix: `requeueAttempts=n` should requeue `n` times (Patrick Malouin) [a27ed2f7]
-
-## 6.4.4 2020-03-01
-
--   Add `options.forceAuth` for SMTP (Patrick Malouin) [a27ed2f7]
-
-## 6.4.3 2020-02-22
-
--   Added an option to specify max number of requeues when connection closes unexpectedly (Igor Sechyn) [8a927f5a]
-
-## 6.4.2 2019-12-11
-
--   Fixed bug where array item was used with a potentially empty array
-
-## 6.4.1 2019-12-07
-
--   Fix processing server output with unterminated responses
-
-## 6.4.0 2019-12-04
-
--   Do not use auth if server does not advertise AUTH support [f419b09d]
--   add dns.CONNREFUSED (Hiroyuki Okada) [5c4c8ca8]
-
-## 6.3.1 2019-10-09
-
--   Ignore "end" events because it might be "error" after it (dex4er) [72bade9]
--   Set username and password on the connection proxy object correctly (UsamaAshraf) [250b1a8]
--   Support more DNS errors (madarche) [2391aa4]
-
-## 6.3.0 2019-07-14
-
--   Added new option to pass a set of httpHeaders to be sent when fetching attachments. See [PR #1034](https://github.com/nodemailer/nodemailer/pull/1034)
-
-## 6.2.1 2019-05-24
-
--   No changes. It is the same as 6.2.0 that was accidentally published as 6.2.1 to npm
-
-## 6.2.0 2019-05-24
-
--   Added new option for addressparser: `flatten`. If true then ignores group names and returns a single list of all addresses
-
-## 6.1.1 2019-04-20
-
--   Fixed regression bug with missing smtp `authMethod` property
-
-## 6.1.0 2019-04-06
-
--   Added new message property `amp` for providing AMP4EMAIL content
-
-## 6.0.0 2019-03-25
-
--   SMTPConnection: use removeListener instead of removeAllListeners (xr0master) [ddc4af15]
-    Using removeListener should fix memory leak with Node.js streams
-
-## 5.1.1 2019-01-09
-
--   Added missing option argument for custom auth
-
-## 5.1.0 2019-01-09
-
--   Official support for custom authentication methods and examples (examples/custom-auth-async.js and examples/custom-auth-cb.js)
-
-## 5.0.1 2019-01-09
-
--   Fixed regression error to support Node versions lower than 6.11
--   Added expiremental custom authentication support
-
-## 5.0.0 2018-12-28
-
--   Start using dns.resolve() instead of dns.lookup() for resolving SMTP hostnames. Might be breaking change on some environments so upgrade with care
--   Show more logs for renewing OAuth2 tokens, previously it was not possible to see what actually failed
-
-## 4.7.0 2018-11-19
-
--   Cleaned up List-\* header generation
--   Fixed 'full' return option for DSN (klaronix) [23b93a3b]
--   Support promises `for mailcomposer.build()`
-
-## 4.6.8 2018-08-15
-
--   Use first IP address from DNS resolution when using a proxy (Limbozz) [d4ca847c]
--   Return raw email from SES transport (gabegorelick) [3aa08967]
-
-## 4.6.7 2018-06-15
-
--   Added option `skipEncoding` to JSONTransport
-
-## 4.6.6 2018-06-10
-
--   Fixes mime encoded-word compatibility issue with invalid clients like Zimbra
-
-## 4.6.5 2018-05-23
-
--   Fixed broken DKIM stream in Node.js v10
--   Updated error messages for SMTP responses to not include a newline
-
-## 4.6.4 2018-03-31
-
--   Readded logo author link to README that was accidentally removed a while ago
-
-## 4.6.3 2018-03-13
-
--   Removed unneeded dependency
-
-## 4.6.2 2018-03-06
-
--   When redirecting URL calls then do not include original POST content
-
-## 4.6.1 2018-03-06
-
--   Fixed Smtp connection freezing, when trying to send after close / quit (twawszczak) [73d3911c]
-
-## 4.6.0 2018-02-22
-
--   Support socks module v2 in addition to v1 [e228bcb2]
--   Fixed invalid promise return value when using createTestAccount [5524e627]
--   Allow using local addresses [8f6fa35f]
-
-## 4.5.0 2018-02-21
-
--   Added new message transport option `normalizeHeaderKey(key)=>normalizedKey` for custom header formatting
-
-## 4.4.2 2018-01-20
-
--   Added sponsors section to README
--   enclose encodeURIComponent in try..catch to handle invalid urls
-
-## 4.4.1 2017-12-08
-
--   Better handling of unexpectedly dropping connections
-
-## 4.4.0 2017-11-10
-
--   Changed default behavior for attachment option contentTransferEncoding. If it is unset then base64 encoding is used for the attachment. If it is set to false then previous default applies (base64 for most, 7bit for text)
-
-## 4.3.1 2017-10-25
-
--   Fixed a confict with Electron.js where timers do not have unref method
-
-## 4.3.0 2017-10-23
-
--   Added new mail object method `mail.normalize(cb)` that should make creating HTTP API based transports much easier
-
-## 4.2.0 2017-10-13
-
--   Expose streamed messages size and timers in info response
-
-## v4.1.3 2017-10-06
-
--   Allow generating preview links without calling createTestAccount first
-
-## v4.1.2 2017-10-03
-
--   No actual changes. Needed to push updated README to npmjs
-
-## v4.1.1 2017-09-25
-
--   Fixed JSONTransport attachment handling
-
-## v4.1.0 2017-08-28
-
--   Added new methods `createTestAccount` and `getTestMessageUrl` to use autogenerated email accounts from https://Ethereal.email
-
-## v4.0.1 2017-04-13
-
--   Fixed issue with LMTP and STARTTLS
-
-## v4.0.0 2017-04-06
-
--   License changed from EUPLv1.1 to MIT
-
-## v3.1.8 2017-03-21
-
--   Fixed invalid List-\* header generation
-
-## v3.1.7 2017-03-14
-
--   Emit an error if STARTTLS ends with connection being closed
-
-## v3.1.6 2017-03-14
-
--   Expose last server response for smtpConnection
-
-## v3.1.5 2017-03-08
-
--   Fixed SES transport, added missing `response` value
-
-## v3.1.4 2017-02-26
-
--   Fixed DKIM calculation for empty body
--   Ensure linebreak after message content. This fixes DKIM signatures for non-multipart messages where input did not end with a newline
-
-## v3.1.3 2017-02-17
-
--   Fixed missing `transport.verify()` methods for SES transport
-
-## v3.1.2 2017-02-17
-
--   Added missing error handlers for Sendmail, SES and Stream transports. If a messages contained an invalid URL as attachment then these transports threw an uncatched error
-
-## v3.1.1 2017-02-13
-
--   Fixed missing `transport.on('idle')` and `transport.isIdle()` methods for SES transports
-
-## v3.1.0 2017-02-13
-
--   Added built-in transport for AWS SES. [Docs](http://localhost:1313/transports/ses/)
--   Updated stream transport to allow building JSON strings. [Docs](http://localhost:1313/transports/stream/#json-transport)
--   Added new method _mail.resolveAll_ that fetches all attachments and such to be able to more easily build API-based transports
-
-## v3.0.2 2017-02-04
-
--   Fixed a bug with OAuth2 login where error callback was fired twice if getToken was not available.
-
-## v3.0.1 2017-02-03
-
--   Fixed a bug where Nodemailer threw an exception if `disableFileAccess` option was used
--   Added FLOSS [exception declaration](FLOSS_EXCEPTIONS.md)
-
-## v3.0.0 2017-01-31
-
--   Initial version of Nodemailer 3
-
-This update brings a lot of breaking changes:
-
--   License changed from MIT to **EUPL-1.1**. This was possible as the new version of Nodemailer is a major rewrite. The features I don't have ownership for, were removed or reimplemented. If there's still some snippets in the code that have vague ownership then notify <mailto:andris@kreata.ee> about the conflicting code and I'll fix it.
--   Requires **Node.js v6+**
--   All **templating is gone**. It was too confusing to use and to be really universal a huge list of different renderers would be required. Nodemailer is about email, not about parsing different template syntaxes
--   **No NTLM authentication**. It was too difficult to re-implement. If you still need it then it would be possible to introduce a pluggable SASL interface where you could load the NTLM module in your own code and pass it to Nodemailer. Currently this is not possible.
--   **OAuth2 authentication** is built in and has a different [configuration](https://nodemailer.com/smtp/oauth2/). You can use both user (3LO) and service (2LO) accounts to generate access tokens from Nodemailer. Additionally there's a new feature to authenticate differently for every message – useful if your application sends on behalf of different users instead of a single sender.
--   **Improved Calendaring**. Provide an ical file to Nodemailer to send out [calendar events](https://nodemailer.com/message/calendar-events/).
-
-And also some non-breaking changes:
-
--   All **dependencies were dropped**. There is exactly 0 dependencies needed to use Nodemailer. This brings the installation time of Nodemailer from NPM down to less than 2 seconds
--   **Delivery status notifications** added to Nodemailer
--   Improved and built-in **DKIM** signing of messages. Previously you needed an external module for this and it did quite a lousy job with larger messages
--   **Stream transport** to return a RFC822 formatted message as a stream. Useful if you want to use Nodemailer as a preprocessor and not for actual delivery.
--   **Sendmail** transport built-in, no need for external transport plugin
-
-See [Nodemailer.com](https://nodemailer.com/) for full documentation
-
-## 2.7.0 2016-12-08
-
--   Bumped mailcomposer that generates encoded-words differently which might break some tests
-
-## 2.6.0 2016-09-05
-
--   Added new options disableFileAccess and disableUrlAccess
--   Fixed envelope handling where cc/bcc fields were ignored in the envelope object
-
-## 2.4.2 2016-05-25
-
--   Removed shrinkwrap file. Seemed to cause more trouble than help
-
-## 2.4.1 2016-05-12
-
--   Fixed outdated shrinkwrap file
-
-## 2.4.0 2016-05-11
-
--   Bumped mailcomposer module to allow using `false` as attachment filename (suppresses filename usage)
--   Added NTLM authentication support
-
-## 2.3.2 2016-04-11
-
--   Bumped smtp transport modules to get newest smtp-connection that fixes SMTPUTF8 support for internationalized email addresses
-
-## 2.3.1 2016-04-08
-
--   Bumped mailcomposer to have better support for message/822 attachments
-
-## 2.3.0 2016-03-03
-
--   Fixed a bug with attachment filename that contains mixed unicode and dashes
--   Added built-in support for proxies by providing a new SMTP option `proxy` that takes a proxy configuration url as its value
--   Added option `transport` to dynamically load transport plugins
--   Do not require globally installed grunt-cli
-
-## 2.2.1 2016-02-20
-
--   Fixed a bug in SMTP requireTLS option that was broken
-
-## 2.2.0 2016-02-18
-
--   Removed the need to use `clone` dependency
--   Added new method `verify` to check SMTP configuration
--   Direct transport uses STARTTLS by default, fallbacks to plaintext if STARTTLS fails
--   Added new message option `list` for setting List-\* headers
--   Add simple proxy support with `getSocket` method
--   Added new message option `textEncoding`. If `textEncoding` is not set then detect best encoding automatically
--   Added new message option `icalEvent` to embed iCalendar events. Example [here](examples/ical-event.js)
--   Added new attachment option `raw` to use prepared MIME contents instead of generating a new one. This might be useful when you want to handcraft some parts of the message yourself, for example if you want to inject a PGP encrypted message as the contents of a MIME node
--   Added new message option `raw` to use an existing MIME message instead of generating a new one
-
-## 2.1.0 2016-02-01
-
-Republishing 2.1.0-rc.1 as stable. To recap, here's the notable changes between v2.0 and v2.1:
-
--   Implemented templating support. You can either use a simple built-in renderer or some external advanced renderer, eg. [node-email-templates](https://github.com/niftylettuce/node-email-templates). Templating [docs](http://nodemailer.com/2-0-0-beta/templating/).
--   Updated smtp-pool to emit 'idle' events in order to handle message queue more effectively
--   Updated custom header handling, works everywhere the same now, no differences between adding custom headers to the message or to an attachment
-
-## 2.1.0-rc.1 2016-01-25
-
-Sneaked in some new features even though it is already rc
-
--   If a SMTP pool is closed while there are still messages in a queue, the message callbacks are invoked with an error
--   In case of SMTP pool the transporter emits 'idle' when there is a free connection slot available
--   Added method `isIdle()` that checks if a pool has still some free connection slots available
-
-## 2.1.0-rc.0 2016-01-20
-
--   Bumped dependency versions
-
-## 2.1.0-beta.3 2016-01-20
-
--   Added support for node-email-templates templating in addition to the built-in renderer
-
-## 2.1.0-beta.2 2016-01-20
-
--   Implemented simple templating feature
-
-## 2.1.0-beta.1 2016-01-20
-
--   Allow using prepared header values that are not folded or encoded by Nodemailer
-
-## 2.1.0-beta.0 2016-01-20
-
--   Use the same header custom structure for message root, attachments and alternatives
--   Ensure that Message-Id exists when accessing message
--   Allow using array values for custom headers (inserts every value in its own row)
-
-## 2.0.0 2016-01-11
-
--   Released rc.2 as stable
-
-## 2.0.0-rc.2 2016-01-04
-
--   Locked dependencies
-
-## 2.0.0-beta.2 2016-01-04
-
--   Updated documentation to reflect changes with SMTP handling
--   Use beta versions for smtp/pool/direct transports
--   Updated logging
-
-## 2.0.0-beta.1 2016-01-03
-
--   Use bunyan compatible logger instead of the emit('log') style
--   Outsourced some reusable methods to nodemailer-shared
--   Support setting direct/smtp/pool with the default configuration
-
-## 2.0.0-beta.0 2015-12-31
-
--   Stream errors are not silently swallowed
--   Do not use format=flowed
--   Use nodemailer-fetch to fetch URL streams
--   jshint replaced by eslint
-
-## v1.11.0 2015-12-28
-
-Allow connection url based SMTP configurations
-
-## v1.10.0 2015-11-13
-
-Added `defaults` argument for `createTransport` to predefine commonn values (eg. `from` address)
-
-## v1.9.0 2015-11-09
-
-Returns a Promise for `sendMail` if callback is not defined
-
-## v1.8.0 2015-10-08
-
-Added priority option (high, normal, low) for setting Importance header
-
-## v1.7.0 2015-10-06
-
-Replaced hyperquest with needle. Fixes issues with compressed data and redirects
-
-## v1.6.0 2015-10-05
-
-Maintenance release. Bumped dependencies to get support for unicode filenames for QQ webmail and to support emoji in filenames
-
-## v1.5.0 2015-09-24
-
-Use mailcomposer instead of built in solution to generate message sources. Bumped libmime gives better quoted-printable handling.
-
-## v1.4.0 2015-06-27
-
-Added new message option `watchHtml` to specify Apple Watch specific HTML part of the message. See [this post](https://litmus.com/blog/how-to-send-hidden-version-email-apple-watch) for details
-
-## v1.3.4 2015-04-25
-
-Maintenance release, bumped buildmail version to get fixed format=flowed handling
-
-## v1.3.3 2015-04-25
-
-Maintenance release, bumped dependencies
-
-## v1.3.2 2015-03-09
-
-Maintenance release, upgraded dependencies. Replaced simplesmtp based tests with smtp-server based ones.
-
-## v1.3.0 2014-09-12
-
-Maintenance release, upgrades buildmail and libmime. Allows using functions as transform plugins and fixes issue with unicode filenames in Gmail.
-
-## v1.2.2 2014-09-05
-
-Proper handling of data uris as attachments. Attachment `path` property can also be defined as a data uri, not just regular url or file path.
-
-## v1.2.1 2014-08-21
-
-Bumped libmime and mailbuild versions to properly handle filenames with spaces (short ascii only filenames with spaces were left unquoted).
-
-## v1.2.0 2014-08-18
-
-Allow using encoded strings as attachments. Added new property `encoding` which defines the encoding used for a `content` string. If encoding is set, the content value is converted to a Buffer value using the defined encoding before usage. Useful for including binary attachemnts in JSON formatted email objects.
-
-## v1.1.2 2014-08-18
-
-Return deprecatin error for v0.x style configuration
-
-## v1.1.1 2014-07-30
-
-Bumped nodemailer-direct-transport dependency. Updated version includes a bugfix for Stream nodes handling. Important only if use direct-transport with Streams (not file paths or urls) as attachment content.
-
-## v1.1.0 2014-07-29
-
-Added new method `resolveContent()` to get the html/text/attachment content as a String or Buffer.
-
-## v1.0.4 2014-07-23
-
-Bugfix release. HTML node was instered twice if the message consisted of a HTML content (but no text content) + at least one attachment with CID + at least one attachment without CID. In this case the HTML node was inserted both to the root level multipart/mixed section and to the multipart/related sub section
-
-## v1.0.3 2014-07-16
-
-Fixed a bug where Nodemailer crashed if the message content type was multipart/related
-
-## v1.0.2 2014-07-16
-
-Upgraded nodemailer-smtp-transport to 0.1.11\. The docs state that for SSL you should use 'secure' option but the underlying smtp-connection module used 'secureConnection' for this purpose. Fixed smpt-connection to match the docs.
-
-## v1.0.1 2014-07-15
-
-Implemented missing #close method that is passed to the underlying transport object. Required by the smtp pool.
-
-## v1.0.0 2014-07-15
-
-Total rewrite. See migration guide here: <http://www.andrisreinman.com/nodemailer-v1-0/#migrationguide>
-
-## v0.7.1 2014-07-09
-
--   Upgraded aws-sdk to 2.0.5
-
-## v0.7.0 2014-06-17
-
--   Bumped version to v0.7.0
--   Fix AWS-SES usage [5b6bc144]
--   Replace current SES with new SES using AWS-SDK (Elanorr) [c79d797a]
--   Updated README.md about Node Email Templates (niftylettuce) [e52bef81]
-
-## v0.6.5 2014-05-15
-
--   Bumped version to v0.6.5
--   Use tildes instead of carets for dependency listing [5296ce41]
--   Allow clients to set a custom identityString (venables) [5373287d]
--   bugfix (adding "-i" to sendmail command line for each new mail) by copying this.args (vrodic) [05a8a9a3]
--   update copyright (gdi2290) [3a6cba3a]
-
-## v0.6.4 2014-05-13
-
--   Bumped version to v0.6.4
--   added npmignore, bumped dependencies [21bddcd9]
--   Add AOL to well-known services (msouce) [da7dd3b7]
-
-## v0.6.3 2014-04-16
-
--   Bumped version to v0.6.3
--   Upgraded simplesmtp dependency [dd367f59]
-
-## v0.6.2 2014-04-09
-
--   Bumped version to v0.6.2
--   Added error option to Stub transport [c423acad]
--   Use SVG npm badge (t3chnoboy) [677117b7]
--   add SendCloud to well known services (haio) [43c358e0]
--   High-res build-passing and NPM module badges (sahat) [9fdc37cd]
-
-## v0.6.1 2014-01-26
-
--   Bumped version to v0.6.1
--   Do not throw on multiple errors from sendmail command [c6e2cd12]
--   Do not require callback for pickup, fixes #238 [93eb3214]
--   Added AWSSecurityToken information to README, fixes #235 [58e921d1]
--   Added Nodemailer logo [06b7d1a8]
-
-## v0.6.0 2013-12-30
-
--   Bumped version to v0.6.0
--   Allow defining custom transport methods [ec5b48ce]
--   Return messageId with responseObject for all built in transport methods [74445cec]
--   Bumped dependency versions for mailcomposer and readable-stream [9a034c34]
--   Changed pickup argument name to 'directory' [01c3ea53]
--   Added support for IIS pickup directory with PICKUP transport (philipproplesch) [36940b59..360a2878]
--   Applied common styles [9e93a409]
--   Updated readme [c78075e7]
-
-## v0.5.15 2013-12-13
-
--   bumped version to v0.5.15
--   Updated README, added global options info for setting uo transports [554bb0e5]
--   Resolve public hostname, if resolveHostname property for a transport object is set to `true` [9023a6e1..4c66b819]
-
-## v0.5.14 2013-12-05
-
--   bumped version to v0.5.14
--   Expose status for direct messages [f0312df6]
--   Allow to skip the X-Mailer header if xMailer value is set to 'false' [f2c20a68]
-
-## v0.5.13 2013-12-03
-
--   bumped version to v0.5.13
--   Use the name property from the transport object to use for the domain part of message-id values (1598eee9)
-
-## v0.5.12 2013-12-02
-
--   bumped version to v0.5.12
--   Expose transport method and transport module version if available [a495106e]
--   Added 'he' module instead of using custom html entity decoding [c197d102]
--   Added xMailer property for transport configuration object to override X-Mailer value [e8733a61]
--   Updated README, added description for 'mail' method [e1f5f3a6]
-
-## v0.5.11 2013-11-28
-
--   bumped version to v0.5.11
--   Updated mailcomposer version. Replaces ent with he [6a45b790e]
-
-## v0.5.10 2013-11-26
-
--   bumped version to v0.5.10
--   added shorthand function mail() for direct transport type [88129bd7]
--   minor tweaks and typo fixes [f797409e..ceac0ca4]
-
-## v0.5.9 2013-11-25
-
--   bumped version to v0.5.9
--   Update for 'direct' handling [77b84e2f]
--   do not require callback to be provided for 'direct' type [ec51c79f]
-
-## v0.5.8 2013-11-22
-
--   bumped version to v0.5.8
--   Added support for 'direct' transport [826f226d..0dbbcbbc]
-
-## v0.5.7 2013-11-18
-
--   bumped version to v0.5.7
--   Replace \r\n by \n in Sendmail transport (rolftimmermans) [fed2089e..616ec90c] A lot of sendmail implementations choke on \r\n newlines and require \n This commit addresses this by transforming all \r\n sequences passed to the sendmail command with \n
-
-## v0.5.6 2013-11-15
-
--   bumped version to v0.5.6
--   Upgraded mailcomposer dependency to 0.2.4 [e5ff9c40]
--   Removed noCR option [e810d1b8]
--   Update wellknown.js, added FastMail (k-j-kleist) [cf930f6d]
-
-## v0.5.5 2013-10-30
-
--   bumped version to v0.5.5
--   Updated mailcomposer dependnecy version to 0.2.3
--   Remove legacy code - node v0.4 is not supported anymore anyway
--   Use hostname (autodetected or from the options.name property) for Message-Id instead of "Nodemailer" (helps a bit when messages are identified as spam)
--   Added maxMessages info to README
-
-## v0.5.4 2013-10-29
-
--   bumped version to v0.5.4
--   added "use strict" statements
--   Added DSN info to README
--   add support for QQ enterprise email (coderhaoxin)
--   Add a Bitdeli Badge to README
--   DSN options Passthrought into simplesmtp. (irvinzz)
-
-## v0.5.3 2013-10-03
-
--   bumped version v0.5.3
--   Using a stub transport to prevent sendmail from being called during a test. (jsdevel)
--   closes #78: sendmail transport does not work correctly on Unix machines. (jsdevel)
--   Updated PaaS Support list to include Modulus. (fiveisprime)
--   Translate self closing break tags to newline (kosmasgiannis)
--   fix typos (aeosynth)
-
-## v0.5.2 2013-07-25
-
--   bumped version v0.5.2
--   Merge pull request #177 from MrSwitch/master Fixing Amazon SES, fatal error caused by bad connection
Index: de_modules/nodemailer/CODE_OF_CONDUCT.md
===================================================================
--- node_modules/nodemailer/CODE_OF_CONDUCT.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,76 +1,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, nationality, personal
-appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
- advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at info@nodemailer.com. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
Index: de_modules/nodemailer/LICENSE
===================================================================
--- node_modules/nodemailer/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-Copyright (c) 2011-2023 Andris Reinman
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/nodemailer/README.md
===================================================================
--- node_modules/nodemailer/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,86 +1,0 @@
-# Nodemailer
-
-[![Nodemailer](https://raw.githubusercontent.com/nodemailer/nodemailer/master/assets/nm_logo_200x136.png)](https://nodemailer.com/about/)
-
-Send emails from Node.js – easy as cake! 🍰✉️
-
-[![NPM](https://nodei.co/npm/nodemailer.png?downloads=true&downloadRank=true&stars=true)](https://nodemailer.com/about/)
-
-See [nodemailer.com](https://nodemailer.com/) for documentation and terms.
-
-> [!TIP]
-> Check out **[EmailEngine](https://emailengine.app/?utm_source=github-nodemailer&utm_campaign=nodemailer&utm_medium=readme-link)** – a self-hosted email gateway that allows making **REST requests against IMAP and SMTP servers**. EmailEngine also sends webhooks whenever something changes on the registered accounts.\
-> \
-> Using the email accounts registered with EmailEngine, you can receive and [send emails](https://emailengine.app/sending-emails?utm_source=github-nodemailer&utm_campaign=nodemailer&utm_medium=readme-link). EmailEngine supports OAuth2, delayed sends, opens and clicks tracking, bounce detection, etc. All on top of regular email accounts without an external MTA service.
-
-## Having an issue?
-
-#### First review the docs
-
-Documentation for Nodemailer can be found at [nodemailer.com](https://nodemailer.com/about/).
-
-#### Nodemailer throws a SyntaxError for "..."
-
-You are using an older Node.js version than v6.0. Upgrade Node.js to get support for the spread operator. Nodemailer supports all Node.js versions starting from Node.js@v6.0.0.
-
-#### I'm having issues with Gmail
-
-Gmail either works well, or it does not work at all. It is probably easier to switch to an alternative service instead of fixing issues with Gmail. If Gmail does not work for you, then don't use it. Read more about it [here](https://nodemailer.com/usage/using-gmail/).
-
-#### I get ETIMEDOUT errors
-
-Check your firewall settings. Timeout usually occurs when you try to open a connection to a firewalled port either on the server or on your machine. Some ISPs also block email ports to prevent spamming.
-
-#### Nodemailer works on one machine but not in another
-
-It's either a firewall issue, or your SMTP server blocks authentication attempts from some servers.
-
-#### I get TLS errors
-
--   If you are running the code on your machine, check your antivirus settings. Antiviruses often mess around with email ports usage. Node.js might not recognize the MITM cert your antivirus is using.
--   Latest Node versions allow only TLS versions 1.2 and higher. Some servers might still use TLS 1.1 or lower. Check Node.js docs on how to get correct TLS support for your app. You can change this with [tls.minVersion](https://nodejs.org/dist/latest-v16.x/docs/api/tls.html#tls_tls_createsecurecontext_options) option
--   You might have the wrong value for the `secure` option. This should be set to `true` only for port 465. For every other port, it should be `false`. Setting it to `false` does not mean that Nodemailer would not use TLS. Nodemailer would still try to upgrade the connection to use TLS if the server supports it.
--   Older Node versions do not fully support the certificate chain of the newest Let's Encrypt certificates. Either set [tls.rejectUnauthorized](https://nodejs.org/dist/latest-v16.x/docs/api/tls.html#tlsconnectoptions-callback) to `false` to skip chain verification or upgrade your Node version
-
-```
-let configOptions = {
-    host: "smtp.example.com",
-    port: 587,
-    tls: {
-        rejectUnauthorized: true,
-        minVersion: "TLSv1.2"
-    }
-}
-```
-
-#### I have issues with DNS / hosts file
-
-Node.js uses [c-ares](https://nodejs.org/en/docs/meta/topics/dependencies/#c-ares) to resolve domain names, not the DNS library provided by the system, so if you have some custom DNS routing set up, it might be ignored. Nodemailer runs [dns.resolve4()](https://nodejs.org/dist/latest-v16.x/docs/api/dns.html#dnsresolve4hostname-options-callback) and [dns.resolve6()](https://nodejs.org/dist/latest-v16.x/docs/api/dns.html#dnsresolve6hostname-options-callback) to resolve hostname into an IP address. If both calls fail, then Nodemailer will fall back to [dns.lookup()](https://nodejs.org/dist/latest-v16.x/docs/api/dns.html#dnslookuphostname-options-callback). If this does not work for you, you can hard code the IP address into the configuration like shown below. In that case, Nodemailer would not perform any DNS lookups.
-
-```
-let configOptions = {
-    host: "1.2.3.4",
-    port: 465,
-    secure: true,
-    tls: {
-        // must provide server name, otherwise TLS certificate check will fail
-        servername: "example.com"
-    }
-}
-```
-
-#### I have an issue with TypeScript types
-
-Nodemailer has official support for Node.js only. For anything related to TypeScript, you need to directly contact the authors of the [type definitions](https://www.npmjs.com/package/@types/nodemailer).
-
-#### I have a different problem
-
-If you are having issues with Nodemailer, then the best way to find help would be [Stack Overflow](https://stackoverflow.com/search?q=nodemailer) or revisit the [docs](https://nodemailer.com/about/).
-
-### License
-
-Nodemailer is licensed under the **MIT No Attribution license**
-
----
-
-The Nodemailer logo was designed by [Sven Kristjansen](https://www.behance.net/kristjansen).
Index: de_modules/nodemailer/SECURITY.txt
===================================================================
--- node_modules/nodemailer/SECURITY.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
-
-Contact: mailto:andris@reinman.eu
-Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/5D952A46E1D8C931F6364E01DC6C83F4D584D364
-Preferred-Languages: en, et
------BEGIN PGP SIGNATURE-----
-
-iQIzBAEBCAAdFiEEXZUqRuHYyTH2Nk4B3GyD9NWE02QFAmFDnUgACgkQ3GyD9NWE
-02RqUA/+MM3afmRYq874C7wp+uN6dTMCvUX5g5zqBZ2yKpFr46L+PYvM7o8TMm5h
-hmLT2I1zZmi+xezOL3zHFizaw0tKkZIz9cWl3Jrgs0FLp0zOsSz1xucp9Q2tYM/Q
-vbiP6ys0gbim4tkDGRmZOEiO23s0BuRnmHt7vZg210O+D105Yd8/Ohzbj6PSLBO5
-W1tA7Xw5t0FQ14NNH5+MKyDIKoCX12n0FmrC6qLTXeojf291UgKhCUPda3LIGTmx
-mTXz0y68149Mw+JikRCYP8HfGRY9eA4XZrYXF7Bl2T9OJpKD3JAH+69P3xBw19Gn
-Csaw3twu8P1bxoVGjY4KRrBOp68W8TwZYjWVWbqY6oV8hb/JfrMxa+kaSxRuloFs
-oL6+phrDSPTWdOj2LlEDBJbPOMeDFzIlsBBcJ/JHCEHTvlHl7LoWr3YuWce9PUwl
-4r3JUovvaeuJxLgC0vu3WCB3Jeocsl3SreqNkrVc1IjvkSomn3YGm5nCNAd/2F0V
-exCGRk/8wbkSjAY38GwQ8K/VuFsefWN3L9sVwIMAMu88KFCAN+GzVFiwvyIXehF5
-eogP9mIXzdQ5YReQjUjApOzGz54XnDyv9RJ3sdvMHosLP+IOg+0q5t9agWv6aqSR
-2HzCpiQnH/gmM5NS0AU4Koq/L7IBeLu1B8+61/+BiHgZJJmPdgU=
-=BUZr
------END PGP SIGNATURE-----
Index: de_modules/nodemailer/lib/addressparser/index.js
===================================================================
--- node_modules/nodemailer/lib/addressparser/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,327 +1,0 @@
-'use strict';
-
-/**
- * Converts tokens for a single address into an address object
- *
- * @param {Array} tokens Tokens object
- * @return {Object} Address object
- */
-function _handleAddress(tokens) {
-    let isGroup = false;
-    let state = 'text';
-    let address;
-    let addresses = [];
-    let data = {
-        address: [],
-        comment: [],
-        group: [],
-        text: []
-    };
-    let i;
-    let len;
-
-    // Filter out <addresses>, (comments) and regular text
-    for (i = 0, len = tokens.length; i < len; i++) {
-        let token = tokens[i];
-        let prevToken = i ? tokens[i - 1] : null;
-        if (token.type === 'operator') {
-            switch (token.value) {
-                case '<':
-                    state = 'address';
-                    break;
-                case '(':
-                    state = 'comment';
-                    break;
-                case ':':
-                    state = 'group';
-                    isGroup = true;
-                    break;
-                default:
-                    state = 'text';
-                    break;
-            }
-        } else if (token.value) {
-            if (state === 'address') {
-                // handle use case where unquoted name includes a "<"
-                // Apple Mail truncates everything between an unexpected < and an address
-                // and so will we
-                token.value = token.value.replace(/^[^<]*<\s*/, '');
-            }
-
-            if (prevToken && prevToken.noBreak && data[state].length) {
-                // join values
-                data[state][data[state].length - 1] += token.value;
-            } else {
-                data[state].push(token.value);
-            }
-        }
-    }
-
-    // If there is no text but a comment, replace the two
-    if (!data.text.length && data.comment.length) {
-        data.text = data.comment;
-        data.comment = [];
-    }
-
-    if (isGroup) {
-        // http://tools.ietf.org/html/rfc2822#appendix-A.1.3
-        data.text = data.text.join(' ');
-        addresses.push({
-            name: data.text || (address && address.name),
-            group: data.group.length ? addressparser(data.group.join(',')) : []
-        });
-    } else {
-        // If no address was found, try to detect one from regular text
-        if (!data.address.length && data.text.length) {
-            for (i = data.text.length - 1; i >= 0; i--) {
-                if (data.text[i].match(/^[^@\s]+@[^@\s]+$/)) {
-                    data.address = data.text.splice(i, 1);
-                    break;
-                }
-            }
-
-            let _regexHandler = function (address) {
-                if (!data.address.length) {
-                    data.address = [address.trim()];
-                    return ' ';
-                } else {
-                    return address;
-                }
-            };
-
-            // still no address
-            if (!data.address.length) {
-                for (i = data.text.length - 1; i >= 0; i--) {
-                    // fixed the regex to parse email address correctly when email address has more than one @
-                    data.text[i] = data.text[i].replace(/\s*\b[^@\s]+@[^\s]+\b\s*/, _regexHandler).trim();
-                    if (data.address.length) {
-                        break;
-                    }
-                }
-            }
-        }
-
-        // If there's still is no text but a comment exixts, replace the two
-        if (!data.text.length && data.comment.length) {
-            data.text = data.comment;
-            data.comment = [];
-        }
-
-        // Keep only the first address occurence, push others to regular text
-        if (data.address.length > 1) {
-            data.text = data.text.concat(data.address.splice(1));
-        }
-
-        // Join values with spaces
-        data.text = data.text.join(' ');
-        data.address = data.address.join(' ');
-
-        if (!data.address && isGroup) {
-            return [];
-        } else {
-            address = {
-                address: data.address || data.text || '',
-                name: data.text || data.address || ''
-            };
-
-            if (address.address === address.name) {
-                if ((address.address || '').match(/@/)) {
-                    address.name = '';
-                } else {
-                    address.address = '';
-                }
-            }
-
-            addresses.push(address);
-        }
-    }
-
-    return addresses;
-}
-
-/**
- * Creates a Tokenizer object for tokenizing address field strings
- *
- * @constructor
- * @param {String} str Address field string
- */
-class Tokenizer {
-    constructor(str) {
-        this.str = (str || '').toString();
-        this.operatorCurrent = '';
-        this.operatorExpecting = '';
-        this.node = null;
-        this.escaped = false;
-
-        this.list = [];
-        /**
-         * Operator tokens and which tokens are expected to end the sequence
-         */
-        this.operators = {
-            '"': '"',
-            '(': ')',
-            '<': '>',
-            ',': '',
-            ':': ';',
-            // Semicolons are not a legal delimiter per the RFC2822 grammar other
-            // than for terminating a group, but they are also not valid for any
-            // other use in this context.  Given that some mail clients have
-            // historically allowed the semicolon as a delimiter equivalent to the
-            // comma in their UI, it makes sense to treat them the same as a comma
-            // when used outside of a group.
-            ';': ''
-        };
-    }
-
-    /**
-     * Tokenizes the original input string
-     *
-     * @return {Array} An array of operator|text tokens
-     */
-    tokenize() {
-        let list = [];
-
-        for (let i = 0, len = this.str.length; i < len; i++) {
-            let chr = this.str.charAt(i);
-            let nextChr = i < len - 1 ? this.str.charAt(i + 1) : null;
-            this.checkChar(chr, nextChr);
-        }
-
-        this.list.forEach(node => {
-            node.value = (node.value || '').toString().trim();
-            if (node.value) {
-                list.push(node);
-            }
-        });
-
-        return list;
-    }
-
-    /**
-     * Checks if a character is an operator or text and acts accordingly
-     *
-     * @param {String} chr Character from the address field
-     */
-    checkChar(chr, nextChr) {
-        if (this.escaped) {
-            // ignore next condition blocks
-        } else if (chr === this.operatorExpecting) {
-            this.node = {
-                type: 'operator',
-                value: chr
-            };
-
-            if (nextChr && ![' ', '\t', '\r', '\n', ',', ';'].includes(nextChr)) {
-                this.node.noBreak = true;
-            }
-
-            this.list.push(this.node);
-            this.node = null;
-            this.operatorExpecting = '';
-            this.escaped = false;
-
-            return;
-        } else if (!this.operatorExpecting && chr in this.operators) {
-            this.node = {
-                type: 'operator',
-                value: chr
-            };
-            this.list.push(this.node);
-            this.node = null;
-            this.operatorExpecting = this.operators[chr];
-            this.escaped = false;
-            return;
-        } else if (['"', "'"].includes(this.operatorExpecting) && chr === '\\') {
-            this.escaped = true;
-            return;
-        }
-
-        if (!this.node) {
-            this.node = {
-                type: 'text',
-                value: ''
-            };
-            this.list.push(this.node);
-        }
-
-        if (chr === '\n') {
-            // Convert newlines to spaces. Carriage return is ignored as \r and \n usually
-            // go together anyway and there already is a WS for \n. Lone \r means something is fishy.
-            chr = ' ';
-        }
-
-        if (chr.charCodeAt(0) >= 0x21 || [' ', '\t'].includes(chr)) {
-            // skip command bytes
-            this.node.value += chr;
-        }
-
-        this.escaped = false;
-    }
-}
-
-/**
- * Parses structured e-mail addresses from an address field
- *
- * Example:
- *
- *    'Name <address@domain>'
- *
- * will be converted to
- *
- *     [{name: 'Name', address: 'address@domain'}]
- *
- * @param {String} str Address field
- * @return {Array} An array of address objects
- */
-function addressparser(str, options) {
-    options = options || {};
-
-    let tokenizer = new Tokenizer(str);
-    let tokens = tokenizer.tokenize();
-
-    let addresses = [];
-    let address = [];
-    let parsedAddresses = [];
-
-    tokens.forEach(token => {
-        if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {
-            if (address.length) {
-                addresses.push(address);
-            }
-            address = [];
-        } else {
-            address.push(token);
-        }
-    });
-
-    if (address.length) {
-        addresses.push(address);
-    }
-
-    addresses.forEach(address => {
-        address = _handleAddress(address);
-        if (address.length) {
-            parsedAddresses = parsedAddresses.concat(address);
-        }
-    });
-
-    if (options.flatten) {
-        let addresses = [];
-        let walkAddressList = list => {
-            list.forEach(address => {
-                if (address.group) {
-                    return walkAddressList(address.group);
-                } else {
-                    addresses.push(address);
-                }
-            });
-        };
-        walkAddressList(parsedAddresses);
-        return addresses;
-    }
-
-    return parsedAddresses;
-}
-
-// expose to the world
-module.exports = addressparser;
Index: de_modules/nodemailer/lib/base64/index.js
===================================================================
--- node_modules/nodemailer/lib/base64/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,142 +1,0 @@
-'use strict';
-
-const Transform = require('stream').Transform;
-
-/**
- * Encodes a Buffer into a base64 encoded string
- *
- * @param {Buffer} buffer Buffer to convert
- * @returns {String} base64 encoded string
- */
-function encode(buffer) {
-    if (typeof buffer === 'string') {
-        buffer = Buffer.from(buffer, 'utf-8');
-    }
-
-    return buffer.toString('base64');
-}
-
-/**
- * Adds soft line breaks to a base64 string
- *
- * @param {String} str base64 encoded string that might need line wrapping
- * @param {Number} [lineLength=76] Maximum allowed length for a line
- * @returns {String} Soft-wrapped base64 encoded string
- */
-function wrap(str, lineLength) {
-    str = (str || '').toString();
-    lineLength = lineLength || 76;
-
-    if (str.length <= lineLength) {
-        return str;
-    }
-
-    let result = [];
-    let pos = 0;
-    let chunkLength = lineLength * 1024;
-    while (pos < str.length) {
-        let wrappedLines = str
-            .substr(pos, chunkLength)
-            .replace(new RegExp('.{' + lineLength + '}', 'g'), '$&\r\n')
-            .trim();
-        result.push(wrappedLines);
-        pos += chunkLength;
-    }
-
-    return result.join('\r\n').trim();
-}
-
-/**
- * Creates a transform stream for encoding data to base64 encoding
- *
- * @constructor
- * @param {Object} options Stream options
- * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping
- */
-class Encoder extends Transform {
-    constructor(options) {
-        super();
-        // init Transform
-        this.options = options || {};
-
-        if (this.options.lineLength !== false) {
-            this.options.lineLength = this.options.lineLength || 76;
-        }
-
-        this._curLine = '';
-        this._remainingBytes = false;
-
-        this.inputBytes = 0;
-        this.outputBytes = 0;
-    }
-
-    _transform(chunk, encoding, done) {
-        if (encoding !== 'buffer') {
-            chunk = Buffer.from(chunk, encoding);
-        }
-
-        if (!chunk || !chunk.length) {
-            return setImmediate(done);
-        }
-
-        this.inputBytes += chunk.length;
-
-        if (this._remainingBytes && this._remainingBytes.length) {
-            chunk = Buffer.concat([this._remainingBytes, chunk], this._remainingBytes.length + chunk.length);
-            this._remainingBytes = false;
-        }
-
-        if (chunk.length % 3) {
-            this._remainingBytes = chunk.slice(chunk.length - (chunk.length % 3));
-            chunk = chunk.slice(0, chunk.length - (chunk.length % 3));
-        } else {
-            this._remainingBytes = false;
-        }
-
-        let b64 = this._curLine + encode(chunk);
-
-        if (this.options.lineLength) {
-            b64 = wrap(b64, this.options.lineLength);
-
-            // remove last line as it is still most probably incomplete
-            let lastLF = b64.lastIndexOf('\n');
-            if (lastLF < 0) {
-                this._curLine = b64;
-                b64 = '';
-            } else if (lastLF === b64.length - 1) {
-                this._curLine = '';
-            } else {
-                this._curLine = b64.substr(lastLF + 1);
-                b64 = b64.substr(0, lastLF + 1);
-            }
-        }
-
-        if (b64) {
-            this.outputBytes += b64.length;
-            this.push(Buffer.from(b64, 'ascii'));
-        }
-
-        setImmediate(done);
-    }
-
-    _flush(done) {
-        if (this._remainingBytes && this._remainingBytes.length) {
-            this._curLine += encode(this._remainingBytes);
-        }
-
-        if (this._curLine) {
-            this._curLine = wrap(this._curLine, this.options.lineLength);
-            this.outputBytes += this._curLine.length;
-            this.push(this._curLine, 'ascii');
-            this._curLine = '';
-        }
-        done();
-    }
-}
-
-// expose to the world
-module.exports = {
-    encode,
-    wrap,
-    Encoder
-};
Index: de_modules/nodemailer/lib/dkim/index.js
===================================================================
--- node_modules/nodemailer/lib/dkim/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,251 +1,0 @@
-'use strict';
-
-// FIXME:
-// replace this Transform mess with a method that pipes input argument to output argument
-
-const MessageParser = require('./message-parser');
-const RelaxedBody = require('./relaxed-body');
-const sign = require('./sign');
-const PassThrough = require('stream').PassThrough;
-const fs = require('fs');
-const path = require('path');
-const crypto = require('crypto');
-
-const DKIM_ALGO = 'sha256';
-const MAX_MESSAGE_SIZE = 128 * 1024; // buffer messages larger than this to disk
-
-/*
-// Usage:
-
-let dkim = new DKIM({
-    domainName: 'example.com',
-    keySelector: 'key-selector',
-    privateKey,
-    cacheDir: '/tmp'
-});
-dkim.sign(input).pipe(process.stdout);
-
-// Where inputStream is a rfc822 message (either a stream, string or Buffer)
-// and outputStream is a DKIM signed rfc822 message
-*/
-
-class DKIMSigner {
-    constructor(options, keys, input, output) {
-        this.options = options || {};
-        this.keys = keys;
-
-        this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;
-        this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;
-
-        this.cacheDir = this.options.cacheDir || false;
-
-        this.chunks = [];
-        this.chunklen = 0;
-        this.readPos = 0;
-        this.cachePath = this.cacheDir ? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex')) : false;
-        this.cache = false;
-
-        this.headers = false;
-        this.bodyHash = false;
-        this.parser = false;
-        this.relaxedBody = false;
-
-        this.input = input;
-        this.output = output;
-        this.output.usingCache = false;
-
-        this.hasErrored = false;
-
-        this.input.on('error', err => {
-            this.hasErrored = true;
-            this.cleanup();
-            output.emit('error', err);
-        });
-    }
-
-    cleanup() {
-        if (!this.cache || !this.cachePath) {
-            return;
-        }
-        fs.unlink(this.cachePath, () => false);
-    }
-
-    createReadCache() {
-        // pipe remainings to cache file
-        this.cache = fs.createReadStream(this.cachePath);
-        this.cache.once('error', err => {
-            this.cleanup();
-            this.output.emit('error', err);
-        });
-        this.cache.once('close', () => {
-            this.cleanup();
-        });
-        this.cache.pipe(this.output);
-    }
-
-    sendNextChunk() {
-        if (this.hasErrored) {
-            return;
-        }
-
-        if (this.readPos >= this.chunks.length) {
-            if (!this.cache) {
-                return this.output.end();
-            }
-            return this.createReadCache();
-        }
-        let chunk = this.chunks[this.readPos++];
-        if (this.output.write(chunk) === false) {
-            return this.output.once('drain', () => {
-                this.sendNextChunk();
-            });
-        }
-        setImmediate(() => this.sendNextChunk());
-    }
-
-    sendSignedOutput() {
-        let keyPos = 0;
-        let signNextKey = () => {
-            if (keyPos >= this.keys.length) {
-                this.output.write(this.parser.rawHeaders);
-                return setImmediate(() => this.sendNextChunk());
-            }
-            let key = this.keys[keyPos++];
-            let dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {
-                domainName: key.domainName,
-                keySelector: key.keySelector,
-                privateKey: key.privateKey,
-                headerFieldNames: this.options.headerFieldNames,
-                skipFields: this.options.skipFields
-            });
-            if (dkimField) {
-                this.output.write(Buffer.from(dkimField + '\r\n'));
-            }
-            return setImmediate(signNextKey);
-        };
-
-        if (this.bodyHash && this.headers) {
-            return signNextKey();
-        }
-
-        this.output.write(this.parser.rawHeaders);
-        this.sendNextChunk();
-    }
-
-    createWriteCache() {
-        this.output.usingCache = true;
-        // pipe remainings to cache file
-        this.cache = fs.createWriteStream(this.cachePath);
-        this.cache.once('error', err => {
-            this.cleanup();
-            // drain input
-            this.relaxedBody.unpipe(this.cache);
-            this.relaxedBody.on('readable', () => {
-                while (this.relaxedBody.read() !== null) {
-                    // do nothing
-                }
-            });
-            this.hasErrored = true;
-            // emit error
-            this.output.emit('error', err);
-        });
-        this.cache.once('close', () => {
-            this.sendSignedOutput();
-        });
-        this.relaxedBody.removeAllListeners('readable');
-        this.relaxedBody.pipe(this.cache);
-    }
-
-    signStream() {
-        this.parser = new MessageParser();
-        this.relaxedBody = new RelaxedBody({
-            hashAlgo: this.hashAlgo
-        });
-
-        this.parser.on('headers', value => {
-            this.headers = value;
-        });
-
-        this.relaxedBody.on('hash', value => {
-            this.bodyHash = value;
-        });
-
-        this.relaxedBody.on('readable', () => {
-            let chunk;
-            if (this.cache) {
-                return;
-            }
-            while ((chunk = this.relaxedBody.read()) !== null) {
-                this.chunks.push(chunk);
-                this.chunklen += chunk.length;
-                if (this.chunklen >= this.cacheTreshold && this.cachePath) {
-                    return this.createWriteCache();
-                }
-            }
-        });
-
-        this.relaxedBody.on('end', () => {
-            if (this.cache) {
-                return;
-            }
-            this.sendSignedOutput();
-        });
-
-        this.parser.pipe(this.relaxedBody);
-        setImmediate(() => this.input.pipe(this.parser));
-    }
-}
-
-class DKIM {
-    constructor(options) {
-        this.options = options || {};
-        this.keys = [].concat(
-            this.options.keys || {
-                domainName: options.domainName,
-                keySelector: options.keySelector,
-                privateKey: options.privateKey
-            }
-        );
-    }
-
-    sign(input, extraOptions) {
-        let output = new PassThrough();
-        let inputStream = input;
-        let writeValue = false;
-
-        if (Buffer.isBuffer(input)) {
-            writeValue = input;
-            inputStream = new PassThrough();
-        } else if (typeof input === 'string') {
-            writeValue = Buffer.from(input);
-            inputStream = new PassThrough();
-        }
-
-        let options = this.options;
-        if (extraOptions && Object.keys(extraOptions).length) {
-            options = {};
-            Object.keys(this.options || {}).forEach(key => {
-                options[key] = this.options[key];
-            });
-            Object.keys(extraOptions || {}).forEach(key => {
-                if (!(key in options)) {
-                    options[key] = extraOptions[key];
-                }
-            });
-        }
-
-        let signer = new DKIMSigner(options, this.keys, inputStream, output);
-        setImmediate(() => {
-            signer.signStream();
-            if (writeValue) {
-                setImmediate(() => {
-                    inputStream.end(writeValue);
-                });
-            }
-        });
-
-        return output;
-    }
-}
-
-module.exports = DKIM;
Index: de_modules/nodemailer/lib/dkim/message-parser.js
===================================================================
--- node_modules/nodemailer/lib/dkim/message-parser.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,155 +1,0 @@
-'use strict';
-
-const Transform = require('stream').Transform;
-
-/**
- * MessageParser instance is a transform stream that separates message headers
- * from the rest of the body. Headers are emitted with the 'headers' event. Message
- * body is passed on as the resulting stream.
- */
-class MessageParser extends Transform {
-    constructor(options) {
-        super(options);
-        this.lastBytes = Buffer.alloc(4);
-        this.headersParsed = false;
-        this.headerBytes = 0;
-        this.headerChunks = [];
-        this.rawHeaders = false;
-        this.bodySize = 0;
-    }
-
-    /**
-     * Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries
-     *
-     * @param {Buffer} data Next data chunk from the stream
-     */
-    updateLastBytes(data) {
-        let lblen = this.lastBytes.length;
-        let nblen = Math.min(data.length, lblen);
-
-        // shift existing bytes
-        for (let i = 0, len = lblen - nblen; i < len; i++) {
-            this.lastBytes[i] = this.lastBytes[i + nblen];
-        }
-
-        // add new bytes
-        for (let i = 1; i <= nblen; i++) {
-            this.lastBytes[lblen - i] = data[data.length - i];
-        }
-    }
-
-    /**
-     * Finds and removes message headers from the remaining body. We want to keep
-     * headers separated until final delivery to be able to modify these
-     *
-     * @param {Buffer} data Next chunk of data
-     * @return {Boolean} Returns true if headers are already found or false otherwise
-     */
-    checkHeaders(data) {
-        if (this.headersParsed) {
-            return true;
-        }
-
-        let lblen = this.lastBytes.length;
-        let headerPos = 0;
-        this.curLinePos = 0;
-        for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {
-            let chr;
-            if (i < lblen) {
-                chr = this.lastBytes[i];
-            } else {
-                chr = data[i - lblen];
-            }
-            if (chr === 0x0a && i) {
-                let pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];
-                let pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;
-                if (pr1 === 0x0a) {
-                    this.headersParsed = true;
-                    headerPos = i - lblen + 1;
-                    this.headerBytes += headerPos;
-                    break;
-                } else if (pr1 === 0x0d && pr2 === 0x0a) {
-                    this.headersParsed = true;
-                    headerPos = i - lblen + 1;
-                    this.headerBytes += headerPos;
-                    break;
-                }
-            }
-        }
-
-        if (this.headersParsed) {
-            this.headerChunks.push(data.slice(0, headerPos));
-            this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);
-            this.headerChunks = null;
-            this.emit('headers', this.parseHeaders());
-            if (data.length - 1 > headerPos) {
-                let chunk = data.slice(headerPos);
-                this.bodySize += chunk.length;
-                // this would be the first chunk of data sent downstream
-                setImmediate(() => this.push(chunk));
-            }
-            return false;
-        } else {
-            this.headerBytes += data.length;
-            this.headerChunks.push(data);
-        }
-
-        // store last 4 bytes to catch header break
-        this.updateLastBytes(data);
-
-        return false;
-    }
-
-    _transform(chunk, encoding, callback) {
-        if (!chunk || !chunk.length) {
-            return callback();
-        }
-
-        if (typeof chunk === 'string') {
-            chunk = Buffer.from(chunk, encoding);
-        }
-
-        let headersFound;
-
-        try {
-            headersFound = this.checkHeaders(chunk);
-        } catch (E) {
-            return callback(E);
-        }
-
-        if (headersFound) {
-            this.bodySize += chunk.length;
-            this.push(chunk);
-        }
-
-        setImmediate(callback);
-    }
-
-    _flush(callback) {
-        if (this.headerChunks) {
-            let chunk = Buffer.concat(this.headerChunks, this.headerBytes);
-            this.bodySize += chunk.length;
-            this.push(chunk);
-            this.headerChunks = null;
-        }
-        callback();
-    }
-
-    parseHeaders() {
-        let lines = (this.rawHeaders || '').toString().split(/\r?\n/);
-        for (let i = lines.length - 1; i > 0; i--) {
-            if (/^\s/.test(lines[i])) {
-                lines[i - 1] += '\n' + lines[i];
-                lines.splice(i, 1);
-            }
-        }
-        return lines
-            .filter(line => line.trim())
-            .map(line => ({
-                key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),
-                line
-            }));
-    }
-}
-
-module.exports = MessageParser;
Index: de_modules/nodemailer/lib/dkim/relaxed-body.js
===================================================================
--- node_modules/nodemailer/lib/dkim/relaxed-body.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,154 +1,0 @@
-'use strict';
-
-// streams through a message body and calculates relaxed body hash
-
-const Transform = require('stream').Transform;
-const crypto = require('crypto');
-
-class RelaxedBody extends Transform {
-    constructor(options) {
-        super();
-        options = options || {};
-        this.chunkBuffer = [];
-        this.chunkBufferLen = 0;
-        this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');
-        this.remainder = '';
-        this.byteLength = 0;
-
-        this.debug = options.debug;
-        this._debugBody = options.debug ? [] : false;
-    }
-
-    updateHash(chunk) {
-        let bodyStr;
-
-        // find next remainder
-        let nextRemainder = '';
-
-        // This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line
-        // If we get another chunk that does not match this description then we can restore the previously processed data
-        let state = 'file';
-        for (let i = chunk.length - 1; i >= 0; i--) {
-            let c = chunk[i];
-
-            if (state === 'file' && (c === 0x0a || c === 0x0d)) {
-                // do nothing, found \n or \r at the end of chunk, stil end of file
-            } else if (state === 'file' && (c === 0x09 || c === 0x20)) {
-                // switch to line ending mode, this is the last non-empty line
-                state = 'line';
-            } else if (state === 'line' && (c === 0x09 || c === 0x20)) {
-                // do nothing, found ' ' or \t at the end of line, keep processing the last non-empty line
-            } else if (state === 'file' || state === 'line') {
-                // non line/file ending character found, switch to body mode
-                state = 'body';
-                if (i === chunk.length - 1) {
-                    // final char is not part of line end or file end, so do nothing
-                    break;
-                }
-            }
-
-            if (i === 0) {
-                // reached to the beginning of the chunk, check if it is still about the ending
-                // and if the remainder also matches
-                if (
-                    (state === 'file' && (!this.remainder || /[\r\n]$/.test(this.remainder))) ||
-                    (state === 'line' && (!this.remainder || /[ \t]$/.test(this.remainder)))
-                ) {
-                    // keep everything
-                    this.remainder += chunk.toString('binary');
-                    return;
-                } else if (state === 'line' || state === 'file') {
-                    // process existing remainder as normal line but store the current chunk
-                    nextRemainder = chunk.toString('binary');
-                    chunk = false;
-                    break;
-                }
-            }
-
-            if (state !== 'body') {
-                continue;
-            }
-
-            // reached first non ending byte
-            nextRemainder = chunk.slice(i + 1).toString('binary');
-            chunk = chunk.slice(0, i + 1);
-            break;
-        }
-
-        let needsFixing = !!this.remainder;
-        if (chunk && !needsFixing) {
-            // check if we even need to change anything
-            for (let i = 0, len = chunk.length; i < len; i++) {
-                if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {
-                    // missing \r before \n
-                    needsFixing = true;
-                    break;
-                } else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {
-                    // trailing WSP found
-                    needsFixing = true;
-                    break;
-                } else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {
-                    // multiple spaces found, needs to be replaced with just one
-                    needsFixing = true;
-                    break;
-                } else if (chunk[i] === 0x09) {
-                    // TAB found, needs to be replaced with a space
-                    needsFixing = true;
-                    break;
-                }
-            }
-        }
-
-        if (needsFixing) {
-            bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');
-            this.remainder = nextRemainder;
-            bodyStr = bodyStr
-                .replace(/\r?\n/g, '\n') // use js line endings
-                .replace(/[ \t]*$/gm, '') // remove line endings, rtrim
-                .replace(/[ \t]+/gm, ' ') // single spaces
-                .replace(/\n/g, '\r\n'); // restore rfc822 line endings
-            chunk = Buffer.from(bodyStr, 'binary');
-        } else if (nextRemainder) {
-            this.remainder = nextRemainder;
-        }
-
-        if (this.debug) {
-            this._debugBody.push(chunk);
-        }
-        this.bodyHash.update(chunk);
-    }
-
-    _transform(chunk, encoding, callback) {
-        if (!chunk || !chunk.length) {
-            return callback();
-        }
-
-        if (typeof chunk === 'string') {
-            chunk = Buffer.from(chunk, encoding);
-        }
-
-        this.updateHash(chunk);
-
-        this.byteLength += chunk.length;
-        this.push(chunk);
-        callback();
-    }
-
-    _flush(callback) {
-        // generate final hash and emit it
-        if (/[\r\n]$/.test(this.remainder) && this.byteLength > 2) {
-            // add terminating line end
-            this.bodyHash.update(Buffer.from('\r\n'));
-        }
-        if (!this.byteLength) {
-            // emit empty line buffer to keep the stream flowing
-            this.push(Buffer.from('\r\n'));
-            // this.bodyHash.update(Buffer.from('\r\n'));
-        }
-
-        this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);
-        callback();
-    }
-}
-
-module.exports = RelaxedBody;
Index: de_modules/nodemailer/lib/dkim/sign.js
===================================================================
--- node_modules/nodemailer/lib/dkim/sign.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,117 +1,0 @@
-'use strict';
-
-const punycode = require('../punycode');
-const mimeFuncs = require('../mime-funcs');
-const crypto = require('crypto');
-
-/**
- * Returns DKIM signature header line
- *
- * @param {Object} headers Parsed headers object from MessageParser
- * @param {String} bodyHash Base64 encoded hash of the message
- * @param {Object} options DKIM options
- * @param {String} options.domainName Domain name to be signed for
- * @param {String} options.keySelector DKIM key selector to use
- * @param {String} options.privateKey DKIM private key to use
- * @return {String} Complete header line
- */
-
-module.exports = (headers, hashAlgo, bodyHash, options) => {
-    options = options || {};
-
-    // all listed fields from RFC4871 #5.5
-    let defaultFieldNames =
-        'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +
-        'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +
-        'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +
-        'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +
-        'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +
-        'List-Owner:List-Archive';
-
-    let fieldNames = options.headerFieldNames || defaultFieldNames;
-
-    let canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);
-    let dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);
-
-    let signer, signature;
-
-    canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);
-
-    signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());
-    signer.update(canonicalizedHeaderData.headers);
-    try {
-        signature = signer.sign(options.privateKey, 'base64');
-    } catch (E) {
-        return false;
-    }
-
-    return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\r?\n|\r))/g, '$&\r\n ').trim();
-};
-
-module.exports.relaxedHeaders = relaxedHeaders;
-
-function generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {
-    let dkim = [
-        'v=1',
-        'a=rsa-' + hashAlgo,
-        'c=relaxed/relaxed',
-        'd=' + punycode.toASCII(domainName),
-        'q=dns/txt',
-        's=' + keySelector,
-        'bh=' + bodyHash,
-        'h=' + fieldNames
-    ].join('; ');
-
-    return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\r\n b=';
-}
-
-function relaxedHeaders(headers, fieldNames, skipFields) {
-    let includedFields = new Set();
-    let skip = new Set();
-    let headerFields = new Map();
-
-    (skipFields || '')
-        .toLowerCase()
-        .split(':')
-        .forEach(field => {
-            skip.add(field.trim());
-        });
-
-    (fieldNames || '')
-        .toLowerCase()
-        .split(':')
-        .filter(field => !skip.has(field.trim()))
-        .forEach(field => {
-            includedFields.add(field.trim());
-        });
-
-    for (let i = headers.length - 1; i >= 0; i--) {
-        let line = headers[i];
-        // only include the first value from bottom to top
-        if (includedFields.has(line.key) && !headerFields.has(line.key)) {
-            headerFields.set(line.key, relaxedHeaderLine(line.line));
-        }
-    }
-
-    let headersList = [];
-    let fields = [];
-    includedFields.forEach(field => {
-        if (headerFields.has(field)) {
-            fields.push(field);
-            headersList.push(field + ':' + headerFields.get(field));
-        }
-    });
-
-    return {
-        headers: headersList.join('\r\n') + '\r\n',
-        fieldNames: fields.join(':')
-    };
-}
-
-function relaxedHeaderLine(line) {
-    return line
-        .substr(line.indexOf(':') + 1)
-        .replace(/\r?\n/g, '')
-        .replace(/\s+/g, ' ')
-        .trim();
-}
Index: de_modules/nodemailer/lib/fetch/cookies.js
===================================================================
--- node_modules/nodemailer/lib/fetch/cookies.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,281 +1,0 @@
-'use strict';
-
-// module to handle cookies
-
-const urllib = require('url');
-
-const SESSION_TIMEOUT = 1800; // 30 min
-
-/**
- * Creates a biskviit cookie jar for managing cookie values in memory
- *
- * @constructor
- * @param {Object} [options] Optional options object
- */
-class Cookies {
-    constructor(options) {
-        this.options = options || {};
-        this.cookies = [];
-    }
-
-    /**
-     * Stores a cookie string to the cookie storage
-     *
-     * @param {String} cookieStr Value from the 'Set-Cookie:' header
-     * @param {String} url Current URL
-     */
-    set(cookieStr, url) {
-        let urlparts = urllib.parse(url || '');
-        let cookie = this.parse(cookieStr);
-        let domain;
-
-        if (cookie.domain) {
-            domain = cookie.domain.replace(/^\./, '');
-
-            // do not allow cross origin cookies
-            if (
-                // can't be valid if the requested domain is shorter than current hostname
-                urlparts.hostname.length < domain.length ||
-                // prefix domains with dot to be sure that partial matches are not used
-                ('.' + urlparts.hostname).substr(-domain.length + 1) !== '.' + domain
-            ) {
-                cookie.domain = urlparts.hostname;
-            }
-        } else {
-            cookie.domain = urlparts.hostname;
-        }
-
-        if (!cookie.path) {
-            cookie.path = this.getPath(urlparts.pathname);
-        }
-
-        // if no expire date, then use sessionTimeout value
-        if (!cookie.expires) {
-            cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);
-        }
-
-        return this.add(cookie);
-    }
-
-    /**
-     * Returns cookie string for the 'Cookie:' header.
-     *
-     * @param {String} url URL to check for
-     * @returns {String} Cookie header or empty string if no matches were found
-     */
-    get(url) {
-        return this.list(url)
-            .map(cookie => cookie.name + '=' + cookie.value)
-            .join('; ');
-    }
-
-    /**
-     * Lists all valied cookie objects for the specified URL
-     *
-     * @param {String} url URL to check for
-     * @returns {Array} An array of cookie objects
-     */
-    list(url) {
-        let result = [];
-        let i;
-        let cookie;
-
-        for (i = this.cookies.length - 1; i >= 0; i--) {
-            cookie = this.cookies[i];
-
-            if (this.isExpired(cookie)) {
-                this.cookies.splice(i, i);
-                continue;
-            }
-
-            if (this.match(cookie, url)) {
-                result.unshift(cookie);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Parses cookie string from the 'Set-Cookie:' header
-     *
-     * @param {String} cookieStr String from the 'Set-Cookie:' header
-     * @returns {Object} Cookie object
-     */
-    parse(cookieStr) {
-        let cookie = {};
-
-        (cookieStr || '')
-            .toString()
-            .split(';')
-            .forEach(cookiePart => {
-                let valueParts = cookiePart.split('=');
-                let key = valueParts.shift().trim().toLowerCase();
-                let value = valueParts.join('=').trim();
-                let domain;
-
-                if (!key) {
-                    // skip empty parts
-                    return;
-                }
-
-                switch (key) {
-                    case 'expires':
-                        value = new Date(value);
-                        // ignore date if can not parse it
-                        if (value.toString() !== 'Invalid Date') {
-                            cookie.expires = value;
-                        }
-                        break;
-
-                    case 'path':
-                        cookie.path = value;
-                        break;
-
-                    case 'domain':
-                        domain = value.toLowerCase();
-                        if (domain.length && domain.charAt(0) !== '.') {
-                            domain = '.' + domain; // ensure preceeding dot for user set domains
-                        }
-                        cookie.domain = domain;
-                        break;
-
-                    case 'max-age':
-                        cookie.expires = new Date(Date.now() + (Number(value) || 0) * 1000);
-                        break;
-
-                    case 'secure':
-                        cookie.secure = true;
-                        break;
-
-                    case 'httponly':
-                        cookie.httponly = true;
-                        break;
-
-                    default:
-                        if (!cookie.name) {
-                            cookie.name = key;
-                            cookie.value = value;
-                        }
-                }
-            });
-
-        return cookie;
-    }
-
-    /**
-     * Checks if a cookie object is valid for a specified URL
-     *
-     * @param {Object} cookie Cookie object
-     * @param {String} url URL to check for
-     * @returns {Boolean} true if cookie is valid for specifiec URL
-     */
-    match(cookie, url) {
-        let urlparts = urllib.parse(url || '');
-
-        // check if hostname matches
-        // .foo.com also matches subdomains, foo.com does not
-        if (
-            urlparts.hostname !== cookie.domain &&
-            (cookie.domain.charAt(0) !== '.' || ('.' + urlparts.hostname).substr(-cookie.domain.length) !== cookie.domain)
-        ) {
-            return false;
-        }
-
-        // check if path matches
-        let path = this.getPath(urlparts.pathname);
-        if (path.substr(0, cookie.path.length) !== cookie.path) {
-            return false;
-        }
-
-        // check secure argument
-        if (cookie.secure && urlparts.protocol !== 'https:') {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Adds (or updates/removes if needed) a cookie object to the cookie storage
-     *
-     * @param {Object} cookie Cookie value to be stored
-     */
-    add(cookie) {
-        let i;
-        let len;
-
-        // nothing to do here
-        if (!cookie || !cookie.name) {
-            return false;
-        }
-
-        // overwrite if has same params
-        for (i = 0, len = this.cookies.length; i < len; i++) {
-            if (this.compare(this.cookies[i], cookie)) {
-                // check if the cookie needs to be removed instead
-                if (this.isExpired(cookie)) {
-                    this.cookies.splice(i, 1); // remove expired/unset cookie
-                    return false;
-                }
-
-                this.cookies[i] = cookie;
-                return true;
-            }
-        }
-
-        // add as new if not already expired
-        if (!this.isExpired(cookie)) {
-            this.cookies.push(cookie);
-        }
-
-        return true;
-    }
-
-    /**
-     * Checks if two cookie objects are the same
-     *
-     * @param {Object} a Cookie to check against
-     * @param {Object} b Cookie to check against
-     * @returns {Boolean} True, if the cookies are the same
-     */
-    compare(a, b) {
-        return a.name === b.name && a.path === b.path && a.domain === b.domain && a.secure === b.secure && a.httponly === a.httponly;
-    }
-
-    /**
-     * Checks if a cookie is expired
-     *
-     * @param {Object} cookie Cookie object to check against
-     * @returns {Boolean} True, if the cookie is expired
-     */
-    isExpired(cookie) {
-        return (cookie.expires && cookie.expires < new Date()) || !cookie.value;
-    }
-
-    /**
-     * Returns normalized cookie path for an URL path argument
-     *
-     * @param {String} pathname
-     * @returns {String} Normalized path
-     */
-    getPath(pathname) {
-        let path = (pathname || '/').split('/');
-        path.pop(); // remove filename part
-        path = path.join('/').trim();
-
-        // ensure path prefix /
-        if (path.charAt(0) !== '/') {
-            path = '/' + path;
-        }
-
-        // ensure path suffix /
-        if (path.substr(-1) !== '/') {
-            path += '/';
-        }
-
-        return path;
-    }
-}
-
-module.exports = Cookies;
Index: de_modules/nodemailer/lib/fetch/index.js
===================================================================
--- node_modules/nodemailer/lib/fetch/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,274 +1,0 @@
-'use strict';
-
-const http = require('http');
-const https = require('https');
-const urllib = require('url');
-const zlib = require('zlib');
-const PassThrough = require('stream').PassThrough;
-const Cookies = require('./cookies');
-const packageData = require('../../package.json');
-const net = require('net');
-
-const MAX_REDIRECTS = 5;
-
-module.exports = function (url, options) {
-    return nmfetch(url, options);
-};
-
-module.exports.Cookies = Cookies;
-
-function nmfetch(url, options) {
-    options = options || {};
-
-    options.fetchRes = options.fetchRes || new PassThrough();
-    options.cookies = options.cookies || new Cookies();
-    options.redirects = options.redirects || 0;
-    options.maxRedirects = isNaN(options.maxRedirects) ? MAX_REDIRECTS : options.maxRedirects;
-
-    if (options.cookie) {
-        [].concat(options.cookie || []).forEach(cookie => {
-            options.cookies.set(cookie, url);
-        });
-        options.cookie = false;
-    }
-
-    let fetchRes = options.fetchRes;
-    let parsed = urllib.parse(url);
-    let method = (options.method || '').toString().trim().toUpperCase() || 'GET';
-    let finished = false;
-    let cookies;
-    let body;
-
-    let handler = parsed.protocol === 'https:' ? https : http;
-
-    let headers = {
-        'accept-encoding': 'gzip,deflate',
-        'user-agent': 'nodemailer/' + packageData.version
-    };
-
-    Object.keys(options.headers || {}).forEach(key => {
-        headers[key.toLowerCase().trim()] = options.headers[key];
-    });
-
-    if (options.userAgent) {
-        headers['user-agent'] = options.userAgent;
-    }
-
-    if (parsed.auth) {
-        headers.Authorization = 'Basic ' + Buffer.from(parsed.auth).toString('base64');
-    }
-
-    if ((cookies = options.cookies.get(url))) {
-        headers.cookie = cookies;
-    }
-
-    if (options.body) {
-        if (options.contentType !== false) {
-            headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';
-        }
-
-        if (typeof options.body.pipe === 'function') {
-            // it's a stream
-            headers['Transfer-Encoding'] = 'chunked';
-            body = options.body;
-            body.on('error', err => {
-                if (finished) {
-                    return;
-                }
-                finished = true;
-                err.type = 'FETCH';
-                err.sourceUrl = url;
-                fetchRes.emit('error', err);
-            });
-        } else {
-            if (options.body instanceof Buffer) {
-                body = options.body;
-            } else if (typeof options.body === 'object') {
-                try {
-                    // encodeURIComponent can fail on invalid input (partial emoji etc.)
-                    body = Buffer.from(
-                        Object.keys(options.body)
-                            .map(key => {
-                                let value = options.body[key].toString().trim();
-                                return encodeURIComponent(key) + '=' + encodeURIComponent(value);
-                            })
-                            .join('&')
-                    );
-                } catch (E) {
-                    if (finished) {
-                        return;
-                    }
-                    finished = true;
-                    E.type = 'FETCH';
-                    E.sourceUrl = url;
-                    fetchRes.emit('error', E);
-                    return;
-                }
-            } else {
-                body = Buffer.from(options.body.toString().trim());
-            }
-
-            headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';
-            headers['Content-Length'] = body.length;
-        }
-        // if method is not provided, use POST instead of GET
-        method = (options.method || '').toString().trim().toUpperCase() || 'POST';
-    }
-
-    let req;
-    let reqOptions = {
-        method,
-        host: parsed.hostname,
-        path: parsed.path,
-        port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,
-        headers,
-        rejectUnauthorized: false,
-        agent: false
-    };
-
-    if (options.tls) {
-        Object.keys(options.tls).forEach(key => {
-            reqOptions[key] = options.tls[key];
-        });
-    }
-
-    if (parsed.protocol === 'https:' && parsed.hostname && parsed.hostname !== reqOptions.host && !net.isIP(parsed.hostname) && !reqOptions.servername) {
-        reqOptions.servername = parsed.hostname;
-    }
-
-    try {
-        req = handler.request(reqOptions);
-    } catch (E) {
-        finished = true;
-        setImmediate(() => {
-            E.type = 'FETCH';
-            E.sourceUrl = url;
-            fetchRes.emit('error', E);
-        });
-        return fetchRes;
-    }
-
-    if (options.timeout) {
-        req.setTimeout(options.timeout, () => {
-            if (finished) {
-                return;
-            }
-            finished = true;
-            req.abort();
-            let err = new Error('Request Timeout');
-            err.type = 'FETCH';
-            err.sourceUrl = url;
-            fetchRes.emit('error', err);
-        });
-    }
-
-    req.on('error', err => {
-        if (finished) {
-            return;
-        }
-        finished = true;
-        err.type = 'FETCH';
-        err.sourceUrl = url;
-        fetchRes.emit('error', err);
-    });
-
-    req.on('response', res => {
-        let inflate;
-
-        if (finished) {
-            return;
-        }
-
-        switch (res.headers['content-encoding']) {
-            case 'gzip':
-            case 'deflate':
-                inflate = zlib.createUnzip();
-                break;
-        }
-
-        if (res.headers['set-cookie']) {
-            [].concat(res.headers['set-cookie'] || []).forEach(cookie => {
-                options.cookies.set(cookie, url);
-            });
-        }
-
-        if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {
-            // redirect
-            options.redirects++;
-            if (options.redirects > options.maxRedirects) {
-                finished = true;
-                let err = new Error('Maximum redirect count exceeded');
-                err.type = 'FETCH';
-                err.sourceUrl = url;
-                fetchRes.emit('error', err);
-                req.abort();
-                return;
-            }
-            // redirect does not include POST body
-            options.method = 'GET';
-            options.body = false;
-            return nmfetch(urllib.resolve(url, res.headers.location), options);
-        }
-
-        fetchRes.statusCode = res.statusCode;
-        fetchRes.headers = res.headers;
-
-        if (res.statusCode >= 300 && !options.allowErrorResponse) {
-            finished = true;
-            let err = new Error('Invalid status code ' + res.statusCode);
-            err.type = 'FETCH';
-            err.sourceUrl = url;
-            fetchRes.emit('error', err);
-            req.abort();
-            return;
-        }
-
-        res.on('error', err => {
-            if (finished) {
-                return;
-            }
-            finished = true;
-            err.type = 'FETCH';
-            err.sourceUrl = url;
-            fetchRes.emit('error', err);
-            req.abort();
-        });
-
-        if (inflate) {
-            res.pipe(inflate).pipe(fetchRes);
-            inflate.on('error', err => {
-                if (finished) {
-                    return;
-                }
-                finished = true;
-                err.type = 'FETCH';
-                err.sourceUrl = url;
-                fetchRes.emit('error', err);
-                req.abort();
-            });
-        } else {
-            res.pipe(fetchRes);
-        }
-    });
-
-    setImmediate(() => {
-        if (body) {
-            try {
-                if (typeof body.pipe === 'function') {
-                    return body.pipe(req);
-                } else {
-                    req.write(body);
-                }
-            } catch (err) {
-                finished = true;
-                err.type = 'FETCH';
-                err.sourceUrl = url;
-                fetchRes.emit('error', err);
-                return;
-            }
-        }
-        req.end();
-    });
-
-    return fetchRes;
-}
Index: de_modules/nodemailer/lib/json-transport/index.js
===================================================================
--- node_modules/nodemailer/lib/json-transport/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-'use strict';
-
-const packageData = require('../../package.json');
-const shared = require('../shared');
-
-/**
- * Generates a Transport object to generate JSON output
- *
- * @constructor
- * @param {Object} optional config parameter
- */
-class JSONTransport {
-    constructor(options) {
-        options = options || {};
-
-        this.options = options || {};
-
-        this.name = 'JSONTransport';
-        this.version = packageData.version;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'json-transport'
-        });
-    }
-
-    /**
-     * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
-     *
-     * @param {Object} emailMessage MailComposer object
-     * @param {Function} callback Callback function to run when the sending is completed
-     */
-    send(mail, done) {
-        // Sendmail strips this header line by itself
-        mail.message.keepBcc = true;
-
-        let envelope = mail.data.envelope || mail.message.getEnvelope();
-        let messageId = mail.message.messageId();
-
-        let recipients = [].concat(envelope.to || []);
-        if (recipients.length > 3) {
-            recipients.push('...and ' + recipients.splice(2).length + ' more');
-        }
-        this.logger.info(
-            {
-                tnx: 'send',
-                messageId
-            },
-            'Composing JSON structure of %s to <%s>',
-            messageId,
-            recipients.join(', ')
-        );
-
-        setImmediate(() => {
-            mail.normalize((err, data) => {
-                if (err) {
-                    this.logger.error(
-                        {
-                            err,
-                            tnx: 'send',
-                            messageId
-                        },
-                        'Failed building JSON structure for %s. %s',
-                        messageId,
-                        err.message
-                    );
-                    return done(err);
-                }
-
-                delete data.envelope;
-                delete data.normalizedHeaders;
-
-                return done(null, {
-                    envelope,
-                    messageId,
-                    message: this.options.skipEncoding ? data : JSON.stringify(data)
-                });
-            });
-        });
-    }
-}
-
-module.exports = JSONTransport;
Index: de_modules/nodemailer/lib/mail-composer/index.js
===================================================================
--- node_modules/nodemailer/lib/mail-composer/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,565 +1,0 @@
-/* eslint no-undefined: 0 */
-
-'use strict';
-
-const MimeNode = require('../mime-node');
-const mimeFuncs = require('../mime-funcs');
-const parseDataURI = require('../shared').parseDataURI;
-
-/**
- * Creates the object for composing a MimeNode instance out from the mail options
- *
- * @constructor
- * @param {Object} mail Mail options
- */
-class MailComposer {
-    constructor(mail) {
-        this.mail = mail || {};
-        this.message = false;
-    }
-
-    /**
-     * Builds MimeNode instance
-     */
-    compile() {
-        this._alternatives = this.getAlternatives();
-        this._htmlNode = this._alternatives.filter(alternative => /^text\/html\b/i.test(alternative.contentType)).pop();
-        this._attachments = this.getAttachments(!!this._htmlNode);
-
-        this._useRelated = !!(this._htmlNode && this._attachments.related.length);
-        this._useAlternative = this._alternatives.length > 1;
-        this._useMixed = this._attachments.attached.length > 1 || (this._alternatives.length && this._attachments.attached.length === 1);
-
-        // Compose MIME tree
-        if (this.mail.raw) {
-            this.message = new MimeNode('message/rfc822', { newline: this.mail.newline }).setRaw(this.mail.raw);
-        } else if (this._useMixed) {
-            this.message = this._createMixed();
-        } else if (this._useAlternative) {
-            this.message = this._createAlternative();
-        } else if (this._useRelated) {
-            this.message = this._createRelated();
-        } else {
-            this.message = this._createContentNode(
-                false,
-                []
-                    .concat(this._alternatives || [])
-                    .concat(this._attachments.attached || [])
-                    .shift() || {
-                    contentType: 'text/plain',
-                    content: ''
-                }
-            );
-        }
-
-        // Add custom headers
-        if (this.mail.headers) {
-            this.message.addHeader(this.mail.headers);
-        }
-
-        // Add headers to the root node, always overrides custom headers
-        ['from', 'sender', 'to', 'cc', 'bcc', 'reply-to', 'in-reply-to', 'references', 'subject', 'message-id', 'date'].forEach(header => {
-            let key = header.replace(/-(\w)/g, (o, c) => c.toUpperCase());
-            if (this.mail[key]) {
-                this.message.setHeader(header, this.mail[key]);
-            }
-        });
-
-        // Sets custom envelope
-        if (this.mail.envelope) {
-            this.message.setEnvelope(this.mail.envelope);
-        }
-
-        // ensure Message-Id value
-        this.message.messageId();
-
-        return this.message;
-    }
-
-    /**
-     * List all attachments. Resulting attachment objects can be used as input for MimeNode nodes
-     *
-     * @param {Boolean} findRelated If true separate related attachments from attached ones
-     * @returns {Object} An object of arrays (`related` and `attached`)
-     */
-    getAttachments(findRelated) {
-        let icalEvent, eventObject;
-        let attachments = [].concat(this.mail.attachments || []).map((attachment, i) => {
-            let data;
-            let isMessageNode = /^message\//i.test(attachment.contentType);
-
-            if (/^data:/i.test(attachment.path || attachment.href)) {
-                attachment = this._processDataUrl(attachment);
-            }
-
-            let contentType = attachment.contentType || mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');
-            let isImage = /^image\//i.test(contentType);
-            let contentDisposition = attachment.contentDisposition || (isMessageNode || (isImage && attachment.cid) ? 'inline' : 'attachment');
-
-            data = {
-                contentType,
-                contentDisposition,
-                contentTransferEncoding: 'contentTransferEncoding' in attachment ? attachment.contentTransferEncoding : 'base64'
-            };
-
-            if (attachment.filename) {
-                data.filename = attachment.filename;
-            } else if (!isMessageNode && attachment.filename !== false) {
-                data.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);
-                if (data.filename.indexOf('.') < 0) {
-                    data.filename += '.' + mimeFuncs.detectExtension(data.contentType);
-                }
-            }
-
-            if (/^https?:\/\//i.test(attachment.path)) {
-                attachment.href = attachment.path;
-                attachment.path = undefined;
-            }
-
-            if (attachment.cid) {
-                data.cid = attachment.cid;
-            }
-
-            if (attachment.raw) {
-                data.raw = attachment.raw;
-            } else if (attachment.path) {
-                data.content = {
-                    path: attachment.path
-                };
-            } else if (attachment.href) {
-                data.content = {
-                    href: attachment.href,
-                    httpHeaders: attachment.httpHeaders
-                };
-            } else {
-                data.content = attachment.content || '';
-            }
-
-            if (attachment.encoding) {
-                data.encoding = attachment.encoding;
-            }
-
-            if (attachment.headers) {
-                data.headers = attachment.headers;
-            }
-
-            return data;
-        });
-
-        if (this.mail.icalEvent) {
-            if (
-                typeof this.mail.icalEvent === 'object' &&
-                (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)
-            ) {
-                icalEvent = this.mail.icalEvent;
-            } else {
-                icalEvent = {
-                    content: this.mail.icalEvent
-                };
-            }
-
-            eventObject = {};
-            Object.keys(icalEvent).forEach(key => {
-                eventObject[key] = icalEvent[key];
-            });
-
-            eventObject.contentType = 'application/ics';
-            if (!eventObject.headers) {
-                eventObject.headers = {};
-            }
-            eventObject.filename = eventObject.filename || 'invite.ics';
-            eventObject.headers['Content-Disposition'] = 'attachment';
-            eventObject.headers['Content-Transfer-Encoding'] = 'base64';
-        }
-
-        if (!findRelated) {
-            return {
-                attached: attachments.concat(eventObject || []),
-                related: []
-            };
-        } else {
-            return {
-                attached: attachments.filter(attachment => !attachment.cid).concat(eventObject || []),
-                related: attachments.filter(attachment => !!attachment.cid)
-            };
-        }
-    }
-
-    /**
-     * List alternatives. Resulting objects can be used as input for MimeNode nodes
-     *
-     * @returns {Array} An array of alternative elements. Includes the `text` and `html` values as well
-     */
-    getAlternatives() {
-        let alternatives = [],
-            text,
-            html,
-            watchHtml,
-            amp,
-            icalEvent,
-            eventObject;
-
-        if (this.mail.text) {
-            if (typeof this.mail.text === 'object' && (this.mail.text.content || this.mail.text.path || this.mail.text.href || this.mail.text.raw)) {
-                text = this.mail.text;
-            } else {
-                text = {
-                    content: this.mail.text
-                };
-            }
-            text.contentType = 'text/plain; charset=utf-8';
-        }
-
-        if (this.mail.watchHtml) {
-            if (
-                typeof this.mail.watchHtml === 'object' &&
-                (this.mail.watchHtml.content || this.mail.watchHtml.path || this.mail.watchHtml.href || this.mail.watchHtml.raw)
-            ) {
-                watchHtml = this.mail.watchHtml;
-            } else {
-                watchHtml = {
-                    content: this.mail.watchHtml
-                };
-            }
-            watchHtml.contentType = 'text/watch-html; charset=utf-8';
-        }
-
-        if (this.mail.amp) {
-            if (typeof this.mail.amp === 'object' && (this.mail.amp.content || this.mail.amp.path || this.mail.amp.href || this.mail.amp.raw)) {
-                amp = this.mail.amp;
-            } else {
-                amp = {
-                    content: this.mail.amp
-                };
-            }
-            amp.contentType = 'text/x-amp-html; charset=utf-8';
-        }
-
-        // NB! when including attachments with a calendar alternative you might end up in a blank screen on some clients
-        if (this.mail.icalEvent) {
-            if (
-                typeof this.mail.icalEvent === 'object' &&
-                (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)
-            ) {
-                icalEvent = this.mail.icalEvent;
-            } else {
-                icalEvent = {
-                    content: this.mail.icalEvent
-                };
-            }
-
-            eventObject = {};
-            Object.keys(icalEvent).forEach(key => {
-                eventObject[key] = icalEvent[key];
-            });
-
-            if (eventObject.content && typeof eventObject.content === 'object') {
-                // we are going to have the same attachment twice, so mark this to be
-                // resolved just once
-                eventObject.content._resolve = true;
-            }
-
-            eventObject.filename = false;
-            eventObject.contentType = 'text/calendar; charset=utf-8; method=' + (eventObject.method || 'PUBLISH').toString().trim().toUpperCase();
-            if (!eventObject.headers) {
-                eventObject.headers = {};
-            }
-        }
-
-        if (this.mail.html) {
-            if (typeof this.mail.html === 'object' && (this.mail.html.content || this.mail.html.path || this.mail.html.href || this.mail.html.raw)) {
-                html = this.mail.html;
-            } else {
-                html = {
-                    content: this.mail.html
-                };
-            }
-            html.contentType = 'text/html; charset=utf-8';
-        }
-
-        []
-            .concat(text || [])
-            .concat(watchHtml || [])
-            .concat(amp || [])
-            .concat(html || [])
-            .concat(eventObject || [])
-            .concat(this.mail.alternatives || [])
-            .forEach(alternative => {
-                let data;
-
-                if (/^data:/i.test(alternative.path || alternative.href)) {
-                    alternative = this._processDataUrl(alternative);
-                }
-
-                data = {
-                    contentType: alternative.contentType || mimeFuncs.detectMimeType(alternative.filename || alternative.path || alternative.href || 'txt'),
-                    contentTransferEncoding: alternative.contentTransferEncoding
-                };
-
-                if (alternative.filename) {
-                    data.filename = alternative.filename;
-                }
-
-                if (/^https?:\/\//i.test(alternative.path)) {
-                    alternative.href = alternative.path;
-                    alternative.path = undefined;
-                }
-
-                if (alternative.raw) {
-                    data.raw = alternative.raw;
-                } else if (alternative.path) {
-                    data.content = {
-                        path: alternative.path
-                    };
-                } else if (alternative.href) {
-                    data.content = {
-                        href: alternative.href
-                    };
-                } else {
-                    data.content = alternative.content || '';
-                }
-
-                if (alternative.encoding) {
-                    data.encoding = alternative.encoding;
-                }
-
-                if (alternative.headers) {
-                    data.headers = alternative.headers;
-                }
-
-                alternatives.push(data);
-            });
-
-        return alternatives;
-    }
-
-    /**
-     * Builds multipart/mixed node. It should always contain different type of elements on the same level
-     * eg. text + attachments
-     *
-     * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created
-     * @returns {Object} MimeNode node element
-     */
-    _createMixed(parentNode) {
-        let node;
-
-        if (!parentNode) {
-            node = new MimeNode('multipart/mixed', {
-                baseBoundary: this.mail.baseBoundary,
-                textEncoding: this.mail.textEncoding,
-                boundaryPrefix: this.mail.boundaryPrefix,
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        } else {
-            node = parentNode.createChild('multipart/mixed', {
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        }
-
-        if (this._useAlternative) {
-            this._createAlternative(node);
-        } else if (this._useRelated) {
-            this._createRelated(node);
-        }
-
-        []
-            .concat((!this._useAlternative && this._alternatives) || [])
-            .concat(this._attachments.attached || [])
-            .forEach(element => {
-                // if the element is a html node from related subpart then ignore it
-                if (!this._useRelated || element !== this._htmlNode) {
-                    this._createContentNode(node, element);
-                }
-            });
-
-        return node;
-    }
-
-    /**
-     * Builds multipart/alternative node. It should always contain same type of elements on the same level
-     * eg. text + html view of the same data
-     *
-     * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created
-     * @returns {Object} MimeNode node element
-     */
-    _createAlternative(parentNode) {
-        let node;
-
-        if (!parentNode) {
-            node = new MimeNode('multipart/alternative', {
-                baseBoundary: this.mail.baseBoundary,
-                textEncoding: this.mail.textEncoding,
-                boundaryPrefix: this.mail.boundaryPrefix,
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        } else {
-            node = parentNode.createChild('multipart/alternative', {
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        }
-
-        this._alternatives.forEach(alternative => {
-            if (this._useRelated && this._htmlNode === alternative) {
-                this._createRelated(node);
-            } else {
-                this._createContentNode(node, alternative);
-            }
-        });
-
-        return node;
-    }
-
-    /**
-     * Builds multipart/related node. It should always contain html node with related attachments
-     *
-     * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created
-     * @returns {Object} MimeNode node element
-     */
-    _createRelated(parentNode) {
-        let node;
-
-        if (!parentNode) {
-            node = new MimeNode('multipart/related; type="text/html"', {
-                baseBoundary: this.mail.baseBoundary,
-                textEncoding: this.mail.textEncoding,
-                boundaryPrefix: this.mail.boundaryPrefix,
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        } else {
-            node = parentNode.createChild('multipart/related; type="text/html"', {
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        }
-
-        this._createContentNode(node, this._htmlNode);
-
-        this._attachments.related.forEach(alternative => this._createContentNode(node, alternative));
-
-        return node;
-    }
-
-    /**
-     * Creates a regular node with contents
-     *
-     * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created
-     * @param {Object} element Node data
-     * @returns {Object} MimeNode node element
-     */
-    _createContentNode(parentNode, element) {
-        element = element || {};
-        element.content = element.content || '';
-
-        let node;
-        let encoding = (element.encoding || 'utf8')
-            .toString()
-            .toLowerCase()
-            .replace(/[-_\s]/g, '');
-
-        if (!parentNode) {
-            node = new MimeNode(element.contentType, {
-                filename: element.filename,
-                baseBoundary: this.mail.baseBoundary,
-                textEncoding: this.mail.textEncoding,
-                boundaryPrefix: this.mail.boundaryPrefix,
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        } else {
-            node = parentNode.createChild(element.contentType, {
-                filename: element.filename,
-                textEncoding: this.mail.textEncoding,
-                disableUrlAccess: this.mail.disableUrlAccess,
-                disableFileAccess: this.mail.disableFileAccess,
-                normalizeHeaderKey: this.mail.normalizeHeaderKey,
-                newline: this.mail.newline
-            });
-        }
-
-        // add custom headers
-        if (element.headers) {
-            node.addHeader(element.headers);
-        }
-
-        if (element.cid) {
-            node.setHeader('Content-Id', '<' + element.cid.replace(/[<>]/g, '') + '>');
-        }
-
-        if (element.contentTransferEncoding) {
-            node.setHeader('Content-Transfer-Encoding', element.contentTransferEncoding);
-        } else if (this.mail.encoding && /^text\//i.test(element.contentType)) {
-            node.setHeader('Content-Transfer-Encoding', this.mail.encoding);
-        }
-
-        if (!/^text\//i.test(element.contentType) || element.contentDisposition) {
-            node.setHeader(
-                'Content-Disposition',
-                element.contentDisposition || (element.cid && /^image\//i.test(element.contentType) ? 'inline' : 'attachment')
-            );
-        }
-
-        if (typeof element.content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {
-            element.content = Buffer.from(element.content, encoding);
-        }
-
-        // prefer pregenerated raw content
-        if (element.raw) {
-            node.setRaw(element.raw);
-        } else {
-            node.setContent(element.content);
-        }
-
-        return node;
-    }
-
-    /**
-     * Parses data uri and converts it to a Buffer
-     *
-     * @param {Object} element Content element
-     * @return {Object} Parsed element
-     */
-    _processDataUrl(element) {
-        let parsedDataUri;
-        if ((element.path || element.href).match(/^data:/)) {
-            parsedDataUri = parseDataURI(element.path || element.href);
-        }
-
-        if (!parsedDataUri) {
-            return element;
-        }
-
-        element.content = parsedDataUri.data;
-        element.contentType = element.contentType || parsedDataUri.contentType;
-
-        if ('path' in element) {
-            element.path = false;
-        }
-
-        if ('href' in element) {
-            element.href = false;
-        }
-
-        return element;
-    }
-}
-
-module.exports = MailComposer;
Index: de_modules/nodemailer/lib/mailer/index.js
===================================================================
--- node_modules/nodemailer/lib/mailer/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,429 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events');
-const shared = require('../shared');
-const mimeTypes = require('../mime-funcs/mime-types');
-const MailComposer = require('../mail-composer');
-const DKIM = require('../dkim');
-const httpProxyClient = require('../smtp-connection/http-proxy-client');
-const util = require('util');
-const urllib = require('url');
-const packageData = require('../../package.json');
-const MailMessage = require('./mail-message');
-const net = require('net');
-const dns = require('dns');
-const crypto = require('crypto');
-
-/**
- * Creates an object for exposing the Mail API
- *
- * @constructor
- * @param {Object} transporter Transport object instance to pass the mails to
- */
-class Mail extends EventEmitter {
-    constructor(transporter, options, defaults) {
-        super();
-
-        this.options = options || {};
-        this._defaults = defaults || {};
-
-        this._defaultPlugins = {
-            compile: [(...args) => this._convertDataImages(...args)],
-            stream: []
-        };
-
-        this._userPlugins = {
-            compile: [],
-            stream: []
-        };
-
-        this.meta = new Map();
-
-        this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;
-
-        this.transporter = transporter;
-        this.transporter.mailer = this;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'mail'
-        });
-
-        this.logger.debug(
-            {
-                tnx: 'create'
-            },
-            'Creating transport: %s',
-            this.getVersionString()
-        );
-
-        // setup emit handlers for the transporter
-        if (typeof this.transporter.on === 'function') {
-            // deprecated log interface
-            this.transporter.on('log', log => {
-                this.logger.debug(
-                    {
-                        tnx: 'transport'
-                    },
-                    '%s: %s',
-                    log.type,
-                    log.message
-                );
-            });
-
-            // transporter errors
-            this.transporter.on('error', err => {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'transport'
-                    },
-                    'Transport Error: %s',
-                    err.message
-                );
-                this.emit('error', err);
-            });
-
-            // indicates if the sender has became idle
-            this.transporter.on('idle', (...args) => {
-                this.emit('idle', ...args);
-            });
-        }
-
-        /**
-         * Optional methods passed to the underlying transport object
-         */
-        ['close', 'isIdle', 'verify'].forEach(method => {
-            this[method] = (...args) => {
-                if (typeof this.transporter[method] === 'function') {
-                    if (method === 'verify' && typeof this.getSocket === 'function') {
-                        this.transporter.getSocket = this.getSocket;
-                        this.getSocket = false;
-                    }
-                    return this.transporter[method](...args);
-                } else {
-                    this.logger.warn(
-                        {
-                            tnx: 'transport',
-                            methodName: method
-                        },
-                        'Non existing method %s called for transport',
-                        method
-                    );
-                    return false;
-                }
-            };
-        });
-
-        // setup proxy handling
-        if (this.options.proxy && typeof this.options.proxy === 'string') {
-            this.setupProxy(this.options.proxy);
-        }
-    }
-
-    use(step, plugin) {
-        step = (step || '').toString();
-        if (!this._userPlugins.hasOwnProperty(step)) {
-            this._userPlugins[step] = [plugin];
-        } else {
-            this._userPlugins[step].push(plugin);
-        }
-
-        return this;
-    }
-
-    /**
-     * Sends an email using the preselected transport object
-     *
-     * @param {Object} data E-data description
-     * @param {Function?} callback Callback to run once the sending succeeded or failed
-     */
-    sendMail(data, callback = null) {
-        let promise;
-
-        if (!callback) {
-            promise = new Promise((resolve, reject) => {
-                callback = shared.callbackPromise(resolve, reject);
-            });
-        }
-
-        if (typeof this.getSocket === 'function') {
-            this.transporter.getSocket = this.getSocket;
-            this.getSocket = false;
-        }
-
-        let mail = new MailMessage(this, data);
-
-        this.logger.debug(
-            {
-                tnx: 'transport',
-                name: this.transporter.name,
-                version: this.transporter.version,
-                action: 'send'
-            },
-            'Sending mail using %s/%s',
-            this.transporter.name,
-            this.transporter.version
-        );
-
-        this._processPlugins('compile', mail, err => {
-            if (err) {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'plugin',
-                        action: 'compile'
-                    },
-                    'PluginCompile Error: %s',
-                    err.message
-                );
-                return callback(err);
-            }
-
-            mail.message = new MailComposer(mail.data).compile();
-
-            mail.setMailerHeader();
-            mail.setPriorityHeaders();
-            mail.setListHeaders();
-
-            this._processPlugins('stream', mail, err => {
-                if (err) {
-                    this.logger.error(
-                        {
-                            err,
-                            tnx: 'plugin',
-                            action: 'stream'
-                        },
-                        'PluginStream Error: %s',
-                        err.message
-                    );
-                    return callback(err);
-                }
-
-                if (mail.data.dkim || this.dkim) {
-                    mail.message.processFunc(input => {
-                        let dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;
-                        this.logger.debug(
-                            {
-                                tnx: 'DKIM',
-                                messageId: mail.message.messageId(),
-                                dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')
-                            },
-                            'Signing outgoing message with %s keys',
-                            dkim.keys.length
-                        );
-                        return dkim.sign(input, mail.data._dkim);
-                    });
-                }
-
-                this.transporter.send(mail, (...args) => {
-                    if (args[0]) {
-                        this.logger.error(
-                            {
-                                err: args[0],
-                                tnx: 'transport',
-                                action: 'send'
-                            },
-                            'Send Error: %s',
-                            args[0].message
-                        );
-                    }
-                    callback(...args);
-                });
-            });
-        });
-
-        return promise;
-    }
-
-    getVersionString() {
-        return util.format('%s (%s; +%s; %s/%s)', packageData.name, packageData.version, packageData.homepage, this.transporter.name, this.transporter.version);
-    }
-
-    _processPlugins(step, mail, callback) {
-        step = (step || '').toString();
-
-        if (!this._userPlugins.hasOwnProperty(step)) {
-            return callback();
-        }
-
-        let userPlugins = this._userPlugins[step] || [];
-        let defaultPlugins = this._defaultPlugins[step] || [];
-
-        if (userPlugins.length) {
-            this.logger.debug(
-                {
-                    tnx: 'transaction',
-                    pluginCount: userPlugins.length,
-                    step
-                },
-                'Using %s plugins for %s',
-                userPlugins.length,
-                step
-            );
-        }
-
-        if (userPlugins.length + defaultPlugins.length === 0) {
-            return callback();
-        }
-
-        let pos = 0;
-        let block = 'default';
-        let processPlugins = () => {
-            let curplugins = block === 'default' ? defaultPlugins : userPlugins;
-            if (pos >= curplugins.length) {
-                if (block === 'default' && userPlugins.length) {
-                    block = 'user';
-                    pos = 0;
-                    curplugins = userPlugins;
-                } else {
-                    return callback();
-                }
-            }
-            let plugin = curplugins[pos++];
-            plugin(mail, err => {
-                if (err) {
-                    return callback(err);
-                }
-                processPlugins();
-            });
-        };
-
-        processPlugins();
-    }
-
-    /**
-     * Sets up proxy handler for a Nodemailer object
-     *
-     * @param {String} proxyUrl Proxy configuration url
-     */
-    setupProxy(proxyUrl) {
-        let proxy = urllib.parse(proxyUrl);
-
-        // setup socket handler for the mailer object
-        this.getSocket = (options, callback) => {
-            let protocol = proxy.protocol.replace(/:$/, '').toLowerCase();
-
-            if (this.meta.has('proxy_handler_' + protocol)) {
-                return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);
-            }
-
-            switch (protocol) {
-                // Connect using a HTTP CONNECT method
-                case 'http':
-                case 'https':
-                    httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {
-                        if (err) {
-                            return callback(err);
-                        }
-                        return callback(null, {
-                            connection: socket
-                        });
-                    });
-                    return;
-                case 'socks':
-                case 'socks5':
-                case 'socks4':
-                case 'socks4a': {
-                    if (!this.meta.has('proxy_socks_module')) {
-                        return callback(new Error('Socks module not loaded'));
-                    }
-                    let connect = ipaddress => {
-                        let proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;
-                        let socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');
-                        let proxyType = Number(proxy.protocol.replace(/\D/g, '')) || 5;
-                        let connectionOpts = {
-                            proxy: {
-                                ipaddress,
-                                port: Number(proxy.port),
-                                type: proxyType
-                            },
-                            [proxyV2 ? 'destination' : 'target']: {
-                                host: options.host,
-                                port: options.port
-                            },
-                            command: 'connect'
-                        };
-
-                        if (proxy.auth) {
-                            let username = decodeURIComponent(proxy.auth.split(':').shift());
-                            let password = decodeURIComponent(proxy.auth.split(':').pop());
-                            if (proxyV2) {
-                                connectionOpts.proxy.userId = username;
-                                connectionOpts.proxy.password = password;
-                            } else if (proxyType === 4) {
-                                connectionOpts.userid = username;
-                            } else {
-                                connectionOpts.authentication = {
-                                    username,
-                                    password
-                                };
-                            }
-                        }
-
-                        socksClient.createConnection(connectionOpts, (err, info) => {
-                            if (err) {
-                                return callback(err);
-                            }
-                            return callback(null, {
-                                connection: info.socket || info
-                            });
-                        });
-                    };
-
-                    if (net.isIP(proxy.hostname)) {
-                        return connect(proxy.hostname);
-                    }
-
-                    return dns.resolve(proxy.hostname, (err, address) => {
-                        if (err) {
-                            return callback(err);
-                        }
-                        connect(Array.isArray(address) ? address[0] : address);
-                    });
-                }
-            }
-            callback(new Error('Unknown proxy configuration'));
-        };
-    }
-
-    _convertDataImages(mail, callback) {
-        if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {
-            return callback();
-        }
-        mail.resolveContent(mail.data, 'html', (err, html) => {
-            if (err) {
-                return callback(err);
-            }
-            let cidCounter = 0;
-            html = (html || '')
-                .toString()
-                .replace(/(<img\b[^<>]{0,1024} src\s{0,20}=[\s"']{0,20})(data:([^;]+);[^"'>\s]+)/gi, (match, prefix, dataUri, mimeType) => {
-                    let cid = crypto.randomBytes(10).toString('hex') + '@localhost';
-                    if (!mail.data.attachments) {
-                        mail.data.attachments = [];
-                    }
-                    if (!Array.isArray(mail.data.attachments)) {
-                        mail.data.attachments = [].concat(mail.data.attachments || []);
-                    }
-                    mail.data.attachments.push({
-                        path: dataUri,
-                        cid,
-                        filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)
-                    });
-                    return prefix + 'cid:' + cid;
-                });
-            mail.data.html = html;
-            callback();
-        });
-    }
-
-    set(key, value) {
-        return this.meta.set(key, value);
-    }
-
-    get(key) {
-        return this.meta.get(key);
-    }
-}
-
-module.exports = Mail;
Index: de_modules/nodemailer/lib/mailer/mail-message.js
===================================================================
--- node_modules/nodemailer/lib/mailer/mail-message.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,315 +1,0 @@
-'use strict';
-
-const shared = require('../shared');
-const MimeNode = require('../mime-node');
-const mimeFuncs = require('../mime-funcs');
-
-class MailMessage {
-    constructor(mailer, data) {
-        this.mailer = mailer;
-        this.data = {};
-        this.message = null;
-
-        data = data || {};
-        let options = mailer.options || {};
-        let defaults = mailer._defaults || {};
-
-        Object.keys(data).forEach(key => {
-            this.data[key] = data[key];
-        });
-
-        this.data.headers = this.data.headers || {};
-
-        // apply defaults
-        Object.keys(defaults).forEach(key => {
-            if (!(key in this.data)) {
-                this.data[key] = defaults[key];
-            } else if (key === 'headers') {
-                // headers is a special case. Allow setting individual default headers
-                Object.keys(defaults.headers).forEach(key => {
-                    if (!(key in this.data.headers)) {
-                        this.data.headers[key] = defaults.headers[key];
-                    }
-                });
-            }
-        });
-
-        // force specific keys from transporter options
-        ['disableFileAccess', 'disableUrlAccess', 'normalizeHeaderKey'].forEach(key => {
-            if (key in options) {
-                this.data[key] = options[key];
-            }
-        });
-    }
-
-    resolveContent(...args) {
-        return shared.resolveContent(...args);
-    }
-
-    resolveAll(callback) {
-        let keys = [
-            [this.data, 'html'],
-            [this.data, 'text'],
-            [this.data, 'watchHtml'],
-            [this.data, 'amp'],
-            [this.data, 'icalEvent']
-        ];
-
-        if (this.data.alternatives && this.data.alternatives.length) {
-            this.data.alternatives.forEach((alternative, i) => {
-                keys.push([this.data.alternatives, i]);
-            });
-        }
-
-        if (this.data.attachments && this.data.attachments.length) {
-            this.data.attachments.forEach((attachment, i) => {
-                if (!attachment.filename) {
-                    attachment.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);
-                    if (attachment.filename.indexOf('.') < 0) {
-                        attachment.filename += '.' + mimeFuncs.detectExtension(attachment.contentType);
-                    }
-                }
-
-                if (!attachment.contentType) {
-                    attachment.contentType = mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');
-                }
-
-                keys.push([this.data.attachments, i]);
-            });
-        }
-
-        let mimeNode = new MimeNode();
-
-        let addressKeys = ['from', 'to', 'cc', 'bcc', 'sender', 'replyTo'];
-
-        addressKeys.forEach(address => {
-            let value;
-            if (this.message) {
-                value = [].concat(mimeNode._parseAddresses(this.message.getHeader(address === 'replyTo' ? 'reply-to' : address)) || []);
-            } else if (this.data[address]) {
-                value = [].concat(mimeNode._parseAddresses(this.data[address]) || []);
-            }
-            if (value && value.length) {
-                this.data[address] = value;
-            } else if (address in this.data) {
-                this.data[address] = null;
-            }
-        });
-
-        let singleKeys = ['from', 'sender'];
-        singleKeys.forEach(address => {
-            if (this.data[address]) {
-                this.data[address] = this.data[address].shift();
-            }
-        });
-
-        let pos = 0;
-        let resolveNext = () => {
-            if (pos >= keys.length) {
-                return callback(null, this.data);
-            }
-            let args = keys[pos++];
-            if (!args[0] || !args[0][args[1]]) {
-                return resolveNext();
-            }
-            shared.resolveContent(...args, (err, value) => {
-                if (err) {
-                    return callback(err);
-                }
-
-                let node = {
-                    content: value
-                };
-                if (args[0][args[1]] && typeof args[0][args[1]] === 'object' && !Buffer.isBuffer(args[0][args[1]])) {
-                    Object.keys(args[0][args[1]]).forEach(key => {
-                        if (!(key in node) && !['content', 'path', 'href', 'raw'].includes(key)) {
-                            node[key] = args[0][args[1]][key];
-                        }
-                    });
-                }
-
-                args[0][args[1]] = node;
-                resolveNext();
-            });
-        };
-
-        setImmediate(() => resolveNext());
-    }
-
-    normalize(callback) {
-        let envelope = this.data.envelope || this.message.getEnvelope();
-        let messageId = this.message.messageId();
-
-        this.resolveAll((err, data) => {
-            if (err) {
-                return callback(err);
-            }
-
-            data.envelope = envelope;
-            data.messageId = messageId;
-
-            ['html', 'text', 'watchHtml', 'amp'].forEach(key => {
-                if (data[key] && data[key].content) {
-                    if (typeof data[key].content === 'string') {
-                        data[key] = data[key].content;
-                    } else if (Buffer.isBuffer(data[key].content)) {
-                        data[key] = data[key].content.toString();
-                    }
-                }
-            });
-
-            if (data.icalEvent && Buffer.isBuffer(data.icalEvent.content)) {
-                data.icalEvent.content = data.icalEvent.content.toString('base64');
-                data.icalEvent.encoding = 'base64';
-            }
-
-            if (data.alternatives && data.alternatives.length) {
-                data.alternatives.forEach(alternative => {
-                    if (alternative && alternative.content && Buffer.isBuffer(alternative.content)) {
-                        alternative.content = alternative.content.toString('base64');
-                        alternative.encoding = 'base64';
-                    }
-                });
-            }
-
-            if (data.attachments && data.attachments.length) {
-                data.attachments.forEach(attachment => {
-                    if (attachment && attachment.content && Buffer.isBuffer(attachment.content)) {
-                        attachment.content = attachment.content.toString('base64');
-                        attachment.encoding = 'base64';
-                    }
-                });
-            }
-
-            data.normalizedHeaders = {};
-            Object.keys(data.headers || {}).forEach(key => {
-                let value = [].concat(data.headers[key] || []).shift();
-                value = (value && value.value) || value;
-                if (value) {
-                    if (['references', 'in-reply-to', 'message-id', 'content-id'].includes(key)) {
-                        value = this.message._encodeHeaderValue(key, value);
-                    }
-                    data.normalizedHeaders[key] = value;
-                }
-            });
-
-            if (data.list && typeof data.list === 'object') {
-                let listHeaders = this._getListHeaders(data.list);
-                listHeaders.forEach(entry => {
-                    data.normalizedHeaders[entry.key] = entry.value.map(val => (val && val.value) || val).join(', ');
-                });
-            }
-
-            if (data.references) {
-                data.normalizedHeaders.references = this.message._encodeHeaderValue('references', data.references);
-            }
-
-            if (data.inReplyTo) {
-                data.normalizedHeaders['in-reply-to'] = this.message._encodeHeaderValue('in-reply-to', data.inReplyTo);
-            }
-
-            return callback(null, data);
-        });
-    }
-
-    setMailerHeader() {
-        if (!this.message || !this.data.xMailer) {
-            return;
-        }
-        this.message.setHeader('X-Mailer', this.data.xMailer);
-    }
-
-    setPriorityHeaders() {
-        if (!this.message || !this.data.priority) {
-            return;
-        }
-        switch ((this.data.priority || '').toString().toLowerCase()) {
-            case 'high':
-                this.message.setHeader('X-Priority', '1 (Highest)');
-                this.message.setHeader('X-MSMail-Priority', 'High');
-                this.message.setHeader('Importance', 'High');
-                break;
-            case 'low':
-                this.message.setHeader('X-Priority', '5 (Lowest)');
-                this.message.setHeader('X-MSMail-Priority', 'Low');
-                this.message.setHeader('Importance', 'Low');
-                break;
-            default:
-            // do not add anything, since all messages are 'Normal' by default
-        }
-    }
-
-    setListHeaders() {
-        if (!this.message || !this.data.list || typeof this.data.list !== 'object') {
-            return;
-        }
-        // add optional List-* headers
-        if (this.data.list && typeof this.data.list === 'object') {
-            this._getListHeaders(this.data.list).forEach(listHeader => {
-                listHeader.value.forEach(value => {
-                    this.message.addHeader(listHeader.key, value);
-                });
-            });
-        }
-    }
-
-    _getListHeaders(listData) {
-        // make sure an url looks like <protocol:url>
-        return Object.keys(listData).map(key => ({
-            key: 'list-' + key.toLowerCase().trim(),
-            value: [].concat(listData[key] || []).map(value => ({
-                prepared: true,
-                foldLines: true,
-                value: []
-                    .concat(value || [])
-                    .map(value => {
-                        if (typeof value === 'string') {
-                            value = {
-                                url: value
-                            };
-                        }
-
-                        if (value && value.url) {
-                            if (key.toLowerCase().trim() === 'id') {
-                                // List-ID: "comment" <domain>
-                                let comment = value.comment || '';
-                                if (mimeFuncs.isPlainText(comment)) {
-                                    comment = '"' + comment + '"';
-                                } else {
-                                    comment = mimeFuncs.encodeWord(comment);
-                                }
-
-                                return (value.comment ? comment + ' ' : '') + this._formatListUrl(value.url).replace(/^<[^:]+\/{,2}/, '');
-                            }
-
-                            // List-*: <http://domain> (comment)
-                            let comment = value.comment || '';
-                            if (!mimeFuncs.isPlainText(comment)) {
-                                comment = mimeFuncs.encodeWord(comment);
-                            }
-
-                            return this._formatListUrl(value.url) + (value.comment ? ' (' + comment + ')' : '');
-                        }
-
-                        return '';
-                    })
-                    .filter(value => value)
-                    .join(', ')
-            }))
-        }));
-    }
-
-    _formatListUrl(url) {
-        url = url.replace(/[\s<]+|[\s>]+/g, '');
-        if (/^(https?|mailto|ftp):/.test(url)) {
-            return '<' + url + '>';
-        }
-        if (/^[^@]+@[^@]+$/.test(url)) {
-            return '<mailto:' + url + '>';
-        }
-
-        return '<http://' + url + '>';
-    }
-}
-
-module.exports = MailMessage;
Index: de_modules/nodemailer/lib/mime-funcs/index.js
===================================================================
--- node_modules/nodemailer/lib/mime-funcs/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,625 +1,0 @@
-/* eslint no-control-regex:0 */
-
-'use strict';
-
-const base64 = require('../base64');
-const qp = require('../qp');
-const mimeTypes = require('./mime-types');
-
-module.exports = {
-    /**
-     * Checks if a value is plaintext string (uses only printable 7bit chars)
-     *
-     * @param {String} value String to be tested
-     * @returns {Boolean} true if it is a plaintext string
-     */
-    isPlainText(value, isParam) {
-        const re = isParam ? /[\x00-\x08\x0b\x0c\x0e-\x1f"\u0080-\uFFFF]/ : /[\x00-\x08\x0b\x0c\x0e-\x1f\u0080-\uFFFF]/;
-        if (typeof value !== 'string' || re.test(value)) {
-            return false;
-        } else {
-            return true;
-        }
-    },
-
-    /**
-     * Checks if a multi line string containes lines longer than the selected value.
-     *
-     * Useful when detecting if a mail message needs any processing at all –
-     * if only plaintext characters are used and lines are short, then there is
-     * no need to encode the values in any way. If the value is plaintext but has
-     * longer lines then allowed, then use format=flowed
-     *
-     * @param {Number} lineLength Max line length to check for
-     * @returns {Boolean} Returns true if there is at least one line longer than lineLength chars
-     */
-    hasLongerLines(str, lineLength) {
-        if (str.length > 128 * 1024) {
-            // do not test strings longer than 128kB
-            return true;
-        }
-        return new RegExp('^.{' + (lineLength + 1) + ',}', 'm').test(str);
-    },
-
-    /**
-     * Encodes a string or an Buffer to an UTF-8 MIME Word (rfc2047)
-     *
-     * @param {String|Buffer} data String to be encoded
-     * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B
-     * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed
-     * @return {String} Single or several mime words joined together
-     */
-    encodeWord(data, mimeWordEncoding, maxLength) {
-        mimeWordEncoding = (mimeWordEncoding || 'Q').toString().toUpperCase().trim().charAt(0);
-        maxLength = maxLength || 0;
-
-        let encodedStr;
-        let toCharset = 'UTF-8';
-
-        if (maxLength && maxLength > 7 + toCharset.length) {
-            maxLength -= 7 + toCharset.length;
-        }
-
-        if (mimeWordEncoding === 'Q') {
-            // https://tools.ietf.org/html/rfc2047#section-5 rule (3)
-            encodedStr = qp.encode(data).replace(/[^a-z0-9!*+\-/=]/gi, chr => {
-                let ord = chr.charCodeAt(0).toString(16).toUpperCase();
-                if (chr === ' ') {
-                    return '_';
-                } else {
-                    return '=' + (ord.length === 1 ? '0' + ord : ord);
-                }
-            });
-        } else if (mimeWordEncoding === 'B') {
-            encodedStr = typeof data === 'string' ? data : base64.encode(data);
-            maxLength = maxLength ? Math.max(3, ((maxLength - (maxLength % 4)) / 4) * 3) : 0;
-        }
-
-        if (maxLength && (mimeWordEncoding !== 'B' ? encodedStr : base64.encode(data)).length > maxLength) {
-            if (mimeWordEncoding === 'Q') {
-                encodedStr = this.splitMimeEncodedString(encodedStr, maxLength).join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');
-            } else {
-                // RFC2047 6.3 (2) states that encoded-word must include an integral number of characters, so no chopping unicode sequences
-                let parts = [];
-                let lpart = '';
-                for (let i = 0, len = encodedStr.length; i < len; i++) {
-                    let chr = encodedStr.charAt(i);
-
-                    if (/[\ud83c\ud83d\ud83e]/.test(chr) && i < len - 1) {
-                        // composite emoji byte, so add the next byte as well
-                        chr += encodedStr.charAt(++i);
-                    }
-
-                    // check if we can add this character to the existing string
-                    // without breaking byte length limit
-                    if (Buffer.byteLength(lpart + chr) <= maxLength || i === 0) {
-                        lpart += chr;
-                    } else {
-                        // we hit the length limit, so push the existing string and start over
-                        parts.push(base64.encode(lpart));
-                        lpart = chr;
-                    }
-                }
-                if (lpart) {
-                    parts.push(base64.encode(lpart));
-                }
-
-                if (parts.length > 1) {
-                    encodedStr = parts.join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');
-                } else {
-                    encodedStr = parts.join('');
-                }
-            }
-        } else if (mimeWordEncoding === 'B') {
-            encodedStr = base64.encode(data);
-        }
-
-        return '=?' + toCharset + '?' + mimeWordEncoding + '?' + encodedStr + (encodedStr.substr(-2) === '?=' ? '' : '?=');
-    },
-
-    /**
-     * Finds word sequences with non ascii text and converts these to mime words
-     *
-     * @param {String} value String to be encoded
-     * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B
-     * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed
-     * @param {Boolean} [encodeAll=false] If true and the value needs encoding then encodes entire string, not just the smallest match
-     * @return {String} String with possible mime words
-     */
-    encodeWords(value, mimeWordEncoding, maxLength, encodeAll) {
-        maxLength = maxLength || 0;
-
-        let encodedValue;
-
-        // find first word with a non-printable ascii or special symbol in it
-        let firstMatch = value.match(/(?:^|\s)([^\s]*["\u0080-\uFFFF])/);
-        if (!firstMatch) {
-            return value;
-        }
-
-        if (encodeAll) {
-            // if it is requested to encode everything or the string contains something that resebles encoded word, then encode everything
-
-            return this.encodeWord(value, mimeWordEncoding, maxLength);
-        }
-
-        // find the last word with a non-printable ascii in it
-        let lastMatch = value.match(/(["\u0080-\uFFFF][^\s]*)[^"\u0080-\uFFFF]*$/);
-        if (!lastMatch) {
-            // should not happen
-            return value;
-        }
-
-        let startIndex =
-            firstMatch.index +
-            (
-                firstMatch[0].match(/[^\s]/) || {
-                    index: 0
-                }
-            ).index;
-        let endIndex = lastMatch.index + (lastMatch[1] || '').length;
-
-        encodedValue =
-            (startIndex ? value.substr(0, startIndex) : '') +
-            this.encodeWord(value.substring(startIndex, endIndex), mimeWordEncoding || 'Q', maxLength) +
-            (endIndex < value.length ? value.substr(endIndex) : '');
-
-        return encodedValue;
-    },
-
-    /**
-     * Joins parsed header value together as 'value; param1=value1; param2=value2'
-     * PS: We are following RFC 822 for the list of special characters that we need to keep in quotes.
-     *      Refer: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html
-     * @param {Object} structured Parsed header value
-     * @return {String} joined header value
-     */
-    buildHeaderValue(structured) {
-        let paramsArray = [];
-
-        Object.keys(structured.params || {}).forEach(param => {
-            // filename might include unicode characters so it is a special case
-            // other values probably do not
-            let value = structured.params[param];
-            if (!this.isPlainText(value, true) || value.length >= 75) {
-                this.buildHeaderParam(param, value, 50).forEach(encodedParam => {
-                    if (!/[\s"\\;:/=(),<>@[\]?]|^[-']|'$/.test(encodedParam.value) || encodedParam.key.substr(-1) === '*') {
-                        paramsArray.push(encodedParam.key + '=' + encodedParam.value);
-                    } else {
-                        paramsArray.push(encodedParam.key + '=' + JSON.stringify(encodedParam.value));
-                    }
-                });
-            } else if (/[\s'"\\;:/=(),<>@[\]?]|^-/.test(value)) {
-                paramsArray.push(param + '=' + JSON.stringify(value));
-            } else {
-                paramsArray.push(param + '=' + value);
-            }
-        });
-
-        return structured.value + (paramsArray.length ? '; ' + paramsArray.join('; ') : '');
-    },
-
-    /**
-     * Encodes a string or an Buffer to an UTF-8 Parameter Value Continuation encoding (rfc2231)
-     * Useful for splitting long parameter values.
-     *
-     * For example
-     *      title="unicode string"
-     * becomes
-     *     title*0*=utf-8''unicode
-     *     title*1*=%20string
-     *
-     * @param {String|Buffer} data String to be encoded
-     * @param {Number} [maxLength=50] Max length for generated chunks
-     * @param {String} [fromCharset='UTF-8'] Source sharacter set
-     * @return {Array} A list of encoded keys and headers
-     */
-    buildHeaderParam(key, data, maxLength) {
-        let list = [];
-        let encodedStr = typeof data === 'string' ? data : (data || '').toString();
-        let encodedStrArr;
-        let chr, ord;
-        let line;
-        let startPos = 0;
-        let i, len;
-
-        maxLength = maxLength || 50;
-
-        // process ascii only text
-        if (this.isPlainText(data, true)) {
-            // check if conversion is even needed
-            if (encodedStr.length <= maxLength) {
-                return [
-                    {
-                        key,
-                        value: encodedStr
-                    }
-                ];
-            }
-
-            encodedStr = encodedStr.replace(new RegExp('.{' + maxLength + '}', 'g'), str => {
-                list.push({
-                    line: str
-                });
-                return '';
-            });
-
-            if (encodedStr) {
-                list.push({
-                    line: encodedStr
-                });
-            }
-        } else {
-            if (/[\uD800-\uDBFF]/.test(encodedStr)) {
-                // string containts surrogate pairs, so normalize it to an array of bytes
-                encodedStrArr = [];
-                for (i = 0, len = encodedStr.length; i < len; i++) {
-                    chr = encodedStr.charAt(i);
-                    ord = chr.charCodeAt(0);
-                    if (ord >= 0xd800 && ord <= 0xdbff && i < len - 1) {
-                        chr += encodedStr.charAt(i + 1);
-                        encodedStrArr.push(chr);
-                        i++;
-                    } else {
-                        encodedStrArr.push(chr);
-                    }
-                }
-                encodedStr = encodedStrArr;
-            }
-
-            // first line includes the charset and language info and needs to be encoded
-            // even if it does not contain any unicode characters
-            line = 'utf-8\x27\x27';
-            let encoded = true;
-            startPos = 0;
-
-            // process text with unicode or special chars
-            for (i = 0, len = encodedStr.length; i < len; i++) {
-                chr = encodedStr[i];
-
-                if (encoded) {
-                    chr = this.safeEncodeURIComponent(chr);
-                } else {
-                    // try to urlencode current char
-                    chr = chr === ' ' ? chr : this.safeEncodeURIComponent(chr);
-                    // By default it is not required to encode a line, the need
-                    // only appears when the string contains unicode or special chars
-                    // in this case we start processing the line over and encode all chars
-                    if (chr !== encodedStr[i]) {
-                        // Check if it is even possible to add the encoded char to the line
-                        // If not, there is no reason to use this line, just push it to the list
-                        // and start a new line with the char that needs encoding
-                        if ((this.safeEncodeURIComponent(line) + chr).length >= maxLength) {
-                            list.push({
-                                line,
-                                encoded
-                            });
-                            line = '';
-                            startPos = i - 1;
-                        } else {
-                            encoded = true;
-                            i = startPos;
-                            line = '';
-                            continue;
-                        }
-                    }
-                }
-
-                // if the line is already too long, push it to the list and start a new one
-                if ((line + chr).length >= maxLength) {
-                    list.push({
-                        line,
-                        encoded
-                    });
-                    line = chr = encodedStr[i] === ' ' ? ' ' : this.safeEncodeURIComponent(encodedStr[i]);
-                    if (chr === encodedStr[i]) {
-                        encoded = false;
-                        startPos = i - 1;
-                    } else {
-                        encoded = true;
-                    }
-                } else {
-                    line += chr;
-                }
-            }
-
-            if (line) {
-                list.push({
-                    line,
-                    encoded
-                });
-            }
-        }
-
-        return list.map((item, i) => ({
-            // encoded lines: {name}*{part}*
-            // unencoded lines: {name}*{part}
-            // if any line needs to be encoded then the first line (part==0) is always encoded
-            key: key + '*' + i + (item.encoded ? '*' : ''),
-            value: item.line
-        }));
-    },
-
-    /**
-     * Parses a header value with key=value arguments into a structured
-     * object.
-     *
-     *   parseHeaderValue('content-type: text/plain; CHARSET='UTF-8'') ->
-     *   {
-     *     'value': 'text/plain',
-     *     'params': {
-     *       'charset': 'UTF-8'
-     *     }
-     *   }
-     *
-     * @param {String} str Header value
-     * @return {Object} Header value as a parsed structure
-     */
-    parseHeaderValue(str) {
-        let response = {
-            value: false,
-            params: {}
-        };
-        let key = false;
-        let value = '';
-        let type = 'value';
-        let quote = false;
-        let escaped = false;
-        let chr;
-
-        for (let i = 0, len = str.length; i < len; i++) {
-            chr = str.charAt(i);
-            if (type === 'key') {
-                if (chr === '=') {
-                    key = value.trim().toLowerCase();
-                    type = 'value';
-                    value = '';
-                    continue;
-                }
-                value += chr;
-            } else {
-                if (escaped) {
-                    value += chr;
-                } else if (chr === '\\') {
-                    escaped = true;
-                    continue;
-                } else if (quote && chr === quote) {
-                    quote = false;
-                } else if (!quote && chr === '"') {
-                    quote = chr;
-                } else if (!quote && chr === ';') {
-                    if (key === false) {
-                        response.value = value.trim();
-                    } else {
-                        response.params[key] = value.trim();
-                    }
-                    type = 'key';
-                    value = '';
-                } else {
-                    value += chr;
-                }
-                escaped = false;
-            }
-        }
-
-        if (type === 'value') {
-            if (key === false) {
-                response.value = value.trim();
-            } else {
-                response.params[key] = value.trim();
-            }
-        } else if (value.trim()) {
-            response.params[value.trim().toLowerCase()] = '';
-        }
-
-        // handle parameter value continuations
-        // https://tools.ietf.org/html/rfc2231#section-3
-
-        // preprocess values
-        Object.keys(response.params).forEach(key => {
-            let actualKey, nr, match, value;
-            if ((match = key.match(/(\*(\d+)|\*(\d+)\*|\*)$/))) {
-                actualKey = key.substr(0, match.index);
-                nr = Number(match[2] || match[3]) || 0;
-
-                if (!response.params[actualKey] || typeof response.params[actualKey] !== 'object') {
-                    response.params[actualKey] = {
-                        charset: false,
-                        values: []
-                    };
-                }
-
-                value = response.params[key];
-
-                if (nr === 0 && match[0].substr(-1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {
-                    response.params[actualKey].charset = match[1] || 'iso-8859-1';
-                    value = match[2];
-                }
-
-                response.params[actualKey].values[nr] = value;
-
-                // remove the old reference
-                delete response.params[key];
-            }
-        });
-
-        // concatenate split rfc2231 strings and convert encoded strings to mime encoded words
-        Object.keys(response.params).forEach(key => {
-            let value;
-            if (response.params[key] && Array.isArray(response.params[key].values)) {
-                value = response.params[key].values.map(val => val || '').join('');
-
-                if (response.params[key].charset) {
-                    // convert "%AB" to "=?charset?Q?=AB?="
-                    response.params[key] =
-                        '=?' +
-                        response.params[key].charset +
-                        '?Q?' +
-                        value
-                            // fix invalidly encoded chars
-                            .replace(/[=?_\s]/g, s => {
-                                let c = s.charCodeAt(0).toString(16);
-                                if (s === ' ') {
-                                    return '_';
-                                } else {
-                                    return '%' + (c.length < 2 ? '0' : '') + c;
-                                }
-                            })
-                            // change from urlencoding to percent encoding
-                            .replace(/%/g, '=') +
-                        '?=';
-                } else {
-                    response.params[key] = value;
-                }
-            }
-        });
-
-        return response;
-    },
-
-    /**
-     * Returns file extension for a content type string. If no suitable extensions
-     * are found, 'bin' is used as the default extension
-     *
-     * @param {String} mimeType Content type to be checked for
-     * @return {String} File extension
-     */
-    detectExtension: mimeType => mimeTypes.detectExtension(mimeType),
-
-    /**
-     * Returns content type for a file extension. If no suitable content types
-     * are found, 'application/octet-stream' is used as the default content type
-     *
-     * @param {String} extension Extension to be checked for
-     * @return {String} File extension
-     */
-    detectMimeType: extension => mimeTypes.detectMimeType(extension),
-
-    /**
-     * Folds long lines, useful for folding header lines (afterSpace=false) and
-     * flowed text (afterSpace=true)
-     *
-     * @param {String} str String to be folded
-     * @param {Number} [lineLength=76] Maximum length of a line
-     * @param {Boolean} afterSpace If true, leave a space in th end of a line
-     * @return {String} String with folded lines
-     */
-    foldLines(str, lineLength, afterSpace) {
-        str = (str || '').toString();
-        lineLength = lineLength || 76;
-
-        let pos = 0,
-            len = str.length,
-            result = '',
-            line,
-            match;
-
-        while (pos < len) {
-            line = str.substr(pos, lineLength);
-            if (line.length < lineLength) {
-                result += line;
-                break;
-            }
-            if ((match = line.match(/^[^\n\r]*(\r?\n|\r)/))) {
-                line = match[0];
-                result += line;
-                pos += line.length;
-                continue;
-            } else if ((match = line.match(/(\s+)[^\s]*$/)) && match[0].length - (afterSpace ? (match[1] || '').length : 0) < line.length) {
-                line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || '').length : 0)));
-            } else if ((match = str.substr(pos + line.length).match(/^[^\s]+(\s*)/))) {
-                line = line + match[0].substr(0, match[0].length - (!afterSpace ? (match[1] || '').length : 0));
-            }
-
-            result += line;
-            pos += line.length;
-            if (pos < len) {
-                result += '\r\n';
-            }
-        }
-
-        return result;
-    },
-
-    /**
-     * Splits a mime encoded string. Needed for dividing mime words into smaller chunks
-     *
-     * @param {String} str Mime encoded string to be split up
-     * @param {Number} maxlen Maximum length of characters for one part (minimum 12)
-     * @return {Array} Split string
-     */
-    splitMimeEncodedString: (str, maxlen) => {
-        let curLine,
-            match,
-            chr,
-            done,
-            lines = [];
-
-        // require at least 12 symbols to fit possible 4 octet UTF-8 sequences
-        maxlen = Math.max(maxlen || 0, 12);
-
-        while (str.length) {
-            curLine = str.substr(0, maxlen);
-
-            // move incomplete escaped char back to main
-            if ((match = curLine.match(/[=][0-9A-F]?$/i))) {
-                curLine = curLine.substr(0, match.index);
-            }
-
-            done = false;
-            while (!done) {
-                done = true;
-                // check if not middle of a unicode char sequence
-                if ((match = str.substr(curLine.length).match(/^[=]([0-9A-F]{2})/i))) {
-                    chr = parseInt(match[1], 16);
-                    // invalid sequence, move one char back anc recheck
-                    if (chr < 0xc2 && chr > 0x7f) {
-                        curLine = curLine.substr(0, curLine.length - 3);
-                        done = false;
-                    }
-                }
-            }
-
-            if (curLine.length) {
-                lines.push(curLine);
-            }
-            str = str.substr(curLine.length);
-        }
-
-        return lines;
-    },
-
-    encodeURICharComponent: chr => {
-        let res = '';
-        let ord = chr.charCodeAt(0).toString(16).toUpperCase();
-
-        if (ord.length % 2) {
-            ord = '0' + ord;
-        }
-
-        if (ord.length > 2) {
-            for (let i = 0, len = ord.length / 2; i < len; i++) {
-                res += '%' + ord.substr(i, 2);
-            }
-        } else {
-            res += '%' + ord;
-        }
-
-        return res;
-    },
-
-    safeEncodeURIComponent(str) {
-        str = (str || '').toString();
-
-        try {
-            // might throw if we try to encode invalid sequences, eg. partial emoji
-            str = encodeURIComponent(str);
-        } catch (E) {
-            // should never run
-            return str.replace(/[^\x00-\x1F *'()<>@,;:\\"[\]?=\u007F-\uFFFF]+/g, '');
-        }
-
-        // ensure chars that are not handled by encodeURICompent are converted as well
-        return str.replace(/[\x00-\x1F *'()<>@,;:\\"[\]?=\u007F-\uFFFF]/g, chr => this.encodeURICharComponent(chr));
-    }
-};
Index: de_modules/nodemailer/lib/mime-funcs/mime-types.js
===================================================================
--- node_modules/nodemailer/lib/mime-funcs/mime-types.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,2104 +1,0 @@
-/* eslint quote-props: 0 */
-
-'use strict';
-
-const path = require('path');
-
-const defaultMimeType = 'application/octet-stream';
-const defaultExtension = 'bin';
-
-const mimeTypes = new Map([
-    ['application/acad', 'dwg'],
-    ['application/applixware', 'aw'],
-    ['application/arj', 'arj'],
-    ['application/atom+xml', 'xml'],
-    ['application/atomcat+xml', 'atomcat'],
-    ['application/atomsvc+xml', 'atomsvc'],
-    ['application/base64', ['mm', 'mme']],
-    ['application/binhex', 'hqx'],
-    ['application/binhex4', 'hqx'],
-    ['application/book', ['book', 'boo']],
-    ['application/ccxml+xml,', 'ccxml'],
-    ['application/cdf', 'cdf'],
-    ['application/cdmi-capability', 'cdmia'],
-    ['application/cdmi-container', 'cdmic'],
-    ['application/cdmi-domain', 'cdmid'],
-    ['application/cdmi-object', 'cdmio'],
-    ['application/cdmi-queue', 'cdmiq'],
-    ['application/clariscad', 'ccad'],
-    ['application/commonground', 'dp'],
-    ['application/cu-seeme', 'cu'],
-    ['application/davmount+xml', 'davmount'],
-    ['application/drafting', 'drw'],
-    ['application/dsptype', 'tsp'],
-    ['application/dssc+der', 'dssc'],
-    ['application/dssc+xml', 'xdssc'],
-    ['application/dxf', 'dxf'],
-    ['application/ecmascript', ['js', 'es']],
-    ['application/emma+xml', 'emma'],
-    ['application/envoy', 'evy'],
-    ['application/epub+zip', 'epub'],
-    ['application/excel', ['xls', 'xl', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],
-    ['application/exi', 'exi'],
-    ['application/font-tdpfr', 'pfr'],
-    ['application/fractals', 'fif'],
-    ['application/freeloader', 'frl'],
-    ['application/futuresplash', 'spl'],
-    ['application/geo+json', 'geojson'],
-    ['application/gnutar', 'tgz'],
-    ['application/groupwise', 'vew'],
-    ['application/hlp', 'hlp'],
-    ['application/hta', 'hta'],
-    ['application/hyperstudio', 'stk'],
-    ['application/i-deas', 'unv'],
-    ['application/iges', ['iges', 'igs']],
-    ['application/inf', 'inf'],
-    ['application/internet-property-stream', 'acx'],
-    ['application/ipfix', 'ipfix'],
-    ['application/java', 'class'],
-    ['application/java-archive', 'jar'],
-    ['application/java-byte-code', 'class'],
-    ['application/java-serialized-object', 'ser'],
-    ['application/java-vm', 'class'],
-    ['application/javascript', 'js'],
-    ['application/json', 'json'],
-    ['application/lha', 'lha'],
-    ['application/lzx', 'lzx'],
-    ['application/mac-binary', 'bin'],
-    ['application/mac-binhex', 'hqx'],
-    ['application/mac-binhex40', 'hqx'],
-    ['application/mac-compactpro', 'cpt'],
-    ['application/macbinary', 'bin'],
-    ['application/mads+xml', 'mads'],
-    ['application/marc', 'mrc'],
-    ['application/marcxml+xml', 'mrcx'],
-    ['application/mathematica', 'ma'],
-    ['application/mathml+xml', 'mathml'],
-    ['application/mbedlet', 'mbd'],
-    ['application/mbox', 'mbox'],
-    ['application/mcad', 'mcd'],
-    ['application/mediaservercontrol+xml', 'mscml'],
-    ['application/metalink4+xml', 'meta4'],
-    ['application/mets+xml', 'mets'],
-    ['application/mime', 'aps'],
-    ['application/mods+xml', 'mods'],
-    ['application/mp21', 'm21'],
-    ['application/mp4', 'mp4'],
-    ['application/mspowerpoint', ['ppt', 'pot', 'pps', 'ppz']],
-    ['application/msword', ['doc', 'dot', 'w6w', 'wiz', 'word']],
-    ['application/mswrite', 'wri'],
-    ['application/mxf', 'mxf'],
-    ['application/netmc', 'mcp'],
-    ['application/octet-stream', ['*']],
-    ['application/oda', 'oda'],
-    ['application/oebps-package+xml', 'opf'],
-    ['application/ogg', 'ogx'],
-    ['application/olescript', 'axs'],
-    ['application/onenote', 'onetoc'],
-    ['application/patch-ops-error+xml', 'xer'],
-    ['application/pdf', 'pdf'],
-    ['application/pgp-encrypted', 'asc'],
-    ['application/pgp-signature', 'pgp'],
-    ['application/pics-rules', 'prf'],
-    ['application/pkcs-12', 'p12'],
-    ['application/pkcs-crl', 'crl'],
-    ['application/pkcs10', 'p10'],
-    ['application/pkcs7-mime', ['p7c', 'p7m']],
-    ['application/pkcs7-signature', 'p7s'],
-    ['application/pkcs8', 'p8'],
-    ['application/pkix-attr-cert', 'ac'],
-    ['application/pkix-cert', ['cer', 'crt']],
-    ['application/pkix-crl', 'crl'],
-    ['application/pkix-pkipath', 'pkipath'],
-    ['application/pkixcmp', 'pki'],
-    ['application/plain', 'text'],
-    ['application/pls+xml', 'pls'],
-    ['application/postscript', ['ps', 'ai', 'eps']],
-    ['application/powerpoint', 'ppt'],
-    ['application/pro_eng', ['part', 'prt']],
-    ['application/prs.cww', 'cww'],
-    ['application/pskc+xml', 'pskcxml'],
-    ['application/rdf+xml', 'rdf'],
-    ['application/reginfo+xml', 'rif'],
-    ['application/relax-ng-compact-syntax', 'rnc'],
-    ['application/resource-lists+xml', 'rl'],
-    ['application/resource-lists-diff+xml', 'rld'],
-    ['application/ringing-tones', 'rng'],
-    ['application/rls-services+xml', 'rs'],
-    ['application/rsd+xml', 'rsd'],
-    ['application/rss+xml', 'xml'],
-    ['application/rtf', ['rtf', 'rtx']],
-    ['application/sbml+xml', 'sbml'],
-    ['application/scvp-cv-request', 'scq'],
-    ['application/scvp-cv-response', 'scs'],
-    ['application/scvp-vp-request', 'spq'],
-    ['application/scvp-vp-response', 'spp'],
-    ['application/sdp', 'sdp'],
-    ['application/sea', 'sea'],
-    ['application/set', 'set'],
-    ['application/set-payment-initiation', 'setpay'],
-    ['application/set-registration-initiation', 'setreg'],
-    ['application/shf+xml', 'shf'],
-    ['application/sla', 'stl'],
-    ['application/smil', ['smi', 'smil']],
-    ['application/smil+xml', 'smi'],
-    ['application/solids', 'sol'],
-    ['application/sounder', 'sdr'],
-    ['application/sparql-query', 'rq'],
-    ['application/sparql-results+xml', 'srx'],
-    ['application/srgs', 'gram'],
-    ['application/srgs+xml', 'grxml'],
-    ['application/sru+xml', 'sru'],
-    ['application/ssml+xml', 'ssml'],
-    ['application/step', ['step', 'stp']],
-    ['application/streamingmedia', 'ssm'],
-    ['application/tei+xml', 'tei'],
-    ['application/thraud+xml', 'tfi'],
-    ['application/timestamped-data', 'tsd'],
-    ['application/toolbook', 'tbk'],
-    ['application/vda', 'vda'],
-    ['application/vnd.3gpp.pic-bw-large', 'plb'],
-    ['application/vnd.3gpp.pic-bw-small', 'psb'],
-    ['application/vnd.3gpp.pic-bw-var', 'pvb'],
-    ['application/vnd.3gpp2.tcap', 'tcap'],
-    ['application/vnd.3m.post-it-notes', 'pwn'],
-    ['application/vnd.accpac.simply.aso', 'aso'],
-    ['application/vnd.accpac.simply.imp', 'imp'],
-    ['application/vnd.acucobol', 'acu'],
-    ['application/vnd.acucorp', 'atc'],
-    ['application/vnd.adobe.air-application-installer-package+zip', 'air'],
-    ['application/vnd.adobe.fxp', 'fxp'],
-    ['application/vnd.adobe.xdp+xml', 'xdp'],
-    ['application/vnd.adobe.xfdf', 'xfdf'],
-    ['application/vnd.ahead.space', 'ahead'],
-    ['application/vnd.airzip.filesecure.azf', 'azf'],
-    ['application/vnd.airzip.filesecure.azs', 'azs'],
-    ['application/vnd.amazon.ebook', 'azw'],
-    ['application/vnd.americandynamics.acc', 'acc'],
-    ['application/vnd.amiga.ami', 'ami'],
-    ['application/vnd.android.package-archive', 'apk'],
-    ['application/vnd.anser-web-certificate-issue-initiation', 'cii'],
-    ['application/vnd.anser-web-funds-transfer-initiation', 'fti'],
-    ['application/vnd.antix.game-component', 'atx'],
-    ['application/vnd.apple.installer+xml', 'mpkg'],
-    ['application/vnd.apple.mpegurl', 'm3u8'],
-    ['application/vnd.aristanetworks.swi', 'swi'],
-    ['application/vnd.audiograph', 'aep'],
-    ['application/vnd.blueice.multipass', 'mpm'],
-    ['application/vnd.bmi', 'bmi'],
-    ['application/vnd.businessobjects', 'rep'],
-    ['application/vnd.chemdraw+xml', 'cdxml'],
-    ['application/vnd.chipnuts.karaoke-mmd', 'mmd'],
-    ['application/vnd.cinderella', 'cdy'],
-    ['application/vnd.claymore', 'cla'],
-    ['application/vnd.cloanto.rp9', 'rp9'],
-    ['application/vnd.clonk.c4group', 'c4g'],
-    ['application/vnd.cluetrust.cartomobile-config', 'c11amc'],
-    ['application/vnd.cluetrust.cartomobile-config-pkg', 'c11amz'],
-    ['application/vnd.commonspace', 'csp'],
-    ['application/vnd.contact.cmsg', 'cdbcmsg'],
-    ['application/vnd.cosmocaller', 'cmc'],
-    ['application/vnd.crick.clicker', 'clkx'],
-    ['application/vnd.crick.clicker.keyboard', 'clkk'],
-    ['application/vnd.crick.clicker.palette', 'clkp'],
-    ['application/vnd.crick.clicker.template', 'clkt'],
-    ['application/vnd.crick.clicker.wordbank', 'clkw'],
-    ['application/vnd.criticaltools.wbs+xml', 'wbs'],
-    ['application/vnd.ctc-posml', 'pml'],
-    ['application/vnd.cups-ppd', 'ppd'],
-    ['application/vnd.curl.car', 'car'],
-    ['application/vnd.curl.pcurl', 'pcurl'],
-    ['application/vnd.data-vision.rdz', 'rdz'],
-    ['application/vnd.denovo.fcselayout-link', 'fe_launch'],
-    ['application/vnd.dna', 'dna'],
-    ['application/vnd.dolby.mlp', 'mlp'],
-    ['application/vnd.dpgraph', 'dpg'],
-    ['application/vnd.dreamfactory', 'dfac'],
-    ['application/vnd.dvb.ait', 'ait'],
-    ['application/vnd.dvb.service', 'svc'],
-    ['application/vnd.dynageo', 'geo'],
-    ['application/vnd.ecowin.chart', 'mag'],
-    ['application/vnd.enliven', 'nml'],
-    ['application/vnd.epson.esf', 'esf'],
-    ['application/vnd.epson.msf', 'msf'],
-    ['application/vnd.epson.quickanime', 'qam'],
-    ['application/vnd.epson.salt', 'slt'],
-    ['application/vnd.epson.ssf', 'ssf'],
-    ['application/vnd.eszigno3+xml', 'es3'],
-    ['application/vnd.ezpix-album', 'ez2'],
-    ['application/vnd.ezpix-package', 'ez3'],
-    ['application/vnd.fdf', 'fdf'],
-    ['application/vnd.fdsn.seed', 'seed'],
-    ['application/vnd.flographit', 'gph'],
-    ['application/vnd.fluxtime.clip', 'ftc'],
-    ['application/vnd.framemaker', 'fm'],
-    ['application/vnd.frogans.fnc', 'fnc'],
-    ['application/vnd.frogans.ltf', 'ltf'],
-    ['application/vnd.fsc.weblaunch', 'fsc'],
-    ['application/vnd.fujitsu.oasys', 'oas'],
-    ['application/vnd.fujitsu.oasys2', 'oa2'],
-    ['application/vnd.fujitsu.oasys3', 'oa3'],
-    ['application/vnd.fujitsu.oasysgp', 'fg5'],
-    ['application/vnd.fujitsu.oasysprs', 'bh2'],
-    ['application/vnd.fujixerox.ddd', 'ddd'],
-    ['application/vnd.fujixerox.docuworks', 'xdw'],
-    ['application/vnd.fujixerox.docuworks.binder', 'xbd'],
-    ['application/vnd.fuzzysheet', 'fzs'],
-    ['application/vnd.genomatix.tuxedo', 'txd'],
-    ['application/vnd.geogebra.file', 'ggb'],
-    ['application/vnd.geogebra.tool', 'ggt'],
-    ['application/vnd.geometry-explorer', 'gex'],
-    ['application/vnd.geonext', 'gxt'],
-    ['application/vnd.geoplan', 'g2w'],
-    ['application/vnd.geospace', 'g3w'],
-    ['application/vnd.gmx', 'gmx'],
-    ['application/vnd.google-earth.kml+xml', 'kml'],
-    ['application/vnd.google-earth.kmz', 'kmz'],
-    ['application/vnd.grafeq', 'gqf'],
-    ['application/vnd.groove-account', 'gac'],
-    ['application/vnd.groove-help', 'ghf'],
-    ['application/vnd.groove-identity-message', 'gim'],
-    ['application/vnd.groove-injector', 'grv'],
-    ['application/vnd.groove-tool-message', 'gtm'],
-    ['application/vnd.groove-tool-template', 'tpl'],
-    ['application/vnd.groove-vcard', 'vcg'],
-    ['application/vnd.hal+xml', 'hal'],
-    ['application/vnd.handheld-entertainment+xml', 'zmm'],
-    ['application/vnd.hbci', 'hbci'],
-    ['application/vnd.hhe.lesson-player', 'les'],
-    ['application/vnd.hp-hpgl', ['hgl', 'hpg', 'hpgl']],
-    ['application/vnd.hp-hpid', 'hpid'],
-    ['application/vnd.hp-hps', 'hps'],
-    ['application/vnd.hp-jlyt', 'jlt'],
-    ['application/vnd.hp-pcl', 'pcl'],
-    ['application/vnd.hp-pclxl', 'pclxl'],
-    ['application/vnd.hydrostatix.sof-data', 'sfd-hdstx'],
-    ['application/vnd.hzn-3d-crossword', 'x3d'],
-    ['application/vnd.ibm.minipay', 'mpy'],
-    ['application/vnd.ibm.modcap', 'afp'],
-    ['application/vnd.ibm.rights-management', 'irm'],
-    ['application/vnd.ibm.secure-container', 'sc'],
-    ['application/vnd.iccprofile', 'icc'],
-    ['application/vnd.igloader', 'igl'],
-    ['application/vnd.immervision-ivp', 'ivp'],
-    ['application/vnd.immervision-ivu', 'ivu'],
-    ['application/vnd.insors.igm', 'igm'],
-    ['application/vnd.intercon.formnet', 'xpw'],
-    ['application/vnd.intergeo', 'i2g'],
-    ['application/vnd.intu.qbo', 'qbo'],
-    ['application/vnd.intu.qfx', 'qfx'],
-    ['application/vnd.ipunplugged.rcprofile', 'rcprofile'],
-    ['application/vnd.irepository.package+xml', 'irp'],
-    ['application/vnd.is-xpr', 'xpr'],
-    ['application/vnd.isac.fcs', 'fcs'],
-    ['application/vnd.jam', 'jam'],
-    ['application/vnd.jcp.javame.midlet-rms', 'rms'],
-    ['application/vnd.jisp', 'jisp'],
-    ['application/vnd.joost.joda-archive', 'joda'],
-    ['application/vnd.kahootz', 'ktz'],
-    ['application/vnd.kde.karbon', 'karbon'],
-    ['application/vnd.kde.kchart', 'chrt'],
-    ['application/vnd.kde.kformula', 'kfo'],
-    ['application/vnd.kde.kivio', 'flw'],
-    ['application/vnd.kde.kontour', 'kon'],
-    ['application/vnd.kde.kpresenter', 'kpr'],
-    ['application/vnd.kde.kspread', 'ksp'],
-    ['application/vnd.kde.kword', 'kwd'],
-    ['application/vnd.kenameaapp', 'htke'],
-    ['application/vnd.kidspiration', 'kia'],
-    ['application/vnd.kinar', 'kne'],
-    ['application/vnd.koan', 'skp'],
-    ['application/vnd.kodak-descriptor', 'sse'],
-    ['application/vnd.las.las+xml', 'lasxml'],
-    ['application/vnd.llamagraphics.life-balance.desktop', 'lbd'],
-    ['application/vnd.llamagraphics.life-balance.exchange+xml', 'lbe'],
-    ['application/vnd.lotus-1-2-3', '123'],
-    ['application/vnd.lotus-approach', 'apr'],
-    ['application/vnd.lotus-freelance', 'pre'],
-    ['application/vnd.lotus-notes', 'nsf'],
-    ['application/vnd.lotus-organizer', 'org'],
-    ['application/vnd.lotus-screencam', 'scm'],
-    ['application/vnd.lotus-wordpro', 'lwp'],
-    ['application/vnd.macports.portpkg', 'portpkg'],
-    ['application/vnd.mcd', 'mcd'],
-    ['application/vnd.medcalcdata', 'mc1'],
-    ['application/vnd.mediastation.cdkey', 'cdkey'],
-    ['application/vnd.mfer', 'mwf'],
-    ['application/vnd.mfmp', 'mfm'],
-    ['application/vnd.micrografx.flo', 'flo'],
-    ['application/vnd.micrografx.igx', 'igx'],
-    ['application/vnd.mif', 'mif'],
-    ['application/vnd.mobius.daf', 'daf'],
-    ['application/vnd.mobius.dis', 'dis'],
-    ['application/vnd.mobius.mbk', 'mbk'],
-    ['application/vnd.mobius.mqy', 'mqy'],
-    ['application/vnd.mobius.msl', 'msl'],
-    ['application/vnd.mobius.plc', 'plc'],
-    ['application/vnd.mobius.txf', 'txf'],
-    ['application/vnd.mophun.application', 'mpn'],
-    ['application/vnd.mophun.certificate', 'mpc'],
-    ['application/vnd.mozilla.xul+xml', 'xul'],
-    ['application/vnd.ms-artgalry', 'cil'],
-    ['application/vnd.ms-cab-compressed', 'cab'],
-    ['application/vnd.ms-excel', ['xls', 'xla', 'xlc', 'xlm', 'xlt', 'xlw', 'xlb', 'xll']],
-    ['application/vnd.ms-excel.addin.macroenabled.12', 'xlam'],
-    ['application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsb'],
-    ['application/vnd.ms-excel.sheet.macroenabled.12', 'xlsm'],
-    ['application/vnd.ms-excel.template.macroenabled.12', 'xltm'],
-    ['application/vnd.ms-fontobject', 'eot'],
-    ['application/vnd.ms-htmlhelp', 'chm'],
-    ['application/vnd.ms-ims', 'ims'],
-    ['application/vnd.ms-lrm', 'lrm'],
-    ['application/vnd.ms-officetheme', 'thmx'],
-    ['application/vnd.ms-outlook', 'msg'],
-    ['application/vnd.ms-pki.certstore', 'sst'],
-    ['application/vnd.ms-pki.pko', 'pko'],
-    ['application/vnd.ms-pki.seccat', 'cat'],
-    ['application/vnd.ms-pki.stl', 'stl'],
-    ['application/vnd.ms-pkicertstore', 'sst'],
-    ['application/vnd.ms-pkiseccat', 'cat'],
-    ['application/vnd.ms-pkistl', 'stl'],
-    ['application/vnd.ms-powerpoint', ['ppt', 'pot', 'pps', 'ppa', 'pwz']],
-    ['application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppam'],
-    ['application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptm'],
-    ['application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldm'],
-    ['application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsm'],
-    ['application/vnd.ms-powerpoint.template.macroenabled.12', 'potm'],
-    ['application/vnd.ms-project', 'mpp'],
-    ['application/vnd.ms-word.document.macroenabled.12', 'docm'],
-    ['application/vnd.ms-word.template.macroenabled.12', 'dotm'],
-    ['application/vnd.ms-works', ['wks', 'wcm', 'wdb', 'wps']],
-    ['application/vnd.ms-wpl', 'wpl'],
-    ['application/vnd.ms-xpsdocument', 'xps'],
-    ['application/vnd.mseq', 'mseq'],
-    ['application/vnd.musician', 'mus'],
-    ['application/vnd.muvee.style', 'msty'],
-    ['application/vnd.neurolanguage.nlu', 'nlu'],
-    ['application/vnd.noblenet-directory', 'nnd'],
-    ['application/vnd.noblenet-sealer', 'nns'],
-    ['application/vnd.noblenet-web', 'nnw'],
-    ['application/vnd.nokia.configuration-message', 'ncm'],
-    ['application/vnd.nokia.n-gage.data', 'ngdat'],
-    ['application/vnd.nokia.n-gage.symbian.install', 'n-gage'],
-    ['application/vnd.nokia.radio-preset', 'rpst'],
-    ['application/vnd.nokia.radio-presets', 'rpss'],
-    ['application/vnd.nokia.ringing-tone', 'rng'],
-    ['application/vnd.novadigm.edm', 'edm'],
-    ['application/vnd.novadigm.edx', 'edx'],
-    ['application/vnd.novadigm.ext', 'ext'],
-    ['application/vnd.oasis.opendocument.chart', 'odc'],
-    ['application/vnd.oasis.opendocument.chart-template', 'otc'],
-    ['application/vnd.oasis.opendocument.database', 'odb'],
-    ['application/vnd.oasis.opendocument.formula', 'odf'],
-    ['application/vnd.oasis.opendocument.formula-template', 'odft'],
-    ['application/vnd.oasis.opendocument.graphics', 'odg'],
-    ['application/vnd.oasis.opendocument.graphics-template', 'otg'],
-    ['application/vnd.oasis.opendocument.image', 'odi'],
-    ['application/vnd.oasis.opendocument.image-template', 'oti'],
-    ['application/vnd.oasis.opendocument.presentation', 'odp'],
-    ['application/vnd.oasis.opendocument.presentation-template', 'otp'],
-    ['application/vnd.oasis.opendocument.spreadsheet', 'ods'],
-    ['application/vnd.oasis.opendocument.spreadsheet-template', 'ots'],
-    ['application/vnd.oasis.opendocument.text', 'odt'],
-    ['application/vnd.oasis.opendocument.text-master', 'odm'],
-    ['application/vnd.oasis.opendocument.text-template', 'ott'],
-    ['application/vnd.oasis.opendocument.text-web', 'oth'],
-    ['application/vnd.olpc-sugar', 'xo'],
-    ['application/vnd.oma.dd2+xml', 'dd2'],
-    ['application/vnd.openofficeorg.extension', 'oxt'],
-    ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptx'],
-    ['application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldx'],
-    ['application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsx'],
-    ['application/vnd.openxmlformats-officedocument.presentationml.template', 'potx'],
-    ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx'],
-    ['application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltx'],
-    ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docx'],
-    ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotx'],
-    ['application/vnd.osgeo.mapguide.package', 'mgp'],
-    ['application/vnd.osgi.dp', 'dp'],
-    ['application/vnd.palm', 'pdb'],
-    ['application/vnd.pawaafile', 'paw'],
-    ['application/vnd.pg.format', 'str'],
-    ['application/vnd.pg.osasli', 'ei6'],
-    ['application/vnd.picsel', 'efif'],
-    ['application/vnd.pmi.widget', 'wg'],
-    ['application/vnd.pocketlearn', 'plf'],
-    ['application/vnd.powerbuilder6', 'pbd'],
-    ['application/vnd.previewsystems.box', 'box'],
-    ['application/vnd.proteus.magazine', 'mgz'],
-    ['application/vnd.publishare-delta-tree', 'qps'],
-    ['application/vnd.pvi.ptid1', 'ptid'],
-    ['application/vnd.quark.quarkxpress', 'qxd'],
-    ['application/vnd.realvnc.bed', 'bed'],
-    ['application/vnd.recordare.musicxml', 'mxl'],
-    ['application/vnd.recordare.musicxml+xml', 'musicxml'],
-    ['application/vnd.rig.cryptonote', 'cryptonote'],
-    ['application/vnd.rim.cod', 'cod'],
-    ['application/vnd.rn-realmedia', 'rm'],
-    ['application/vnd.rn-realplayer', 'rnx'],
-    ['application/vnd.route66.link66+xml', 'link66'],
-    ['application/vnd.sailingtracker.track', 'st'],
-    ['application/vnd.seemail', 'see'],
-    ['application/vnd.sema', 'sema'],
-    ['application/vnd.semd', 'semd'],
-    ['application/vnd.semf', 'semf'],
-    ['application/vnd.shana.informed.formdata', 'ifm'],
-    ['application/vnd.shana.informed.formtemplate', 'itp'],
-    ['application/vnd.shana.informed.interchange', 'iif'],
-    ['application/vnd.shana.informed.package', 'ipk'],
-    ['application/vnd.simtech-mindmapper', 'twd'],
-    ['application/vnd.smaf', 'mmf'],
-    ['application/vnd.smart.teacher', 'teacher'],
-    ['application/vnd.solent.sdkm+xml', 'sdkm'],
-    ['application/vnd.spotfire.dxp', 'dxp'],
-    ['application/vnd.spotfire.sfs', 'sfs'],
-    ['application/vnd.stardivision.calc', 'sdc'],
-    ['application/vnd.stardivision.draw', 'sda'],
-    ['application/vnd.stardivision.impress', 'sdd'],
-    ['application/vnd.stardivision.math', 'smf'],
-    ['application/vnd.stardivision.writer', 'sdw'],
-    ['application/vnd.stardivision.writer-global', 'sgl'],
-    ['application/vnd.stepmania.stepchart', 'sm'],
-    ['application/vnd.sun.xml.calc', 'sxc'],
-    ['application/vnd.sun.xml.calc.template', 'stc'],
-    ['application/vnd.sun.xml.draw', 'sxd'],
-    ['application/vnd.sun.xml.draw.template', 'std'],
-    ['application/vnd.sun.xml.impress', 'sxi'],
-    ['application/vnd.sun.xml.impress.template', 'sti'],
-    ['application/vnd.sun.xml.math', 'sxm'],
-    ['application/vnd.sun.xml.writer', 'sxw'],
-    ['application/vnd.sun.xml.writer.global', 'sxg'],
-    ['application/vnd.sun.xml.writer.template', 'stw'],
-    ['application/vnd.sus-calendar', 'sus'],
-    ['application/vnd.svd', 'svd'],
-    ['application/vnd.symbian.install', 'sis'],
-    ['application/vnd.syncml+xml', 'xsm'],
-    ['application/vnd.syncml.dm+wbxml', 'bdm'],
-    ['application/vnd.syncml.dm+xml', 'xdm'],
-    ['application/vnd.tao.intent-module-archive', 'tao'],
-    ['application/vnd.tmobile-livetv', 'tmo'],
-    ['application/vnd.trid.tpt', 'tpt'],
-    ['application/vnd.triscape.mxs', 'mxs'],
-    ['application/vnd.trueapp', 'tra'],
-    ['application/vnd.ufdl', 'ufd'],
-    ['application/vnd.uiq.theme', 'utz'],
-    ['application/vnd.umajin', 'umj'],
-    ['application/vnd.unity', 'unityweb'],
-    ['application/vnd.uoml+xml', 'uoml'],
-    ['application/vnd.vcx', 'vcx'],
-    ['application/vnd.visio', 'vsd'],
-    ['application/vnd.visionary', 'vis'],
-    ['application/vnd.vsf', 'vsf'],
-    ['application/vnd.wap.wbxml', 'wbxml'],
-    ['application/vnd.wap.wmlc', 'wmlc'],
-    ['application/vnd.wap.wmlscriptc', 'wmlsc'],
-    ['application/vnd.webturbo', 'wtb'],
-    ['application/vnd.wolfram.player', 'nbp'],
-    ['application/vnd.wordperfect', 'wpd'],
-    ['application/vnd.wqd', 'wqd'],
-    ['application/vnd.wt.stf', 'stf'],
-    ['application/vnd.xara', ['web', 'xar']],
-    ['application/vnd.xfdl', 'xfdl'],
-    ['application/vnd.yamaha.hv-dic', 'hvd'],
-    ['application/vnd.yamaha.hv-script', 'hvs'],
-    ['application/vnd.yamaha.hv-voice', 'hvp'],
-    ['application/vnd.yamaha.openscoreformat', 'osf'],
-    ['application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osfpvg'],
-    ['application/vnd.yamaha.smaf-audio', 'saf'],
-    ['application/vnd.yamaha.smaf-phrase', 'spf'],
-    ['application/vnd.yellowriver-custom-menu', 'cmp'],
-    ['application/vnd.zul', 'zir'],
-    ['application/vnd.zzazz.deck+xml', 'zaz'],
-    ['application/vocaltec-media-desc', 'vmd'],
-    ['application/vocaltec-media-file', 'vmf'],
-    ['application/voicexml+xml', 'vxml'],
-    ['application/widget', 'wgt'],
-    ['application/winhlp', 'hlp'],
-    ['application/wordperfect', ['wp', 'wp5', 'wp6', 'wpd']],
-    ['application/wordperfect6.0', ['w60', 'wp5']],
-    ['application/wordperfect6.1', 'w61'],
-    ['application/wsdl+xml', 'wsdl'],
-    ['application/wspolicy+xml', 'wspolicy'],
-    ['application/x-123', 'wk1'],
-    ['application/x-7z-compressed', '7z'],
-    ['application/x-abiword', 'abw'],
-    ['application/x-ace-compressed', 'ace'],
-    ['application/x-aim', 'aim'],
-    ['application/x-authorware-bin', 'aab'],
-    ['application/x-authorware-map', 'aam'],
-    ['application/x-authorware-seg', 'aas'],
-    ['application/x-bcpio', 'bcpio'],
-    ['application/x-binary', 'bin'],
-    ['application/x-binhex40', 'hqx'],
-    ['application/x-bittorrent', 'torrent'],
-    ['application/x-bsh', ['bsh', 'sh', 'shar']],
-    ['application/x-bytecode.elisp', 'elc'],
-    ['application/x-bytecode.python', 'pyc'],
-    ['application/x-bzip', 'bz'],
-    ['application/x-bzip2', ['boz', 'bz2']],
-    ['application/x-cdf', 'cdf'],
-    ['application/x-cdlink', 'vcd'],
-    ['application/x-chat', ['cha', 'chat']],
-    ['application/x-chess-pgn', 'pgn'],
-    ['application/x-cmu-raster', 'ras'],
-    ['application/x-cocoa', 'cco'],
-    ['application/x-compactpro', 'cpt'],
-    ['application/x-compress', 'z'],
-    ['application/x-compressed', ['tgz', 'gz', 'z', 'zip']],
-    ['application/x-conference', 'nsc'],
-    ['application/x-cpio', 'cpio'],
-    ['application/x-cpt', 'cpt'],
-    ['application/x-csh', 'csh'],
-    ['application/x-debian-package', 'deb'],
-    ['application/x-deepv', 'deepv'],
-    ['application/x-director', ['dir', 'dcr', 'dxr']],
-    ['application/x-doom', 'wad'],
-    ['application/x-dtbncx+xml', 'ncx'],
-    ['application/x-dtbook+xml', 'dtb'],
-    ['application/x-dtbresource+xml', 'res'],
-    ['application/x-dvi', 'dvi'],
-    ['application/x-elc', 'elc'],
-    ['application/x-envoy', ['env', 'evy']],
-    ['application/x-esrehber', 'es'],
-    ['application/x-excel', ['xls', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],
-    ['application/x-font-bdf', 'bdf'],
-    ['application/x-font-ghostscript', 'gsf'],
-    ['application/x-font-linux-psf', 'psf'],
-    ['application/x-font-otf', 'otf'],
-    ['application/x-font-pcf', 'pcf'],
-    ['application/x-font-snf', 'snf'],
-    ['application/x-font-ttf', 'ttf'],
-    ['application/x-font-type1', 'pfa'],
-    ['application/x-font-woff', 'woff'],
-    ['application/x-frame', 'mif'],
-    ['application/x-freelance', 'pre'],
-    ['application/x-futuresplash', 'spl'],
-    ['application/x-gnumeric', 'gnumeric'],
-    ['application/x-gsp', 'gsp'],
-    ['application/x-gss', 'gss'],
-    ['application/x-gtar', 'gtar'],
-    ['application/x-gzip', ['gz', 'gzip']],
-    ['application/x-hdf', 'hdf'],
-    ['application/x-helpfile', ['help', 'hlp']],
-    ['application/x-httpd-imap', 'imap'],
-    ['application/x-ima', 'ima'],
-    ['application/x-internet-signup', ['ins', 'isp']],
-    ['application/x-internett-signup', 'ins'],
-    ['application/x-inventor', 'iv'],
-    ['application/x-ip2', 'ip'],
-    ['application/x-iphone', 'iii'],
-    ['application/x-java-class', 'class'],
-    ['application/x-java-commerce', 'jcm'],
-    ['application/x-java-jnlp-file', 'jnlp'],
-    ['application/x-javascript', 'js'],
-    ['application/x-koan', ['skd', 'skm', 'skp', 'skt']],
-    ['application/x-ksh', 'ksh'],
-    ['application/x-latex', ['latex', 'ltx']],
-    ['application/x-lha', 'lha'],
-    ['application/x-lisp', 'lsp'],
-    ['application/x-livescreen', 'ivy'],
-    ['application/x-lotus', 'wq1'],
-    ['application/x-lotusscreencam', 'scm'],
-    ['application/x-lzh', 'lzh'],
-    ['application/x-lzx', 'lzx'],
-    ['application/x-mac-binhex40', 'hqx'],
-    ['application/x-macbinary', 'bin'],
-    ['application/x-magic-cap-package-1.0', 'mc$'],
-    ['application/x-mathcad', 'mcd'],
-    ['application/x-meme', 'mm'],
-    ['application/x-midi', ['mid', 'midi']],
-    ['application/x-mif', 'mif'],
-    ['application/x-mix-transfer', 'nix'],
-    ['application/x-mobipocket-ebook', 'prc'],
-    ['application/x-mplayer2', 'asx'],
-    ['application/x-ms-application', 'application'],
-    ['application/x-ms-wmd', 'wmd'],
-    ['application/x-ms-wmz', 'wmz'],
-    ['application/x-ms-xbap', 'xbap'],
-    ['application/x-msaccess', 'mdb'],
-    ['application/x-msbinder', 'obd'],
-    ['application/x-mscardfile', 'crd'],
-    ['application/x-msclip', 'clp'],
-    ['application/x-msdownload', ['exe', 'dll']],
-    ['application/x-msexcel', ['xls', 'xla', 'xlw']],
-    ['application/x-msmediaview', ['mvb', 'm13', 'm14']],
-    ['application/x-msmetafile', 'wmf'],
-    ['application/x-msmoney', 'mny'],
-    ['application/x-mspowerpoint', 'ppt'],
-    ['application/x-mspublisher', 'pub'],
-    ['application/x-msschedule', 'scd'],
-    ['application/x-msterminal', 'trm'],
-    ['application/x-mswrite', 'wri'],
-    ['application/x-navi-animation', 'ani'],
-    ['application/x-navidoc', 'nvd'],
-    ['application/x-navimap', 'map'],
-    ['application/x-navistyle', 'stl'],
-    ['application/x-netcdf', ['cdf', 'nc']],
-    ['application/x-newton-compatible-pkg', 'pkg'],
-    ['application/x-nokia-9000-communicator-add-on-software', 'aos'],
-    ['application/x-omc', 'omc'],
-    ['application/x-omcdatamaker', 'omcd'],
-    ['application/x-omcregerator', 'omcr'],
-    ['application/x-pagemaker', ['pm4', 'pm5']],
-    ['application/x-pcl', 'pcl'],
-    ['application/x-perfmon', ['pma', 'pmc', 'pml', 'pmr', 'pmw']],
-    ['application/x-pixclscript', 'plx'],
-    ['application/x-pkcs10', 'p10'],
-    ['application/x-pkcs12', ['p12', 'pfx']],
-    ['application/x-pkcs7-certificates', ['p7b', 'spc']],
-    ['application/x-pkcs7-certreqresp', 'p7r'],
-    ['application/x-pkcs7-mime', ['p7m', 'p7c']],
-    ['application/x-pkcs7-signature', ['p7s', 'p7a']],
-    ['application/x-pointplus', 'css'],
-    ['application/x-portable-anymap', 'pnm'],
-    ['application/x-project', ['mpc', 'mpt', 'mpv', 'mpx']],
-    ['application/x-qpro', 'wb1'],
-    ['application/x-rar-compressed', 'rar'],
-    ['application/x-rtf', 'rtf'],
-    ['application/x-sdp', 'sdp'],
-    ['application/x-sea', 'sea'],
-    ['application/x-seelogo', 'sl'],
-    ['application/x-sh', 'sh'],
-    ['application/x-shar', ['shar', 'sh']],
-    ['application/x-shockwave-flash', 'swf'],
-    ['application/x-silverlight-app', 'xap'],
-    ['application/x-sit', 'sit'],
-    ['application/x-sprite', ['spr', 'sprite']],
-    ['application/x-stuffit', 'sit'],
-    ['application/x-stuffitx', 'sitx'],
-    ['application/x-sv4cpio', 'sv4cpio'],
-    ['application/x-sv4crc', 'sv4crc'],
-    ['application/x-tar', 'tar'],
-    ['application/x-tbook', ['sbk', 'tbk']],
-    ['application/x-tcl', 'tcl'],
-    ['application/x-tex', 'tex'],
-    ['application/x-tex-tfm', 'tfm'],
-    ['application/x-texinfo', ['texi', 'texinfo']],
-    ['application/x-troff', ['roff', 't', 'tr']],
-    ['application/x-troff-man', 'man'],
-    ['application/x-troff-me', 'me'],
-    ['application/x-troff-ms', 'ms'],
-    ['application/x-troff-msvideo', 'avi'],
-    ['application/x-ustar', 'ustar'],
-    ['application/x-visio', ['vsd', 'vst', 'vsw']],
-    ['application/x-vnd.audioexplosion.mzz', 'mzz'],
-    ['application/x-vnd.ls-xpix', 'xpix'],
-    ['application/x-vrml', 'vrml'],
-    ['application/x-wais-source', ['src', 'wsrc']],
-    ['application/x-winhelp', 'hlp'],
-    ['application/x-wintalk', 'wtk'],
-    ['application/x-world', ['wrl', 'svr']],
-    ['application/x-wpwin', 'wpd'],
-    ['application/x-wri', 'wri'],
-    ['application/x-x509-ca-cert', ['cer', 'crt', 'der']],
-    ['application/x-x509-user-cert', 'crt'],
-    ['application/x-xfig', 'fig'],
-    ['application/x-xpinstall', 'xpi'],
-    ['application/x-zip-compressed', 'zip'],
-    ['application/xcap-diff+xml', 'xdf'],
-    ['application/xenc+xml', 'xenc'],
-    ['application/xhtml+xml', 'xhtml'],
-    ['application/xml', 'xml'],
-    ['application/xml-dtd', 'dtd'],
-    ['application/xop+xml', 'xop'],
-    ['application/xslt+xml', 'xslt'],
-    ['application/xspf+xml', 'xspf'],
-    ['application/xv+xml', 'mxml'],
-    ['application/yang', 'yang'],
-    ['application/yin+xml', 'yin'],
-    ['application/ynd.ms-pkipko', 'pko'],
-    ['application/zip', 'zip'],
-    ['audio/adpcm', 'adp'],
-    ['audio/aiff', ['aiff', 'aif', 'aifc']],
-    ['audio/basic', ['snd', 'au']],
-    ['audio/it', 'it'],
-    ['audio/make', ['funk', 'my', 'pfunk']],
-    ['audio/make.my.funk', 'pfunk'],
-    ['audio/mid', ['mid', 'rmi']],
-    ['audio/midi', ['midi', 'kar', 'mid']],
-    ['audio/mod', 'mod'],
-    ['audio/mp4', 'mp4a'],
-    ['audio/mpeg', ['mpga', 'mp3', 'm2a', 'mp2', 'mpa', 'mpg']],
-    ['audio/mpeg3', 'mp3'],
-    ['audio/nspaudio', ['la', 'lma']],
-    ['audio/ogg', 'oga'],
-    ['audio/s3m', 's3m'],
-    ['audio/tsp-audio', 'tsi'],
-    ['audio/tsplayer', 'tsp'],
-    ['audio/vnd.dece.audio', 'uva'],
-    ['audio/vnd.digital-winds', 'eol'],
-    ['audio/vnd.dra', 'dra'],
-    ['audio/vnd.dts', 'dts'],
-    ['audio/vnd.dts.hd', 'dtshd'],
-    ['audio/vnd.lucent.voice', 'lvp'],
-    ['audio/vnd.ms-playready.media.pya', 'pya'],
-    ['audio/vnd.nuera.ecelp4800', 'ecelp4800'],
-    ['audio/vnd.nuera.ecelp7470', 'ecelp7470'],
-    ['audio/vnd.nuera.ecelp9600', 'ecelp9600'],
-    ['audio/vnd.qcelp', 'qcp'],
-    ['audio/vnd.rip', 'rip'],
-    ['audio/voc', 'voc'],
-    ['audio/voxware', 'vox'],
-    ['audio/wav', 'wav'],
-    ['audio/webm', 'weba'],
-    ['audio/x-aac', 'aac'],
-    ['audio/x-adpcm', 'snd'],
-    ['audio/x-aiff', ['aiff', 'aif', 'aifc']],
-    ['audio/x-au', 'au'],
-    ['audio/x-gsm', ['gsd', 'gsm']],
-    ['audio/x-jam', 'jam'],
-    ['audio/x-liveaudio', 'lam'],
-    ['audio/x-mid', ['mid', 'midi']],
-    ['audio/x-midi', ['midi', 'mid']],
-    ['audio/x-mod', 'mod'],
-    ['audio/x-mpeg', 'mp2'],
-    ['audio/x-mpeg-3', 'mp3'],
-    ['audio/x-mpegurl', 'm3u'],
-    ['audio/x-mpequrl', 'm3u'],
-    ['audio/x-ms-wax', 'wax'],
-    ['audio/x-ms-wma', 'wma'],
-    ['audio/x-nspaudio', ['la', 'lma']],
-    ['audio/x-pn-realaudio', ['ra', 'ram', 'rm', 'rmm', 'rmp']],
-    ['audio/x-pn-realaudio-plugin', ['ra', 'rmp', 'rpm']],
-    ['audio/x-psid', 'sid'],
-    ['audio/x-realaudio', 'ra'],
-    ['audio/x-twinvq', 'vqf'],
-    ['audio/x-twinvq-plugin', ['vqe', 'vql']],
-    ['audio/x-vnd.audioexplosion.mjuicemediafile', 'mjf'],
-    ['audio/x-voc', 'voc'],
-    ['audio/x-wav', 'wav'],
-    ['audio/xm', 'xm'],
-    ['chemical/x-cdx', 'cdx'],
-    ['chemical/x-cif', 'cif'],
-    ['chemical/x-cmdf', 'cmdf'],
-    ['chemical/x-cml', 'cml'],
-    ['chemical/x-csml', 'csml'],
-    ['chemical/x-pdb', ['pdb', 'xyz']],
-    ['chemical/x-xyz', 'xyz'],
-    ['drawing/x-dwf', 'dwf'],
-    ['i-world/i-vrml', 'ivr'],
-    ['image/bmp', ['bmp', 'bm']],
-    ['image/cgm', 'cgm'],
-    ['image/cis-cod', 'cod'],
-    ['image/cmu-raster', ['ras', 'rast']],
-    ['image/fif', 'fif'],
-    ['image/florian', ['flo', 'turbot']],
-    ['image/g3fax', 'g3'],
-    ['image/gif', 'gif'],
-    ['image/ief', ['ief', 'iefs']],
-    ['image/jpeg', ['jpeg', 'jpe', 'jpg', 'jfif', 'jfif-tbnl']],
-    ['image/jutvision', 'jut'],
-    ['image/ktx', 'ktx'],
-    ['image/naplps', ['nap', 'naplps']],
-    ['image/pict', ['pic', 'pict']],
-    ['image/pipeg', 'jfif'],
-    ['image/pjpeg', ['jfif', 'jpe', 'jpeg', 'jpg']],
-    ['image/png', ['png', 'x-png']],
-    ['image/prs.btif', 'btif'],
-    ['image/svg+xml', 'svg'],
-    ['image/tiff', ['tif', 'tiff']],
-    ['image/vasa', 'mcf'],
-    ['image/vnd.adobe.photoshop', 'psd'],
-    ['image/vnd.dece.graphic', 'uvi'],
-    ['image/vnd.djvu', 'djvu'],
-    ['image/vnd.dvb.subtitle', 'sub'],
-    ['image/vnd.dwg', ['dwg', 'dxf', 'svf']],
-    ['image/vnd.dxf', 'dxf'],
-    ['image/vnd.fastbidsheet', 'fbs'],
-    ['image/vnd.fpx', 'fpx'],
-    ['image/vnd.fst', 'fst'],
-    ['image/vnd.fujixerox.edmics-mmr', 'mmr'],
-    ['image/vnd.fujixerox.edmics-rlc', 'rlc'],
-    ['image/vnd.ms-modi', 'mdi'],
-    ['image/vnd.net-fpx', ['fpx', 'npx']],
-    ['image/vnd.rn-realflash', 'rf'],
-    ['image/vnd.rn-realpix', 'rp'],
-    ['image/vnd.wap.wbmp', 'wbmp'],
-    ['image/vnd.xiff', 'xif'],
-    ['image/webp', 'webp'],
-    ['image/x-cmu-raster', 'ras'],
-    ['image/x-cmx', 'cmx'],
-    ['image/x-dwg', ['dwg', 'dxf', 'svf']],
-    ['image/x-freehand', 'fh'],
-    ['image/x-icon', 'ico'],
-    ['image/x-jg', 'art'],
-    ['image/x-jps', 'jps'],
-    ['image/x-niff', ['niff', 'nif']],
-    ['image/x-pcx', 'pcx'],
-    ['image/x-pict', ['pct', 'pic']],
-    ['image/x-portable-anymap', 'pnm'],
-    ['image/x-portable-bitmap', 'pbm'],
-    ['image/x-portable-graymap', 'pgm'],
-    ['image/x-portable-greymap', 'pgm'],
-    ['image/x-portable-pixmap', 'ppm'],
-    ['image/x-quicktime', ['qif', 'qti', 'qtif']],
-    ['image/x-rgb', 'rgb'],
-    ['image/x-tiff', ['tif', 'tiff']],
-    ['image/x-windows-bmp', 'bmp'],
-    ['image/x-xbitmap', 'xbm'],
-    ['image/x-xbm', 'xbm'],
-    ['image/x-xpixmap', ['xpm', 'pm']],
-    ['image/x-xwd', 'xwd'],
-    ['image/x-xwindowdump', 'xwd'],
-    ['image/xbm', 'xbm'],
-    ['image/xpm', 'xpm'],
-    ['message/rfc822', ['eml', 'mht', 'mhtml', 'nws', 'mime']],
-    ['model/iges', ['iges', 'igs']],
-    ['model/mesh', 'msh'],
-    ['model/vnd.collada+xml', 'dae'],
-    ['model/vnd.dwf', 'dwf'],
-    ['model/vnd.gdl', 'gdl'],
-    ['model/vnd.gtw', 'gtw'],
-    ['model/vnd.mts', 'mts'],
-    ['model/vnd.vtu', 'vtu'],
-    ['model/vrml', ['vrml', 'wrl', 'wrz']],
-    ['model/x-pov', 'pov'],
-    ['multipart/x-gzip', 'gzip'],
-    ['multipart/x-ustar', 'ustar'],
-    ['multipart/x-zip', 'zip'],
-    ['music/crescendo', ['mid', 'midi']],
-    ['music/x-karaoke', 'kar'],
-    ['paleovu/x-pv', 'pvu'],
-    ['text/asp', 'asp'],
-    ['text/calendar', 'ics'],
-    ['text/css', 'css'],
-    ['text/csv', 'csv'],
-    ['text/ecmascript', 'js'],
-    ['text/h323', '323'],
-    ['text/html', ['html', 'htm', 'stm', 'acgi', 'htmls', 'htx', 'shtml']],
-    ['text/iuls', 'uls'],
-    ['text/javascript', 'js'],
-    ['text/mcf', 'mcf'],
-    ['text/n3', 'n3'],
-    ['text/pascal', 'pas'],
-    [
-        'text/plain',
-        [
-            'txt',
-            'bas',
-            'c',
-            'h',
-            'c++',
-            'cc',
-            'com',
-            'conf',
-            'cxx',
-            'def',
-            'f',
-            'f90',
-            'for',
-            'g',
-            'hh',
-            'idc',
-            'jav',
-            'java',
-            'list',
-            'log',
-            'lst',
-            'm',
-            'mar',
-            'pl',
-            'sdml',
-            'text'
-        ]
-    ],
-    ['text/plain-bas', 'par'],
-    ['text/prs.lines.tag', 'dsc'],
-    ['text/richtext', ['rtx', 'rt', 'rtf']],
-    ['text/scriplet', 'wsc'],
-    ['text/scriptlet', 'sct'],
-    ['text/sgml', ['sgm', 'sgml']],
-    ['text/tab-separated-values', 'tsv'],
-    ['text/troff', 't'],
-    ['text/turtle', 'ttl'],
-    ['text/uri-list', ['uni', 'unis', 'uri', 'uris']],
-    ['text/vnd.abc', 'abc'],
-    ['text/vnd.curl', 'curl'],
-    ['text/vnd.curl.dcurl', 'dcurl'],
-    ['text/vnd.curl.mcurl', 'mcurl'],
-    ['text/vnd.curl.scurl', 'scurl'],
-    ['text/vnd.fly', 'fly'],
-    ['text/vnd.fmi.flexstor', 'flx'],
-    ['text/vnd.graphviz', 'gv'],
-    ['text/vnd.in3d.3dml', '3dml'],
-    ['text/vnd.in3d.spot', 'spot'],
-    ['text/vnd.rn-realtext', 'rt'],
-    ['text/vnd.sun.j2me.app-descriptor', 'jad'],
-    ['text/vnd.wap.wml', 'wml'],
-    ['text/vnd.wap.wmlscript', 'wmls'],
-    ['text/webviewhtml', 'htt'],
-    ['text/x-asm', ['asm', 's']],
-    ['text/x-audiosoft-intra', 'aip'],
-    ['text/x-c', ['c', 'cc', 'cpp']],
-    ['text/x-component', 'htc'],
-    ['text/x-fortran', ['for', 'f', 'f77', 'f90']],
-    ['text/x-h', ['h', 'hh']],
-    ['text/x-java-source', ['java', 'jav']],
-    ['text/x-java-source,java', 'java'],
-    ['text/x-la-asf', 'lsx'],
-    ['text/x-m', 'm'],
-    ['text/x-pascal', 'p'],
-    ['text/x-script', 'hlb'],
-    ['text/x-script.csh', 'csh'],
-    ['text/x-script.elisp', 'el'],
-    ['text/x-script.guile', 'scm'],
-    ['text/x-script.ksh', 'ksh'],
-    ['text/x-script.lisp', 'lsp'],
-    ['text/x-script.perl', 'pl'],
-    ['text/x-script.perl-module', 'pm'],
-    ['text/x-script.phyton', 'py'],
-    ['text/x-script.rexx', 'rexx'],
-    ['text/x-script.scheme', 'scm'],
-    ['text/x-script.sh', 'sh'],
-    ['text/x-script.tcl', 'tcl'],
-    ['text/x-script.tcsh', 'tcsh'],
-    ['text/x-script.zsh', 'zsh'],
-    ['text/x-server-parsed-html', ['shtml', 'ssi']],
-    ['text/x-setext', 'etx'],
-    ['text/x-sgml', ['sgm', 'sgml']],
-    ['text/x-speech', ['spc', 'talk']],
-    ['text/x-uil', 'uil'],
-    ['text/x-uuencode', ['uu', 'uue']],
-    ['text/x-vcalendar', 'vcs'],
-    ['text/x-vcard', 'vcf'],
-    ['text/xml', 'xml'],
-    ['video/3gpp', '3gp'],
-    ['video/3gpp2', '3g2'],
-    ['video/animaflex', 'afl'],
-    ['video/avi', 'avi'],
-    ['video/avs-video', 'avs'],
-    ['video/dl', 'dl'],
-    ['video/fli', 'fli'],
-    ['video/gl', 'gl'],
-    ['video/h261', 'h261'],
-    ['video/h263', 'h263'],
-    ['video/h264', 'h264'],
-    ['video/jpeg', 'jpgv'],
-    ['video/jpm', 'jpm'],
-    ['video/mj2', 'mj2'],
-    ['video/mp4', 'mp4'],
-    ['video/mpeg', ['mpeg', 'mp2', 'mpa', 'mpe', 'mpg', 'mpv2', 'm1v', 'm2v', 'mp3']],
-    ['video/msvideo', 'avi'],
-    ['video/ogg', 'ogv'],
-    ['video/quicktime', ['mov', 'qt', 'moov']],
-    ['video/vdo', 'vdo'],
-    ['video/vivo', ['viv', 'vivo']],
-    ['video/vnd.dece.hd', 'uvh'],
-    ['video/vnd.dece.mobile', 'uvm'],
-    ['video/vnd.dece.pd', 'uvp'],
-    ['video/vnd.dece.sd', 'uvs'],
-    ['video/vnd.dece.video', 'uvv'],
-    ['video/vnd.fvt', 'fvt'],
-    ['video/vnd.mpegurl', 'mxu'],
-    ['video/vnd.ms-playready.media.pyv', 'pyv'],
-    ['video/vnd.rn-realvideo', 'rv'],
-    ['video/vnd.uvvu.mp4', 'uvu'],
-    ['video/vnd.vivo', ['viv', 'vivo']],
-    ['video/vosaic', 'vos'],
-    ['video/webm', 'webm'],
-    ['video/x-amt-demorun', 'xdr'],
-    ['video/x-amt-showrun', 'xsr'],
-    ['video/x-atomic3d-feature', 'fmf'],
-    ['video/x-dl', 'dl'],
-    ['video/x-dv', ['dif', 'dv']],
-    ['video/x-f4v', 'f4v'],
-    ['video/x-fli', 'fli'],
-    ['video/x-flv', 'flv'],
-    ['video/x-gl', 'gl'],
-    ['video/x-isvideo', 'isu'],
-    ['video/x-la-asf', ['lsf', 'lsx']],
-    ['video/x-m4v', 'm4v'],
-    ['video/x-motion-jpeg', 'mjpg'],
-    ['video/x-mpeg', ['mp3', 'mp2']],
-    ['video/x-mpeq2a', 'mp2'],
-    ['video/x-ms-asf', ['asf', 'asr', 'asx']],
-    ['video/x-ms-asf-plugin', 'asx'],
-    ['video/x-ms-wm', 'wm'],
-    ['video/x-ms-wmv', 'wmv'],
-    ['video/x-ms-wmx', 'wmx'],
-    ['video/x-ms-wvx', 'wvx'],
-    ['video/x-msvideo', 'avi'],
-    ['video/x-qtc', 'qtc'],
-    ['video/x-scm', 'scm'],
-    ['video/x-sgi-movie', ['movie', 'mv']],
-    ['windows/metafile', 'wmf'],
-    ['www/mime', 'mime'],
-    ['x-conference/x-cooltalk', 'ice'],
-    ['x-music/x-midi', ['mid', 'midi']],
-    ['x-world/x-3dmf', ['3dm', '3dmf', 'qd3', 'qd3d']],
-    ['x-world/x-svr', 'svr'],
-    ['x-world/x-vrml', ['flr', 'vrml', 'wrl', 'wrz', 'xaf', 'xof']],
-    ['x-world/x-vrt', 'vrt'],
-    ['xgl/drawing', 'xgz'],
-    ['xgl/movie', 'xmz']
-]);
-const extensions = new Map([
-    ['123', 'application/vnd.lotus-1-2-3'],
-    ['323', 'text/h323'],
-    ['*', 'application/octet-stream'],
-    ['3dm', 'x-world/x-3dmf'],
-    ['3dmf', 'x-world/x-3dmf'],
-    ['3dml', 'text/vnd.in3d.3dml'],
-    ['3g2', 'video/3gpp2'],
-    ['3gp', 'video/3gpp'],
-    ['7z', 'application/x-7z-compressed'],
-    ['a', 'application/octet-stream'],
-    ['aab', 'application/x-authorware-bin'],
-    ['aac', 'audio/x-aac'],
-    ['aam', 'application/x-authorware-map'],
-    ['aas', 'application/x-authorware-seg'],
-    ['abc', 'text/vnd.abc'],
-    ['abw', 'application/x-abiword'],
-    ['ac', 'application/pkix-attr-cert'],
-    ['acc', 'application/vnd.americandynamics.acc'],
-    ['ace', 'application/x-ace-compressed'],
-    ['acgi', 'text/html'],
-    ['acu', 'application/vnd.acucobol'],
-    ['acx', 'application/internet-property-stream'],
-    ['adp', 'audio/adpcm'],
-    ['aep', 'application/vnd.audiograph'],
-    ['afl', 'video/animaflex'],
-    ['afp', 'application/vnd.ibm.modcap'],
-    ['ahead', 'application/vnd.ahead.space'],
-    ['ai', 'application/postscript'],
-    ['aif', ['audio/aiff', 'audio/x-aiff']],
-    ['aifc', ['audio/aiff', 'audio/x-aiff']],
-    ['aiff', ['audio/aiff', 'audio/x-aiff']],
-    ['aim', 'application/x-aim'],
-    ['aip', 'text/x-audiosoft-intra'],
-    ['air', 'application/vnd.adobe.air-application-installer-package+zip'],
-    ['ait', 'application/vnd.dvb.ait'],
-    ['ami', 'application/vnd.amiga.ami'],
-    ['ani', 'application/x-navi-animation'],
-    ['aos', 'application/x-nokia-9000-communicator-add-on-software'],
-    ['apk', 'application/vnd.android.package-archive'],
-    ['application', 'application/x-ms-application'],
-    ['apr', 'application/vnd.lotus-approach'],
-    ['aps', 'application/mime'],
-    ['arc', 'application/octet-stream'],
-    ['arj', ['application/arj', 'application/octet-stream']],
-    ['art', 'image/x-jg'],
-    ['asf', 'video/x-ms-asf'],
-    ['asm', 'text/x-asm'],
-    ['aso', 'application/vnd.accpac.simply.aso'],
-    ['asp', 'text/asp'],
-    ['asr', 'video/x-ms-asf'],
-    ['asx', ['video/x-ms-asf', 'application/x-mplayer2', 'video/x-ms-asf-plugin']],
-    ['atc', 'application/vnd.acucorp'],
-    ['atomcat', 'application/atomcat+xml'],
-    ['atomsvc', 'application/atomsvc+xml'],
-    ['atx', 'application/vnd.antix.game-component'],
-    ['au', ['audio/basic', 'audio/x-au']],
-    ['avi', ['video/avi', 'video/msvideo', 'application/x-troff-msvideo', 'video/x-msvideo']],
-    ['avs', 'video/avs-video'],
-    ['aw', 'application/applixware'],
-    ['axs', 'application/olescript'],
-    ['azf', 'application/vnd.airzip.filesecure.azf'],
-    ['azs', 'application/vnd.airzip.filesecure.azs'],
-    ['azw', 'application/vnd.amazon.ebook'],
-    ['bas', 'text/plain'],
-    ['bcpio', 'application/x-bcpio'],
-    ['bdf', 'application/x-font-bdf'],
-    ['bdm', 'application/vnd.syncml.dm+wbxml'],
-    ['bed', 'application/vnd.realvnc.bed'],
-    ['bh2', 'application/vnd.fujitsu.oasysprs'],
-    ['bin', ['application/octet-stream', 'application/mac-binary', 'application/macbinary', 'application/x-macbinary', 'application/x-binary']],
-    ['bm', 'image/bmp'],
-    ['bmi', 'application/vnd.bmi'],
-    ['bmp', ['image/bmp', 'image/x-windows-bmp']],
-    ['boo', 'application/book'],
-    ['book', 'application/book'],
-    ['box', 'application/vnd.previewsystems.box'],
-    ['boz', 'application/x-bzip2'],
-    ['bsh', 'application/x-bsh'],
-    ['btif', 'image/prs.btif'],
-    ['bz', 'application/x-bzip'],
-    ['bz2', 'application/x-bzip2'],
-    ['c', ['text/plain', 'text/x-c']],
-    ['c++', 'text/plain'],
-    ['c11amc', 'application/vnd.cluetrust.cartomobile-config'],
-    ['c11amz', 'application/vnd.cluetrust.cartomobile-config-pkg'],
-    ['c4g', 'application/vnd.clonk.c4group'],
-    ['cab', 'application/vnd.ms-cab-compressed'],
-    ['car', 'application/vnd.curl.car'],
-    ['cat', ['application/vnd.ms-pkiseccat', 'application/vnd.ms-pki.seccat']],
-    ['cc', ['text/plain', 'text/x-c']],
-    ['ccad', 'application/clariscad'],
-    ['cco', 'application/x-cocoa'],
-    ['ccxml', 'application/ccxml+xml,'],
-    ['cdbcmsg', 'application/vnd.contact.cmsg'],
-    ['cdf', ['application/cdf', 'application/x-cdf', 'application/x-netcdf']],
-    ['cdkey', 'application/vnd.mediastation.cdkey'],
-    ['cdmia', 'application/cdmi-capability'],
-    ['cdmic', 'application/cdmi-container'],
-    ['cdmid', 'application/cdmi-domain'],
-    ['cdmio', 'application/cdmi-object'],
-    ['cdmiq', 'application/cdmi-queue'],
-    ['cdx', 'chemical/x-cdx'],
-    ['cdxml', 'application/vnd.chemdraw+xml'],
-    ['cdy', 'application/vnd.cinderella'],
-    ['cer', ['application/pkix-cert', 'application/x-x509-ca-cert']],
-    ['cgm', 'image/cgm'],
-    ['cha', 'application/x-chat'],
-    ['chat', 'application/x-chat'],
-    ['chm', 'application/vnd.ms-htmlhelp'],
-    ['chrt', 'application/vnd.kde.kchart'],
-    ['cif', 'chemical/x-cif'],
-    ['cii', 'application/vnd.anser-web-certificate-issue-initiation'],
-    ['cil', 'application/vnd.ms-artgalry'],
-    ['cla', 'application/vnd.claymore'],
-    ['class', ['application/octet-stream', 'application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java-class']],
-    ['clkk', 'application/vnd.crick.clicker.keyboard'],
-    ['clkp', 'application/vnd.crick.clicker.palette'],
-    ['clkt', 'application/vnd.crick.clicker.template'],
-    ['clkw', 'application/vnd.crick.clicker.wordbank'],
-    ['clkx', 'application/vnd.crick.clicker'],
-    ['clp', 'application/x-msclip'],
-    ['cmc', 'application/vnd.cosmocaller'],
-    ['cmdf', 'chemical/x-cmdf'],
-    ['cml', 'chemical/x-cml'],
-    ['cmp', 'application/vnd.yellowriver-custom-menu'],
-    ['cmx', 'image/x-cmx'],
-    ['cod', ['image/cis-cod', 'application/vnd.rim.cod']],
-    ['com', ['application/octet-stream', 'text/plain']],
-    ['conf', 'text/plain'],
-    ['cpio', 'application/x-cpio'],
-    ['cpp', 'text/x-c'],
-    ['cpt', ['application/mac-compactpro', 'application/x-compactpro', 'application/x-cpt']],
-    ['crd', 'application/x-mscardfile'],
-    ['crl', ['application/pkix-crl', 'application/pkcs-crl']],
-    ['crt', ['application/pkix-cert', 'application/x-x509-user-cert', 'application/x-x509-ca-cert']],
-    ['cryptonote', 'application/vnd.rig.cryptonote'],
-    ['csh', ['text/x-script.csh', 'application/x-csh']],
-    ['csml', 'chemical/x-csml'],
-    ['csp', 'application/vnd.commonspace'],
-    ['css', ['text/css', 'application/x-pointplus']],
-    ['csv', 'text/csv'],
-    ['cu', 'application/cu-seeme'],
-    ['curl', 'text/vnd.curl'],
-    ['cww', 'application/prs.cww'],
-    ['cxx', 'text/plain'],
-    ['dae', 'model/vnd.collada+xml'],
-    ['daf', 'application/vnd.mobius.daf'],
-    ['davmount', 'application/davmount+xml'],
-    ['dcr', 'application/x-director'],
-    ['dcurl', 'text/vnd.curl.dcurl'],
-    ['dd2', 'application/vnd.oma.dd2+xml'],
-    ['ddd', 'application/vnd.fujixerox.ddd'],
-    ['deb', 'application/x-debian-package'],
-    ['deepv', 'application/x-deepv'],
-    ['def', 'text/plain'],
-    ['der', 'application/x-x509-ca-cert'],
-    ['dfac', 'application/vnd.dreamfactory'],
-    ['dif', 'video/x-dv'],
-    ['dir', 'application/x-director'],
-    ['dis', 'application/vnd.mobius.dis'],
-    ['djvu', 'image/vnd.djvu'],
-    ['dl', ['video/dl', 'video/x-dl']],
-    ['dll', 'application/x-msdownload'],
-    ['dms', 'application/octet-stream'],
-    ['dna', 'application/vnd.dna'],
-    ['doc', 'application/msword'],
-    ['docm', 'application/vnd.ms-word.document.macroenabled.12'],
-    ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
-    ['dot', 'application/msword'],
-    ['dotm', 'application/vnd.ms-word.template.macroenabled.12'],
-    ['dotx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'],
-    ['dp', ['application/commonground', 'application/vnd.osgi.dp']],
-    ['dpg', 'application/vnd.dpgraph'],
-    ['dra', 'audio/vnd.dra'],
-    ['drw', 'application/drafting'],
-    ['dsc', 'text/prs.lines.tag'],
-    ['dssc', 'application/dssc+der'],
-    ['dtb', 'application/x-dtbook+xml'],
-    ['dtd', 'application/xml-dtd'],
-    ['dts', 'audio/vnd.dts'],
-    ['dtshd', 'audio/vnd.dts.hd'],
-    ['dump', 'application/octet-stream'],
-    ['dv', 'video/x-dv'],
-    ['dvi', 'application/x-dvi'],
-    ['dwf', ['model/vnd.dwf', 'drawing/x-dwf']],
-    ['dwg', ['application/acad', 'image/vnd.dwg', 'image/x-dwg']],
-    ['dxf', ['application/dxf', 'image/vnd.dwg', 'image/vnd.dxf', 'image/x-dwg']],
-    ['dxp', 'application/vnd.spotfire.dxp'],
-    ['dxr', 'application/x-director'],
-    ['ecelp4800', 'audio/vnd.nuera.ecelp4800'],
-    ['ecelp7470', 'audio/vnd.nuera.ecelp7470'],
-    ['ecelp9600', 'audio/vnd.nuera.ecelp9600'],
-    ['edm', 'application/vnd.novadigm.edm'],
-    ['edx', 'application/vnd.novadigm.edx'],
-    ['efif', 'application/vnd.picsel'],
-    ['ei6', 'application/vnd.pg.osasli'],
-    ['el', 'text/x-script.elisp'],
-    ['elc', ['application/x-elc', 'application/x-bytecode.elisp']],
-    ['eml', 'message/rfc822'],
-    ['emma', 'application/emma+xml'],
-    ['env', 'application/x-envoy'],
-    ['eol', 'audio/vnd.digital-winds'],
-    ['eot', 'application/vnd.ms-fontobject'],
-    ['eps', 'application/postscript'],
-    ['epub', 'application/epub+zip'],
-    ['es', ['application/ecmascript', 'application/x-esrehber']],
-    ['es3', 'application/vnd.eszigno3+xml'],
-    ['esf', 'application/vnd.epson.esf'],
-    ['etx', 'text/x-setext'],
-    ['evy', ['application/envoy', 'application/x-envoy']],
-    ['exe', ['application/octet-stream', 'application/x-msdownload']],
-    ['exi', 'application/exi'],
-    ['ext', 'application/vnd.novadigm.ext'],
-    ['ez2', 'application/vnd.ezpix-album'],
-    ['ez3', 'application/vnd.ezpix-package'],
-    ['f', ['text/plain', 'text/x-fortran']],
-    ['f4v', 'video/x-f4v'],
-    ['f77', 'text/x-fortran'],
-    ['f90', ['text/plain', 'text/x-fortran']],
-    ['fbs', 'image/vnd.fastbidsheet'],
-    ['fcs', 'application/vnd.isac.fcs'],
-    ['fdf', 'application/vnd.fdf'],
-    ['fe_launch', 'application/vnd.denovo.fcselayout-link'],
-    ['fg5', 'application/vnd.fujitsu.oasysgp'],
-    ['fh', 'image/x-freehand'],
-    ['fif', ['application/fractals', 'image/fif']],
-    ['fig', 'application/x-xfig'],
-    ['fli', ['video/fli', 'video/x-fli']],
-    ['flo', ['image/florian', 'application/vnd.micrografx.flo']],
-    ['flr', 'x-world/x-vrml'],
-    ['flv', 'video/x-flv'],
-    ['flw', 'application/vnd.kde.kivio'],
-    ['flx', 'text/vnd.fmi.flexstor'],
-    ['fly', 'text/vnd.fly'],
-    ['fm', 'application/vnd.framemaker'],
-    ['fmf', 'video/x-atomic3d-feature'],
-    ['fnc', 'application/vnd.frogans.fnc'],
-    ['for', ['text/plain', 'text/x-fortran']],
-    ['fpx', ['image/vnd.fpx', 'image/vnd.net-fpx']],
-    ['frl', 'application/freeloader'],
-    ['fsc', 'application/vnd.fsc.weblaunch'],
-    ['fst', 'image/vnd.fst'],
-    ['ftc', 'application/vnd.fluxtime.clip'],
-    ['fti', 'application/vnd.anser-web-funds-transfer-initiation'],
-    ['funk', 'audio/make'],
-    ['fvt', 'video/vnd.fvt'],
-    ['fxp', 'application/vnd.adobe.fxp'],
-    ['fzs', 'application/vnd.fuzzysheet'],
-    ['g', 'text/plain'],
-    ['g2w', 'application/vnd.geoplan'],
-    ['g3', 'image/g3fax'],
-    ['g3w', 'application/vnd.geospace'],
-    ['gac', 'application/vnd.groove-account'],
-    ['gdl', 'model/vnd.gdl'],
-    ['geo', 'application/vnd.dynageo'],
-    ['geojson', 'application/geo+json'],
-    ['gex', 'application/vnd.geometry-explorer'],
-    ['ggb', 'application/vnd.geogebra.file'],
-    ['ggt', 'application/vnd.geogebra.tool'],
-    ['ghf', 'application/vnd.groove-help'],
-    ['gif', 'image/gif'],
-    ['gim', 'application/vnd.groove-identity-message'],
-    ['gl', ['video/gl', 'video/x-gl']],
-    ['gmx', 'application/vnd.gmx'],
-    ['gnumeric', 'application/x-gnumeric'],
-    ['gph', 'application/vnd.flographit'],
-    ['gqf', 'application/vnd.grafeq'],
-    ['gram', 'application/srgs'],
-    ['grv', 'application/vnd.groove-injector'],
-    ['grxml', 'application/srgs+xml'],
-    ['gsd', 'audio/x-gsm'],
-    ['gsf', 'application/x-font-ghostscript'],
-    ['gsm', 'audio/x-gsm'],
-    ['gsp', 'application/x-gsp'],
-    ['gss', 'application/x-gss'],
-    ['gtar', 'application/x-gtar'],
-    ['gtm', 'application/vnd.groove-tool-message'],
-    ['gtw', 'model/vnd.gtw'],
-    ['gv', 'text/vnd.graphviz'],
-    ['gxt', 'application/vnd.geonext'],
-    ['gz', ['application/x-gzip', 'application/x-compressed']],
-    ['gzip', ['multipart/x-gzip', 'application/x-gzip']],
-    ['h', ['text/plain', 'text/x-h']],
-    ['h261', 'video/h261'],
-    ['h263', 'video/h263'],
-    ['h264', 'video/h264'],
-    ['hal', 'application/vnd.hal+xml'],
-    ['hbci', 'application/vnd.hbci'],
-    ['hdf', 'application/x-hdf'],
-    ['help', 'application/x-helpfile'],
-    ['hgl', 'application/vnd.hp-hpgl'],
-    ['hh', ['text/plain', 'text/x-h']],
-    ['hlb', 'text/x-script'],
-    ['hlp', ['application/winhlp', 'application/hlp', 'application/x-helpfile', 'application/x-winhelp']],
-    ['hpg', 'application/vnd.hp-hpgl'],
-    ['hpgl', 'application/vnd.hp-hpgl'],
-    ['hpid', 'application/vnd.hp-hpid'],
-    ['hps', 'application/vnd.hp-hps'],
-    [
-        'hqx',
-        [
-            'application/mac-binhex40',
-            'application/binhex',
-            'application/binhex4',
-            'application/mac-binhex',
-            'application/x-binhex40',
-            'application/x-mac-binhex40'
-        ]
-    ],
-    ['hta', 'application/hta'],
-    ['htc', 'text/x-component'],
-    ['htke', 'application/vnd.kenameaapp'],
-    ['htm', 'text/html'],
-    ['html', 'text/html'],
-    ['htmls', 'text/html'],
-    ['htt', 'text/webviewhtml'],
-    ['htx', 'text/html'],
-    ['hvd', 'application/vnd.yamaha.hv-dic'],
-    ['hvp', 'application/vnd.yamaha.hv-voice'],
-    ['hvs', 'application/vnd.yamaha.hv-script'],
-    ['i2g', 'application/vnd.intergeo'],
-    ['icc', 'application/vnd.iccprofile'],
-    ['ice', 'x-conference/x-cooltalk'],
-    ['ico', 'image/x-icon'],
-    ['ics', 'text/calendar'],
-    ['idc', 'text/plain'],
-    ['ief', 'image/ief'],
-    ['iefs', 'image/ief'],
-    ['ifm', 'application/vnd.shana.informed.formdata'],
-    ['iges', ['application/iges', 'model/iges']],
-    ['igl', 'application/vnd.igloader'],
-    ['igm', 'application/vnd.insors.igm'],
-    ['igs', ['application/iges', 'model/iges']],
-    ['igx', 'application/vnd.micrografx.igx'],
-    ['iif', 'application/vnd.shana.informed.interchange'],
-    ['iii', 'application/x-iphone'],
-    ['ima', 'application/x-ima'],
-    ['imap', 'application/x-httpd-imap'],
-    ['imp', 'application/vnd.accpac.simply.imp'],
-    ['ims', 'application/vnd.ms-ims'],
-    ['inf', 'application/inf'],
-    ['ins', ['application/x-internet-signup', 'application/x-internett-signup']],
-    ['ip', 'application/x-ip2'],
-    ['ipfix', 'application/ipfix'],
-    ['ipk', 'application/vnd.shana.informed.package'],
-    ['irm', 'application/vnd.ibm.rights-management'],
-    ['irp', 'application/vnd.irepository.package+xml'],
-    ['isp', 'application/x-internet-signup'],
-    ['isu', 'video/x-isvideo'],
-    ['it', 'audio/it'],
-    ['itp', 'application/vnd.shana.informed.formtemplate'],
-    ['iv', 'application/x-inventor'],
-    ['ivp', 'application/vnd.immervision-ivp'],
-    ['ivr', 'i-world/i-vrml'],
-    ['ivu', 'application/vnd.immervision-ivu'],
-    ['ivy', 'application/x-livescreen'],
-    ['jad', 'text/vnd.sun.j2me.app-descriptor'],
-    ['jam', ['application/vnd.jam', 'audio/x-jam']],
-    ['jar', 'application/java-archive'],
-    ['jav', ['text/plain', 'text/x-java-source']],
-    ['java', ['text/plain', 'text/x-java-source,java', 'text/x-java-source']],
-    ['jcm', 'application/x-java-commerce'],
-    ['jfif', ['image/pipeg', 'image/jpeg', 'image/pjpeg']],
-    ['jfif-tbnl', 'image/jpeg'],
-    ['jisp', 'application/vnd.jisp'],
-    ['jlt', 'application/vnd.hp-jlyt'],
-    ['jnlp', 'application/x-java-jnlp-file'],
-    ['joda', 'application/vnd.joost.joda-archive'],
-    ['jpe', ['image/jpeg', 'image/pjpeg']],
-    ['jpeg', ['image/jpeg', 'image/pjpeg']],
-    ['jpg', ['image/jpeg', 'image/pjpeg']],
-    ['jpgv', 'video/jpeg'],
-    ['jpm', 'video/jpm'],
-    ['jps', 'image/x-jps'],
-    ['js', ['application/javascript', 'application/ecmascript', 'text/javascript', 'text/ecmascript', 'application/x-javascript']],
-    ['json', 'application/json'],
-    ['jut', 'image/jutvision'],
-    ['kar', ['audio/midi', 'music/x-karaoke']],
-    ['karbon', 'application/vnd.kde.karbon'],
-    ['kfo', 'application/vnd.kde.kformula'],
-    ['kia', 'application/vnd.kidspiration'],
-    ['kml', 'application/vnd.google-earth.kml+xml'],
-    ['kmz', 'application/vnd.google-earth.kmz'],
-    ['kne', 'application/vnd.kinar'],
-    ['kon', 'application/vnd.kde.kontour'],
-    ['kpr', 'application/vnd.kde.kpresenter'],
-    ['ksh', ['application/x-ksh', 'text/x-script.ksh']],
-    ['ksp', 'application/vnd.kde.kspread'],
-    ['ktx', 'image/ktx'],
-    ['ktz', 'application/vnd.kahootz'],
-    ['kwd', 'application/vnd.kde.kword'],
-    ['la', ['audio/nspaudio', 'audio/x-nspaudio']],
-    ['lam', 'audio/x-liveaudio'],
-    ['lasxml', 'application/vnd.las.las+xml'],
-    ['latex', 'application/x-latex'],
-    ['lbd', 'application/vnd.llamagraphics.life-balance.desktop'],
-    ['lbe', 'application/vnd.llamagraphics.life-balance.exchange+xml'],
-    ['les', 'application/vnd.hhe.lesson-player'],
-    ['lha', ['application/octet-stream', 'application/lha', 'application/x-lha']],
-    ['lhx', 'application/octet-stream'],
-    ['link66', 'application/vnd.route66.link66+xml'],
-    ['list', 'text/plain'],
-    ['lma', ['audio/nspaudio', 'audio/x-nspaudio']],
-    ['log', 'text/plain'],
-    ['lrm', 'application/vnd.ms-lrm'],
-    ['lsf', 'video/x-la-asf'],
-    ['lsp', ['application/x-lisp', 'text/x-script.lisp']],
-    ['lst', 'text/plain'],
-    ['lsx', ['video/x-la-asf', 'text/x-la-asf']],
-    ['ltf', 'application/vnd.frogans.ltf'],
-    ['ltx', 'application/x-latex'],
-    ['lvp', 'audio/vnd.lucent.voice'],
-    ['lwp', 'application/vnd.lotus-wordpro'],
-    ['lzh', ['application/octet-stream', 'application/x-lzh']],
-    ['lzx', ['application/lzx', 'application/octet-stream', 'application/x-lzx']],
-    ['m', ['text/plain', 'text/x-m']],
-    ['m13', 'application/x-msmediaview'],
-    ['m14', 'application/x-msmediaview'],
-    ['m1v', 'video/mpeg'],
-    ['m21', 'application/mp21'],
-    ['m2a', 'audio/mpeg'],
-    ['m2v', 'video/mpeg'],
-    ['m3u', ['audio/x-mpegurl', 'audio/x-mpequrl']],
-    ['m3u8', 'application/vnd.apple.mpegurl'],
-    ['m4v', 'video/x-m4v'],
-    ['ma', 'application/mathematica'],
-    ['mads', 'application/mads+xml'],
-    ['mag', 'application/vnd.ecowin.chart'],
-    ['man', 'application/x-troff-man'],
-    ['map', 'application/x-navimap'],
-    ['mar', 'text/plain'],
-    ['mathml', 'application/mathml+xml'],
-    ['mbd', 'application/mbedlet'],
-    ['mbk', 'application/vnd.mobius.mbk'],
-    ['mbox', 'application/mbox'],
-    ['mc$', 'application/x-magic-cap-package-1.0'],
-    ['mc1', 'application/vnd.medcalcdata'],
-    ['mcd', ['application/mcad', 'application/vnd.mcd', 'application/x-mathcad']],
-    ['mcf', ['image/vasa', 'text/mcf']],
-    ['mcp', 'application/netmc'],
-    ['mcurl', 'text/vnd.curl.mcurl'],
-    ['mdb', 'application/x-msaccess'],
-    ['mdi', 'image/vnd.ms-modi'],
-    ['me', 'application/x-troff-me'],
-    ['meta4', 'application/metalink4+xml'],
-    ['mets', 'application/mets+xml'],
-    ['mfm', 'application/vnd.mfmp'],
-    ['mgp', 'application/vnd.osgeo.mapguide.package'],
-    ['mgz', 'application/vnd.proteus.magazine'],
-    ['mht', 'message/rfc822'],
-    ['mhtml', 'message/rfc822'],
-    ['mid', ['audio/mid', 'audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],
-    ['midi', ['audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],
-    ['mif', ['application/vnd.mif', 'application/x-mif', 'application/x-frame']],
-    ['mime', ['message/rfc822', 'www/mime']],
-    ['mj2', 'video/mj2'],
-    ['mjf', 'audio/x-vnd.audioexplosion.mjuicemediafile'],
-    ['mjpg', 'video/x-motion-jpeg'],
-    ['mlp', 'application/vnd.dolby.mlp'],
-    ['mm', ['application/base64', 'application/x-meme']],
-    ['mmd', 'application/vnd.chipnuts.karaoke-mmd'],
-    ['mme', 'application/base64'],
-    ['mmf', 'application/vnd.smaf'],
-    ['mmr', 'image/vnd.fujixerox.edmics-mmr'],
-    ['mny', 'application/x-msmoney'],
-    ['mod', ['audio/mod', 'audio/x-mod']],
-    ['mods', 'application/mods+xml'],
-    ['moov', 'video/quicktime'],
-    ['mov', 'video/quicktime'],
-    ['movie', 'video/x-sgi-movie'],
-    ['mp2', ['video/mpeg', 'audio/mpeg', 'video/x-mpeg', 'audio/x-mpeg', 'video/x-mpeq2a']],
-    ['mp3', ['audio/mpeg', 'audio/mpeg3', 'video/mpeg', 'audio/x-mpeg-3', 'video/x-mpeg']],
-    ['mp4', ['video/mp4', 'application/mp4']],
-    ['mp4a', 'audio/mp4'],
-    ['mpa', ['video/mpeg', 'audio/mpeg']],
-    ['mpc', ['application/vnd.mophun.certificate', 'application/x-project']],
-    ['mpe', 'video/mpeg'],
-    ['mpeg', 'video/mpeg'],
-    ['mpg', ['video/mpeg', 'audio/mpeg']],
-    ['mpga', 'audio/mpeg'],
-    ['mpkg', 'application/vnd.apple.installer+xml'],
-    ['mpm', 'application/vnd.blueice.multipass'],
-    ['mpn', 'application/vnd.mophun.application'],
-    ['mpp', 'application/vnd.ms-project'],
-    ['mpt', 'application/x-project'],
-    ['mpv', 'application/x-project'],
-    ['mpv2', 'video/mpeg'],
-    ['mpx', 'application/x-project'],
-    ['mpy', 'application/vnd.ibm.minipay'],
-    ['mqy', 'application/vnd.mobius.mqy'],
-    ['mrc', 'application/marc'],
-    ['mrcx', 'application/marcxml+xml'],
-    ['ms', 'application/x-troff-ms'],
-    ['mscml', 'application/mediaservercontrol+xml'],
-    ['mseq', 'application/vnd.mseq'],
-    ['msf', 'application/vnd.epson.msf'],
-    ['msg', 'application/vnd.ms-outlook'],
-    ['msh', 'model/mesh'],
-    ['msl', 'application/vnd.mobius.msl'],
-    ['msty', 'application/vnd.muvee.style'],
-    ['mts', 'model/vnd.mts'],
-    ['mus', 'application/vnd.musician'],
-    ['musicxml', 'application/vnd.recordare.musicxml+xml'],
-    ['mv', 'video/x-sgi-movie'],
-    ['mvb', 'application/x-msmediaview'],
-    ['mwf', 'application/vnd.mfer'],
-    ['mxf', 'application/mxf'],
-    ['mxl', 'application/vnd.recordare.musicxml'],
-    ['mxml', 'application/xv+xml'],
-    ['mxs', 'application/vnd.triscape.mxs'],
-    ['mxu', 'video/vnd.mpegurl'],
-    ['my', 'audio/make'],
-    ['mzz', 'application/x-vnd.audioexplosion.mzz'],
-    ['n-gage', 'application/vnd.nokia.n-gage.symbian.install'],
-    ['n3', 'text/n3'],
-    ['nap', 'image/naplps'],
-    ['naplps', 'image/naplps'],
-    ['nbp', 'application/vnd.wolfram.player'],
-    ['nc', 'application/x-netcdf'],
-    ['ncm', 'application/vnd.nokia.configuration-message'],
-    ['ncx', 'application/x-dtbncx+xml'],
-    ['ngdat', 'application/vnd.nokia.n-gage.data'],
-    ['nif', 'image/x-niff'],
-    ['niff', 'image/x-niff'],
-    ['nix', 'application/x-mix-transfer'],
-    ['nlu', 'application/vnd.neurolanguage.nlu'],
-    ['nml', 'application/vnd.enliven'],
-    ['nnd', 'application/vnd.noblenet-directory'],
-    ['nns', 'application/vnd.noblenet-sealer'],
-    ['nnw', 'application/vnd.noblenet-web'],
-    ['npx', 'image/vnd.net-fpx'],
-    ['nsc', 'application/x-conference'],
-    ['nsf', 'application/vnd.lotus-notes'],
-    ['nvd', 'application/x-navidoc'],
-    ['nws', 'message/rfc822'],
-    ['o', 'application/octet-stream'],
-    ['oa2', 'application/vnd.fujitsu.oasys2'],
-    ['oa3', 'application/vnd.fujitsu.oasys3'],
-    ['oas', 'application/vnd.fujitsu.oasys'],
-    ['obd', 'application/x-msbinder'],
-    ['oda', 'application/oda'],
-    ['odb', 'application/vnd.oasis.opendocument.database'],
-    ['odc', 'application/vnd.oasis.opendocument.chart'],
-    ['odf', 'application/vnd.oasis.opendocument.formula'],
-    ['odft', 'application/vnd.oasis.opendocument.formula-template'],
-    ['odg', 'application/vnd.oasis.opendocument.graphics'],
-    ['odi', 'application/vnd.oasis.opendocument.image'],
-    ['odm', 'application/vnd.oasis.opendocument.text-master'],
-    ['odp', 'application/vnd.oasis.opendocument.presentation'],
-    ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],
-    ['odt', 'application/vnd.oasis.opendocument.text'],
-    ['oga', 'audio/ogg'],
-    ['ogv', 'video/ogg'],
-    ['ogx', 'application/ogg'],
-    ['omc', 'application/x-omc'],
-    ['omcd', 'application/x-omcdatamaker'],
-    ['omcr', 'application/x-omcregerator'],
-    ['onetoc', 'application/onenote'],
-    ['opf', 'application/oebps-package+xml'],
-    ['org', 'application/vnd.lotus-organizer'],
-    ['osf', 'application/vnd.yamaha.openscoreformat'],
-    ['osfpvg', 'application/vnd.yamaha.openscoreformat.osfpvg+xml'],
-    ['otc', 'application/vnd.oasis.opendocument.chart-template'],
-    ['otf', 'application/x-font-otf'],
-    ['otg', 'application/vnd.oasis.opendocument.graphics-template'],
-    ['oth', 'application/vnd.oasis.opendocument.text-web'],
-    ['oti', 'application/vnd.oasis.opendocument.image-template'],
-    ['otp', 'application/vnd.oasis.opendocument.presentation-template'],
-    ['ots', 'application/vnd.oasis.opendocument.spreadsheet-template'],
-    ['ott', 'application/vnd.oasis.opendocument.text-template'],
-    ['oxt', 'application/vnd.openofficeorg.extension'],
-    ['p', 'text/x-pascal'],
-    ['p10', ['application/pkcs10', 'application/x-pkcs10']],
-    ['p12', ['application/pkcs-12', 'application/x-pkcs12']],
-    ['p7a', 'application/x-pkcs7-signature'],
-    ['p7b', 'application/x-pkcs7-certificates'],
-    ['p7c', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],
-    ['p7m', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],
-    ['p7r', 'application/x-pkcs7-certreqresp'],
-    ['p7s', ['application/pkcs7-signature', 'application/x-pkcs7-signature']],
-    ['p8', 'application/pkcs8'],
-    ['par', 'text/plain-bas'],
-    ['part', 'application/pro_eng'],
-    ['pas', 'text/pascal'],
-    ['paw', 'application/vnd.pawaafile'],
-    ['pbd', 'application/vnd.powerbuilder6'],
-    ['pbm', 'image/x-portable-bitmap'],
-    ['pcf', 'application/x-font-pcf'],
-    ['pcl', ['application/vnd.hp-pcl', 'application/x-pcl']],
-    ['pclxl', 'application/vnd.hp-pclxl'],
-    ['pct', 'image/x-pict'],
-    ['pcurl', 'application/vnd.curl.pcurl'],
-    ['pcx', 'image/x-pcx'],
-    ['pdb', ['application/vnd.palm', 'chemical/x-pdb']],
-    ['pdf', 'application/pdf'],
-    ['pfa', 'application/x-font-type1'],
-    ['pfr', 'application/font-tdpfr'],
-    ['pfunk', ['audio/make', 'audio/make.my.funk']],
-    ['pfx', 'application/x-pkcs12'],
-    ['pgm', ['image/x-portable-graymap', 'image/x-portable-greymap']],
-    ['pgn', 'application/x-chess-pgn'],
-    ['pgp', 'application/pgp-signature'],
-    ['pic', ['image/pict', 'image/x-pict']],
-    ['pict', 'image/pict'],
-    ['pkg', 'application/x-newton-compatible-pkg'],
-    ['pki', 'application/pkixcmp'],
-    ['pkipath', 'application/pkix-pkipath'],
-    ['pko', ['application/ynd.ms-pkipko', 'application/vnd.ms-pki.pko']],
-    ['pl', ['text/plain', 'text/x-script.perl']],
-    ['plb', 'application/vnd.3gpp.pic-bw-large'],
-    ['plc', 'application/vnd.mobius.plc'],
-    ['plf', 'application/vnd.pocketlearn'],
-    ['pls', 'application/pls+xml'],
-    ['plx', 'application/x-pixclscript'],
-    ['pm', ['text/x-script.perl-module', 'image/x-xpixmap']],
-    ['pm4', 'application/x-pagemaker'],
-    ['pm5', 'application/x-pagemaker'],
-    ['pma', 'application/x-perfmon'],
-    ['pmc', 'application/x-perfmon'],
-    ['pml', ['application/vnd.ctc-posml', 'application/x-perfmon']],
-    ['pmr', 'application/x-perfmon'],
-    ['pmw', 'application/x-perfmon'],
-    ['png', 'image/png'],
-    ['pnm', ['application/x-portable-anymap', 'image/x-portable-anymap']],
-    ['portpkg', 'application/vnd.macports.portpkg'],
-    ['pot', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],
-    ['potm', 'application/vnd.ms-powerpoint.template.macroenabled.12'],
-    ['potx', 'application/vnd.openxmlformats-officedocument.presentationml.template'],
-    ['pov', 'model/x-pov'],
-    ['ppa', 'application/vnd.ms-powerpoint'],
-    ['ppam', 'application/vnd.ms-powerpoint.addin.macroenabled.12'],
-    ['ppd', 'application/vnd.cups-ppd'],
-    ['ppm', 'image/x-portable-pixmap'],
-    ['pps', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],
-    ['ppsm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12'],
-    ['ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'],
-    ['ppt', ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint']],
-    ['pptm', 'application/vnd.ms-powerpoint.presentation.macroenabled.12'],
-    ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
-    ['ppz', 'application/mspowerpoint'],
-    ['prc', 'application/x-mobipocket-ebook'],
-    ['pre', ['application/vnd.lotus-freelance', 'application/x-freelance']],
-    ['prf', 'application/pics-rules'],
-    ['prt', 'application/pro_eng'],
-    ['ps', 'application/postscript'],
-    ['psb', 'application/vnd.3gpp.pic-bw-small'],
-    ['psd', ['application/octet-stream', 'image/vnd.adobe.photoshop']],
-    ['psf', 'application/x-font-linux-psf'],
-    ['pskcxml', 'application/pskc+xml'],
-    ['ptid', 'application/vnd.pvi.ptid1'],
-    ['pub', 'application/x-mspublisher'],
-    ['pvb', 'application/vnd.3gpp.pic-bw-var'],
-    ['pvu', 'paleovu/x-pv'],
-    ['pwn', 'application/vnd.3m.post-it-notes'],
-    ['pwz', 'application/vnd.ms-powerpoint'],
-    ['py', 'text/x-script.phyton'],
-    ['pya', 'audio/vnd.ms-playready.media.pya'],
-    ['pyc', 'application/x-bytecode.python'],
-    ['pyv', 'video/vnd.ms-playready.media.pyv'],
-    ['qam', 'application/vnd.epson.quickanime'],
-    ['qbo', 'application/vnd.intu.qbo'],
-    ['qcp', 'audio/vnd.qcelp'],
-    ['qd3', 'x-world/x-3dmf'],
-    ['qd3d', 'x-world/x-3dmf'],
-    ['qfx', 'application/vnd.intu.qfx'],
-    ['qif', 'image/x-quicktime'],
-    ['qps', 'application/vnd.publishare-delta-tree'],
-    ['qt', 'video/quicktime'],
-    ['qtc', 'video/x-qtc'],
-    ['qti', 'image/x-quicktime'],
-    ['qtif', 'image/x-quicktime'],
-    ['qxd', 'application/vnd.quark.quarkxpress'],
-    ['ra', ['audio/x-realaudio', 'audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin']],
-    ['ram', 'audio/x-pn-realaudio'],
-    ['rar', 'application/x-rar-compressed'],
-    ['ras', ['image/cmu-raster', 'application/x-cmu-raster', 'image/x-cmu-raster']],
-    ['rast', 'image/cmu-raster'],
-    ['rcprofile', 'application/vnd.ipunplugged.rcprofile'],
-    ['rdf', 'application/rdf+xml'],
-    ['rdz', 'application/vnd.data-vision.rdz'],
-    ['rep', 'application/vnd.businessobjects'],
-    ['res', 'application/x-dtbresource+xml'],
-    ['rexx', 'text/x-script.rexx'],
-    ['rf', 'image/vnd.rn-realflash'],
-    ['rgb', 'image/x-rgb'],
-    ['rif', 'application/reginfo+xml'],
-    ['rip', 'audio/vnd.rip'],
-    ['rl', 'application/resource-lists+xml'],
-    ['rlc', 'image/vnd.fujixerox.edmics-rlc'],
-    ['rld', 'application/resource-lists-diff+xml'],
-    ['rm', ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio']],
-    ['rmi', 'audio/mid'],
-    ['rmm', 'audio/x-pn-realaudio'],
-    ['rmp', ['audio/x-pn-realaudio-plugin', 'audio/x-pn-realaudio']],
-    ['rms', 'application/vnd.jcp.javame.midlet-rms'],
-    ['rnc', 'application/relax-ng-compact-syntax'],
-    ['rng', ['application/ringing-tones', 'application/vnd.nokia.ringing-tone']],
-    ['rnx', 'application/vnd.rn-realplayer'],
-    ['roff', 'application/x-troff'],
-    ['rp', 'image/vnd.rn-realpix'],
-    ['rp9', 'application/vnd.cloanto.rp9'],
-    ['rpm', 'audio/x-pn-realaudio-plugin'],
-    ['rpss', 'application/vnd.nokia.radio-presets'],
-    ['rpst', 'application/vnd.nokia.radio-preset'],
-    ['rq', 'application/sparql-query'],
-    ['rs', 'application/rls-services+xml'],
-    ['rsd', 'application/rsd+xml'],
-    ['rt', ['text/richtext', 'text/vnd.rn-realtext']],
-    ['rtf', ['application/rtf', 'text/richtext', 'application/x-rtf']],
-    ['rtx', ['text/richtext', 'application/rtf']],
-    ['rv', 'video/vnd.rn-realvideo'],
-    ['s', 'text/x-asm'],
-    ['s3m', 'audio/s3m'],
-    ['saf', 'application/vnd.yamaha.smaf-audio'],
-    ['saveme', 'application/octet-stream'],
-    ['sbk', 'application/x-tbook'],
-    ['sbml', 'application/sbml+xml'],
-    ['sc', 'application/vnd.ibm.secure-container'],
-    ['scd', 'application/x-msschedule'],
-    ['scm', ['application/vnd.lotus-screencam', 'video/x-scm', 'text/x-script.guile', 'application/x-lotusscreencam', 'text/x-script.scheme']],
-    ['scq', 'application/scvp-cv-request'],
-    ['scs', 'application/scvp-cv-response'],
-    ['sct', 'text/scriptlet'],
-    ['scurl', 'text/vnd.curl.scurl'],
-    ['sda', 'application/vnd.stardivision.draw'],
-    ['sdc', 'application/vnd.stardivision.calc'],
-    ['sdd', 'application/vnd.stardivision.impress'],
-    ['sdkm', 'application/vnd.solent.sdkm+xml'],
-    ['sdml', 'text/plain'],
-    ['sdp', ['application/sdp', 'application/x-sdp']],
-    ['sdr', 'application/sounder'],
-    ['sdw', 'application/vnd.stardivision.writer'],
-    ['sea', ['application/sea', 'application/x-sea']],
-    ['see', 'application/vnd.seemail'],
-    ['seed', 'application/vnd.fdsn.seed'],
-    ['sema', 'application/vnd.sema'],
-    ['semd', 'application/vnd.semd'],
-    ['semf', 'application/vnd.semf'],
-    ['ser', 'application/java-serialized-object'],
-    ['set', 'application/set'],
-    ['setpay', 'application/set-payment-initiation'],
-    ['setreg', 'application/set-registration-initiation'],
-    ['sfd-hdstx', 'application/vnd.hydrostatix.sof-data'],
-    ['sfs', 'application/vnd.spotfire.sfs'],
-    ['sgl', 'application/vnd.stardivision.writer-global'],
-    ['sgm', ['text/sgml', 'text/x-sgml']],
-    ['sgml', ['text/sgml', 'text/x-sgml']],
-    ['sh', ['application/x-shar', 'application/x-bsh', 'application/x-sh', 'text/x-script.sh']],
-    ['shar', ['application/x-bsh', 'application/x-shar']],
-    ['shf', 'application/shf+xml'],
-    ['shtml', ['text/html', 'text/x-server-parsed-html']],
-    ['sid', 'audio/x-psid'],
-    ['sis', 'application/vnd.symbian.install'],
-    ['sit', ['application/x-stuffit', 'application/x-sit']],
-    ['sitx', 'application/x-stuffitx'],
-    ['skd', 'application/x-koan'],
-    ['skm', 'application/x-koan'],
-    ['skp', ['application/vnd.koan', 'application/x-koan']],
-    ['skt', 'application/x-koan'],
-    ['sl', 'application/x-seelogo'],
-    ['sldm', 'application/vnd.ms-powerpoint.slide.macroenabled.12'],
-    ['sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slide'],
-    ['slt', 'application/vnd.epson.salt'],
-    ['sm', 'application/vnd.stepmania.stepchart'],
-    ['smf', 'application/vnd.stardivision.math'],
-    ['smi', ['application/smil', 'application/smil+xml']],
-    ['smil', 'application/smil'],
-    ['snd', ['audio/basic', 'audio/x-adpcm']],
-    ['snf', 'application/x-font-snf'],
-    ['sol', 'application/solids'],
-    ['spc', ['text/x-speech', 'application/x-pkcs7-certificates']],
-    ['spf', 'application/vnd.yamaha.smaf-phrase'],
-    ['spl', ['application/futuresplash', 'application/x-futuresplash']],
-    ['spot', 'text/vnd.in3d.spot'],
-    ['spp', 'application/scvp-vp-response'],
-    ['spq', 'application/scvp-vp-request'],
-    ['spr', 'application/x-sprite'],
-    ['sprite', 'application/x-sprite'],
-    ['src', 'application/x-wais-source'],
-    ['sru', 'application/sru+xml'],
-    ['srx', 'application/sparql-results+xml'],
-    ['sse', 'application/vnd.kodak-descriptor'],
-    ['ssf', 'application/vnd.epson.ssf'],
-    ['ssi', 'text/x-server-parsed-html'],
-    ['ssm', 'application/streamingmedia'],
-    ['ssml', 'application/ssml+xml'],
-    ['sst', ['application/vnd.ms-pkicertstore', 'application/vnd.ms-pki.certstore']],
-    ['st', 'application/vnd.sailingtracker.track'],
-    ['stc', 'application/vnd.sun.xml.calc.template'],
-    ['std', 'application/vnd.sun.xml.draw.template'],
-    ['step', 'application/step'],
-    ['stf', 'application/vnd.wt.stf'],
-    ['sti', 'application/vnd.sun.xml.impress.template'],
-    ['stk', 'application/hyperstudio'],
-    ['stl', ['application/vnd.ms-pkistl', 'application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle']],
-    ['stm', 'text/html'],
-    ['stp', 'application/step'],
-    ['str', 'application/vnd.pg.format'],
-    ['stw', 'application/vnd.sun.xml.writer.template'],
-    ['sub', 'image/vnd.dvb.subtitle'],
-    ['sus', 'application/vnd.sus-calendar'],
-    ['sv4cpio', 'application/x-sv4cpio'],
-    ['sv4crc', 'application/x-sv4crc'],
-    ['svc', 'application/vnd.dvb.service'],
-    ['svd', 'application/vnd.svd'],
-    ['svf', ['image/vnd.dwg', 'image/x-dwg']],
-    ['svg', 'image/svg+xml'],
-    ['svr', ['x-world/x-svr', 'application/x-world']],
-    ['swf', 'application/x-shockwave-flash'],
-    ['swi', 'application/vnd.aristanetworks.swi'],
-    ['sxc', 'application/vnd.sun.xml.calc'],
-    ['sxd', 'application/vnd.sun.xml.draw'],
-    ['sxg', 'application/vnd.sun.xml.writer.global'],
-    ['sxi', 'application/vnd.sun.xml.impress'],
-    ['sxm', 'application/vnd.sun.xml.math'],
-    ['sxw', 'application/vnd.sun.xml.writer'],
-    ['t', ['text/troff', 'application/x-troff']],
-    ['talk', 'text/x-speech'],
-    ['tao', 'application/vnd.tao.intent-module-archive'],
-    ['tar', 'application/x-tar'],
-    ['tbk', ['application/toolbook', 'application/x-tbook']],
-    ['tcap', 'application/vnd.3gpp2.tcap'],
-    ['tcl', ['text/x-script.tcl', 'application/x-tcl']],
-    ['tcsh', 'text/x-script.tcsh'],
-    ['teacher', 'application/vnd.smart.teacher'],
-    ['tei', 'application/tei+xml'],
-    ['tex', 'application/x-tex'],
-    ['texi', 'application/x-texinfo'],
-    ['texinfo', 'application/x-texinfo'],
-    ['text', ['application/plain', 'text/plain']],
-    ['tfi', 'application/thraud+xml'],
-    ['tfm', 'application/x-tex-tfm'],
-    ['tgz', ['application/gnutar', 'application/x-compressed']],
-    ['thmx', 'application/vnd.ms-officetheme'],
-    ['tif', ['image/tiff', 'image/x-tiff']],
-    ['tiff', ['image/tiff', 'image/x-tiff']],
-    ['tmo', 'application/vnd.tmobile-livetv'],
-    ['torrent', 'application/x-bittorrent'],
-    ['tpl', 'application/vnd.groove-tool-template'],
-    ['tpt', 'application/vnd.trid.tpt'],
-    ['tr', 'application/x-troff'],
-    ['tra', 'application/vnd.trueapp'],
-    ['trm', 'application/x-msterminal'],
-    ['tsd', 'application/timestamped-data'],
-    ['tsi', 'audio/tsp-audio'],
-    ['tsp', ['application/dsptype', 'audio/tsplayer']],
-    ['tsv', 'text/tab-separated-values'],
-    ['ttf', 'application/x-font-ttf'],
-    ['ttl', 'text/turtle'],
-    ['turbot', 'image/florian'],
-    ['twd', 'application/vnd.simtech-mindmapper'],
-    ['txd', 'application/vnd.genomatix.tuxedo'],
-    ['txf', 'application/vnd.mobius.txf'],
-    ['txt', 'text/plain'],
-    ['ufd', 'application/vnd.ufdl'],
-    ['uil', 'text/x-uil'],
-    ['uls', 'text/iuls'],
-    ['umj', 'application/vnd.umajin'],
-    ['uni', 'text/uri-list'],
-    ['unis', 'text/uri-list'],
-    ['unityweb', 'application/vnd.unity'],
-    ['unv', 'application/i-deas'],
-    ['uoml', 'application/vnd.uoml+xml'],
-    ['uri', 'text/uri-list'],
-    ['uris', 'text/uri-list'],
-    ['ustar', ['application/x-ustar', 'multipart/x-ustar']],
-    ['utz', 'application/vnd.uiq.theme'],
-    ['uu', ['application/octet-stream', 'text/x-uuencode']],
-    ['uue', 'text/x-uuencode'],
-    ['uva', 'audio/vnd.dece.audio'],
-    ['uvh', 'video/vnd.dece.hd'],
-    ['uvi', 'image/vnd.dece.graphic'],
-    ['uvm', 'video/vnd.dece.mobile'],
-    ['uvp', 'video/vnd.dece.pd'],
-    ['uvs', 'video/vnd.dece.sd'],
-    ['uvu', 'video/vnd.uvvu.mp4'],
-    ['uvv', 'video/vnd.dece.video'],
-    ['vcd', 'application/x-cdlink'],
-    ['vcf', 'text/x-vcard'],
-    ['vcg', 'application/vnd.groove-vcard'],
-    ['vcs', 'text/x-vcalendar'],
-    ['vcx', 'application/vnd.vcx'],
-    ['vda', 'application/vda'],
-    ['vdo', 'video/vdo'],
-    ['vew', 'application/groupwise'],
-    ['vis', 'application/vnd.visionary'],
-    ['viv', ['video/vivo', 'video/vnd.vivo']],
-    ['vivo', ['video/vivo', 'video/vnd.vivo']],
-    ['vmd', 'application/vocaltec-media-desc'],
-    ['vmf', 'application/vocaltec-media-file'],
-    ['voc', ['audio/voc', 'audio/x-voc']],
-    ['vos', 'video/vosaic'],
-    ['vox', 'audio/voxware'],
-    ['vqe', 'audio/x-twinvq-plugin'],
-    ['vqf', 'audio/x-twinvq'],
-    ['vql', 'audio/x-twinvq-plugin'],
-    ['vrml', ['model/vrml', 'x-world/x-vrml', 'application/x-vrml']],
-    ['vrt', 'x-world/x-vrt'],
-    ['vsd', ['application/vnd.visio', 'application/x-visio']],
-    ['vsf', 'application/vnd.vsf'],
-    ['vst', 'application/x-visio'],
-    ['vsw', 'application/x-visio'],
-    ['vtu', 'model/vnd.vtu'],
-    ['vxml', 'application/voicexml+xml'],
-    ['w60', 'application/wordperfect6.0'],
-    ['w61', 'application/wordperfect6.1'],
-    ['w6w', 'application/msword'],
-    ['wad', 'application/x-doom'],
-    ['wav', ['audio/wav', 'audio/x-wav']],
-    ['wax', 'audio/x-ms-wax'],
-    ['wb1', 'application/x-qpro'],
-    ['wbmp', 'image/vnd.wap.wbmp'],
-    ['wbs', 'application/vnd.criticaltools.wbs+xml'],
-    ['wbxml', 'application/vnd.wap.wbxml'],
-    ['wcm', 'application/vnd.ms-works'],
-    ['wdb', 'application/vnd.ms-works'],
-    ['web', 'application/vnd.xara'],
-    ['weba', 'audio/webm'],
-    ['webm', 'video/webm'],
-    ['webp', 'image/webp'],
-    ['wg', 'application/vnd.pmi.widget'],
-    ['wgt', 'application/widget'],
-    ['wiz', 'application/msword'],
-    ['wk1', 'application/x-123'],
-    ['wks', 'application/vnd.ms-works'],
-    ['wm', 'video/x-ms-wm'],
-    ['wma', 'audio/x-ms-wma'],
-    ['wmd', 'application/x-ms-wmd'],
-    ['wmf', ['windows/metafile', 'application/x-msmetafile']],
-    ['wml', 'text/vnd.wap.wml'],
-    ['wmlc', 'application/vnd.wap.wmlc'],
-    ['wmls', 'text/vnd.wap.wmlscript'],
-    ['wmlsc', 'application/vnd.wap.wmlscriptc'],
-    ['wmv', 'video/x-ms-wmv'],
-    ['wmx', 'video/x-ms-wmx'],
-    ['wmz', 'application/x-ms-wmz'],
-    ['woff', 'application/x-font-woff'],
-    ['word', 'application/msword'],
-    ['wp', 'application/wordperfect'],
-    ['wp5', ['application/wordperfect', 'application/wordperfect6.0']],
-    ['wp6', 'application/wordperfect'],
-    ['wpd', ['application/wordperfect', 'application/vnd.wordperfect', 'application/x-wpwin']],
-    ['wpl', 'application/vnd.ms-wpl'],
-    ['wps', 'application/vnd.ms-works'],
-    ['wq1', 'application/x-lotus'],
-    ['wqd', 'application/vnd.wqd'],
-    ['wri', ['application/mswrite', 'application/x-wri', 'application/x-mswrite']],
-    ['wrl', ['model/vrml', 'x-world/x-vrml', 'application/x-world']],
-    ['wrz', ['model/vrml', 'x-world/x-vrml']],
-    ['wsc', 'text/scriplet'],
-    ['wsdl', 'application/wsdl+xml'],
-    ['wspolicy', 'application/wspolicy+xml'],
-    ['wsrc', 'application/x-wais-source'],
-    ['wtb', 'application/vnd.webturbo'],
-    ['wtk', 'application/x-wintalk'],
-    ['wvx', 'video/x-ms-wvx'],
-    ['x-png', 'image/png'],
-    ['x3d', 'application/vnd.hzn-3d-crossword'],
-    ['xaf', 'x-world/x-vrml'],
-    ['xap', 'application/x-silverlight-app'],
-    ['xar', 'application/vnd.xara'],
-    ['xbap', 'application/x-ms-xbap'],
-    ['xbd', 'application/vnd.fujixerox.docuworks.binder'],
-    ['xbm', ['image/xbm', 'image/x-xbm', 'image/x-xbitmap']],
-    ['xdf', 'application/xcap-diff+xml'],
-    ['xdm', 'application/vnd.syncml.dm+xml'],
-    ['xdp', 'application/vnd.adobe.xdp+xml'],
-    ['xdr', 'video/x-amt-demorun'],
-    ['xdssc', 'application/dssc+xml'],
-    ['xdw', 'application/vnd.fujixerox.docuworks'],
-    ['xenc', 'application/xenc+xml'],
-    ['xer', 'application/patch-ops-error+xml'],
-    ['xfdf', 'application/vnd.adobe.xfdf'],
-    ['xfdl', 'application/vnd.xfdl'],
-    ['xgz', 'xgl/drawing'],
-    ['xhtml', 'application/xhtml+xml'],
-    ['xif', 'image/vnd.xiff'],
-    ['xl', 'application/excel'],
-    ['xla', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],
-    ['xlam', 'application/vnd.ms-excel.addin.macroenabled.12'],
-    ['xlb', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],
-    ['xlc', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],
-    ['xld', ['application/excel', 'application/x-excel']],
-    ['xlk', ['application/excel', 'application/x-excel']],
-    ['xll', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],
-    ['xlm', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],
-    ['xls', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],
-    ['xlsb', 'application/vnd.ms-excel.sheet.binary.macroenabled.12'],
-    ['xlsm', 'application/vnd.ms-excel.sheet.macroenabled.12'],
-    ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
-    ['xlt', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],
-    ['xltm', 'application/vnd.ms-excel.template.macroenabled.12'],
-    ['xltx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'],
-    ['xlv', ['application/excel', 'application/x-excel']],
-    ['xlw', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],
-    ['xm', 'audio/xm'],
-    ['xml', ['application/xml', 'text/xml', 'application/atom+xml', 'application/rss+xml']],
-    ['xmz', 'xgl/movie'],
-    ['xo', 'application/vnd.olpc-sugar'],
-    ['xof', 'x-world/x-vrml'],
-    ['xop', 'application/xop+xml'],
-    ['xpi', 'application/x-xpinstall'],
-    ['xpix', 'application/x-vnd.ls-xpix'],
-    ['xpm', ['image/xpm', 'image/x-xpixmap']],
-    ['xpr', 'application/vnd.is-xpr'],
-    ['xps', 'application/vnd.ms-xpsdocument'],
-    ['xpw', 'application/vnd.intercon.formnet'],
-    ['xslt', 'application/xslt+xml'],
-    ['xsm', 'application/vnd.syncml+xml'],
-    ['xspf', 'application/xspf+xml'],
-    ['xsr', 'video/x-amt-showrun'],
-    ['xul', 'application/vnd.mozilla.xul+xml'],
-    ['xwd', ['image/x-xwd', 'image/x-xwindowdump']],
-    ['xyz', ['chemical/x-xyz', 'chemical/x-pdb']],
-    ['yang', 'application/yang'],
-    ['yin', 'application/yin+xml'],
-    ['z', ['application/x-compressed', 'application/x-compress']],
-    ['zaz', 'application/vnd.zzazz.deck+xml'],
-    ['zip', ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-compressed']],
-    ['zir', 'application/vnd.zul'],
-    ['zmm', 'application/vnd.handheld-entertainment+xml'],
-    ['zoo', 'application/octet-stream'],
-    ['zsh', 'text/x-script.zsh']
-]);
-
-module.exports = {
-    detectMimeType(filename) {
-        if (!filename) {
-            return defaultMimeType;
-        }
-
-        let parsed = path.parse(filename);
-        let extension = (parsed.ext.substr(1) || parsed.name || '').split('?').shift().trim().toLowerCase();
-        let value = defaultMimeType;
-
-        if (extensions.has(extension)) {
-            value = extensions.get(extension);
-        }
-
-        if (Array.isArray(value)) {
-            return value[0];
-        }
-        return value;
-    },
-
-    detectExtension(mimeType) {
-        if (!mimeType) {
-            return defaultExtension;
-        }
-        let parts = (mimeType || '').toLowerCase().trim().split('/');
-        let rootType = parts.shift().trim();
-        let subType = parts.join('/').trim();
-
-        if (mimeTypes.has(rootType + '/' + subType)) {
-            let value = mimeTypes.get(rootType + '/' + subType);
-            if (Array.isArray(value)) {
-                return value[0];
-            }
-            return value;
-        }
-
-        switch (rootType) {
-            case 'text':
-                return 'txt';
-            default:
-                return 'bin';
-        }
-    }
-};
Index: de_modules/nodemailer/lib/mime-node/index.js
===================================================================
--- node_modules/nodemailer/lib/mime-node/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1314 +1,0 @@
-/* eslint no-undefined: 0, prefer-spread: 0, no-control-regex: 0 */
-
-'use strict';
-
-const crypto = require('crypto');
-const fs = require('fs');
-const punycode = require('../punycode');
-const PassThrough = require('stream').PassThrough;
-const shared = require('../shared');
-
-const mimeFuncs = require('../mime-funcs');
-const qp = require('../qp');
-const base64 = require('../base64');
-const addressparser = require('../addressparser');
-const nmfetch = require('../fetch');
-const LastNewline = require('./last-newline');
-
-const LeWindows = require('./le-windows');
-const LeUnix = require('./le-unix');
-
-/**
- * Creates a new mime tree node. Assumes 'multipart/*' as the content type
- * if it is a branch, anything else counts as leaf. If rootNode is missing from
- * the options, assumes this is the root.
- *
- * @param {String} contentType Define the content type for the node. Can be left blank for attachments (derived from filename)
- * @param {Object} [options] optional options
- * @param {Object} [options.rootNode] root node for this tree
- * @param {Object} [options.parentNode] immediate parent for this node
- * @param {Object} [options.filename] filename for an attachment node
- * @param {String} [options.baseBoundary] shared part of the unique multipart boundary
- * @param {Boolean} [options.keepBcc] If true, do not exclude Bcc from the generated headers
- * @param {Function} [options.normalizeHeaderKey] method to normalize header keys for custom caseing
- * @param {String} [options.textEncoding] either 'Q' (the default) or 'B'
- */
-class MimeNode {
-    constructor(contentType, options) {
-        this.nodeCounter = 0;
-
-        options = options || {};
-
-        /**
-         * shared part of the unique multipart boundary
-         */
-        this.baseBoundary = options.baseBoundary || crypto.randomBytes(8).toString('hex');
-        this.boundaryPrefix = options.boundaryPrefix || '--_NmP';
-
-        this.disableFileAccess = !!options.disableFileAccess;
-        this.disableUrlAccess = !!options.disableUrlAccess;
-
-        this.normalizeHeaderKey = options.normalizeHeaderKey;
-
-        /**
-         * If date headers is missing and current node is the root, this value is used instead
-         */
-        this.date = new Date();
-
-        /**
-         * Root node for current mime tree
-         */
-        this.rootNode = options.rootNode || this;
-
-        /**
-         * If true include Bcc in generated headers (if available)
-         */
-        this.keepBcc = !!options.keepBcc;
-
-        /**
-         * If filename is specified but contentType is not (probably an attachment)
-         * detect the content type from filename extension
-         */
-        if (options.filename) {
-            /**
-             * Filename for this node. Useful with attachments
-             */
-            this.filename = options.filename;
-            if (!contentType) {
-                contentType = mimeFuncs.detectMimeType(this.filename.split('.').pop());
-            }
-        }
-
-        /**
-         * Indicates which encoding should be used for header strings: "Q" or "B"
-         */
-        this.textEncoding = (options.textEncoding || '').toString().trim().charAt(0).toUpperCase();
-
-        /**
-         * Immediate parent for this node (or undefined if not set)
-         */
-        this.parentNode = options.parentNode;
-
-        /**
-         * Hostname for default message-id values
-         */
-        this.hostname = options.hostname;
-
-        /**
-         * If set to 'win' then uses \r\n, if 'linux' then \n. If not set (or `raw` is used) then newlines are kept as is.
-         */
-        this.newline = options.newline;
-
-        /**
-         * An array for possible child nodes
-         */
-        this.childNodes = [];
-
-        /**
-         * Used for generating unique boundaries (prepended to the shared base)
-         */
-        this._nodeId = ++this.rootNode.nodeCounter;
-
-        /**
-         * A list of header values for this node in the form of [{key:'', value:''}]
-         */
-        this._headers = [];
-
-        /**
-         * True if the content only uses ASCII printable characters
-         * @type {Boolean}
-         */
-        this._isPlainText = false;
-
-        /**
-         * True if the content is plain text but has longer lines than allowed
-         * @type {Boolean}
-         */
-        this._hasLongLines = false;
-
-        /**
-         * If set, use instead this value for envelopes instead of generating one
-         * @type {Boolean}
-         */
-        this._envelope = false;
-
-        /**
-         * If set then use this value as the stream content instead of building it
-         * @type {String|Buffer|Stream}
-         */
-        this._raw = false;
-
-        /**
-         * Additional transform streams that the message will be piped before
-         * exposing by createReadStream
-         * @type {Array}
-         */
-        this._transforms = [];
-
-        /**
-         * Additional process functions that the message will be piped through before
-         * exposing by createReadStream. These functions are run after transforms
-         * @type {Array}
-         */
-        this._processFuncs = [];
-
-        /**
-         * If content type is set (or derived from the filename) add it to headers
-         */
-        if (contentType) {
-            this.setHeader('Content-Type', contentType);
-        }
-    }
-
-    /////// PUBLIC METHODS
-
-    /**
-     * Creates and appends a child node.Arguments provided are passed to MimeNode constructor
-     *
-     * @param {String} [contentType] Optional content type
-     * @param {Object} [options] Optional options object
-     * @return {Object} Created node object
-     */
-    createChild(contentType, options) {
-        if (!options && typeof contentType === 'object') {
-            options = contentType;
-            contentType = undefined;
-        }
-        let node = new MimeNode(contentType, options);
-        this.appendChild(node);
-        return node;
-    }
-
-    /**
-     * Appends an existing node to the mime tree. Removes the node from an existing
-     * tree if needed
-     *
-     * @param {Object} childNode node to be appended
-     * @return {Object} Appended node object
-     */
-    appendChild(childNode) {
-        if (childNode.rootNode !== this.rootNode) {
-            childNode.rootNode = this.rootNode;
-            childNode._nodeId = ++this.rootNode.nodeCounter;
-        }
-
-        childNode.parentNode = this;
-
-        this.childNodes.push(childNode);
-        return childNode;
-    }
-
-    /**
-     * Replaces current node with another node
-     *
-     * @param {Object} node Replacement node
-     * @return {Object} Replacement node
-     */
-    replace(node) {
-        if (node === this) {
-            return this;
-        }
-
-        this.parentNode.childNodes.forEach((childNode, i) => {
-            if (childNode === this) {
-                node.rootNode = this.rootNode;
-                node.parentNode = this.parentNode;
-                node._nodeId = this._nodeId;
-
-                this.rootNode = this;
-                this.parentNode = undefined;
-
-                node.parentNode.childNodes[i] = node;
-            }
-        });
-
-        return node;
-    }
-
-    /**
-     * Removes current node from the mime tree
-     *
-     * @return {Object} removed node
-     */
-    remove() {
-        if (!this.parentNode) {
-            return this;
-        }
-
-        for (let i = this.parentNode.childNodes.length - 1; i >= 0; i--) {
-            if (this.parentNode.childNodes[i] === this) {
-                this.parentNode.childNodes.splice(i, 1);
-                this.parentNode = undefined;
-                this.rootNode = this;
-                return this;
-            }
-        }
-    }
-
-    /**
-     * Sets a header value. If the value for selected key exists, it is overwritten.
-     * You can set multiple values as well by using [{key:'', value:''}] or
-     * {key: 'value'} as the first argument.
-     *
-     * @param {String|Array|Object} key Header key or a list of key value pairs
-     * @param {String} value Header value
-     * @return {Object} current node
-     */
-    setHeader(key, value) {
-        let added = false,
-            headerValue;
-
-        // Allow setting multiple headers at once
-        if (!value && key && typeof key === 'object') {
-            // allow {key:'content-type', value: 'text/plain'}
-            if (key.key && 'value' in key) {
-                this.setHeader(key.key, key.value);
-            } else if (Array.isArray(key)) {
-                // allow [{key:'content-type', value: 'text/plain'}]
-                key.forEach(i => {
-                    this.setHeader(i.key, i.value);
-                });
-            } else {
-                // allow {'content-type': 'text/plain'}
-                Object.keys(key).forEach(i => {
-                    this.setHeader(i, key[i]);
-                });
-            }
-            return this;
-        }
-
-        key = this._normalizeHeaderKey(key);
-
-        headerValue = {
-            key,
-            value
-        };
-
-        // Check if the value exists and overwrite
-        for (let i = 0, len = this._headers.length; i < len; i++) {
-            if (this._headers[i].key === key) {
-                if (!added) {
-                    // replace the first match
-                    this._headers[i] = headerValue;
-                    added = true;
-                } else {
-                    // remove following matches
-                    this._headers.splice(i, 1);
-                    i--;
-                    len--;
-                }
-            }
-        }
-
-        // match not found, append the value
-        if (!added) {
-            this._headers.push(headerValue);
-        }
-
-        return this;
-    }
-
-    /**
-     * Adds a header value. If the value for selected key exists, the value is appended
-     * as a new field and old one is not touched.
-     * You can set multiple values as well by using [{key:'', value:''}] or
-     * {key: 'value'} as the first argument.
-     *
-     * @param {String|Array|Object} key Header key or a list of key value pairs
-     * @param {String} value Header value
-     * @return {Object} current node
-     */
-    addHeader(key, value) {
-        // Allow setting multiple headers at once
-        if (!value && key && typeof key === 'object') {
-            // allow {key:'content-type', value: 'text/plain'}
-            if (key.key && key.value) {
-                this.addHeader(key.key, key.value);
-            } else if (Array.isArray(key)) {
-                // allow [{key:'content-type', value: 'text/plain'}]
-                key.forEach(i => {
-                    this.addHeader(i.key, i.value);
-                });
-            } else {
-                // allow {'content-type': 'text/plain'}
-                Object.keys(key).forEach(i => {
-                    this.addHeader(i, key[i]);
-                });
-            }
-            return this;
-        } else if (Array.isArray(value)) {
-            value.forEach(val => {
-                this.addHeader(key, val);
-            });
-            return this;
-        }
-
-        this._headers.push({
-            key: this._normalizeHeaderKey(key),
-            value
-        });
-
-        return this;
-    }
-
-    /**
-     * Retrieves the first mathcing value of a selected key
-     *
-     * @param {String} key Key to search for
-     * @retun {String} Value for the key
-     */
-    getHeader(key) {
-        key = this._normalizeHeaderKey(key);
-        for (let i = 0, len = this._headers.length; i < len; i++) {
-            if (this._headers[i].key === key) {
-                return this._headers[i].value;
-            }
-        }
-    }
-
-    /**
-     * Sets body content for current node. If the value is a string, charset is added automatically
-     * to Content-Type (if it is text/*). If the value is a Buffer, you need to specify
-     * the charset yourself
-     *
-     * @param (String|Buffer) content Body content
-     * @return {Object} current node
-     */
-    setContent(content) {
-        this.content = content;
-        if (typeof this.content.pipe === 'function') {
-            // pre-stream handler. might be triggered if a stream is set as content
-            // and 'error' fires before anything is done with this stream
-            this._contentErrorHandler = err => {
-                this.content.removeListener('error', this._contentErrorHandler);
-                this.content = err;
-            };
-            this.content.once('error', this._contentErrorHandler);
-        } else if (typeof this.content === 'string') {
-            this._isPlainText = mimeFuncs.isPlainText(this.content);
-            if (this._isPlainText && mimeFuncs.hasLongerLines(this.content, 76)) {
-                // If there are lines longer than 76 symbols/bytes do not use 7bit
-                this._hasLongLines = true;
-            }
-        }
-        return this;
-    }
-
-    build(callback) {
-        let promise;
-
-        if (!callback) {
-            promise = new Promise((resolve, reject) => {
-                callback = shared.callbackPromise(resolve, reject);
-            });
-        }
-
-        let stream = this.createReadStream();
-        let buf = [];
-        let buflen = 0;
-        let returned = false;
-
-        stream.on('readable', () => {
-            let chunk;
-
-            while ((chunk = stream.read()) !== null) {
-                buf.push(chunk);
-                buflen += chunk.length;
-            }
-        });
-
-        stream.once('error', err => {
-            if (returned) {
-                return;
-            }
-            returned = true;
-
-            return callback(err);
-        });
-
-        stream.once('end', chunk => {
-            if (returned) {
-                return;
-            }
-            returned = true;
-
-            if (chunk && chunk.length) {
-                buf.push(chunk);
-                buflen += chunk.length;
-            }
-            return callback(null, Buffer.concat(buf, buflen));
-        });
-
-        return promise;
-    }
-
-    getTransferEncoding() {
-        let transferEncoding = false;
-        let contentType = (this.getHeader('Content-Type') || '').toString().toLowerCase().trim();
-
-        if (this.content) {
-            transferEncoding = (this.getHeader('Content-Transfer-Encoding') || '').toString().toLowerCase().trim();
-            if (!transferEncoding || !['base64', 'quoted-printable'].includes(transferEncoding)) {
-                if (/^text\//i.test(contentType)) {
-                    // If there are no special symbols, no need to modify the text
-                    if (this._isPlainText && !this._hasLongLines) {
-                        transferEncoding = '7bit';
-                    } else if (typeof this.content === 'string' || this.content instanceof Buffer) {
-                        // detect preferred encoding for string value
-                        transferEncoding = this._getTextEncoding(this.content) === 'Q' ? 'quoted-printable' : 'base64';
-                    } else {
-                        // we can not check content for a stream, so either use preferred encoding or fallback to QP
-                        transferEncoding = this.textEncoding === 'B' ? 'base64' : 'quoted-printable';
-                    }
-                } else if (!/^(multipart|message)\//i.test(contentType)) {
-                    transferEncoding = transferEncoding || 'base64';
-                }
-            }
-        }
-        return transferEncoding;
-    }
-
-    /**
-     * Builds the header block for the mime node. Append \r\n\r\n before writing the content
-     *
-     * @returns {String} Headers
-     */
-    buildHeaders() {
-        let transferEncoding = this.getTransferEncoding();
-        let headers = [];
-
-        if (transferEncoding) {
-            this.setHeader('Content-Transfer-Encoding', transferEncoding);
-        }
-
-        if (this.filename && !this.getHeader('Content-Disposition')) {
-            this.setHeader('Content-Disposition', 'attachment');
-        }
-
-        // Ensure mandatory header fields
-        if (this.rootNode === this) {
-            if (!this.getHeader('Date')) {
-                this.setHeader('Date', this.date.toUTCString().replace(/GMT/, '+0000'));
-            }
-
-            // ensure that Message-Id is present
-            this.messageId();
-
-            if (!this.getHeader('MIME-Version')) {
-                this.setHeader('MIME-Version', '1.0');
-            }
-
-            // Ensure that Content-Type is the last header for the root node
-            for (let i = this._headers.length - 2; i >= 0; i--) {
-                let header = this._headers[i];
-                if (header.key === 'Content-Type') {
-                    this._headers.splice(i, 1);
-                    this._headers.push(header);
-                }
-            }
-        }
-
-        this._headers.forEach(header => {
-            let key = header.key;
-            let value = header.value;
-            let structured;
-            let param;
-            let options = {};
-            let formattedHeaders = ['From', 'Sender', 'To', 'Cc', 'Bcc', 'Reply-To', 'Date', 'References'];
-
-            if (value && typeof value === 'object' && !formattedHeaders.includes(key)) {
-                Object.keys(value).forEach(key => {
-                    if (key !== 'value') {
-                        options[key] = value[key];
-                    }
-                });
-                value = (value.value || '').toString();
-                if (!value.trim()) {
-                    return;
-                }
-            }
-
-            if (options.prepared) {
-                // header value is
-                if (options.foldLines) {
-                    headers.push(mimeFuncs.foldLines(key + ': ' + value));
-                } else {
-                    headers.push(key + ': ' + value);
-                }
-                return;
-            }
-
-            switch (header.key) {
-                case 'Content-Disposition':
-                    structured = mimeFuncs.parseHeaderValue(value);
-                    if (this.filename) {
-                        structured.params.filename = this.filename;
-                    }
-                    value = mimeFuncs.buildHeaderValue(structured);
-                    break;
-
-                case 'Content-Type':
-                    structured = mimeFuncs.parseHeaderValue(value);
-
-                    this._handleContentType(structured);
-
-                    if (structured.value.match(/^text\/plain\b/) && typeof this.content === 'string' && /[\u0080-\uFFFF]/.test(this.content)) {
-                        structured.params.charset = 'utf-8';
-                    }
-
-                    value = mimeFuncs.buildHeaderValue(structured);
-
-                    if (this.filename) {
-                        // add support for non-compliant clients like QQ webmail
-                        // we can't build the value with buildHeaderValue as the value is non standard and
-                        // would be converted to parameter continuation encoding that we do not want
-                        param = this._encodeWords(this.filename);
-
-                        if (param !== this.filename || /[\s'"\\;:/=(),<>@[\]?]|^-/.test(param)) {
-                            // include value in quotes if needed
-                            param = '"' + param + '"';
-                        }
-                        value += '; name=' + param;
-                    }
-                    break;
-
-                case 'Bcc':
-                    if (!this.keepBcc) {
-                        // skip BCC values
-                        return;
-                    }
-                    break;
-            }
-
-            value = this._encodeHeaderValue(key, value);
-
-            // skip empty lines
-            if (!(value || '').toString().trim()) {
-                return;
-            }
-
-            if (typeof this.normalizeHeaderKey === 'function') {
-                let normalized = this.normalizeHeaderKey(key, value);
-                if (normalized && typeof normalized === 'string' && normalized.length) {
-                    key = normalized;
-                }
-            }
-
-            headers.push(mimeFuncs.foldLines(key + ': ' + value, 76));
-        });
-
-        return headers.join('\r\n');
-    }
-
-    /**
-     * Streams the rfc2822 message from the current node. If this is a root node,
-     * mandatory header fields are set if missing (Date, Message-Id, MIME-Version)
-     *
-     * @return {String} Compiled message
-     */
-    createReadStream(options) {
-        options = options || {};
-
-        let stream = new PassThrough(options);
-        let outputStream = stream;
-        let transform;
-
-        this.stream(stream, options, err => {
-            if (err) {
-                outputStream.emit('error', err);
-                return;
-            }
-            stream.end();
-        });
-
-        for (let i = 0, len = this._transforms.length; i < len; i++) {
-            transform = typeof this._transforms[i] === 'function' ? this._transforms[i]() : this._transforms[i];
-            outputStream.once('error', err => {
-                transform.emit('error', err);
-            });
-            outputStream = outputStream.pipe(transform);
-        }
-
-        // ensure terminating newline after possible user transforms
-        transform = new LastNewline();
-        outputStream.once('error', err => {
-            transform.emit('error', err);
-        });
-        outputStream = outputStream.pipe(transform);
-
-        // dkim and stuff
-        for (let i = 0, len = this._processFuncs.length; i < len; i++) {
-            transform = this._processFuncs[i];
-            outputStream = transform(outputStream);
-        }
-
-        if (this.newline) {
-            const winbreak = ['win', 'windows', 'dos', '\r\n'].includes(this.newline.toString().toLowerCase());
-            const newlineTransform = winbreak ? new LeWindows() : new LeUnix();
-
-            const stream = outputStream.pipe(newlineTransform);
-            outputStream.on('error', err => stream.emit('error', err));
-            return stream;
-        }
-
-        return outputStream;
-    }
-
-    /**
-     * Appends a transform stream object to the transforms list. Final output
-     * is passed through this stream before exposing
-     *
-     * @param {Object} transform Read-Write stream
-     */
-    transform(transform) {
-        this._transforms.push(transform);
-    }
-
-    /**
-     * Appends a post process function. The functon is run after transforms and
-     * uses the following syntax
-     *
-     *   processFunc(input) -> outputStream
-     *
-     * @param {Object} processFunc Read-Write stream
-     */
-    processFunc(processFunc) {
-        this._processFuncs.push(processFunc);
-    }
-
-    stream(outputStream, options, done) {
-        let transferEncoding = this.getTransferEncoding();
-        let contentStream;
-        let localStream;
-
-        // protect actual callback against multiple triggering
-        let returned = false;
-        let callback = err => {
-            if (returned) {
-                return;
-            }
-            returned = true;
-            done(err);
-        };
-
-        // for multipart nodes, push child nodes
-        // for content nodes end the stream
-        let finalize = () => {
-            let childId = 0;
-            let processChildNode = () => {
-                if (childId >= this.childNodes.length) {
-                    outputStream.write('\r\n--' + this.boundary + '--\r\n');
-                    return callback();
-                }
-                let child = this.childNodes[childId++];
-                outputStream.write((childId > 1 ? '\r\n' : '') + '--' + this.boundary + '\r\n');
-                child.stream(outputStream, options, err => {
-                    if (err) {
-                        return callback(err);
-                    }
-                    setImmediate(processChildNode);
-                });
-            };
-
-            if (this.multipart) {
-                setImmediate(processChildNode);
-            } else {
-                return callback();
-            }
-        };
-
-        // pushes node content
-        let sendContent = () => {
-            if (this.content) {
-                if (Object.prototype.toString.call(this.content) === '[object Error]') {
-                    // content is already errored
-                    return callback(this.content);
-                }
-
-                if (typeof this.content.pipe === 'function') {
-                    this.content.removeListener('error', this._contentErrorHandler);
-                    this._contentErrorHandler = err => callback(err);
-                    this.content.once('error', this._contentErrorHandler);
-                }
-
-                let createStream = () => {
-                    if (['quoted-printable', 'base64'].includes(transferEncoding)) {
-                        contentStream = new (transferEncoding === 'base64' ? base64 : qp).Encoder(options);
-
-                        contentStream.pipe(outputStream, {
-                            end: false
-                        });
-                        contentStream.once('end', finalize);
-                        contentStream.once('error', err => callback(err));
-
-                        localStream = this._getStream(this.content);
-                        localStream.pipe(contentStream);
-                    } else {
-                        // anything that is not QP or Base54 passes as-is
-                        localStream = this._getStream(this.content);
-                        localStream.pipe(outputStream, {
-                            end: false
-                        });
-                        localStream.once('end', finalize);
-                    }
-
-                    localStream.once('error', err => callback(err));
-                };
-
-                if (this.content._resolve) {
-                    let chunks = [];
-                    let chunklen = 0;
-                    let returned = false;
-                    let sourceStream = this._getStream(this.content);
-                    sourceStream.on('error', err => {
-                        if (returned) {
-                            return;
-                        }
-                        returned = true;
-                        callback(err);
-                    });
-                    sourceStream.on('readable', () => {
-                        let chunk;
-                        while ((chunk = sourceStream.read()) !== null) {
-                            chunks.push(chunk);
-                            chunklen += chunk.length;
-                        }
-                    });
-                    sourceStream.on('end', () => {
-                        if (returned) {
-                            return;
-                        }
-                        returned = true;
-                        this.content._resolve = false;
-                        this.content._resolvedValue = Buffer.concat(chunks, chunklen);
-                        setImmediate(createStream);
-                    });
-                } else {
-                    setImmediate(createStream);
-                }
-                return;
-            } else {
-                return setImmediate(finalize);
-            }
-        };
-
-        if (this._raw) {
-            setImmediate(() => {
-                if (Object.prototype.toString.call(this._raw) === '[object Error]') {
-                    // content is already errored
-                    return callback(this._raw);
-                }
-
-                // remove default error handler (if set)
-                if (typeof this._raw.pipe === 'function') {
-                    this._raw.removeListener('error', this._contentErrorHandler);
-                }
-
-                let raw = this._getStream(this._raw);
-                raw.pipe(outputStream, {
-                    end: false
-                });
-                raw.on('error', err => outputStream.emit('error', err));
-                raw.on('end', finalize);
-            });
-        } else {
-            outputStream.write(this.buildHeaders() + '\r\n\r\n');
-            setImmediate(sendContent);
-        }
-    }
-
-    /**
-     * Sets envelope to be used instead of the generated one
-     *
-     * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}
-     */
-    setEnvelope(envelope) {
-        let list;
-
-        this._envelope = {
-            from: false,
-            to: []
-        };
-
-        if (envelope.from) {
-            list = [];
-            this._convertAddresses(this._parseAddresses(envelope.from), list);
-            list = list.filter(address => address && address.address);
-            if (list.length && list[0]) {
-                this._envelope.from = list[0].address;
-            }
-        }
-        ['to', 'cc', 'bcc'].forEach(key => {
-            if (envelope[key]) {
-                this._convertAddresses(this._parseAddresses(envelope[key]), this._envelope.to);
-            }
-        });
-
-        this._envelope.to = this._envelope.to.map(to => to.address).filter(address => address);
-
-        let standardFields = ['to', 'cc', 'bcc', 'from'];
-        Object.keys(envelope).forEach(key => {
-            if (!standardFields.includes(key)) {
-                this._envelope[key] = envelope[key];
-            }
-        });
-
-        return this;
-    }
-
-    /**
-     * Generates and returns an object with parsed address fields
-     *
-     * @return {Object} Address object
-     */
-    getAddresses() {
-        let addresses = {};
-
-        this._headers.forEach(header => {
-            let key = header.key.toLowerCase();
-            if (['from', 'sender', 'reply-to', 'to', 'cc', 'bcc'].includes(key)) {
-                if (!Array.isArray(addresses[key])) {
-                    addresses[key] = [];
-                }
-
-                this._convertAddresses(this._parseAddresses(header.value), addresses[key]);
-            }
-        });
-
-        return addresses;
-    }
-
-    /**
-     * Generates and returns SMTP envelope with the sender address and a list of recipients addresses
-     *
-     * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}
-     */
-    getEnvelope() {
-        if (this._envelope) {
-            return this._envelope;
-        }
-
-        let envelope = {
-            from: false,
-            to: []
-        };
-        this._headers.forEach(header => {
-            let list = [];
-            if (header.key === 'From' || (!envelope.from && ['Reply-To', 'Sender'].includes(header.key))) {
-                this._convertAddresses(this._parseAddresses(header.value), list);
-                if (list.length && list[0]) {
-                    envelope.from = list[0].address;
-                }
-            } else if (['To', 'Cc', 'Bcc'].includes(header.key)) {
-                this._convertAddresses(this._parseAddresses(header.value), envelope.to);
-            }
-        });
-
-        envelope.to = envelope.to.map(to => to.address);
-
-        return envelope;
-    }
-
-    /**
-     * Returns Message-Id value. If it does not exist, then creates one
-     *
-     * @return {String} Message-Id value
-     */
-    messageId() {
-        let messageId = this.getHeader('Message-ID');
-        // You really should define your own Message-Id field!
-        if (!messageId) {
-            messageId = this._generateMessageId();
-            this.setHeader('Message-ID', messageId);
-        }
-        return messageId;
-    }
-
-    /**
-     * Sets pregenerated content that will be used as the output of this node
-     *
-     * @param {String|Buffer|Stream} Raw MIME contents
-     */
-    setRaw(raw) {
-        this._raw = raw;
-
-        if (this._raw && typeof this._raw.pipe === 'function') {
-            // pre-stream handler. might be triggered if a stream is set as content
-            // and 'error' fires before anything is done with this stream
-            this._contentErrorHandler = err => {
-                this._raw.removeListener('error', this._contentErrorHandler);
-                this._raw = err;
-            };
-            this._raw.once('error', this._contentErrorHandler);
-        }
-
-        return this;
-    }
-
-    /////// PRIVATE METHODS
-
-    /**
-     * Detects and returns handle to a stream related with the content.
-     *
-     * @param {Mixed} content Node content
-     * @returns {Object} Stream object
-     */
-    _getStream(content) {
-        let contentStream;
-
-        if (content._resolvedValue) {
-            // pass string or buffer content as a stream
-            contentStream = new PassThrough();
-
-            setImmediate(() => {
-                try {
-                    contentStream.end(content._resolvedValue);
-                } catch (err) {
-                    contentStream.emit('error', err);
-                }
-            });
-
-            return contentStream;
-        } else if (typeof content.pipe === 'function') {
-            // assume as stream
-            return content;
-        } else if (content && typeof content.path === 'string' && !content.href) {
-            if (this.disableFileAccess) {
-                contentStream = new PassThrough();
-                setImmediate(() => contentStream.emit('error', new Error('File access rejected for ' + content.path)));
-                return contentStream;
-            }
-            // read file
-            return fs.createReadStream(content.path);
-        } else if (content && typeof content.href === 'string') {
-            if (this.disableUrlAccess) {
-                contentStream = new PassThrough();
-                setImmediate(() => contentStream.emit('error', new Error('Url access rejected for ' + content.href)));
-                return contentStream;
-            }
-            // fetch URL
-            return nmfetch(content.href, { headers: content.httpHeaders });
-        } else {
-            // pass string or buffer content as a stream
-            contentStream = new PassThrough();
-
-            setImmediate(() => {
-                try {
-                    contentStream.end(content || '');
-                } catch (err) {
-                    contentStream.emit('error', err);
-                }
-            });
-            return contentStream;
-        }
-    }
-
-    /**
-     * Parses addresses. Takes in a single address or an array or an
-     * array of address arrays (eg. To: [[first group], [second group],...])
-     *
-     * @param {Mixed} addresses Addresses to be parsed
-     * @return {Array} An array of address objects
-     */
-    _parseAddresses(addresses) {
-        return [].concat.apply(
-            [],
-            [].concat(addresses).map(address => {
-                // eslint-disable-line prefer-spread
-                if (address && address.address) {
-                    address.address = this._normalizeAddress(address.address);
-                    address.name = address.name || '';
-                    return [address];
-                }
-                return addressparser(address);
-            })
-        );
-    }
-
-    /**
-     * Normalizes a header key, uses Camel-Case form, except for uppercase MIME-
-     *
-     * @param {String} key Key to be normalized
-     * @return {String} key in Camel-Case form
-     */
-    _normalizeHeaderKey(key) {
-        key = (key || '')
-            .toString()
-            // no newlines in keys
-            .replace(/\r?\n|\r/g, ' ')
-            .trim()
-            .toLowerCase()
-            // use uppercase words, except MIME
-            .replace(/^X-SMTPAPI$|^(MIME|DKIM|ARC|BIMI)\b|^[a-z]|-(SPF|FBL|ID|MD5)$|-[a-z]/gi, c => c.toUpperCase())
-            // special case
-            .replace(/^Content-Features$/i, 'Content-features');
-
-        return key;
-    }
-
-    /**
-     * Checks if the content type is multipart and defines boundary if needed.
-     * Doesn't return anything, modifies object argument instead.
-     *
-     * @param {Object} structured Parsed header value for 'Content-Type' key
-     */
-    _handleContentType(structured) {
-        this.contentType = structured.value.trim().toLowerCase();
-
-        this.multipart = /^multipart\//i.test(this.contentType) ? this.contentType.substr(this.contentType.indexOf('/') + 1) : false;
-
-        if (this.multipart) {
-            this.boundary = structured.params.boundary = structured.params.boundary || this.boundary || this._generateBoundary();
-        } else {
-            this.boundary = false;
-        }
-    }
-
-    /**
-     * Generates a multipart boundary value
-     *
-     * @return {String} boundary value
-     */
-    _generateBoundary() {
-        return this.rootNode.boundaryPrefix + '-' + this.rootNode.baseBoundary + '-Part_' + this._nodeId;
-    }
-
-    /**
-     * Encodes a header value for use in the generated rfc2822 email.
-     *
-     * @param {String} key Header key
-     * @param {String} value Header value
-     */
-    _encodeHeaderValue(key, value) {
-        key = this._normalizeHeaderKey(key);
-
-        switch (key) {
-            // Structured headers
-            case 'From':
-            case 'Sender':
-            case 'To':
-            case 'Cc':
-            case 'Bcc':
-            case 'Reply-To':
-                return this._convertAddresses(this._parseAddresses(value));
-
-            // values enclosed in <>
-            case 'Message-ID':
-            case 'In-Reply-To':
-            case 'Content-Id':
-                value = (value || '').toString().replace(/\r?\n|\r/g, ' ');
-
-                if (value.charAt(0) !== '<') {
-                    value = '<' + value;
-                }
-
-                if (value.charAt(value.length - 1) !== '>') {
-                    value = value + '>';
-                }
-                return value;
-
-            // space separated list of values enclosed in <>
-            case 'References':
-                value = [].concat
-                    .apply(
-                        [],
-                        [].concat(value || '').map(elm => {
-                            // eslint-disable-line prefer-spread
-                            elm = (elm || '')
-                                .toString()
-                                .replace(/\r?\n|\r/g, ' ')
-                                .trim();
-                            return elm.replace(/<[^>]*>/g, str => str.replace(/\s/g, '')).split(/\s+/);
-                        })
-                    )
-                    .map(elm => {
-                        if (elm.charAt(0) !== '<') {
-                            elm = '<' + elm;
-                        }
-                        if (elm.charAt(elm.length - 1) !== '>') {
-                            elm = elm + '>';
-                        }
-                        return elm;
-                    });
-
-                return value.join(' ').trim();
-
-            case 'Date':
-                if (Object.prototype.toString.call(value) === '[object Date]') {
-                    return value.toUTCString().replace(/GMT/, '+0000');
-                }
-
-                value = (value || '').toString().replace(/\r?\n|\r/g, ' ');
-                return this._encodeWords(value);
-
-            case 'Content-Type':
-            case 'Content-Disposition':
-                // if it includes a filename then it is already encoded
-                return (value || '').toString().replace(/\r?\n|\r/g, ' ');
-
-            default:
-                value = (value || '').toString().replace(/\r?\n|\r/g, ' ');
-                // encodeWords only encodes if needed, otherwise the original string is returned
-                return this._encodeWords(value);
-        }
-    }
-
-    /**
-     * Rebuilds address object using punycode and other adjustments
-     *
-     * @param {Array} addresses An array of address objects
-     * @param {Array} [uniqueList] An array to be populated with addresses
-     * @return {String} address string
-     */
-    _convertAddresses(addresses, uniqueList) {
-        let values = [];
-
-        uniqueList = uniqueList || [];
-
-        [].concat(addresses || []).forEach(address => {
-            if (address.address) {
-                address.address = this._normalizeAddress(address.address);
-
-                if (!address.name) {
-                    values.push(address.address.indexOf(' ') >= 0 ? `<${address.address}>` : `${address.address}`);
-                } else if (address.name) {
-                    values.push(`${this._encodeAddressName(address.name)} <${address.address}>`);
-                }
-
-                if (address.address) {
-                    if (!uniqueList.filter(a => a.address === address.address).length) {
-                        uniqueList.push(address);
-                    }
-                }
-            } else if (address.group) {
-                let groupListAddresses = (address.group.length ? this._convertAddresses(address.group, uniqueList) : '').trim();
-                values.push(`${this._encodeAddressName(address.name)}:${groupListAddresses};`);
-            }
-        });
-
-        return values.join(', ');
-    }
-
-    /**
-     * Normalizes an email address
-     *
-     * @param {Array} address An array of address objects
-     * @return {String} address string
-     */
-    _normalizeAddress(address) {
-        address = (address || '')
-            .toString()
-            .replace(/[\x00-\x1F<>]+/g, ' ') // remove unallowed characters
-            .trim();
-
-        let lastAt = address.lastIndexOf('@');
-        if (lastAt < 0) {
-            // Bare username
-            return address;
-        }
-
-        let user = address.substr(0, lastAt);
-        let domain = address.substr(lastAt + 1);
-
-        // Usernames are not touched and are kept as is even if these include unicode
-        // Domains are punycoded by default
-        // 'jõgeva.ee' will be converted to 'xn--jgeva-dua.ee'
-        // non-unicode domains are left as is
-
-        let encodedDomain;
-
-        try {
-            encodedDomain = punycode.toASCII(domain.toLowerCase());
-        } catch (err) {
-            // keep as is?
-        }
-
-        if (user.indexOf(' ') >= 0) {
-            if (user.charAt(0) !== '"') {
-                user = '"' + user;
-            }
-            if (user.substr(-1) !== '"') {
-                user = user + '"';
-            }
-        }
-
-        return `${user}@${encodedDomain}`;
-    }
-
-    /**
-     * If needed, mime encodes the name part
-     *
-     * @param {String} name Name part of an address
-     * @returns {String} Mime word encoded string if needed
-     */
-    _encodeAddressName(name) {
-        if (!/^[\w ]*$/.test(name)) {
-            if (/^[\x20-\x7e]*$/.test(name)) {
-                return '"' + name.replace(/([\\"])/g, '\\$1') + '"';
-            } else {
-                return mimeFuncs.encodeWord(name, this._getTextEncoding(name), 52);
-            }
-        }
-        return name;
-    }
-
-    /**
-     * If needed, mime encodes the name part
-     *
-     * @param {String} name Name part of an address
-     * @returns {String} Mime word encoded string if needed
-     */
-    _encodeWords(value) {
-        // set encodeAll parameter to true even though it is against the recommendation of RFC2047,
-        // by default only words that include non-ascii should be converted into encoded words
-        // but some clients (eg. Zimbra) do not handle it properly and remove surrounding whitespace
-        return mimeFuncs.encodeWords(value, this._getTextEncoding(value), 52, true);
-    }
-
-    /**
-     * Detects best mime encoding for a text value
-     *
-     * @param {String} value Value to check for
-     * @return {String} either 'Q' or 'B'
-     */
-    _getTextEncoding(value) {
-        value = (value || '').toString();
-
-        let encoding = this.textEncoding;
-        let latinLen;
-        let nonLatinLen;
-
-        if (!encoding) {
-            // count latin alphabet symbols and 8-bit range symbols + control symbols
-            // if there are more latin characters, then use quoted-printable
-            // encoding, otherwise use base64
-            nonLatinLen = (value.match(/[\x00-\x08\x0B\x0C\x0E-\x1F\u0080-\uFFFF]/g) || []).length; // eslint-disable-line no-control-regex
-            latinLen = (value.match(/[a-z]/gi) || []).length;
-            // if there are more latin symbols than binary/unicode, then prefer Q, otherwise B
-            encoding = nonLatinLen < latinLen ? 'Q' : 'B';
-        }
-        return encoding;
-    }
-
-    /**
-     * Generates a message id
-     *
-     * @return {String} Random Message-ID value
-     */
-    _generateMessageId() {
-        return (
-            '<' +
-            [2, 2, 2, 6].reduce(
-                // crux to generate UUID-like random strings
-                (prev, len) => prev + '-' + crypto.randomBytes(len).toString('hex'),
-                crypto.randomBytes(4).toString('hex')
-            ) +
-            '@' +
-            // try to use the domain of the FROM address or fallback to server hostname
-            (this.getEnvelope().from || this.hostname || 'localhost').split('@').pop() +
-            '>'
-        );
-    }
-}
-
-module.exports = MimeNode;
Index: de_modules/nodemailer/lib/mime-node/last-newline.js
===================================================================
--- node_modules/nodemailer/lib/mime-node/last-newline.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,33 +1,0 @@
-'use strict';
-
-const Transform = require('stream').Transform;
-
-class LastNewline extends Transform {
-    constructor() {
-        super();
-        this.lastByte = false;
-    }
-
-    _transform(chunk, encoding, done) {
-        if (chunk.length) {
-            this.lastByte = chunk[chunk.length - 1];
-        }
-
-        this.push(chunk);
-        done();
-    }
-
-    _flush(done) {
-        if (this.lastByte === 0x0a) {
-            return done();
-        }
-        if (this.lastByte === 0x0d) {
-            this.push(Buffer.from('\n'));
-            return done();
-        }
-        this.push(Buffer.from('\r\n'));
-        return done();
-    }
-}
-
-module.exports = LastNewline;
Index: de_modules/nodemailer/lib/mime-node/le-unix.js
===================================================================
--- node_modules/nodemailer/lib/mime-node/le-unix.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-'use strict';
-
-const stream = require('stream');
-const Transform = stream.Transform;
-
-/**
- * Ensures that only <LF> is used for linebreaks
- *
- * @param {Object} options Stream options
- */
-class LeWindows extends Transform {
-    constructor(options) {
-        super(options);
-        // init Transform
-        this.options = options || {};
-    }
-
-    /**
-     * Escapes dots
-     */
-    _transform(chunk, encoding, done) {
-        let buf;
-        let lastPos = 0;
-
-        for (let i = 0, len = chunk.length; i < len; i++) {
-            if (chunk[i] === 0x0d) {
-                // \n
-                buf = chunk.slice(lastPos, i);
-                lastPos = i + 1;
-                this.push(buf);
-            }
-        }
-        if (lastPos && lastPos < chunk.length) {
-            buf = chunk.slice(lastPos);
-            this.push(buf);
-        } else if (!lastPos) {
-            this.push(chunk);
-        }
-        done();
-    }
-}
-
-module.exports = LeWindows;
Index: de_modules/nodemailer/lib/mime-node/le-windows.js
===================================================================
--- node_modules/nodemailer/lib/mime-node/le-windows.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,52 +1,0 @@
-'use strict';
-
-const stream = require('stream');
-const Transform = stream.Transform;
-
-/**
- * Ensures that only <CR><LF> sequences are used for linebreaks
- *
- * @param {Object} options Stream options
- */
-class LeWindows extends Transform {
-    constructor(options) {
-        super(options);
-        // init Transform
-        this.options = options || {};
-        this.lastByte = false;
-    }
-
-    /**
-     * Escapes dots
-     */
-    _transform(chunk, encoding, done) {
-        let buf;
-        let lastPos = 0;
-
-        for (let i = 0, len = chunk.length; i < len; i++) {
-            if (chunk[i] === 0x0a) {
-                // \n
-                if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {
-                    if (i > lastPos) {
-                        buf = chunk.slice(lastPos, i);
-                        this.push(buf);
-                    }
-                    this.push(Buffer.from('\r\n'));
-                    lastPos = i + 1;
-                }
-            }
-        }
-
-        if (lastPos && lastPos < chunk.length) {
-            buf = chunk.slice(lastPos);
-            this.push(buf);
-        } else if (!lastPos) {
-            this.push(chunk);
-        }
-
-        this.lastByte = chunk[chunk.length - 1];
-        done();
-    }
-}
-
-module.exports = LeWindows;
Index: de_modules/nodemailer/lib/nodemailer.js
===================================================================
--- node_modules/nodemailer/lib/nodemailer.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,150 +1,0 @@
-'use strict';
-
-const Mailer = require('./mailer');
-const shared = require('./shared');
-const SMTPPool = require('./smtp-pool');
-const SMTPTransport = require('./smtp-transport');
-const SendmailTransport = require('./sendmail-transport');
-const StreamTransport = require('./stream-transport');
-const JSONTransport = require('./json-transport');
-const SESTransport = require('./ses-transport');
-const nmfetch = require('./fetch');
-const packageData = require('../package.json');
-
-const ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\/+$/, '');
-const ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\/+$/, '');
-const ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\s*/g, '') || null;
-const ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());
-
-let testAccount = false;
-
-module.exports.createTransport = function (transporter, defaults) {
-    let urlConfig;
-    let options;
-    let mailer;
-
-    if (
-        // provided transporter is a configuration object, not transporter plugin
-        (typeof transporter === 'object' && typeof transporter.send !== 'function') ||
-        // provided transporter looks like a connection url
-        (typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))
-    ) {
-        if ((urlConfig = typeof transporter === 'string' ? transporter : transporter.url)) {
-            // parse a configuration URL into configuration options
-            options = shared.parseConnectionUrl(urlConfig);
-        } else {
-            options = transporter;
-        }
-
-        if (options.pool) {
-            transporter = new SMTPPool(options);
-        } else if (options.sendmail) {
-            transporter = new SendmailTransport(options);
-        } else if (options.streamTransport) {
-            transporter = new StreamTransport(options);
-        } else if (options.jsonTransport) {
-            transporter = new JSONTransport(options);
-        } else if (options.SES) {
-            transporter = new SESTransport(options);
-        } else {
-            transporter = new SMTPTransport(options);
-        }
-    }
-
-    mailer = new Mailer(transporter, options, defaults);
-
-    return mailer;
-};
-
-module.exports.createTestAccount = function (apiUrl, callback) {
-    let promise;
-
-    if (!callback && typeof apiUrl === 'function') {
-        callback = apiUrl;
-        apiUrl = false;
-    }
-
-    if (!callback) {
-        promise = new Promise((resolve, reject) => {
-            callback = shared.callbackPromise(resolve, reject);
-        });
-    }
-
-    if (ETHEREAL_CACHE && testAccount) {
-        setImmediate(() => callback(null, testAccount));
-        return promise;
-    }
-
-    apiUrl = apiUrl || ETHEREAL_API;
-
-    let chunks = [];
-    let chunklen = 0;
-
-    let requestHeaders = {};
-    let requestBody = {
-        requestor: packageData.name,
-        version: packageData.version
-    };
-
-    if (ETHEREAL_API_KEY) {
-        requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;
-    }
-
-    let req = nmfetch(apiUrl + '/user', {
-        contentType: 'application/json',
-        method: 'POST',
-        headers: requestHeaders,
-        body: Buffer.from(JSON.stringify(requestBody))
-    });
-
-    req.on('readable', () => {
-        let chunk;
-        while ((chunk = req.read()) !== null) {
-            chunks.push(chunk);
-            chunklen += chunk.length;
-        }
-    });
-
-    req.once('error', err => callback(err));
-
-    req.once('end', () => {
-        let res = Buffer.concat(chunks, chunklen);
-        let data;
-        let err;
-        try {
-            data = JSON.parse(res.toString());
-        } catch (E) {
-            err = E;
-        }
-        if (err) {
-            return callback(err);
-        }
-        if (data.status !== 'success' || data.error) {
-            return callback(new Error(data.error || 'Request failed'));
-        }
-        delete data.status;
-        testAccount = data;
-        callback(null, testAccount);
-    });
-
-    return promise;
-};
-
-module.exports.getTestMessageUrl = function (info) {
-    if (!info || !info.response) {
-        return false;
-    }
-
-    let infoProps = new Map();
-    info.response.replace(/\[([^\]]+)\]$/, (m, props) => {
-        props.replace(/\b([A-Z0-9]+)=([^\s]+)/g, (m, key, value) => {
-            infoProps.set(key, value);
-        });
-    });
-
-    if (infoProps.has('STATUS') && infoProps.has('MSGID')) {
-        return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');
-    }
-
-    return false;
-};
Index: de_modules/nodemailer/lib/punycode/index.js
===================================================================
--- node_modules/nodemailer/lib/punycode/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,460 +1,0 @@
-/*
-
-Copied from https://github.com/mathiasbynens/punycode.js/blob/ef3505c8abb5143a00d53ce59077c9f7f4b2ac47/punycode.js
-
-Copyright Mathias Bynens <https://mathiasbynens.be/>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-*/
-/* eslint callback-return: 0, no-bitwise: 0, eqeqeq: 0, prefer-arrow-callback: 0, object-shorthand: 0 */
-
-'use strict';
-
-/** Highest positive signed 32-bit float value */
-const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1
-
-/** Bootstring parameters */
-const base = 36;
-const tMin = 1;
-const tMax = 26;
-const skew = 38;
-const damp = 700;
-const initialBias = 72;
-const initialN = 128; // 0x80
-const delimiter = '-'; // '\x2D'
-
-/** Regular expressions */
-const regexPunycode = /^xn--/;
-const regexNonASCII = /[^\0-\x7F]/; // Note: U+007F DEL is excluded too.
-const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators
-
-/** Error messages */
-const errors = {
-    overflow: 'Overflow: input needs wider integers to process',
-    'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
-    'invalid-input': 'Invalid input'
-};
-
-/** Convenience shortcuts */
-const baseMinusTMin = base - tMin;
-const floor = Math.floor;
-const stringFromCharCode = String.fromCharCode;
-
-/*--------------------------------------------------------------------------*/
-
-/**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
-function error(type) {
-    throw new RangeError(errors[type]);
-}
-
-/**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
-function map(array, callback) {
-    const result = [];
-    let length = array.length;
-    while (length--) {
-        result[length] = callback(array[length]);
-    }
-    return result;
-}
-
-/**
- * A simple `Array#map`-like wrapper to work with domain name strings or email
- * addresses.
- * @private
- * @param {String} domain The domain name or email address.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {String} A new string of characters returned by the callback
- * function.
- */
-function mapDomain(domain, callback) {
-    const parts = domain.split('@');
-    let result = '';
-    if (parts.length > 1) {
-        // In email addresses, only the domain name should be punycoded. Leave
-        // the local part (i.e. everything up to `@`) intact.
-        result = parts[0] + '@';
-        domain = parts[1];
-    }
-    // Avoid `split(regex)` for IE8 compatibility. See #17.
-    domain = domain.replace(regexSeparators, '\x2E');
-    const labels = domain.split('.');
-    const encoded = map(labels, callback).join('.');
-    return result + encoded;
-}
-
-/**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
-function ucs2decode(string) {
-    const output = [];
-    let counter = 0;
-    const length = string.length;
-    while (counter < length) {
-        const value = string.charCodeAt(counter++);
-        if (value >= 0xd800 && value <= 0xdbff && counter < length) {
-            // It's a high surrogate, and there is a next character.
-            const extra = string.charCodeAt(counter++);
-            if ((extra & 0xfc00) == 0xdc00) {
-                // Low surrogate.
-                output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);
-            } else {
-                // It's an unmatched surrogate; only append this code unit, in case the
-                // next code unit is the high surrogate of a surrogate pair.
-                output.push(value);
-                counter--;
-            }
-        } else {
-            output.push(value);
-        }
-    }
-    return output;
-}
-
-/**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
-const ucs2encode = codePoints => String.fromCodePoint(...codePoints);
-
-/**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
-const basicToDigit = function (codePoint) {
-    if (codePoint >= 0x30 && codePoint < 0x3a) {
-        return 26 + (codePoint - 0x30);
-    }
-    if (codePoint >= 0x41 && codePoint < 0x5b) {
-        return codePoint - 0x41;
-    }
-    if (codePoint >= 0x61 && codePoint < 0x7b) {
-        return codePoint - 0x61;
-    }
-    return base;
-};
-
-/**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
-const digitToBasic = function (digit, flag) {
-    //  0..25 map to ASCII a..z or A..Z
-    // 26..35 map to ASCII 0..9
-    return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
-};
-
-/**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
-const adapt = function (delta, numPoints, firstTime) {
-    let k = 0;
-    delta = firstTime ? floor(delta / damp) : delta >> 1;
-    delta += floor(delta / numPoints);
-    for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {
-        delta = floor(delta / baseMinusTMin);
-    }
-    return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew));
-};
-
-/**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
-const decode = function (input) {
-    // Don't use UCS-2.
-    const output = [];
-    const inputLength = input.length;
-    let i = 0;
-    let n = initialN;
-    let bias = initialBias;
-
-    // Handle the basic code points: let `basic` be the number of input code
-    // points before the last delimiter, or `0` if there is none, then copy
-    // the first basic code points to the output.
-
-    let basic = input.lastIndexOf(delimiter);
-    if (basic < 0) {
-        basic = 0;
-    }
-
-    for (let j = 0; j < basic; ++j) {
-        // if it's not a basic code point
-        if (input.charCodeAt(j) >= 0x80) {
-            error('not-basic');
-        }
-        output.push(input.charCodeAt(j));
-    }
-
-    // Main decoding loop: start just after the last delimiter if any basic code
-    // points were copied; start at the beginning otherwise.
-
-    for (let index = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {
-        // `index` is the index of the next character to be consumed.
-        // Decode a generalized variable-length integer into `delta`,
-        // which gets added to `i`. The overflow checking is easier
-        // if we increase `i` as we go, then subtract off its starting
-        // value at the end to obtain `delta`.
-        const oldi = i;
-        for (let w = 1, k = base /* no condition */; ; k += base) {
-            if (index >= inputLength) {
-                error('invalid-input');
-            }
-
-            const digit = basicToDigit(input.charCodeAt(index++));
-
-            if (digit >= base) {
-                error('invalid-input');
-            }
-            if (digit > floor((maxInt - i) / w)) {
-                error('overflow');
-            }
-
-            i += digit * w;
-            const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
-
-            if (digit < t) {
-                break;
-            }
-
-            const baseMinusT = base - t;
-            if (w > floor(maxInt / baseMinusT)) {
-                error('overflow');
-            }
-
-            w *= baseMinusT;
-        }
-
-        const out = output.length + 1;
-        bias = adapt(i - oldi, out, oldi == 0);
-
-        // `i` was supposed to wrap around from `out` to `0`,
-        // incrementing `n` each time, so we'll fix that now:
-        if (floor(i / out) > maxInt - n) {
-            error('overflow');
-        }
-
-        n += floor(i / out);
-        i %= out;
-
-        // Insert `n` at position `i` of the output.
-        output.splice(i++, 0, n);
-    }
-
-    return String.fromCodePoint(...output);
-};
-
-/**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
-const encode = function (input) {
-    const output = [];
-
-    // Convert the input in UCS-2 to an array of Unicode code points.
-    input = ucs2decode(input);
-
-    // Cache the length.
-    const inputLength = input.length;
-
-    // Initialize the state.
-    let n = initialN;
-    let delta = 0;
-    let bias = initialBias;
-
-    // Handle the basic code points.
-    for (const currentValue of input) {
-        if (currentValue < 0x80) {
-            output.push(stringFromCharCode(currentValue));
-        }
-    }
-
-    const basicLength = output.length;
-    let handledCPCount = basicLength;
-
-    // `handledCPCount` is the number of code points that have been handled;
-    // `basicLength` is the number of basic code points.
-
-    // Finish the basic string with a delimiter unless it's empty.
-    if (basicLength) {
-        output.push(delimiter);
-    }
-
-    // Main encoding loop:
-    while (handledCPCount < inputLength) {
-        // All non-basic code points < n have been handled already. Find the next
-        // larger one:
-        let m = maxInt;
-        for (const currentValue of input) {
-            if (currentValue >= n && currentValue < m) {
-                m = currentValue;
-            }
-        }
-
-        // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
-        // but guard against overflow.
-        const handledCPCountPlusOne = handledCPCount + 1;
-        if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
-            error('overflow');
-        }
-
-        delta += (m - n) * handledCPCountPlusOne;
-        n = m;
-
-        for (const currentValue of input) {
-            if (currentValue < n && ++delta > maxInt) {
-                error('overflow');
-            }
-            if (currentValue === n) {
-                // Represent delta as a generalized variable-length integer.
-                let q = delta;
-                for (let k = base /* no condition */; ; k += base) {
-                    const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
-                    if (q < t) {
-                        break;
-                    }
-                    const qMinusT = q - t;
-                    const baseMinusT = base - t;
-                    output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)));
-                    q = floor(qMinusT / baseMinusT);
-                }
-
-                output.push(stringFromCharCode(digitToBasic(q, 0)));
-                bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);
-                delta = 0;
-                ++handledCPCount;
-            }
-        }
-
-        ++delta;
-        ++n;
-    }
-    return output.join('');
-};
-
-/**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
- * it doesn't matter if you call it on a string that has already been
- * converted to Unicode.
- * @memberOf punycode
- * @param {String} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
-const toUnicode = function (input) {
-    return mapDomain(input, function (string) {
-        return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
-    });
-};
-
-/**
- * Converts a Unicode string representing a domain name or an email address to
- * Punycode. Only the non-ASCII parts of the domain name will be converted,
- * i.e. it doesn't matter if you call it with a domain that's already in
- * ASCII.
- * @memberOf punycode
- * @param {String} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {String} The Punycode representation of the given domain name or
- * email address.
- */
-const toASCII = function (input) {
-    return mapDomain(input, function (string) {
-        return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
-    });
-};
-
-/*--------------------------------------------------------------------------*/
-
-/** Define the public API */
-const punycode = {
-    /**
-     * A string representing the current Punycode.js version number.
-     * @memberOf punycode
-     * @type String
-     */
-    version: '2.3.1',
-    /**
-     * An object of methods to convert from JavaScript's internal character
-     * representation (UCS-2) to Unicode code points, and back.
-     * @see <https://mathiasbynens.be/notes/javascript-encoding>
-     * @memberOf punycode
-     * @type Object
-     */
-    ucs2: {
-        decode: ucs2decode,
-        encode: ucs2encode
-    },
-    decode: decode,
-    encode: encode,
-    toASCII: toASCII,
-    toUnicode: toUnicode
-};
-
-module.exports = punycode;
Index: de_modules/nodemailer/lib/qp/index.js
===================================================================
--- node_modules/nodemailer/lib/qp/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,219 +1,0 @@
-'use strict';
-
-const Transform = require('stream').Transform;
-
-/**
- * Encodes a Buffer into a Quoted-Printable encoded string
- *
- * @param {Buffer} buffer Buffer to convert
- * @returns {String} Quoted-Printable encoded string
- */
-function encode(buffer) {
-    if (typeof buffer === 'string') {
-        buffer = Buffer.from(buffer, 'utf-8');
-    }
-
-    // usable characters that do not need encoding
-    let ranges = [
-        // https://tools.ietf.org/html/rfc2045#section-6.7
-        [0x09], // <TAB>
-        [0x0a], // <LF>
-        [0x0d], // <CR>
-        [0x20, 0x3c], // <SP>!"#$%&'()*+,-./0123456789:;
-        [0x3e, 0x7e] // >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
-    ];
-    let result = '';
-    let ord;
-
-    for (let i = 0, len = buffer.length; i < len; i++) {
-        ord = buffer[i];
-        // if the char is in allowed range, then keep as is, unless it is a WS in the end of a line
-        if (checkRanges(ord, ranges) && !((ord === 0x20 || ord === 0x09) && (i === len - 1 || buffer[i + 1] === 0x0a || buffer[i + 1] === 0x0d))) {
-            result += String.fromCharCode(ord);
-            continue;
-        }
-        result += '=' + (ord < 0x10 ? '0' : '') + ord.toString(16).toUpperCase();
-    }
-
-    return result;
-}
-
-/**
- * Adds soft line breaks to a Quoted-Printable string
- *
- * @param {String} str Quoted-Printable encoded string that might need line wrapping
- * @param {Number} [lineLength=76] Maximum allowed length for a line
- * @returns {String} Soft-wrapped Quoted-Printable encoded string
- */
-function wrap(str, lineLength) {
-    str = (str || '').toString();
-    lineLength = lineLength || 76;
-
-    if (str.length <= lineLength) {
-        return str;
-    }
-
-    let pos = 0;
-    let len = str.length;
-    let match, code, line;
-    let lineMargin = Math.floor(lineLength / 3);
-    let result = '';
-
-    // insert soft linebreaks where needed
-    while (pos < len) {
-        line = str.substr(pos, lineLength);
-        if ((match = line.match(/\r\n/))) {
-            line = line.substr(0, match.index + match[0].length);
-            result += line;
-            pos += line.length;
-            continue;
-        }
-
-        if (line.substr(-1) === '\n') {
-            // nothing to change here
-            result += line;
-            pos += line.length;
-            continue;
-        } else if ((match = line.substr(-lineMargin).match(/\n.*?$/))) {
-            // truncate to nearest line break
-            line = line.substr(0, line.length - (match[0].length - 1));
-            result += line;
-            pos += line.length;
-            continue;
-        } else if (line.length > lineLength - lineMargin && (match = line.substr(-lineMargin).match(/[ \t.,!?][^ \t.,!?]*$/))) {
-            // truncate to nearest space
-            line = line.substr(0, line.length - (match[0].length - 1));
-        } else if (line.match(/[=][\da-f]{0,2}$/i)) {
-            // push incomplete encoding sequences to the next line
-            if ((match = line.match(/[=][\da-f]{0,1}$/i))) {
-                line = line.substr(0, line.length - match[0].length);
-            }
-
-            // ensure that utf-8 sequences are not split
-            while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && (match = line.match(/[=][\da-f]{2}$/gi))) {
-                code = parseInt(match[0].substr(1, 2), 16);
-                if (code < 128) {
-                    break;
-                }
-
-                line = line.substr(0, line.length - 3);
-
-                if (code >= 0xc0) {
-                    break;
-                }
-            }
-        }
-
-        if (pos + line.length < len && line.substr(-1) !== '\n') {
-            if (line.length === lineLength && line.match(/[=][\da-f]{2}$/i)) {
-                line = line.substr(0, line.length - 3);
-            } else if (line.length === lineLength) {
-                line = line.substr(0, line.length - 1);
-            }
-            pos += line.length;
-            line += '=\r\n';
-        } else {
-            pos += line.length;
-        }
-
-        result += line;
-    }
-
-    return result;
-}
-
-/**
- * Helper function to check if a number is inside provided ranges
- *
- * @param {Number} nr Number to check for
- * @param {Array} ranges An Array of allowed values
- * @returns {Boolean} True if the value was found inside allowed ranges, false otherwise
- */
-function checkRanges(nr, ranges) {
-    for (let i = ranges.length - 1; i >= 0; i--) {
-        if (!ranges[i].length) {
-            continue;
-        }
-        if (ranges[i].length === 1 && nr === ranges[i][0]) {
-            return true;
-        }
-        if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) {
-            return true;
-        }
-    }
-    return false;
-}
-
-/**
- * Creates a transform stream for encoding data to Quoted-Printable encoding
- *
- * @constructor
- * @param {Object} options Stream options
- * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping
- */
-class Encoder extends Transform {
-    constructor(options) {
-        super();
-
-        // init Transform
-        this.options = options || {};
-
-        if (this.options.lineLength !== false) {
-            this.options.lineLength = this.options.lineLength || 76;
-        }
-
-        this._curLine = '';
-
-        this.inputBytes = 0;
-        this.outputBytes = 0;
-    }
-
-    _transform(chunk, encoding, done) {
-        let qp;
-
-        if (encoding !== 'buffer') {
-            chunk = Buffer.from(chunk, encoding);
-        }
-
-        if (!chunk || !chunk.length) {
-            return done();
-        }
-
-        this.inputBytes += chunk.length;
-
-        if (this.options.lineLength) {
-            qp = this._curLine + encode(chunk);
-            qp = wrap(qp, this.options.lineLength);
-            qp = qp.replace(/(^|\n)([^\n]*)$/, (match, lineBreak, lastLine) => {
-                this._curLine = lastLine;
-                return lineBreak;
-            });
-
-            if (qp) {
-                this.outputBytes += qp.length;
-                this.push(qp);
-            }
-        } else {
-            qp = encode(chunk);
-            this.outputBytes += qp.length;
-            this.push(qp, 'ascii');
-        }
-
-        done();
-    }
-
-    _flush(done) {
-        if (this._curLine) {
-            this.outputBytes += this._curLine.length;
-            this.push(this._curLine, 'ascii');
-        }
-        done();
-    }
-}
-
-// expose to the world
-module.exports = {
-    encode,
-    wrap,
-    Encoder
-};
Index: de_modules/nodemailer/lib/sendmail-transport/index.js
===================================================================
--- node_modules/nodemailer/lib/sendmail-transport/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,210 +1,0 @@
-'use strict';
-
-const spawn = require('child_process').spawn;
-const packageData = require('../../package.json');
-const shared = require('../shared');
-
-/**
- * Generates a Transport object for Sendmail
- *
- * Possible options can be the following:
- *
- *  * **path** optional path to sendmail binary
- *  * **newline** either 'windows' or 'unix'
- *  * **args** an array of arguments for the sendmail binary
- *
- * @constructor
- * @param {Object} optional config parameter for Sendmail
- */
-class SendmailTransport {
-    constructor(options) {
-        options = options || {};
-
-        // use a reference to spawn for mocking purposes
-        this._spawn = spawn;
-
-        this.options = options || {};
-
-        this.name = 'Sendmail';
-        this.version = packageData.version;
-
-        this.path = 'sendmail';
-        this.args = false;
-        this.winbreak = false;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'sendmail'
-        });
-
-        if (options) {
-            if (typeof options === 'string') {
-                this.path = options;
-            } else if (typeof options === 'object') {
-                if (options.path) {
-                    this.path = options.path;
-                }
-                if (Array.isArray(options.args)) {
-                    this.args = options.args;
-                }
-                this.winbreak = ['win', 'windows', 'dos', '\r\n'].includes((options.newline || '').toString().toLowerCase());
-            }
-        }
-    }
-
-    /**
-     * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
-     *
-     * @param {Object} emailMessage MailComposer object
-     * @param {Function} callback Callback function to run when the sending is completed
-     */
-    send(mail, done) {
-        // Sendmail strips this header line by itself
-        mail.message.keepBcc = true;
-
-        let envelope = mail.data.envelope || mail.message.getEnvelope();
-        let messageId = mail.message.messageId();
-        let args;
-        let sendmail;
-        let returned;
-
-        const hasInvalidAddresses = []
-            .concat(envelope.from || [])
-            .concat(envelope.to || [])
-            .some(addr => /^-/.test(addr));
-        if (hasInvalidAddresses) {
-            return done(new Error('Can not send mail. Invalid envelope addresses.'));
-        }
-
-        if (this.args) {
-            // force -i to keep single dots
-            args = ['-i'].concat(this.args).concat(envelope.to);
-        } else {
-            args = ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);
-        }
-
-        let callback = err => {
-            if (returned) {
-                // ignore any additional responses, already done
-                return;
-            }
-            returned = true;
-            if (typeof done === 'function') {
-                if (err) {
-                    return done(err);
-                } else {
-                    return done(null, {
-                        envelope: mail.data.envelope || mail.message.getEnvelope(),
-                        messageId,
-                        response: 'Messages queued for delivery'
-                    });
-                }
-            }
-        };
-
-        try {
-            sendmail = this._spawn(this.path, args);
-        } catch (E) {
-            this.logger.error(
-                {
-                    err: E,
-                    tnx: 'spawn',
-                    messageId
-                },
-                'Error occurred while spawning sendmail. %s',
-                E.message
-            );
-            return callback(E);
-        }
-
-        if (sendmail) {
-            sendmail.on('error', err => {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'spawn',
-                        messageId
-                    },
-                    'Error occurred when sending message %s. %s',
-                    messageId,
-                    err.message
-                );
-                callback(err);
-            });
-
-            sendmail.once('exit', code => {
-                if (!code) {
-                    return callback();
-                }
-                let err;
-                if (code === 127) {
-                    err = new Error('Sendmail command not found, process exited with code ' + code);
-                } else {
-                    err = new Error('Sendmail exited with code ' + code);
-                }
-
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'stdin',
-                        messageId
-                    },
-                    'Error sending message %s to sendmail. %s',
-                    messageId,
-                    err.message
-                );
-                callback(err);
-            });
-            sendmail.once('close', callback);
-
-            sendmail.stdin.on('error', err => {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'stdin',
-                        messageId
-                    },
-                    'Error occurred when piping message %s to sendmail. %s',
-                    messageId,
-                    err.message
-                );
-                callback(err);
-            });
-
-            let recipients = [].concat(envelope.to || []);
-            if (recipients.length > 3) {
-                recipients.push('...and ' + recipients.splice(2).length + ' more');
-            }
-            this.logger.info(
-                {
-                    tnx: 'send',
-                    messageId
-                },
-                'Sending message %s to <%s>',
-                messageId,
-                recipients.join(', ')
-            );
-
-            let sourceStream = mail.message.createReadStream();
-            sourceStream.once('error', err => {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'stdin',
-                        messageId
-                    },
-                    'Error occurred when generating message %s. %s',
-                    messageId,
-                    err.message
-                );
-                sendmail.kill('SIGINT'); // do not deliver the message
-                callback(err);
-            });
-
-            sourceStream.pipe(sendmail.stdin);
-        } else {
-            return callback(new Error('sendmail was not found'));
-        }
-    }
-}
-
-module.exports = SendmailTransport;
Index: de_modules/nodemailer/lib/ses-transport/index.js
===================================================================
--- node_modules/nodemailer/lib/ses-transport/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,349 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events');
-const packageData = require('../../package.json');
-const shared = require('../shared');
-const LeWindows = require('../mime-node/le-windows');
-
-/**
- * Generates a Transport object for AWS SES
- *
- * Possible options can be the following:
- *
- *  * **sendingRate** optional Number specifying how many messages per second should be delivered to SES
- *  * **maxConnections** optional Number specifying max number of parallel connections to SES
- *
- * @constructor
- * @param {Object} optional config parameter
- */
-class SESTransport extends EventEmitter {
-    constructor(options) {
-        super();
-        options = options || {};
-
-        this.options = options || {};
-        this.ses = this.options.SES;
-
-        this.name = 'SESTransport';
-        this.version = packageData.version;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'ses-transport'
-        });
-
-        // parallel sending connections
-        this.maxConnections = Number(this.options.maxConnections) || Infinity;
-        this.connections = 0;
-
-        // max messages per second
-        this.sendingRate = Number(this.options.sendingRate) || Infinity;
-        this.sendingRateTTL = null;
-        this.rateInterval = 1000; // milliseconds
-        this.rateMessages = [];
-
-        this.pending = [];
-
-        this.idling = true;
-
-        setImmediate(() => {
-            if (this.idling) {
-                this.emit('idle');
-            }
-        });
-    }
-
-    /**
-     * Schedules a sending of a message
-     *
-     * @param {Object} emailMessage MailComposer object
-     * @param {Function} callback Callback function to run when the sending is completed
-     */
-    send(mail, callback) {
-        if (this.connections >= this.maxConnections) {
-            this.idling = false;
-            return this.pending.push({
-                mail,
-                callback
-            });
-        }
-
-        if (!this._checkSendingRate()) {
-            this.idling = false;
-            return this.pending.push({
-                mail,
-                callback
-            });
-        }
-
-        this._send(mail, (...args) => {
-            setImmediate(() => callback(...args));
-            this._sent();
-        });
-    }
-
-    _checkRatedQueue() {
-        if (this.connections >= this.maxConnections || !this._checkSendingRate()) {
-            return;
-        }
-
-        if (!this.pending.length) {
-            if (!this.idling) {
-                this.idling = true;
-                this.emit('idle');
-            }
-            return;
-        }
-
-        let next = this.pending.shift();
-        this._send(next.mail, (...args) => {
-            setImmediate(() => next.callback(...args));
-            this._sent();
-        });
-    }
-
-    _checkSendingRate() {
-        clearTimeout(this.sendingRateTTL);
-
-        let now = Date.now();
-        let oldest = false;
-        // delete older messages
-        for (let i = this.rateMessages.length - 1; i >= 0; i--) {
-            if (this.rateMessages[i].ts >= now - this.rateInterval && (!oldest || this.rateMessages[i].ts < oldest)) {
-                oldest = this.rateMessages[i].ts;
-            }
-
-            if (this.rateMessages[i].ts < now - this.rateInterval && !this.rateMessages[i].pending) {
-                this.rateMessages.splice(i, 1);
-            }
-        }
-
-        if (this.rateMessages.length < this.sendingRate) {
-            return true;
-        }
-
-        let delay = Math.max(oldest + 1001, now + 20);
-        this.sendingRateTTL = setTimeout(() => this._checkRatedQueue(), now - delay);
-
-        try {
-            this.sendingRateTTL.unref();
-        } catch (E) {
-            // Ignore. Happens on envs with non-node timer implementation
-        }
-
-        return false;
-    }
-
-    _sent() {
-        this.connections--;
-        this._checkRatedQueue();
-    }
-
-    /**
-     * Returns true if there are free slots in the queue
-     */
-    isIdle() {
-        return this.idling;
-    }
-
-    /**
-     * Compiles a mailcomposer message and forwards it to SES
-     *
-     * @param {Object} emailMessage MailComposer object
-     * @param {Function} callback Callback function to run when the sending is completed
-     */
-    _send(mail, callback) {
-        let statObject = {
-            ts: Date.now(),
-            pending: true
-        };
-        this.connections++;
-        this.rateMessages.push(statObject);
-
-        let envelope = mail.data.envelope || mail.message.getEnvelope();
-        let messageId = mail.message.messageId();
-
-        let recipients = [].concat(envelope.to || []);
-        if (recipients.length > 3) {
-            recipients.push('...and ' + recipients.splice(2).length + ' more');
-        }
-        this.logger.info(
-            {
-                tnx: 'send',
-                messageId
-            },
-            'Sending message %s to <%s>',
-            messageId,
-            recipients.join(', ')
-        );
-
-        let getRawMessage = next => {
-            // do not use Message-ID and Date in DKIM signature
-            if (!mail.data._dkim) {
-                mail.data._dkim = {};
-            }
-            if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {
-                mail.data._dkim.skipFields += ':date:message-id';
-            } else {
-                mail.data._dkim.skipFields = 'date:message-id';
-            }
-
-            let sourceStream = mail.message.createReadStream();
-            let stream = sourceStream.pipe(new LeWindows());
-            let chunks = [];
-            let chunklen = 0;
-
-            stream.on('readable', () => {
-                let chunk;
-                while ((chunk = stream.read()) !== null) {
-                    chunks.push(chunk);
-                    chunklen += chunk.length;
-                }
-            });
-
-            sourceStream.once('error', err => stream.emit('error', err));
-
-            stream.once('error', err => {
-                next(err);
-            });
-
-            stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));
-        };
-
-        setImmediate(() =>
-            getRawMessage((err, raw) => {
-                if (err) {
-                    this.logger.error(
-                        {
-                            err,
-                            tnx: 'send',
-                            messageId
-                        },
-                        'Failed creating message for %s. %s',
-                        messageId,
-                        err.message
-                    );
-                    statObject.pending = false;
-                    return callback(err);
-                }
-
-                let sesMessage = {
-                    RawMessage: {
-                        // required
-                        Data: raw // required
-                    },
-                    Source: envelope.from,
-                    Destinations: envelope.to
-                };
-
-                Object.keys(mail.data.ses || {}).forEach(key => {
-                    sesMessage[key] = mail.data.ses[key];
-                });
-
-                let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};
-                let aws = this.ses.aws || {};
-
-                let getRegion = cb => {
-                    if (ses.config && typeof ses.config.region === 'function') {
-                        // promise
-                        return ses.config
-                            .region()
-                            .then(region => cb(null, region))
-                            .catch(err => cb(err));
-                    }
-                    return cb(null, (ses.config && ses.config.region) || 'us-east-1');
-                };
-
-                getRegion((err, region) => {
-                    if (err || !region) {
-                        region = 'us-east-1';
-                    }
-
-                    let sendPromise;
-                    if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {
-                        // v3 API
-                        sendPromise = ses.send(new aws.SendRawEmailCommand(sesMessage));
-                    } else {
-                        // v2 API
-                        sendPromise = ses.sendRawEmail(sesMessage).promise();
-                    }
-
-                    sendPromise
-                        .then(data => {
-                            if (region === 'us-east-1') {
-                                region = 'email';
-                            }
-
-                            statObject.pending = false;
-                            callback(null, {
-                                envelope: {
-                                    from: envelope.from,
-                                    to: envelope.to
-                                },
-                                messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',
-                                response: data.MessageId,
-                                raw
-                            });
-                        })
-                        .catch(err => {
-                            this.logger.error(
-                                {
-                                    err,
-                                    tnx: 'send'
-                                },
-                                'Send error for %s: %s',
-                                messageId,
-                                err.message
-                            );
-                            statObject.pending = false;
-                            callback(err);
-                        });
-                });
-            })
-        );
-    }
-
-    /**
-     * Verifies SES configuration
-     *
-     * @param {Function} callback Callback function
-     */
-    verify(callback) {
-        let promise;
-        let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};
-        let aws = this.ses.aws || {};
-
-        const sesMessage = {
-            RawMessage: {
-                // required
-                Data: 'From: invalid@invalid\r\nTo: invalid@invalid\r\n Subject: Invalid\r\n\r\nInvalid'
-            },
-            Source: 'invalid@invalid',
-            Destinations: ['invalid@invalid']
-        };
-
-        if (!callback) {
-            promise = new Promise((resolve, reject) => {
-                callback = shared.callbackPromise(resolve, reject);
-            });
-        }
-        const cb = err => {
-            if (err && (err.code || err.Code) !== 'InvalidParameterValue') {
-                return callback(err);
-            }
-            return callback(null, true);
-        };
-
-        if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {
-            // v3 API
-            sesMessage.RawMessage.Data = Buffer.from(sesMessage.RawMessage.Data);
-            ses.send(new aws.SendRawEmailCommand(sesMessage), cb);
-        } else {
-            // v2 API
-            ses.sendRawEmail(sesMessage, cb);
-        }
-
-        return promise;
-    }
-}
-
-module.exports = SESTransport;
Index: de_modules/nodemailer/lib/shared/index.js
===================================================================
--- node_modules/nodemailer/lib/shared/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,688 +1,0 @@
-/* eslint no-console: 0 */
-
-'use strict';
-
-const urllib = require('url');
-const util = require('util');
-const fs = require('fs');
-const nmfetch = require('../fetch');
-const dns = require('dns');
-const net = require('net');
-const os = require('os');
-
-const DNS_TTL = 5 * 60 * 1000;
-
-let networkInterfaces;
-try {
-    networkInterfaces = os.networkInterfaces();
-} catch (err) {
-    // fails on some systems
-}
-
-module.exports.networkInterfaces = networkInterfaces;
-
-const isFamilySupported = (family, allowInternal) => {
-    let networkInterfaces = module.exports.networkInterfaces;
-    if (!networkInterfaces) {
-        // hope for the best
-        return true;
-    }
-
-    const familySupported =
-        // crux that replaces Object.values(networkInterfaces) as Object.values is not supported in nodejs v6
-        Object.keys(networkInterfaces)
-            .map(key => networkInterfaces[key])
-            // crux that replaces .flat() as it is not supported in older Node versions (v10 and older)
-            .reduce((acc, val) => acc.concat(val), [])
-            .filter(i => !i.internal || allowInternal)
-            .filter(i => i.family === 'IPv' + family || i.family === family).length > 0;
-
-    return familySupported;
-};
-
-const resolver = (family, hostname, options, callback) => {
-    options = options || {};
-    const familySupported = isFamilySupported(family, options.allowInternalNetworkInterfaces);
-
-    if (!familySupported) {
-        return callback(null, []);
-    }
-
-    const resolver = dns.Resolver ? new dns.Resolver(options) : dns;
-    resolver['resolve' + family](hostname, (err, addresses) => {
-        if (err) {
-            switch (err.code) {
-                case dns.NODATA:
-                case dns.NOTFOUND:
-                case dns.NOTIMP:
-                case dns.SERVFAIL:
-                case dns.CONNREFUSED:
-                case dns.REFUSED:
-                case 'EAI_AGAIN':
-                    return callback(null, []);
-            }
-            return callback(err);
-        }
-        return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));
-    });
-};
-
-const dnsCache = (module.exports.dnsCache = new Map());
-
-const formatDNSValue = (value, extra) => {
-    if (!value) {
-        return Object.assign({}, extra || {});
-    }
-
-    return Object.assign(
-        {
-            servername: value.servername,
-            host:
-                !value.addresses || !value.addresses.length
-                    ? null
-                    : value.addresses.length === 1
-                    ? value.addresses[0]
-                    : value.addresses[Math.floor(Math.random() * value.addresses.length)]
-        },
-        extra || {}
-    );
-};
-
-module.exports.resolveHostname = (options, callback) => {
-    options = options || {};
-
-    if (!options.host && options.servername) {
-        options.host = options.servername;
-    }
-
-    if (!options.host || net.isIP(options.host)) {
-        // nothing to do here
-        let value = {
-            addresses: [options.host],
-            servername: options.servername || false
-        };
-        return callback(
-            null,
-            formatDNSValue(value, {
-                cached: false
-            })
-        );
-    }
-
-    let cached;
-    if (dnsCache.has(options.host)) {
-        cached = dnsCache.get(options.host);
-
-        if (!cached.expires || cached.expires >= Date.now()) {
-            return callback(
-                null,
-                formatDNSValue(cached.value, {
-                    cached: true
-                })
-            );
-        }
-    }
-
-    resolver(4, options.host, options, (err, addresses) => {
-        if (err) {
-            if (cached) {
-                // ignore error, use expired value
-                return callback(
-                    null,
-                    formatDNSValue(cached.value, {
-                        cached: true,
-                        error: err
-                    })
-                );
-            }
-            return callback(err);
-        }
-
-        if (addresses && addresses.length) {
-            let value = {
-                addresses,
-                servername: options.servername || options.host
-            };
-
-            dnsCache.set(options.host, {
-                value,
-                expires: Date.now() + (options.dnsTtl || DNS_TTL)
-            });
-
-            return callback(
-                null,
-                formatDNSValue(value, {
-                    cached: false
-                })
-            );
-        }
-
-        resolver(6, options.host, options, (err, addresses) => {
-            if (err) {
-                if (cached) {
-                    // ignore error, use expired value
-                    return callback(
-                        null,
-                        formatDNSValue(cached.value, {
-                            cached: true,
-                            error: err
-                        })
-                    );
-                }
-                return callback(err);
-            }
-
-            if (addresses && addresses.length) {
-                let value = {
-                    addresses,
-                    servername: options.servername || options.host
-                };
-
-                dnsCache.set(options.host, {
-                    value,
-                    expires: Date.now() + (options.dnsTtl || DNS_TTL)
-                });
-
-                return callback(
-                    null,
-                    formatDNSValue(value, {
-                        cached: false
-                    })
-                );
-            }
-
-            try {
-                dns.lookup(options.host, { all: true }, (err, addresses) => {
-                    if (err) {
-                        if (cached) {
-                            // ignore error, use expired value
-                            return callback(
-                                null,
-                                formatDNSValue(cached.value, {
-                                    cached: true,
-                                    error: err
-                                })
-                            );
-                        }
-                        return callback(err);
-                    }
-
-                    let address = addresses
-                        ? addresses
-                              .filter(addr => isFamilySupported(addr.family))
-                              .map(addr => addr.address)
-                              .shift()
-                        : false;
-
-                    if (addresses && addresses.length && !address) {
-                        // there are addresses but none can be used
-                        console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);
-                    }
-
-                    if (!address && cached) {
-                        // nothing was found, fallback to cached value
-                        return callback(
-                            null,
-                            formatDNSValue(cached.value, {
-                                cached: true
-                            })
-                        );
-                    }
-
-                    let value = {
-                        addresses: address ? [address] : [options.host],
-                        servername: options.servername || options.host
-                    };
-
-                    dnsCache.set(options.host, {
-                        value,
-                        expires: Date.now() + (options.dnsTtl || DNS_TTL)
-                    });
-
-                    return callback(
-                        null,
-                        formatDNSValue(value, {
-                            cached: false
-                        })
-                    );
-                });
-            } catch (err) {
-                if (cached) {
-                    // ignore error, use expired value
-                    return callback(
-                        null,
-                        formatDNSValue(cached.value, {
-                            cached: true,
-                            error: err
-                        })
-                    );
-                }
-                return callback(err);
-            }
-        });
-    });
-};
-/**
- * Parses connection url to a structured configuration object
- *
- * @param {String} str Connection url
- * @return {Object} Configuration object
- */
-module.exports.parseConnectionUrl = str => {
-    str = str || '';
-    let options = {};
-
-    [urllib.parse(str, true)].forEach(url => {
-        let auth;
-
-        switch (url.protocol) {
-            case 'smtp:':
-                options.secure = false;
-                break;
-            case 'smtps:':
-                options.secure = true;
-                break;
-            case 'direct:':
-                options.direct = true;
-                break;
-        }
-
-        if (!isNaN(url.port) && Number(url.port)) {
-            options.port = Number(url.port);
-        }
-
-        if (url.hostname) {
-            options.host = url.hostname;
-        }
-
-        if (url.auth) {
-            auth = url.auth.split(':');
-
-            if (!options.auth) {
-                options.auth = {};
-            }
-
-            options.auth.user = auth.shift();
-            options.auth.pass = auth.join(':');
-        }
-
-        Object.keys(url.query || {}).forEach(key => {
-            let obj = options;
-            let lKey = key;
-            let value = url.query[key];
-
-            if (!isNaN(value)) {
-                value = Number(value);
-            }
-
-            switch (value) {
-                case 'true':
-                    value = true;
-                    break;
-                case 'false':
-                    value = false;
-                    break;
-            }
-
-            // tls is nested object
-            if (key.indexOf('tls.') === 0) {
-                lKey = key.substr(4);
-                if (!options.tls) {
-                    options.tls = {};
-                }
-                obj = options.tls;
-            } else if (key.indexOf('.') >= 0) {
-                // ignore nested properties besides tls
-                return;
-            }
-
-            if (!(lKey in obj)) {
-                obj[lKey] = value;
-            }
-        });
-    });
-
-    return options;
-};
-
-module.exports._logFunc = (logger, level, defaults, data, message, ...args) => {
-    let entry = {};
-
-    Object.keys(defaults || {}).forEach(key => {
-        if (key !== 'level') {
-            entry[key] = defaults[key];
-        }
-    });
-
-    Object.keys(data || {}).forEach(key => {
-        if (key !== 'level') {
-            entry[key] = data[key];
-        }
-    });
-
-    logger[level](entry, message, ...args);
-};
-
-/**
- * Returns a bunyan-compatible logger interface. Uses either provided logger or
- * creates a default console logger
- *
- * @param {Object} [options] Options object that might include 'logger' value
- * @return {Object} bunyan compatible logger
- */
-module.exports.getLogger = (options, defaults) => {
-    options = options || {};
-
-    let response = {};
-    let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
-
-    if (!options.logger) {
-        // use vanity logger
-        levels.forEach(level => {
-            response[level] = () => false;
-        });
-        return response;
-    }
-
-    let logger = options.logger;
-
-    if (options.logger === true) {
-        // create console logger
-        logger = createDefaultLogger(levels);
-    }
-
-    levels.forEach(level => {
-        response[level] = (data, message, ...args) => {
-            module.exports._logFunc(logger, level, defaults, data, message, ...args);
-        };
-    });
-
-    return response;
-};
-
-/**
- * Wrapper for creating a callback that either resolves or rejects a promise
- * based on input
- *
- * @param {Function} resolve Function to run if callback is called
- * @param {Function} reject Function to run if callback ends with an error
- */
-module.exports.callbackPromise = (resolve, reject) =>
-    function () {
-        let args = Array.from(arguments);
-        let err = args.shift();
-        if (err) {
-            reject(err);
-        } else {
-            resolve(...args);
-        }
-    };
-
-module.exports.parseDataURI = uri => {
-    let input = uri;
-    let commaPos = input.indexOf(',');
-    if (!commaPos) {
-        return uri;
-    }
-
-    let data = input.substring(commaPos + 1);
-    let metaStr = input.substring('data:'.length, commaPos);
-
-    let encoding;
-
-    let metaEntries = metaStr.split(';');
-    let lastMetaEntry = metaEntries.length > 1 ? metaEntries[metaEntries.length - 1] : false;
-    if (lastMetaEntry && lastMetaEntry.indexOf('=') < 0) {
-        encoding = lastMetaEntry.toLowerCase();
-        metaEntries.pop();
-    }
-
-    let contentType = metaEntries.shift() || 'application/octet-stream';
-    let params = {};
-    for (let entry of metaEntries) {
-        let sep = entry.indexOf('=');
-        if (sep >= 0) {
-            let key = entry.substring(0, sep);
-            let value = entry.substring(sep + 1);
-            params[key] = value;
-        }
-    }
-
-    switch (encoding) {
-        case 'base64':
-            data = Buffer.from(data, 'base64');
-            break;
-        case 'utf8':
-            data = Buffer.from(data);
-            break;
-        default:
-            try {
-                data = Buffer.from(decodeURIComponent(data));
-            } catch (err) {
-                data = Buffer.from(data);
-            }
-            data = Buffer.from(data);
-    }
-
-    return { data, encoding, contentType, params };
-};
-
-/**
- * Resolves a String or a Buffer value for content value. Useful if the value
- * is a Stream or a file or an URL. If the value is a Stream, overwrites
- * the stream object with the resolved value (you can't stream a value twice).
- *
- * This is useful when you want to create a plugin that needs a content value,
- * for example the `html` or `text` value as a String or a Buffer but not as
- * a file path or an URL.
- *
- * @param {Object} data An object or an Array you want to resolve an element for
- * @param {String|Number} key Property name or an Array index
- * @param {Function} callback Callback function with (err, value)
- */
-module.exports.resolveContent = (data, key, callback) => {
-    let promise;
-
-    if (!callback) {
-        promise = new Promise((resolve, reject) => {
-            callback = module.exports.callbackPromise(resolve, reject);
-        });
-    }
-
-    let content = (data && data[key] && data[key].content) || data[key];
-    let contentStream;
-    let encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')
-        .toString()
-        .toLowerCase()
-        .replace(/[-_\s]/g, '');
-
-    if (!content) {
-        return callback(null, content);
-    }
-
-    if (typeof content === 'object') {
-        if (typeof content.pipe === 'function') {
-            return resolveStream(content, (err, value) => {
-                if (err) {
-                    return callback(err);
-                }
-                // we can't stream twice the same content, so we need
-                // to replace the stream object with the streaming result
-                if (data[key].content) {
-                    data[key].content = value;
-                } else {
-                    data[key] = value;
-                }
-                callback(null, value);
-            });
-        } else if (/^https?:\/\//i.test(content.path || content.href)) {
-            contentStream = nmfetch(content.path || content.href);
-            return resolveStream(contentStream, callback);
-        } else if (/^data:/i.test(content.path || content.href)) {
-            let parsedDataUri = module.exports.parseDataURI(content.path || content.href);
-
-            if (!parsedDataUri || !parsedDataUri.data) {
-                return callback(null, Buffer.from(0));
-            }
-            return callback(null, parsedDataUri.data);
-        } else if (content.path) {
-            return resolveStream(fs.createReadStream(content.path), callback);
-        }
-    }
-
-    if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {
-        content = Buffer.from(data[key].content, encoding);
-    }
-
-    // default action, return as is
-    setImmediate(() => callback(null, content));
-
-    return promise;
-};
-
-/**
- * Copies properties from source objects to target objects
- */
-module.exports.assign = function (/* target, ... sources */) {
-    let args = Array.from(arguments);
-    let target = args.shift() || {};
-
-    args.forEach(source => {
-        Object.keys(source || {}).forEach(key => {
-            if (['tls', 'auth'].includes(key) && source[key] && typeof source[key] === 'object') {
-                // tls and auth are special keys that need to be enumerated separately
-                // other objects are passed as is
-                if (!target[key]) {
-                    // ensure that target has this key
-                    target[key] = {};
-                }
-                Object.keys(source[key]).forEach(subKey => {
-                    target[key][subKey] = source[key][subKey];
-                });
-            } else {
-                target[key] = source[key];
-            }
-        });
-    });
-    return target;
-};
-
-module.exports.encodeXText = str => {
-    // ! 0x21
-    // + 0x2B
-    // = 0x3D
-    // ~ 0x7E
-    if (!/[^\x21-\x2A\x2C-\x3C\x3E-\x7E]/.test(str)) {
-        return str;
-    }
-    let buf = Buffer.from(str);
-    let result = '';
-    for (let i = 0, len = buf.length; i < len; i++) {
-        let c = buf[i];
-        if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {
-            result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();
-        } else {
-            result += String.fromCharCode(c);
-        }
-    }
-    return result;
-};
-
-/**
- * Streams a stream value into a Buffer
- *
- * @param {Object} stream Readable stream
- * @param {Function} callback Callback function with (err, value)
- */
-function resolveStream(stream, callback) {
-    let responded = false;
-    let chunks = [];
-    let chunklen = 0;
-
-    stream.on('error', err => {
-        if (responded) {
-            return;
-        }
-
-        responded = true;
-        callback(err);
-    });
-
-    stream.on('readable', () => {
-        let chunk;
-        while ((chunk = stream.read()) !== null) {
-            chunks.push(chunk);
-            chunklen += chunk.length;
-        }
-    });
-
-    stream.on('end', () => {
-        if (responded) {
-            return;
-        }
-        responded = true;
-
-        let value;
-
-        try {
-            value = Buffer.concat(chunks, chunklen);
-        } catch (E) {
-            return callback(E);
-        }
-        callback(null, value);
-    });
-}
-
-/**
- * Generates a bunyan-like logger that prints to console
- *
- * @returns {Object} Bunyan logger instance
- */
-function createDefaultLogger(levels) {
-    let levelMaxLen = 0;
-    let levelNames = new Map();
-    levels.forEach(level => {
-        if (level.length > levelMaxLen) {
-            levelMaxLen = level.length;
-        }
-    });
-
-    levels.forEach(level => {
-        let levelName = level.toUpperCase();
-        if (levelName.length < levelMaxLen) {
-            levelName += ' '.repeat(levelMaxLen - levelName.length);
-        }
-        levelNames.set(level, levelName);
-    });
-
-    let print = (level, entry, message, ...args) => {
-        let prefix = '';
-        if (entry) {
-            if (entry.tnx === 'server') {
-                prefix = 'S: ';
-            } else if (entry.tnx === 'client') {
-                prefix = 'C: ';
-            }
-
-            if (entry.sid) {
-                prefix = '[' + entry.sid + '] ' + prefix;
-            }
-
-            if (entry.cid) {
-                prefix = '[#' + entry.cid + '] ' + prefix;
-            }
-        }
-
-        message = util.format(message, ...args);
-        message.split(/\r?\n/).forEach(line => {
-            console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);
-        });
-    };
-
-    let logger = {};
-    levels.forEach(level => {
-        logger[level] = print.bind(null, level);
-    });
-
-    return logger;
-}
Index: de_modules/nodemailer/lib/smtp-connection/data-stream.js
===================================================================
--- node_modules/nodemailer/lib/smtp-connection/data-stream.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,108 +1,0 @@
-'use strict';
-
-const stream = require('stream');
-const Transform = stream.Transform;
-
-/**
- * Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>
- * Also makes sure that only <CR><LF> sequences are used for linebreaks
- *
- * @param {Object} options Stream options
- */
-class DataStream extends Transform {
-    constructor(options) {
-        super(options);
-        // init Transform
-        this.options = options || {};
-        this._curLine = '';
-
-        this.inByteCount = 0;
-        this.outByteCount = 0;
-        this.lastByte = false;
-    }
-
-    /**
-     * Escapes dots
-     */
-    _transform(chunk, encoding, done) {
-        let chunks = [];
-        let chunklen = 0;
-        let i,
-            len,
-            lastPos = 0;
-        let buf;
-
-        if (!chunk || !chunk.length) {
-            return done();
-        }
-
-        if (typeof chunk === 'string') {
-            chunk = Buffer.from(chunk);
-        }
-
-        this.inByteCount += chunk.length;
-
-        for (i = 0, len = chunk.length; i < len; i++) {
-            if (chunk[i] === 0x2e) {
-                // .
-                if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {
-                    buf = chunk.slice(lastPos, i + 1);
-                    chunks.push(buf);
-                    chunks.push(Buffer.from('.'));
-                    chunklen += buf.length + 1;
-                    lastPos = i + 1;
-                }
-            } else if (chunk[i] === 0x0a) {
-                // .
-                if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {
-                    if (i > lastPos) {
-                        buf = chunk.slice(lastPos, i);
-                        chunks.push(buf);
-                        chunklen += buf.length + 2;
-                    } else {
-                        chunklen += 2;
-                    }
-                    chunks.push(Buffer.from('\r\n'));
-                    lastPos = i + 1;
-                }
-            }
-        }
-
-        if (chunklen) {
-            // add last piece
-            if (lastPos < chunk.length) {
-                buf = chunk.slice(lastPos);
-                chunks.push(buf);
-                chunklen += buf.length;
-            }
-
-            this.outByteCount += chunklen;
-            this.push(Buffer.concat(chunks, chunklen));
-        } else {
-            this.outByteCount += chunk.length;
-            this.push(chunk);
-        }
-
-        this.lastByte = chunk[chunk.length - 1];
-        done();
-    }
-
-    /**
-     * Finalizes the stream with a dot on a single line
-     */
-    _flush(done) {
-        let buf;
-        if (this.lastByte === 0x0a) {
-            buf = Buffer.from('.\r\n');
-        } else if (this.lastByte === 0x0d) {
-            buf = Buffer.from('\n.\r\n');
-        } else {
-            buf = Buffer.from('\r\n.\r\n');
-        }
-        this.outByteCount += buf.length;
-        this.push(buf);
-        done();
-    }
-}
-
-module.exports = DataStream;
Index: de_modules/nodemailer/lib/smtp-connection/http-proxy-client.js
===================================================================
--- node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,143 +1,0 @@
-'use strict';
-
-/**
- * Minimal HTTP/S proxy client
- */
-
-const net = require('net');
-const tls = require('tls');
-const urllib = require('url');
-
-/**
- * Establishes proxied connection to destinationPort
- *
- * httpProxyClient("http://localhost:3128/", 80, "google.com", function(err, socket){
- *     socket.write("GET / HTTP/1.0\r\n\r\n");
- * });
- *
- * @param {String} proxyUrl proxy configuration, etg "http://proxy.host:3128/"
- * @param {Number} destinationPort Port to open in destination host
- * @param {String} destinationHost Destination hostname
- * @param {Function} callback Callback to run with the rocket object once connection is established
- */
-function httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {
-    let proxy = urllib.parse(proxyUrl);
-
-    // create a socket connection to the proxy server
-    let options;
-    let connect;
-    let socket;
-
-    options = {
-        host: proxy.hostname,
-        port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80
-    };
-
-    if (proxy.protocol === 'https:') {
-        // we can use untrusted proxies as long as we verify actual SMTP certificates
-        options.rejectUnauthorized = false;
-        connect = tls.connect.bind(tls);
-    } else {
-        connect = net.connect.bind(net);
-    }
-
-    // Error harness for initial connection. Once connection is established, the responsibility
-    // to handle errors is passed to whoever uses this socket
-    let finished = false;
-    let tempSocketErr = err => {
-        if (finished) {
-            return;
-        }
-        finished = true;
-        try {
-            socket.destroy();
-        } catch (E) {
-            // ignore
-        }
-        callback(err);
-    };
-
-    let timeoutErr = () => {
-        let err = new Error('Proxy socket timed out');
-        err.code = 'ETIMEDOUT';
-        tempSocketErr(err);
-    };
-
-    socket = connect(options, () => {
-        if (finished) {
-            return;
-        }
-
-        let reqHeaders = {
-            Host: destinationHost + ':' + destinationPort,
-            Connection: 'close'
-        };
-        if (proxy.auth) {
-            reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');
-        }
-
-        socket.write(
-            // HTTP method
-            'CONNECT ' +
-                destinationHost +
-                ':' +
-                destinationPort +
-                ' HTTP/1.1\r\n' +
-                // HTTP request headers
-                Object.keys(reqHeaders)
-                    .map(key => key + ': ' + reqHeaders[key])
-                    .join('\r\n') +
-                // End request
-                '\r\n\r\n'
-        );
-
-        let headers = '';
-        let onSocketData = chunk => {
-            let match;
-            let remainder;
-
-            if (finished) {
-                return;
-            }
-
-            headers += chunk.toString('binary');
-            if ((match = headers.match(/\r\n\r\n/))) {
-                socket.removeListener('data', onSocketData);
-
-                remainder = headers.substr(match.index + match[0].length);
-                headers = headers.substr(0, match.index);
-                if (remainder) {
-                    socket.unshift(Buffer.from(remainder, 'binary'));
-                }
-
-                // proxy connection is now established
-                finished = true;
-
-                // check response code
-                match = headers.match(/^HTTP\/\d+\.\d+ (\d+)/i);
-                if (!match || (match[1] || '').charAt(0) !== '2') {
-                    try {
-                        socket.destroy();
-                    } catch (E) {
-                        // ignore
-                    }
-                    return callback(new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || '')));
-                }
-
-                socket.removeListener('error', tempSocketErr);
-                socket.removeListener('timeout', timeoutErr);
-                socket.setTimeout(0);
-
-                return callback(null, socket);
-            }
-        };
-        socket.on('data', onSocketData);
-    });
-
-    socket.setTimeout(httpProxyClient.timeout || 30 * 1000);
-    socket.on('timeout', timeoutErr);
-
-    socket.once('error', tempSocketErr);
-}
-
-module.exports = httpProxyClient;
Index: de_modules/nodemailer/lib/smtp-connection/index.js
===================================================================
--- node_modules/nodemailer/lib/smtp-connection/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1836 +1,0 @@
-'use strict';
-
-const packageInfo = require('../../package.json');
-const EventEmitter = require('events').EventEmitter;
-const net = require('net');
-const tls = require('tls');
-const os = require('os');
-const crypto = require('crypto');
-const DataStream = require('./data-stream');
-const PassThrough = require('stream').PassThrough;
-const shared = require('../shared');
-
-// default timeout values in ms
-const CONNECTION_TIMEOUT = 2 * 60 * 1000; // how much to wait for the connection to be established
-const SOCKET_TIMEOUT = 10 * 60 * 1000; // how much to wait for socket inactivity before disconnecting the client
-const GREETING_TIMEOUT = 30 * 1000; // how much to wait after connection is established but SMTP greeting is not receieved
-const DNS_TIMEOUT = 30 * 1000; // how much to wait for resolveHostname
-
-/**
- * Generates a SMTP connection object
- *
- * Optional options object takes the following possible properties:
- *
- *  * **port** - is the port to connect to (defaults to 587 or 465)
- *  * **host** - is the hostname or IP address to connect to (defaults to 'localhost')
- *  * **secure** - use SSL
- *  * **ignoreTLS** - ignore server support for STARTTLS
- *  * **requireTLS** - forces the client to use STARTTLS
- *  * **name** - the name of the client server
- *  * **localAddress** - outbound address to bind to (see: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener)
- *  * **greetingTimeout** - Time to wait in ms until greeting message is received from the server (defaults to 10000)
- *  * **connectionTimeout** - how many milliseconds to wait for the connection to establish
- *  * **socketTimeout** - Time of inactivity until the connection is closed (defaults to 1 hour)
- *  * **dnsTimeout** - Time to wait in ms for the DNS requests to be resolved (defaults to 30 seconds)
- *  * **lmtp** - if true, uses LMTP instead of SMTP protocol
- *  * **logger** - bunyan compatible logger interface
- *  * **debug** - if true pass SMTP traffic to the logger
- *  * **tls** - options for createCredentials
- *  * **socket** - existing socket to use instead of creating a new one (see: http://nodejs.org/api/net.html#net_class_net_socket)
- *  * **secured** - boolean indicates that the provided socket has already been upgraded to tls
- *
- * @constructor
- * @namespace SMTP Client module
- * @param {Object} [options] Option properties
- */
-class SMTPConnection extends EventEmitter {
-    constructor(options) {
-        super(options);
-
-        this.id = crypto.randomBytes(8).toString('base64').replace(/\W/g, '');
-        this.stage = 'init';
-
-        this.options = options || {};
-
-        this.secureConnection = !!this.options.secure;
-        this.alreadySecured = !!this.options.secured;
-
-        this.port = Number(this.options.port) || (this.secureConnection ? 465 : 587);
-        this.host = this.options.host || 'localhost';
-
-        this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;
-
-        this.allowInternalNetworkInterfaces = this.options.allowInternalNetworkInterfaces || false;
-
-        if (typeof this.options.secure === 'undefined' && this.port === 465) {
-            // if secure option is not set but port is 465, then default to secure
-            this.secureConnection = true;
-        }
-
-        this.name = this.options.name || this._getHostname();
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'smtp-connection',
-            sid: this.id
-        });
-
-        this.customAuth = new Map();
-        Object.keys(this.options.customAuth || {}).forEach(key => {
-            let mapKey = (key || '').toString().trim().toUpperCase();
-            if (!mapKey) {
-                return;
-            }
-            this.customAuth.set(mapKey, this.options.customAuth[key]);
-        });
-
-        /**
-         * Expose version nr, just for the reference
-         * @type {String}
-         */
-        this.version = packageInfo.version;
-
-        /**
-         * If true, then the user is authenticated
-         * @type {Boolean}
-         */
-        this.authenticated = false;
-
-        /**
-         * If set to true, this instance is no longer active
-         * @private
-         */
-        this.destroyed = false;
-
-        /**
-         * Defines if the current connection is secure or not. If not,
-         * STARTTLS can be used if available
-         * @private
-         */
-        this.secure = !!this.secureConnection;
-
-        /**
-         * Store incomplete messages coming from the server
-         * @private
-         */
-        this._remainder = '';
-
-        /**
-         * Unprocessed responses from the server
-         * @type {Array}
-         */
-        this._responseQueue = [];
-
-        this.lastServerResponse = false;
-
-        /**
-         * The socket connecting to the server
-         * @publick
-         */
-        this._socket = false;
-
-        /**
-         * Lists supported auth mechanisms
-         * @private
-         */
-        this._supportedAuth = [];
-
-        /**
-         * Set to true, if EHLO response includes "AUTH".
-         * If false then authentication is not tried
-         */
-        this.allowsAuth = false;
-
-        /**
-         * Includes current envelope (from, to)
-         * @private
-         */
-        this._envelope = false;
-
-        /**
-         * Lists supported extensions
-         * @private
-         */
-        this._supportedExtensions = [];
-
-        /**
-         * Defines the maximum allowed size for a single message
-         * @private
-         */
-        this._maxAllowedSize = 0;
-
-        /**
-         * Function queue to run if a data chunk comes from the server
-         * @private
-         */
-        this._responseActions = [];
-        this._recipientQueue = [];
-
-        /**
-         * Timeout variable for waiting the greeting
-         * @private
-         */
-        this._greetingTimeout = false;
-
-        /**
-         * Timeout variable for waiting the connection to start
-         * @private
-         */
-        this._connectionTimeout = false;
-
-        /**
-         * If the socket is deemed already closed
-         * @private
-         */
-        this._destroyed = false;
-
-        /**
-         * If the socket is already being closed
-         * @private
-         */
-        this._closing = false;
-
-        /**
-         * Callbacks for socket's listeners
-         */
-        this._onSocketData = chunk => this._onData(chunk);
-        this._onSocketError = error => this._onError(error, 'ESOCKET', false, 'CONN');
-        this._onSocketClose = () => this._onClose();
-        this._onSocketEnd = () => this._onEnd();
-        this._onSocketTimeout = () => this._onTimeout();
-    }
-
-    /**
-     * Creates a connection to a SMTP server and sets up connection
-     * listener
-     */
-    connect(connectCallback) {
-        if (typeof connectCallback === 'function') {
-            this.once('connect', () => {
-                this.logger.debug(
-                    {
-                        tnx: 'smtp'
-                    },
-                    'SMTP handshake finished'
-                );
-                connectCallback();
-            });
-
-            const isDestroyedMessage = this._isDestroyedMessage('connect');
-            if (isDestroyedMessage) {
-                return connectCallback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'CONN'));
-            }
-        }
-
-        let opts = {
-            port: this.port,
-            host: this.host,
-            allowInternalNetworkInterfaces: this.allowInternalNetworkInterfaces,
-            timeout: this.options.dnsTimeout || DNS_TIMEOUT
-        };
-
-        if (this.options.localAddress) {
-            opts.localAddress = this.options.localAddress;
-        }
-
-        let setupConnectionHandlers = () => {
-            this._connectionTimeout = setTimeout(() => {
-                this._onError('Connection timeout', 'ETIMEDOUT', false, 'CONN');
-            }, this.options.connectionTimeout || CONNECTION_TIMEOUT);
-
-            this._socket.on('error', this._onSocketError);
-        };
-
-        if (this.options.connection) {
-            // connection is already opened
-            this._socket = this.options.connection;
-            setupConnectionHandlers();
-
-            if (this.secureConnection && !this.alreadySecured) {
-                setImmediate(() =>
-                    this._upgradeConnection(err => {
-                        if (err) {
-                            this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'CONN');
-                            return;
-                        }
-                        this._onConnect();
-                    })
-                );
-            } else {
-                setImmediate(() => this._onConnect());
-            }
-            return;
-        } else if (this.options.socket) {
-            // socket object is set up but not yet connected
-            this._socket = this.options.socket;
-            return shared.resolveHostname(opts, (err, resolved) => {
-                if (err) {
-                    return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));
-                }
-                this.logger.debug(
-                    {
-                        tnx: 'dns',
-                        source: opts.host,
-                        resolved: resolved.host,
-                        cached: !!resolved.cached
-                    },
-                    'Resolved %s as %s [cache %s]',
-                    opts.host,
-                    resolved.host,
-                    resolved.cached ? 'hit' : 'miss'
-                );
-                Object.keys(resolved).forEach(key => {
-                    if (key.charAt(0) !== '_' && resolved[key]) {
-                        opts[key] = resolved[key];
-                    }
-                });
-                try {
-                    this._socket.connect(this.port, this.host, () => {
-                        this._socket.setKeepAlive(true);
-                        this._onConnect();
-                    });
-                    setupConnectionHandlers();
-                } catch (E) {
-                    return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));
-                }
-            });
-        } else if (this.secureConnection) {
-            // connect using tls
-            if (this.options.tls) {
-                Object.keys(this.options.tls).forEach(key => {
-                    opts[key] = this.options.tls[key];
-                });
-            }
-
-            // ensure servername for SNI
-            if (this.servername && !opts.servername) {
-                opts.servername = this.servername;
-            }
-
-            return shared.resolveHostname(opts, (err, resolved) => {
-                if (err) {
-                    return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));
-                }
-                this.logger.debug(
-                    {
-                        tnx: 'dns',
-                        source: opts.host,
-                        resolved: resolved.host,
-                        cached: !!resolved.cached
-                    },
-                    'Resolved %s as %s [cache %s]',
-                    opts.host,
-                    resolved.host,
-                    resolved.cached ? 'hit' : 'miss'
-                );
-                Object.keys(resolved).forEach(key => {
-                    if (key.charAt(0) !== '_' && resolved[key]) {
-                        opts[key] = resolved[key];
-                    }
-                });
-                try {
-                    this._socket = tls.connect(opts, () => {
-                        this._socket.setKeepAlive(true);
-                        this._onConnect();
-                    });
-                    setupConnectionHandlers();
-                } catch (E) {
-                    return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));
-                }
-            });
-        } else {
-            // connect using plaintext
-            return shared.resolveHostname(opts, (err, resolved) => {
-                if (err) {
-                    return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));
-                }
-                this.logger.debug(
-                    {
-                        tnx: 'dns',
-                        source: opts.host,
-                        resolved: resolved.host,
-                        cached: !!resolved.cached
-                    },
-                    'Resolved %s as %s [cache %s]',
-                    opts.host,
-                    resolved.host,
-                    resolved.cached ? 'hit' : 'miss'
-                );
-                Object.keys(resolved).forEach(key => {
-                    if (key.charAt(0) !== '_' && resolved[key]) {
-                        opts[key] = resolved[key];
-                    }
-                });
-                try {
-                    this._socket = net.connect(opts, () => {
-                        this._socket.setKeepAlive(true);
-                        this._onConnect();
-                    });
-                    setupConnectionHandlers();
-                } catch (E) {
-                    return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));
-                }
-            });
-        }
-    }
-
-    /**
-     * Sends QUIT
-     */
-    quit() {
-        this._sendCommand('QUIT');
-        this._responseActions.push(this.close);
-    }
-
-    /**
-     * Closes the connection to the server
-     */
-    close() {
-        clearTimeout(this._connectionTimeout);
-        clearTimeout(this._greetingTimeout);
-        this._responseActions = [];
-
-        // allow to run this function only once
-        if (this._closing) {
-            return;
-        }
-        this._closing = true;
-
-        let closeMethod = 'end';
-
-        if (this.stage === 'init') {
-            // Close the socket immediately when connection timed out
-            closeMethod = 'destroy';
-        }
-
-        this.logger.debug(
-            {
-                tnx: 'smtp'
-            },
-            'Closing connection to the server using "%s"',
-            closeMethod
-        );
-
-        let socket = (this._socket && this._socket.socket) || this._socket;
-
-        if (socket && !socket.destroyed) {
-            try {
-                socket[closeMethod]();
-            } catch (E) {
-                // just ignore
-            }
-        }
-
-        this._destroy();
-    }
-
-    /**
-     * Authenticate user
-     */
-    login(authData, callback) {
-        const isDestroyedMessage = this._isDestroyedMessage('login');
-        if (isDestroyedMessage) {
-            return callback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));
-        }
-
-        this._auth = authData || {};
-        // Select SASL authentication method
-        this._authMethod = (this._auth.method || '').toString().trim().toUpperCase() || false;
-
-        if (!this._authMethod && this._auth.oauth2 && !this._auth.credentials) {
-            this._authMethod = 'XOAUTH2';
-        } else if (!this._authMethod || (this._authMethod === 'XOAUTH2' && !this._auth.oauth2)) {
-            // use first supported
-            this._authMethod = (this._supportedAuth[0] || 'PLAIN').toUpperCase().trim();
-        }
-
-        if (this._authMethod !== 'XOAUTH2' && (!this._auth.credentials || !this._auth.credentials.user || !this._auth.credentials.pass)) {
-            if ((this._auth.user && this._auth.pass) || this.customAuth.has(this._authMethod)) {
-                this._auth.credentials = {
-                    user: this._auth.user,
-                    pass: this._auth.pass,
-                    options: this._auth.options
-                };
-            } else {
-                return callback(this._formatError('Missing credentials for "' + this._authMethod + '"', 'EAUTH', false, 'API'));
-            }
-        }
-
-        if (this.customAuth.has(this._authMethod)) {
-            let handler = this.customAuth.get(this._authMethod);
-            let lastResponse;
-            let returned = false;
-
-            let resolve = () => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                this.logger.info(
-                    {
-                        tnx: 'smtp',
-                        username: this._auth.user,
-                        action: 'authenticated',
-                        method: this._authMethod
-                    },
-                    'User %s authenticated',
-                    JSON.stringify(this._auth.user)
-                );
-                this.authenticated = true;
-                callback(null, true);
-            };
-
-            let reject = err => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                callback(this._formatError(err, 'EAUTH', lastResponse, 'AUTH ' + this._authMethod));
-            };
-
-            let handlerResponse = handler({
-                auth: this._auth,
-                method: this._authMethod,
-
-                extensions: [].concat(this._supportedExtensions),
-                authMethods: [].concat(this._supportedAuth),
-                maxAllowedSize: this._maxAllowedSize || false,
-
-                sendCommand: (cmd, done) => {
-                    let promise;
-
-                    if (!done) {
-                        promise = new Promise((resolve, reject) => {
-                            done = shared.callbackPromise(resolve, reject);
-                        });
-                    }
-
-                    this._responseActions.push(str => {
-                        lastResponse = str;
-
-                        let codes = str.match(/^(\d+)(?:\s(\d+\.\d+\.\d+))?\s/);
-                        let data = {
-                            command: cmd,
-                            response: str
-                        };
-                        if (codes) {
-                            data.status = Number(codes[1]) || 0;
-                            if (codes[2]) {
-                                data.code = codes[2];
-                            }
-                            data.text = str.substr(codes[0].length);
-                        } else {
-                            data.text = str;
-                            data.status = 0; // just in case we need to perform numeric comparisons
-                        }
-                        done(null, data);
-                    });
-                    setImmediate(() => this._sendCommand(cmd));
-
-                    return promise;
-                },
-
-                resolve,
-                reject
-            });
-
-            if (handlerResponse && typeof handlerResponse.catch === 'function') {
-                // a promise was returned
-                handlerResponse.then(resolve).catch(reject);
-            }
-
-            return;
-        }
-
-        switch (this._authMethod) {
-            case 'XOAUTH2':
-                this._handleXOauth2Token(false, callback);
-                return;
-            case 'LOGIN':
-                this._responseActions.push(str => {
-                    this._actionAUTH_LOGIN_USER(str, callback);
-                });
-                this._sendCommand('AUTH LOGIN');
-                return;
-            case 'PLAIN':
-                this._responseActions.push(str => {
-                    this._actionAUTHComplete(str, callback);
-                });
-                this._sendCommand(
-                    'AUTH PLAIN ' +
-                        Buffer.from(
-                            //this._auth.user+'\u0000'+
-                            '\u0000' + // skip authorization identity as it causes problems with some servers
-                                this._auth.credentials.user +
-                                '\u0000' +
-                                this._auth.credentials.pass,
-                            'utf-8'
-                        ).toString('base64'),
-                    // log entry without passwords
-                    'AUTH PLAIN ' +
-                        Buffer.from(
-                            //this._auth.user+'\u0000'+
-                            '\u0000' + // skip authorization identity as it causes problems with some servers
-                                this._auth.credentials.user +
-                                '\u0000' +
-                                '/* secret */',
-                            'utf-8'
-                        ).toString('base64')
-                );
-                return;
-            case 'CRAM-MD5':
-                this._responseActions.push(str => {
-                    this._actionAUTH_CRAM_MD5(str, callback);
-                });
-                this._sendCommand('AUTH CRAM-MD5');
-                return;
-        }
-
-        return callback(this._formatError('Unknown authentication method "' + this._authMethod + '"', 'EAUTH', false, 'API'));
-    }
-
-    /**
-     * Sends a message
-     *
-     * @param {Object} envelope Envelope object, {from: addr, to: [addr]}
-     * @param {Object} message String, Buffer or a Stream
-     * @param {Function} callback Callback to return once sending is completed
-     */
-    send(envelope, message, done) {
-        if (!message) {
-            return done(this._formatError('Empty message', 'EMESSAGE', false, 'API'));
-        }
-
-        const isDestroyedMessage = this._isDestroyedMessage('send message');
-        if (isDestroyedMessage) {
-            return done(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));
-        }
-
-        // reject larger messages than allowed
-        if (this._maxAllowedSize && envelope.size > this._maxAllowedSize) {
-            return setImmediate(() => {
-                done(this._formatError('Message size larger than allowed ' + this._maxAllowedSize, 'EMESSAGE', false, 'MAIL FROM'));
-            });
-        }
-
-        // ensure that callback is only called once
-        let returned = false;
-        let callback = function () {
-            if (returned) {
-                return;
-            }
-            returned = true;
-
-            done(...arguments);
-        };
-
-        if (typeof message.on === 'function') {
-            message.on('error', err => callback(this._formatError(err, 'ESTREAM', false, 'API')));
-        }
-
-        let startTime = Date.now();
-        this._setEnvelope(envelope, (err, info) => {
-            if (err) {
-                // create passthrough stream to consume to prevent OOM
-                let stream = new PassThrough();
-                if (typeof message.pipe === 'function') {
-                    message.pipe(stream);
-                } else {
-                    stream.write(message);
-                    stream.end();
-                }
-
-                return callback(err);
-            }
-            let envelopeTime = Date.now();
-            let stream = this._createSendStream((err, str) => {
-                if (err) {
-                    return callback(err);
-                }
-
-                info.envelopeTime = envelopeTime - startTime;
-                info.messageTime = Date.now() - envelopeTime;
-                info.messageSize = stream.outByteCount;
-                info.response = str;
-
-                return callback(null, info);
-            });
-            if (typeof message.pipe === 'function') {
-                message.pipe(stream);
-            } else {
-                stream.write(message);
-                stream.end();
-            }
-        });
-    }
-
-    /**
-     * Resets connection state
-     *
-     * @param {Function} callback Callback to return once connection is reset
-     */
-    reset(callback) {
-        this._sendCommand('RSET');
-        this._responseActions.push(str => {
-            if (str.charAt(0) !== '2') {
-                return callback(this._formatError('Could not reset session state. response=' + str, 'EPROTOCOL', str, 'RSET'));
-            }
-            this._envelope = false;
-            return callback(null, true);
-        });
-    }
-
-    /**
-     * Connection listener that is run when the connection to
-     * the server is opened
-     *
-     * @event
-     */
-    _onConnect() {
-        clearTimeout(this._connectionTimeout);
-
-        this.logger.info(
-            {
-                tnx: 'network',
-                localAddress: this._socket.localAddress,
-                localPort: this._socket.localPort,
-                remoteAddress: this._socket.remoteAddress,
-                remotePort: this._socket.remotePort
-            },
-            '%s established to %s:%s',
-            this.secure ? 'Secure connection' : 'Connection',
-            this._socket.remoteAddress,
-            this._socket.remotePort
-        );
-
-        if (this._destroyed) {
-            // Connection was established after we already had canceled it
-            this.close();
-            return;
-        }
-
-        this.stage = 'connected';
-
-        // clear existing listeners for the socket
-        this._socket.removeListener('data', this._onSocketData);
-        this._socket.removeListener('timeout', this._onSocketTimeout);
-        this._socket.removeListener('close', this._onSocketClose);
-        this._socket.removeListener('end', this._onSocketEnd);
-
-        this._socket.on('data', this._onSocketData);
-        this._socket.once('close', this._onSocketClose);
-        this._socket.once('end', this._onSocketEnd);
-
-        this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);
-        this._socket.on('timeout', this._onSocketTimeout);
-
-        this._greetingTimeout = setTimeout(() => {
-            // if still waiting for greeting, give up
-            if (this._socket && !this._destroyed && this._responseActions[0] === this._actionGreeting) {
-                this._onError('Greeting never received', 'ETIMEDOUT', false, 'CONN');
-            }
-        }, this.options.greetingTimeout || GREETING_TIMEOUT);
-
-        this._responseActions.push(this._actionGreeting);
-
-        // we have a 'data' listener set up so resume socket if it was paused
-        this._socket.resume();
-    }
-
-    /**
-     * 'data' listener for data coming from the server
-     *
-     * @event
-     * @param {Buffer} chunk Data chunk coming from the server
-     */
-    _onData(chunk) {
-        if (this._destroyed || !chunk || !chunk.length) {
-            return;
-        }
-
-        let data = (chunk || '').toString('binary');
-        let lines = (this._remainder + data).split(/\r?\n/);
-        let lastline;
-
-        this._remainder = lines.pop();
-
-        for (let i = 0, len = lines.length; i < len; i++) {
-            if (this._responseQueue.length) {
-                lastline = this._responseQueue[this._responseQueue.length - 1];
-                if (/^\d+-/.test(lastline.split('\n').pop())) {
-                    this._responseQueue[this._responseQueue.length - 1] += '\n' + lines[i];
-                    continue;
-                }
-            }
-            this._responseQueue.push(lines[i]);
-        }
-
-        if (this._responseQueue.length) {
-            lastline = this._responseQueue[this._responseQueue.length - 1];
-            if (/^\d+-/.test(lastline.split('\n').pop())) {
-                return;
-            }
-        }
-
-        this._processResponse();
-    }
-
-    /**
-     * 'error' listener for the socket
-     *
-     * @event
-     * @param {Error} err Error object
-     * @param {String} type Error name
-     */
-    _onError(err, type, data, command) {
-        clearTimeout(this._connectionTimeout);
-        clearTimeout(this._greetingTimeout);
-
-        if (this._destroyed) {
-            // just ignore, already closed
-            // this might happen when a socket is canceled because of reached timeout
-            // but the socket timeout error itself receives only after
-            return;
-        }
-
-        err = this._formatError(err, type, data, command);
-
-        this.logger.error(data, err.message);
-
-        this.emit('error', err);
-        this.close();
-    }
-
-    _formatError(message, type, response, command) {
-        let err;
-
-        if (/Error\]$/i.test(Object.prototype.toString.call(message))) {
-            err = message;
-        } else {
-            err = new Error(message);
-        }
-
-        if (type && type !== 'Error') {
-            err.code = type;
-        }
-
-        if (response) {
-            err.response = response;
-            err.message += ': ' + response;
-        }
-
-        let responseCode = (typeof response === 'string' && Number((response.match(/^\d+/) || [])[0])) || false;
-        if (responseCode) {
-            err.responseCode = responseCode;
-        }
-
-        if (command) {
-            err.command = command;
-        }
-
-        return err;
-    }
-
-    /**
-     * 'close' listener for the socket
-     *
-     * @event
-     */
-    _onClose() {
-        let serverResponse = false;
-
-        if (this._remainder && this._remainder.trim()) {
-            if (this.options.debug || this.options.transactionLog) {
-                this.logger.debug(
-                    {
-                        tnx: 'server'
-                    },
-                    this._remainder.replace(/\r?\n$/, '')
-                );
-            }
-            this.lastServerResponse = serverResponse = this._remainder.trim();
-        }
-
-        this.logger.info(
-            {
-                tnx: 'network'
-            },
-            'Connection closed'
-        );
-
-        if (this.upgrading && !this._destroyed) {
-            return this._onError(new Error('Connection closed unexpectedly'), 'ETLS', serverResponse, 'CONN');
-        } else if (![this._actionGreeting, this.close].includes(this._responseActions[0]) && !this._destroyed) {
-            return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');
-        } else if (/^[45]\d{2}\b/.test(serverResponse)) {
-            return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');
-        }
-
-        this._destroy();
-    }
-
-    /**
-     * 'end' listener for the socket
-     *
-     * @event
-     */
-    _onEnd() {
-        if (this._socket && !this._socket.destroyed) {
-            this._socket.destroy();
-        }
-    }
-
-    /**
-     * 'timeout' listener for the socket
-     *
-     * @event
-     */
-    _onTimeout() {
-        return this._onError(new Error('Timeout'), 'ETIMEDOUT', false, 'CONN');
-    }
-
-    /**
-     * Destroys the client, emits 'end'
-     */
-    _destroy() {
-        if (this._destroyed) {
-            return;
-        }
-        this._destroyed = true;
-        this.emit('end');
-    }
-
-    /**
-     * Upgrades the connection to TLS
-     *
-     * @param {Function} callback Callback function to run when the connection
-     *        has been secured
-     */
-    _upgradeConnection(callback) {
-        // do not remove all listeners or it breaks node v0.10 as there's
-        // apparently a 'finish' event set that would be cleared as well
-
-        // we can safely keep 'error', 'end', 'close' etc. events
-        this._socket.removeListener('data', this._onSocketData); // incoming data is going to be gibberish from this point onwards
-        this._socket.removeListener('timeout', this._onSocketTimeout); // timeout will be re-set for the new socket object
-
-        let socketPlain = this._socket;
-        let opts = {
-            socket: this._socket,
-            host: this.host
-        };
-
-        Object.keys(this.options.tls || {}).forEach(key => {
-            opts[key] = this.options.tls[key];
-        });
-
-        // ensure servername for SNI
-        if (this.servername && !opts.servername) {
-            opts.servername = this.servername;
-        }
-
-        this.upgrading = true;
-        // tls.connect is not an asynchronous function however it may still throw errors and requires to be wrapped with try/catch
-        try {
-            this._socket = tls.connect(opts, () => {
-                this.secure = true;
-                this.upgrading = false;
-                this._socket.on('data', this._onSocketData);
-
-                socketPlain.removeListener('close', this._onSocketClose);
-                socketPlain.removeListener('end', this._onSocketEnd);
-
-                return callback(null, true);
-            });
-        } catch (err) {
-            return callback(err);
-        }
-
-        this._socket.on('error', this._onSocketError);
-        this._socket.once('close', this._onSocketClose);
-        this._socket.once('end', this._onSocketEnd);
-
-        this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT); // 10 min.
-        this._socket.on('timeout', this._onSocketTimeout);
-
-        // resume in case the socket was paused
-        socketPlain.resume();
-    }
-
-    /**
-     * Processes queued responses from the server
-     *
-     * @param {Boolean} force If true, ignores _processing flag
-     */
-    _processResponse() {
-        if (!this._responseQueue.length) {
-            return false;
-        }
-
-        let str = (this.lastServerResponse = (this._responseQueue.shift() || '').toString());
-
-        if (/^\d+-/.test(str.split('\n').pop())) {
-            // keep waiting for the final part of multiline response
-            return;
-        }
-
-        if (this.options.debug || this.options.transactionLog) {
-            this.logger.debug(
-                {
-                    tnx: 'server'
-                },
-                str.replace(/\r?\n$/, '')
-            );
-        }
-
-        if (!str.trim()) {
-            // skip unexpected empty lines
-            setImmediate(() => this._processResponse());
-        }
-
-        let action = this._responseActions.shift();
-
-        if (typeof action === 'function') {
-            action.call(this, str);
-            setImmediate(() => this._processResponse());
-        } else {
-            return this._onError(new Error('Unexpected Response'), 'EPROTOCOL', str, 'CONN');
-        }
-    }
-
-    /**
-     * Send a command to the server, append \r\n
-     *
-     * @param {String} str String to be sent to the server
-     * @param {String} logStr Optional string to be used for logging instead of the actual string
-     */
-    _sendCommand(str, logStr) {
-        if (this._destroyed) {
-            // Connection already closed, can't send any more data
-            return;
-        }
-
-        if (this._socket.destroyed) {
-            return this.close();
-        }
-
-        if (this.options.debug || this.options.transactionLog) {
-            this.logger.debug(
-                {
-                    tnx: 'client'
-                },
-                (logStr || str || '').toString().replace(/\r?\n$/, '')
-            );
-        }
-
-        this._socket.write(Buffer.from(str + '\r\n', 'utf-8'));
-    }
-
-    /**
-     * Initiates a new message by submitting envelope data, starting with
-     * MAIL FROM: command
-     *
-     * @param {Object} envelope Envelope object in the form of
-     *        {from:'...', to:['...']}
-     *        or
-     *        {from:{address:'...',name:'...'}, to:[address:'...',name:'...']}
-     */
-    _setEnvelope(envelope, callback) {
-        let args = [];
-        let useSmtpUtf8 = false;
-
-        this._envelope = envelope || {};
-        this._envelope.from = ((this._envelope.from && this._envelope.from.address) || this._envelope.from || '').toString().trim();
-
-        this._envelope.to = [].concat(this._envelope.to || []).map(to => ((to && to.address) || to || '').toString().trim());
-
-        if (!this._envelope.to.length) {
-            return callback(this._formatError('No recipients defined', 'EENVELOPE', false, 'API'));
-        }
-
-        if (this._envelope.from && /[\r\n<>]/.test(this._envelope.from)) {
-            return callback(this._formatError('Invalid sender ' + JSON.stringify(this._envelope.from), 'EENVELOPE', false, 'API'));
-        }
-
-        // check if the sender address uses only ASCII characters,
-        // otherwise require usage of SMTPUTF8 extension
-        if (/[\x80-\uFFFF]/.test(this._envelope.from)) {
-            useSmtpUtf8 = true;
-        }
-
-        for (let i = 0, len = this._envelope.to.length; i < len; i++) {
-            if (!this._envelope.to[i] || /[\r\n<>]/.test(this._envelope.to[i])) {
-                return callback(this._formatError('Invalid recipient ' + JSON.stringify(this._envelope.to[i]), 'EENVELOPE', false, 'API'));
-            }
-
-            // check if the recipients addresses use only ASCII characters,
-            // otherwise require usage of SMTPUTF8 extension
-            if (/[\x80-\uFFFF]/.test(this._envelope.to[i])) {
-                useSmtpUtf8 = true;
-            }
-        }
-
-        // clone the recipients array for latter manipulation
-        this._envelope.rcptQueue = JSON.parse(JSON.stringify(this._envelope.to || []));
-        this._envelope.rejected = [];
-        this._envelope.rejectedErrors = [];
-        this._envelope.accepted = [];
-
-        if (this._envelope.dsn) {
-            try {
-                this._envelope.dsn = this._setDsnEnvelope(this._envelope.dsn);
-            } catch (err) {
-                return callback(this._formatError('Invalid DSN ' + err.message, 'EENVELOPE', false, 'API'));
-            }
-        }
-
-        this._responseActions.push(str => {
-            this._actionMAIL(str, callback);
-        });
-
-        // If the server supports SMTPUTF8 and the envelope includes an internationalized
-        // email address then append SMTPUTF8 keyword to the MAIL FROM command
-        if (useSmtpUtf8 && this._supportedExtensions.includes('SMTPUTF8')) {
-            args.push('SMTPUTF8');
-            this._usingSmtpUtf8 = true;
-        }
-
-        // If the server supports 8BITMIME and the message might contain non-ascii bytes
-        // then append the 8BITMIME keyword to the MAIL FROM command
-        if (this._envelope.use8BitMime && this._supportedExtensions.includes('8BITMIME')) {
-            args.push('BODY=8BITMIME');
-            this._using8BitMime = true;
-        }
-
-        if (this._envelope.size && this._supportedExtensions.includes('SIZE')) {
-            args.push('SIZE=' + this._envelope.size);
-        }
-
-        // If the server supports DSN and the envelope includes an DSN prop
-        // then append DSN params to the MAIL FROM command
-        if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {
-            if (this._envelope.dsn.ret) {
-                args.push('RET=' + shared.encodeXText(this._envelope.dsn.ret));
-            }
-            if (this._envelope.dsn.envid) {
-                args.push('ENVID=' + shared.encodeXText(this._envelope.dsn.envid));
-            }
-        }
-
-        this._sendCommand('MAIL FROM:<' + this._envelope.from + '>' + (args.length ? ' ' + args.join(' ') : ''));
-    }
-
-    _setDsnEnvelope(params) {
-        let ret = (params.ret || params.return || '').toString().toUpperCase() || null;
-        if (ret) {
-            switch (ret) {
-                case 'HDRS':
-                case 'HEADERS':
-                    ret = 'HDRS';
-                    break;
-                case 'FULL':
-                case 'BODY':
-                    ret = 'FULL';
-                    break;
-            }
-        }
-
-        if (ret && !['FULL', 'HDRS'].includes(ret)) {
-            throw new Error('ret: ' + JSON.stringify(ret));
-        }
-
-        let envid = (params.envid || params.id || '').toString() || null;
-
-        let notify = params.notify || null;
-        if (notify) {
-            if (typeof notify === 'string') {
-                notify = notify.split(',');
-            }
-            notify = notify.map(n => n.trim().toUpperCase());
-            let validNotify = ['NEVER', 'SUCCESS', 'FAILURE', 'DELAY'];
-            let invaliNotify = notify.filter(n => !validNotify.includes(n));
-            if (invaliNotify.length || (notify.length > 1 && notify.includes('NEVER'))) {
-                throw new Error('notify: ' + JSON.stringify(notify.join(',')));
-            }
-            notify = notify.join(',');
-        }
-
-        let orcpt = (params.recipient || params.orcpt || '').toString() || null;
-        if (orcpt && orcpt.indexOf(';') < 0) {
-            orcpt = 'rfc822;' + orcpt;
-        }
-
-        return {
-            ret,
-            envid,
-            notify,
-            orcpt
-        };
-    }
-
-    _getDsnRcptToArgs() {
-        let args = [];
-        // If the server supports DSN and the envelope includes an DSN prop
-        // then append DSN params to the RCPT TO command
-        if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {
-            if (this._envelope.dsn.notify) {
-                args.push('NOTIFY=' + shared.encodeXText(this._envelope.dsn.notify));
-            }
-            if (this._envelope.dsn.orcpt) {
-                args.push('ORCPT=' + shared.encodeXText(this._envelope.dsn.orcpt));
-            }
-        }
-        return args.length ? ' ' + args.join(' ') : '';
-    }
-
-    _createSendStream(callback) {
-        let dataStream = new DataStream();
-        let logStream;
-
-        if (this.options.lmtp) {
-            this._envelope.accepted.forEach((recipient, i) => {
-                let final = i === this._envelope.accepted.length - 1;
-                this._responseActions.push(str => {
-                    this._actionLMTPStream(recipient, final, str, callback);
-                });
-            });
-        } else {
-            this._responseActions.push(str => {
-                this._actionSMTPStream(str, callback);
-            });
-        }
-
-        dataStream.pipe(this._socket, {
-            end: false
-        });
-
-        if (this.options.debug) {
-            logStream = new PassThrough();
-            logStream.on('readable', () => {
-                let chunk;
-                while ((chunk = logStream.read())) {
-                    this.logger.debug(
-                        {
-                            tnx: 'message'
-                        },
-                        chunk.toString('binary').replace(/\r?\n$/, '')
-                    );
-                }
-            });
-            dataStream.pipe(logStream);
-        }
-
-        dataStream.once('end', () => {
-            this.logger.info(
-                {
-                    tnx: 'message',
-                    inByteCount: dataStream.inByteCount,
-                    outByteCount: dataStream.outByteCount
-                },
-                '<%s bytes encoded mime message (source size %s bytes)>',
-                dataStream.outByteCount,
-                dataStream.inByteCount
-            );
-        });
-
-        return dataStream;
-    }
-
-    /** ACTIONS **/
-
-    /**
-     * Will be run after the connection is created and the server sends
-     * a greeting. If the incoming message starts with 220 initiate
-     * SMTP session by sending EHLO command
-     *
-     * @param {String} str Message from the server
-     */
-    _actionGreeting(str) {
-        clearTimeout(this._greetingTimeout);
-
-        if (str.substr(0, 3) !== '220') {
-            this._onError(new Error('Invalid greeting. response=' + str), 'EPROTOCOL', str, 'CONN');
-            return;
-        }
-
-        if (this.options.lmtp) {
-            this._responseActions.push(this._actionLHLO);
-            this._sendCommand('LHLO ' + this.name);
-        } else {
-            this._responseActions.push(this._actionEHLO);
-            this._sendCommand('EHLO ' + this.name);
-        }
-    }
-
-    /**
-     * Handles server response for LHLO command. If it yielded in
-     * error, emit 'error', otherwise treat this as an EHLO response
-     *
-     * @param {String} str Message from the server
-     */
-    _actionLHLO(str) {
-        if (str.charAt(0) !== '2') {
-            this._onError(new Error('Invalid LHLO. response=' + str), 'EPROTOCOL', str, 'LHLO');
-            return;
-        }
-
-        this._actionEHLO(str);
-    }
-
-    /**
-     * Handles server response for EHLO command. If it yielded in
-     * error, try HELO instead, otherwise initiate TLS negotiation
-     * if STARTTLS is supported by the server or move into the
-     * authentication phase.
-     *
-     * @param {String} str Message from the server
-     */
-    _actionEHLO(str) {
-        let match;
-
-        if (str.substr(0, 3) === '421') {
-            this._onError(new Error('Server terminates connection. response=' + str), 'ECONNECTION', str, 'EHLO');
-            return;
-        }
-
-        if (str.charAt(0) !== '2') {
-            if (this.options.requireTLS) {
-                this._onError(new Error('EHLO failed but HELO does not support required STARTTLS. response=' + str), 'ECONNECTION', str, 'EHLO');
-                return;
-            }
-
-            // Try HELO instead
-            this._responseActions.push(this._actionHELO);
-            this._sendCommand('HELO ' + this.name);
-            return;
-        }
-
-        this._ehloLines = str
-            .split(/\r?\n/)
-            .map(line => line.replace(/^\d+[ -]/, '').trim())
-            .filter(line => line)
-            .slice(1);
-
-        // Detect if the server supports STARTTLS
-        if (!this.secure && !this.options.ignoreTLS && (/[ -]STARTTLS\b/im.test(str) || this.options.requireTLS)) {
-            this._sendCommand('STARTTLS');
-            this._responseActions.push(this._actionSTARTTLS);
-            return;
-        }
-
-        // Detect if the server supports SMTPUTF8
-        if (/[ -]SMTPUTF8\b/im.test(str)) {
-            this._supportedExtensions.push('SMTPUTF8');
-        }
-
-        // Detect if the server supports DSN
-        if (/[ -]DSN\b/im.test(str)) {
-            this._supportedExtensions.push('DSN');
-        }
-
-        // Detect if the server supports 8BITMIME
-        if (/[ -]8BITMIME\b/im.test(str)) {
-            this._supportedExtensions.push('8BITMIME');
-        }
-
-        // Detect if the server supports PIPELINING
-        if (/[ -]PIPELINING\b/im.test(str)) {
-            this._supportedExtensions.push('PIPELINING');
-        }
-
-        // Detect if the server supports AUTH
-        if (/[ -]AUTH\b/i.test(str)) {
-            this.allowsAuth = true;
-        }
-
-        // Detect if the server supports PLAIN auth
-        if (/[ -]AUTH(?:(\s+|=)[^\n]*\s+|\s+|=)PLAIN/i.test(str)) {
-            this._supportedAuth.push('PLAIN');
-        }
-
-        // Detect if the server supports LOGIN auth
-        if (/[ -]AUTH(?:(\s+|=)[^\n]*\s+|\s+|=)LOGIN/i.test(str)) {
-            this._supportedAuth.push('LOGIN');
-        }
-
-        // Detect if the server supports CRAM-MD5 auth
-        if (/[ -]AUTH(?:(\s+|=)[^\n]*\s+|\s+|=)CRAM-MD5/i.test(str)) {
-            this._supportedAuth.push('CRAM-MD5');
-        }
-
-        // Detect if the server supports XOAUTH2 auth
-        if (/[ -]AUTH(?:(\s+|=)[^\n]*\s+|\s+|=)XOAUTH2/i.test(str)) {
-            this._supportedAuth.push('XOAUTH2');
-        }
-
-        // Detect if the server supports SIZE extensions (and the max allowed size)
-        if ((match = str.match(/[ -]SIZE(?:[ \t]+(\d+))?/im))) {
-            this._supportedExtensions.push('SIZE');
-            this._maxAllowedSize = Number(match[1]) || 0;
-        }
-
-        this.emit('connect');
-    }
-
-    /**
-     * Handles server response for HELO command. If it yielded in
-     * error, emit 'error', otherwise move into the authentication phase.
-     *
-     * @param {String} str Message from the server
-     */
-    _actionHELO(str) {
-        if (str.charAt(0) !== '2') {
-            this._onError(new Error('Invalid HELO. response=' + str), 'EPROTOCOL', str, 'HELO');
-            return;
-        }
-
-        // assume that authentication is enabled (most probably is not though)
-        this.allowsAuth = true;
-
-        this.emit('connect');
-    }
-
-    /**
-     * Handles server response for STARTTLS command. If there's an error
-     * try HELO instead, otherwise initiate TLS upgrade. If the upgrade
-     * succeedes restart the EHLO
-     *
-     * @param {String} str Message from the server
-     */
-    _actionSTARTTLS(str) {
-        if (str.charAt(0) !== '2') {
-            if (this.options.opportunisticTLS) {
-                this.logger.info(
-                    {
-                        tnx: 'smtp'
-                    },
-                    'Failed STARTTLS upgrade, continuing unencrypted'
-                );
-                return this.emit('connect');
-            }
-            this._onError(new Error('Error upgrading connection with STARTTLS'), 'ETLS', str, 'STARTTLS');
-            return;
-        }
-
-        this._upgradeConnection((err, secured) => {
-            if (err) {
-                this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'STARTTLS');
-                return;
-            }
-
-            this.logger.info(
-                {
-                    tnx: 'smtp'
-                },
-                'Connection upgraded with STARTTLS'
-            );
-
-            if (secured) {
-                // restart session
-                if (this.options.lmtp) {
-                    this._responseActions.push(this._actionLHLO);
-                    this._sendCommand('LHLO ' + this.name);
-                } else {
-                    this._responseActions.push(this._actionEHLO);
-                    this._sendCommand('EHLO ' + this.name);
-                }
-            } else {
-                this.emit('connect');
-            }
-        });
-    }
-
-    /**
-     * Handle the response for AUTH LOGIN command. We are expecting
-     * '334 VXNlcm5hbWU6' (base64 for 'Username:'). Data to be sent as
-     * response needs to be base64 encoded username. We do not need
-     * exact match but settle with 334 response in general as some
-     * hosts invalidly use a longer message than VXNlcm5hbWU6
-     *
-     * @param {String} str Message from the server
-     */
-    _actionAUTH_LOGIN_USER(str, callback) {
-        if (!/^334[ -]/.test(str)) {
-            // expecting '334 VXNlcm5hbWU6'
-            callback(this._formatError('Invalid login sequence while waiting for "334 VXNlcm5hbWU6"', 'EAUTH', str, 'AUTH LOGIN'));
-            return;
-        }
-
-        this._responseActions.push(str => {
-            this._actionAUTH_LOGIN_PASS(str, callback);
-        });
-
-        this._sendCommand(Buffer.from(this._auth.credentials.user + '', 'utf-8').toString('base64'));
-    }
-
-    /**
-     * Handle the response for AUTH CRAM-MD5 command. We are expecting
-     * '334 <challenge string>'. Data to be sent as response needs to be
-     * base64 decoded challenge string, MD5 hashed using the password as
-     * a HMAC key, prefixed by the username and a space, and finally all
-     * base64 encoded again.
-     *
-     * @param {String} str Message from the server
-     */
-    _actionAUTH_CRAM_MD5(str, callback) {
-        let challengeMatch = str.match(/^334\s+(.+)$/);
-        let challengeString = '';
-
-        if (!challengeMatch) {
-            return callback(this._formatError('Invalid login sequence while waiting for server challenge string', 'EAUTH', str, 'AUTH CRAM-MD5'));
-        } else {
-            challengeString = challengeMatch[1];
-        }
-
-        // Decode from base64
-        let base64decoded = Buffer.from(challengeString, 'base64').toString('ascii'),
-            hmacMD5 = crypto.createHmac('md5', this._auth.credentials.pass);
-
-        hmacMD5.update(base64decoded);
-
-        let prepended = this._auth.credentials.user + ' ' + hmacMD5.digest('hex');
-
-        this._responseActions.push(str => {
-            this._actionAUTH_CRAM_MD5_PASS(str, callback);
-        });
-
-        this._sendCommand(
-            Buffer.from(prepended).toString('base64'),
-            // hidden hash for logs
-            Buffer.from(this._auth.credentials.user + ' /* secret */').toString('base64')
-        );
-    }
-
-    /**
-     * Handles the response to CRAM-MD5 authentication, if there's no error,
-     * the user can be considered logged in. Start waiting for a message to send
-     *
-     * @param {String} str Message from the server
-     */
-    _actionAUTH_CRAM_MD5_PASS(str, callback) {
-        if (!str.match(/^235\s+/)) {
-            return callback(this._formatError('Invalid login sequence while waiting for "235"', 'EAUTH', str, 'AUTH CRAM-MD5'));
-        }
-
-        this.logger.info(
-            {
-                tnx: 'smtp',
-                username: this._auth.user,
-                action: 'authenticated',
-                method: this._authMethod
-            },
-            'User %s authenticated',
-            JSON.stringify(this._auth.user)
-        );
-        this.authenticated = true;
-        callback(null, true);
-    }
-
-    /**
-     * Handle the response for AUTH LOGIN command. We are expecting
-     * '334 UGFzc3dvcmQ6' (base64 for 'Password:'). Data to be sent as
-     * response needs to be base64 encoded password.
-     *
-     * @param {String} str Message from the server
-     */
-    _actionAUTH_LOGIN_PASS(str, callback) {
-        if (!/^334[ -]/.test(str)) {
-            // expecting '334 UGFzc3dvcmQ6'
-            return callback(this._formatError('Invalid login sequence while waiting for "334 UGFzc3dvcmQ6"', 'EAUTH', str, 'AUTH LOGIN'));
-        }
-
-        this._responseActions.push(str => {
-            this._actionAUTHComplete(str, callback);
-        });
-
-        this._sendCommand(
-            Buffer.from((this._auth.credentials.pass || '').toString(), 'utf-8').toString('base64'),
-            // Hidden pass for logs
-            Buffer.from('/* secret */', 'utf-8').toString('base64')
-        );
-    }
-
-    /**
-     * Handles the response for authentication, if there's no error,
-     * the user can be considered logged in. Start waiting for a message to send
-     *
-     * @param {String} str Message from the server
-     */
-    _actionAUTHComplete(str, isRetry, callback) {
-        if (!callback && typeof isRetry === 'function') {
-            callback = isRetry;
-            isRetry = false;
-        }
-
-        if (str.substr(0, 3) === '334') {
-            this._responseActions.push(str => {
-                if (isRetry || this._authMethod !== 'XOAUTH2') {
-                    this._actionAUTHComplete(str, true, callback);
-                } else {
-                    // fetch a new OAuth2 access token
-                    setImmediate(() => this._handleXOauth2Token(true, callback));
-                }
-            });
-            this._sendCommand('');
-            return;
-        }
-
-        if (str.charAt(0) !== '2') {
-            this.logger.info(
-                {
-                    tnx: 'smtp',
-                    username: this._auth.user,
-                    action: 'authfail',
-                    method: this._authMethod
-                },
-                'User %s failed to authenticate',
-                JSON.stringify(this._auth.user)
-            );
-            return callback(this._formatError('Invalid login', 'EAUTH', str, 'AUTH ' + this._authMethod));
-        }
-
-        this.logger.info(
-            {
-                tnx: 'smtp',
-                username: this._auth.user,
-                action: 'authenticated',
-                method: this._authMethod
-            },
-            'User %s authenticated',
-            JSON.stringify(this._auth.user)
-        );
-        this.authenticated = true;
-        callback(null, true);
-    }
-
-    /**
-     * Handle response for a MAIL FROM: command
-     *
-     * @param {String} str Message from the server
-     */
-    _actionMAIL(str, callback) {
-        let message, curRecipient;
-        if (Number(str.charAt(0)) !== 2) {
-            if (this._usingSmtpUtf8 && /^550 /.test(str) && /[\x80-\uFFFF]/.test(this._envelope.from)) {
-                message = 'Internationalized mailbox name not allowed';
-            } else {
-                message = 'Mail command failed';
-            }
-            return callback(this._formatError(message, 'EENVELOPE', str, 'MAIL FROM'));
-        }
-
-        if (!this._envelope.rcptQueue.length) {
-            return callback(this._formatError('Can\x27t send mail - no recipients defined', 'EENVELOPE', false, 'API'));
-        } else {
-            this._recipientQueue = [];
-
-            if (this._supportedExtensions.includes('PIPELINING')) {
-                while (this._envelope.rcptQueue.length) {
-                    curRecipient = this._envelope.rcptQueue.shift();
-                    this._recipientQueue.push(curRecipient);
-                    this._responseActions.push(str => {
-                        this._actionRCPT(str, callback);
-                    });
-                    this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());
-                }
-            } else {
-                curRecipient = this._envelope.rcptQueue.shift();
-                this._recipientQueue.push(curRecipient);
-                this._responseActions.push(str => {
-                    this._actionRCPT(str, callback);
-                });
-                this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());
-            }
-        }
-    }
-
-    /**
-     * Handle response for a RCPT TO: command
-     *
-     * @param {String} str Message from the server
-     */
-    _actionRCPT(str, callback) {
-        let message,
-            err,
-            curRecipient = this._recipientQueue.shift();
-        if (Number(str.charAt(0)) !== 2) {
-            // this is a soft error
-            if (this._usingSmtpUtf8 && /^553 /.test(str) && /[\x80-\uFFFF]/.test(curRecipient)) {
-                message = 'Internationalized mailbox name not allowed';
-            } else {
-                message = 'Recipient command failed';
-            }
-            this._envelope.rejected.push(curRecipient);
-            // store error for the failed recipient
-            err = this._formatError(message, 'EENVELOPE', str, 'RCPT TO');
-            err.recipient = curRecipient;
-            this._envelope.rejectedErrors.push(err);
-        } else {
-            this._envelope.accepted.push(curRecipient);
-        }
-
-        if (!this._envelope.rcptQueue.length && !this._recipientQueue.length) {
-            if (this._envelope.rejected.length < this._envelope.to.length) {
-                this._responseActions.push(str => {
-                    this._actionDATA(str, callback);
-                });
-                this._sendCommand('DATA');
-            } else {
-                err = this._formatError('Can\x27t send mail - all recipients were rejected', 'EENVELOPE', str, 'RCPT TO');
-                err.rejected = this._envelope.rejected;
-                err.rejectedErrors = this._envelope.rejectedErrors;
-                return callback(err);
-            }
-        } else if (this._envelope.rcptQueue.length) {
-            curRecipient = this._envelope.rcptQueue.shift();
-            this._recipientQueue.push(curRecipient);
-            this._responseActions.push(str => {
-                this._actionRCPT(str, callback);
-            });
-            this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());
-        }
-    }
-
-    /**
-     * Handle response for a DATA command
-     *
-     * @param {String} str Message from the server
-     */
-    _actionDATA(str, callback) {
-        // response should be 354 but according to this issue https://github.com/eleith/emailjs/issues/24
-        // some servers might use 250 instead, so lets check for 2 or 3 as the first digit
-        if (!/^[23]/.test(str)) {
-            return callback(this._formatError('Data command failed', 'EENVELOPE', str, 'DATA'));
-        }
-
-        let response = {
-            accepted: this._envelope.accepted,
-            rejected: this._envelope.rejected
-        };
-
-        if (this._ehloLines && this._ehloLines.length) {
-            response.ehlo = this._ehloLines;
-        }
-
-        if (this._envelope.rejectedErrors.length) {
-            response.rejectedErrors = this._envelope.rejectedErrors;
-        }
-
-        callback(null, response);
-    }
-
-    /**
-     * Handle response for a DATA stream when using SMTP
-     * We expect a single response that defines if the sending succeeded or failed
-     *
-     * @param {String} str Message from the server
-     */
-    _actionSMTPStream(str, callback) {
-        if (Number(str.charAt(0)) !== 2) {
-            // Message failed
-            return callback(this._formatError('Message failed', 'EMESSAGE', str, 'DATA'));
-        } else {
-            // Message sent succesfully
-            return callback(null, str);
-        }
-    }
-
-    /**
-     * Handle response for a DATA stream
-     * We expect a separate response for every recipient. All recipients can either
-     * succeed or fail separately
-     *
-     * @param {String} recipient The recipient this response applies to
-     * @param {Boolean} final Is this the final recipient?
-     * @param {String} str Message from the server
-     */
-    _actionLMTPStream(recipient, final, str, callback) {
-        let err;
-        if (Number(str.charAt(0)) !== 2) {
-            // Message failed
-            err = this._formatError('Message failed for recipient ' + recipient, 'EMESSAGE', str, 'DATA');
-            err.recipient = recipient;
-            this._envelope.rejected.push(recipient);
-            this._envelope.rejectedErrors.push(err);
-            for (let i = 0, len = this._envelope.accepted.length; i < len; i++) {
-                if (this._envelope.accepted[i] === recipient) {
-                    this._envelope.accepted.splice(i, 1);
-                }
-            }
-        }
-        if (final) {
-            return callback(null, str);
-        }
-    }
-
-    _handleXOauth2Token(isRetry, callback) {
-        this._auth.oauth2.getToken(isRetry, (err, accessToken) => {
-            if (err) {
-                this.logger.info(
-                    {
-                        tnx: 'smtp',
-                        username: this._auth.user,
-                        action: 'authfail',
-                        method: this._authMethod
-                    },
-                    'User %s failed to authenticate',
-                    JSON.stringify(this._auth.user)
-                );
-                return callback(this._formatError(err, 'EAUTH', false, 'AUTH XOAUTH2'));
-            }
-            this._responseActions.push(str => {
-                this._actionAUTHComplete(str, isRetry, callback);
-            });
-            this._sendCommand(
-                'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token(accessToken),
-                //  Hidden for logs
-                'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token('/* secret */')
-            );
-        });
-    }
-
-    /**
-     *
-     * @param {string} command
-     * @private
-     */
-    _isDestroyedMessage(command) {
-        if (this._destroyed) {
-            return 'Cannot ' + command + ' - smtp connection is already destroyed.';
-        }
-
-        if (this._socket) {
-            if (this._socket.destroyed) {
-                return 'Cannot ' + command + ' - smtp connection socket is already destroyed.';
-            }
-
-            if (!this._socket.writable) {
-                return 'Cannot ' + command + ' - smtp connection socket is already half-closed.';
-            }
-        }
-    }
-
-    _getHostname() {
-        // defaul hostname is machine hostname or [IP]
-        let defaultHostname;
-        try {
-            defaultHostname = os.hostname() || '';
-        } catch (err) {
-            // fails on windows 7
-            defaultHostname = 'localhost';
-        }
-
-        // ignore if not FQDN
-        if (!defaultHostname || defaultHostname.indexOf('.') < 0) {
-            defaultHostname = '[127.0.0.1]';
-        }
-
-        // IP should be enclosed in []
-        if (defaultHostname.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) {
-            defaultHostname = '[' + defaultHostname + ']';
-        }
-
-        return defaultHostname;
-    }
-}
-
-module.exports = SMTPConnection;
Index: de_modules/nodemailer/lib/smtp-pool/index.js
===================================================================
--- node_modules/nodemailer/lib/smtp-pool/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,648 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events');
-const PoolResource = require('./pool-resource');
-const SMTPConnection = require('../smtp-connection');
-const wellKnown = require('../well-known');
-const shared = require('../shared');
-const packageData = require('../../package.json');
-
-/**
- * Creates a SMTP pool transport object for Nodemailer
- *
- * @constructor
- * @param {Object} options SMTP Connection options
- */
-class SMTPPool extends EventEmitter {
-    constructor(options) {
-        super();
-
-        options = options || {};
-        if (typeof options === 'string') {
-            options = {
-                url: options
-            };
-        }
-
-        let urlData;
-        let service = options.service;
-
-        if (typeof options.getSocket === 'function') {
-            this.getSocket = options.getSocket;
-        }
-
-        if (options.url) {
-            urlData = shared.parseConnectionUrl(options.url);
-            service = service || urlData.service;
-        }
-
-        this.options = shared.assign(
-            false, // create new object
-            options, // regular options
-            urlData, // url options
-            service && wellKnown(service) // wellknown options
-        );
-
-        this.options.maxConnections = this.options.maxConnections || 5;
-        this.options.maxMessages = this.options.maxMessages || 100;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'smtp-pool'
-        });
-
-        // temporary object
-        let connection = new SMTPConnection(this.options);
-
-        this.name = 'SMTP (pool)';
-        this.version = packageData.version + '[client:' + connection.version + ']';
-
-        this._rateLimit = {
-            counter: 0,
-            timeout: null,
-            waiting: [],
-            checkpoint: false,
-            delta: Number(this.options.rateDelta) || 1000,
-            limit: Number(this.options.rateLimit) || 0
-        };
-        this._closed = false;
-        this._queue = [];
-        this._connections = [];
-        this._connectionCounter = 0;
-
-        this.idling = true;
-
-        setImmediate(() => {
-            if (this.idling) {
-                this.emit('idle');
-            }
-        });
-    }
-
-    /**
-     * Placeholder function for creating proxy sockets. This method immediatelly returns
-     * without a socket
-     *
-     * @param {Object} options Connection options
-     * @param {Function} callback Callback function to run with the socket keys
-     */
-    getSocket(options, callback) {
-        // return immediatelly
-        return setImmediate(() => callback(null, false));
-    }
-
-    /**
-     * Queues an e-mail to be sent using the selected settings
-     *
-     * @param {Object} mail Mail object
-     * @param {Function} callback Callback function
-     */
-    send(mail, callback) {
-        if (this._closed) {
-            return false;
-        }
-
-        this._queue.push({
-            mail,
-            requeueAttempts: 0,
-            callback
-        });
-
-        if (this.idling && this._queue.length >= this.options.maxConnections) {
-            this.idling = false;
-        }
-
-        setImmediate(() => this._processMessages());
-
-        return true;
-    }
-
-    /**
-     * Closes all connections in the pool. If there is a message being sent, the connection
-     * is closed later
-     */
-    close() {
-        let connection;
-        let len = this._connections.length;
-        this._closed = true;
-
-        // clear rate limit timer if it exists
-        clearTimeout(this._rateLimit.timeout);
-
-        if (!len && !this._queue.length) {
-            return;
-        }
-
-        // remove all available connections
-        for (let i = len - 1; i >= 0; i--) {
-            if (this._connections[i] && this._connections[i].available) {
-                connection = this._connections[i];
-                connection.close();
-                this.logger.info(
-                    {
-                        tnx: 'connection',
-                        cid: connection.id,
-                        action: 'removed'
-                    },
-                    'Connection #%s removed',
-                    connection.id
-                );
-            }
-        }
-
-        if (len && !this._connections.length) {
-            this.logger.debug(
-                {
-                    tnx: 'connection'
-                },
-                'All connections removed'
-            );
-        }
-
-        if (!this._queue.length) {
-            return;
-        }
-
-        // make sure that entire queue would be cleaned
-        let invokeCallbacks = () => {
-            if (!this._queue.length) {
-                this.logger.debug(
-                    {
-                        tnx: 'connection'
-                    },
-                    'Pending queue entries cleared'
-                );
-                return;
-            }
-            let entry = this._queue.shift();
-            if (entry && typeof entry.callback === 'function') {
-                try {
-                    entry.callback(new Error('Connection pool was closed'));
-                } catch (E) {
-                    this.logger.error(
-                        {
-                            err: E,
-                            tnx: 'callback',
-                            cid: connection.id
-                        },
-                        'Callback error for #%s: %s',
-                        connection.id,
-                        E.message
-                    );
-                }
-            }
-            setImmediate(invokeCallbacks);
-        };
-        setImmediate(invokeCallbacks);
-    }
-
-    /**
-     * Check the queue and available connections. If there is a message to be sent and there is
-     * an available connection, then use this connection to send the mail
-     */
-    _processMessages() {
-        let connection;
-        let i, len;
-
-        // do nothing if already closed
-        if (this._closed) {
-            return;
-        }
-
-        // do nothing if queue is empty
-        if (!this._queue.length) {
-            if (!this.idling) {
-                // no pending jobs
-                this.idling = true;
-                this.emit('idle');
-            }
-            return;
-        }
-
-        // find first available connection
-        for (i = 0, len = this._connections.length; i < len; i++) {
-            if (this._connections[i].available) {
-                connection = this._connections[i];
-                break;
-            }
-        }
-
-        if (!connection && this._connections.length < this.options.maxConnections) {
-            connection = this._createConnection();
-        }
-
-        if (!connection) {
-            // no more free connection slots available
-            this.idling = false;
-            return;
-        }
-
-        // check if there is free space in the processing queue
-        if (!this.idling && this._queue.length < this.options.maxConnections) {
-            this.idling = true;
-            this.emit('idle');
-        }
-
-        let entry = (connection.queueEntry = this._queue.shift());
-        entry.messageId = (connection.queueEntry.mail.message.getHeader('message-id') || '').replace(/[<>\s]/g, '');
-
-        connection.available = false;
-
-        this.logger.debug(
-            {
-                tnx: 'pool',
-                cid: connection.id,
-                messageId: entry.messageId,
-                action: 'assign'
-            },
-            'Assigned message <%s> to #%s (%s)',
-            entry.messageId,
-            connection.id,
-            connection.messages + 1
-        );
-
-        if (this._rateLimit.limit) {
-            this._rateLimit.counter++;
-            if (!this._rateLimit.checkpoint) {
-                this._rateLimit.checkpoint = Date.now();
-            }
-        }
-
-        connection.send(entry.mail, (err, info) => {
-            // only process callback if current handler is not changed
-            if (entry === connection.queueEntry) {
-                try {
-                    entry.callback(err, info);
-                } catch (E) {
-                    this.logger.error(
-                        {
-                            err: E,
-                            tnx: 'callback',
-                            cid: connection.id
-                        },
-                        'Callback error for #%s: %s',
-                        connection.id,
-                        E.message
-                    );
-                }
-                connection.queueEntry = false;
-            }
-        });
-    }
-
-    /**
-     * Creates a new pool resource
-     */
-    _createConnection() {
-        let connection = new PoolResource(this);
-
-        connection.id = ++this._connectionCounter;
-
-        this.logger.info(
-            {
-                tnx: 'pool',
-                cid: connection.id,
-                action: 'conection'
-            },
-            'Created new pool resource #%s',
-            connection.id
-        );
-
-        // resource comes available
-        connection.on('available', () => {
-            this.logger.debug(
-                {
-                    tnx: 'connection',
-                    cid: connection.id,
-                    action: 'available'
-                },
-                'Connection #%s became available',
-                connection.id
-            );
-
-            if (this._closed) {
-                // if already closed run close() that will remove this connections from connections list
-                this.close();
-            } else {
-                // check if there's anything else to send
-                this._processMessages();
-            }
-        });
-
-        // resource is terminated with an error
-        connection.once('error', err => {
-            if (err.code !== 'EMAXLIMIT') {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'pool',
-                        cid: connection.id
-                    },
-                    'Pool Error for #%s: %s',
-                    connection.id,
-                    err.message
-                );
-            } else {
-                this.logger.debug(
-                    {
-                        tnx: 'pool',
-                        cid: connection.id,
-                        action: 'maxlimit'
-                    },
-                    'Max messages limit exchausted for #%s',
-                    connection.id
-                );
-            }
-
-            if (connection.queueEntry) {
-                try {
-                    connection.queueEntry.callback(err);
-                } catch (E) {
-                    this.logger.error(
-                        {
-                            err: E,
-                            tnx: 'callback',
-                            cid: connection.id
-                        },
-                        'Callback error for #%s: %s',
-                        connection.id,
-                        E.message
-                    );
-                }
-                connection.queueEntry = false;
-            }
-
-            // remove the erroneus connection from connections list
-            this._removeConnection(connection);
-
-            this._continueProcessing();
-        });
-
-        connection.once('close', () => {
-            this.logger.info(
-                {
-                    tnx: 'connection',
-                    cid: connection.id,
-                    action: 'closed'
-                },
-                'Connection #%s was closed',
-                connection.id
-            );
-
-            this._removeConnection(connection);
-
-            if (connection.queueEntry) {
-                // If the connection closed when sending, add the message to the queue again
-                // if max number of requeues is not reached yet
-                // Note that we must wait a bit.. because the callback of the 'error' handler might be called
-                // in the next event loop
-                setTimeout(() => {
-                    if (connection.queueEntry) {
-                        if (this._shouldRequeuOnConnectionClose(connection.queueEntry)) {
-                            this._requeueEntryOnConnectionClose(connection);
-                        } else {
-                            this._failDeliveryOnConnectionClose(connection);
-                        }
-                    }
-                    this._continueProcessing();
-                }, 50);
-            } else {
-                this._continueProcessing();
-            }
-        });
-
-        this._connections.push(connection);
-
-        return connection;
-    }
-
-    _shouldRequeuOnConnectionClose(queueEntry) {
-        if (this.options.maxRequeues === undefined || this.options.maxRequeues < 0) {
-            return true;
-        }
-
-        return queueEntry.requeueAttempts < this.options.maxRequeues;
-    }
-
-    _failDeliveryOnConnectionClose(connection) {
-        if (connection.queueEntry && connection.queueEntry.callback) {
-            try {
-                connection.queueEntry.callback(new Error('Reached maximum number of retries after connection was closed'));
-            } catch (E) {
-                this.logger.error(
-                    {
-                        err: E,
-                        tnx: 'callback',
-                        messageId: connection.queueEntry.messageId,
-                        cid: connection.id
-                    },
-                    'Callback error for #%s: %s',
-                    connection.id,
-                    E.message
-                );
-            }
-            connection.queueEntry = false;
-        }
-    }
-
-    _requeueEntryOnConnectionClose(connection) {
-        connection.queueEntry.requeueAttempts = connection.queueEntry.requeueAttempts + 1;
-        this.logger.debug(
-            {
-                tnx: 'pool',
-                cid: connection.id,
-                messageId: connection.queueEntry.messageId,
-                action: 'requeue'
-            },
-            'Re-queued message <%s> for #%s. Attempt: #%s',
-            connection.queueEntry.messageId,
-            connection.id,
-            connection.queueEntry.requeueAttempts
-        );
-        this._queue.unshift(connection.queueEntry);
-        connection.queueEntry = false;
-    }
-
-    /**
-     * Continue to process message if the pool hasn't closed
-     */
-    _continueProcessing() {
-        if (this._closed) {
-            this.close();
-        } else {
-            setTimeout(() => this._processMessages(), 100);
-        }
-    }
-
-    /**
-     * Remove resource from pool
-     *
-     * @param {Object} connection The PoolResource to remove
-     */
-    _removeConnection(connection) {
-        let index = this._connections.indexOf(connection);
-
-        if (index !== -1) {
-            this._connections.splice(index, 1);
-        }
-    }
-
-    /**
-     * Checks if connections have hit current rate limit and if so, queues the availability callback
-     *
-     * @param {Function} callback Callback function to run once rate limiter has been cleared
-     */
-    _checkRateLimit(callback) {
-        if (!this._rateLimit.limit) {
-            return callback();
-        }
-
-        let now = Date.now();
-
-        if (this._rateLimit.counter < this._rateLimit.limit) {
-            return callback();
-        }
-
-        this._rateLimit.waiting.push(callback);
-
-        if (this._rateLimit.checkpoint <= now - this._rateLimit.delta) {
-            return this._clearRateLimit();
-        } else if (!this._rateLimit.timeout) {
-            this._rateLimit.timeout = setTimeout(() => this._clearRateLimit(), this._rateLimit.delta - (now - this._rateLimit.checkpoint));
-            this._rateLimit.checkpoint = now;
-        }
-    }
-
-    /**
-     * Clears current rate limit limitation and runs paused callback
-     */
-    _clearRateLimit() {
-        clearTimeout(this._rateLimit.timeout);
-        this._rateLimit.timeout = null;
-        this._rateLimit.counter = 0;
-        this._rateLimit.checkpoint = false;
-
-        // resume all paused connections
-        while (this._rateLimit.waiting.length) {
-            let cb = this._rateLimit.waiting.shift();
-            setImmediate(cb);
-        }
-    }
-
-    /**
-     * Returns true if there are free slots in the queue
-     */
-    isIdle() {
-        return this.idling;
-    }
-
-    /**
-     * Verifies SMTP configuration
-     *
-     * @param {Function} callback Callback function
-     */
-    verify(callback) {
-        let promise;
-
-        if (!callback) {
-            promise = new Promise((resolve, reject) => {
-                callback = shared.callbackPromise(resolve, reject);
-            });
-        }
-
-        let auth = new PoolResource(this).auth;
-
-        this.getSocket(this.options, (err, socketOptions) => {
-            if (err) {
-                return callback(err);
-            }
-
-            let options = this.options;
-            if (socketOptions && socketOptions.connection) {
-                this.logger.info(
-                    {
-                        tnx: 'proxy',
-                        remoteAddress: socketOptions.connection.remoteAddress,
-                        remotePort: socketOptions.connection.remotePort,
-                        destHost: options.host || '',
-                        destPort: options.port || '',
-                        action: 'connected'
-                    },
-                    'Using proxied socket from %s:%s to %s:%s',
-                    socketOptions.connection.remoteAddress,
-                    socketOptions.connection.remotePort,
-                    options.host || '',
-                    options.port || ''
-                );
-                options = shared.assign(false, options);
-                Object.keys(socketOptions).forEach(key => {
-                    options[key] = socketOptions[key];
-                });
-            }
-
-            let connection = new SMTPConnection(options);
-            let returned = false;
-
-            connection.once('error', err => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                connection.close();
-                return callback(err);
-            });
-
-            connection.once('end', () => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                return callback(new Error('Connection closed'));
-            });
-
-            let finalize = () => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                connection.quit();
-                return callback(null, true);
-            };
-
-            connection.connect(() => {
-                if (returned) {
-                    return;
-                }
-
-                if (auth && (connection.allowsAuth || options.forceAuth)) {
-                    connection.login(auth, err => {
-                        if (returned) {
-                            return;
-                        }
-
-                        if (err) {
-                            returned = true;
-                            connection.close();
-                            return callback(err);
-                        }
-
-                        finalize();
-                    });
-                } else if (!auth && connection.allowsAuth && options.forceAuth) {
-                    let err = new Error('Authentication info was not provided');
-                    err.code = 'NoAuth';
-
-                    returned = true;
-                    connection.close();
-                    return callback(err);
-                } else {
-                    finalize();
-                }
-            });
-        });
-
-        return promise;
-    }
-}
-
-// expose to the world
-module.exports = SMTPPool;
Index: de_modules/nodemailer/lib/smtp-pool/pool-resource.js
===================================================================
--- node_modules/nodemailer/lib/smtp-pool/pool-resource.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,253 +1,0 @@
-'use strict';
-
-const SMTPConnection = require('../smtp-connection');
-const assign = require('../shared').assign;
-const XOAuth2 = require('../xoauth2');
-const EventEmitter = require('events');
-
-/**
- * Creates an element for the pool
- *
- * @constructor
- * @param {Object} options SMTPPool instance
- */
-class PoolResource extends EventEmitter {
-    constructor(pool) {
-        super();
-
-        this.pool = pool;
-        this.options = pool.options;
-        this.logger = this.pool.logger;
-
-        if (this.options.auth) {
-            switch ((this.options.auth.type || '').toString().toUpperCase()) {
-                case 'OAUTH2': {
-                    let oauth2 = new XOAuth2(this.options.auth, this.logger);
-                    oauth2.provisionCallback = (this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;
-                    this.auth = {
-                        type: 'OAUTH2',
-                        user: this.options.auth.user,
-                        oauth2,
-                        method: 'XOAUTH2'
-                    };
-                    oauth2.on('token', token => this.pool.mailer.emit('token', token));
-                    oauth2.on('error', err => this.emit('error', err));
-                    break;
-                }
-                default:
-                    if (!this.options.auth.user && !this.options.auth.pass) {
-                        break;
-                    }
-                    this.auth = {
-                        type: (this.options.auth.type || '').toString().toUpperCase() || 'LOGIN',
-                        user: this.options.auth.user,
-                        credentials: {
-                            user: this.options.auth.user || '',
-                            pass: this.options.auth.pass,
-                            options: this.options.auth.options
-                        },
-                        method: (this.options.auth.method || '').trim().toUpperCase() || this.options.authMethod || false
-                    };
-            }
-        }
-
-        this._connection = false;
-        this._connected = false;
-
-        this.messages = 0;
-        this.available = true;
-    }
-
-    /**
-     * Initiates a connection to the SMTP server
-     *
-     * @param {Function} callback Callback function to run once the connection is established or failed
-     */
-    connect(callback) {
-        this.pool.getSocket(this.options, (err, socketOptions) => {
-            if (err) {
-                return callback(err);
-            }
-
-            let returned = false;
-            let options = this.options;
-            if (socketOptions && socketOptions.connection) {
-                this.logger.info(
-                    {
-                        tnx: 'proxy',
-                        remoteAddress: socketOptions.connection.remoteAddress,
-                        remotePort: socketOptions.connection.remotePort,
-                        destHost: options.host || '',
-                        destPort: options.port || '',
-                        action: 'connected'
-                    },
-                    'Using proxied socket from %s:%s to %s:%s',
-                    socketOptions.connection.remoteAddress,
-                    socketOptions.connection.remotePort,
-                    options.host || '',
-                    options.port || ''
-                );
-
-                options = assign(false, options);
-                Object.keys(socketOptions).forEach(key => {
-                    options[key] = socketOptions[key];
-                });
-            }
-
-            this.connection = new SMTPConnection(options);
-
-            this.connection.once('error', err => {
-                this.emit('error', err);
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                return callback(err);
-            });
-
-            this.connection.once('end', () => {
-                this.close();
-                if (returned) {
-                    return;
-                }
-                returned = true;
-
-                let timer = setTimeout(() => {
-                    if (returned) {
-                        return;
-                    }
-                    // still have not returned, this means we have an unexpected connection close
-                    let err = new Error('Unexpected socket close');
-                    if (this.connection && this.connection._socket && this.connection._socket.upgrading) {
-                        // starttls connection errors
-                        err.code = 'ETLS';
-                    }
-                    callback(err);
-                }, 1000);
-
-                try {
-                    timer.unref();
-                } catch (E) {
-                    // Ignore. Happens on envs with non-node timer implementation
-                }
-            });
-
-            this.connection.connect(() => {
-                if (returned) {
-                    return;
-                }
-
-                if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {
-                    this.connection.login(this.auth, err => {
-                        if (returned) {
-                            return;
-                        }
-                        returned = true;
-
-                        if (err) {
-                            this.connection.close();
-                            this.emit('error', err);
-                            return callback(err);
-                        }
-
-                        this._connected = true;
-                        callback(null, true);
-                    });
-                } else {
-                    returned = true;
-                    this._connected = true;
-                    return callback(null, true);
-                }
-            });
-        });
-    }
-
-    /**
-     * Sends an e-mail to be sent using the selected settings
-     *
-     * @param {Object} mail Mail object
-     * @param {Function} callback Callback function
-     */
-    send(mail, callback) {
-        if (!this._connected) {
-            return this.connect(err => {
-                if (err) {
-                    return callback(err);
-                }
-                return this.send(mail, callback);
-            });
-        }
-
-        let envelope = mail.message.getEnvelope();
-        let messageId = mail.message.messageId();
-
-        let recipients = [].concat(envelope.to || []);
-        if (recipients.length > 3) {
-            recipients.push('...and ' + recipients.splice(2).length + ' more');
-        }
-        this.logger.info(
-            {
-                tnx: 'send',
-                messageId,
-                cid: this.id
-            },
-            'Sending message %s using #%s to <%s>',
-            messageId,
-            this.id,
-            recipients.join(', ')
-        );
-
-        if (mail.data.dsn) {
-            envelope.dsn = mail.data.dsn;
-        }
-
-        this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {
-            this.messages++;
-
-            if (err) {
-                this.connection.close();
-                this.emit('error', err);
-                return callback(err);
-            }
-
-            info.envelope = {
-                from: envelope.from,
-                to: envelope.to
-            };
-            info.messageId = messageId;
-
-            setImmediate(() => {
-                let err;
-                if (this.messages >= this.options.maxMessages) {
-                    err = new Error('Resource exhausted');
-                    err.code = 'EMAXLIMIT';
-                    this.connection.close();
-                    this.emit('error', err);
-                } else {
-                    this.pool._checkRateLimit(() => {
-                        this.available = true;
-                        this.emit('available');
-                    });
-                }
-            });
-
-            callback(null, info);
-        });
-    }
-
-    /**
-     * Closes the connection
-     */
-    close() {
-        this._connected = false;
-        if (this.auth && this.auth.oauth2) {
-            this.auth.oauth2.removeAllListeners();
-        }
-        if (this.connection) {
-            this.connection.close();
-        }
-        this.emit('close');
-    }
-}
-
-module.exports = PoolResource;
Index: de_modules/nodemailer/lib/smtp-transport/index.js
===================================================================
--- node_modules/nodemailer/lib/smtp-transport/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,416 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events');
-const SMTPConnection = require('../smtp-connection');
-const wellKnown = require('../well-known');
-const shared = require('../shared');
-const XOAuth2 = require('../xoauth2');
-const packageData = require('../../package.json');
-
-/**
- * Creates a SMTP transport object for Nodemailer
- *
- * @constructor
- * @param {Object} options Connection options
- */
-class SMTPTransport extends EventEmitter {
-    constructor(options) {
-        super();
-
-        options = options || {};
-
-        if (typeof options === 'string') {
-            options = {
-                url: options
-            };
-        }
-
-        let urlData;
-        let service = options.service;
-
-        if (typeof options.getSocket === 'function') {
-            this.getSocket = options.getSocket;
-        }
-
-        if (options.url) {
-            urlData = shared.parseConnectionUrl(options.url);
-            service = service || urlData.service;
-        }
-
-        this.options = shared.assign(
-            false, // create new object
-            options, // regular options
-            urlData, // url options
-            service && wellKnown(service) // wellknown options
-        );
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'smtp-transport'
-        });
-
-        // temporary object
-        let connection = new SMTPConnection(this.options);
-
-        this.name = 'SMTP';
-        this.version = packageData.version + '[client:' + connection.version + ']';
-
-        if (this.options.auth) {
-            this.auth = this.getAuth({});
-        }
-    }
-
-    /**
-     * Placeholder function for creating proxy sockets. This method immediatelly returns
-     * without a socket
-     *
-     * @param {Object} options Connection options
-     * @param {Function} callback Callback function to run with the socket keys
-     */
-    getSocket(options, callback) {
-        // return immediatelly
-        return setImmediate(() => callback(null, false));
-    }
-
-    getAuth(authOpts) {
-        if (!authOpts) {
-            return this.auth;
-        }
-
-        let hasAuth = false;
-        let authData = {};
-
-        if (this.options.auth && typeof this.options.auth === 'object') {
-            Object.keys(this.options.auth).forEach(key => {
-                hasAuth = true;
-                authData[key] = this.options.auth[key];
-            });
-        }
-
-        if (authOpts && typeof authOpts === 'object') {
-            Object.keys(authOpts).forEach(key => {
-                hasAuth = true;
-                authData[key] = authOpts[key];
-            });
-        }
-
-        if (!hasAuth) {
-            return false;
-        }
-
-        switch ((authData.type || '').toString().toUpperCase()) {
-            case 'OAUTH2': {
-                if (!authData.service && !authData.user) {
-                    return false;
-                }
-                let oauth2 = new XOAuth2(authData, this.logger);
-                oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;
-                oauth2.on('token', token => this.mailer.emit('token', token));
-                oauth2.on('error', err => this.emit('error', err));
-                return {
-                    type: 'OAUTH2',
-                    user: authData.user,
-                    oauth2,
-                    method: 'XOAUTH2'
-                };
-            }
-            default:
-                return {
-                    type: (authData.type || '').toString().toUpperCase() || 'LOGIN',
-                    user: authData.user,
-                    credentials: {
-                        user: authData.user || '',
-                        pass: authData.pass,
-                        options: authData.options
-                    },
-                    method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false
-                };
-        }
-    }
-
-    /**
-     * Sends an e-mail using the selected settings
-     *
-     * @param {Object} mail Mail object
-     * @param {Function} callback Callback function
-     */
-    send(mail, callback) {
-        this.getSocket(this.options, (err, socketOptions) => {
-            if (err) {
-                return callback(err);
-            }
-
-            let returned = false;
-            let options = this.options;
-            if (socketOptions && socketOptions.connection) {
-                this.logger.info(
-                    {
-                        tnx: 'proxy',
-                        remoteAddress: socketOptions.connection.remoteAddress,
-                        remotePort: socketOptions.connection.remotePort,
-                        destHost: options.host || '',
-                        destPort: options.port || '',
-                        action: 'connected'
-                    },
-                    'Using proxied socket from %s:%s to %s:%s',
-                    socketOptions.connection.remoteAddress,
-                    socketOptions.connection.remotePort,
-                    options.host || '',
-                    options.port || ''
-                );
-
-                // only copy options if we need to modify it
-                options = shared.assign(false, options);
-                Object.keys(socketOptions).forEach(key => {
-                    options[key] = socketOptions[key];
-                });
-            }
-
-            let connection = new SMTPConnection(options);
-
-            connection.once('error', err => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                connection.close();
-                return callback(err);
-            });
-
-            connection.once('end', () => {
-                if (returned) {
-                    return;
-                }
-
-                let timer = setTimeout(() => {
-                    if (returned) {
-                        return;
-                    }
-                    returned = true;
-                    // still have not returned, this means we have an unexpected connection close
-                    let err = new Error('Unexpected socket close');
-                    if (connection && connection._socket && connection._socket.upgrading) {
-                        // starttls connection errors
-                        err.code = 'ETLS';
-                    }
-                    callback(err);
-                }, 1000);
-
-                try {
-                    timer.unref();
-                } catch (E) {
-                    // Ignore. Happens on envs with non-node timer implementation
-                }
-            });
-
-            let sendMessage = () => {
-                let envelope = mail.message.getEnvelope();
-                let messageId = mail.message.messageId();
-
-                let recipients = [].concat(envelope.to || []);
-                if (recipients.length > 3) {
-                    recipients.push('...and ' + recipients.splice(2).length + ' more');
-                }
-
-                if (mail.data.dsn) {
-                    envelope.dsn = mail.data.dsn;
-                }
-
-                this.logger.info(
-                    {
-                        tnx: 'send',
-                        messageId
-                    },
-                    'Sending message %s to <%s>',
-                    messageId,
-                    recipients.join(', ')
-                );
-
-                connection.send(envelope, mail.message.createReadStream(), (err, info) => {
-                    returned = true;
-                    connection.close();
-                    if (err) {
-                        this.logger.error(
-                            {
-                                err,
-                                tnx: 'send'
-                            },
-                            'Send error for %s: %s',
-                            messageId,
-                            err.message
-                        );
-                        return callback(err);
-                    }
-                    info.envelope = {
-                        from: envelope.from,
-                        to: envelope.to
-                    };
-                    info.messageId = messageId;
-                    try {
-                        return callback(null, info);
-                    } catch (E) {
-                        this.logger.error(
-                            {
-                                err: E,
-                                tnx: 'callback'
-                            },
-                            'Callback error for %s: %s',
-                            messageId,
-                            E.message
-                        );
-                    }
-                });
-            };
-
-            connection.connect(() => {
-                if (returned) {
-                    return;
-                }
-
-                let auth = this.getAuth(mail.data.auth);
-
-                if (auth && (connection.allowsAuth || options.forceAuth)) {
-                    connection.login(auth, err => {
-                        if (auth && auth !== this.auth && auth.oauth2) {
-                            auth.oauth2.removeAllListeners();
-                        }
-                        if (returned) {
-                            return;
-                        }
-
-                        if (err) {
-                            returned = true;
-                            connection.close();
-                            return callback(err);
-                        }
-
-                        sendMessage();
-                    });
-                } else {
-                    sendMessage();
-                }
-            });
-        });
-    }
-
-    /**
-     * Verifies SMTP configuration
-     *
-     * @param {Function} callback Callback function
-     */
-    verify(callback) {
-        let promise;
-
-        if (!callback) {
-            promise = new Promise((resolve, reject) => {
-                callback = shared.callbackPromise(resolve, reject);
-            });
-        }
-
-        this.getSocket(this.options, (err, socketOptions) => {
-            if (err) {
-                return callback(err);
-            }
-
-            let options = this.options;
-            if (socketOptions && socketOptions.connection) {
-                this.logger.info(
-                    {
-                        tnx: 'proxy',
-                        remoteAddress: socketOptions.connection.remoteAddress,
-                        remotePort: socketOptions.connection.remotePort,
-                        destHost: options.host || '',
-                        destPort: options.port || '',
-                        action: 'connected'
-                    },
-                    'Using proxied socket from %s:%s to %s:%s',
-                    socketOptions.connection.remoteAddress,
-                    socketOptions.connection.remotePort,
-                    options.host || '',
-                    options.port || ''
-                );
-
-                options = shared.assign(false, options);
-                Object.keys(socketOptions).forEach(key => {
-                    options[key] = socketOptions[key];
-                });
-            }
-
-            let connection = new SMTPConnection(options);
-            let returned = false;
-
-            connection.once('error', err => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                connection.close();
-                return callback(err);
-            });
-
-            connection.once('end', () => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                return callback(new Error('Connection closed'));
-            });
-
-            let finalize = () => {
-                if (returned) {
-                    return;
-                }
-                returned = true;
-                connection.quit();
-                return callback(null, true);
-            };
-
-            connection.connect(() => {
-                if (returned) {
-                    return;
-                }
-
-                let authData = this.getAuth({});
-
-                if (authData && (connection.allowsAuth || options.forceAuth)) {
-                    connection.login(authData, err => {
-                        if (returned) {
-                            return;
-                        }
-
-                        if (err) {
-                            returned = true;
-                            connection.close();
-                            return callback(err);
-                        }
-
-                        finalize();
-                    });
-                } else if (!authData && connection.allowsAuth && options.forceAuth) {
-                    let err = new Error('Authentication info was not provided');
-                    err.code = 'NoAuth';
-
-                    returned = true;
-                    connection.close();
-                    return callback(err);
-                } else {
-                    finalize();
-                }
-            });
-        });
-
-        return promise;
-    }
-
-    /**
-     * Releases resources
-     */
-    close() {
-        if (this.auth && this.auth.oauth2) {
-            this.auth.oauth2.removeAllListeners();
-        }
-        this.emit('close');
-    }
-}
-
-// expose to the world
-module.exports = SMTPTransport;
Index: de_modules/nodemailer/lib/stream-transport/index.js
===================================================================
--- node_modules/nodemailer/lib/stream-transport/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,135 +1,0 @@
-'use strict';
-
-const packageData = require('../../package.json');
-const shared = require('../shared');
-
-/**
- * Generates a Transport object for streaming
- *
- * Possible options can be the following:
- *
- *  * **buffer** if true, then returns the message as a Buffer object instead of a stream
- *  * **newline** either 'windows' or 'unix'
- *
- * @constructor
- * @param {Object} optional config parameter
- */
-class StreamTransport {
-    constructor(options) {
-        options = options || {};
-
-        this.options = options || {};
-
-        this.name = 'StreamTransport';
-        this.version = packageData.version;
-
-        this.logger = shared.getLogger(this.options, {
-            component: this.options.component || 'stream-transport'
-        });
-
-        this.winbreak = ['win', 'windows', 'dos', '\r\n'].includes((options.newline || '').toString().toLowerCase());
-    }
-
-    /**
-     * Compiles a mailcomposer message and forwards it to handler that sends it
-     *
-     * @param {Object} emailMessage MailComposer object
-     * @param {Function} callback Callback function to run when the sending is completed
-     */
-    send(mail, done) {
-        // We probably need this in the output
-        mail.message.keepBcc = true;
-
-        let envelope = mail.data.envelope || mail.message.getEnvelope();
-        let messageId = mail.message.messageId();
-
-        let recipients = [].concat(envelope.to || []);
-        if (recipients.length > 3) {
-            recipients.push('...and ' + recipients.splice(2).length + ' more');
-        }
-        this.logger.info(
-            {
-                tnx: 'send',
-                messageId
-            },
-            'Sending message %s to <%s> using %s line breaks',
-            messageId,
-            recipients.join(', '),
-            this.winbreak ? '<CR><LF>' : '<LF>'
-        );
-
-        setImmediate(() => {
-            let stream;
-
-            try {
-                stream = mail.message.createReadStream();
-            } catch (E) {
-                this.logger.error(
-                    {
-                        err: E,
-                        tnx: 'send',
-                        messageId
-                    },
-                    'Creating send stream failed for %s. %s',
-                    messageId,
-                    E.message
-                );
-                return done(E);
-            }
-
-            if (!this.options.buffer) {
-                stream.once('error', err => {
-                    this.logger.error(
-                        {
-                            err,
-                            tnx: 'send',
-                            messageId
-                        },
-                        'Failed creating message for %s. %s',
-                        messageId,
-                        err.message
-                    );
-                });
-                return done(null, {
-                    envelope: mail.data.envelope || mail.message.getEnvelope(),
-                    messageId,
-                    message: stream
-                });
-            }
-
-            let chunks = [];
-            let chunklen = 0;
-            stream.on('readable', () => {
-                let chunk;
-                while ((chunk = stream.read()) !== null) {
-                    chunks.push(chunk);
-                    chunklen += chunk.length;
-                }
-            });
-
-            stream.once('error', err => {
-                this.logger.error(
-                    {
-                        err,
-                        tnx: 'send',
-                        messageId
-                    },
-                    'Failed creating message for %s. %s',
-                    messageId,
-                    err.message
-                );
-                return done(err);
-            });
-
-            stream.on('end', () =>
-                done(null, {
-                    envelope: mail.data.envelope || mail.message.getEnvelope(),
-                    messageId,
-                    message: Buffer.concat(chunks, chunklen)
-                })
-            );
-        });
-    }
-}
-
-module.exports = StreamTransport;
Index: de_modules/nodemailer/lib/well-known/index.js
===================================================================
--- node_modules/nodemailer/lib/well-known/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,47 +1,0 @@
-'use strict';
-
-const services = require('./services.json');
-const normalized = {};
-
-Object.keys(services).forEach(key => {
-    let service = services[key];
-
-    normalized[normalizeKey(key)] = normalizeService(service);
-
-    [].concat(service.aliases || []).forEach(alias => {
-        normalized[normalizeKey(alias)] = normalizeService(service);
-    });
-
-    [].concat(service.domains || []).forEach(domain => {
-        normalized[normalizeKey(domain)] = normalizeService(service);
-    });
-});
-
-function normalizeKey(key) {
-    return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();
-}
-
-function normalizeService(service) {
-    let filter = ['domains', 'aliases'];
-    let response = {};
-
-    Object.keys(service).forEach(key => {
-        if (filter.indexOf(key) < 0) {
-            response[key] = service[key];
-        }
-    });
-
-    return response;
-}
-
-/**
- * Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or
- * an email address (like 'test@googlemail.com').
- *
- * @param {String} key [description]
- * @returns {Object} SMTP config or false if not found
- */
-module.exports = function (key) {
-    key = normalizeKey(key.split('@').pop());
-    return normalized[key] || false;
-};
Index: de_modules/nodemailer/lib/well-known/services.json
===================================================================
--- node_modules/nodemailer/lib/well-known/services.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,370 +1,0 @@
-{
-    "1und1": {
-        "host": "smtp.1und1.de",
-        "port": 465,
-        "secure": true,
-        "authMethod": "LOGIN"
-    },
-    
-    "Aliyun": {
-        "domains": ["aliyun.com"],
-        "host": "smtp.aliyun.com",
-        "port": 465,
-        "secure": true
-    },
-    
-    "AOL": {
-        "domains": ["aol.com"],
-        "host": "smtp.aol.com",
-        "port": 587
-    },
-
-    "Bluewin": {
-        "host": "smtpauths.bluewin.ch",
-        "domains": ["bluewin.ch"],
-        "port": 465
-    },
-
-    "DebugMail": {
-        "host": "debugmail.io",
-        "port": 25
-    },
-
-    "DynectEmail": {
-        "aliases": ["Dynect"],
-        "host": "smtp.dynect.net",
-        "port": 25
-    },
-
-    "Ethereal": {
-        "aliases": ["ethereal.email"],
-        "host": "smtp.ethereal.email",
-        "port": 587
-    },
-
-    "FastMail": {
-        "domains": ["fastmail.fm"],
-        "host": "smtp.fastmail.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "Forward Email": {
-        "aliases": ["FE", "ForwardEmail"],
-        "domains": ["forwardemail.net"],
-        "host": "smtp.forwardemail.net",
-        "port": 465,
-        "secure": true
-    },
-
-    "Feishu Mail": {
-        "aliases": ["Feishu", "FeishuMail"],
-        "domains": ["www.feishu.cn"],
-        "host": "smtp.feishu.cn",
-        "port": 465,
-        "secure": true
-    },
-
-    "GandiMail": {
-        "aliases": ["Gandi", "Gandi Mail"],
-        "host": "mail.gandi.net",
-        "port": 587
-    },
-
-    "Gmail": {
-        "aliases": ["Google Mail"],
-        "domains": ["gmail.com", "googlemail.com"],
-        "host": "smtp.gmail.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "Godaddy": {
-        "host": "smtpout.secureserver.net",
-        "port": 25
-    },
-
-    "GodaddyAsia": {
-        "host": "smtp.asia.secureserver.net",
-        "port": 25
-    },
-
-    "GodaddyEurope": {
-        "host": "smtp.europe.secureserver.net",
-        "port": 25
-    },
-
-    "hot.ee": {
-        "host": "mail.hot.ee"
-    },
-
-    "Hotmail": {
-        "aliases": ["Outlook", "Outlook.com", "Hotmail.com"],
-        "domains": ["hotmail.com", "outlook.com"],
-        "host": "smtp-mail.outlook.com",
-        "port": 587
-    },
-
-    "iCloud": {
-        "aliases": ["Me", "Mac"],
-        "domains": ["me.com", "mac.com"],
-        "host": "smtp.mail.me.com",
-        "port": 587
-    },
-
-    "Infomaniak": {
-        "host": "mail.infomaniak.com",
-        "domains": ["ik.me", "ikmail.com", "etik.com"],
-        "port": 587
-    },
-    "Loopia": {
-        "host": "mailcluster.loopia.se",
-        "port": 465
-    },
-    "mail.ee": {
-        "host": "smtp.mail.ee"
-    },
-
-    "Mail.ru": {
-        "host": "smtp.mail.ru",
-        "port": 465,
-        "secure": true
-    },
-
-    "Mailcatch.app": {
-        "host": "sandbox-smtp.mailcatch.app",
-        "port": 2525
-    },
-
-    "Maildev": {
-        "port": 1025,
-        "ignoreTLS": true
-    },
-
-    "Mailgun": {
-        "host": "smtp.mailgun.org",
-        "port": 465,
-        "secure": true
-    },
-
-    "Mailjet": {
-        "host": "in.mailjet.com",
-        "port": 587
-    },
-
-    "Mailosaur": {
-        "host": "mailosaur.io",
-        "port": 25
-    },
-
-    "Mailtrap": {
-        "host": "live.smtp.mailtrap.io",
-        "port": 587
-    },
-
-    "Mandrill": {
-        "host": "smtp.mandrillapp.com",
-        "port": 587
-    },
-
-    "Naver": {
-        "host": "smtp.naver.com",
-        "port": 587
-    },
-
-    "One": {
-        "host": "send.one.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "OpenMailBox": {
-        "aliases": ["OMB", "openmailbox.org"],
-        "host": "smtp.openmailbox.org",
-        "port": 465,
-        "secure": true
-    },
-
-    "Outlook365": {
-        "host": "smtp.office365.com",
-        "port": 587,
-        "secure": false
-    },
-
-    "OhMySMTP": {
-        "host": "smtp.ohmysmtp.com",
-        "port": 587,
-        "secure": false
-    },
-
-    "Postmark": {
-        "aliases": ["PostmarkApp"],
-        "host": "smtp.postmarkapp.com",
-        "port": 2525
-    },
-
-    "Proton": {
-        "aliases": ["ProtonMail", "Proton.me", "Protonmail.com", "Protonmail.ch"],
-        "domains": ["proton.me", "protonmail.com", "pm.me", "protonmail.ch"],
-        "host": "smtp.protonmail.ch",
-        "port": 587,
-        "requireTLS": true
-    },
-
-    "qiye.aliyun": {
-        "host": "smtp.mxhichina.com",
-        "port": "465",
-        "secure": true
-    },
-
-    "QQ": {
-        "domains": ["qq.com"],
-        "host": "smtp.qq.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "QQex": {
-        "aliases": ["QQ Enterprise"],
-        "domains": ["exmail.qq.com"],
-        "host": "smtp.exmail.qq.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SendCloud": {
-        "host": "smtp.sendcloud.net",
-        "port": 2525
-    },
-
-    "SendGrid": {
-        "host": "smtp.sendgrid.net",
-        "port": 587
-    },
-
-    "SendinBlue": {
-        "aliases": ["Brevo"],
-        "host": "smtp-relay.brevo.com",
-        "port": 587
-    },
-
-    "SendPulse": {
-        "host": "smtp-pulse.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES": {
-        "host": "email-smtp.us-east-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-US-EAST-1": {
-        "host": "email-smtp.us-east-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-US-WEST-2": {
-        "host": "email-smtp.us-west-2.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-EU-WEST-1": {
-        "host": "email-smtp.eu-west-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-SOUTH-1": {
-        "host": "email-smtp.ap-south-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-NORTHEAST-1": {
-        "host": "email-smtp.ap-northeast-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-NORTHEAST-2": {
-        "host": "email-smtp.ap-northeast-2.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-NORTHEAST-3": {
-        "host": "email-smtp.ap-northeast-3.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-SOUTHEAST-1": {
-        "host": "email-smtp.ap-southeast-1.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "SES-AP-SOUTHEAST-2": {
-        "host": "email-smtp.ap-southeast-2.amazonaws.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "Seznam": {
-        "aliases": ["Seznam Email"],
-        "domains": ["seznam.cz", "email.cz", "post.cz", "spoluzaci.cz"],
-        "host": "smtp.seznam.cz",
-        "port": 465,
-        "secure": true
-    },
-
-    "Sparkpost": {
-        "aliases": ["SparkPost", "SparkPost Mail"],
-        "domains": ["sparkpost.com"],
-        "host": "smtp.sparkpostmail.com",
-        "port": 587,
-        "secure": false
-    },
-
-    "Tipimail": {
-        "host": "smtp.tipimail.com",
-        "port": 587
-    },
-
-    "Yahoo": {
-        "domains": ["yahoo.com"],
-        "host": "smtp.mail.yahoo.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "Yandex": {
-        "domains": ["yandex.ru"],
-        "host": "smtp.yandex.ru",
-        "port": 465,
-        "secure": true
-    },
-
-    "Zoho": {
-        "host": "smtp.zoho.com",
-        "port": 465,
-        "secure": true,
-        "authMethod": "LOGIN"
-    },
-
-    "126": {
-        "host": "smtp.126.com",
-        "port": 465,
-        "secure": true
-    },
-
-    "163": {
-        "host": "smtp.163.com",
-        "port": 465,
-        "secure": true
-    }
-}
Index: de_modules/nodemailer/lib/xoauth2/index.js
===================================================================
--- node_modules/nodemailer/lib/xoauth2/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,376 +1,0 @@
-'use strict';
-
-const Stream = require('stream').Stream;
-const nmfetch = require('../fetch');
-const crypto = require('crypto');
-const shared = require('../shared');
-
-/**
- * XOAUTH2 access_token generator for Gmail.
- * Create client ID for web applications in Google API console to use it.
- * See Offline Access for receiving the needed refreshToken for an user
- * https://developers.google.com/accounts/docs/OAuth2WebServer#offline
- *
- * Usage for generating access tokens with a custom method using provisionCallback:
- * provisionCallback(user, renew, callback)
- *   * user is the username to get the token for
- *   * renew is a boolean that if true indicates that existing token failed and needs to be renewed
- *   * callback is the callback to run with (error, accessToken [, expires])
- *     * accessToken is a string
- *     * expires is an optional expire time in milliseconds
- * If provisionCallback is used, then Nodemailer does not try to attempt generating the token by itself
- *
- * @constructor
- * @param {Object} options Client information for token generation
- * @param {String} options.user User e-mail address
- * @param {String} options.clientId Client ID value
- * @param {String} options.clientSecret Client secret value
- * @param {String} options.refreshToken Refresh token for an user
- * @param {String} options.accessUrl Endpoint for token generation, defaults to 'https://accounts.google.com/o/oauth2/token'
- * @param {String} options.accessToken An existing valid accessToken
- * @param {String} options.privateKey Private key for JSW
- * @param {Number} options.expires Optional Access Token expire time in ms
- * @param {Number} options.timeout Optional TTL for Access Token in seconds
- * @param {Function} options.provisionCallback Function to run when a new access token is required
- */
-class XOAuth2 extends Stream {
-    constructor(options, logger) {
-        super();
-
-        this.options = options || {};
-
-        if (options && options.serviceClient) {
-            if (!options.privateKey || !options.user) {
-                setImmediate(() => this.emit('error', new Error('Options "privateKey" and "user" are required for service account!')));
-                return;
-            }
-
-            let serviceRequestTimeout = Math.min(Math.max(Number(this.options.serviceRequestTimeout) || 0, 0), 3600);
-            this.options.serviceRequestTimeout = serviceRequestTimeout || 5 * 60;
-        }
-
-        this.logger = shared.getLogger(
-            {
-                logger
-            },
-            {
-                component: this.options.component || 'OAuth2'
-            }
-        );
-
-        this.provisionCallback = typeof this.options.provisionCallback === 'function' ? this.options.provisionCallback : false;
-
-        this.options.accessUrl = this.options.accessUrl || 'https://accounts.google.com/o/oauth2/token';
-        this.options.customHeaders = this.options.customHeaders || {};
-        this.options.customParams = this.options.customParams || {};
-
-        this.accessToken = this.options.accessToken || false;
-
-        if (this.options.expires && Number(this.options.expires)) {
-            this.expires = this.options.expires;
-        } else {
-            let timeout = Math.max(Number(this.options.timeout) || 0, 0);
-            this.expires = (timeout && Date.now() + timeout * 1000) || 0;
-        }
-    }
-
-    /**
-     * Returns or generates (if previous has expired) a XOAuth2 token
-     *
-     * @param {Boolean} renew If false then use cached access token (if available)
-     * @param {Function} callback Callback function with error object and token string
-     */
-    getToken(renew, callback) {
-        if (!renew && this.accessToken && (!this.expires || this.expires > Date.now())) {
-            return callback(null, this.accessToken);
-        }
-
-        let generateCallback = (...args) => {
-            if (args[0]) {
-                this.logger.error(
-                    {
-                        err: args[0],
-                        tnx: 'OAUTH2',
-                        user: this.options.user,
-                        action: 'renew'
-                    },
-                    'Failed generating new Access Token for %s',
-                    this.options.user
-                );
-            } else {
-                this.logger.info(
-                    {
-                        tnx: 'OAUTH2',
-                        user: this.options.user,
-                        action: 'renew'
-                    },
-                    'Generated new Access Token for %s',
-                    this.options.user
-                );
-            }
-            callback(...args);
-        };
-
-        if (this.provisionCallback) {
-            this.provisionCallback(this.options.user, !!renew, (err, accessToken, expires) => {
-                if (!err && accessToken) {
-                    this.accessToken = accessToken;
-                    this.expires = expires || 0;
-                }
-                generateCallback(err, accessToken);
-            });
-        } else {
-            this.generateToken(generateCallback);
-        }
-    }
-
-    /**
-     * Updates token values
-     *
-     * @param {String} accessToken New access token
-     * @param {Number} timeout Access token lifetime in seconds
-     *
-     * Emits 'token': { user: User email-address, accessToken: the new accessToken, timeout: TTL in seconds}
-     */
-    updateToken(accessToken, timeout) {
-        this.accessToken = accessToken;
-        timeout = Math.max(Number(timeout) || 0, 0);
-        this.expires = (timeout && Date.now() + timeout * 1000) || 0;
-
-        this.emit('token', {
-            user: this.options.user,
-            accessToken: accessToken || '',
-            expires: this.expires
-        });
-    }
-
-    /**
-     * Generates a new XOAuth2 token with the credentials provided at initialization
-     *
-     * @param {Function} callback Callback function with error object and token string
-     */
-    generateToken(callback) {
-        let urlOptions;
-        let loggedUrlOptions;
-        if (this.options.serviceClient) {
-            // service account - https://developers.google.com/identity/protocols/OAuth2ServiceAccount
-            let iat = Math.floor(Date.now() / 1000); // unix time
-            let tokenData = {
-                iss: this.options.serviceClient,
-                scope: this.options.scope || 'https://mail.google.com/',
-                sub: this.options.user,
-                aud: this.options.accessUrl,
-                iat,
-                exp: iat + this.options.serviceRequestTimeout
-            };
-            let token;
-            try {
-                token = this.jwtSignRS256(tokenData);
-            } catch (err) {
-                return callback(new Error('Can\x27t generate token. Check your auth options'));
-            }
-
-            urlOptions = {
-                grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
-                assertion: token
-            };
-
-            loggedUrlOptions = {
-                grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
-                assertion: tokenData
-            };
-        } else {
-            if (!this.options.refreshToken) {
-                return callback(new Error('Can\x27t create new access token for user'));
-            }
-
-            // web app - https://developers.google.com/identity/protocols/OAuth2WebServer
-            urlOptions = {
-                client_id: this.options.clientId || '',
-                client_secret: this.options.clientSecret || '',
-                refresh_token: this.options.refreshToken,
-                grant_type: 'refresh_token'
-            };
-
-            loggedUrlOptions = {
-                client_id: this.options.clientId || '',
-                client_secret: (this.options.clientSecret || '').substr(0, 6) + '...',
-                refresh_token: (this.options.refreshToken || '').substr(0, 6) + '...',
-                grant_type: 'refresh_token'
-            };
-        }
-
-        Object.keys(this.options.customParams).forEach(key => {
-            urlOptions[key] = this.options.customParams[key];
-            loggedUrlOptions[key] = this.options.customParams[key];
-        });
-
-        this.logger.debug(
-            {
-                tnx: 'OAUTH2',
-                user: this.options.user,
-                action: 'generate'
-            },
-            'Requesting token using: %s',
-            JSON.stringify(loggedUrlOptions)
-        );
-
-        this.postRequest(this.options.accessUrl, urlOptions, this.options, (error, body) => {
-            let data;
-
-            if (error) {
-                return callback(error);
-            }
-
-            try {
-                data = JSON.parse(body.toString());
-            } catch (E) {
-                return callback(E);
-            }
-
-            if (!data || typeof data !== 'object') {
-                this.logger.debug(
-                    {
-                        tnx: 'OAUTH2',
-                        user: this.options.user,
-                        action: 'post'
-                    },
-                    'Response: %s',
-                    (body || '').toString()
-                );
-                return callback(new Error('Invalid authentication response'));
-            }
-
-            let logData = {};
-            Object.keys(data).forEach(key => {
-                if (key !== 'access_token') {
-                    logData[key] = data[key];
-                } else {
-                    logData[key] = (data[key] || '').toString().substr(0, 6) + '...';
-                }
-            });
-
-            this.logger.debug(
-                {
-                    tnx: 'OAUTH2',
-                    user: this.options.user,
-                    action: 'post'
-                },
-                'Response: %s',
-                JSON.stringify(logData)
-            );
-
-            if (data.error) {
-                // Error Response : https://tools.ietf.org/html/rfc6749#section-5.2
-                let errorMessage = data.error;
-                if (data.error_description) {
-                    errorMessage += ': ' + data.error_description;
-                }
-                if (data.error_uri) {
-                    errorMessage += ' (' + data.error_uri + ')';
-                }
-                return callback(new Error(errorMessage));
-            }
-
-            if (data.access_token) {
-                this.updateToken(data.access_token, data.expires_in);
-                return callback(null, this.accessToken);
-            }
-
-            return callback(new Error('No access token'));
-        });
-    }
-
-    /**
-     * Converts an access_token and user id into a base64 encoded XOAuth2 token
-     *
-     * @param {String} [accessToken] Access token string
-     * @return {String} Base64 encoded token for IMAP or SMTP login
-     */
-    buildXOAuth2Token(accessToken) {
-        let authData = ['user=' + (this.options.user || ''), 'auth=Bearer ' + (accessToken || this.accessToken), '', ''];
-        return Buffer.from(authData.join('\x01'), 'utf-8').toString('base64');
-    }
-
-    /**
-     * Custom POST request handler.
-     * This is only needed to keep paths short in Windows – usually this module
-     * is a dependency of a dependency and if it tries to require something
-     * like the request module the paths get way too long to handle for Windows.
-     * As we do only a simple POST request we do not actually require complicated
-     * logic support (no redirects, no nothing) anyway.
-     *
-     * @param {String} url Url to POST to
-     * @param {String|Buffer} payload Payload to POST
-     * @param {Function} callback Callback function with (err, buff)
-     */
-    postRequest(url, payload, params, callback) {
-        let returned = false;
-
-        let chunks = [];
-        let chunklen = 0;
-
-        let req = nmfetch(url, {
-            method: 'post',
-            headers: params.customHeaders,
-            body: payload,
-            allowErrorResponse: true
-        });
-
-        req.on('readable', () => {
-            let chunk;
-            while ((chunk = req.read()) !== null) {
-                chunks.push(chunk);
-                chunklen += chunk.length;
-            }
-        });
-
-        req.once('error', err => {
-            if (returned) {
-                return;
-            }
-            returned = true;
-            return callback(err);
-        });
-
-        req.once('end', () => {
-            if (returned) {
-                return;
-            }
-            returned = true;
-            return callback(null, Buffer.concat(chunks, chunklen));
-        });
-    }
-
-    /**
-     * Encodes a buffer or a string into Base64url format
-     *
-     * @param {Buffer|String} data The data to convert
-     * @return {String} The encoded string
-     */
-    toBase64URL(data) {
-        if (typeof data === 'string') {
-            data = Buffer.from(data);
-        }
-
-        return data
-            .toString('base64')
-            .replace(/[=]+/g, '') // remove '='s
-            .replace(/\+/g, '-') // '+' → '-'
-            .replace(/\//g, '_'); // '/' → '_'
-    }
-
-    /**
-     * Creates a JSON Web Token signed with RS256 (SHA256 + RSA)
-     *
-     * @param {Object} payload The payload to include in the generated token
-     * @return {String} The generated and signed token
-     */
-    jwtSignRS256(payload) {
-        payload = ['{"alg":"RS256","typ":"JWT"}', JSON.stringify(payload)].map(val => this.toBase64URL(val)).join('.');
-        let signature = crypto.createSign('RSA-SHA256').update(payload).sign(this.options.privateKey);
-        return payload + '.' + this.toBase64URL(signature);
-    }
-}
-
-module.exports = XOAuth2;
Index: de_modules/nodemailer/package.json
===================================================================
--- node_modules/nodemailer/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-{
-    "name": "nodemailer",
-    "version": "6.10.1",
-    "description": "Easy as cake e-mail sending from your Node.js applications",
-    "main": "lib/nodemailer.js",
-    "scripts": {
-        "test": "node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js",
-        "test:coverage": "c8 node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js",
-        "lint": "eslint .",
-        "update": "rm -rf node_modules/ package-lock.json && ncu -u && npm install"
-    },
-    "repository": {
-        "type": "git",
-        "url": "https://github.com/nodemailer/nodemailer.git"
-    },
-    "keywords": [
-        "Nodemailer"
-    ],
-    "author": "Andris Reinman",
-    "license": "MIT-0",
-    "bugs": {
-        "url": "https://github.com/nodemailer/nodemailer/issues"
-    },
-    "homepage": "https://nodemailer.com/",
-    "devDependencies": {
-        "@aws-sdk/client-ses": "3.731.1",
-        "bunyan": "1.8.15",
-        "c8": "10.1.3",
-        "eslint": "8.57.0",
-        "eslint-config-nodemailer": "1.2.0",
-        "eslint-config-prettier": "9.1.0",
-        "libbase64": "1.3.0",
-        "libmime": "5.3.6",
-        "libqp": "2.1.1",
-        "nodemailer-ntlm-auth": "1.0.4",
-        "proxy": "1.0.2",
-        "proxy-test-server": "1.0.0",
-        "smtp-server": "3.13.6"
-    },
-    "engines": {
-        "node": ">=6.0.0"
-    }
-}
Index: de_modules/nodemon/.prettierrc.json
===================================================================
--- node_modules/nodemon/.prettierrc.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "singleQuote": true
-}
Index: de_modules/nodemon/LICENSE
===================================================================
--- node_modules/nodemon/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2010 - present, Remy Sharp, https://remysharp.com <remy@remysharp.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/nodemon/README.md
===================================================================
--- node_modules/nodemon/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,439 +1,0 @@
-<p align="center">
-  <a href="https://nodemon.io/"><img src="https://user-images.githubusercontent.com/13700/35731649-652807e8-080e-11e8-88fd-1b2f6d553b2d.png" alt="Nodemon Logo"></a>
-</p>
-
-# nodemon
-
-nodemon is a tool that helps develop Node.js based applications by automatically restarting the node application when file changes in the directory are detected.
-
-nodemon does **not** require *any* additional changes to your code or method of development. nodemon is a replacement wrapper for `node`. To use `nodemon`, replace the word `node` on the command line when executing your script.
-
-[![NPM version](https://badge.fury.io/js/nodemon.svg)](https://npmjs.org/package/nodemon)
-[![Backers on Open Collective](https://opencollective.com/nodemon/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/nodemon/sponsors/badge.svg)](#sponsors)
-
-# Installation
-
-Either through cloning with git or by using [npm](http://npmjs.org) (the recommended way):
-
-```bash
-npm install -g nodemon # or using yarn: yarn global add nodemon
-```
-
-And nodemon will be installed globally to your system path.
-
-You can also install nodemon as a development dependency:
-
-```bash
-npm install --save-dev nodemon # or using yarn: yarn add nodemon -D
-```
-
-With a local installation, nodemon will not be available in your system path or you can't use it directly from the command line. Instead, the local installation of nodemon can be run by calling it from within an npm script (such as `npm start`) or using `npx nodemon`.
-
-# Usage
-
-nodemon wraps your application, so you can pass all the arguments you would normally pass to your app:
-
-```bash
-nodemon [your node app]
-```
-
-For CLI options, use the `-h` (or `--help`) argument:
-
-```bash
-nodemon -h
-```
-
-Using nodemon is simple, if my application accepted a host and port as the arguments, I would start it as so:
-
-```bash
-nodemon ./server.js localhost 8080
-```
-
-Any output from this script is prefixed with `[nodemon]`, otherwise all output from your application, errors included, will be echoed out as expected.
-
-You can also pass the `inspect` flag to node through the command line as you would normally:
-
-```bash
-nodemon --inspect ./server.js 80
-```
-
-If you have a `package.json` file for your app, you can omit the main script entirely and nodemon will read the `package.json` for the `main` property and use that value as the app ([ref](https://github.com/remy/nodemon/issues/14)).
-
-nodemon will also search for the `scripts.start` property in `package.json` (as of nodemon 1.1.x).
-
-Also check out the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) or [issues](https://github.com/remy/nodemon/issues) for nodemon.
-
-## Automatic re-running
-
-nodemon was originally written to restart hanging processes such as web servers, but now supports apps that cleanly exit. If your script exits cleanly, nodemon will continue to monitor the directory (or directories) and restart the script if there are any changes.
-
-## Manual restarting
-
-Whilst nodemon is running, if you need to manually restart your application, instead of stopping and restart nodemon, you can type `rs` with a carriage return, and nodemon will restart your process.
-
-## Config files
-
-nodemon supports local and global configuration files. These are usually named `nodemon.json` and can be located in the current working directory or in your home directory. An alternative local configuration file can be specified with the `--config <file>` option.
-
-The specificity is as follows, so that a command line argument will always override the config file settings:
-
-- command line arguments
-- local config
-- global config
-
-A config file can take any of the command line arguments as JSON key values, for example:
-
-```json
-{
-  "verbose": true,
-  "ignore": ["*.test.js", "**/fixtures/**"],
-  "execMap": {
-    "rb": "ruby",
-    "pde": "processing --sketch={{pwd}} --run"
-  }
-}
-```
-
-The above `nodemon.json` file might be my global config so that I have support for ruby files and processing files, and I can run `nodemon demo.pde` and nodemon will automatically know how to run the script even though out of the box support for processing scripts.
-
-A further example of options can be seen in [sample-nodemon.md](https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md)
-
-### package.json
-
-If you want to keep all your package configurations in one place, nodemon supports using `package.json` for configuration.
-Specify the config in the same format as you would for a config file but under `nodemonConfig` in the `package.json` file, for example, take the following `package.json`:
-
-```json
-{
-  "name": "nodemon",
-  "homepage": "http://nodemon.io",
-  "...": "... other standard package.json values",
-  "nodemonConfig": {
-    "ignore": ["**/test/**", "**/docs/**"],
-    "delay": 2500
-  }
-}
-```
-
-Note that if you specify a `--config` file or provide a local `nodemon.json` any `package.json` config is ignored.
-
-*This section needs better documentation, but for now you can also see `nodemon --help config` ([also here](https://github.com/remy/nodemon/blob/master/doc/cli/config.txt))*.
-
-## Using nodemon as a module
-
-Please see [doc/requireable.md](doc/requireable.md)
-
-## Using nodemon as child process
-
-Please see [doc/events.md](doc/events.md#Using_nodemon_as_child_process)
-
-## Running non-node scripts
-
-nodemon can also be used to execute and monitor other programs. nodemon will read the file extension of the script being run and monitor that extension instead of `.js` if there's no `nodemon.json`:
-
-```bash
-nodemon --exec "python -v" ./app.py
-```
-
-Now nodemon will run `app.py` with python in verbose mode (note that if you're not passing args to the exec program, you don't need the quotes), and look for new or modified files with the `.py` extension.
-
-### Default executables
-
-Using the `nodemon.json` config file, you can define your own default executables using the `execMap` property. This is particularly useful if you're working with a language that isn't supported by default by nodemon.
-
-To add support for nodemon to know about the `.pl` extension (for Perl), the `nodemon.json` file would add:
-
-```json
-{
-  "execMap": {
-    "pl": "perl"
-  }
-}
-```
-
-Now running the following, nodemon will know to use `perl` as the executable:
-
-```bash
-nodemon script.pl
-```
-
-It's generally recommended to use the global `nodemon.json` to add your own `execMap` options. However, if there's a common default that's missing, this can be merged in to the project so that nodemon supports it by default, by changing [default.js](https://github.com/remy/nodemon/blob/master/lib/config/defaults.js) and sending a pull request.
-
-## Monitoring multiple directories
-
-By default nodemon monitors the current working directory. If you want to take control of that option, use the `--watch` option to add specific paths:
-
-```bash
-nodemon --watch app --watch libs app/server.js
-```
-
-Now nodemon will only restart if there are changes in the `./app` or `./libs` directory. By default nodemon will traverse sub-directories, so there's no need in explicitly including sub-directories.
-
-Nodemon also supports unix globbing, e.g `--watch './lib/*'`. The globbing pattern must be quoted. For advanced globbing, [see `picomatch` documentation](https://github.com/micromatch/picomatch#advanced-globbing), the library that nodemon uses through `chokidar` (which in turn uses it through `anymatch`).
-
-## Specifying extension watch list
-
-By default, nodemon looks for files with the `.js`, `.mjs`, `.coffee`, `.litcoffee`, and `.json` extensions. If you use the `--exec` option and monitor `app.py` nodemon will monitor files with the extension of `.py`. However, you can specify your own list with the `-e` (or `--ext`) switch like so:
-
-```bash
-nodemon -e js,pug
-```
-
-Now nodemon will restart on any changes to files in the directory (or subdirectories) with the extensions `.js`, `.pug`.
-
-## Ignoring files
-
-By default, nodemon will only restart when a `.js` JavaScript file changes. In some cases you will want to ignore some specific files, directories or file patterns, to prevent nodemon from prematurely restarting your application.
-
-This can be done via the command line:
-
-```bash
-nodemon --ignore lib/ --ignore tests/
-```
-
-Or specific files can be ignored:
-
-```bash
-nodemon --ignore lib/app.js
-```
-
-Patterns can also be ignored (but be sure to quote the arguments):
-
-```bash
-nodemon --ignore 'lib/*.js'
-```
-
-**Important** the ignore rules are patterns matched to the full absolute path, and this determines how many files are monitored. If using a wild card glob pattern, it needs to be used as `**` or omitted entirely. For example, `nodemon --ignore '**/test/**'` will work, whereas `--ignore '*/test/*'` will not.
-
-Note that by default, nodemon will ignore the `.git`, `node_modules`, `bower_components`, `.nyc_output`, `coverage` and `.sass-cache` directories and *add* your ignored patterns to the list. If you want to indeed watch a directory like `node_modules`, you need to [override the underlying default ignore rules](https://github.com/remy/nodemon/blob/master/faq.md#overriding-the-underlying-default-ignore-rules).
-
-## Application isn't restarting
-
-In some networked environments (such as a container running nodemon reading across a mounted drive), you will need to use the `legacyWatch: true` which enables Chokidar's polling.
-
-Via the CLI, use either `--legacy-watch` or `-L` for short:
-
-```bash
-nodemon -L
-```
-
-Though this should be a last resort as it will poll every file it can find.
-
-## Delaying restarting
-
-In some situations, you may want to wait until a number of files have changed. The timeout before checking for new file changes is 1 second. If you're uploading a number of files and it's taking some number of seconds, this could cause your app to restart multiple times unnecessarily.
-
-To add an extra throttle, or delay restarting, use the `--delay` command:
-
-```bash
-nodemon --delay 10 server.js
-```
-
-For more precision, milliseconds can be specified.  Either as a float:
-
-```bash
-nodemon --delay 2.5 server.js
-```
-
-Or using the time specifier (ms):
-
-```bash
-nodemon --delay 2500ms server.js
-```
-
-The delay figure is number of seconds (or milliseconds, if specified) to delay before restarting. So nodemon will only restart your app the given number of seconds after the *last* file change.
-
-If you are setting this value in `nodemon.json`, the value will always be interpreted in milliseconds. E.g., the following are equivalent:
-
-```bash
-nodemon --delay 2.5
-
-{
-  "delay": 2500
-}
-```
-
-## Gracefully reloading down your script
-
-It is possible to have nodemon send any signal that you specify to your application.
-
-```bash
-nodemon --signal SIGHUP server.js
-```
-
-Your application can handle the signal as follows.
-
-```js
-process.on("SIGHUP", function () {
-  reloadSomeConfiguration();
-  process.kill(process.pid, "SIGTERM");
-})
-```
-
-Please note that nodemon will send this signal to every process in the process tree.
-
-If you are using `cluster`, then each workers (as well as the master) will receive the signal. If you wish to terminate all workers on receiving a `SIGHUP`, a common pattern is to catch the `SIGHUP` in the master, and forward `SIGTERM` to all workers, while ensuring that all workers ignore `SIGHUP`.
-
-```js
-if (cluster.isMaster) {
-  process.on("SIGHUP", function () {
-    for (const worker of Object.values(cluster.workers)) {
-      worker.process.kill("SIGTERM");
-    }
-  });
-} else {
-  process.on("SIGHUP", function() {})
-}
-```
-
-## Controlling shutdown of your script
-
-nodemon sends a kill signal to your application when it sees a file update. If you need to clean up on shutdown inside your script you can capture the kill signal and handle it yourself.
-
-The following example will listen once for the `SIGUSR2` signal (used by nodemon to restart), run the clean up process and then kill itself for nodemon to continue control:
-
-```js
-// important to use `on` and not `once` as nodemon can re-send the kill signal
-process.on('SIGUSR2', function () {
-  gracefulShutdown(function () {
-    process.kill(process.pid, 'SIGTERM');
-  });
-});
-```
-
-Note that the `process.kill` is *only* called once your shutdown jobs are complete. Hat tip to [Benjie Gillam](http://www.benjiegillam.com/2011/08/node-js-clean-restart-and-faster-development-with-nodemon/) for writing this technique up.
-
-## Triggering events when nodemon state changes
-
-If you want growl like notifications when nodemon restarts or to trigger an action when an event happens, then you can either `require` nodemon or add event actions to your `nodemon.json` file.
-
-For example, to trigger a notification on a Mac when nodemon restarts, `nodemon.json` looks like this:
-
-```json
-{
-  "events": {
-    "restart": "osascript -e 'display notification \"app restarted\" with title \"nodemon\"'"
-  }
-}
-```
-
-A full list of available events is listed on the [event states wiki](https://github.com/remy/nodemon/wiki/Events#states). Note that you can bind to both states and messages.
-
-## Pipe output to somewhere else
-
-```js
-nodemon({
-  script: ...,
-  stdout: false // important: this tells nodemon not to output to console
-}).on('readable', function() { // the `readable` event indicates that data is ready to pick up
-  this.stdout.pipe(fs.createWriteStream('output.txt'));
-  this.stderr.pipe(fs.createWriteStream('err.txt'));
-});
-```
-
-## Using nodemon in your gulp workflow
-
-Check out the [gulp-nodemon](https://github.com/JacksonGariety/gulp-nodemon) plugin to integrate nodemon with the rest of your project's gulp workflow.
-
-## Using nodemon in your Grunt workflow
-
-Check out the [grunt-nodemon](https://github.com/ChrisWren/grunt-nodemon) plugin to integrate nodemon with the rest of your project's grunt workflow.
-
-## Pronunciation
-
-> nodemon, is it pronounced: node-mon, no-demon or node-e-mon (like pokémon)?
-
-Well...I've been asked this many times before. I like that I've been asked this before. There's been bets as to which one it actually is.
-
-The answer is simple, but possibly frustrating. I'm not saying (how I pronounce it). It's up to you to call it as you like. All answers are correct :)
-
-## Design principles
-
-- Fewer flags is better
-- Works across all platforms
-- Fewer features
-- Let individuals build on top of nodemon
-- Offer all CLI functionality as an API
-- Contributions must have and pass tests
-
-Nodemon is not perfect, and CLI arguments has sprawled beyond where I'm completely happy, but perhaps it can be reduced a little one day.
-
-## FAQ
-
-See the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) and please add your own questions if you think they would help others.
-
-## Backers
-
-Thank you to all [our backers](https://opencollective.com/nodemon#backer)! 🙏
-
-[![nodemon backers](https://opencollective.com/nodemon/backers.svg?width=890)](https://opencollective.com/nodemon#backers)
-
-## Sponsors
-
-Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Sponsor this project today ❤️](https://opencollective.com/nodemon#sponsor)
-
-<div style="overflow: hidden; margin-bottom: 80px;"><!--oc--><a title='Netpositive' data-id='162674' data-tier='1' href='https://najlepsibukmacherzy.pl/ranking-legalnych-bukmacherow/'><img alt='Netpositive' src='https://opencollective-production.s3.us-west-1.amazonaws.com/52acecf0-608a-11eb-b17f-5bca7c67fe7b.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best online casinos not on GamStop in the UK' data-id='243140' data-tier='1' href='https://casino-wise.com/'><img alt='Best online casinos not on GamStop in the UK' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f889d209-a931-4c06-a529-fe1f86c411bf/casino-wise-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='TheCasinoDB' data-id='270835' data-tier='1' href='https://www.thecasinodb.com'><img alt='TheCasinoDB' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/7fbc2acb-ba5c-4a5c-99d2-17e205e9a151/8a0f6204-f303-4129-a498-2263fd21e640.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Goread.io' data-id='320564' data-tier='1' href='https://goread.io/buy-instagram-followers'><img alt='Goread.io' src='https://opencollective-production.s3.us-west-1.amazonaws.com/7d1302a0-0f33-11ed-a094-3dca78aec7cd.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best Australian online casinos. Reviewed by Correct Casinos.' data-id='322445' data-tier='1' href='https://www.correctcasinos.com/australian-online-casinos/'><img alt='Best Australian online casinos. Reviewed by Correct Casinos.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fef95200-1551-11ed-ba3f-410c614877c8.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Website dedicated to finding the best and safest licensed online casinos in India' data-id='342390' data-tier='1' href='https://www.ghotala.com/'><img alt='Website dedicated to finding the best and safest licensed online casinos in India' src='https://opencollective-production.s3.us-west-1.amazonaws.com/75afa9e0-4ac6-11ed-8d6a-fdcc8c0d0736.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='nongamstopcasinos.net' data-id='367236' data-tier='1' href='https://www.pieria.co.uk/'><img alt='nongamstopcasinos.net' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fb8b5ba0-3904-11ed-8516-edd7b7687a36.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy Instagram Likes' data-id='411448' data-tier='1' href='https://poprey.com/'><img alt='Buy Instagram Likes' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fe650970-c21c-11ec-a499-b55e54a794b4.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='OnlineCasinosSpelen' data-id='423738' data-tier='1' href='https://onlinecasinosspelen.com'><img alt='OnlineCasinosSpelen' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/47e87426-6a55-4f69-9fb5-4e5032dc35a8/5d10dd22-320e-47d4-84e6-d144874f1f5f.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Beoordelen van nieuwe online casino&apos;s 2023' data-id='424449' data-tier='1' href='https://Nieuwe-Casinos.net'><img alt='Beoordelen van nieuwe online casino&apos;s 2023' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/b803f279-c2a2-42da-8f05-d23e73cb8b26/aba64d6d-97e8-468c-b598-db08e0a134c5.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='CasinoZonderRegistratie.net - Nederlandse Top Casino&apos;s' data-id='424450' data-tier='1' href='https://casinozonderregistratie.net/'><img alt='CasinoZonderRegistratie.net - Nederlandse Top Casino&apos;s' src='https://opencollective-production.s3.us-west-1.amazonaws.com/aeb624c0-7ae7-11ed-8d0e-bda59436695a.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy real Instagram followers from Twicsy starting at only $2.97. Twicsy has been voted the best site to buy followers from the likes of US Magazine.' data-id='453050' data-tier='1' href='https://twicsy.com/buy-instagram-followers'><img alt='Buy real Instagram followers from Twicsy starting at only $2.97. Twicsy has been voted the best site to buy followers from the likes of US Magazine.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f07b6f83-d0ed-43c6-91ae-ec8fa90512cd/twicsy-followers.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='SocialWick offers the best Instagram Followers in the market. If you are looking to boost your organic growth, buy Instagram followers from SocialWick' data-id='462750' data-tier='1' href='https://www.socialwick.com/instagram/followers'><img alt='SocialWick offers the best Instagram Followers in the market. If you are looking to boost your organic growth, buy Instagram followers from SocialWick' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/4a977a23-f63a-489a-891b-c0eb8cab1cb4/icon.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy Telegram Members' data-id='501897' data-tier='1' href='https://buycheapestfollowers.com/buy-telegram-channel-members'><img alt='Buy Telegram Members' src='https://github-production-user-asset-6210df.s3.amazonaws.com/13700/286696172-747dca05-a1e8-4d93-a9e9-95054d1566df.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We review the entire iGaming industry from A to Z' data-id='504258' data-tier='1' href='https://casinolandia.com'><img alt='We review the entire iGaming industry from A to Z' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/5f858add-77f1-47a2-b577-39eecb299c8c/Logo264.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='CryptoCasinos.online' data-id='525119' data-tier='1' href='https://cryptocasinos.online/'><img alt='CryptoCasinos.online' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/97712948-3b1b-4026-a109-257d879baa23/CryptoCasinos.Online-FBcover18.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='No deposit casino promo Codes 2024 - The best online Casinos websites. No deposit bonus codes, Free Spins and Promo Codes. Stake, Roobet, Jackpotcity and more.' data-id='540890' data-tier='1' href='https://www.ownedcore.com/casino'><img alt='No deposit casino promo Codes 2024 - The best online Casinos websites. No deposit bonus codes, Free Spins and Promo Codes. Stake, Roobet, Jackpotcity and more.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/8bd4b78c-95e2-4c41-b4f4-d7fd6c0e12cd/logo4-e6140c27.webp' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Online casino.' data-id='541128' data-tier='1' href='https://www.fruityking.co.nz'><img alt='Online casino.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/7cde3c6f-052c-41bb-93f0-8be187682791/10e42029-c513-4edd-ac24-a8e41d697a96.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Boost your social media presence effortlessly with top-quality Instagram and TikTok followers and likes.' data-id='579911' data-tier='1' href='https://leofame.com/buy-instagram-followers'><img alt='Boost your social media presence effortlessly with top-quality Instagram and TikTok followers and likes.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/186c0e19-b195-4228-901a-ab1b70d63ee5/WhatsApp%20Image%202024-06-21%20at%203.50.43%20AM.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Social Media Management and all kinds of followers' data-id='587050' data-tier='1' href='https://www.socialfollowers.uk/buy-tiktok-followers/'><img alt='Social Media Management and all kinds of followers' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/8941f043-5d00-4e33-a1fd-f2d27ca54963/Social%20Followers%20Uk%20logo%20black.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Betwinner is an online bookmaker offering sports betting, casino games, and more.' data-id='594768' data-tier='1' href='https://guidebook.betwinner.com/'><img alt='Betwinner is an online bookmaker offering sports betting, casino games, and more.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/82cab29a-7002-4924-83bf-2eecb03d07c4/0x0.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='At Buzzoid, you can buy Instagram followers quickly, safely, and easily with just a few clicks. Rated world&apos;s #1 IG service since 2012.' data-id='602382' data-tier='1' href='https://buzzoid.com/buy-instagram-followers/'><img alt='At Buzzoid, you can buy Instagram followers quickly, safely, and easily with just a few clicks. Rated world&apos;s #1 IG service since 2012.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f77464f7-0457-451a-b29d-8e3b161ce83f/285fbc9f-6461-4393-8942-da62d1bed968.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Zamsino.com' data-id='608094' data-tier='1' href='https://zamsino.com/'><img alt='Zamsino.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/e3e99af5-a024-4d85-8594-8fd22e506bc9/Zamsino.com%20Logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Reviewing and comparing online casinos available to Finnish players. In addition, we publish relevant news and blog posts about the world of iGaming.' data-id='620398' data-tier='1' href='https://uusimmatkasinot.com/'><img alt='Reviewing and comparing online casinos available to Finnish players. In addition, we publish relevant news and blog posts about the world of iGaming.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/d5326d0f-3cde-41f4-b480-78ef8a2fb015/Uusimmatkasinot_head_siteicon.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buzzvoice is your one-stop shop for all your social media marketing needs. With Buzzvoice, you can buy followers, comments, likes, video views and more!' data-id='646075' data-tier='1' href='https://buzzvoice.com/'><img alt='Buzzvoice is your one-stop shop for all your social media marketing needs. With Buzzvoice, you can buy followers, comments, likes, video views and more!' src='https://opencollective-production.s3.us-west-1.amazonaws.com/acd68da0-e71e-11ec-a84e-fd82f80383c1.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='' data-id='648524' data-tier='1' href='https://www.c19.cl/'><img alt='' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/01b96d4c-4852-4499-8c70-e3ec57d0c58c/2024-05-09_17-27%20(1).png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='SocialBoosting: Buy Instagram &amp; TikTok Followers, Likes, Views' data-id='653711' data-tier='1' href='https://www.socialboosting.com/'><img alt='SocialBoosting: Buy Instagram &amp; TikTok Followers, Likes, Views' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/80a54dfd-8952-4851-8cab-dcfa4a8a0a87/favicon.gif' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Ігрові автомати онлайн' data-id='655295' data-tier='1' href='https://casino.ua/casino/slots/'><img alt='Ігрові автомати онлайн' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/3c8fa725-e203-4c57-933c-0a884527fd5b/images.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Kasinohai.com' data-id='673849' data-tier='1' href='https://www.kasinohai.com/nettikasinot'><img alt='Kasinohai.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/ad75f68f-cb97-46f8-8981-bbe81ad6ffc9/51bafb1d-ed66-482f-8a8e-9b7b07d55f96.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Casino Online Chile' data-id='678929' data-tier='1' href='https://www.acee.cl/'><img alt='Casino Online Chile' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/292c66d6-0c5c-40e8-96f0-900dcdeaaf47/acee-casino-chile.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='casino online chile' data-id='709152' data-tier='1' href='https://chilecasinoonline.cl/'><img alt='casino online chile' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/7f3780b2-b7a7-47aa-9837-c01099585495/casino-online-chile-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Vanguard Media évalue les casinos en ligne pour joueurs français, testant les sites en France. Nos classements stricts garantissent des casinos fiables et sûrs.' data-id='723517' data-tier='1' href='https://www.vanguardngr.com/casino/fr/'><img alt='Vanguard Media évalue les casinos en ligne pour joueurs français, testant les sites en France. Nos classements stricts garantissent des casinos fiables et sûrs.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/38065879-ef15-4e67-80a1-bdbb30ecb485/101895f1-ca10-49e3-a297-23a915fb9524.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Bei Releaf erhalten Sie schnell und diskret Ihr Cannabis Rezept online. Unsere Ärzte prüfen Ihre Angaben und stellen bei Eignung das Rezept aus. Anschließend können Sie legal und sicher medizinisches Cannabis über unsere Partnerapotheken kaufen.' data-id='727109' data-tier='1' href='https://releaf.com/de'><img alt='Bei Releaf erhalten Sie schnell und diskret Ihr Cannabis Rezept online. Unsere Ärzte prüfen Ihre Angaben und stellen bei Eignung das Rezept aus. Anschließend können Sie legal und sicher medizinisches Cannabis über unsere Partnerapotheken kaufen.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/b686d646-5029-4b4c-8cab-9645ab2679de/9da596d1-f48a-41ec-947d-a64dd8e7529c.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Analysis of online casinos with the best payouts' data-id='728673' data-tier='1' href='https://payidpokies.bet/'><img alt='Analysis of online casinos with the best payouts' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/854e333b-14ac-48da-9bab-b108deee06ba/payid-pokies-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Download multithreaded HEIC to JPG converter software for Windows 10/11' data-id='751387' data-tier='1' href='https://www.softorbits.net/convert-heic-to-jpeg/'><img alt='Download multithreaded HEIC to JPG converter software for Windows 10/11' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/34c7f097-4c59-4be6-a59c-55af13b0bd10/logo-final-square512.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We specialize in the online gambling industry, helping players access reliable and verified information about the best online casinos and pokies in Australia. Our team tests casinos and games, collects user reviews from Trustpilot, and organizes them in o' data-id='753333' data-tier='1' href='https://au.trustpilot.com/review/bestpayidpokies.net'><img alt='We specialize in the online gambling industry, helping players access reliable and verified information about the best online casinos and pokies in Australia. Our team tests casinos and games, collects user reviews from Trustpilot, and organizes them in o' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/985a0ae7-54c3-4680-8816-bc8d656f7562/payidpokies.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Wolf Winner Casino' data-id='754359' data-tier='1' href='https://www.wolfwinner.fun/en'><img alt='Wolf Winner Casino' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/556e09fb-d232-4c99-9644-9d28e1cfe27b/wolf-winner-casino-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='AUCrazyVegas' data-id='756605' data-tier='1' href='https://au.crazyvegas.com/'><img alt='AUCrazyVegas' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/be59e9fa-a83d-4244-9e74-f54b7f454e14/au.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='iDealeCasinos' data-id='757116' data-tier='1' href='https://idealecasinos.com/'><img alt='iDealeCasinos' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/907841d3-435e-44b4-9684-c33fd8635ece/ideale-casinos-square-white-logo-300.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='' data-id='757154' data-tier='1' href='https://nl.trustpilot.com/review/buitenlandsecasino.vip'><img alt='' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/9465308a-8e44-4606-af5d-5a81a3c6567b/ChatGPT%20Image%20Nov%2015%2C%202025%2C%2002_53_25%20PM.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='BetPokies.co.nz is your New Zealand guide in the world of online gambling. Our site was created by gamblers for gamblers.' data-id='760968' data-tier='1' href='https://nz.trustpilot.com/review/betpokies.co.nz'><img alt='BetPokies.co.nz is your New Zealand guide in the world of online gambling. Our site was created by gamblers for gamblers.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/117c78d0-973e-11ed-b663-5b4207ae3c06.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='one x bet - Arabic betting site' data-id='765806' data-tier='1' href='https://xn----ymcbek6cvgvaq.com/'><img alt='one x bet - Arabic betting site' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/529647a4-6230-4013-bcc5-b5855158c022/ChatGPT%20Image%20Sep%2030%2C%202025%2C%2001_29_18%20PM.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Online Casino Zonder Registratie' data-id='766416' data-tier='1' href='https://nl.trustpilot.com/review/zonderregistratiecasinos.com'><img alt='Online Casino Zonder Registratie' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/cf382ddc-627b-4bd9-8870-43ee28d2a628/casino-zonder-registratie.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We test dozens of casinos every month and select the coolest ones for Australian players. ' data-id='767300' data-tier='1' href='https://au.trustpilot.com/review/payid-casino.net'><img alt='We test dozens of casinos every month and select the coolest ones for Australian players. ' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/ecd8a5f4-fd86-4903-a512-cbfaff35e7ef/payidpokiessites.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy Instagram Followers' data-id='771428' data-tier='1' href='https://www.reddit.com/r/MarketingMentor/comments/1cut7x5/where_to_buy_instagram_followers_likes/'><img alt='Buy Instagram Followers' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/706dc1c9-2c24-4403-ac55-0b498364dc86/BOOST_LOGO_OUTLINE_CMKY_REG_WHITE_on-green-background_MAR19-scaled.webp' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Pokies Reviews' data-id='771618' data-tier='1' href='https://au.trustpilot.com/review/pokiesgambler.com'><img alt='Pokies Reviews' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/a04c9ed0-b1d5-4dbe-a5fd-4cec00567916/pokiesgambler.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy TikTok Comments' data-id='772992' data-tier='1' href='https://buylikesservices.com/buy-tiktok-custom-comments/'><img alt='Buy TikTok Comments' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/1125514e-fc5e-4e1f-a186-a478fa7c3189/6bf0e4e1-f6aa-4d00-a141-f5b2c2642d65.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Mi misión es la educación y transparencia en el mundo de los casinos online' data-id='780847' data-tier='1' href='https://www.educatransparencia.cl/'><img alt='Mi misión es la educación y transparencia en el mundo de los casinos online' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/c034fdcb-1d17-4c83-8105-f3cfa4f874d6/educalogocito.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Spreading knowledge about $ETH' data-id='783771' data-tier='1' href='https://theethereum.wiki'><img alt='Spreading knowledge about $ETH' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/bfce6f44-affd-4acd-94c2-bf33797f1cb2/Screenshot%202026-01-28%20at%2014.19.23.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='' data-id='783792' data-tier='1' href='https://time.now/'><img alt='' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/4cca6170-acb2-4b1a-b85b-7715416237cf/time-now-logo3.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best online sports betting and casino company.' data-id='784673' data-tier='1' href='https://global.fun88.com/'><img alt='Best online sports betting and casino company.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/1688ebca-4984-4b9b-a24d-8fdd1233892f/fun88-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='bestecasinozondercruks' data-id='785087' data-tier='1' href='https://nl.trustpilot.com/review/bestecasinozondercruks.online'><img alt='bestecasinozondercruks' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/4948eca9-abd5-49ea-bb70-1ea6053f8663/ChatGPT%20Image%20Dec%2027%2C%202025%2C%2010_22_47%20PM-min.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best online sports betting company in Thailand.' data-id='787477' data-tier='1' href='https://www.fun88thh.com/th/'><img alt='Best online sports betting company in Thailand.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/bbf7174c-fc01-4ce6-86b5-f621e350969d/fun88-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best online sports betting company in Vietnam.' data-id='787478' data-tier='1' href='https://www.fun88vnu.com/vn/'><img alt='Best online sports betting company in Vietnam.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/ed704e1d-3894-48bb-83e3-6094b2c68a5c/fun88-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We testen elke maand tientallen casino’s en kiezen de beste uit voor Nederlandse spelers.' data-id='787870' data-tier='1' href='https://nl.trustpilot.com/review/scandicasinos.com'><img alt='We testen elke maand tientallen casino’s en kiezen de beste uit voor Nederlandse spelers.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/115ec975-5575-436a-9406-9ef439dd28c0/scandicasinos.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='ThePokies Net' data-id='787930' data-tier='1' href='https://au.trustpilot.com/review/thepokies-au.com'><img alt='ThePokies Net' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/7981d14b-e79a-45a6-91b5-6040b0077e28/pokiesnet-casino.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Aviator Game Online' data-id='789860' data-tier='1' href='https://www.trustpilot.com/review/aviatorplay.top'><img alt='Aviator Game Online' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/b3cf9a31-607e-4d3f-8b86-0726f4323dae/aviatorr.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Plinko Game' data-id='789874' data-tier='1' href='https://www.trustpilot.com/review/plinkoplay.top'><img alt='Plinko Game' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/5e953df9-1876-45b6-9ffc-f2009804935b/plinkoo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a><!--oc-->
-</div>
-
-Please note that links to the sponsors above are not direct endorsements nor affiliated with any of contributors of the nodemon project.
-
-# License
-
-MIT [http://rem.mit-license.org](http://rem.mit-license.org)
Index: de_modules/nodemon/doc/cli/authors.txt
===================================================================
--- node_modules/nodemon/doc/cli/authors.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-
- Remy Sharp - author and maintainer
-    https://github.com/remy
-    https://twitter.com/rem
-
- Contributors: https://github.com/remy/nodemon/graphs/contributors ❤︎
-
- Please help make nodemon better: https://github.com/remy/nodemon/
Index: de_modules/nodemon/doc/cli/config.txt
===================================================================
--- node_modules/nodemon/doc/cli/config.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,44 +1,0 @@
-
-  Typically the options to control nodemon are passed in via the CLI and are
-  listed under: nodemon --help options
-
-  nodemon can also be configured via a local and global config file:
-
-  * $HOME/nodemon.json
-  * $PWD/nodemon.json OR --config <file>
-  * nodemonConfig in package.json
-
-  All config options in the .json file map 1-to-1 with the CLI options, so a
-  config could read as:
-
-    {
-      "ext": "*.pde",
-      "verbose": true,
-      "exec": "processing --sketch=game --run"
-    }
-
-  There are a limited number of variables available in the config (since you
-  could use backticks on the CLI to use a variable, backticks won't work in
-  the .json config).
-
-  * {{pwd}} - the current directory
-  * {{filename}} - the filename you pass to nodemon
-
-  For example:
-
-    {
-      "ext": "*.pde",
-      "verbose": true,
-      "exec": "processing --sketch={{pwd}} --run"
-    }
-
-  The global config file is useful for setting up default executables
-  instead of repeating the same option in each of your local configs:
-
-    {
-      "verbose": true,
-      "execMap": {
-        "rb": "ruby",
-        "pde": "processing --sketch={{pwd}} --run"
-      }
-    }
Index: de_modules/nodemon/doc/cli/help.txt
===================================================================
--- node_modules/nodemon/doc/cli/help.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,29 +1,0 @@
-  Usage: nodemon [options] [script.js] [args]
-
-  Options:
-
-  --config file ............ alternate nodemon.json config file to use
-  -e, --ext ................ extensions to look for, ie. js,pug,hbs.
-  -x, --exec app ........... execute script with "app", ie. -x "python -v".
-  -w, --watch path ......... watch directory "path" or files. use once for
-                             each directory or file to watch.
-  -i, --ignore ............. ignore specific files or directories.
-  -V, --verbose ............ show detail on what is causing restarts.
-  -- <your args> ........... to tell nodemon stop slurping arguments.
-
-  Note: if the script is omitted, nodemon will try to read "main" from
-  package.json and without a nodemon.json, nodemon will monitor .js, .mjs, .coffee,
-  .litcoffee, and .json by default.
-
-  For advanced nodemon configuration use nodemon.json: nodemon --help config
-  See also the sample: https://github.com/remy/nodemon/wiki/Sample-nodemon.json
-
-  Examples:
-
-  $ nodemon server.js
-  $ nodemon -w ../foo server.js apparg1 apparg2
-  $ nodemon --exec python app.py
-  $ nodemon --exec "make build" -e "styl hbs"
-  $ nodemon app.js -- --config # pass config to app.js
-
-  \x1B[1mAll options are documented under: \x1B[4mnodemon --help options\x1B[0m
Index: de_modules/nodemon/doc/cli/logo.txt
===================================================================
--- node_modules/nodemon/doc/cli/logo.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-    ;                                 ;
-    kO.                              x0
-    KMX,          .:x0kc.          'KMN
-    0MMM0:     'oKMMMMMMMXd,     ;OMMMX
-    oMMMMMWKOONMMMMMMMMMMMMMWOOKWMMMMMx
-     OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK.
-    .oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd.
-    KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN
-    KMMMMMMMMMMMMMMW0k0WMMMMMMMMMMMMMMW
-    KMMMMMMMMMMMNk:.    :xNMMMMMMMMMMMW
-    KMMMMMMMMMMK           OMMMMMMMMMMW
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMNc           ;NMMMMMMMMMN
-    KMMMMMW0o'               .lOWMMMMMN
-    KMMKd;                       ,oKMMN
-    kX:                             ,K0
Index: de_modules/nodemon/doc/cli/options.txt
===================================================================
--- node_modules/nodemon/doc/cli/options.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,36 +1,0 @@
-
-Configuration
-  --config <file> .......... alternate nodemon.json config file to use
-  --exitcrash .............. exit on crash, allows nodemon to work with other watchers
-  -i, --ignore ............. ignore specific files or directories
-  --no-colors .............. disable color output
-  --signal <signal> ........ use specified kill signal instead of default (ex. SIGTERM)
-  -w, --watch path ......... watch directory "dir" or files. use once for each
-                             directory or file to watch
-  --no-update-notifier ..... opt-out of update version check
-
-Execution
-  -C, --on-change-only ..... execute script on change only, not startup
-  --cwd <dir> .............. change into <dir> before running the script
-  -e, --ext ................ extensions to look for, ie. "js,pug,hbs"
-  -I, --no-stdin ........... nodemon passes stdin directly to child process
-  --spawn .................. force nodemon to use spawn (over fork) [node only]
-  -x, --exec app ........... execute script with "app", ie. -x "python -v"
-  -- <your args> ........... to tell nodemon stop slurping arguments
-
-Watching
-  -d, --delay n ............ debounce restart for "n" seconds
-  -L, --legacy-watch ....... use polling to watch for changes (typically needed
-                             when watching over a network/Docker)
-  -P, --polling-interval ... combined with -L, milliseconds to poll for (default 100)
-
-Information
-  --dump ................... print full debug configuration
-  -h, --help ............... default help
-  --help <topic> ........... help on a specific feature. Try "--help topics"
-  -q, --quiet .............. minimise nodemon messages to start/stop only
-  -v, --version ............ current nodemon version
-  -V, --verbose ............ show detail on what is causing restarts
-
-
-> Note that any unrecognised arguments are passed to the executing command.
Index: de_modules/nodemon/doc/cli/topics.txt
===================================================================
--- node_modules/nodemon/doc/cli/topics.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-
-  options .................. show all available nodemon options
-  config ................... default config options using nodemon.json
-  authors .................. contributors to this project
-  logo ..................... <3
-  whoami ................... I, AM, NODEMON \o/
-
-  Please support https://github.com/remy/nodemon/
Index: de_modules/nodemon/doc/cli/usage.txt
===================================================================
--- node_modules/nodemon/doc/cli/usage.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-  Usage: nodemon [nodemon options] [script.js] [args]
-
-  See "nodemon --help" for more.
Index: de_modules/nodemon/doc/cli/whoami.txt
===================================================================
--- node_modules/nodemon/doc/cli/whoami.txt	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-__/\\\\\_____/\\\_______/\\\\\_______/\\\\\\\\\\\\_____/\\\\\\\\\\\\\\\__/\\\\____________/\\\\_______/\\\\\_______/\\\\\_____/\\\_
- _\/\\\\\\___\/\\\_____/\\\///\\\____\/\\\////////\\\__\/\\\///////////__\/\\\\\\________/\\\\\\_____/\\\///\\\____\/\\\\\\___\/\\\_
-  _\/\\\/\\\__\/\\\___/\\\/__\///\\\__\/\\\______\//\\\_\/\\\_____________\/\\\//\\\____/\\\//\\\___/\\\/__\///\\\__\/\\\/\\\__\/\\\_
-   _\/\\\//\\\_\/\\\__/\\\______\//\\\_\/\\\_______\/\\\_\/\\\\\\\\\\\_____\/\\\\///\\\/\\\/_\/\\\__/\\\______\//\\\_\/\\\//\\\_\/\\\_
-    _\/\\\\//\\\\/\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/\\\///////______\/\\\__\///\\\/___\/\\\_\/\\\_______\/\\\_\/\\\\//\\\\/\\\_
-     _\/\\\_\//\\\/\\\_\//\\\______/\\\__\/\\\_______\/\\\_\/\\\_____________\/\\\____\///_____\/\\\_\//\\\______/\\\__\/\\\_\//\\\/\\\_
-      _\/\\\__\//\\\\\\__\///\\\__/\\\____\/\\\_______/\\\__\/\\\_____________\/\\\_____________\/\\\__\///\\\__/\\\____\/\\\__\//\\\\\\_
-       _\/\\\___\//\\\\\____\///\\\\\/_____\/\\\\\\\\\\\\/___\/\\\\\\\\\\\\\\\_\/\\\_____________\/\\\____\///\\\\\/_____\/\\\___\//\\\\\_
-        _\///_____\/////_______\/////_______\////////////_____\///////////////__\///______________\///_______\/////_______\///_____\/////__
Index: de_modules/nodemon/index.d.ts
===================================================================
--- node_modules/nodemon/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,124 +1,0 @@
-import type { WatchOptions } from 'chokidar';
-
-export type NodemonEventHandler =
-  | 'start'
-  | 'crash'
-  | 'exit'
-  | 'quit'
-  | 'restart'
-  | 'config:update'
-  | 'log'
-  | 'readable'
-  | 'stdout'
-  | 'stderr';
-
-export type NodemonEventListener = {
-  on(event: 'start' | 'crash' | 'readable', listener: () => void): Nodemon;
-  on(event: 'log', listener: (e: NodemonEventLog) => void): Nodemon;
-  on(event: 'stdout' | 'stderr', listener: (e: string) => void): Nodemon;
-  on(event: 'restart', listener: (files?: string[]) => void): Nodemon;
-  on(event: 'quit', listener: (e?: NodemonEventQuit) => void): Nodemon;
-  on(event: 'exit', listener: (e?: number) => void): Nodemon;
-  on(
-    event: 'config:update',
-    listener: (e?: NodemonEventConfig) => void,
-  ): Nodemon;
-};
-
-export type NodemonEventLog = {
-  /**
-    - detail: what you get with nodemon --verbose.
-    - status: subprocess starting, restarting.
-    - fail: is the subprocess crashing.
-    - error: is a nodemon system error.
-  */
-  type: 'detail' | 'log' | 'status' | 'error' | 'fail';
-  /** the plain text message */
-  message: string;
-  /** contains the terminal escape codes to add colour, plus the "[nodemon]" prefix */
-  colour: string;
-};
-
-export type NodemonEventQuit = 143 | 130;
-
-export type NodemonEventConfig = {
-  run: boolean;
-  system: {
-    cwd: string;
-  };
-  required: boolean;
-  dirs: string[];
-  timeout: number;
-  options: NodemonConfig;
-  lastStarted: number;
-  loaded: string[];
-  load: (
-    settings: NodemonSettings,
-    ready: (config: NodemonEventConfig) => void,
-  ) => void;
-  reset: () => void;
-};
-
-export interface NodemonExecOptions {
-  script: string;
-  scriptPosition?: number;
-  args?: string[];
-  ext?: string; // "js,mjs" etc (should really support an array of strings, but I don't think it does right now)
-  exec?: string; // node, python, etc
-  execArgs?: string[]; // args passed to node, etc,
-  nodeArgs?: string[]; // args passed to node, etc,
-}
-
-export interface NodemonConfig {
-  /** restartable defaults to "rs" as a string the user enters */
-  restartable?: false | string;
-  colours?: boolean;
-  execMap?: { [key: string]: string };
-  ignoreRoot?: string[];
-  watch?: string[];
-  ignore?: string[];
-  stdin?: boolean;
-  runOnChangeOnly?: boolean;
-  verbose?: boolean;
-  signal?: string;
-  stdout?: boolean;
-  watchOptions?: WatchOptions;
-  help?: string;
-  version?: boolean;
-  cwd?: string;
-  dump?: boolean;
-  delay?: number;
-  monitor?: string[];
-  spawn?: boolean;
-  noUpdateNotifier?: boolean;
-  legacyWatch?: boolean;
-  pollingInterval?: number;
-  /** @deprecated as this is "on" by default */
-  js?: boolean;
-  quiet?: boolean;
-  configFile?: string;
-  exitCrash?: boolean;
-  execOptions?: NodemonExecOptions;
-}
-
-export interface NodemonSettings extends NodemonConfig, NodemonExecOptions {
-  events?: Record<string, string>;
-  env?: Record<string, string>;
-}
-
-export type Nodemon = {
-  (settings: NodemonSettings): Nodemon;
-  removeAllListeners(event: NodemonEventHandler): Nodemon;
-  emit(type: NodemonEventHandler, event?: any): Nodemon;
-  reset(callback: Function): Nodemon;
-  restart(): Nodemon;
-  config: NodemonSettings;
-} & NodemonEventListener & {
-    [K in keyof NodemonEventListener as 'addListener']: NodemonEventListener[K];
-  } & {
-    [K in keyof NodemonEventListener as 'once']: NodemonEventListener[K];
-  };
-
-declare const nodemon: Nodemon;
-
-export = nodemon;
Index: de_modules/nodemon/jsconfig.json
===================================================================
--- node_modules/nodemon/jsconfig.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-{
-  "compilerOptions": {
-    "typeRoots": ["./index.d.ts", "./node_modules/@types"],
-    "checkJs": true
-  },
-  "exclude": ["node_modules"]
-}
Index: de_modules/nodemon/lib/cli/index.js
===================================================================
--- node_modules/nodemon/lib/cli/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,49 +1,0 @@
-var parse = require('./parse');
-
-/**
- * Converts a string to command line args, in particular
- * groups together quoted values.
- * This is a utility function to allow calling nodemon as a required
- * library, but with the CLI args passed in (instead of an object).
- *
- * @param  {String} string
- * @return {Array}
- */
-function stringToArgs(string) {
-  var args = [];
-
-  var parts = string.split(' ');
-  var length = parts.length;
-  var i = 0;
-  var open = false;
-  var grouped = '';
-  var lead = '';
-
-  for (; i < length; i++) {
-    lead = parts[i].substring(0, 1);
-    if (lead === '"' || lead === '\'') {
-      open = lead;
-      grouped = parts[i].substring(1);
-    } else if (open && parts[i].slice(-1) === open) {
-      open = false;
-      grouped += ' ' + parts[i].slice(0, -1);
-      args.push(grouped);
-    } else if (open) {
-      grouped += ' ' + parts[i];
-    } else {
-      args.push(parts[i]);
-    }
-  }
-
-  return args;
-}
-
-module.exports = {
-  parse: function (argv) {
-    if (typeof argv === 'string') {
-      argv = stringToArgs(argv);
-    }
-
-    return parse(argv);
-  },
-};
Index: de_modules/nodemon/lib/cli/parse.js
===================================================================
--- node_modules/nodemon/lib/cli/parse.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,230 +1,0 @@
-/*
-
-nodemon is a utility for node, and replaces the use of the executable
-node. So the user calls `nodemon foo.js` instead.
-
-nodemon can be run in a number of ways:
-
-`nodemon` - tries to use package.json#main property to run
-`nodemon` - if no package, looks for index.js
-`nodemon app.js` - runs app.js
-`nodemon --arg app.js --apparg` - eats arg1, and runs app.js with apparg
-`nodemon --apparg` - as above, but passes apparg to package.json#main (or
-  index.js)
-`nodemon --debug app.js
-
-*/
-
-var fs = require('fs');
-var path = require('path');
-var existsSync = fs.existsSync || path.existsSync;
-
-module.exports = parse;
-
-/**
- * Parses the command line arguments `process.argv` and returns the
- * nodemon options, the user script and the executable script.
- *
- * @param  {Array<string> | string} argv full process arguments, including `node` leading arg
- * @return {Object} { options, script, args }
- */
-function parse(argv) {
-  if (typeof argv === 'string') {
-    argv = argv.split(' ');
-  }
-
-  var eat = function (i, args) {
-    if (i <= args.length) {
-      return args.splice(i + 1, 1).pop();
-    }
-  };
-
-  var args = argv.slice(2);
-  var script = null;
-  var nodemonOptions = { scriptPosition: null };
-
-  var nodemonOpt = nodemonOption.bind(null, nodemonOptions);
-  var lookForArgs = true;
-
-  // move forward through the arguments
-  for (var i = 0; i < args.length; i++) {
-    // if the argument looks like a file, then stop eating
-    if (!script) {
-      if (args[i] === '.' || existsSync(args[i])) {
-        script = args.splice(i, 1).pop();
-
-        // we capture the position of the script because we'll reinsert it in
-        // the right place in run.js:command (though I'm not sure we should even
-        // take it out of the array in the first place, but this solves passing
-        // arguments to the exec process for now).
-        nodemonOptions.scriptPosition = i;
-        i--;
-        continue;
-      }
-    }
-
-    if (lookForArgs) {
-      // respect the standard way of saying: hereafter belongs to my script
-      if (args[i] === '--') {
-        args.splice(i, 1);
-        nodemonOptions.scriptPosition = i;
-        // cycle back one argument, as we just ate this one up
-        i--;
-
-        // ignore all further nodemon arguments
-        lookForArgs = false;
-
-        // move to the next iteration
-        continue;
-      }
-
-      if (nodemonOpt(args[i], eat.bind(null, i, args)) !== false) {
-        args.splice(i, 1);
-        // cycle back one argument, as we just ate this one up
-        i--;
-      }
-    }
-  }
-
-  nodemonOptions.script = script;
-  nodemonOptions.args = args;
-
-  return nodemonOptions;
-}
-
-
-/**
- * Given an argument (ie. from process.argv), sets nodemon
- * options and can eat up the argument value
- *
- * @param {import('../..').NodemonSettings} options object that will be updated
- * @param {String} arg current argument from argv
- * @param {Function} eatNext the callback to eat up the next argument in argv
- * @return {Boolean} false if argument was not a nodemon arg
- */
-function nodemonOption(options, arg, eatNext) {
-  // line separation on purpose to help legibility
-  if (arg === '--help' || arg === '-h' || arg === '-?') {
-    var help = eatNext();
-    options.help = help ? help : true;
-  } else
-
-  if (arg === '--version' || arg === '-v') {
-    options.version = true;
-  } else
-
-  if (arg === '--no-update-notifier') {
-    options.noUpdateNotifier = true;
-  } else
-
-  if (arg === '--spawn') {
-    options.spawn = true;
-  } else
-
-  if (arg === '--dump') {
-    options.dump = true;
-  } else
-
-  if (arg === '--verbose' || arg === '-V') {
-    options.verbose = true;
-  } else
-
-  if (arg === '--legacy-watch' || arg === '-L') {
-    options.legacyWatch = true;
-  } else
-
-  if (arg === '--polling-interval' || arg === '-P') {
-    options.pollingInterval = parseInt(eatNext(), 10);
-  } else
-
-  // Depricated as this is "on" by default
-  if (arg === '--js') {
-    options.js = true;
-  } else
-
-  if (arg === '--quiet' || arg === '-q') {
-    options.quiet = true;
-  } else
-
-  if (arg === '--config') {
-    options.configFile = eatNext();
-  } else
-
-  if (arg === '--watch' || arg === '-w') {
-    if (!options.watch) { options.watch = []; }
-    options.watch.push(eatNext());
-  } else
-
-  if (arg === '--ignore' || arg === '-i') {
-    if (!options.ignore) { options.ignore = []; }
-    options.ignore.push(eatNext());
-  } else
-
-  if (arg === '--exitcrash') {
-    options.exitCrash = true;
-  } else
-
-  if (arg === '--delay' || arg === '-d') {
-    options.delay = parseDelay(eatNext());
-  } else
-
-  if (arg === '--exec' || arg === '-x') {
-    options.exec = eatNext();
-  } else
-
-  if (arg === '--no-stdin' || arg === '-I') {
-    options.stdin = false;
-  } else
-
-  if (arg === '--on-change-only' || arg === '-C') {
-    options.runOnChangeOnly = true;
-  } else
-
-  if (arg === '--ext' || arg === '-e') {
-    options.ext = eatNext();
-  } else
-
-  if (arg === '--no-colours' || arg === '--no-colors') {
-    options.colours = false;
-  } else
-
-  if (arg === '--signal' || arg === '-s') {
-    options.signal = eatNext();
-  } else
-
-  if (arg === '--cwd') {
-    options.cwd = eatNext();
-
-    // go ahead and change directory. This is primarily for nodemon tools like
-    // grunt-nodemon - we're doing this early because it will affect where the
-    // user script is searched for.
-    process.chdir(path.resolve(options.cwd));
-  } else {
-
-    // this means we didn't match
-    return false;
-  }
-}
-
-/**
- * Given an argument (ie. from nodemonOption()), will parse and return the
- * equivalent millisecond value or 0 if the argument cannot be parsed
- *
- * @param {String} value argument value given to the --delay option
- * @return {Number} millisecond equivalent of the argument
- */
-function parseDelay(value) {
-  var millisPerSecond = 1000;
-  var millis = 0;
-
-  if (value.match(/^\d*ms$/)) {
-    // Explicitly parse for milliseconds when using ms time specifier
-    millis = parseInt(value, 10);
-  } else {
-    // Otherwise, parse for seconds, with or without time specifier then convert
-    millis = parseFloat(value) * millisPerSecond;
-  }
-
-  return isNaN(millis) ? 0 : millis;
-}
-
Index: de_modules/nodemon/lib/config/command.js
===================================================================
--- node_modules/nodemon/lib/config/command.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-module.exports = command;
-
-/**
- * command constructs the executable command to run in a shell including the
- * user script, the command arguments.
- *
- * @param  {Object} settings Object as:
- *                           { execOptions: {
- *                               exec: String,
- *                               [script: String],
- *                               [scriptPosition: Number],
- *                               [execArgs: Array<string>]
- *                             }
- *                           }
- * @return {Object}          an object with the node executable and the
- *                           arguments to the command
- */
-function command(settings) {
-  var options = settings.execOptions;
-  var executable = options.exec;
-  var args = [];
-
-  // after "executable" go the exec args (like --debug, etc)
-  if (options.execArgs) {
-    [].push.apply(args, options.execArgs);
-  }
-
-  // then goes the user's script arguments
-  if (options.args) {
-    [].push.apply(args, options.args);
-  }
-
-  // after the "executable" goes the user's script
-  if (options.script) {
-    args.splice((options.scriptPosition || 0) +
-      options.execArgs.length, 0, options.script);
-  }
-
-  return {
-    executable: executable,
-    args: args,
-  };
-}
Index: de_modules/nodemon/lib/config/defaults.js
===================================================================
--- node_modules/nodemon/lib/config/defaults.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-var ignoreRoot = require('ignore-by-default').directories();
-
-// default options for config.options
-const defaults = {
-  restartable: 'rs',
-  colours: true,
-  execMap: {
-    py: 'python',
-    rb: 'ruby',
-    ts: 'ts-node',
-    // more can be added here such as ls: lsc - but please ensure it's cross
-    // compatible with linux, mac and windows, or make the default.js
-    // dynamically append the `.cmd` for node based utilities
-  },
-  ignoreRoot: ignoreRoot.map((_) => `**/${_}/**`),
-  watch: ['*.*'],
-  stdin: true,
-  runOnChangeOnly: false,
-  verbose: false,
-  signal: 'SIGUSR2',
-  // 'stdout' refers to the default behaviour of a required nodemon's child,
-  // but also includes stderr. If this is false, data is still dispatched via
-  // nodemon.on('stdout/stderr')
-  stdout: true,
-  watchOptions: {},
-};
-
-const nodeOptions = process.env.NODE_OPTIONS || ''; // ?
-
-if (/--(loader|import)\b/.test(nodeOptions)) {
-  delete defaults.execMap.ts;
-}
-
-module.exports = defaults;
Index: de_modules/nodemon/lib/config/exec.js
===================================================================
--- node_modules/nodemon/lib/config/exec.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,240 +1,0 @@
-const path = require('path');
-const fs = require('fs');
-const existsSync = fs.existsSync;
-const utils = require('../utils');
-
-module.exports = exec;
-module.exports.expandScript = expandScript;
-
-/**
- * Reads the cwd/package.json file and looks to see if it can load a script
- * and possibly an exec first from package.main, then package.start.
- *
- * @return {Object} exec & script if found
- */
-function execFromPackage() {
-  // doing a try/catch because we can't use the path.exist callback pattern
-  // or we could, but the code would get messy, so this will do exactly
-  // what we're after - if the file doesn't exist, it'll throw.
-  try {
-    // note: this isn't nodemon's package, it's the user's cwd package
-    var pkg = require(path.join(process.cwd(), 'package.json'));
-    if (pkg.main !== undefined) {
-      // no app found to run - so give them a tip and get the feck out
-      return { exec: null, script: pkg.main };
-    }
-
-    if (pkg.scripts && pkg.scripts.start) {
-      const parts = pkg.scripts.start.split(' ');
-
-      // fixes a loop issue where the script repeats over and over #2258
-      if (parts.includes('nodemon')) {
-        return null;
-      }
-      return { exec: pkg.scripts.start };
-    }
-  } catch (e) {}
-
-  return null;
-}
-
-function replace(map, str) {
-  var re = new RegExp('{{(' + Object.keys(map).join('|') + ')}}', 'g');
-  return str.replace(re, function (all, m) {
-    return map[m] || all || '';
-  });
-}
-
-function expandScript(script, ext) {
-  if (!ext) {
-    ext = '.js';
-  }
-  if (script.indexOf(ext) !== -1) {
-    return script;
-  }
-
-  if (existsSync(path.resolve(script))) {
-    return script;
-  }
-
-  if (existsSync(path.resolve(script + ext))) {
-    return script + ext;
-  }
-
-  return script;
-}
-
-/**
- * Discovers all the options required to run the script
- * and if a custom exec has been passed in, then it will
- * also try to work out what extensions to monitor and
- * whether there's a special way of running that script.
- *
- * @param  {Object} nodemonOptions
- * @param  {Object} execMap
- * @return {Object} new and updated version of nodemonOptions
- */
-function exec(nodemonOptions, execMap) {
-  if (!execMap) {
-    execMap = {};
-  }
-
-  var options = utils.clone(nodemonOptions || {});
-  var script;
-
-  // if there's no script passed, try to get it from the first argument
-  if (!options.script && (options.args || []).length) {
-    script = expandScript(
-      options.args[0],
-      options.ext && '.' + (options.ext || 'js').split(',')[0]
-    );
-
-    // if the script was found, shift it off our args
-    if (script !== options.args[0]) {
-      options.script = script;
-      options.args.shift();
-    }
-  }
-
-  // if there's no exec found yet, then try to read it from the local
-  // package.json this logic used to sit in the cli/parse, but actually the cli
-  // should be parsed first, then the user options (via nodemon.json) then
-  // finally default down to pot shots at the directory via package.json
-  if (!options.exec && !options.script) {
-    var found = execFromPackage();
-    if (found !== null) {
-      if (found.exec) {
-        options.exec = found.exec;
-      }
-      if (!options.script) {
-        options.script = found.script;
-      }
-      if (Array.isArray(options.args) && options.scriptPosition === null) {
-        options.scriptPosition = options.args.length;
-      }
-    }
-  }
-
-  // var options = utils.clone(nodemonOptions || {});
-  script = path.basename(options.script || '');
-
-  var scriptExt = path.extname(script).slice(1);
-
-  var extension = options.ext;
-  if (extension === undefined) {
-    var isJS = scriptExt === 'js' || scriptExt === 'mjs' || scriptExt === 'cjs';
-    extension = isJS || !scriptExt ? 'js,mjs,cjs' : scriptExt;
-    extension += ',json'; // Always watch JSON files
-  }
-
-  var execDefined = !!options.exec;
-
-  // allows the user to simplify cli usage:
-  // https://github.com/remy/nodemon/issues/195
-  // but always give preference to the user defined argument
-  if (!options.exec && execMap[scriptExt] !== undefined) {
-    options.exec = execMap[scriptExt];
-    execDefined = true;
-  }
-
-  options.execArgs = nodemonOptions.execArgs || [];
-
-  if (Array.isArray(options.exec)) {
-    options.execArgs = options.exec;
-    options.exec = options.execArgs.shift();
-  }
-
-  if (options.exec === undefined) {
-    options.exec = 'node';
-  } else {
-    // allow variable substitution for {{filename}} and {{pwd}}
-    var substitution = replace.bind(null, {
-      filename: options.script,
-      pwd: process.cwd(),
-    });
-
-    var newExec = substitution(options.exec);
-    if (
-      newExec !== options.exec &&
-      options.exec.indexOf('{{filename}}') !== -1
-    ) {
-      options.script = null;
-    }
-    options.exec = newExec;
-
-    var newExecArgs = options.execArgs.map(substitution);
-    if (newExecArgs.join('') !== options.execArgs.join('')) {
-      options.execArgs = newExecArgs;
-      delete options.script;
-    }
-  }
-
-  if (options.exec === 'node' && options.nodeArgs && options.nodeArgs.length) {
-    options.execArgs = options.execArgs.concat(options.nodeArgs);
-  }
-
-  // note: indexOf('coffee') handles both .coffee and .litcoffee
-  if (
-    !execDefined &&
-    options.exec === 'node' &&
-    scriptExt.indexOf('coffee') !== -1
-  ) {
-    options.exec = 'coffee';
-
-    // we need to get execArgs set before the script
-    // for example, in `nodemon --debug my-script.coffee --my-flag`, debug is an
-    // execArg, while my-flag is a script arg
-    var leadingArgs = (options.args || []).splice(0, options.scriptPosition);
-    options.execArgs = options.execArgs.concat(leadingArgs);
-    options.scriptPosition = 0;
-
-    if (options.execArgs.length > 0) {
-      // because this is the coffee executable, we need to combine the exec args
-      // into a single argument after the nodejs flag
-      options.execArgs = ['--nodejs', options.execArgs.join(' ')];
-    }
-  }
-
-  if (options.exec === 'coffee') {
-    // don't override user specified extension tracking
-    if (options.ext === undefined) {
-      if (extension) {
-        extension += ',';
-      }
-      extension += 'coffee,litcoffee';
-    }
-
-    // because windows can't find 'coffee', it needs the real file 'coffee.cmd'
-    if (utils.isWindows) {
-      options.exec += '.cmd';
-    }
-  }
-
-  // allow users to make a mistake on the extension to monitor
-  // converts .js, pug => js,pug
-  // BIG NOTE: user can't do this: nodemon -e *.js
-  // because the terminal will automatically expand the glob against
-  // the file system :(
-  extension = (extension.match(/[^,*\s]+/g) || [])
-    .map((ext) => ext.replace(/^\./, ''))
-    .join(',');
-
-  options.ext = extension;
-
-  if (options.script) {
-    options.script = expandScript(
-      options.script,
-      extension && '.' + extension.split(',')[0]
-    );
-  }
-
-  options.env = {};
-  // make sure it's an object (and since we don't have )
-  if ({}.toString.apply(nodemonOptions.env) === '[object Object]') {
-    options.env = utils.clone(nodemonOptions.env);
-  } else if (nodemonOptions.env !== undefined) {
-    throw new Error('nodemon env values must be an object: { PORT: 8000 }');
-  }
-
-  return options;
-}
Index: de_modules/nodemon/lib/config/index.js
===================================================================
--- node_modules/nodemon/lib/config/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,93 +1,0 @@
-/**
- * Manages the internal config of nodemon, checking for the state of support
- * with fs.watch, how nodemon can watch files (using find or fs methods).
- *
- * This is *not* the user's config.
- */
-var debug = require('debug')('nodemon');
-var load = require('./load');
-var rules = require('../rules');
-var utils = require('../utils');
-var pinVersion = require('../version').pin;
-var command = require('./command');
-var rulesToMonitor = require('../monitor/match').rulesToMonitor;
-var bus = utils.bus;
-
-function reset() {
-  rules.reset();
-
-  config.dirs = [];
-  config.options = { ignore: [], watch: [], monitor: [] };
-  config.lastStarted = 0;
-  config.loaded = [];
-}
-
-var config = {
-  run: false,
-  system: {
-    cwd: process.cwd(),
-  },
-  required: false,
-  dirs: [],
-  timeout: 1000,
-  options: {},
-};
-
-/**
- * Take user defined settings, then detect the local machine capability, then
- * look for local and global nodemon.json files and merge together the final
- * settings with the config for nodemon.
- *
- * @param  {Object} settings user defined settings for nodemon (typically on
- *  the cli)
- * @param  {Function} ready callback fired once the config is loaded
- */
-config.load = function (settings, ready) {
-  reset();
-  var config = this;
-  load(settings, config.options, config, function (options) {
-    config.options = options;
-
-    if (options.watch.length === 0) {
-      // this is to catch when the watch is left blank
-      options.watch.push('*.*');
-    }
-
-    if (options['watch_interval']) { // jshint ignore:line
-      options.watchInterval = options['watch_interval']; // jshint ignore:line
-    }
-
-    config.watchInterval = options.watchInterval || null;
-    if (options.signal) {
-      config.signal = options.signal;
-    }
-
-    var cmd = command(config.options);
-    config.command = {
-      raw: cmd,
-      string: utils.stringify(cmd.executable, cmd.args),
-    };
-
-    // now run automatic checks on system adding to the config object
-    options.monitor = rulesToMonitor(options.watch, options.ignore, config);
-
-    var cwd = process.cwd();
-    debug('config: dirs', config.dirs);
-    if (config.dirs.length === 0) {
-      config.dirs.unshift(cwd);
-    }
-
-    bus.emit('config:update', config);
-    pinVersion().then(function () {
-      ready(config);
-    }).catch(e => {
-      // this doesn't help testing, but does give exposure on syntax errors
-      console.error(e.stack);
-      setTimeout(() => { throw e; }, 0);
-    });
-  });
-};
-
-config.reset = reset;
-
-module.exports = config;
Index: de_modules/nodemon/lib/config/load.js
===================================================================
--- node_modules/nodemon/lib/config/load.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,225 +1,0 @@
-var debug = require('debug')('nodemon');
-var fs = require('fs');
-var path = require('path');
-var exists = fs.exists || path.exists;
-var utils = require('../utils');
-var rules = require('../rules');
-var parse = require('../rules/parse');
-var exec = require('./exec');
-var defaults = require('./defaults');
-
-module.exports = load;
-module.exports.mutateExecOptions = mutateExecOptions;
-
-var existsSync = fs.existsSync || path.existsSync;
-
-function findAppScript() {
-  // nodemon has been run alone, so try to read the package file
-  // or try to read the index.js file
-
-  var pkg =
-    existsSync(path.join(process.cwd(), 'package.json')) &&
-    require(path.join(process.cwd(), 'package.json'));
-  if ((!pkg || pkg.main == undefined) && existsSync('./index.js')) {
-    return 'index.js';
-  }
-}
-
-/**
- * Load the nodemon config, first reading the global root/nodemon.json, then
- * the local nodemon.json to the exec and then overwriting using any user
- * specified settings (i.e. from the cli)
- *
- * @param {Object} settings user defined settings
- * @param {Object} options global options
- * @param {Object} config the config object to be updated
- * @param {Function} callback that receives complete config
- */
-function load(settings, options, config, callback) {
-  config.loaded = [];
-  // first load the root nodemon.json
-  loadFile(options, config, utils.home, function (options) {
-    // then load the user's local configuration file
-    if (settings.configFile) {
-      options.configFile = path.resolve(settings.configFile);
-    }
-    loadFile(options, config, process.cwd(), function (options) {
-      // Then merge over with the user settings (parsed from the cli).
-      // Note that merge protects and favours existing values over new values,
-      // and thus command line arguments get priority
-      options = utils.merge(settings, options);
-
-      // legacy support
-      if (!Array.isArray(options.ignore)) {
-        options.ignore = [options.ignore];
-      }
-
-      if (!options.ignoreRoot) {
-        options.ignoreRoot = defaults.ignoreRoot;
-      }
-
-      // blend the user ignore and the default ignore together
-      if (options.ignoreRoot && options.ignore) {
-        if (!Array.isArray(options.ignoreRoot)) {
-          options.ignoreRoot = [options.ignoreRoot];
-        }
-        options.ignore = options.ignoreRoot.concat(options.ignore);
-      } else {
-        options.ignore = defaults.ignore.concat(options.ignore);
-      }
-
-      // add in any missing defaults
-      options = utils.merge(options, defaults);
-
-      if (!options.script && !options.exec) {
-        var found = findAppScript();
-        if (found) {
-          if (!options.args) {
-            options.args = [];
-          }
-          // if the script is found as a result of not being on the command
-          // line, then we move any of the pre double-dash args in execArgs
-          const n =
-            options.scriptPosition === null
-              ? options.args.length
-              : options.scriptPosition;
-
-          options.execArgs = (options.execArgs || []).concat(
-            options.args.splice(0, n)
-          );
-          options.scriptPosition = null;
-
-          options.script = found;
-        }
-      }
-
-      mutateExecOptions(options);
-
-      if (options.quiet) {
-        utils.quiet();
-      }
-
-      if (options.verbose) {
-        utils.debug = true;
-      }
-
-      // simplify the ready callback to be called after the rules are normalised
-      // from strings to regexp through the rules lib. Note that this gets
-      // created *after* options is overwritten twice in the lines above.
-      var ready = function (options) {
-        normaliseRules(options, callback);
-      };
-
-      ready(options);
-    });
-  });
-}
-
-function normaliseRules(options, ready) {
-  // convert ignore and watch options to rules/regexp
-  rules.watch.add(options.watch);
-  rules.ignore.add(options.ignore);
-
-  // normalise the watch and ignore arrays
-  options.watch = options.watch === false ? false : rules.rules.watch;
-  options.ignore = rules.rules.ignore;
-
-  ready(options);
-}
-
-/**
- * Looks for a config in the current working directory, and a config in the
- * user's home directory, merging the two together, giving priority to local
- * config. This can then be overwritten later by command line arguments
- *
- * @param  {Function} ready callback to pass loaded settings to
- */
-function loadFile(options, config, dir, ready) {
-  if (!ready) {
-    ready = function () {};
-  }
-
-  var callback = function (settings) {
-    // prefer the local nodemon.json and fill in missing items using
-    // the global options
-    ready(utils.merge(settings, options));
-  };
-
-  if (!dir) {
-    return callback({});
-  }
-
-  var filename = options.configFile || path.join(dir, 'nodemon.json');
-
-  if (config.loaded.indexOf(filename) !== -1) {
-    // don't bother re-parsing the same config file
-    return callback({});
-  }
-
-  fs.readFile(filename, 'utf8', function (err, data) {
-    if (err) {
-      if (err.code === 'ENOENT') {
-        if (!options.configFile && dir !== utils.home) {
-          // if no specified local config file and local nodemon.json
-          // doesn't exist, try the package.json
-          return loadPackageJSON(config, callback);
-        }
-      }
-      return callback({});
-    }
-
-    var settings = {};
-
-    try {
-      settings = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, ''));
-      if (!filename.endsWith('package.json') || settings.nodemonConfig) {
-        config.loaded.push(filename);
-      }
-    } catch (e) {
-      utils.log.fail('Failed to parse config ' + filename);
-      console.error(e);
-      process.exit(1);
-    }
-
-    // options values will overwrite settings
-    callback(settings);
-  });
-}
-
-function loadPackageJSON(config, ready) {
-  if (!ready) {
-    ready = () => {};
-  }
-
-  const dir = process.cwd();
-  const filename = path.join(dir, 'package.json');
-  const packageLoadOptions = { configFile: filename };
-  return loadFile(packageLoadOptions, config, dir, (settings) => {
-    ready(settings.nodemonConfig || {});
-  });
-}
-
-function mutateExecOptions(options) {
-  // work out the execOptions based on the final config we have
-  options.execOptions = exec(
-    {
-      script: options.script,
-      exec: options.exec,
-      args: options.args,
-      scriptPosition: options.scriptPosition,
-      nodeArgs: options.nodeArgs,
-      execArgs: options.execArgs,
-      ext: options.ext,
-      env: options.env,
-    },
-    options.execMap
-  );
-
-  // clean up values that we don't need at the top level
-  delete options.scriptPosition;
-  delete options.script;
-  delete options.args;
-  delete options.ext;
-
-  return options;
-}
Index: de_modules/nodemon/lib/help/index.js
===================================================================
--- node_modules/nodemon/lib/help/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,27 +1,0 @@
-var fs = require('fs');
-var path = require('path');
-const supportsColor = require('supports-color');
-
-module.exports = help;
-
-const highlight = supportsColor.stdout ? '\x1B\[$1m' : '';
-
-function help(item) {
-  if (!item) {
-    item = 'help';
-  } else if (item === true) { // if used with -h or --help and no args
-    item = 'help';
-  }
-
-  // cleanse the filename to only contain letters
-  // aka: /\W/g but figured this was eaiser to read
-  item = item.replace(/[^a-z]/gi, '');
-
-  try {
-    var dir = path.join(__dirname, '..', '..', 'doc', 'cli', item + '.txt');
-    var body = fs.readFileSync(dir, 'utf8');
-    return body.replace(/\\x1B\[(.)m/g, highlight);
-  } catch (e) {
-    return '"' + item + '" help can\'t be found';
-  }
-}
Index: de_modules/nodemon/lib/index.js
===================================================================
--- node_modules/nodemon/lib/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-module.exports = require('./nodemon');
Index: de_modules/nodemon/lib/monitor/index.js
===================================================================
--- node_modules/nodemon/lib/monitor/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,4 +1,0 @@
-module.exports = {
-  run: require('./run'),
-  watch: require('./watch').watch,
-};
Index: de_modules/nodemon/lib/monitor/match.js
===================================================================
--- node_modules/nodemon/lib/monitor/match.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,288 +1,0 @@
-const { minimatch } = require('minimatch');
-const path = require('path');
-const fs = require('fs');
-const debug = require('debug')('nodemon:match');
-const utils = require('../utils');
-
-module.exports = match;
-module.exports.rulesToMonitor = rulesToMonitor;
-
-function rulesToMonitor(watch, ignore, config) {
-  var monitor = [];
-
-  if (!Array.isArray(ignore)) {
-    if (ignore) {
-      ignore = [ignore];
-    } else {
-      ignore = [];
-    }
-  }
-
-  if (!Array.isArray(watch)) {
-    if (watch) {
-      watch = [watch];
-    } else {
-      watch = [];
-    }
-  }
-
-  if (watch && watch.length) {
-    monitor = utils.clone(watch);
-  }
-
-  if (ignore) {
-    [].push.apply(
-      monitor,
-      (ignore || []).map(function (rule) {
-        return '!' + rule;
-      })
-    );
-  }
-
-  var cwd = process.cwd();
-
-  // next check if the monitored paths are actual directories
-  // or just patterns - and expand the rule to include *.*
-  monitor = monitor.map(function (rule) {
-    var not = rule.slice(0, 1) === '!';
-
-    if (not) {
-      rule = rule.slice(1);
-    }
-
-    if (rule === '.' || rule === '.*') {
-      rule = '*.*';
-    }
-
-    var dir = path.resolve(cwd, rule);
-
-    try {
-      var stat = fs.statSync(dir);
-      if (stat.isDirectory()) {
-        rule = dir;
-        if (rule.slice(-1) !== '/') {
-          rule += '/';
-        }
-        rule += '**/*';
-
-        // `!not` ... sorry.
-        if (!not) {
-          config.dirs.push(dir);
-        }
-      } else {
-        // ensures we end up in the check that tries to get a base directory
-        // and then adds it to the watch list
-        throw new Error();
-      }
-    } catch (e) {
-      var base = tryBaseDir(dir);
-      if (!not && base) {
-        if (config.dirs.indexOf(base) === -1) {
-          config.dirs.push(base);
-        }
-      }
-    }
-
-    if (rule.slice(-1) === '/') {
-      // just slap on a * anyway
-      rule += '*';
-    }
-
-    // if the url ends with * but not **/* and not *.*
-    // then convert to **/* - somehow it was missed :-\
-    if (
-      rule.slice(-4) !== '**/*' &&
-      rule.slice(-1) === '*' &&
-      rule.indexOf('*.') === -1
-    ) {
-      if (rule.slice(-2) !== '**') {
-        rule += '*/*';
-      }
-    }
-
-    return (not ? '!' : '') + rule;
-  });
-
-  return monitor;
-}
-
-function tryBaseDir(dir) {
-  var stat;
-  if (/[?*\{\[]+/.test(dir)) {
-    // if this is pattern, then try to find the base
-    try {
-      var base = path.dirname(dir.replace(/([?*\{\[]+.*$)/, 'foo'));
-      stat = fs.statSync(base);
-      if (stat.isDirectory()) {
-        return base;
-      }
-    } catch (error) {
-      // console.log(error);
-    }
-  } else {
-    try {
-      stat = fs.statSync(dir);
-      // if this path is actually a single file that exists, then just monitor
-      // that, *specifically*.
-      if (stat.isFile() || stat.isDirectory()) {
-        return dir;
-      }
-    } catch (e) { }
-  }
-
-  return false;
-}
-
-function match(files, monitor, ext) {
-  // sort the rules by highest specificity (based on number of slashes)
-  // ignore rules (!) get sorted highest as they take precedent
-  const cwd = process.cwd();
-  var rules = monitor
-    .sort(function (a, b) {
-      var r = b.split(path.sep).length - a.split(path.sep).length;
-      var aIsIgnore = a.slice(0, 1) === '!';
-      var bIsIgnore = b.slice(0, 1) === '!';
-
-      if (aIsIgnore || bIsIgnore) {
-        if (aIsIgnore) {
-          return -1;
-        }
-
-        return 1;
-      }
-
-      if (r === 0) {
-        return b.length - a.length;
-      }
-      return r;
-    })
-    .map(function (s) {
-      var prefix = s.slice(0, 1);
-
-      if (prefix === '!') {
-        if (s.indexOf('!' + cwd) === 0) {
-          return s;
-        }
-
-        // if it starts with a period, then let's get the relative path
-        if (s.indexOf('!.') === 0) {
-          return '!' + path.resolve(cwd, s.substring(1));
-        }
-
-        return '!**' + (prefix !== path.sep ? path.sep : '') + s.slice(1);
-      }
-
-      // if it starts with a period, then let's get the relative path
-      if (s.indexOf('.') === 0) {
-        return path.resolve(cwd, s);
-      }
-
-      if (s.indexOf(cwd) === 0) {
-        return s;
-      }
-
-      return '**' + (prefix !== path.sep ? path.sep : '') + s;
-    });
-
-  debug('rules', rules);
-
-  var good = [];
-  var whitelist = []; // files that we won't check against the extension
-  var ignored = 0;
-  var watched = 0;
-  var usedRules = [];
-  var minimatchOpts = {
-    dot: true,
-  };
-
-  // enable case-insensitivity on Windows
-  if (utils.isWindows) {
-    minimatchOpts.nocase = true;
-    minimatchOpts.windowsPathsNoEscape = true;
-  }
-
-  files.forEach(function (file) {
-    file = path.resolve(cwd, file);
-
-    var matched = false;
-    for (var i = 0; i < rules.length; i++) {
-      if (rules[i].slice(0, 1) === '!') {
-        if (!minimatch(file, rules[i], minimatchOpts)) {
-          debug('ignored', file, 'rule:', rules[i]);
-          ignored++;
-          matched = true;
-          break;
-        }
-      } else {
-        debug('matched', file, 'rule:', rules[i]);
-        if (minimatch(file, rules[i], minimatchOpts)) {
-          watched++;
-
-          // don't repeat the output if a rule is matched
-          if (usedRules.indexOf(rules[i]) === -1) {
-            usedRules.push(rules[i]);
-            utils.log.detail('matched rule: ' + rules[i]);
-          }
-
-          // if the rule doesn't match the WATCH EVERYTHING
-          // but *does* match a rule that ends with *.*, then
-          // white list it - in that we don't run it through
-          // the extension check too.
-          if (
-            rules[i] !== '**' + path.sep + '*.*' &&
-            rules[i].slice(-3) === '*.*'
-          ) {
-            whitelist.push(file);
-          } else if (path.basename(file) === path.basename(rules[i])) {
-            // if the file matches the actual rule, then it's put on whitelist
-            whitelist.push(file);
-          } else {
-            good.push(file);
-          }
-          matched = true;
-        } else {
-          // utils.log.detail('no match: ' + rules[i], file);
-        }
-      }
-    }
-    if (!matched) {
-      ignored++;
-    }
-  });
-
-  // finally check the good files against the extensions that we're monitoring
-  if (ext) {
-    if (ext.indexOf(',') === -1) {
-      ext = '**/*.' + ext;
-    } else {
-      ext = '**/*.{' + ext + '}';
-    }
-
-    good = good.filter(function (file) {
-      // only compare the filename to the extension test
-      return minimatch(path.basename(file), ext, minimatchOpts);
-    });
-    debug('good (filtered by ext)', good);
-  } else {
-    // else assume *.*
-    debug('good', good);
-  }
-
-  if (whitelist.length) debug('whitelist', whitelist);
-
-  var result = good.concat(whitelist);
-
-  if (utils.isWindows) {
-    // fix for windows testing - I *think* this is okay to do
-    result = result.map(function (file) {
-      return file.slice(0, 1).toLowerCase() + file.slice(1);
-    });
-  }
-
-  return {
-    result: result,
-    ignored: ignored,
-    watched: watched,
-    total: files.length,
-  };
-}
Index: de_modules/nodemon/lib/monitor/run.js
===================================================================
--- node_modules/nodemon/lib/monitor/run.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,562 +1,0 @@
-var debug = require('debug')('nodemon:run');
-const statSync = require('fs').statSync;
-var utils = require('../utils');
-var bus = utils.bus;
-var childProcess = require('child_process');
-var spawn = childProcess.spawn;
-var exec = childProcess.exec;
-var execSync = childProcess.execSync;
-var fork = childProcess.fork;
-var watch = require('./watch').watch;
-var config = require('../config');
-var child = null; // the actual child process we spawn
-var killedAfterChange = false;
-var noop = () => {};
-var restart = null;
-var psTree = require('pstree.remy');
-var path = require('path');
-var signals = require('./signals');
-const undefsafe = require('undefsafe');
-const osRelease = parseInt(require('os').release().split('.')[0], 10);
-
-function run(options) {
-  var cmd = config.command.raw;
-  // moved up
-  // we need restart function below in the global scope for run.kill
-  /*jshint validthis:true*/
-  restart = run.bind(this, options);
-  run.restart = restart;
-
-  // binding options with instance of run
-  // so that we can use it in run.kill
-  run.options = options;
-
-  var runCmd = !options.runOnChangeOnly || config.lastStarted !== 0;
-  if (runCmd) {
-    utils.log.status('starting `' + config.command.string + '`');
-  } else {
-    // should just watch file if command is not to be run
-    // had another alternate approach
-    // to stop process being forked/spawned in the below code
-    // but this approach does early exit and makes code cleaner
-    debug('start watch on: %s', config.options.watch);
-    if (config.options.watch !== false) {
-      watch();
-      return;
-    }
-  }
-
-  config.lastStarted = Date.now();
-
-  var stdio = ['pipe', 'pipe', 'pipe'];
-
-  if (config.options.stdout) {
-    stdio = ['pipe', process.stdout, process.stderr];
-  }
-
-  if (config.options.stdin === false) {
-    stdio = [process.stdin, process.stdout, process.stderr];
-  }
-
-  var sh = 'sh';
-  var shFlag = '-c';
-
-  const binPath = process.cwd() + '/node_modules/.bin';
-
-  const spawnOptions = {
-    env: Object.assign({}, options.execOptions.env, process.env, {
-      PATH:
-        binPath +
-        path.delimiter +
-        (undefsafe(options, '.execOptions.env.PATH') || process.env.PATH),
-    }),
-    stdio: stdio,
-  };
-
-  var executable = cmd.executable;
-
-  if (utils.isWindows) {
-    // if the exec includes a forward slash, reverse it for windows compat
-    // but *only* apply to the first command, and none of the arguments.
-    // ref #1251 and #1236
-    if (executable.indexOf('/') !== -1) {
-      executable = executable
-        .split(' ')
-        .map((e, i) => {
-          if (i === 0) {
-            return path.normalize(e);
-          }
-          return e;
-        })
-        .join(' ');
-    }
-    // taken from npm's cli: https://git.io/vNFD4
-    sh = process.env.comspec || 'cmd';
-    shFlag = '/d /s /c';
-    spawnOptions.windowsVerbatimArguments = true;
-    spawnOptions.windowsHide = true;
-  }
-
-  var args = runCmd ? utils.stringify(executable, cmd.args) : ':';
-  var spawnArgs = [sh, [shFlag, args], spawnOptions];
-
-  const firstArg = cmd.args[0] || '';
-
-  var inBinPath = false;
-  try {
-    inBinPath = statSync(`${binPath}/${executable}`).isFile();
-  } catch (e) {}
-
-  // hasStdio allows us to correctly handle stdin piping
-  // see: https://git.io/vNtX3
-  const hasStdio = utils.satisfies('>= 6.4.0 || < 5');
-
-  // forking helps with sub-process handling and tends to clean up better
-  // than spawning, but it should only be used under specific conditions
-  const shouldFork =
-    !config.options.spawn &&
-    !inBinPath &&
-    !(firstArg.indexOf('-') === 0) && // don't fork if there's a node exec arg
-    firstArg !== 'inspect' && // don't fork it's `inspect` debugger
-    executable === 'node' && // only fork if node
-    utils.version.major > 4; // only fork if node version > 4
-
-  if (shouldFork) {
-    // this assumes the first argument is the script and slices it out, since
-    // we're forking
-    var forkArgs = cmd.args.slice(1);
-    var env = utils.merge(options.execOptions.env, process.env);
-    stdio.push('ipc');
-    const forkOptions = {
-      env: env,
-      stdio: stdio,
-      silent: !hasStdio,
-    };
-    if (utils.isWindows) {
-      forkOptions.windowsHide = true;
-    }
-    child = fork(options.execOptions.script, forkArgs, forkOptions);
-    utils.log.detail('forking');
-    debug('fork', sh, shFlag, args);
-  } else {
-    utils.log.detail('spawning');
-    child = spawn.apply(null, spawnArgs);
-    debug('spawn', sh, shFlag, args);
-  }
-
-  if (config.required) {
-    var emit = {
-      stdout: function (data) {
-        bus.emit('stdout', data);
-      },
-      stderr: function (data) {
-        bus.emit('stderr', data);
-      },
-    };
-
-    // now work out what to bind to...
-    if (config.options.stdout) {
-      child.on('stdout', emit.stdout).on('stderr', emit.stderr);
-    } else {
-      child.stdout.on('data', emit.stdout);
-      child.stderr.on('data', emit.stderr);
-
-      bus.stdout = child.stdout;
-      bus.stderr = child.stderr;
-    }
-
-    if (shouldFork) {
-      child.on('message', function (message, sendHandle) {
-        bus.emit('message', message, sendHandle);
-      });
-    }
-  }
-
-  bus.emit('start');
-
-  utils.log.detail('child pid: ' + child.pid);
-
-  child.on('error', function (error) {
-    bus.emit('error', error);
-    if (error.code === 'ENOENT') {
-      utils.log.error('unable to run executable: "' + cmd.executable + '"');
-      process.exit(1);
-    } else {
-      utils.log.error('failed to start child process: ' + error.code);
-      throw error;
-    }
-  });
-
-  child.on('exit', function (code, signal) {
-    if (child && child.stdin) {
-      process.stdin.unpipe(child.stdin);
-    }
-
-    if (code === 127) {
-      utils.log.error(
-        'failed to start process, "' + cmd.executable + '" exec not found'
-      );
-      bus.emit('error', code);
-      process.exit();
-    }
-
-    // If the command failed with code 2, it may or may not be a syntax error
-    // See: http://git.io/fNOAR
-    // We will only assume a parse error, if the child failed quickly
-    if (code === 2 && Date.now() < config.lastStarted + 500) {
-      utils.log.error('process failed, unhandled exit code (2)');
-      utils.log.error('');
-      utils.log.error('Either the command has a syntax error,');
-      utils.log.error('or it is exiting with reserved code 2.');
-      utils.log.error('');
-      utils.log.error('To keep nodemon running even after a code 2,');
-      utils.log.error('add this to the end of your command: || exit 1');
-      utils.log.error('');
-      utils.log.error('Read more here: https://git.io/fNOAG');
-      utils.log.error('');
-      utils.log.error('nodemon will stop now so that you can fix the command.');
-      utils.log.error('');
-      bus.emit('error', code);
-      process.exit();
-    }
-
-    // In case we killed the app ourselves, set the signal thusly
-    if (killedAfterChange) {
-      killedAfterChange = false;
-      signal = config.signal;
-    }
-    // this is nasty, but it gives it windows support
-    if (utils.isWindows && signal === 'SIGTERM') {
-      signal = config.signal;
-    }
-
-    if (signal === config.signal || code === 0) {
-      // this was a clean exit, so emit exit, rather than crash
-      debug('bus.emit(exit) via ' + config.signal);
-      bus.emit('exit', signal);
-
-      // exit the monitor, but do it gracefully
-      if (signal === config.signal) {
-        return restart();
-      }
-
-      if (code === 0) {
-        // clean exit - wait until file change to restart
-        if (runCmd) {
-          utils.log.status('clean exit - waiting for changes before restart');
-        }
-        child = null;
-      }
-    } else {
-      bus.emit('crash');
-
-      // support the old syntax of `exitcrash` - 2024-12-13
-      if (options.exitcrash) {
-        options.exitCrash = true;
-        delete options.exitcrash;
-      }
-
-      if (options.exitCrash) {
-        utils.log.fail('app crashed');
-        if (!config.required) {
-          process.exit(1);
-        }
-      } else {
-        utils.log.fail(
-          'app crashed - waiting for file changes before' + ' starting...'
-        );
-        child = null;
-      }
-    }
-
-    if (config.options.restartable) {
-      // stdin needs to kick in again to be able to listen to the
-      // restart command
-      process.stdin.resume();
-    }
-  });
-
-  // moved the run.kill outside to handle both the cases
-  // intial start
-  // no start
-
-  // connect stdin to the child process (options.stdin is on by default)
-  if (options.stdin) {
-    process.stdin.resume();
-    // FIXME decide whether or not we need to decide the encoding
-    // process.stdin.setEncoding('utf8');
-
-    // swallow the stdin error if it happens
-    // ref: https://github.com/remy/nodemon/issues/1195
-    if (hasStdio) {
-      child.stdin.on('error', () => {});
-      process.stdin.pipe(child.stdin);
-    } else {
-      if (child.stdout) {
-        child.stdout.pipe(process.stdout);
-      } else {
-        utils.log.error(
-          'running an unsupported version of node ' + process.version
-        );
-        utils.log.error(
-          'nodemon may not work as expected - ' +
-            'please consider upgrading to LTS'
-        );
-      }
-    }
-
-    bus.once('exit', function () {
-      if (child && process.stdin.unpipe) {
-        // node > 0.8
-        process.stdin.unpipe(child.stdin);
-      }
-    });
-  }
-
-  debug('start watch on: %s', config.options.watch);
-  if (config.options.watch !== false) {
-    watch();
-  }
-}
-
-function waitForSubProcesses(pid, callback) {
-  debug('checking ps tree for pids of ' + pid);
-  psTree(pid, (err, pids) => {
-    if (!pids.length) {
-      return callback();
-    }
-
-    utils.log.status(
-      `still waiting for ${pids.length} sub-process${
-        pids.length > 2 ? 'es' : ''
-      } to finish...`
-    );
-    setTimeout(() => waitForSubProcesses(pid, callback), 1000);
-  });
-}
-
-function kill(child, signal, callback) {
-  if (!callback) {
-    callback = noop;
-  }
-
-  if (utils.isWindows) {
-    const taskKill = () => {
-      try {
-        exec('taskkill /pid ' + child.pid + ' /T /F');
-      } catch (e) {
-        utils.log.error('Could not shutdown sub process cleanly');
-      }
-    };
-
-    // We are handling a 'SIGKILL' , 'SIGUSR2' and 'SIGUSR1' POSIX signal under Windows the
-    // same way it is handled on a UNIX system: We are performing
-    // a hard shutdown without waiting for the process to clean-up.
-    if (
-      signal === 'SIGKILL' ||
-      osRelease < 10 ||
-      signal === 'SIGUSR2' ||
-      signal === 'SIGUSR1'
-    ) {
-      debug('terminating process group by force: %s', child.pid);
-
-      // We are using the taskkill utility to terminate the whole
-      // process group ('/t') of the child ('/pid') by force ('/f').
-      // We need to end all sub processes, because the 'child'
-      // process in this context is actually a cmd.exe wrapper.
-      taskKill();
-      callback();
-      return;
-    }
-
-    try {
-      // We are using the Windows Management Instrumentation Command-line
-      // (wmic.exe) to resolve the sub-child process identifier, because the
-      // 'child' process in this context is actually a cmd.exe wrapper.
-      // We want to send the termination signal directly to the node process.
-      // The '2> nul' silences the no process found error message.
-      const resultBuffer = execSync(
-        `wmic process where (ParentProcessId=${child.pid}) get ProcessId 2> nul`
-      );
-      const result = resultBuffer.toString().match(/^[0-9]+/m);
-
-      // If there is no sub-child process we fall back to the child process.
-      const processId = Array.isArray(result) ? result[0] : child.pid;
-
-      debug('sending kill signal SIGINT to process: %s', processId);
-
-      // We are using the standalone 'windows-kill' executable to send the
-      // standard POSIX signal 'SIGINT' to the node process. This fixes #1720.
-      const windowsKill = path.normalize(
-        `${__dirname}/../../bin/windows-kill.exe`
-      );
-
-      // We have to detach the 'windows-kill' execution completely from this
-      // process group to avoid terminating the nodemon process itself.
-      // See: https://github.com/alirdn/windows-kill#how-it-works--limitations
-      //
-      // Therefore we are using 'start' to create a new cmd.exe context.
-      // The '/min' option hides the new terminal window and the '/wait'
-      // option lets the process wait for the command to finish.
-
-      execSync(
-        `start "windows-kill" /min /wait "${windowsKill}" -SIGINT ${processId}`
-      );
-    } catch (e) {
-      taskKill();
-    }
-    callback();
-  } else {
-    // we use psTree to kill the full subtree of nodemon, because when
-    // spawning processes like `coffee` under the `--debug` flag, it'll spawn
-    // it's own child, and that can't be killed by nodemon, so psTree gives us
-    // an array of PIDs that have spawned under nodemon, and we send each the
-    // configured signal (default: SIGUSR2) signal, which fixes #335
-    // note that psTree also works if `ps` is missing by looking in /proc
-    let sig = signal.replace('SIG', '');
-
-    psTree(child.pid, function (err, pids) {
-      // if ps isn't native to the OS, then we need to send the numeric value
-      // for the signal during the kill, `signals` is a lookup table for that.
-      if (!psTree.hasPS) {
-        sig = signals[signal];
-      }
-
-      // the sub processes need to be killed from smallest to largest
-      debug('sending kill signal to ' + pids.join(', '));
-
-      child.kill(signal);
-
-      pids.sort().forEach((pid) => exec(`kill -${sig} ${pid}`, noop));
-
-      waitForSubProcesses(child.pid, () => {
-        // finally kill the main user process
-        exec(`kill -${sig} ${child.pid}`, callback);
-      });
-    });
-  }
-}
-
-run.kill = function (noRestart, callback) {
-  // I hate code like this :(  - Remy (author of said code)
-  if (typeof noRestart === 'function') {
-    callback = noRestart;
-    noRestart = false;
-  }
-
-  if (!callback) {
-    callback = noop;
-  }
-
-  if (child !== null) {
-    // if the stdin piping is on, we need to unpipe, but also close stdin on
-    // the child, otherwise linux can throw EPIPE or ECONNRESET errors.
-    if (run.options.stdin) {
-      process.stdin.unpipe(child.stdin);
-    }
-
-    // For the on('exit', ...) handler above the following looks like a
-    // crash, so we set the killedAfterChange flag if a restart is planned
-    if (!noRestart) {
-      killedAfterChange = true;
-    }
-
-    /* Now kill the entire subtree of processes belonging to nodemon */
-    var oldPid = child.pid;
-    if (child) {
-      kill(child, config.signal, function () {
-        // this seems to fix the 0.11.x issue with the "rs" restart command,
-        // though I'm unsure why. it seems like more data is streamed in to
-        // stdin after we close.
-        if (child && run.options.stdin && child.stdin && oldPid === child.pid) {
-          child.stdin.end();
-        }
-        callback();
-      });
-    }
-  } else if (!noRestart) {
-    // if there's no child, then we need to manually start the process
-    // this is because as there was no child, the child.on('exit') event
-    // handler doesn't exist which would normally trigger the restart.
-    bus.once('start', callback);
-    run.restart();
-  } else {
-    callback();
-  }
-};
-
-run.restart = noop;
-
-bus.on('quit', function onQuit(code) {
-  if (code === undefined) {
-    code = 0;
-  }
-
-  // remove event listener
-  var exitTimer = null;
-  var exit = function () {
-    clearTimeout(exitTimer);
-    exit = noop; // null out in case of race condition
-    child = null;
-    if (!config.required) {
-      // Execute all other quit listeners.
-      bus.listeners('quit').forEach(function (listener) {
-        if (listener !== onQuit) {
-          listener();
-        }
-      });
-      process.exit(code);
-    } else {
-      bus.emit('exit');
-    }
-  };
-
-  // if we're not running already, don't bother with trying to kill
-  if (config.run === false) {
-    return exit();
-  }
-
-  // immediately try to stop any polling
-  config.run = false;
-
-  if (child) {
-    // give up waiting for the kids after 10 seconds
-    exitTimer = setTimeout(exit, 10 * 1000);
-    child.removeAllListeners('exit');
-    child.once('exit', exit);
-
-    kill(child, 'SIGINT');
-  } else {
-    exit();
-  }
-});
-
-bus.on('restart', function () {
-  // run.kill will send a SIGINT to the child process, which will cause it
-  // to terminate, which in turn uses the 'exit' event handler to restart
-  run.kill();
-});
-
-// remove the child file on exit
-process.on('exit', function () {
-  utils.log.detail('exiting');
-  if (child) {
-    child.kill();
-  }
-});
-
-// because windows borks when listening for the SIG* events
-if (!utils.isWindows) {
-  bus.once('boot', () => {
-    // usual suspect: ctrl+c exit
-    process.once('SIGINT', () => bus.emit('quit', 130));
-    process.once('SIGTERM', () => {
-      bus.emit('quit', 143);
-      if (child) {
-        child.kill('SIGTERM');
-      }
-    });
-  });
-}
-
-module.exports = run;
Index: de_modules/nodemon/lib/monitor/signals.js
===================================================================
--- node_modules/nodemon/lib/monitor/signals.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-module.exports = {
-  SIGHUP: 1,
-  SIGINT: 2,
-  SIGQUIT: 3,
-  SIGILL: 4,
-  SIGTRAP: 5,
-  SIGABRT: 6,
-  SIGBUS: 7,
-  SIGFPE: 8,
-  SIGKILL: 9,
-  SIGUSR1: 10,
-  SIGSEGV: 11,
-  SIGUSR2: 12,
-  SIGPIPE: 13,
-  SIGALRM: 14,
-  SIGTERM: 15,
-  SIGSTKFLT: 16,
-  SIGCHLD: 17,
-  SIGCONT: 18,
-  SIGSTOP: 19,
-  SIGTSTP: 20,
-  SIGTTIN: 21,
-  SIGTTOU: 22,
-  SIGURG: 23,
-  SIGXCPU: 24,
-  SIGXFSZ: 25,
-  SIGVTALRM: 26,
-  SIGPROF: 27,
-  SIGWINCH: 28,
-  SIGIO: 29,
-  SIGPWR: 30,
-  SIGSYS: 31,
-  SIGRTMIN: 35,
-}
Index: de_modules/nodemon/lib/monitor/watch.js
===================================================================
--- node_modules/nodemon/lib/monitor/watch.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,244 +1,0 @@
-module.exports.watch = watch;
-module.exports.resetWatchers = resetWatchers;
-
-var debug = require('debug')('nodemon:watch');
-var debugRoot = require('debug')('nodemon');
-var chokidar = require('chokidar');
-var undefsafe = require('undefsafe');
-var config = require('../config');
-var path = require('path');
-var utils = require('../utils');
-var bus = utils.bus;
-var match = require('./match');
-var watchers = [];
-var debouncedBus;
-
-bus.on('reset', resetWatchers);
-
-function resetWatchers() {
-  debugRoot('resetting watchers');
-  watchers.forEach(function (watcher) {
-    watcher.close();
-  });
-  watchers = [];
-}
-
-function watch() {
-  if (watchers.length) {
-    debug('early exit on watch, still watching (%s)', watchers.length);
-    return;
-  }
-
-  var dirs = [].slice.call(config.dirs);
-
-  debugRoot('start watch on: %s', dirs.join(', '));
-  const rootIgnored = config.options.ignore;
-  debugRoot('ignored', rootIgnored);
-
-  var watchedFiles = [];
-
-  const promise = new Promise(function (resolve) {
-    const dotFilePattern = /[/\\]\./;
-    var ignored = match.rulesToMonitor(
-      [], // not needed
-      Array.from(rootIgnored),
-      config
-    ).map(pattern => pattern.slice(1));
-
-    const addDotFile = dirs.filter(dir => dir.match(dotFilePattern));
-
-    // don't ignore dotfiles if explicitly watched.
-    if (addDotFile.length === 0) {
-      ignored.push(dotFilePattern);
-    }
-
-    var watchOptions = {
-      ignorePermissionErrors: true,
-      ignored: ignored,
-      persistent: true,
-      usePolling: config.options.legacyWatch || false,
-      interval: config.options.pollingInterval,
-      // note to future developer: I've gone back and forth on adding `cwd`
-      // to the props and in some cases it fixes bugs but typically it causes
-      // bugs elsewhere (since nodemon is used is so many ways). the final
-      // decision is to *not* use it at all and work around it
-      // cwd: ...
-    };
-
-    if (utils.isWindows) {
-      watchOptions.disableGlobbing = true;
-    }
-
-    if (utils.isIBMi) {
-      watchOptions.usePolling = true;
-    }
-
-    if (process.env.TEST) {
-      watchOptions.useFsEvents = false;
-    }
-
-    var watcher = chokidar.watch(
-      dirs,
-      Object.assign({}, watchOptions, config.options.watchOptions || {})
-    );
-
-    watcher.ready = false;
-
-    var total = 0;
-
-    watcher.on('change', filterAndRestart);
-    watcher.on('unlink', filterAndRestart);
-    watcher.on('add', function (file) {
-      if (watcher.ready) {
-        return filterAndRestart(file);
-      }
-
-      watchedFiles.push(file);
-      bus.emit('watching', file);
-      debug('chokidar watching: %s', file);
-    });
-    watcher.on('ready', function () {
-      watchedFiles = Array.from(new Set(watchedFiles)); // ensure no dupes
-      total = watchedFiles.length;
-      watcher.ready = true;
-      resolve(total);
-      debugRoot('watch is complete');
-    });
-
-    watcher.on('error', function (error) {
-      if (error.code === 'EINVAL') {
-        utils.log.error(
-          'Internal watch failed. Likely cause: too many ' +
-          'files being watched (perhaps from the root of a drive?\n' +
-          'See https://github.com/paulmillr/chokidar/issues/229 for details'
-        );
-      } else {
-        utils.log.error('Internal watch failed: ' + error.message);
-        process.exit(1);
-      }
-    });
-
-    watchers.push(watcher);
-  });
-
-  return promise.catch(e => {
-    // this is a core error and it should break nodemon - so I have to break
-    // out of a promise using the setTimeout
-    setTimeout(() => {
-      throw e;
-    });
-  }).then(function () {
-    utils.log.detail(`watching ${watchedFiles.length} file${
-      watchedFiles.length === 1 ? '' : 's'}`);
-    return watchedFiles;
-  });
-}
-
-function filterAndRestart(files) {
-  if (!Array.isArray(files)) {
-    files = [files];
-  }
-
-  if (files.length) {
-    var cwd = process.cwd();
-    if (this.options && this.options.cwd) {
-      cwd = this.options.cwd;
-    }
-
-    utils.log.detail(
-      'files triggering change check: ' +
-      files
-        .map(file => {
-          const res = path.relative(cwd, file);
-          return res;
-        })
-        .join(', ')
-    );
-
-    // make sure the path is right and drop an empty
-    // filenames (sometimes on windows)
-    files = files.filter(Boolean).map(file => {
-      return path.relative(process.cwd(), path.relative(cwd, file));
-    });
-
-    if (utils.isWindows) {
-      // ensure the drive letter is in uppercase (c:\foo -> C:\foo)
-      files = files.map(f => {
-        if (f.indexOf(':') === -1) { return f; }
-        return f[0].toUpperCase() + f.slice(1);
-      });
-    }
-
-
-    debug('filterAndRestart on', files);
-
-    var matched = match(
-      files,
-      config.options.monitor,
-      undefsafe(config, 'options.execOptions.ext')
-    );
-
-    debug('matched?', JSON.stringify(matched));
-
-    // if there's no matches, then test to see if the changed file is the
-    // running script, if so, let's allow a restart
-    if (config.options.execOptions && config.options.execOptions.script) {
-      const script = path.resolve(config.options.execOptions.script);
-      if (matched.result.length === 0 && script) {
-        const length = script.length;
-        files.find(file => {
-          if (file.substr(-length, length) === script) {
-            matched = {
-              result: [file],
-              total: 1,
-            };
-            return true;
-          }
-        });
-      }
-    }
-
-    utils.log.detail(
-      'changes after filters (before/after): ' +
-      [files.length, matched.result.length].join('/')
-    );
-
-    // reset the last check so we're only looking at recently modified files
-    config.lastStarted = Date.now();
-
-    if (matched.result.length) {
-      if (config.options.delay > 0) {
-        utils.log.detail('delaying restart for ' + config.options.delay + 'ms');
-        if (debouncedBus === undefined) {
-          debouncedBus = debounce(restartBus, config.options.delay);
-        }
-        debouncedBus(matched);
-      } else {
-        return restartBus(matched);
-      }
-    }
-  }
-}
-
-function restartBus(matched) {
-  utils.log.status('restarting due to changes...');
-  matched.result.map(file => {
-    utils.log.detail(path.relative(process.cwd(), file));
-  });
-
-  if (config.options.verbose) {
-    utils.log._log('');
-  }
-
-  bus.emit('restart', matched.result);
-}
-
-function debounce(fn, delay) {
-  var timer = null;
-  return function () {
-    const context = this;
-    const args = arguments;
-    clearTimeout(timer);
-    timer = setTimeout(() =>fn.apply(context, args), delay);
-  };
-}
Index: de_modules/nodemon/lib/nodemon.js
===================================================================
--- node_modules/nodemon/lib/nodemon.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,317 +1,0 @@
-var debug = require('debug')('nodemon');
-var path = require('path');
-var monitor = require('./monitor');
-var cli = require('./cli');
-var version = require('./version');
-var util = require('util');
-var utils = require('./utils');
-var bus = utils.bus;
-var help = require('./help');
-/** @type {import('..').NodemonEventConfig} */
-var config = require('./config');
-var spawn = require('./spawn');
-const defaults = require('./config/defaults')
-var eventHandlers = {};
-
-// this is fairly dirty, but theoretically sound since it's part of the
-// stable module API
-config.required = utils.isRequired;
-
-/**
- * @param {import('..').NodemonSettings | string} settings
- * @returns {import('..').Nodemon}
- */
-function nodemon(settings) {
-  bus.emit('boot');
-  nodemon.reset();
-  
-  /** @type {import('..').NodemonSettings} */
-  let options
-
-  // allow the cli string as the argument to nodemon, and allow for
-  // `node nodemon -V app.js` or just `-V app.js`
-  if (typeof settings === 'string') {
-    settings = settings.trim();
-    if (settings.indexOf('node') !== 0) {
-      if (settings.indexOf('nodemon') !== 0) {
-        settings = 'nodemon ' + settings;
-      }
-      settings = 'node ' + settings;
-    }
-    options = cli.parse(settings);
-  } else options = settings;
-
-  // set the debug flag as early as possible to get all the detailed logging
-  if (options.verbose) {
-    utils.debug = true;
-  }
-
-  if (options.help) {
-    if (process.stdout.isTTY) {
-      process.stdout._handle.setBlocking(true); // nodejs/node#6456
-    }
-    console.log(help(options.help));
-    if (!config.required) {
-      process.exit(0);
-    }
-  }
-
-  if (options.version) {
-    version().then(function (v) {
-      console.log(v);
-      if (!config.required) {
-        process.exit(0);
-      }
-    });
-    return;
-  }
-
-  // nodemon tools like grunt-nodemon. This affects where
-  // the script is being run from, and will affect where
-  // nodemon looks for the nodemon.json files
-  if (options.cwd) {
-    // this is protection to make sure we haven't dont the chdir already...
-    // say like in cli/parse.js (which is where we do this once already!)
-    if (process.cwd() !== path.resolve(config.system.cwd, options.cwd)) {
-      process.chdir(options.cwd);
-    }
-  }
-
-  config.load(options, function (config) {
-    if (!config.options.dump && !config.options.execOptions.script &&
-      config.options.execOptions.exec === 'node') {
-      if (!config.required) {
-        console.log(help('usage'));
-        process.exit();
-      }
-      return;
-    }
-
-    // before we print anything, update the colour setting on logging
-    utils.colours = config.options.colours;
-
-    // always echo out the current version
-    utils.log.info(version.pinned);
-
-    const cwd = process.cwd();
-
-    if (config.options.cwd) {
-      utils.log.detail('process root: ' + cwd);
-    }
-
-    config.loaded.map(file => file.replace(cwd, '.')).forEach(file => {
-      utils.log.detail('reading config ' + file);
-    });
-
-    if (config.options.stdin && config.options.restartable) {
-      // allow nodemon to restart when the use types 'rs\n'
-      process.stdin.resume();
-      process.stdin.setEncoding('utf8');
-      process.stdin.on('data', data => {
-        const str = data.toString().trim().toLowerCase();
-
-        // if the keys entered match the restartable value, then restart!
-        if (str === config.options.restartable) {
-          bus.emit('restart');
-        } else if (data.charCodeAt(0) === 12) { // ctrl+l
-          console.clear();
-        }
-      });
-    } else if (config.options.stdin) {
-      // so let's make sure we don't eat the key presses
-      // but also, since we're wrapping, watch out for
-      // special keys, like ctrl+c x 2 or '.exit' or ctrl+d or ctrl+l
-      var ctrlC = false;
-      var buffer = '';
-
-      process.stdin.on('data', function (data) {
-        data = data.toString();
-        buffer += data;
-        const chr = data.charCodeAt(0);
-
-        // if restartable, echo back
-        if (chr === 3) {
-          if (ctrlC) {
-            process.exit(0);
-          }
-
-          ctrlC = true;
-          return;
-        } else if (buffer === '.exit' || chr === 4) { // ctrl+d
-          process.exit();
-        } else if (chr === 13 || chr === 10) { // enter / carriage return
-          buffer = '';
-        } else if (chr === 12) { // ctrl+l
-          console.clear();
-          buffer = '';
-        }
-        ctrlC = false;
-      });
-      if (process.stdin.setRawMode) {
-        process.stdin.setRawMode(true);
-      }
-    }
-
-    if (config.options.restartable) {
-      utils.log.info('to restart at any time, enter `' +
-        config.options.restartable + '`');
-    }
-
-    if (!config.required) {
-      const restartSignal = config.options.signal === 'SIGUSR2' ? 'SIGHUP' : 'SIGUSR2';
-      process.on(restartSignal, nodemon.restart);
-      utils.bus.on('error', () => {
-        utils.log.fail((new Error().stack));
-      });
-      utils.log.detail((config.options.restartable ? 'or ' : '') + 'send ' +
-        restartSignal + ' to ' + process.pid + ' to restart');
-    }
-
-    const ignoring = config.options.monitor.map(function (rule) {
-      if (rule.slice(0, 1) !== '!') {
-        return false;
-      }
-
-      rule = rule.slice(1);
-
-      // don't notify of default ignores
-      if (defaults.ignoreRoot.indexOf(rule) !== -1) {
-        return false;
-        // return rule.slice(3).slice(0, -3);
-      }
-
-      if (rule.startsWith(cwd)) {
-        return rule.replace(cwd, '.');
-      }
-
-      return rule;
-    }).filter(Boolean).join(' ');
-    if (ignoring) utils.log.detail('ignoring: ' + ignoring);
-
-    utils.log.info('watching path(s): ' + config.options.monitor.map(function (rule) {
-      if (rule.slice(0, 1) !== '!') {
-        try {
-          rule = path.relative(process.cwd(), rule);
-        } catch (e) {}
-
-        return rule;
-      }
-
-      return false;
-    }).filter(Boolean).join(' '));
-
-    utils.log.info('watching extensions: ' + (config.options.execOptions.ext || '(all)'));
-
-    if (config.options.dump) {
-      utils.log._log('log', '--------------');
-      utils.log._log('log', 'node: ' + process.version);
-      utils.log._log('log', 'nodemon: ' + version.pinned);
-      utils.log._log('log', 'command: ' + process.argv.join(' '));
-      utils.log._log('log', 'cwd: ' + cwd);
-      utils.log._log('log', ['OS:', process.platform, process.arch].join(' '));
-      utils.log._log('log', '--------------');
-      utils.log._log('log', util.inspect(config, { depth: null }));
-      utils.log._log('log', '--------------');
-      if (!config.required) {
-        process.exit();
-      }
-
-      return;
-    }
-
-    config.run = true;
-
-    if (config.options.stdout === false) {
-      nodemon.on('start', function () {
-        nodemon.stdout = bus.stdout;
-        nodemon.stderr = bus.stderr;
-
-        bus.emit('readable');
-      });
-    }
-
-    if (config.options.events && Object.keys(config.options.events).length) {
-      Object.keys(config.options.events).forEach(function (key) {
-        utils.log.detail('bind ' + key + ' -> `' +
-          config.options.events[key] + '`');
-        nodemon.on(key, function () {
-          if (config.options && config.options.events) {
-            spawn(config.options.events[key], config,
-              [].slice.apply(arguments));
-          }
-        });
-      });
-    }
-
-    monitor.run(config.options);
-
-  });
-
-  return nodemon;
-}
-
-nodemon.restart = function () {
-  utils.log.status('restarting child process');
-  bus.emit('restart');
-  return nodemon;
-};
-
-nodemon.addListener = nodemon.on = function (event, handler) {
-  if (!eventHandlers[event]) { eventHandlers[event] = []; }
-  eventHandlers[event].push(handler);
-  bus.on(event, handler);
-  return nodemon;
-};
-
-nodemon.once = function (event, handler) {
-  if (!eventHandlers[event]) { eventHandlers[event] = []; }
-  eventHandlers[event].push(handler);
-  bus.once(event, function () {
-    debug('bus.once(%s)', event);
-    eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1);
-    handler.apply(this, arguments);
-  });
-  return nodemon;
-};
-
-nodemon.emit = function () {
-  bus.emit.apply(bus, [].slice.call(arguments));
-  return nodemon;
-};
-
-nodemon.removeAllListeners = function (event) {
-  // unbind only the `nodemon.on` event handlers
-  Object.keys(eventHandlers).filter(function (e) {
-    return event ? e === event : true;
-  }).forEach(function (event) {
-    eventHandlers[event].forEach(function (handler) {
-      bus.removeListener(event, handler);
-      eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1);
-    });
-  });
-
-  return nodemon;
-};
-
-nodemon.reset = function (done) {
-  bus.emit('reset', done);
-};
-
-bus.on('reset', function (done) {
-  debug('reset');
-  nodemon.removeAllListeners();
-  monitor.run.kill(true, function () {
-    utils.reset();
-    config.reset();
-    config.run = false;
-    if (done) {
-      done();
-    }
-  });
-});
-
-// expose the full config
-nodemon.config = config;
-
-module.exports = nodemon;
-
Index: de_modules/nodemon/lib/rules/add.js
===================================================================
--- node_modules/nodemon/lib/rules/add.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,89 +1,0 @@
-'use strict';
-
-var utils = require('../utils');
-
-// internal
-var reEscComments = /\\#/g;
-// note that '^^' is used in place of escaped comments
-var reUnescapeComments = /\^\^/g;
-var reComments = /#.*$/;
-var reEscapeChars = /[.|\-[\]()\\]/g;
-var reAsterisk = /\*/g;
-
-module.exports = add;
-
-/**
- * Converts file patterns or regular expressions to nodemon
- * compatible RegExp matching rules. Note: the `rules` argument
- * object is modified to include the new rule and new RegExp
- *
- * ### Example:
- *
- *     var rules = { watch: [], ignore: [] };
- *     add(rules, 'watch', '*.js');
- *     add(rules, 'ignore', '/public/');
- *     add(rules, 'watch', ':(\d)*\.js'); // note: string based regexp
- *     add(rules, 'watch', /\d*\.js/);
- *
- * @param {Object} rules containing `watch` and `ignore`. Also updated during
- *                       execution
- * @param {String} which must be either "watch" or "ignore"
- * @param {String|RegExp} rule the actual rule.
- */
-function add(rules, which, rule) {
-  if (!{ ignore: 1, watch: 1}[which]) {
-    throw new Error('rules/index.js#add requires "ignore" or "watch" as the ' +
-      'first argument');
-  }
-
-  if (Array.isArray(rule)) {
-    rule.forEach(function (rule) {
-      add(rules, which, rule);
-    });
-    return;
-  }
-
-  // support the rule being a RegExp, but reformat it to
-  // the custom :<regexp> format that we're working with.
-  if (rule instanceof RegExp) {
-    // rule = ':' + rule.toString().replace(/^\/(.*?)\/$/g, '$1');
-    utils.log.error('RegExp format no longer supported, but globs are.');
-    return;
-  }
-
-  // remove comments and trim lines
-  // this mess of replace methods is escaping "\#" to allow for emacs temp files
-
-  // first up strip comments and remove blank head or tails
-  rule = (rule || '').replace(reEscComments, '^^')
-             .replace(reComments, '')
-             .replace(reUnescapeComments, '#').trim();
-
-  var regexp = false;
-
-  if (typeof rule === 'string' && rule.substring(0, 1) === ':') {
-    rule = rule.substring(1);
-    utils.log.error('RegExp no longer supported: ' + rule);
-    regexp = true;
-  } else if (rule.length === 0) {
-    // blank line (or it was a comment)
-    return;
-  }
-
-  if (regexp) {
-    // rules[which].push(rule);
-  } else {
-    // rule = rule.replace(reEscapeChars, '\\$&')
-    // .replace(reAsterisk, '.*');
-
-    rules[which].push(rule);
-    // compile a regexp of all the rules for this ignore or watch
-    var re = rules[which].map(function (rule) {
-      return rule.replace(reEscapeChars, '\\$&')
-                 .replace(reAsterisk, '.*');
-    }).join('|');
-
-    // used for the directory matching
-    rules[which].re = new RegExp(re);
-  }
-}
Index: de_modules/nodemon/lib/rules/index.js
===================================================================
--- node_modules/nodemon/lib/rules/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,53 +1,0 @@
-'use strict';
-var utils = require('../utils');
-var add = require('./add');
-var parse = require('./parse');
-
-// exported
-var rules = { ignore: [], watch: [] };
-
-/**
- * Loads a nodemon config file and populates the ignore
- * and watch rules with it's contents, and calls callback
- * with the new rules
- *
- * @param  {String} filename
- * @param  {Function} callback
- */
-function load(filename, callback) {
-  parse(filename, function (err, result) {
-    if (err) {
-      // we should have bombed already, but
-      utils.log.error(err);
-      callback(err);
-    }
-
-    if (result.raw) {
-      result.raw.forEach(add.bind(null, rules, 'ignore'));
-    } else {
-      result.ignore.forEach(add.bind(null, rules, 'ignore'));
-      result.watch.forEach(add.bind(null, rules, 'watch'));
-    }
-
-    callback(null, rules);
-  });
-}
-
-module.exports = {
-  reset: function () { // just used for testing
-    rules.ignore.length = rules.watch.length = 0;
-    delete rules.ignore.re;
-    delete rules.watch.re;
-  },
-  load: load,
-  ignore: {
-    test: add.bind(null, rules, 'ignore'),
-    add: add.bind(null, rules, 'ignore'),
-  },
-  watch: {
-    test: add.bind(null, rules, 'watch'),
-    add: add.bind(null, rules, 'watch'),
-  },
-  add: add.bind(null, rules),
-  rules: rules,
-};
Index: de_modules/nodemon/lib/rules/parse.js
===================================================================
--- node_modules/nodemon/lib/rules/parse.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-'use strict';
-var fs = require('fs');
-
-/**
- * Parse the nodemon config file, supporting both old style
- * plain text config file, and JSON version of the config
- *
- * @param  {String}   filename
- * @param  {Function} callback
- */
-function parse(filename, callback) {
-  var rules = {
-    ignore: [],
-    watch: [],
-  };
-
-  fs.readFile(filename, 'utf8', function (err, content) {
-
-    if (err) {
-      return callback(err);
-    }
-
-    var json = null;
-    try {
-      json = JSON.parse(content);
-    } catch (e) {}
-
-    if (json !== null) {
-      rules = {
-        ignore: json.ignore || [],
-        watch: json.watch || [],
-      };
-
-      return callback(null, rules);
-    }
-
-    // otherwise return the raw file
-    return callback(null, { raw: content.split(/\n/) });
-  });
-}
-
-module.exports = parse;
-
Index: de_modules/nodemon/lib/spawn.js
===================================================================
--- node_modules/nodemon/lib/spawn.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,74 +1,0 @@
-const path = require('path');
-const utils = require('./utils');
-const merge = utils.merge;
-const bus = utils.bus;
-const spawn = require('child_process').spawn;
-
-module.exports = function spawnCommand(command, config, eventArgs) {
-  var stdio = ['pipe', 'pipe', 'pipe'];
-
-  if (config.options.stdout) {
-    stdio = ['pipe', process.stdout, process.stderr];
-  }
-
-  const env = merge(process.env, { FILENAME: eventArgs[0] });
-
-  var sh = 'sh';
-  var shFlag = '-c';
-  var spawnOptions = {
-    env: merge(config.options.execOptions.env, env),
-    stdio: stdio,
-  };
-
-  if (!Array.isArray(command)) {
-    command = [command];
-  }
-
-  if (utils.isWindows) {
-    // if the exec includes a forward slash, reverse it for windows compat
-    // but *only* apply to the first command, and none of the arguments.
-    // ref #1251 and #1236
-    command = command.map(executable => {
-      if (executable.indexOf('/') === -1) {
-        return executable;
-      }
-
-      return  executable.split(' ').map((e, i) => {
-        if (i === 0) {
-          return path.normalize(e);
-        }
-        return e;
-      }).join(' ');
-    });
-    // taken from npm's cli: https://git.io/vNFD4
-    sh = process.env.comspec || 'cmd';
-    shFlag = '/d /s /c';
-    spawnOptions.windowsVerbatimArguments = true;
-    spawnOptions.windowsHide = true;
-  }
-
-  const args = command.join(' ');
-  const child = spawn(sh, [shFlag, args], spawnOptions);
-
-  if (config.required) {
-    var emit = {
-      stdout: function (data) {
-        bus.emit('stdout', data);
-      },
-      stderr: function (data) {
-        bus.emit('stderr', data);
-      },
-    };
-
-    // now work out what to bind to...
-    if (config.options.stdout) {
-      child.on('stdout', emit.stdout).on('stderr', emit.stderr);
-    } else {
-      child.stdout.on('data', emit.stdout);
-      child.stderr.on('data', emit.stderr);
-
-      bus.stdout = child.stdout;
-      bus.stderr = child.stderr;
-    }
-  }
-};
Index: de_modules/nodemon/lib/utils/bus.js
===================================================================
--- node_modules/nodemon/lib/utils/bus.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,44 +1,0 @@
-var events = require('events');
-var debug = require('debug')('nodemon');
-var util = require('util');
-
-var Bus = function () {
-  events.EventEmitter.call(this);
-};
-
-util.inherits(Bus, events.EventEmitter);
-
-var bus = new Bus();
-
-// /*
-var collected = {};
-bus.on('newListener', function (event) {
-  debug('bus new listener: %s (%s)', event, bus.listeners(event).length);
-  if (!collected[event]) {
-    collected[event] = true;
-    bus.on(event, function () {
-      debug('bus emit: %s', event);
-    });
-  }
-});
-
-// */
-
-// proxy process messages (if forked) to the bus
-process.on('message', function (event) {
-  debug('process.message(%s)', event);
-  bus.emit(event);
-});
-
-var emit = bus.emit;
-
-// if nodemon was spawned via a fork, allow upstream communication
-// via process.send
-if (process.send) {
-  bus.emit = function (event, data) {
-    process.send({ type: event, data: data });
-    emit.apply(bus, arguments);
-  };
-}
-
-module.exports = bus;
Index: de_modules/nodemon/lib/utils/clone.js
===================================================================
--- node_modules/nodemon/lib/utils/clone.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,40 +1,0 @@
-module.exports = clone;
-
-// via http://stackoverflow.com/a/728694/22617
-function clone(obj) {
-  // Handle the 3 simple types, and null or undefined
-  if (null === obj || 'object' !== typeof obj) {
-    return obj;
-  }
-
-  var copy;
-
-  // Handle Date
-  if (obj instanceof Date) {
-    copy = new Date();
-    copy.setTime(obj.getTime());
-    return copy;
-  }
-
-  // Handle Array
-  if (obj instanceof Array) {
-    copy = [];
-    for (var i = 0, len = obj.length; i < len; i++) {
-      copy[i] = clone(obj[i]);
-    }
-    return copy;
-  }
-
-  // Handle Object
-  if (obj instanceof Object) {
-    copy = {};
-    for (var attr in obj) {
-      if (obj.hasOwnProperty && obj.hasOwnProperty(attr)) {
-        copy[attr] = clone(obj[attr]);
-      }
-    }
-    return copy;
-  }
-
-  throw new Error('Unable to copy obj! Its type isn\'t supported.');
-}
Index: de_modules/nodemon/lib/utils/colour.js
===================================================================
--- node_modules/nodemon/lib/utils/colour.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,26 +1,0 @@
-/**
- * Encodes a string in a colour: red, yellow or green
- * @param  {String} c   colour to highlight in
- * @param  {String} str the string to encode
- * @return {String}     coloured string for terminal printing
- */
-function colour(c, str) {
-  return (colour[c] || colour.black) + str + colour.black;
-}
-
-function strip(str) {
-  re.lastIndex = 0; // reset position
-  return str.replace(re, '');
-}
-
-colour.red = '\x1B[31m';
-colour.yellow = '\x1B[33m';
-colour.green = '\x1B[32m';
-colour.black = '\x1B[39m';
-
-var reStr = Object.keys(colour).map(key => colour[key]).join('|');
-var re = new RegExp(('(' + reStr + ')').replace(/\[/g, '\\['), 'g');
-
-colour.strip = strip;
-
-module.exports = colour;
Index: de_modules/nodemon/lib/utils/index.js
===================================================================
--- node_modules/nodemon/lib/utils/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,103 +1,0 @@
-var noop = function () { };
-var path = require('path');
-const semver = require('semver');
-var version = process.versions.node.split('.') || [null, null, null];
-
-var utils = (module.exports = {
-  semver: semver,
-  satisfies: test => semver.satisfies(process.versions.node, test),
-  version: {
-    major: parseInt(version[0] || 0, 10),
-    minor: parseInt(version[1] || 0, 10),
-    patch: parseInt(version[2] || 0, 10),
-  },
-  clone: require('./clone'),
-  merge: require('./merge'),
-  bus: require('./bus'),
-  isWindows: process.platform === 'win32',
-  isMac: process.platform === 'darwin',
-  isLinux: process.platform === 'linux',
-  isIBMi: require('os').type() === 'OS400',
-  isRequired: (function () {
-    var p = module.parent;
-    while (p) {
-      // in electron.js engine it happens
-      if (!p.filename) {
-        return true;
-      }
-      if (p.filename.indexOf('bin' + path.sep + 'nodemon.js') !== -1) {
-        return false;
-      }
-      p = p.parent;
-    }
-
-    return true;
-  })(),
-  home: process.env.HOME || process.env.HOMEPATH,
-  quiet: function () {
-    // nukes the logging
-    if (!this.debug) {
-      for (var method in utils.log) {
-        if (typeof utils.log[method] === 'function') {
-          utils.log[method] = noop;
-        }
-      }
-    }
-  },
-  reset: function () {
-    if (!this.debug) {
-      for (var method in utils.log) {
-        if (typeof utils.log[method] === 'function') {
-          delete utils.log[method];
-        }
-      }
-    }
-    this.debug = false;
-  },
-  regexpToText: function (t) {
-    return t
-      .replace(/\.\*\\./g, '*.')
-      .replace(/\\{2}/g, '^^')
-      .replace(/\\/g, '')
-      .replace(/\^\^/g, '\\');
-  },
-  stringify: function (exec, args) {
-    // serializes an executable string and array of arguments into a string
-    args = args || [];
-
-    return [exec]
-      .concat(
-      args.map(function (arg) {
-        // if an argument contains a space, we want to show it with quotes
-        // around it to indicate that it is a single argument
-        if (arg.length > 0 && arg.indexOf(' ') === -1) {
-          return arg;
-        }
-        // this should correctly escape nested quotes
-        return JSON.stringify(arg);
-      })
-      )
-      .join(' ')
-      .trim();
-  },
-});
-
-utils.log = require('./log')(utils.isRequired);
-
-Object.defineProperty(utils, 'debug', {
-  set: function (value) {
-    this.log.debug = value;
-  },
-  get: function () {
-    return this.log.debug;
-  },
-});
-
-Object.defineProperty(utils, 'colours', {
-  set: function (value) {
-    this.log.useColours = value;
-  },
-  get: function () {
-    return this.log.useColours;
-  },
-});
Index: de_modules/nodemon/lib/utils/log.js
===================================================================
--- node_modules/nodemon/lib/utils/log.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-var colour = require('./colour');
-var bus = require('./bus');
-var required = false;
-var useColours = true;
-
-var coding = {
-  log: 'black',
-  info: 'yellow',
-  status: 'green',
-  detail: 'yellow',
-  fail: 'red',
-  error: 'red',
-};
-
-function log(type, text) {
-  var msg = '[nodemon] ' + (text || '');
-
-  if (useColours) {
-    msg = colour(coding[type], msg);
-  }
-
-  // always push the message through our bus, using nextTick
-  // to help testing and get _out of_ promises.
-  process.nextTick(() => {
-    bus.emit('log', { type: type, message: text, colour: msg });
-  });
-
-  // but if we're running on the command line, also echo out
-  // question: should we actually just consume our own events?
-  if (!required) {
-    if (type === 'error') {
-      console.error(msg);
-    } else {
-      console.log(msg || '');
-    }
-  }
-}
-
-var Logger = function (r) {
-  if (!(this instanceof Logger)) {
-    return new Logger(r);
-  }
-  this.required(r);
-  return this;
-};
-
-Object.keys(coding).forEach(function (type) {
-  Logger.prototype[type] = log.bind(null, type);
-});
-
-// detail is for messages that are turned on during debug
-Logger.prototype.detail = function (msg) {
-  if (this.debug) {
-    log('detail', msg);
-  }
-};
-
-Logger.prototype.required = function (val) {
-  required = val;
-};
-
-Logger.prototype.debug = false;
-Logger.prototype._log = function (type, msg) {
-  if (required) {
-    bus.emit('log', { type: type, message: msg || '', colour: msg || '' });
-  } else if (type === 'error') {
-    console.error(msg);
-  } else {
-    console.log(msg || '');
-  }
-};
-
-Object.defineProperty(Logger.prototype, 'useColours', {
-  set: function (val) {
-    useColours = val;
-  },
-  get: function () {
-    return useColours;
-  },
-});
-
-module.exports = Logger;
Index: de_modules/nodemon/lib/utils/merge.js
===================================================================
--- node_modules/nodemon/lib/utils/merge.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,47 +1,0 @@
-var clone = require('./clone');
-
-module.exports = merge;
-
-function typesMatch(a, b) {
-  return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b));
-}
-
-/**
- * A deep merge of the source based on the target.
- * @param  {Object} source   [description]
- * @param  {Object} target   [description]
- * @return {Object}          [description]
- */
-function merge(source, target, result) {
-  if (result === undefined) {
-    result = clone(source);
-  }
-
-  // merge missing values from the target to the source
-  Object.getOwnPropertyNames(target).forEach(function (key) {
-    if (source[key] === undefined) {
-      result[key] = target[key];
-    }
-  });
-
-  Object.getOwnPropertyNames(source).forEach(function (key) {
-    var value = source[key];
-
-    if (target[key] && typesMatch(value, target[key])) {
-      // merge empty values
-      if (value === '') {
-        result[key] = target[key];
-      }
-
-      if (Array.isArray(value)) {
-        if (value.length === 0 && target[key].length) {
-          result[key] = target[key].slice(0);
-        }
-      } else if (typeof value === 'object') {
-        result[key] = merge(value, target[key]);
-      }
-    }
-  });
-
-  return result;
-}
Index: de_modules/nodemon/lib/version.js
===================================================================
--- node_modules/nodemon/lib/version.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,100 +1,0 @@
-module.exports = version;
-module.exports.pin = pin;
-
-var fs = require('fs');
-var path = require('path');
-var exec = require('child_process').exec;
-var root = null;
-
-function pin() {
-  return version().then(function (v) {
-    version.pinned = v;
-  });
-}
-
-function version(callback) {
-  // first find the package.json as this will be our root
-  var promise = findPackage(path.dirname(module.parent.filename))
-    .then(function (dir) {
-      // now try to load the package
-      var v = require(path.resolve(dir, 'package.json')).version;
-
-      if (v && v !== '0.0.0-development') {
-        return v;
-      }
-
-      root = dir;
-
-      // else we're in development, give the commit out
-      // get the last commit and whether the working dir is dirty
-      var promises = [
-        branch().catch(function () { return 'master'; }),
-        commit().catch(function () { return '<none>'; }),
-        dirty().catch(function () { return 0; }),
-      ];
-
-      // use the cached result as the export
-      return Promise.all(promises).then(function (res) {
-        var branch = res[0];
-        var commit = res[1];
-        var dirtyCount = parseInt(res[2], 10);
-        var curr = branch + ': ' + commit;
-        if (dirtyCount !== 0) {
-          curr += ' (' + dirtyCount + ' dirty files)';
-        }
-
-        return curr;
-      });
-    }).catch(function (error) {
-      console.log(error.stack);
-      throw error;
-    });
-
-  if (callback) {
-    promise.then(function (res) {
-      callback(null, res);
-    }, callback);
-  }
-
-  return promise;
-}
-
-function findPackage(dir) {
-  if (dir === '/') {
-    return Promise.reject(new Error('package not found'));
-  }
-  return new Promise(function (resolve) {
-    fs.stat(path.resolve(dir, 'package.json'), function (error, exists) {
-      if (error || !exists) {
-        return resolve(findPackage(path.resolve(dir, '..')));
-      }
-
-      resolve(dir);
-    });
-  });
-}
-
-function command(cmd) {
-  return new Promise(function (resolve, reject) {
-    exec(cmd, { cwd: root }, function (err, stdout, stderr) {
-      var error = stderr.trim();
-      if (error) {
-        return reject(new Error(error));
-      }
-      resolve(stdout.split('\n').join(''));
-    });
-  });
-}
-
-function commit() {
-  return command('git rev-parse HEAD');
-}
-
-function branch() {
-  return command('git rev-parse --abbrev-ref HEAD');
-}
-
-function dirty() {
-  return command('expr $(git status --porcelain 2>/dev/null| ' +
-    'egrep "^(M| M)" | wc -l)');
-}
Index: de_modules/nodemon/package.json
===================================================================
--- node_modules/nodemon/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,78 +1,0 @@
-{
-  "name": "nodemon",
-  "homepage": "https://nodemon.io",
-  "author": {
-    "name": "Remy Sharp",
-    "url": "https://github.com/remy"
-  },
-  "bin": {
-    "nodemon": "./bin/nodemon.js"
-  },
-  "engines": {
-    "node": ">=10"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/nodemon.git"
-  },
-  "description": "Simple monitor script for use during development of a Node.js app.",
-  "keywords": [
-    "cli",
-    "monitor",
-    "monitor",
-    "development",
-    "restart",
-    "autoload",
-    "reload",
-    "terminal"
-  ],
-  "license": "MIT",
-  "types": "./index.d.ts",
-  "main": "./lib/nodemon",
-  "scripts": {
-    "commitmsg": "commitlint -e",
-    "coverage": "istanbul cover _mocha -- --timeout 30000 --ui bdd --reporter list test/**/*.test.js",
-    "lint": "eslint lib/**/*.js",
-    "test": "npm run lint && npm run spec",
-    "spec": "for FILE in test/**/*.test.js; do echo $FILE; TEST=1 mocha --exit --timeout 30000 $FILE; if [ $? -ne 0 ]; then exit 1; fi; sleep 1; done",
-    "postspec": "npm run clean",
-    "clean": "rm -rf test/fixtures/test*.js test/fixtures/test*.md",
-    "web": "node web",
-    "semantic-release": "semantic-release",
-    "prepush": "npm run lint",
-    "killall": "ps auxww | grep node | grep -v grep | awk '{ print $2 }' | xargs kill -9"
-  },
-  "devDependencies": {
-    "@commitlint/cli": "^11.0.0",
-    "@commitlint/config-conventional": "^11.0.0",
-    "async": "1.4.2",
-    "coffee-script": "~1.7.1",
-    "eslint": "^7.32.0",
-    "husky": "^7.0.4",
-    "mocha": "^2.5.3",
-    "nyc": "^15.1.0",
-    "proxyquire": "^1.8.0",
-    "semantic-release": "^25.0.0",
-    "should": "~4.0.0"
-  },
-  "dependencies": {
-    "chokidar": "^3.5.2",
-    "debug": "^4",
-    "ignore-by-default": "^1.0.1",
-    "minimatch": "^10.2.1",
-    "pstree.remy": "^1.1.8",
-    "semver": "^7.5.3",
-    "simple-update-notifier": "^2.0.0",
-    "supports-color": "^5.5.0",
-    "touch": "^3.1.0",
-    "undefsafe": "^2.0.5"
-  },
-  "version": "3.1.14",
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/nodemon"
-  },
-  "publishConfig": {
-    "provenance": true
-  }
-}
Index: de_modules/normalize-path/LICENSE
===================================================================
--- node_modules/normalize-path/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2018, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/normalize-path/README.md
===================================================================
--- node_modules/normalize-path/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,127 +1,0 @@
-# normalize-path [![NPM version](https://img.shields.io/npm/v/normalize-path.svg?style=flat)](https://www.npmjs.com/package/normalize-path) [![NPM monthly downloads](https://img.shields.io/npm/dm/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![NPM total downloads](https://img.shields.io/npm/dt/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/normalize-path.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/normalize-path)
-
-> Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save normalize-path
-```
-
-## Usage
-
-```js
-const normalize = require('normalize-path');
-
-console.log(normalize('\\foo\\bar\\baz\\')); 
-//=> '/foo/bar/baz'
-```
-
-**win32 namespaces**
-
-```js
-console.log(normalize('\\\\?\\UNC\\Server01\\user\\docs\\Letter.txt')); 
-//=> '//?/UNC/Server01/user/docs/Letter.txt'
-
-console.log(normalize('\\\\.\\CdRomX')); 
-//=> '//./CdRomX'
-```
-
-**Consecutive slashes**
-
-Condenses multiple consecutive forward slashes (except for leading slashes in win32 namespaces) to a single slash.
-
-```js
-console.log(normalize('.//foo//bar///////baz/')); 
-//=> './foo/bar/baz'
-```
-
-### Trailing slashes
-
-By default trailing slashes are removed. Pass `false` as the last argument to disable this behavior and _**keep** trailing slashes_:
-
-```js
-console.log(normalize('foo\\bar\\baz\\', false)); //=> 'foo/bar/baz/'
-console.log(normalize('./foo/bar/baz/', false)); //=> './foo/bar/baz/'
-```
-
-## Release history
-
-### v3.0
-
-No breaking changes in this release.
-
-* a check was added to ensure that [win32 namespaces](https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces) are handled properly by win32 `path.parse()` after a path has been normalized by this library.
-* a minor optimization was made to simplify how the trailing separator was handled
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-Other useful path-related libraries:
-
-* [contains-path](https://www.npmjs.com/package/contains-path): Return true if a file path contains the given path. | [homepage](https://github.com/jonschlinkert/contains-path "Return true if a file path contains the given path.")
-* [is-absolute](https://www.npmjs.com/package/is-absolute): Returns true if a file path is absolute. Does not rely on the path module… [more](https://github.com/jonschlinkert/is-absolute) | [homepage](https://github.com/jonschlinkert/is-absolute "Returns true if a file path is absolute. Does not rely on the path module and can be used as a polyfill for node.js native `path.isAbolute`.")
-* [is-relative](https://www.npmjs.com/package/is-relative): Returns `true` if the path appears to be relative. | [homepage](https://github.com/jonschlinkert/is-relative "Returns `true` if the path appears to be relative.")
-* [parse-filepath](https://www.npmjs.com/package/parse-filepath): Pollyfill for node.js `path.parse`, parses a filepath into an object. | [homepage](https://github.com/jonschlinkert/parse-filepath "Pollyfill for node.js `path.parse`, parses a filepath into an object.")
-* [path-ends-with](https://www.npmjs.com/package/path-ends-with): Return `true` if a file path ends with the given string/suffix. | [homepage](https://github.com/jonschlinkert/path-ends-with "Return `true` if a file path ends with the given string/suffix.")
-* [unixify](https://www.npmjs.com/package/unixify): Convert Windows file paths to unix paths. | [homepage](https://github.com/jonschlinkert/unixify "Convert Windows file paths to unix paths.")
-
-### Contributors
-
-| **Commits** | **Contributor** | 
-| --- | --- |
-| 35 | [jonschlinkert](https://github.com/jonschlinkert) |
-| 1 | [phated](https://github.com/phated) |
-
-### Author
-
-**Jon Schlinkert**
-
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 19, 2018._
Index: de_modules/normalize-path/index.js
===================================================================
--- node_modules/normalize-path/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,35 +1,0 @@
-/*!
- * normalize-path <https://github.com/jonschlinkert/normalize-path>
- *
- * Copyright (c) 2014-2018, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-module.exports = function(path, stripTrailing) {
-  if (typeof path !== 'string') {
-    throw new TypeError('expected path to be a string');
-  }
-
-  if (path === '\\' || path === '/') return '/';
-
-  var len = path.length;
-  if (len <= 1) return path;
-
-  // ensure that win32 namespaces has two leading slashes, so that the path is
-  // handled properly by the win32 version of path.parse() after being normalized
-  // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces
-  var prefix = '';
-  if (len > 4 && path[3] === '\\') {
-    var ch = path[2];
-    if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') {
-      path = path.slice(2);
-      prefix = '//';
-    }
-  }
-
-  var segs = path.split(/[/\\]+/);
-  if (stripTrailing !== false && segs[segs.length - 1] === '') {
-    segs.pop();
-  }
-  return prefix + segs.join('/');
-};
Index: de_modules/normalize-path/package.json
===================================================================
--- node_modules/normalize-path/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,77 +1,0 @@
-{
-  "name": "normalize-path",
-  "description": "Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.",
-  "version": "3.0.0",
-  "homepage": "https://github.com/jonschlinkert/normalize-path",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Blaine Bublitz (https://twitter.com/BlaineBublitz)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "jonschlinkert/normalize-path",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/normalize-path/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^1.0.0",
-    "minimist": "^1.2.0",
-    "mocha": "^3.5.3"
-  },
-  "keywords": [
-    "absolute",
-    "backslash",
-    "delimiter",
-    "file",
-    "file-path",
-    "filepath",
-    "fix",
-    "forward",
-    "fp",
-    "fs",
-    "normalize",
-    "path",
-    "relative",
-    "separator",
-    "slash",
-    "slashes",
-    "trailing",
-    "unix",
-    "urix"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "description": "Other useful path-related libraries:",
-      "list": [
-        "contains-path",
-        "is-absolute",
-        "is-relative",
-        "parse-filepath",
-        "path-ends-with",
-        "path-ends-with",
-        "unixify"
-      ]
-    },
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
Index: de_modules/pg-cloudflare/LICENSE
===================================================================
--- node_modules/pg-cloudflare/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2010 - 2021 Brian Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/pg-cloudflare/README.md
===================================================================
--- node_modules/pg-cloudflare/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,112 +1,0 @@
-# pg-cloudflare
-
-`pg-cloudflare` makes it easier to take an existing package that relies on `tls` and `net`, and make it work in environments where only `connect()` is supported, such as Cloudflare Workers.
-
-`pg-cloudflare` wraps `connect()`, the [TCP Socket API](https://github.com/wintercg/proposal-sockets-api) proposed within WinterCG, and implemented in [Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/), and exposes an interface with methods similar to what the `net` and `tls` modules in Node.js expose. (ex: `net.connect(path[, options][, callback])`). This minimizes the number of changes needed in order to make an existing package work across JavaScript runtimes.
-
-## Installation
-
-```
-npm i --save-dev pg-cloudflare
-```
-
-The package uses conditional exports to support bundlers that don't know about
-`cloudflare:sockets`, so the consumer code by default imports an empty file. To
-enable the package, resolve to the `cloudflare` condition in your bundler's
-config. For example:
-
-- `webpack.config.js`
-  ```js
-  export default {
-    ...,
-    resolve: { conditionNames: [..., "workerd"] },
-    plugins: [
-      // ignore cloudflare:sockets imports
-      new webpack.IgnorePlugin({
-        resourceRegExp: /^cloudflare:sockets$/,
-      }),
-    ],
-  }
-  ```
-- `vite.config.js`
-
-  > [!NOTE]
-  > If you are using the [Cloudflare Vite plugin](https://www.npmjs.com/package/@cloudflare/vite-plugin) then the following configuration is not necessary.
-
-  ```js
-  export default defineConfig({
-    ...,
-    resolve: {
-      conditions: [..., "workerd"],
-    },
-    build: {
-      ...,
-      // don't try to bundle cloudflare:sockets
-      rollupOptions: {
-        external: [..., 'cloudflare:sockets'],
-      },
-    },
-  })
-  ```
-
-- `rollup.config.js`
-  ```js
-  export default defineConfig({
-    ...,
-    plugins: [..., nodeResolve({ exportConditions: [..., 'workerd'] })],
-    // don't try to bundle cloudflare:sockets
-    external: [..., 'cloudflare:sockets'],
-  })
-  ```
-- `esbuild.config.js`
-  ```js
-  await esbuild.build({
-    ...,
-    conditions: [..., 'workerd'],
-  })
-  ```
-
-The concrete examples can be found in `packages/pg-bundler-test`.
-
-## How to use conditionally, in non-Node.js environments
-
-As implemented in `pg` [here](https://github.com/brianc/node-postgres/commit/07553428e9c0eacf761a5d4541a3300ff7859578#diff-34588ad868ebcb232660aba7ee6a99d1e02f4bc93f73497d2688c3f074e60533R5-R13), a typical use case might look as follows, where in a Node.js environment the `net` module is used, while in a non-Node.js environment, where `net` is unavailable, `pg-cloudflare` is used instead, providing an equivalent interface:
-
-```js
-module.exports.getStream = function getStream(ssl = false) {
-  const net = require('net')
-  if (typeof net.Socket === 'function') {
-    return net.Socket()
-  }
-  const { CloudflareSocket } = require('pg-cloudflare')
-  return new CloudflareSocket(ssl)
-}
-```
-
-## Node.js implementation of the Socket API proposal
-
-If you're looking for a way to rely on `connect()` as the interface you use to interact with raw sockets, but need this interface to be available in a Node.js environment, [`@arrowood.dev/socket`](https://github.com/Ethan-Arrowood/socket) provides a Node.js implementation of the Socket API.
-
-### license
-
-The MIT License (MIT)
-
-Copyright (c) 2023 Brian M. Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/pg-cloudflare/dist/empty.d.ts
===================================================================
--- node_modules/pg-cloudflare/dist/empty.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,2 +1,0 @@
-declare const _default: {};
-export default _default;
Index: de_modules/pg-cloudflare/dist/empty.js
===================================================================
--- node_modules/pg-cloudflare/dist/empty.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,6 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-// This is an empty module that is served up when outside of a workerd environment
-// See the `exports` field in package.json
-exports.default = {};
-//# sourceMappingURL=empty.js.map
Index: de_modules/pg-cloudflare/dist/empty.js.map
===================================================================
--- node_modules/pg-cloudflare/dist/empty.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"empty.js","sourceRoot":"","sources":["../src/empty.ts"],"names":[],"mappings":";;AAAA,kFAAkF;AAClF,0CAA0C;AAC1C,kBAAe,EAAE,CAAA"}
Index: de_modules/pg-cloudflare/dist/index.d.ts
===================================================================
--- node_modules/pg-cloudflare/dist/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,31 +1,0 @@
-/// <reference types="node" />
-/// <reference types="node" />
-/// <reference types="node" />
-import { TlsOptions } from 'cloudflare:sockets';
-import { EventEmitter } from 'events';
-/**
- * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
- */
-export declare class CloudflareSocket extends EventEmitter {
-    readonly ssl: boolean;
-    writable: boolean;
-    destroyed: boolean;
-    private _upgrading;
-    private _upgraded;
-    private _cfSocket;
-    private _cfWriter;
-    private _cfReader;
-    constructor(ssl: boolean);
-    setNoDelay(): this;
-    setKeepAlive(): this;
-    ref(): this;
-    unref(): this;
-    connect(port: number, host: string, connectListener?: (...args: unknown[]) => void): Promise<this | undefined>;
-    _listen(): Promise<void>;
-    _listenOnce(): Promise<void>;
-    write(data: Uint8Array | string, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): true | void;
-    end(data?: Buffer, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): this;
-    destroy(reason: string): this;
-    startTls(options: TlsOptions): void;
-    _addClosedHandler(): void;
-}
Index: de_modules/pg-cloudflare/dist/index.js
===================================================================
--- node_modules/pg-cloudflare/dist/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,154 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CloudflareSocket = void 0;
-const events_1 = require("events");
-/**
- * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
- */
-class CloudflareSocket extends events_1.EventEmitter {
-    constructor(ssl) {
-        super();
-        this.ssl = ssl;
-        this.writable = false;
-        this.destroyed = false;
-        this._upgrading = false;
-        this._upgraded = false;
-        this._cfSocket = null;
-        this._cfWriter = null;
-        this._cfReader = null;
-    }
-    setNoDelay() {
-        return this;
-    }
-    setKeepAlive() {
-        return this;
-    }
-    ref() {
-        return this;
-    }
-    unref() {
-        return this;
-    }
-    async connect(port, host, connectListener) {
-        try {
-            log('connecting');
-            if (connectListener)
-                this.once('connect', connectListener);
-            const options = this.ssl ? { secureTransport: 'starttls' } : {};
-            const mod = await import('cloudflare:sockets');
-            const connect = mod.connect;
-            this._cfSocket = connect(`${host}:${port}`, options);
-            this._cfWriter = this._cfSocket.writable.getWriter();
-            this._addClosedHandler();
-            this._cfReader = this._cfSocket.readable.getReader();
-            if (this.ssl) {
-                this._listenOnce().catch((e) => this.emit('error', e));
-            }
-            else {
-                this._listen().catch((e) => this.emit('error', e));
-            }
-            await this._cfWriter.ready;
-            log('socket ready');
-            this.writable = true;
-            this.emit('connect');
-            return this;
-        }
-        catch (e) {
-            this.emit('error', e);
-        }
-    }
-    async _listen() {
-        // eslint-disable-next-line no-constant-condition
-        while (true) {
-            log('awaiting receive from CF socket');
-            const { done, value } = await this._cfReader.read();
-            log('CF socket received:', done, value);
-            if (done) {
-                log('done');
-                break;
-            }
-            this.emit('data', Buffer.from(value));
-        }
-    }
-    async _listenOnce() {
-        log('awaiting first receive from CF socket');
-        const { done, value } = await this._cfReader.read();
-        log('First CF socket received:', done, value);
-        this.emit('data', Buffer.from(value));
-    }
-    write(data, encoding = 'utf8', callback = () => { }) {
-        if (data.length === 0)
-            return callback();
-        if (typeof data === 'string')
-            data = Buffer.from(data, encoding);
-        log('sending data direct:', data);
-        this._cfWriter.write(data).then(() => {
-            log('data sent');
-            callback();
-        }, (err) => {
-            log('send error', err);
-            callback(err);
-        });
-        return true;
-    }
-    end(data = Buffer.alloc(0), encoding = 'utf8', callback = () => { }) {
-        log('ending CF socket');
-        this.write(data, encoding, (err) => {
-            this._cfSocket.close();
-            if (callback)
-                callback(err);
-        });
-        return this;
-    }
-    destroy(reason) {
-        log('destroying CF socket', reason);
-        this.destroyed = true;
-        return this.end();
-    }
-    startTls(options) {
-        if (this._upgraded) {
-            // Don't try to upgrade again.
-            this.emit('error', 'Cannot call `startTls()` more than once on a socket');
-            return;
-        }
-        this._cfWriter.releaseLock();
-        this._cfReader.releaseLock();
-        this._upgrading = true;
-        this._cfSocket = this._cfSocket.startTls(options);
-        this._cfWriter = this._cfSocket.writable.getWriter();
-        this._cfReader = this._cfSocket.readable.getReader();
-        this._addClosedHandler();
-        this._listen().catch((e) => this.emit('error', e));
-    }
-    _addClosedHandler() {
-        this._cfSocket.closed.then(() => {
-            if (!this._upgrading) {
-                log('CF socket closed');
-                this._cfSocket = null;
-                this.emit('close');
-            }
-            else {
-                this._upgrading = false;
-                this._upgraded = true;
-            }
-        }).catch((e) => this.emit('error', e));
-    }
-}
-exports.CloudflareSocket = CloudflareSocket;
-const debug = false;
-function dump(data) {
-    if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
-        // workaround https://github.com/microsoft/TypeScript/issues/63447
-        const buf = data instanceof Uint8Array ? Buffer.from(data) : Buffer.from(data);
-        const hex = buf.toString('hex');
-        const str = new TextDecoder().decode(data);
-        return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`;
-    }
-    else {
-        return data;
-    }
-}
-function log(...args) {
-    debug && console.log(...args.map(dump));
-}
-//# sourceMappingURL=index.js.map
Index: de_modules/pg-cloudflare/dist/index.js.map
===================================================================
--- node_modules/pg-cloudflare/dist/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-cloudflare/esm/index.mjs
===================================================================
--- node_modules/pg-cloudflare/esm/index.mjs	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-import cf from '../dist/index.js'
-
-export const CloudflareSocket = cf.CloudflareSocket
Index: de_modules/pg-cloudflare/package.json
===================================================================
--- node_modules/pg-cloudflare/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,39 +1,0 @@
-{
-  "name": "pg-cloudflare",
-  "version": "1.4.0",
-  "description": "A socket implementation that can run on Cloudflare Workers using native TCP connections.",
-  "main": "dist/index.js",
-  "types": "dist/index.d.ts",
-  "license": "MIT",
-  "devDependencies": {
-    "ts-node": "^8.5.4",
-    "typescript": "^6.0.3"
-  },
-  "exports": {
-    ".": {
-      "workerd": {
-        "import": "./esm/index.mjs",
-        "require": "./dist/index.js"
-      },
-      "default": "./dist/empty.js"
-    },
-    "./package.json": "./package.json"
-  },
-  "scripts": {
-    "build": "tsc",
-    "build:watch": "tsc --watch",
-    "prepublish": "yarn build",
-    "test": "echo e2e test in pg package"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-postgres.git",
-    "directory": "packages/pg-cloudflare"
-  },
-  "files": [
-    "/dist/*{js,ts,map}",
-    "/src",
-    "/esm"
-  ],
-  "gitHead": "544b1ce8152bc280e398dc1e8a66920abe6a640e"
-}
Index: de_modules/pg-cloudflare/src/empty.ts
===================================================================
--- node_modules/pg-cloudflare/src/empty.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-// This is an empty module that is served up when outside of a workerd environment
-// See the `exports` field in package.json
-export default {}
Index: de_modules/pg-cloudflare/src/index.ts
===================================================================
--- node_modules/pg-cloudflare/src/index.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,169 +1,0 @@
-import { SocketOptions, Socket, TlsOptions } from 'cloudflare:sockets'
-import { EventEmitter } from 'events'
-
-/**
- * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
- */
-export class CloudflareSocket extends EventEmitter {
-  writable = false
-  destroyed = false
-
-  private _upgrading = false
-  private _upgraded = false
-  private _cfSocket: Socket | null = null
-  private _cfWriter: WritableStreamDefaultWriter | null = null
-  private _cfReader: ReadableStreamDefaultReader | null = null
-
-  constructor(readonly ssl: boolean) {
-    super()
-  }
-
-  setNoDelay() {
-    return this
-  }
-  setKeepAlive() {
-    return this
-  }
-  ref() {
-    return this
-  }
-  unref() {
-    return this
-  }
-
-  async connect(port: number, host: string, connectListener?: (...args: unknown[]) => void) {
-    try {
-      log('connecting')
-      if (connectListener) this.once('connect', connectListener)
-
-      const options: SocketOptions = this.ssl ? { secureTransport: 'starttls' } : {}
-      const mod = await import('cloudflare:sockets')
-      const connect = mod.connect
-      this._cfSocket = connect(`${host}:${port}`, options)
-      this._cfWriter = this._cfSocket.writable.getWriter()
-      this._addClosedHandler()
-
-      this._cfReader = this._cfSocket.readable.getReader()
-      if (this.ssl) {
-        this._listenOnce().catch((e) => this.emit('error', e))
-      } else {
-        this._listen().catch((e) => this.emit('error', e))
-      }
-
-      await this._cfWriter!.ready
-      log('socket ready')
-      this.writable = true
-      this.emit('connect')
-
-      return this
-    } catch (e) {
-      this.emit('error', e)
-    }
-  }
-
-  async _listen() {
-    // eslint-disable-next-line no-constant-condition
-    while (true) {
-      log('awaiting receive from CF socket')
-      const { done, value } = await this._cfReader!.read()
-      log('CF socket received:', done, value)
-      if (done) {
-        log('done')
-        break
-      }
-      this.emit('data', Buffer.from(value))
-    }
-  }
-
-  async _listenOnce() {
-    log('awaiting first receive from CF socket')
-    const { done, value } = await this._cfReader!.read()
-    log('First CF socket received:', done, value)
-    this.emit('data', Buffer.from(value))
-  }
-
-  write(
-    data: Uint8Array | string,
-    encoding: BufferEncoding = 'utf8',
-    callback: (...args: unknown[]) => void = () => {}
-  ) {
-    if (data.length === 0) return callback()
-    if (typeof data === 'string') data = Buffer.from(data, encoding)
-
-    log('sending data direct:', data)
-    this._cfWriter!.write(data).then(
-      () => {
-        log('data sent')
-        callback()
-      },
-      (err) => {
-        log('send error', err)
-        callback(err)
-      }
-    )
-    return true
-  }
-
-  end(data = Buffer.alloc(0), encoding: BufferEncoding = 'utf8', callback: (...args: unknown[]) => void = () => {}) {
-    log('ending CF socket')
-    this.write(data, encoding, (err) => {
-      this._cfSocket!.close()
-      if (callback) callback(err)
-    })
-    return this
-  }
-
-  destroy(reason: string) {
-    log('destroying CF socket', reason)
-    this.destroyed = true
-    return this.end()
-  }
-
-  startTls(options: TlsOptions) {
-    if (this._upgraded) {
-      // Don't try to upgrade again.
-      this.emit('error', 'Cannot call `startTls()` more than once on a socket')
-      return
-    }
-    this._cfWriter!.releaseLock()
-    this._cfReader!.releaseLock()
-    this._upgrading = true
-    this._cfSocket = this._cfSocket!.startTls(options)
-    this._cfWriter = this._cfSocket.writable.getWriter()
-    this._cfReader = this._cfSocket.readable.getReader()
-    this._addClosedHandler()
-    this._listen().catch((e) => this.emit('error', e))
-  }
-
-  _addClosedHandler() {
-    this._cfSocket!.closed.then(() => {
-      if (!this._upgrading) {
-        log('CF socket closed')
-        this._cfSocket = null
-        this.emit('close')
-      } else {
-        this._upgrading = false
-        this._upgraded = true
-      }
-    }).catch((e) => this.emit('error', e))
-  }
-}
-
-const debug = false
-
-function dump(data: unknown) {
-  if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
-    // workaround https://github.com/microsoft/TypeScript/issues/63447
-    const buf = data instanceof Uint8Array ? Buffer.from(data) : Buffer.from(data)
-
-    const hex = buf.toString('hex')
-    const str = new TextDecoder().decode(data)
-    return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`
-  } else {
-    return data
-  }
-}
-
-function log(...args: unknown[]) {
-  debug && console.log(...args.map(dump))
-}
Index: de_modules/pg-cloudflare/src/types.d.ts
===================================================================
--- node_modules/pg-cloudflare/src/types.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,25 +1,0 @@
-declare module 'cloudflare:sockets' {
-  export class Socket {
-    public readonly readable: any
-    public readonly writable: any
-    public readonly closed: Promise<void>
-    public close(): Promise<void>
-    public startTls(options: TlsOptions): Socket
-  }
-
-  export type TlsOptions = {
-    expectedServerHostname?: string
-  }
-
-  export type SocketAddress = {
-    hostname: string
-    port: number
-  }
-
-  export type SocketOptions = {
-    secureTransport?: 'off' | 'on' | 'starttls'
-    allowHalfOpen?: boolean
-  }
-
-  export function connect(address: string | SocketAddress, options?: SocketOptions): Socket
-}
Index: de_modules/pg-connection-string/LICENSE
===================================================================
--- node_modules/pg-connection-string/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Iced Development
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/pg-connection-string/README.md
===================================================================
--- node_modules/pg-connection-string/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,105 +1,0 @@
-pg-connection-string
-====================
-
-[![NPM](https://nodei.co/npm/pg-connection-string.png?compact=true)](https://nodei.co/npm/pg-connection-string/)
-
-Functions for dealing with a PostgreSQL connection string
-
-`parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git)
-Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
-MIT License
-
-## Usage
-
-```js
-const parse = require('pg-connection-string').parse;
-
-const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
-```
-
-The resulting config contains a subset of the following properties:
-
-* `user` - User with which to authenticate to the server
-* `password` - Corresponding password
-* `host` - Postgres server hostname or, for UNIX domain sockets, the socket filename
-* `port` - port on which to connect
-* `database` - Database name within the server
-* `client_encoding` - string encoding the client will use
-* `ssl`, either a boolean or an object with properties
-  * `rejectUnauthorized`
-  * `cert`
-  * `key`
-  * `ca`
-* any other query parameters (for example, `application_name`) are preserved intact.
-
-### ClientConfig Compatibility for TypeScript
-
-The pg-connection-string `ConnectionOptions` interface is not compatible with the `ClientConfig` interface that [pg.Client](https://node-postgres.com/apis/client) expects. To remedy this, use the `parseIntoClientConfig` function instead of `parse`:
-
-```ts
-import { ClientConfig } from 'pg';
-import { parseIntoClientConfig } from 'pg-connection-string';
-
-const config: ClientConfig = parseIntoClientConfig('postgres://someuser:somepassword@somehost:381/somedatabase')
-```
-
-You can also use `toClientConfig` to convert an existing `ConnectionOptions` interface into a `ClientConfig` interface:
-
-```ts
-import { ClientConfig } from 'pg';
-import { parse, toClientConfig } from 'pg-connection-string';
-
-const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
-const clientConfig: ClientConfig = toClientConfig(config)
-```
-
-## Connection Strings
-
-The short summary of acceptable URLs is:
-
- * `socket:<path>?<query>` - UNIX domain socket
- * `postgres://<user>:<password>@<host>:<port>/<database>?<query>` - TCP connection
-
-But see below for more details.
-
-### UNIX Domain Sockets
-
-When user and password are not given, the socket path follows `socket:`, as in `socket:/var/run/pgsql`.
-This form can be shortened to just a path: `/var/run/pgsql`.
-
-When user and password are given, they are included in the typical URL positions, with an empty `host`, as in `socket://user:pass@/var/run/pgsql`.
-
-Query parameters follow a `?` character, including the following special query parameters:
-
- * `db=<database>` - sets the database name (urlencoded)
- * `encoding=<encoding>` - sets the `client_encoding` property
-
-### TCP Connections
-
-TCP connections to the Postgres server are indicated with `pg:` or `postgres:` schemes (in fact, any scheme but `socket:` is accepted).
-If username and password are included, they should be urlencoded.
-The database name, however, should *not* be urlencoded.
-
-Query parameters follow a `?` character, including the following special query parameters:
- * `host=<host>` - sets `host` property, overriding the URL's host
- * `encoding=<encoding>` - sets the `client_encoding` property
- * `ssl=1`, `ssl=true`, `ssl=0`, `ssl=false` - sets `ssl` to true or false, accordingly
- * `uselibpqcompat=true` - use libpq semantics
- * `sslmode=<sslmode>` when `uselibpqcompat=true` is not set
-   * `sslmode=disable` - sets `ssl` to false
-   * `sslmode=no-verify` - sets `ssl` to `{ rejectUnauthorized: false }`
-   * `sslmode=prefer`, `sslmode=require`, `sslmode=verify-ca`, `sslmode=verify-full` - sets `ssl` to true
- * `sslmode=<sslmode>` when `uselibpqcompat=true`
-   * `sslmode=disable` - sets `ssl` to false
-   * `sslmode=prefer` - sets `ssl` to `{ rejectUnauthorized: false }`
-   * `sslmode=require` - sets `ssl` to `{ rejectUnauthorized: false }` unless `sslrootcert` is specified, in which case it behaves like `verify-ca`
-   * `sslmode=verify-ca` - sets `ssl` to `{ checkServerIdentity: no-op }` (verify CA, but not server identity). This verifies the presented certificate against the effective CA specified in sslrootcert.
-   * `sslmode=verify-full` - sets `ssl` to `{}` (verify CA and server identity)
- * `sslcert=<filename>` - reads data from the given file and includes the result as `ssl.cert`
- * `sslkey=<filename>` - reads data from the given file and includes the result as `ssl.key`
- * `sslrootcert=<filename>` - reads data from the given file and includes the result as `ssl.ca`
-
-A bare relative URL, such as `salesdata`, will indicate a database name while leaving other properties empty.
-
-> [!CAUTION]
-> Choosing an sslmode other than verify-full has serious security implications. Please read https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS to understand the trade-offs.
Index: de_modules/pg-connection-string/esm/index.mjs
===================================================================
--- node_modules/pg-connection-string/esm/index.mjs	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-// ESM wrapper for pg-connection-string
-import connectionString from '../index.js'
-
-// Re-export the parse function
-export default connectionString.parse
-export const parse = connectionString.parse
-export const toClientConfig = connectionString.toClientConfig
-export const parseIntoClientConfig = connectionString.parseIntoClientConfig
Index: de_modules/pg-connection-string/index.d.ts
===================================================================
--- node_modules/pg-connection-string/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,37 +1,0 @@
-import { ClientConfig } from 'pg'
-
-export function parse(connectionString: string, options?: Options): ConnectionOptions
-
-export interface Options {
-  // Use libpq semantics when interpreting the connection string
-  useLibpqCompat?: boolean
-}
-
-interface SSLConfig {
-  ca?: string
-  cert?: string | null
-  key?: string
-  rejectUnauthorized?: boolean
-}
-
-export interface ConnectionOptions {
-  host: string | null
-  password?: string
-  user?: string
-  port?: string | null
-  database: string | null | undefined
-  client_encoding?: string
-  ssl?: boolean | string | SSLConfig
-  sslnegotiation?: 'postgres' | 'direct'
-
-  application_name?: string
-  fallback_application_name?: string
-  options?: string
-  keepalives?: number
-
-  // We allow any other options to be passed through
-  [key: string]: unknown
-}
-
-export function toClientConfig(config: ConnectionOptions): ClientConfig
-export function parseIntoClientConfig(connectionString: string): ClientConfig
Index: de_modules/pg-connection-string/index.js
===================================================================
--- node_modules/pg-connection-string/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,237 +1,0 @@
-'use strict'
-
-//Parse method copied from https://github.com/brianc/node-postgres
-//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
-//MIT License
-
-//parses a connection string
-function parse(str, options = {}) {
-  //unix socket
-  if (str.charAt(0) === '/') {
-    const config = str.split(' ')
-    return { host: config[0], database: config[1] }
-  }
-
-  // Check for empty host in URL
-
-  const config = Object.create(null)
-  let result
-  let dummyHost = false
-  if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {
-    // Ensure spaces are encoded as %20
-    str = encodeURI(str).replace(/%25(\d\d)/g, '%$1')
-  }
-
-  try {
-    try {
-      result = new URL(str, 'postgres://base')
-    } catch (e) {
-      // The URL is invalid so try again with a dummy host
-      result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base')
-      dummyHost = true
-    }
-  } catch (err) {
-    // Remove the input from the error message to avoid leaking sensitive information
-    err.input && (err.input = '*****REDACTED*****')
-    throw err
-  }
-
-  // We'd like to use Object.fromEntries() here but Node.js 10 does not support it
-  for (const entry of result.searchParams.entries()) {
-    config[entry[0]] = entry[1]
-  }
-
-  config.user = config.user || decodeURIComponent(result.username)
-  config.password = config.password || decodeURIComponent(result.password)
-
-  if (result.protocol == 'socket:') {
-    config.host = decodeURI(result.pathname)
-    config.database = result.searchParams.get('db')
-    config.client_encoding = result.searchParams.get('encoding')
-    return config
-  }
-  const hostname = dummyHost ? '' : result.hostname
-  if (!config.host) {
-    // Only set the host if there is no equivalent query param.
-    config.host = decodeURIComponent(hostname)
-  } else if (hostname && /^%2f/i.test(hostname)) {
-    // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host.
-    result.pathname = hostname + result.pathname
-  }
-  if (!config.port) {
-    // Only set the port if there is no equivalent query param.
-    config.port = result.port
-  }
-
-  const pathname = result.pathname.slice(1) || null
-  config.database = pathname ? decodeURI(pathname) : null
-
-  if (config.ssl === 'true' || config.ssl === '1') {
-    config.ssl = true
-  }
-
-  if (config.ssl === '0') {
-    config.ssl = false
-  }
-
-  if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {
-    config.ssl = {}
-  }
-
-  // sslnegotiation=direct implies SSL is in use (libpq requires sslmode>=require),
-  // so enable SSL if the connection string did not otherwise configure it.
-  if (config.sslnegotiation === 'direct' && config.ssl === undefined) {
-    config.ssl = true
-  }
-
-  // Only try to load fs if we expect to read from the disk
-  const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null
-
-  if (config.sslcert) {
-    config.ssl.cert = fs.readFileSync(config.sslcert).toString()
-  }
-
-  if (config.sslkey) {
-    config.ssl.key = fs.readFileSync(config.sslkey).toString()
-  }
-
-  if (config.sslrootcert) {
-    config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()
-  }
-
-  if (options.useLibpqCompat && config.uselibpqcompat) {
-    throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.')
-  }
-
-  if (config.uselibpqcompat === 'true' || options.useLibpqCompat) {
-    switch (config.sslmode) {
-      case 'disable': {
-        config.ssl = false
-        break
-      }
-      case 'prefer': {
-        config.ssl.rejectUnauthorized = false
-        break
-      }
-      case 'require': {
-        if (config.sslrootcert) {
-          // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca`
-          config.ssl.checkServerIdentity = function () {}
-        } else {
-          config.ssl.rejectUnauthorized = false
-        }
-        break
-      }
-      case 'verify-ca': {
-        if (!config.ssl.ca) {
-          throw new Error(
-            'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.'
-          )
-        }
-        config.ssl.checkServerIdentity = function () {}
-        break
-      }
-      case 'verify-full': {
-        break
-      }
-    }
-  } else {
-    switch (config.sslmode) {
-      case 'disable': {
-        config.ssl = false
-        break
-      }
-      case 'prefer':
-      case 'require':
-      case 'verify-ca':
-      case 'verify-full': {
-        if (config.sslmode !== 'verify-full') {
-          deprecatedSslModeWarning(config.sslmode)
-        }
-        break
-      }
-      case 'no-verify': {
-        config.ssl.rejectUnauthorized = false
-        break
-      }
-    }
-  }
-
-  return config
-}
-
-// convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions
-function toConnectionOptions(sslConfig) {
-  const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => {
-    // we explicitly check for undefined and null instead of `if (value)` because some
-    // options accept falsy values. Example: `ssl.rejectUnauthorized = false`
-    if (value !== undefined && value !== null) {
-      c[key] = value
-    }
-
-    return c
-  }, Object.create(null))
-
-  return connectionOptions
-}
-
-// convert pg-connection-string config to a ClientConfig
-function toClientConfig(config) {
-  const poolConfig = Object.entries(config).reduce((c, [key, value]) => {
-    if (key === 'ssl') {
-      const sslConfig = value
-
-      if (typeof sslConfig === 'boolean') {
-        c[key] = sslConfig
-      }
-
-      if (typeof sslConfig === 'object') {
-        c[key] = toConnectionOptions(sslConfig)
-      }
-    } else if (value !== undefined && value !== null) {
-      if (key === 'port') {
-        // when port is not specified, it is converted into an empty string
-        // we want to avoid NaN or empty string as a values in ClientConfig
-        if (value !== '') {
-          const v = parseInt(value, 10)
-          if (isNaN(v)) {
-            throw new Error(`Invalid ${key}: ${value}`)
-          }
-
-          c[key] = v
-        }
-      } else {
-        c[key] = value
-      }
-    }
-
-    return c
-  }, Object.create(null))
-
-  return poolConfig
-}
-
-// parses a connection string into ClientConfig
-function parseIntoClientConfig(str) {
-  return toClientConfig(parse(str))
-}
-
-function deprecatedSslModeWarning(sslmode) {
-  if (!deprecatedSslModeWarning.warned && typeof process !== 'undefined' && process.emitWarning) {
-    deprecatedSslModeWarning.warned = true
-    process.emitWarning(`SECURITY WARNING: The SSL modes 'prefer', 'require', and 'verify-ca' are treated as aliases for 'verify-full'.
-In the next major version (pg-connection-string v3.0.0 and pg v9.0.0), these modes will adopt standard libpq semantics, which have weaker security guarantees.
-
-To prepare for this change:
-- If you want the current behavior, explicitly use 'sslmode=verify-full'
-- If you want libpq compatibility now, use 'uselibpqcompat=true&sslmode=${sslmode}'
-
-See https://www.postgresql.org/docs/current/libpq-ssl.html for libpq SSL mode definitions.`)
-  }
-}
-
-module.exports = parse
-
-parse.parse = parse
-parse.toClientConfig = toClientConfig
-parse.parseIntoClientConfig = parseIntoClientConfig
Index: de_modules/pg-connection-string/package.json
===================================================================
--- node_modules/pg-connection-string/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,52 +1,0 @@
-{
-  "name": "pg-connection-string",
-  "version": "2.14.0",
-  "description": "Functions for dealing with a PostgreSQL connection string",
-  "main": "./index.js",
-  "types": "./index.d.ts",
-  "exports": {
-    ".": {
-      "types": "./index.d.ts",
-      "import": "./esm/index.mjs",
-      "require": "./index.js",
-      "default": "./index.js"
-    }
-  },
-  "scripts": {
-    "test": "nyc --reporter=lcov mocha && npm run check-coverage",
-    "check-coverage": "nyc check-coverage --statements 100 --branches 100 --lines 100 --functions 100"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-postgres.git",
-    "directory": "packages/pg-connection-string"
-  },
-  "keywords": [
-    "pg",
-    "connection",
-    "string",
-    "parse"
-  ],
-  "author": "Blaine Bublitz <blaine@iceddev.com> (http://iceddev.com/)",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/brianc/node-postgres/issues"
-  },
-  "homepage": "https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string",
-  "devDependencies": {
-    "@types/pg": "^8.12.0",
-    "chai": "^4.1.1",
-    "coveralls": "^3.0.4",
-    "istanbul": "^0.4.5",
-    "mocha": "^11.7.5",
-    "nyc": "^15",
-    "tsx": "^4.19.4",
-    "typescript": "^6.0.3"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts",
-    "esm"
-  ],
-  "gitHead": "b617619f9fb6fbd231731823e2732a2927ded4be"
-}
Index: de_modules/pg-int8/LICENSE
===================================================================
--- node_modules/pg-int8/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-Copyright © 2017, Charmander <~@charmander.me>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/pg-int8/README.md
===================================================================
--- node_modules/pg-int8/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-[![Build status][ci image]][ci]
-
-64-bit big-endian signed integer-to-string conversion designed for [pg][].
-
-```js
-const readInt8 = require('pg-int8');
-
-readInt8(Buffer.from([0, 1, 2, 3, 4, 5, 6, 7]))
-// '283686952306183'
-```
-
-
-  [pg]: https://github.com/brianc/node-postgres
-
-  [ci]: https://travis-ci.org/charmander/pg-int8
-  [ci image]: https://api.travis-ci.org/charmander/pg-int8.svg
Index: de_modules/pg-int8/index.js
===================================================================
--- node_modules/pg-int8/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,100 +1,0 @@
-'use strict';
-
-// selected so (BASE - 1) * 0x100000000 + 0xffffffff is a safe integer
-var BASE = 1000000;
-
-function readInt8(buffer) {
-	var high = buffer.readInt32BE(0);
-	var low = buffer.readUInt32BE(4);
-	var sign = '';
-
-	if (high < 0) {
-		high = ~high + (low === 0);
-		low = (~low + 1) >>> 0;
-		sign = '-';
-	}
-
-	var result = '';
-	var carry;
-	var t;
-	var digits;
-	var pad;
-	var l;
-	var i;
-
-	{
-		carry = high % BASE;
-		high = high / BASE >>> 0;
-
-		t = 0x100000000 * carry + low;
-		low = t / BASE >>> 0;
-		digits = '' + (t - BASE * low);
-
-		if (low === 0 && high === 0) {
-			return sign + digits + result;
-		}
-
-		pad = '';
-		l = 6 - digits.length;
-
-		for (i = 0; i < l; i++) {
-			pad += '0';
-		}
-
-		result = pad + digits + result;
-	}
-
-	{
-		carry = high % BASE;
-		high = high / BASE >>> 0;
-
-		t = 0x100000000 * carry + low;
-		low = t / BASE >>> 0;
-		digits = '' + (t - BASE * low);
-
-		if (low === 0 && high === 0) {
-			return sign + digits + result;
-		}
-
-		pad = '';
-		l = 6 - digits.length;
-
-		for (i = 0; i < l; i++) {
-			pad += '0';
-		}
-
-		result = pad + digits + result;
-	}
-
-	{
-		carry = high % BASE;
-		high = high / BASE >>> 0;
-
-		t = 0x100000000 * carry + low;
-		low = t / BASE >>> 0;
-		digits = '' + (t - BASE * low);
-
-		if (low === 0 && high === 0) {
-			return sign + digits + result;
-		}
-
-		pad = '';
-		l = 6 - digits.length;
-
-		for (i = 0; i < l; i++) {
-			pad += '0';
-		}
-
-		result = pad + digits + result;
-	}
-
-	{
-		carry = high % BASE;
-		t = 0x100000000 * carry + low;
-		digits = '' + t % BASE;
-
-		return sign + digits + result;
-	}
-}
-
-module.exports = readInt8;
Index: de_modules/pg-int8/package.json
===================================================================
--- node_modules/pg-int8/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,24 +1,0 @@
-{
-	"name": "pg-int8",
-	"version": "1.0.1",
-	"description": "64-bit big-endian signed integer-to-string conversion",
-	"bugs": "https://github.com/charmander/pg-int8/issues",
-	"license": "ISC",
-	"files": [
-		"index.js"
-	],
-	"repository": {
-		"type": "git",
-		"url": "https://github.com/charmander/pg-int8"
-	},
-	"scripts": {
-		"test": "tap test"
-	},
-	"devDependencies": {
-		"@charmander/eslint-config-base": "1.0.2",
-		"tap": "10.7.3"
-	},
-	"engines": {
-		"node": ">=4.0.0"
-	}
-}
Index: de_modules/pg-pool/LICENSE
===================================================================
--- node_modules/pg-pool/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2017 Brian M. Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/pg-pool/README.md
===================================================================
--- node_modules/pg-pool/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,357 +1,0 @@
-# pg-pool
-
-[![Build Status](https://travis-ci.org/brianc/node-pg-pool.svg?branch=master)](https://travis-ci.org/brianc/node-pg-pool)
-
-A connection pool for node-postgres
-
-## install
-
-```sh
-npm i pg-pool pg
-```
-
-## use
-
-### create
-
-to use pg-pool you must first create an instance of a pool
-
-```js
-const Pool = require('pg-pool')
-
-// by default the pool uses the same
-// configuration as whatever `pg` version you have installed
-const pool = new Pool()
-
-// you can pass properties to the pool
-// these properties are passed unchanged to both the node-postgres Client constructor
-// and the pool constructor, allowing you to fully configure the behavior of both
-const pool2 = new Pool({
-  database: 'postgres',
-  user: 'brianc',
-  password: 'secret!',
-  port: 5432,
-  ssl: true,
-  max: 20, // set pool max size to 20
-  idleTimeoutMillis: 1000, // close idle clients after 1 second
-  connectionTimeoutMillis: 1000, // return an error after 1 second if connection could not be established
-  maxUses: 7500, // close (and replace) a connection after it has been used 7500 times (see below for discussion)
-})
-
-// you can supply a custom client constructor
-// if you want to use the native postgres client
-const NativeClient = require('pg').native.Client
-const nativePool = new Pool({ Client: NativeClient })
-
-// you can even pool pg-native clients directly
-const PgNativeClient = require('pg-native')
-const pgNativePool = new Pool({ Client: PgNativeClient })
-```
-
-##### Note:
-
-The Pool constructor does not support passing a Database URL as the parameter. To use pg-pool on heroku, for example, you need to parse the URL into a config object. Here is an example of how to parse a Database URL.
-
-```js
-const Pool = require('pg-pool')
-const url = require('url')
-
-const params = url.parse(process.env.DATABASE_URL)
-const auth = params.auth.split(':')
-
-const config = {
-  user: auth[0],
-  password: auth[1],
-  host: params.hostname,
-  port: params.port,
-  database: params.pathname.split('/')[1],
-  ssl: true,
-}
-
-const pool = new Pool(config)
-
-/*
-  Transforms, 'postgres://DBuser:secret@DBHost:#####/myDB', into
-  config = {
-    user: 'DBuser',
-    password: 'secret',
-    host: 'DBHost',
-    port: '#####',
-    database: 'myDB',
-    ssl: true
-  }
-*/
-```
-
-### acquire clients with a promise
-
-pg-pool supports a fully promise-based api for acquiring clients
-
-```js
-const pool = new Pool()
-pool.connect().then((client) => {
-  client
-    .query('select $1::text as name', ['pg-pool'])
-    .then((res) => {
-      client.release()
-      console.log('hello from', res.rows[0].name)
-    })
-    .catch((e) => {
-      client.release()
-      console.error('query error', e.message, e.stack)
-    })
-})
-```
-
-### plays nice with async/await
-
-this ends up looking much nicer if you're using [co](https://github.com/tj/co) or async/await:
-
-```js
-// with async/await
-;(async () => {
-  const pool = new Pool()
-  const client = await pool.connect()
-  try {
-    const result = await client.query('select $1::text as name', ['brianc'])
-    console.log('hello from', result.rows[0])
-  } finally {
-    client.release()
-  }
-})().catch((e) => console.error(e.message, e.stack))
-
-// with co
-co(function* () {
-  const client = yield pool.connect()
-  try {
-    const result = yield client.query('select $1::text as name', ['brianc'])
-    console.log('hello from', result.rows[0])
-  } finally {
-    client.release()
-  }
-}).catch((e) => console.error(e.message, e.stack))
-```
-
-### your new favorite helper method
-
-because its so common to just run a query and return the client to the pool afterward pg-pool has this built-in:
-
-```js
-const pool = new Pool()
-const time = await pool.query('SELECT NOW()')
-const name = await pool.query('select $1::text as name', ['brianc'])
-console.log(name.rows[0].name, 'says hello at', time.rows[0].now)
-```
-
-you can also use a callback here if you'd like:
-
-```js
-const pool = new Pool()
-pool.query('SELECT $1::text as name', ['brianc'], function (err, res) {
-  console.log(res.rows[0].name) // brianc
-})
-```
-
-**pro tip:** unless you need to run a transaction (which requires a single client for multiple queries) or you
-have some other edge case like [streaming rows](https://github.com/brianc/node-pg-query-stream) or using a [cursor](https://github.com/brianc/node-pg-cursor)
-you should almost always just use `pool.query`. Its easy, it does the right thing :tm:, and wont ever forget to return
-clients back to the pool after the query is done.
-
-### drop-in backwards compatible
-
-pg-pool still and will always support the traditional callback api for acquiring a client. This is the exact API node-postgres has shipped with for years:
-
-```js
-const pool = new Pool()
-pool.connect((err, client, done) => {
-  if (err) return done(err)
-
-  client.query('SELECT $1::text as name', ['pg-pool'], (err, res) => {
-    done()
-    if (err) {
-      return console.error('query error', err.message, err.stack)
-    }
-    console.log('hello from', res.rows[0].name)
-  })
-})
-```
-
-### shut it down
-
-When you are finished with the pool if all the clients are idle the pool will close them after `config.idleTimeoutMillis` and your app
-will shutdown gracefully. If you don't want to wait for the timeout you can end the pool as follows:
-
-```js
-const pool = new Pool()
-const client = await pool.connect()
-console.log(await client.query('select now()'))
-client.release()
-await pool.end()
-```
-
-### a note on instances
-
-The pool should be a **long-lived object** in your application. Generally you'll want to instantiate one pool when your app starts up and use the same instance of the pool throughout the lifetime of your application. If you are frequently creating a new pool within your code you likely don't have your pool initialization code in the correct place. Example:
-
-```js
-// assume this is a file in your program at ./your-app/lib/db.js
-
-// correct usage: create the pool and let it live
-// 'globally' here, controlling access to it through exported methods
-const pool = new pg.Pool()
-
-// this is the right way to export the query method
-module.exports.query = (text, values) => {
-  console.log('query:', text, values)
-  return pool.query(text, values)
-}
-
-// this would be the WRONG way to export the connect method
-module.exports.connect = () => {
-  // notice how we would be creating a pool instance here
-  // every time we called 'connect' to get a new client?
-  // that's a bad thing & results in creating an unbounded
-  // number of pools & therefore connections
-  const aPool = new pg.Pool()
-  return aPool.connect()
-}
-```
-
-### events
-
-Every instance of a `Pool` is an event emitter. These instances emit the following events:
-
-#### error
-
-Emitted whenever an idle client in the pool encounters an error. This is common when your PostgreSQL server shuts down, reboots, or a network partition otherwise causes it to become unavailable while your pool has connected clients.
-
-Example:
-
-```js
-const Pool = require('pg-pool')
-const pool = new Pool()
-
-// attach an error handler to the pool for when a connected, idle client
-// receives an error by being disconnected, etc
-pool.on('error', function (error, client) {
-  // handle this in the same way you would treat process.on('uncaughtException')
-  // it is supplied the error as well as the idle client which received the error
-})
-```
-
-#### connect
-
-Fired whenever the pool creates a **new** `pg.Client` instance and successfully connects it to the backend.
-
-Example:
-
-```js
-const Pool = require('pg-pool')
-const pool = new Pool()
-
-const count = 0
-
-pool.on('connect', (client) => {
-  client.count = count++
-})
-
-pool
-  .connect()
-  .then((client) => {
-    return client
-      .query('SELECT $1::int AS "clientCount"', [client.count])
-      .then((res) => console.log(res.rows[0].clientCount)) // outputs 0
-      .then(() => client)
-  })
-  .then((client) => client.release())
-```
-
-#### acquire
-
-Fired whenever a client is acquired from the pool
-
-Example:
-
-This allows you to count the number of clients which have ever been acquired from the pool.
-
-```js
-const Pool = require('pg-pool')
-const pool = new Pool()
-
-const acquireCount = 0
-pool.on('acquire', function (client) {
-  acquireCount++
-})
-
-const connectCount = 0
-pool.on('connect', function () {
-  connectCount++
-})
-
-for (let i = 0; i < 200; i++) {
-  pool.query('SELECT NOW()')
-}
-
-setTimeout(function () {
-  console.log('connect count:', connectCount) // output: connect count: 10
-  console.log('acquire count:', acquireCount) // output: acquire count: 200
-}, 100)
-```
-
-### environment variables
-
-pg-pool & node-postgres support some of the same environment variables as `psql` supports. The most common are:
-
-```
-PGDATABASE=my_db
-PGUSER=username
-PGPASSWORD="my awesome password"
-PGPORT=5432
-PGSSLMODE=require
-```
-
-Usually I will export these into my local environment via a `.env` file with environment settings or export them in `~/.bash_profile` or something similar. This way I get configurability which works with both the postgres suite of tools (`psql`, `pg_dump`, `pg_restore`) and node, I can vary the environment variables locally and in production, and it supports the concept of a [12-factor app](http://12factor.net/) out of the box.
-
-## maxUses and read-replica autoscaling (e.g. AWS Aurora)
-
-The maxUses config option can help an application instance rebalance load against a replica set that has been auto-scaled after the connection pool is already full of healthy connections.
-
-The mechanism here is that a connection is considered "expended" after it has been acquired and released `maxUses` number of times. Depending on the load on your system, this means there will be an approximate time in which any given connection will live, thus creating a window for rebalancing.
-
-Imagine a scenario where you have 10 app instances providing an API running against a replica cluster of 3 that are accessed via a round-robin DNS entry. Each instance runs a connection pool size of 20. With an ambient load of 50 requests per second, the connection pool will likely fill up in a few minutes with healthy connections.
-
-If you have weekly bursts of traffic which peak at 1,000 requests per second, you might want to grow your replicas to 10 during this period. Without setting `maxUses`, the new replicas will not be adopted by the app servers without an intervention -- namely, restarting each in turn in order to build up new connection pools that are balanced against all the replicas. Adding additional app server instances will help to some extent because they will adopt all the replicas in an even way, but the initial app servers will continue to focus additional load on the original replicas.
-
-This is where the `maxUses` configuration option comes into play. Setting `maxUses` to 7500 will ensure that over a period of 30 minutes or so the new replicas will be adopted as the pre-existing connections are closed and replaced with new ones, thus creating a window for eventual balance.
-
-You'll want to test based on your own scenarios, but one way to make a first guess at `maxUses` is to identify an acceptable window for rebalancing and then solve for the value:
-
-```
-maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
-```
-
-In the example above, assuming we acquire and release 1 connection per request and we are aiming for a 30 minute rebalancing window:
-
-```
-maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
-   7200 =        1800            *          1000          /        10       /    25
-```
-
-## tests
-
-To run tests clone the repo, `npm i` in the working dir, and then run `npm test`
-
-## contributions
-
-I love contributions. Please make sure they have tests, and submit a PR. If you're not sure if the issue is worth it or will be accepted it never hurts to open an issue to begin the conversation. If you're interested in keeping up with node-postgres releated stuff, you can follow me on twitter at [@briancarlson](https://twitter.com/briancarlson) - I generally announce any noteworthy updates there.
-
-## license
-
-The MIT License (MIT)
-Copyright (c) 2016 Brian M. Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/pg-pool/esm/index.mjs
===================================================================
--- node_modules/pg-pool/esm/index.mjs	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-// ESM wrapper for pg-pool
-import Pool from '../index.js'
-
-// Export as default only to match CJS module
-export default Pool
Index: de_modules/pg-pool/index.js
===================================================================
--- node_modules/pg-pool/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,517 +1,0 @@
-'use strict'
-const EventEmitter = require('events').EventEmitter
-
-const NOOP = function () {}
-
-const removeWhere = (list, predicate) => {
-  const i = list.findIndex(predicate)
-
-  return i === -1 ? undefined : list.splice(i, 1)[0]
-}
-
-class IdleItem {
-  constructor(client, idleListener, timeoutId) {
-    this.client = client
-    this.idleListener = idleListener
-    this.timeoutId = timeoutId
-  }
-}
-
-class PendingItem {
-  constructor(callback) {
-    this.callback = callback
-  }
-}
-
-function throwOnDoubleRelease() {
-  throw new Error('Release called on client which has already been released to the pool.')
-}
-
-function promisify(Promise, callback) {
-  if (callback) {
-    return { callback: callback, result: undefined }
-  }
-  let rej
-  let res
-  const cb = function (err, client) {
-    err ? rej(err) : res(client)
-  }
-  const result = new Promise(function (resolve, reject) {
-    res = resolve
-    rej = reject
-  }).catch((err) => {
-    // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
-    // application that created the query
-    Error.captureStackTrace(err)
-    throw err
-  })
-  return { callback: cb, result: result }
-}
-
-function makeIdleListener(pool, client) {
-  return function idleListener(err) {
-    err.client = client
-
-    client.removeListener('error', idleListener)
-    client.on('error', () => {
-      pool.log('additional client error after disconnection due to error', err)
-    })
-    pool._remove(client)
-    // TODO - document that once the pool emits an error
-    // the client has already been closed & purged and is unusable
-    pool.emit('error', err, client)
-  }
-}
-
-class Pool extends EventEmitter {
-  constructor(options, Client) {
-    super()
-    this.options = Object.assign({}, options)
-
-    if (options != null && 'password' in options) {
-      // "hiding" the password so it doesn't show up in stack traces
-      // or if the client is console.logged
-      Object.defineProperty(this.options, 'password', {
-        configurable: true,
-        enumerable: false,
-        writable: true,
-        value: options.password,
-      })
-    }
-    if (options != null && options.ssl && options.ssl.key) {
-      // "hiding" the ssl->key so it doesn't show up in stack traces
-      // or if the client is console.logged
-      Object.defineProperty(this.options.ssl, 'key', {
-        enumerable: false,
-      })
-    }
-
-    this.options.max = this.options.max || this.options.poolSize || 10
-    this.options.min = this.options.min || 0
-    this.options.maxUses = this.options.maxUses || Infinity
-    this.options.allowExitOnIdle = this.options.allowExitOnIdle || false
-    this.options.maxLifetimeSeconds = this.options.maxLifetimeSeconds || 0
-    this.log = this.options.log || function () {}
-    this.Client = this.options.Client || Client || require('pg').Client
-    this.Promise = this.options.Promise || global.Promise
-
-    if (typeof this.options.idleTimeoutMillis === 'undefined') {
-      this.options.idleTimeoutMillis = 10000
-    }
-
-    this._clients = []
-    this._idle = []
-    this._expired = new WeakSet()
-    this._pendingQueue = []
-    this._endCallback = undefined
-    this.ending = false
-    this.ended = false
-  }
-
-  _promiseTry(f) {
-    const Promise = this.Promise
-    if (typeof Promise.try === 'function') {
-      return Promise.try(f)
-    }
-    return new Promise((resolve) => resolve(f()))
-  }
-
-  _isFull() {
-    return this._clients.length >= this.options.max
-  }
-
-  _isAboveMin() {
-    return this._clients.length > this.options.min
-  }
-
-  _pulseQueue() {
-    this.log('pulse queue')
-    if (this.ended) {
-      this.log('pulse queue ended')
-      return
-    }
-    if (this.ending) {
-      this.log('pulse queue on ending')
-      if (this._idle.length) {
-        this._idle.slice().map((item) => {
-          this._remove(item.client)
-        })
-      }
-      if (!this._clients.length) {
-        this.ended = true
-        this._endCallback()
-      }
-      return
-    }
-
-    // if we don't have any waiting, do nothing
-    if (!this._pendingQueue.length) {
-      this.log('no queued requests')
-      return
-    }
-    // if we don't have any idle clients and we have no more room do nothing
-    if (!this._idle.length && this._isFull()) {
-      return
-    }
-    const pendingItem = this._pendingQueue.shift()
-    if (this._idle.length) {
-      const idleItem = this._idle.pop()
-      clearTimeout(idleItem.timeoutId)
-      const client = idleItem.client
-      client.ref && client.ref()
-      const idleListener = idleItem.idleListener
-
-      return this._acquireClient(client, pendingItem, idleListener, false)
-    }
-    if (!this._isFull()) {
-      return this.newClient(pendingItem)
-    }
-    throw new Error('unexpected condition')
-  }
-
-  _remove(client, callback) {
-    const removed = removeWhere(this._idle, (item) => item.client === client)
-
-    if (removed !== undefined) {
-      clearTimeout(removed.timeoutId)
-    }
-
-    this._clients = this._clients.filter((c) => c !== client)
-    const context = this
-    client.end(() => {
-      context.emit('remove', client)
-
-      if (typeof callback === 'function') {
-        callback()
-      }
-    })
-  }
-
-  connect(cb) {
-    if (this.ending) {
-      const err = new Error('Cannot use a pool after calling end on the pool')
-      return cb ? cb(err) : this.Promise.reject(err)
-    }
-
-    const response = promisify(this.Promise, cb)
-    const result = response.result
-
-    // if we don't have to connect a new client, don't do so
-    if (this._isFull() || this._idle.length) {
-      // if we have idle clients schedule a pulse immediately
-      if (this._idle.length) {
-        process.nextTick(() => this._pulseQueue())
-      }
-
-      if (!this.options.connectionTimeoutMillis) {
-        this._pendingQueue.push(new PendingItem(response.callback))
-        return result
-      }
-
-      const queueCallback = (err, res, done) => {
-        clearTimeout(tid)
-        response.callback(err, res, done)
-      }
-
-      const pendingItem = new PendingItem(queueCallback)
-
-      // set connection timeout on checking out an existing client
-      const tid = setTimeout(() => {
-        // remove the callback from pending waiters because
-        // we're going to call it with a timeout error
-        removeWhere(this._pendingQueue, (i) => i.callback === queueCallback)
-        pendingItem.timedOut = true
-        response.callback(new Error('timeout exceeded when trying to connect'))
-      }, this.options.connectionTimeoutMillis)
-
-      if (tid.unref) {
-        tid.unref()
-      }
-
-      this._pendingQueue.push(pendingItem)
-      return result
-    }
-
-    this.newClient(new PendingItem(response.callback))
-
-    return result
-  }
-
-  newClient(pendingItem) {
-    const client = new this.Client(this.options)
-    this._clients.push(client)
-    const idleListener = makeIdleListener(this, client)
-
-    this.log('checking client timeout')
-
-    // connection timeout logic
-    let tid
-    let timeoutHit = false
-    if (this.options.connectionTimeoutMillis) {
-      tid = setTimeout(() => {
-        if (client.connection) {
-          this.log('ending client due to timeout')
-          timeoutHit = true
-          client.connection.stream.destroy()
-        } else if (!client.isConnected()) {
-          this.log('ending client due to timeout')
-          timeoutHit = true
-          // force kill the node driver, and let libpq do its teardown
-          client.end()
-        }
-      }, this.options.connectionTimeoutMillis)
-    }
-
-    this.log('connecting new client')
-    client.connect((err) => {
-      if (tid) {
-        clearTimeout(tid)
-      }
-      client.on('error', idleListener)
-      if (err) {
-        this.log('client failed to connect', err)
-        // remove the dead client from our list of clients
-        this._clients = this._clients.filter((c) => c !== client)
-        if (timeoutHit) {
-          err = new Error('Connection terminated due to connection timeout', { cause: err })
-        }
-
-        // this client won’t be released, so move on immediately
-        this._pulseQueue()
-
-        if (!pendingItem.timedOut) {
-          pendingItem.callback(err, undefined, NOOP)
-        }
-      } else {
-        this.log('new client connected')
-
-        if (this.options.onConnect) {
-          this._promiseTry(() => this.options.onConnect(client)).then(
-            () => {
-              this._afterConnect(client, pendingItem, idleListener)
-            },
-            (hookErr) => {
-              this._clients = this._clients.filter((c) => c !== client)
-              client.end(() => {
-                this._pulseQueue()
-                if (!pendingItem.timedOut) {
-                  pendingItem.callback(hookErr, undefined, NOOP)
-                }
-              })
-            }
-          )
-          return
-        }
-
-        return this._afterConnect(client, pendingItem, idleListener)
-      }
-    })
-  }
-
-  _afterConnect(client, pendingItem, idleListener) {
-    if (this.options.maxLifetimeSeconds !== 0) {
-      const maxLifetimeTimeout = setTimeout(() => {
-        this.log('ending client due to expired lifetime')
-        this._expired.add(client)
-        const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client)
-        if (idleIndex !== -1) {
-          this._acquireClient(
-            client,
-            new PendingItem((err, client, clientRelease) => clientRelease()),
-            idleListener,
-            false
-          )
-        }
-      }, this.options.maxLifetimeSeconds * 1000)
-
-      maxLifetimeTimeout.unref()
-      client.once('end', () => clearTimeout(maxLifetimeTimeout))
-    }
-
-    return this._acquireClient(client, pendingItem, idleListener, true)
-  }
-
-  // acquire a client for a pending work item
-  _acquireClient(client, pendingItem, idleListener, isNew) {
-    if (isNew) {
-      this.emit('connect', client)
-    }
-
-    this.emit('acquire', client)
-
-    client.release = this._releaseOnce(client, idleListener)
-
-    client.removeListener('error', idleListener)
-
-    if (!pendingItem.timedOut) {
-      if (isNew && this.options.verify) {
-        this.options.verify(client, (err) => {
-          if (err) {
-            client.release(err)
-            return pendingItem.callback(err, undefined, NOOP)
-          }
-
-          pendingItem.callback(undefined, client, client.release)
-        })
-      } else {
-        pendingItem.callback(undefined, client, client.release)
-      }
-    } else {
-      if (isNew && this.options.verify) {
-        this.options.verify(client, client.release)
-      } else {
-        client.release()
-      }
-    }
-  }
-
-  // returns a function that wraps _release and throws if called more than once
-  _releaseOnce(client, idleListener) {
-    let released = false
-
-    return (err) => {
-      if (released) {
-        throwOnDoubleRelease()
-      }
-
-      released = true
-      this._release(client, idleListener, err)
-    }
-  }
-
-  // release a client back to the poll, include an error
-  // to remove it from the pool
-  _release(client, idleListener, err) {
-    client.on('error', idleListener)
-
-    client._poolUseCount = (client._poolUseCount || 0) + 1
-
-    this.emit('release', err, client)
-
-    // TODO(bmc): expose a proper, public interface _queryable and _ending
-    if (err || this.ending || !client._queryable || client._ending || client._poolUseCount >= this.options.maxUses) {
-      if (client._poolUseCount >= this.options.maxUses) {
-        this.log('remove expended client')
-      }
-
-      return this._remove(client, this._pulseQueue.bind(this))
-    }
-
-    const isExpired = this._expired.has(client)
-    if (isExpired) {
-      this.log('remove expired client')
-      this._expired.delete(client)
-      return this._remove(client, this._pulseQueue.bind(this))
-    }
-
-    // idle timeout
-    let tid
-    if (this.options.idleTimeoutMillis && this._isAboveMin()) {
-      tid = setTimeout(() => {
-        if (this._isAboveMin()) {
-          this.log('remove idle client')
-          this._remove(client, this._pulseQueue.bind(this))
-        }
-      }, this.options.idleTimeoutMillis)
-
-      if (this.options.allowExitOnIdle) {
-        // allow Node to exit if this is all that's left
-        tid.unref()
-      }
-    }
-
-    if (this.options.allowExitOnIdle) {
-      client.unref()
-    }
-
-    this._idle.push(new IdleItem(client, idleListener, tid))
-    this._pulseQueue()
-  }
-
-  query(text, values, cb) {
-    // guard clause against passing a function as the first parameter
-    if (typeof text === 'function') {
-      const response = promisify(this.Promise, text)
-      setImmediate(function () {
-        return response.callback(new Error('Passing a function as the first parameter to pool.query is not supported'))
-      })
-      return response.result
-    }
-
-    // allow plain text query without values, but callback
-    if (typeof values === 'function') {
-      cb = values
-      values = undefined
-    }
-    const response = promisify(this.Promise, cb)
-    cb = response.callback
-
-    this.connect((err, client) => {
-      if (err) {
-        return cb(err)
-      }
-
-      let clientReleased = false
-      const onError = (err) => {
-        if (clientReleased) {
-          return
-        }
-        clientReleased = true
-        client.release(err)
-        cb(err)
-      }
-
-      client.once('error', onError)
-      this.log('dispatching query')
-      try {
-        client.query(text, values, (err, res) => {
-          this.log('query dispatched')
-          client.removeListener('error', onError)
-          if (clientReleased) {
-            return
-          }
-          clientReleased = true
-          client.release(err)
-          if (err) {
-            return cb(err)
-          }
-          return cb(undefined, res)
-        })
-      } catch (err) {
-        client.release(err)
-        return cb(err)
-      }
-    })
-    return response.result
-  }
-
-  end(cb) {
-    this.log('ending')
-    if (this.ending) {
-      const err = new Error('Called end on pool more than once')
-      return cb ? cb(err) : this.Promise.reject(err)
-    }
-    this.ending = true
-    const promised = promisify(this.Promise, cb)
-    this._endCallback = promised.callback
-    this._pulseQueue()
-    return promised.result
-  }
-
-  get waitingCount() {
-    return this._pendingQueue.length
-  }
-
-  get idleCount() {
-    return this._idle.length
-  }
-
-  get expiredCount() {
-    return this._clients.reduce((acc, client) => acc + (this._expired.has(client) ? 1 : 0), 0)
-  }
-
-  get totalCount() {
-    return this._clients.length
-  }
-}
-module.exports = Pool
Index: de_modules/pg-pool/package.json
===================================================================
--- node_modules/pg-pool/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,51 +1,0 @@
-{
-  "name": "pg-pool",
-  "version": "3.14.0",
-  "description": "Connection pool for node-postgres",
-  "main": "index.js",
-  "exports": {
-    ".": {
-      "import": "./esm/index.mjs",
-      "require": "./index.js",
-      "default": "./index.js"
-    }
-  },
-  "directories": {
-    "test": "test"
-  },
-  "scripts": {
-    "test": " node_modules/.bin/mocha"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-postgres.git",
-    "directory": "packages/pg-pool"
-  },
-  "keywords": [
-    "pg",
-    "postgres",
-    "pool",
-    "database"
-  ],
-  "author": "Brian M. Carlson",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/brianc/node-postgres/issues"
-  },
-  "homepage": "https://github.com/brianc/node-postgres/tree/master/packages/pg-pool#readme",
-  "devDependencies": {
-    "bluebird": "3.7.2",
-    "co": "4.6.0",
-    "expect.js": "0.3.1",
-    "lodash": "^4.17.11",
-    "mocha": "^11.7.5"
-  },
-  "peerDependencies": {
-    "pg": ">=8.0"
-  },
-  "files": [
-    "index.js",
-    "esm"
-  ],
-  "gitHead": "544b1ce8152bc280e398dc1e8a66920abe6a640e"
-}
Index: de_modules/pg-protocol/LICENSE
===================================================================
--- node_modules/pg-protocol/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2010 - 2021 Brian Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/pg-protocol/README.md
===================================================================
--- node_modules/pg-protocol/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-# pg-protocol
-
-Low level postgres wire protocol parser and serializer written in Typescript. Used by node-postgres. Needs more documentation. :smile:
Index: de_modules/pg-protocol/dist/b.d.ts
===================================================================
--- node_modules/pg-protocol/dist/b.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export {};
Index: de_modules/pg-protocol/dist/b.js
===================================================================
--- node_modules/pg-protocol/dist/b.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,23 +1,0 @@
-"use strict";
-// file for microbenchmarking
-Object.defineProperty(exports, "__esModule", { value: true });
-const buffer_reader_1 = require("./buffer-reader");
-const LOOPS = 1000;
-let count = 0;
-const start = performance.now();
-const reader = new buffer_reader_1.BufferReader();
-const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0]);
-const run = () => {
-    if (count > LOOPS) {
-        console.log(performance.now() - start);
-        return;
-    }
-    count++;
-    for (let i = 0; i < LOOPS; i++) {
-        reader.setBuffer(0, buffer);
-        reader.cstring();
-    }
-    setImmediate(run);
-};
-run();
-//# sourceMappingURL=b.js.map
Index: de_modules/pg-protocol/dist/b.js.map
===================================================================
--- node_modules/pg-protocol/dist/b.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"b.js","sourceRoot":"","sources":["../src/b.ts"],"names":[],"mappings":";AAAA,6BAA6B;;AAE7B,mDAA8C;AAE9C,MAAM,KAAK,GAAG,IAAI,CAAA;AAClB,IAAI,KAAK,GAAG,CAAC,CAAA;AACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;AAE/B,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAA;AACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;AAE3D,MAAM,GAAG,GAAG,GAAG,EAAE;IACf,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QACtC,OAAM;IACR,CAAC;IACD,KAAK,EAAE,CAAA;IACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3B,MAAM,CAAC,OAAO,EAAE,CAAA;IAClB,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC,CAAA;AAED,GAAG,EAAE,CAAA"}
Index: de_modules/pg-protocol/dist/buffer-reader.d.ts
===================================================================
--- node_modules/pg-protocol/dist/buffer-reader.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-export declare class BufferReader {
-    private offset;
-    private buffer;
-    private encoding;
-    constructor(offset?: number);
-    setBuffer(offset: number, buffer: Buffer): void;
-    int16(): number;
-    byte(): number;
-    int32(): number;
-    uint32(): number;
-    string(length: number): string;
-    cstring(): string;
-    bytes(length: number): Buffer;
-}
Index: de_modules/pg-protocol/dist/buffer-reader.js
===================================================================
--- node_modules/pg-protocol/dist/buffer-reader.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,55 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.BufferReader = void 0;
-class BufferReader {
-    constructor(offset = 0) {
-        this.offset = offset;
-        this.buffer = Buffer.allocUnsafe(0);
-        // TODO(bmc): support non-utf8 encoding?
-        this.encoding = 'utf-8';
-    }
-    setBuffer(offset, buffer) {
-        this.offset = offset;
-        this.buffer = buffer;
-    }
-    int16() {
-        const result = this.buffer.readInt16BE(this.offset);
-        this.offset += 2;
-        return result;
-    }
-    byte() {
-        const result = this.buffer[this.offset];
-        this.offset++;
-        return result;
-    }
-    int32() {
-        const result = this.buffer.readInt32BE(this.offset);
-        this.offset += 4;
-        return result;
-    }
-    uint32() {
-        const result = this.buffer.readUInt32BE(this.offset);
-        this.offset += 4;
-        return result;
-    }
-    string(length) {
-        const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);
-        this.offset += length;
-        return result;
-    }
-    cstring() {
-        const start = this.offset;
-        let end = start;
-        // eslint-disable-next-line no-empty
-        while (this.buffer[end++]) { }
-        this.offset = end;
-        return this.buffer.toString(this.encoding, start, end - 1);
-    }
-    bytes(length) {
-        const result = this.buffer.slice(this.offset, this.offset + length);
-        this.offset += length;
-        return result;
-    }
-}
-exports.BufferReader = BufferReader;
-//# sourceMappingURL=buffer-reader.js.map
Index: de_modules/pg-protocol/dist/buffer-reader.js.map
===================================================================
--- node_modules/pg-protocol/dist/buffer-reader.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"buffer-reader.js","sourceRoot":"","sources":["../src/buffer-reader.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IAMvB,YAAoB,SAAiB,CAAC;QAAlB,WAAM,GAAN,MAAM,CAAY;QAL9B,WAAM,GAAW,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAE9C,wCAAwC;QAChC,aAAQ,GAAmB,OAAO,CAAA;IAED,CAAC;IAEnC,SAAS,CAAC,MAAc,EAAE,MAAc;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,IAAI;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM,CAAC,MAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACrF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,oCAAoC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;IAC5D,CAAC;IAEM,KAAK,CAAC,MAAc;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAzDD,oCAyDC"}
Index: de_modules/pg-protocol/dist/buffer-writer.d.ts
===================================================================
--- node_modules/pg-protocol/dist/buffer-writer.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-export declare class Writer {
-    private size;
-    private buffer;
-    private offset;
-    private headerPosition;
-    constructor(size?: number);
-    private ensure;
-    addInt32(num: number): Writer;
-    addInt16(num: number): Writer;
-    addCString(string: string): Writer;
-    addString(string?: string): Writer;
-    addInt32PrefixedString(string: string): Writer;
-    add(otherBuffer: Buffer): Writer;
-    private join;
-    flush(code?: number): Buffer;
-    clear(): void;
-}
Index: de_modules/pg-protocol/dist/buffer-writer.js
===================================================================
--- node_modules/pg-protocol/dist/buffer-writer.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,104 +1,0 @@
-"use strict";
-//binary data writer tuned for encoding binary specific to the postgres binary protocol
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Writer = void 0;
-class Writer {
-    constructor(size = 256) {
-        this.size = size;
-        this.offset = 5;
-        this.headerPosition = 0;
-        this.buffer = Buffer.allocUnsafe(size);
-    }
-    ensure(size) {
-        const remaining = this.buffer.length - this.offset;
-        if (remaining < size) {
-            const oldBuffer = this.buffer;
-            // exponential growth factor of around ~ 1.5
-            // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
-            const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;
-            this.buffer = Buffer.allocUnsafe(newSize);
-            oldBuffer.copy(this.buffer);
-        }
-    }
-    addInt32(num) {
-        this.ensure(4);
-        this.buffer[this.offset++] = (num >>> 24) & 0xff;
-        this.buffer[this.offset++] = (num >>> 16) & 0xff;
-        this.buffer[this.offset++] = (num >>> 8) & 0xff;
-        this.buffer[this.offset++] = (num >>> 0) & 0xff;
-        return this;
-    }
-    addInt16(num) {
-        this.ensure(2);
-        this.buffer[this.offset++] = (num >>> 8) & 0xff;
-        this.buffer[this.offset++] = (num >>> 0) & 0xff;
-        return this;
-    }
-    addCString(string) {
-        if (!string) {
-            this.ensure(1);
-        }
-        else {
-            const len = Buffer.byteLength(string);
-            this.ensure(len + 1); // +1 for null terminator
-            this.buffer.write(string, this.offset, 'utf-8');
-            this.offset += len;
-        }
-        this.buffer[this.offset++] = 0; // null terminator
-        return this;
-    }
-    addString(string = '') {
-        const len = Buffer.byteLength(string);
-        this.ensure(len);
-        this.buffer.write(string, this.offset);
-        this.offset += len;
-        return this;
-    }
-    // Write an Int32 byte-length prefix immediately followed by the string's UTF-8
-    // bytes. Postgres' Bind wire format prefixes every parameter with its length,
-    // and doing it in one method computes Buffer.byteLength ONCE — the previous
-    // `addInt32(Buffer.byteLength(s)).addString(s)` pairing scanned the string
-    // three times (byteLength for the prefix, byteLength again inside addString,
-    // then the encode), which is costly for large text parameters.
-    addInt32PrefixedString(string) {
-        const len = Buffer.byteLength(string);
-        this.ensure(4 + len);
-        const buffer = this.buffer;
-        let offset = this.offset;
-        buffer[offset++] = (len >>> 24) & 0xff;
-        buffer[offset++] = (len >>> 16) & 0xff;
-        buffer[offset++] = (len >>> 8) & 0xff;
-        buffer[offset++] = (len >>> 0) & 0xff;
-        buffer.write(string, offset, 'utf-8');
-        this.offset = offset + len;
-        return this;
-    }
-    add(otherBuffer) {
-        this.ensure(otherBuffer.length);
-        otherBuffer.copy(this.buffer, this.offset);
-        this.offset += otherBuffer.length;
-        return this;
-    }
-    join(code) {
-        if (code) {
-            this.buffer[this.headerPosition] = code;
-            //length is everything in this packet minus the code
-            const length = this.offset - (this.headerPosition + 1);
-            this.buffer.writeInt32BE(length, this.headerPosition + 1);
-        }
-        return this.buffer.slice(code ? 0 : 5, this.offset);
-    }
-    flush(code) {
-        const result = this.join(code);
-        this.offset = 5;
-        this.headerPosition = 0;
-        this.buffer = Buffer.allocUnsafe(this.size);
-        return result;
-    }
-    clear() {
-        this.offset = 5;
-        this.headerPosition = 0;
-    }
-}
-exports.Writer = Writer;
-//# sourceMappingURL=buffer-writer.js.map
Index: de_modules/pg-protocol/dist/buffer-writer.js.map
===================================================================
--- node_modules/pg-protocol/dist/buffer-writer.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"buffer-writer.js","sourceRoot":"","sources":["../src/buffer-writer.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/dist/inbound-parser.test.d.ts
===================================================================
--- node_modules/pg-protocol/dist/inbound-parser.test.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export {};
Index: de_modules/pg-protocol/dist/inbound-parser.test.js
===================================================================
--- node_modules/pg-protocol/dist/inbound-parser.test.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,538 +1,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const test_buffers_1 = __importDefault(require("./testing/test-buffers"));
-const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
-const _1 = require(".");
-const assert_1 = __importDefault(require("assert"));
-const stream_1 = require("stream");
-const parser_1 = require("./parser");
-const authOkBuffer = test_buffers_1.default.authenticationOk();
-const paramStatusBuffer = test_buffers_1.default.parameterStatus('client_encoding', 'UTF8');
-const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
-const backendKeyDataBuffer = test_buffers_1.default.backendKeyData(1, 2);
-const commandCompleteBuffer = test_buffers_1.default.commandComplete('SELECT 3');
-const parseCompleteBuffer = test_buffers_1.default.parseComplete();
-const bindCompleteBuffer = test_buffers_1.default.bindComplete();
-const portalSuspendedBuffer = test_buffers_1.default.portalSuspended();
-const row1 = {
-    name: 'id',
-    tableID: 1,
-    attributeNumber: 2,
-    dataTypeID: 3,
-    dataTypeSize: 4,
-    typeModifier: 5,
-    formatCode: 0,
-};
-const oneRowDescBuff = test_buffers_1.default.rowDescription([row1]);
-row1.name = 'bang';
-const twoRowBuf = test_buffers_1.default.rowDescription([
-    row1,
-    {
-        name: 'whoah',
-        tableID: 10,
-        attributeNumber: 11,
-        dataTypeID: 12,
-        dataTypeSize: 13,
-        typeModifier: 14,
-        formatCode: 0,
-    },
-]);
-const rowWithBigOids = {
-    name: 'bigoid',
-    tableID: 3000000001,
-    attributeNumber: 2,
-    dataTypeID: 3000000003,
-    dataTypeSize: 4,
-    typeModifier: 5,
-    formatCode: 0,
-};
-const bigOidDescBuff = test_buffers_1.default.rowDescription([rowWithBigOids]);
-const emptyRowFieldBuf = test_buffers_1.default.dataRow([]);
-const oneFieldBuf = test_buffers_1.default.dataRow(['test']);
-const expectedAuthenticationOkayMessage = {
-    name: 'authenticationOk',
-    length: 8,
-};
-const expectedParameterStatusMessage = {
-    name: 'parameterStatus',
-    parameterName: 'client_encoding',
-    parameterValue: 'UTF8',
-    length: 25,
-};
-const expectedBackendKeyDataMessage = {
-    name: 'backendKeyData',
-    processID: 1,
-    secretKey: 2,
-};
-const expectedReadyForQueryMessage = {
-    name: 'readyForQuery',
-    length: 5,
-    status: 'I',
-};
-const expectedCommandCompleteMessage = {
-    name: 'commandComplete',
-    length: 13,
-    text: 'SELECT 3',
-};
-const emptyRowDescriptionBuffer = new buffer_list_1.default()
-    .addInt16(0) // number of fields
-    .join(true, 'T');
-const expectedEmptyRowDescriptionMessage = {
-    name: 'rowDescription',
-    length: 6,
-    fieldCount: 0,
-    fields: [],
-};
-const expectedOneRowMessage = {
-    name: 'rowDescription',
-    length: 27,
-    fieldCount: 1,
-    fields: [
-        {
-            name: 'id',
-            tableID: 1,
-            columnID: 2,
-            dataTypeID: 3,
-            dataTypeSize: 4,
-            dataTypeModifier: 5,
-            format: 'text',
-        },
-    ],
-};
-const expectedTwoRowMessage = {
-    name: 'rowDescription',
-    length: 53,
-    fieldCount: 2,
-    fields: [
-        {
-            name: 'bang',
-            tableID: 1,
-            columnID: 2,
-            dataTypeID: 3,
-            dataTypeSize: 4,
-            dataTypeModifier: 5,
-            format: 'text',
-        },
-        {
-            name: 'whoah',
-            tableID: 10,
-            columnID: 11,
-            dataTypeID: 12,
-            dataTypeSize: 13,
-            dataTypeModifier: 14,
-            format: 'text',
-        },
-    ],
-};
-const expectedBigOidMessage = {
-    name: 'rowDescription',
-    length: 31,
-    fieldCount: 1,
-    fields: [
-        {
-            name: 'bigoid',
-            tableID: 3000000001,
-            columnID: 2,
-            dataTypeID: 3000000003,
-            dataTypeSize: 4,
-            dataTypeModifier: 5,
-            format: 'text',
-        },
-    ],
-};
-const emptyParameterDescriptionBuffer = new buffer_list_1.default()
-    .addInt16(0) // number of parameters
-    .join(true, 't');
-const oneParameterDescBuf = test_buffers_1.default.parameterDescription([1111]);
-const twoParameterDescBuf = test_buffers_1.default.parameterDescription([2222, 3333]);
-const bigOidParameterDescBuf = test_buffers_1.default.parameterDescription([3000000003]);
-const expectedEmptyParameterDescriptionMessage = {
-    name: 'parameterDescription',
-    length: 6,
-    parameterCount: 0,
-    dataTypeIDs: [],
-};
-const expectedOneParameterMessage = {
-    name: 'parameterDescription',
-    length: 10,
-    parameterCount: 1,
-    dataTypeIDs: [1111],
-};
-const expectedTwoParameterMessage = {
-    name: 'parameterDescription',
-    length: 14,
-    parameterCount: 2,
-    dataTypeIDs: [2222, 3333],
-};
-const expectedBigOidParameterMessage = {
-    name: 'parameterDescription',
-    length: 10,
-    parameterCount: 1,
-    dataTypeIDs: [3000000003],
-};
-const testForMessage = function (buffer, expectedMessage) {
-    it('receives and parses ' + expectedMessage.name, () => __awaiter(this, void 0, void 0, function* () {
-        const messages = yield parseBuffers([buffer]);
-        const [lastMessage] = messages;
-        for (const key in expectedMessage) {
-            assert_1.default.deepEqual(lastMessage[key], expectedMessage[key]);
-        }
-    }));
-};
-const plainPasswordBuffer = test_buffers_1.default.authenticationCleartextPassword();
-const md5PasswordBuffer = test_buffers_1.default.authenticationMD5Password();
-const SASLBuffer = test_buffers_1.default.authenticationSASL();
-const SASLContinueBuffer = test_buffers_1.default.authenticationSASLContinue();
-const SASLFinalBuffer = test_buffers_1.default.authenticationSASLFinal();
-const expectedPlainPasswordMessage = {
-    name: 'authenticationCleartextPassword',
-};
-const expectedMD5PasswordMessage = {
-    name: 'authenticationMD5Password',
-    salt: Buffer.from([1, 2, 3, 4]),
-};
-const expectedSASLMessage = {
-    name: 'authenticationSASL',
-    mechanisms: ['SCRAM-SHA-256'],
-};
-const expectedSASLContinueMessage = {
-    name: 'authenticationSASLContinue',
-    data: 'data',
-};
-const expectedSASLFinalMessage = {
-    name: 'authenticationSASLFinal',
-    data: 'data',
-};
-const notificationResponseBuffer = test_buffers_1.default.notification(4, 'hi', 'boom');
-const expectedNotificationResponseMessage = {
-    name: 'notification',
-    processId: 4,
-    channel: 'hi',
-    payload: 'boom',
-};
-const parseBuffers = (buffers) => __awaiter(void 0, void 0, void 0, function* () {
-    const stream = new stream_1.PassThrough();
-    for (const buffer of buffers) {
-        stream.write(buffer);
-    }
-    stream.end();
-    const msgs = [];
-    yield (0, _1.parse)(stream, (msg) => msgs.push(msg));
-    return msgs;
-});
-describe('PgPacketStream', function () {
-    testForMessage(authOkBuffer, expectedAuthenticationOkayMessage);
-    testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage);
-    testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage);
-    testForMessage(SASLBuffer, expectedSASLMessage);
-    testForMessage(SASLContinueBuffer, expectedSASLContinueMessage);
-    // this exercises a found bug in the parser:
-    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
-    // and adds a test which is deterministic, rather than relying on network packet chunking
-    const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])]);
-    testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage);
-    testForMessage(SASLFinalBuffer, expectedSASLFinalMessage);
-    // this exercises a found bug in the parser:
-    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
-    // and adds a test which is deterministic, rather than relying on network packet chunking
-    const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])]);
-    testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage);
-    testForMessage(paramStatusBuffer, expectedParameterStatusMessage);
-    testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage);
-    testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage);
-    testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage);
-    testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage);
-    testForMessage(test_buffers_1.default.emptyQuery(), {
-        name: 'emptyQuery',
-        length: 4,
-    });
-    testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
-        name: 'noData',
-    });
-    describe('rowDescription messages', function () {
-        testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage);
-        testForMessage(oneRowDescBuff, expectedOneRowMessage);
-        testForMessage(twoRowBuf, expectedTwoRowMessage);
-        testForMessage(bigOidDescBuff, expectedBigOidMessage);
-    });
-    describe('parameterDescription messages', function () {
-        testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage);
-        testForMessage(oneParameterDescBuf, expectedOneParameterMessage);
-        testForMessage(twoParameterDescBuf, expectedTwoParameterMessage);
-        testForMessage(bigOidParameterDescBuf, expectedBigOidParameterMessage);
-    });
-    describe('parsing rows', function () {
-        describe('parsing empty row', function () {
-            testForMessage(emptyRowFieldBuf, {
-                name: 'dataRow',
-                fieldCount: 0,
-            });
-        });
-        describe('parsing data row with fields', function () {
-            testForMessage(oneFieldBuf, {
-                name: 'dataRow',
-                fieldCount: 1,
-                fields: ['test'],
-            });
-        });
-    });
-    describe('notice message', function () {
-        // this uses the same logic as error message
-        const buff = test_buffers_1.default.notice([{ type: 'C', value: 'code' }]);
-        testForMessage(buff, {
-            name: 'notice',
-            code: 'code',
-        });
-    });
-    testForMessage(test_buffers_1.default.error([]), {
-        name: 'error',
-    });
-    describe('with all the fields', function () {
-        const buffer = test_buffers_1.default.error([
-            {
-                type: 'S',
-                value: 'ERROR',
-            },
-            {
-                type: 'C',
-                value: 'code',
-            },
-            {
-                type: 'M',
-                value: 'message',
-            },
-            {
-                type: 'D',
-                value: 'details',
-            },
-            {
-                type: 'H',
-                value: 'hint',
-            },
-            {
-                type: 'P',
-                value: '100',
-            },
-            {
-                type: 'p',
-                value: '101',
-            },
-            {
-                type: 'q',
-                value: 'query',
-            },
-            {
-                type: 'W',
-                value: 'where',
-            },
-            {
-                type: 'F',
-                value: 'file',
-            },
-            {
-                type: 'L',
-                value: 'line',
-            },
-            {
-                type: 'R',
-                value: 'routine',
-            },
-            {
-                type: 'Z', // ignored
-                value: 'alsdkf',
-            },
-        ]);
-        testForMessage(buffer, {
-            name: 'error',
-            severity: 'ERROR',
-            code: 'code',
-            message: 'message',
-            detail: 'details',
-            hint: 'hint',
-            position: '100',
-            internalPosition: '101',
-            internalQuery: 'query',
-            where: 'where',
-            file: 'file',
-            line: 'line',
-            routine: 'routine',
-        });
-    });
-    testForMessage(parseCompleteBuffer, {
-        name: 'parseComplete',
-    });
-    testForMessage(bindCompleteBuffer, {
-        name: 'bindComplete',
-    });
-    testForMessage(bindCompleteBuffer, {
-        name: 'bindComplete',
-    });
-    testForMessage(test_buffers_1.default.closeComplete(), {
-        name: 'closeComplete',
-    });
-    describe('parses portal suspended message', function () {
-        testForMessage(portalSuspendedBuffer, {
-            name: 'portalSuspended',
-        });
-    });
-    describe('parses replication start message', function () {
-        testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
-            name: 'replicationStart',
-            length: 4,
-        });
-    });
-    describe('copy', () => {
-        testForMessage(test_buffers_1.default.copyIn(0), {
-            name: 'copyInResponse',
-            length: 7,
-            binary: false,
-            columnTypes: [],
-        });
-        testForMessage(test_buffers_1.default.copyIn(2), {
-            name: 'copyInResponse',
-            length: 11,
-            binary: false,
-            columnTypes: [0, 1],
-        });
-        testForMessage(test_buffers_1.default.copyOut(0), {
-            name: 'copyOutResponse',
-            length: 7,
-            binary: false,
-            columnTypes: [],
-        });
-        testForMessage(test_buffers_1.default.copyOut(3), {
-            name: 'copyOutResponse',
-            length: 13,
-            binary: false,
-            columnTypes: [0, 1, 2],
-        });
-        testForMessage(test_buffers_1.default.copyDone(), {
-            name: 'copyDone',
-            length: 4,
-        });
-        testForMessage(test_buffers_1.default.copyData(Buffer.from([5, 6, 7])), {
-            name: 'copyData',
-            length: 7,
-            chunk: Buffer.from([5, 6, 7]),
-        });
-    });
-    // since the data message on a stream can randomly divide the incomming
-    // tcp packets anywhere, we need to make sure we can parse every single
-    // split on a tcp message
-    describe('split buffer, single message parsing', function () {
-        const fullBuffer = test_buffers_1.default.dataRow([null, 'bang', 'zug zug', null, '!']);
-        it('parses when full buffer comes in', function () {
-            return __awaiter(this, void 0, void 0, function* () {
-                const messages = yield parseBuffers([fullBuffer]);
-                const message = messages[0];
-                assert_1.default.equal(message.fields.length, 5);
-                assert_1.default.equal(message.fields[0], null);
-                assert_1.default.equal(message.fields[1], 'bang');
-                assert_1.default.equal(message.fields[2], 'zug zug');
-                assert_1.default.equal(message.fields[3], null);
-                assert_1.default.equal(message.fields[4], '!');
-            });
-        });
-        const testMessageReceivedAfterSplitAt = function (split) {
-            return __awaiter(this, void 0, void 0, function* () {
-                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
-                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
-                fullBuffer.copy(firstBuffer, 0, 0);
-                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
-                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
-                const message = messages[0];
-                assert_1.default.equal(message.fields.length, 5);
-                assert_1.default.equal(message.fields[0], null);
-                assert_1.default.equal(message.fields[1], 'bang');
-                assert_1.default.equal(message.fields[2], 'zug zug');
-                assert_1.default.equal(message.fields[3], null);
-                assert_1.default.equal(message.fields[4], '!');
-            });
-        };
-        it('parses when split in the middle', function () {
-            return testMessageReceivedAfterSplitAt(6);
-        });
-        it('parses when split at end', function () {
-            return testMessageReceivedAfterSplitAt(2);
-        });
-        it('parses when split at beginning', function () {
-            return Promise.all([
-                testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
-                testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
-                testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
-            ]);
-        });
-    });
-    describe('split buffer, multiple message parsing', function () {
-        const dataRowBuffer = test_buffers_1.default.dataRow(['!']);
-        const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
-        const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length);
-        dataRowBuffer.copy(fullBuffer, 0, 0);
-        readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0);
-        const verifyMessages = function (messages) {
-            assert_1.default.strictEqual(messages.length, 2);
-            assert_1.default.deepEqual(messages[0], {
-                name: 'dataRow',
-                fieldCount: 1,
-                length: 11,
-                fields: ['!'],
-            });
-            assert_1.default.equal(messages[0].fields[0], '!');
-            assert_1.default.deepEqual(messages[1], {
-                name: 'readyForQuery',
-                length: 5,
-                status: 'I',
-            });
-        };
-        // sanity check
-        it('receives both messages when packet is not split', function () {
-            return __awaiter(this, void 0, void 0, function* () {
-                const messages = yield parseBuffers([fullBuffer]);
-                verifyMessages(messages);
-            });
-        });
-        const splitAndVerifyTwoMessages = function (split) {
-            return __awaiter(this, void 0, void 0, function* () {
-                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
-                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
-                fullBuffer.copy(firstBuffer, 0, 0);
-                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
-                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
-                verifyMessages(messages);
-            });
-        };
-        describe('receives both messages when packet is split', function () {
-            it('in the middle', function () {
-                return splitAndVerifyTwoMessages(11);
-            });
-            it('at the front', function () {
-                return Promise.all([
-                    splitAndVerifyTwoMessages(fullBuffer.length - 1),
-                    splitAndVerifyTwoMessages(fullBuffer.length - 4),
-                    splitAndVerifyTwoMessages(fullBuffer.length - 6),
-                ]);
-            });
-            it('at the end', function () {
-                return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)]);
-            });
-        });
-    });
-    it('cleans up the reader after handling a packet', function () {
-        const parser = new parser_1.Parser();
-        parser.parse(oneFieldBuf, () => { });
-        assert_1.default.strictEqual(parser.reader.buffer.byteLength, 0);
-    });
-});
-//# sourceMappingURL=inbound-parser.test.js.map
Index: de_modules/pg-protocol/dist/inbound-parser.test.js.map
===================================================================
--- node_modules/pg-protocol/dist/inbound-parser.test.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"inbound-parser.test.js","sourceRoot":"","sources":["../src/inbound-parser.test.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/dist/index.d.ts
===================================================================
--- node_modules/pg-protocol/dist/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-import { DatabaseError } from './messages';
-import { serialize } from './serializer';
-import { MessageCallback } from './parser';
-export declare function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void>;
-export { serialize, DatabaseError };
Index: de_modules/pg-protocol/dist/index.js
===================================================================
--- node_modules/pg-protocol/dist/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DatabaseError = exports.serialize = void 0;
-exports.parse = parse;
-const messages_1 = require("./messages");
-Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return messages_1.DatabaseError; } });
-const serializer_1 = require("./serializer");
-Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return serializer_1.serialize; } });
-const parser_1 = require("./parser");
-function parse(stream, callback) {
-    const parser = new parser_1.Parser();
-    stream.on('data', (buffer) => parser.parse(buffer, callback));
-    return new Promise((resolve) => stream.on('end', () => resolve()));
-}
-//# sourceMappingURL=index.js.map
Index: de_modules/pg-protocol/dist/index.js.map
===================================================================
--- node_modules/pg-protocol/dist/index.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAIA,sBAIC;AARD,yCAA0C;AAUtB,8FAVX,wBAAa,OAUW;AATjC,6CAAwC;AAS/B,0FATA,sBAAS,OASA;AARlB,qCAAkD;AAElD,SAAgB,KAAK,CAAC,MAA6B,EAAE,QAAyB;IAC5E,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC"}
Index: de_modules/pg-protocol/dist/messages.d.ts
===================================================================
--- node_modules/pg-protocol/dist/messages.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,161 +1,0 @@
-export type Mode = 'text' | 'binary';
-export type MessageName = 'parseComplete' | 'bindComplete' | 'closeComplete' | 'noData' | 'portalSuspended' | 'replicationStart' | 'emptyQuery' | 'copyDone' | 'copyData' | 'rowDescription' | 'parameterDescription' | 'parameterStatus' | 'backendKeyData' | 'notification' | 'readyForQuery' | 'commandComplete' | 'dataRow' | 'copyInResponse' | 'copyOutResponse' | 'authenticationOk' | 'authenticationMD5Password' | 'authenticationCleartextPassword' | 'authenticationSASL' | 'authenticationSASLContinue' | 'authenticationSASLFinal' | 'error' | 'notice';
-export interface BackendMessage {
-    name: MessageName;
-    length: number;
-}
-export declare const parseComplete: BackendMessage;
-export declare const bindComplete: BackendMessage;
-export declare const closeComplete: BackendMessage;
-export declare const noData: BackendMessage;
-export declare const portalSuspended: BackendMessage;
-export declare const replicationStart: BackendMessage;
-export declare const emptyQuery: BackendMessage;
-export declare const copyDone: BackendMessage;
-interface NoticeOrError {
-    message: string | undefined;
-    severity: string | undefined;
-    code: string | undefined;
-    detail: string | undefined;
-    hint: string | undefined;
-    position: string | undefined;
-    internalPosition: string | undefined;
-    internalQuery: string | undefined;
-    where: string | undefined;
-    schema: string | undefined;
-    table: string | undefined;
-    column: string | undefined;
-    dataType: string | undefined;
-    constraint: string | undefined;
-    file: string | undefined;
-    line: string | undefined;
-    routine: string | undefined;
-}
-export declare class DatabaseError extends Error implements NoticeOrError {
-    readonly length: number;
-    readonly name: MessageName;
-    severity: string | undefined;
-    code: string | undefined;
-    detail: string | undefined;
-    hint: string | undefined;
-    position: string | undefined;
-    internalPosition: string | undefined;
-    internalQuery: string | undefined;
-    where: string | undefined;
-    schema: string | undefined;
-    table: string | undefined;
-    column: string | undefined;
-    dataType: string | undefined;
-    constraint: string | undefined;
-    file: string | undefined;
-    line: string | undefined;
-    routine: string | undefined;
-    constructor(message: string, length: number, name: MessageName);
-}
-export declare class CopyDataMessage {
-    readonly length: number;
-    readonly chunk: Buffer;
-    readonly name = "copyData";
-    constructor(length: number, chunk: Buffer);
-}
-export declare class CopyResponse {
-    readonly length: number;
-    readonly name: MessageName;
-    readonly binary: boolean;
-    readonly columnTypes: number[];
-    constructor(length: number, name: MessageName, binary: boolean, columnCount: number);
-}
-export declare class Field {
-    readonly name: string;
-    readonly tableID: number;
-    readonly columnID: number;
-    readonly dataTypeID: number;
-    readonly dataTypeSize: number;
-    readonly dataTypeModifier: number;
-    readonly format: Mode;
-    constructor(name: string, tableID: number, columnID: number, dataTypeID: number, dataTypeSize: number, dataTypeModifier: number, format: Mode);
-}
-export declare class RowDescriptionMessage {
-    readonly length: number;
-    readonly fieldCount: number;
-    readonly name: MessageName;
-    readonly fields: Field[];
-    constructor(length: number, fieldCount: number);
-}
-export declare class ParameterDescriptionMessage {
-    readonly length: number;
-    readonly parameterCount: number;
-    readonly name: MessageName;
-    readonly dataTypeIDs: number[];
-    constructor(length: number, parameterCount: number);
-}
-export declare class ParameterStatusMessage {
-    readonly length: number;
-    readonly parameterName: string;
-    readonly parameterValue: string;
-    readonly name: MessageName;
-    constructor(length: number, parameterName: string, parameterValue: string);
-}
-export declare class AuthenticationMD5Password implements BackendMessage {
-    readonly length: number;
-    readonly salt: Buffer;
-    readonly name: MessageName;
-    constructor(length: number, salt: Buffer);
-}
-export declare class BackendKeyDataMessage {
-    readonly length: number;
-    readonly processID: number;
-    readonly secretKey: number;
-    readonly name: MessageName;
-    constructor(length: number, processID: number, secretKey: number);
-}
-export declare class NotificationResponseMessage {
-    readonly length: number;
-    readonly processId: number;
-    readonly channel: string;
-    readonly payload: string;
-    readonly name: MessageName;
-    constructor(length: number, processId: number, channel: string, payload: string);
-}
-export declare class ReadyForQueryMessage {
-    readonly length: number;
-    readonly status: string;
-    readonly name: MessageName;
-    constructor(length: number, status: string);
-}
-export declare class CommandCompleteMessage {
-    readonly length: number;
-    readonly text: string;
-    readonly name: MessageName;
-    constructor(length: number, text: string);
-}
-export declare class DataRowMessage {
-    length: number;
-    fields: any[];
-    readonly fieldCount: number;
-    readonly name: MessageName;
-    constructor(length: number, fields: any[]);
-}
-export declare class NoticeMessage implements BackendMessage, NoticeOrError {
-    readonly length: number;
-    readonly message: string | undefined;
-    constructor(length: number, message: string | undefined);
-    readonly name = "notice";
-    severity: string | undefined;
-    code: string | undefined;
-    detail: string | undefined;
-    hint: string | undefined;
-    position: string | undefined;
-    internalPosition: string | undefined;
-    internalQuery: string | undefined;
-    where: string | undefined;
-    schema: string | undefined;
-    table: string | undefined;
-    column: string | undefined;
-    dataType: string | undefined;
-    constraint: string | undefined;
-    file: string | undefined;
-    line: string | undefined;
-    routine: string | undefined;
-}
-export {};
Index: de_modules/pg-protocol/dist/messages.js
===================================================================
--- node_modules/pg-protocol/dist/messages.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,160 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.NoticeMessage = exports.DataRowMessage = exports.CommandCompleteMessage = exports.ReadyForQueryMessage = exports.NotificationResponseMessage = exports.BackendKeyDataMessage = exports.AuthenticationMD5Password = exports.ParameterStatusMessage = exports.ParameterDescriptionMessage = exports.RowDescriptionMessage = exports.Field = exports.CopyResponse = exports.CopyDataMessage = exports.DatabaseError = exports.copyDone = exports.emptyQuery = exports.replicationStart = exports.portalSuspended = exports.noData = exports.closeComplete = exports.bindComplete = exports.parseComplete = void 0;
-exports.parseComplete = {
-    name: 'parseComplete',
-    length: 5,
-};
-exports.bindComplete = {
-    name: 'bindComplete',
-    length: 5,
-};
-exports.closeComplete = {
-    name: 'closeComplete',
-    length: 5,
-};
-exports.noData = {
-    name: 'noData',
-    length: 5,
-};
-exports.portalSuspended = {
-    name: 'portalSuspended',
-    length: 5,
-};
-exports.replicationStart = {
-    name: 'replicationStart',
-    length: 4,
-};
-exports.emptyQuery = {
-    name: 'emptyQuery',
-    length: 4,
-};
-exports.copyDone = {
-    name: 'copyDone',
-    length: 4,
-};
-class DatabaseError extends Error {
-    constructor(message, length, name) {
-        super(message);
-        this.length = length;
-        this.name = name;
-    }
-}
-exports.DatabaseError = DatabaseError;
-class CopyDataMessage {
-    constructor(length, chunk) {
-        this.length = length;
-        this.chunk = chunk;
-        this.name = 'copyData';
-    }
-}
-exports.CopyDataMessage = CopyDataMessage;
-class CopyResponse {
-    constructor(length, name, binary, columnCount) {
-        this.length = length;
-        this.name = name;
-        this.binary = binary;
-        this.columnTypes = new Array(columnCount);
-    }
-}
-exports.CopyResponse = CopyResponse;
-class Field {
-    constructor(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, format) {
-        this.name = name;
-        this.tableID = tableID;
-        this.columnID = columnID;
-        this.dataTypeID = dataTypeID;
-        this.dataTypeSize = dataTypeSize;
-        this.dataTypeModifier = dataTypeModifier;
-        this.format = format;
-    }
-}
-exports.Field = Field;
-class RowDescriptionMessage {
-    constructor(length, fieldCount) {
-        this.length = length;
-        this.fieldCount = fieldCount;
-        this.name = 'rowDescription';
-        this.fields = new Array(this.fieldCount);
-    }
-}
-exports.RowDescriptionMessage = RowDescriptionMessage;
-class ParameterDescriptionMessage {
-    constructor(length, parameterCount) {
-        this.length = length;
-        this.parameterCount = parameterCount;
-        this.name = 'parameterDescription';
-        this.dataTypeIDs = new Array(this.parameterCount);
-    }
-}
-exports.ParameterDescriptionMessage = ParameterDescriptionMessage;
-class ParameterStatusMessage {
-    constructor(length, parameterName, parameterValue) {
-        this.length = length;
-        this.parameterName = parameterName;
-        this.parameterValue = parameterValue;
-        this.name = 'parameterStatus';
-    }
-}
-exports.ParameterStatusMessage = ParameterStatusMessage;
-class AuthenticationMD5Password {
-    constructor(length, salt) {
-        this.length = length;
-        this.salt = salt;
-        this.name = 'authenticationMD5Password';
-    }
-}
-exports.AuthenticationMD5Password = AuthenticationMD5Password;
-class BackendKeyDataMessage {
-    constructor(length, processID, secretKey) {
-        this.length = length;
-        this.processID = processID;
-        this.secretKey = secretKey;
-        this.name = 'backendKeyData';
-    }
-}
-exports.BackendKeyDataMessage = BackendKeyDataMessage;
-class NotificationResponseMessage {
-    constructor(length, processId, channel, payload) {
-        this.length = length;
-        this.processId = processId;
-        this.channel = channel;
-        this.payload = payload;
-        this.name = 'notification';
-    }
-}
-exports.NotificationResponseMessage = NotificationResponseMessage;
-class ReadyForQueryMessage {
-    constructor(length, status) {
-        this.length = length;
-        this.status = status;
-        this.name = 'readyForQuery';
-    }
-}
-exports.ReadyForQueryMessage = ReadyForQueryMessage;
-class CommandCompleteMessage {
-    constructor(length, text) {
-        this.length = length;
-        this.text = text;
-        this.name = 'commandComplete';
-    }
-}
-exports.CommandCompleteMessage = CommandCompleteMessage;
-class DataRowMessage {
-    constructor(length, fields) {
-        this.length = length;
-        this.fields = fields;
-        this.name = 'dataRow';
-        this.fieldCount = fields.length;
-    }
-}
-exports.DataRowMessage = DataRowMessage;
-class NoticeMessage {
-    constructor(length, message) {
-        this.length = length;
-        this.message = message;
-        this.name = 'notice';
-    }
-}
-exports.NoticeMessage = NoticeMessage;
-//# sourceMappingURL=messages.js.map
Index: de_modules/pg-protocol/dist/messages.js.map
===================================================================
--- node_modules/pg-protocol/dist/messages.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/dist/outbound-serializer.test.d.ts
===================================================================
--- node_modules/pg-protocol/dist/outbound-serializer.test.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export {};
Index: de_modules/pg-protocol/dist/outbound-serializer.test.js
===================================================================
--- node_modules/pg-protocol/dist/outbound-serializer.test.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,325 +1,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const assert_1 = __importDefault(require("assert"));
-const serializer_1 = require("./serializer");
-const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
-describe('serializer', () => {
-    it('builds startup message', function () {
-        const actual = serializer_1.serialize.startup({
-            user: 'brian',
-            database: 'bang',
-        });
-        assert_1.default.deepEqual(actual, new buffer_list_1.default()
-            .addInt16(3)
-            .addInt16(0)
-            .addCString('user')
-            .addCString('brian')
-            .addCString('database')
-            .addCString('bang')
-            .addCString('client_encoding')
-            .addCString('UTF8')
-            .addCString('')
-            .join(true));
-    });
-    it('builds password message', function () {
-        const actual = serializer_1.serialize.password('!');
-        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('!').join(true, 'p'));
-    });
-    it('builds request ssl message', function () {
-        const actual = serializer_1.serialize.requestSsl();
-        const expected = new buffer_list_1.default().addInt32(80877103).join(true);
-        assert_1.default.deepEqual(actual, expected);
-    });
-    it('builds SASLInitialResponseMessage message', function () {
-        const actual = serializer_1.serialize.sendSASLInitialResponseMessage('mech', 'data');
-        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('mech').addInt32(4).addString('data').join(true, 'p'));
-    });
-    it('builds SCRAMClientFinalMessage message', function () {
-        const actual = serializer_1.serialize.sendSCRAMClientFinalMessage('data');
-        assert_1.default.deepEqual(actual, new buffer_list_1.default().addString('data').join(true, 'p'));
-    });
-    it('builds query message', function () {
-        const txt = 'select * from boom';
-        const actual = serializer_1.serialize.query(txt);
-        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString(txt).join(true, 'Q'));
-    });
-    describe('parse message', () => {
-        it('builds parse message', function () {
-            const actual = serializer_1.serialize.parse({ text: '!' });
-            const expected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('builds parse message with named query', function () {
-            const actual = serializer_1.serialize.parse({
-                name: 'boom',
-                text: 'select * from boom',
-                types: [],
-            });
-            const expected = new buffer_list_1.default().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('with multiple parameters', function () {
-            const actual = serializer_1.serialize.parse({
-                name: 'force',
-                text: 'select * from bang where name = $1',
-                types: [1, 2, 3, 4],
-            });
-            const expected = new buffer_list_1.default()
-                .addCString('force')
-                .addCString('select * from bang where name = $1')
-                .addInt16(4)
-                .addInt32(1)
-                .addInt32(2)
-                .addInt32(3)
-                .addInt32(4)
-                .join(true, 'P');
-            assert_1.default.deepEqual(actual, expected);
-        });
-    });
-    describe('bind messages', function () {
-        it('with no values', function () {
-            const actual = serializer_1.serialize.bind();
-            const expectedBuffer = new buffer_list_1.default()
-                .addCString('')
-                .addCString('')
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(1)
-                .addInt16(0)
-                .join(true, 'B');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-        it('with named statement, portal, and values', function () {
-            const actual = serializer_1.serialize.bind({
-                portal: 'bang',
-                statement: 'woo',
-                values: ['1', 'hi', null, 'zing'],
-            });
-            const expectedBuffer = new buffer_list_1.default()
-                .addCString('bang') // portal name
-                .addCString('woo') // statement name
-                .addInt16(4)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(4)
-                .addInt32(1)
-                .add(Buffer.from('1'))
-                .addInt32(2)
-                .add(Buffer.from('hi'))
-                .addInt32(-1)
-                .addInt32(4)
-                .add(Buffer.from('zing'))
-                .addInt16(1)
-                .addInt16(0)
-                .join(true, 'B');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-        it('encodes a multi-byte string param with its UTF-8 byte length, not char length', function () {
-            // Guards the single-pass addInt32PrefixedString write path: the Int32
-            // length prefix must be the UTF-8 byte count, not String.length. 'héllo中🎉'
-            // is 7 code points / 8 UTF-16 code units but 13 UTF-8 bytes.
-            const value = 'héllo中🎉';
-            const bytes = Buffer.from(value, 'utf8');
-            assert_1.default.notEqual(bytes.length, value.length); // sanity: the divergence we're testing
-            const actual = serializer_1.serialize.bind({ values: [value] });
-            const expectedBuffer = new buffer_list_1.default()
-                .addCString('') // portal
-                .addCString('') // statement
-                .addInt16(1) // param format code count
-                .addInt16(0) // format code for the one value (text)
-                .addInt16(1) // value count
-                .addInt32(bytes.length) // 13 — the UTF-8 byte length, NOT value.length (8)
-                .add(bytes)
-                .addInt16(1) // result format code count
-                .addInt16(0) // result format (text)
-                .join(true, 'B');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-    });
-    it('with custom valueMapper', function () {
-        const actual = serializer_1.serialize.bind({
-            portal: 'bang',
-            statement: 'woo',
-            values: ['1', 'hi', null, 'zing'],
-            valueMapper: () => null,
-        });
-        const expectedBuffer = new buffer_list_1.default()
-            .addCString('bang') // portal name
-            .addCString('woo') // statement name
-            .addInt16(4)
-            .addInt16(0)
-            .addInt16(0)
-            .addInt16(0)
-            .addInt16(0)
-            .addInt16(4)
-            .addInt32(-1)
-            .addInt32(-1)
-            .addInt32(-1)
-            .addInt32(-1)
-            .addInt16(1)
-            .addInt16(0)
-            .join(true, 'B');
-        assert_1.default.deepEqual(actual, expectedBuffer);
-    });
-    it('with named statement, portal, and buffer value', function () {
-        const actual = serializer_1.serialize.bind({
-            portal: 'bang',
-            statement: 'woo',
-            values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
-        });
-        const expectedBuffer = new buffer_list_1.default()
-            .addCString('bang') // portal name
-            .addCString('woo') // statement name
-            .addInt16(4) // value count
-            .addInt16(0) // string
-            .addInt16(0) // string
-            .addInt16(0) // string
-            .addInt16(1) // binary
-            .addInt16(4)
-            .addInt32(1)
-            .add(Buffer.from('1'))
-            .addInt32(2)
-            .add(Buffer.from('hi'))
-            .addInt32(-1)
-            .addInt32(4)
-            .add(Buffer.from('zing', 'utf-8'))
-            .addInt16(1)
-            .addInt16(0)
-            .join(true, 'B');
-        assert_1.default.deepEqual(actual, expectedBuffer);
-    });
-    describe('builds execute message', function () {
-        it('for unamed portal with no row limit', function () {
-            const actual = serializer_1.serialize.execute();
-            const expectedBuffer = new buffer_list_1.default().addCString('').addInt32(0).join(true, 'E');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-        it('for named portal with row limit', function () {
-            const actual = serializer_1.serialize.execute({
-                portal: 'my favorite portal',
-                rows: 100,
-            });
-            const expectedBuffer = new buffer_list_1.default().addCString('my favorite portal').addInt32(100).join(true, 'E');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-    });
-    it('builds flush command', function () {
-        const actual = serializer_1.serialize.flush();
-        const expected = new buffer_list_1.default().join(true, 'H');
-        assert_1.default.deepEqual(actual, expected);
-    });
-    it('builds sync command', function () {
-        const actual = serializer_1.serialize.sync();
-        const expected = new buffer_list_1.default().join(true, 'S');
-        assert_1.default.deepEqual(actual, expected);
-    });
-    it('builds end command', function () {
-        const actual = serializer_1.serialize.end();
-        const expected = Buffer.from([0x58, 0, 0, 0, 4]);
-        assert_1.default.deepEqual(actual, expected);
-    });
-    describe('builds describe command', function () {
-        it('describe statement', function () {
-            const actual = serializer_1.serialize.describe({ type: 'S', name: 'bang' });
-            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'D');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('describe unnamed portal', function () {
-            const actual = serializer_1.serialize.describe({ type: 'P' });
-            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'D');
-            assert_1.default.deepEqual(actual, expected);
-        });
-    });
-    describe('builds close command', function () {
-        it('describe statement', function () {
-            const actual = serializer_1.serialize.close({ type: 'S', name: 'bang' });
-            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'C');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('describe unnamed portal', function () {
-            const actual = serializer_1.serialize.close({ type: 'P' });
-            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'C');
-            assert_1.default.deepEqual(actual, expected);
-        });
-    });
-    describe('copy messages', function () {
-        it('builds copyFromChunk', () => {
-            const actual = serializer_1.serialize.copyData(Buffer.from([1, 2, 3]));
-            const expected = new buffer_list_1.default().add(Buffer.from([1, 2, 3])).join(true, 'd');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('builds copy fail', () => {
-            const actual = serializer_1.serialize.copyFail('err!');
-            const expected = new buffer_list_1.default().addCString('err!').join(true, 'f');
-            assert_1.default.deepEqual(actual, expected);
-        });
-        it('builds copy done', () => {
-            const actual = serializer_1.serialize.copyDone();
-            const expected = new buffer_list_1.default().join(true, 'c');
-            assert_1.default.deepEqual(actual, expected);
-        });
-    });
-    it('builds cancel message', () => {
-        const actual = serializer_1.serialize.cancel(3, 4);
-        const expected = new buffer_list_1.default().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true);
-        assert_1.default.deepEqual(actual, expected);
-    });
-    describe('bind error recovery', () => {
-        const throwingMapper = () => {
-            throw new Error('valueMapper error');
-        };
-        it('produces correct bind output after a valueMapper exception', () => {
-            assert_1.default.throws(() => {
-                serializer_1.serialize.bind({
-                    values: ['fail'],
-                    valueMapper: throwingMapper,
-                });
-            }, /valueMapper error/);
-            const actual = serializer_1.serialize.bind({
-                portal: 'bang',
-                statement: 'woo',
-                values: ['1', 'hi', null, 'zing'],
-            });
-            const expectedBuffer = new buffer_list_1.default()
-                .addCString('bang')
-                .addCString('woo')
-                .addInt16(4)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(0)
-                .addInt16(4)
-                .addInt32(1)
-                .add(Buffer.from('1'))
-                .addInt32(2)
-                .add(Buffer.from('hi'))
-                .addInt32(-1)
-                .addInt32(4)
-                .add(Buffer.from('zing'))
-                .addInt16(1)
-                .addInt16(0)
-                .join(true, 'B');
-            assert_1.default.deepEqual(actual, expectedBuffer);
-        });
-        it('produces correct output from other serializer methods after a failed bind', () => {
-            assert_1.default.throws(() => {
-                serializer_1.serialize.bind({
-                    values: ['fail'],
-                    valueMapper: throwingMapper,
-                });
-            }, /valueMapper error/);
-            const parseActual = serializer_1.serialize.parse({ text: '!' });
-            const parseExpected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
-            assert_1.default.deepEqual(parseActual, parseExpected);
-            const queryActual = serializer_1.serialize.query('select 1');
-            const queryExpected = new buffer_list_1.default().addCString('select 1').join(true, 'Q');
-            assert_1.default.deepEqual(queryActual, queryExpected);
-        });
-    });
-});
-//# sourceMappingURL=outbound-serializer.test.js.map
Index: de_modules/pg-protocol/dist/outbound-serializer.test.js.map
===================================================================
--- node_modules/pg-protocol/dist/outbound-serializer.test.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"outbound-serializer.test.js","sourceRoot":"","sources":["../src/outbound-serializer.test.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/dist/parser.d.ts
===================================================================
--- node_modules/pg-protocol/dist/parser.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import { TransformOptions } from 'stream';
-import { Mode, BackendMessage } from './messages';
-export type Packet = {
-    code: number;
-    packet: Buffer;
-};
-type StreamOptions = TransformOptions & {
-    mode: Mode;
-};
-export type MessageCallback = (msg: BackendMessage) => void;
-export declare class Parser {
-    private buffer;
-    private bufferLength;
-    private bufferOffset;
-    private reader;
-    private mode;
-    constructor(opts?: StreamOptions);
-    parse(buffer: Buffer, callback: MessageCallback): void;
-    private mergeBuffer;
-    private handlePacket;
-}
-export {};
Index: de_modules/pg-protocol/dist/parser.js
===================================================================
--- node_modules/pg-protocol/dist/parser.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,325 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Parser = void 0;
-const messages_1 = require("./messages");
-const buffer_reader_1 = require("./buffer-reader");
-// every message is prefixed with a single byte
-const CODE_LENGTH = 1;
-// every message has an int32 length which includes itself but does
-// NOT include the code in the length
-const LEN_LENGTH = 4;
-const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH;
-// A placeholder for a `BackendMessage`’s length value that will be set after construction.
-const LATEINIT_LENGTH = -1;
-const emptyBuffer = Buffer.allocUnsafe(0);
-class Parser {
-    constructor(opts) {
-        this.buffer = emptyBuffer;
-        this.bufferLength = 0;
-        this.bufferOffset = 0;
-        this.reader = new buffer_reader_1.BufferReader();
-        if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'binary') {
-            throw new Error('Binary mode not supported yet');
-        }
-        this.mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'text';
-    }
-    parse(buffer, callback) {
-        this.mergeBuffer(buffer);
-        const bufferFullLength = this.bufferOffset + this.bufferLength;
-        let offset = this.bufferOffset;
-        while (offset + HEADER_LENGTH <= bufferFullLength) {
-            // code is 1 byte long - it identifies the message type
-            const code = this.buffer[offset];
-            // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
-            const length = this.buffer.readUInt32BE(offset + CODE_LENGTH);
-            const fullMessageLength = CODE_LENGTH + length;
-            if (fullMessageLength + offset <= bufferFullLength) {
-                const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer);
-                callback(message);
-                offset += fullMessageLength;
-            }
-            else {
-                break;
-            }
-        }
-        if (offset === bufferFullLength) {
-            // No more use for the buffer
-            this.buffer = emptyBuffer;
-            this.bufferLength = 0;
-            this.bufferOffset = 0;
-        }
-        else {
-            // Adjust the cursors of remainingBuffer
-            this.bufferLength = bufferFullLength - offset;
-            this.bufferOffset = offset;
-        }
-    }
-    mergeBuffer(buffer) {
-        if (this.bufferLength > 0) {
-            const newLength = this.bufferLength + buffer.byteLength;
-            const newFullLength = newLength + this.bufferOffset;
-            if (newFullLength > this.buffer.byteLength) {
-                // We can't concat the new buffer with the remaining one
-                let newBuffer;
-                if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
-                    // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
-                    newBuffer = this.buffer;
-                }
-                else {
-                    // Allocate a new larger buffer
-                    let newBufferLength = this.buffer.byteLength * 2;
-                    while (newLength >= newBufferLength) {
-                        newBufferLength *= 2;
-                    }
-                    newBuffer = Buffer.allocUnsafe(newBufferLength);
-                }
-                // Move the remaining buffer to the new one
-                this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength);
-                this.buffer = newBuffer;
-                this.bufferOffset = 0;
-            }
-            // Concat the new buffer with the remaining one
-            buffer.copy(this.buffer, this.bufferOffset + this.bufferLength);
-            this.bufferLength = newLength;
-        }
-        else {
-            this.buffer = buffer;
-            this.bufferOffset = 0;
-            this.bufferLength = buffer.byteLength;
-        }
-    }
-    handlePacket(offset, code, length, bytes) {
-        const { reader } = this;
-        // NOTE: This undesirably retains the buffer in `this.reader` if the `parse*Message` calls below throw. However, those should only throw in the case of a protocol error, which normally results in the reader being discarded.
-        reader.setBuffer(offset, bytes);
-        let message;
-        switch (code) {
-            case 50 /* MessageCodes.BindComplete */:
-                message = messages_1.bindComplete;
-                break;
-            case 49 /* MessageCodes.ParseComplete */:
-                message = messages_1.parseComplete;
-                break;
-            case 51 /* MessageCodes.CloseComplete */:
-                message = messages_1.closeComplete;
-                break;
-            case 110 /* MessageCodes.NoData */:
-                message = messages_1.noData;
-                break;
-            case 115 /* MessageCodes.PortalSuspended */:
-                message = messages_1.portalSuspended;
-                break;
-            case 99 /* MessageCodes.CopyDone */:
-                message = messages_1.copyDone;
-                break;
-            case 87 /* MessageCodes.ReplicationStart */:
-                message = messages_1.replicationStart;
-                break;
-            case 73 /* MessageCodes.EmptyQuery */:
-                message = messages_1.emptyQuery;
-                break;
-            case 68 /* MessageCodes.DataRow */:
-                message = parseDataRowMessage(reader);
-                break;
-            case 67 /* MessageCodes.CommandComplete */:
-                message = parseCommandCompleteMessage(reader);
-                break;
-            case 90 /* MessageCodes.ReadyForQuery */:
-                message = parseReadyForQueryMessage(reader);
-                break;
-            case 65 /* MessageCodes.NotificationResponse */:
-                message = parseNotificationMessage(reader);
-                break;
-            case 82 /* MessageCodes.AuthenticationResponse */:
-                message = parseAuthenticationResponse(reader, length);
-                break;
-            case 83 /* MessageCodes.ParameterStatus */:
-                message = parseParameterStatusMessage(reader);
-                break;
-            case 75 /* MessageCodes.BackendKeyData */:
-                message = parseBackendKeyData(reader);
-                break;
-            case 69 /* MessageCodes.ErrorMessage */:
-                message = parseErrorMessage(reader, 'error');
-                break;
-            case 78 /* MessageCodes.NoticeMessage */:
-                message = parseErrorMessage(reader, 'notice');
-                break;
-            case 84 /* MessageCodes.RowDescriptionMessage */:
-                message = parseRowDescriptionMessage(reader);
-                break;
-            case 116 /* MessageCodes.ParameterDescriptionMessage */:
-                message = parseParameterDescriptionMessage(reader);
-                break;
-            case 71 /* MessageCodes.CopyIn */:
-                message = parseCopyInMessage(reader);
-                break;
-            case 72 /* MessageCodes.CopyOut */:
-                message = parseCopyOutMessage(reader);
-                break;
-            case 100 /* MessageCodes.CopyData */:
-                message = parseCopyData(reader, length);
-                break;
-            default:
-                return new messages_1.DatabaseError('received invalid response: ' + code.toString(16), length, 'error');
-        }
-        reader.setBuffer(0, emptyBuffer);
-        message.length = length;
-        return message;
-    }
-}
-exports.Parser = Parser;
-const parseReadyForQueryMessage = (reader) => {
-    const status = reader.string(1);
-    return new messages_1.ReadyForQueryMessage(LATEINIT_LENGTH, status);
-};
-const parseCommandCompleteMessage = (reader) => {
-    const text = reader.cstring();
-    return new messages_1.CommandCompleteMessage(LATEINIT_LENGTH, text);
-};
-const parseCopyData = (reader, length) => {
-    const chunk = reader.bytes(length - 4);
-    return new messages_1.CopyDataMessage(LATEINIT_LENGTH, chunk);
-};
-const parseCopyInMessage = (reader) => parseCopyMessage(reader, 'copyInResponse');
-const parseCopyOutMessage = (reader) => parseCopyMessage(reader, 'copyOutResponse');
-const parseCopyMessage = (reader, messageName) => {
-    const isBinary = reader.byte() !== 0;
-    const columnCount = reader.int16();
-    const message = new messages_1.CopyResponse(LATEINIT_LENGTH, messageName, isBinary, columnCount);
-    for (let i = 0; i < columnCount; i++) {
-        message.columnTypes[i] = reader.int16();
-    }
-    return message;
-};
-const parseNotificationMessage = (reader) => {
-    const processId = reader.int32();
-    const channel = reader.cstring();
-    const payload = reader.cstring();
-    return new messages_1.NotificationResponseMessage(LATEINIT_LENGTH, processId, channel, payload);
-};
-const parseRowDescriptionMessage = (reader) => {
-    const fieldCount = reader.int16();
-    const message = new messages_1.RowDescriptionMessage(LATEINIT_LENGTH, fieldCount);
-    for (let i = 0; i < fieldCount; i++) {
-        message.fields[i] = parseField(reader);
-    }
-    return message;
-};
-const parseField = (reader) => {
-    const name = reader.cstring();
-    const tableID = reader.uint32();
-    const columnID = reader.int16();
-    const dataTypeID = reader.uint32();
-    const dataTypeSize = reader.int16();
-    const dataTypeModifier = reader.int32();
-    const mode = reader.int16() === 0 ? 'text' : 'binary';
-    return new messages_1.Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode);
-};
-const parseParameterDescriptionMessage = (reader) => {
-    const parameterCount = reader.int16();
-    const message = new messages_1.ParameterDescriptionMessage(LATEINIT_LENGTH, parameterCount);
-    for (let i = 0; i < parameterCount; i++) {
-        // OIDs are unsigned, same as dataTypeID in parseField above
-        message.dataTypeIDs[i] = reader.uint32();
-    }
-    return message;
-};
-const parseDataRowMessage = (reader) => {
-    const fieldCount = reader.int16();
-    const fields = new Array(fieldCount);
-    for (let i = 0; i < fieldCount; i++) {
-        const len = reader.int32();
-        // a -1 for length means the value of the field is null
-        fields[i] = len === -1 ? null : reader.string(len);
-    }
-    return new messages_1.DataRowMessage(LATEINIT_LENGTH, fields);
-};
-const parseParameterStatusMessage = (reader) => {
-    const name = reader.cstring();
-    const value = reader.cstring();
-    return new messages_1.ParameterStatusMessage(LATEINIT_LENGTH, name, value);
-};
-const parseBackendKeyData = (reader) => {
-    const processID = reader.int32();
-    const secretKey = reader.int32();
-    return new messages_1.BackendKeyDataMessage(LATEINIT_LENGTH, processID, secretKey);
-};
-const parseAuthenticationResponse = (reader, length) => {
-    const code = reader.int32();
-    // TODO(bmc): maybe better types here
-    const message = {
-        name: 'authenticationOk',
-        length,
-    };
-    switch (code) {
-        case 0: // AuthenticationOk
-            break;
-        case 3: // AuthenticationCleartextPassword
-            if (message.length === 8) {
-                message.name = 'authenticationCleartextPassword';
-            }
-            break;
-        case 5: // AuthenticationMD5Password
-            if (message.length === 12) {
-                message.name = 'authenticationMD5Password';
-                const salt = reader.bytes(4);
-                return new messages_1.AuthenticationMD5Password(LATEINIT_LENGTH, salt);
-            }
-            break;
-        case 10: // AuthenticationSASL
-            {
-                message.name = 'authenticationSASL';
-                message.mechanisms = [];
-                let mechanism;
-                do {
-                    mechanism = reader.cstring();
-                    if (mechanism) {
-                        message.mechanisms.push(mechanism);
-                    }
-                } while (mechanism);
-            }
-            break;
-        case 11: // AuthenticationSASLContinue
-            message.name = 'authenticationSASLContinue';
-            message.data = reader.string(length - 8);
-            break;
-        case 12: // AuthenticationSASLFinal
-            message.name = 'authenticationSASLFinal';
-            message.data = reader.string(length - 8);
-            break;
-        default:
-            throw new Error('Unknown authenticationOk message type ' + code);
-    }
-    return message;
-};
-const parseErrorMessage = (reader, name) => {
-    const fields = {};
-    let fieldType = reader.string(1);
-    while (fieldType !== '\0') {
-        fields[fieldType] = reader.cstring();
-        fieldType = reader.string(1);
-    }
-    const messageValue = fields.M;
-    const message = name === 'notice'
-        ? new messages_1.NoticeMessage(LATEINIT_LENGTH, messageValue)
-        : new messages_1.DatabaseError(messageValue, LATEINIT_LENGTH, name);
-    message.severity = fields.S;
-    message.code = fields.C;
-    message.detail = fields.D;
-    message.hint = fields.H;
-    message.position = fields.P;
-    message.internalPosition = fields.p;
-    message.internalQuery = fields.q;
-    message.where = fields.W;
-    message.schema = fields.s;
-    message.table = fields.t;
-    message.column = fields.c;
-    message.dataType = fields.d;
-    message.constraint = fields.n;
-    message.file = fields.F;
-    message.line = fields.L;
-    message.routine = fields.R;
-    return message;
-};
-//# sourceMappingURL=parser.js.map
Index: de_modules/pg-protocol/dist/parser.js.map
===================================================================
--- node_modules/pg-protocol/dist/parser.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/dist/serializer.d.ts
===================================================================
--- node_modules/pg-protocol/dist/serializer.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,42 +1,0 @@
-type ParseOpts = {
-    name?: string;
-    types?: number[];
-    text: string;
-};
-type ValueMapper = (param: any, index: number) => any;
-type BindOpts = {
-    portal?: string;
-    binary?: boolean;
-    statement?: string;
-    values?: any[];
-    valueMapper?: ValueMapper;
-};
-type ExecOpts = {
-    portal?: string;
-    rows?: number;
-};
-type PortalOpts = {
-    type: 'S' | 'P';
-    name?: string;
-};
-declare const serialize: {
-    startup: (opts: Record<string, string>) => Buffer;
-    password: (password: string) => Buffer;
-    requestSsl: () => Buffer;
-    sendSASLInitialResponseMessage: (mechanism: string, initialResponse: string) => Buffer;
-    sendSCRAMClientFinalMessage: (additionalData: string) => Buffer;
-    query: (text: string) => Buffer;
-    parse: (query: ParseOpts) => Buffer;
-    bind: (config?: BindOpts) => Buffer;
-    execute: (config?: ExecOpts) => Buffer;
-    describe: (msg: PortalOpts) => Buffer;
-    close: (msg: PortalOpts) => Buffer;
-    flush: () => Buffer<ArrayBufferLike>;
-    sync: () => Buffer<ArrayBufferLike>;
-    end: () => Buffer<ArrayBufferLike>;
-    copyData: (chunk: Buffer) => Buffer;
-    copyDone: () => Buffer<ArrayBufferLike>;
-    copyFail: (message: string) => Buffer;
-    cancel: (processID: number, secretKey: number) => Buffer;
-};
-export { serialize };
Index: de_modules/pg-protocol/dist/serializer.js
===================================================================
--- node_modules/pg-protocol/dist/serializer.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,196 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.serialize = void 0;
-const buffer_writer_1 = require("./buffer-writer");
-const writer = new buffer_writer_1.Writer();
-const startup = (opts) => {
-    // protocol version
-    writer.addInt16(3).addInt16(0);
-    for (const key of Object.keys(opts)) {
-        writer.addCString(key).addCString(opts[key]);
-    }
-    writer.addCString('client_encoding').addCString('UTF8');
-    const bodyBuffer = writer.addCString('').flush();
-    // this message is sent without a code
-    const length = bodyBuffer.length + 4;
-    return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();
-};
-const requestSsl = () => {
-    const response = Buffer.allocUnsafe(8);
-    response.writeInt32BE(8, 0);
-    response.writeInt32BE(80877103, 4);
-    return response;
-};
-const password = (password) => {
-    return writer.addCString(password).flush(112 /* code.startup */);
-};
-const sendSASLInitialResponseMessage = function (mechanism, initialResponse) {
-    // 0x70 = 'p'
-    writer.addCString(mechanism).addInt32PrefixedString(initialResponse);
-    return writer.flush(112 /* code.startup */);
-};
-const sendSCRAMClientFinalMessage = function (additionalData) {
-    return writer.addString(additionalData).flush(112 /* code.startup */);
-};
-const query = (text) => {
-    return writer.addCString(text).flush(81 /* code.query */);
-};
-const emptyArray = [];
-const parse = (query) => {
-    // expect something like this:
-    // { name: 'queryName',
-    //   text: 'select * from blah',
-    //   types: ['int8', 'bool'] }
-    // normalize missing query names to allow for null
-    const name = query.name || '';
-    if (name.length > 63) {
-        console.error('Warning! Postgres only supports 63 characters for query names.');
-        console.error('You supplied %s (%s)', name, name.length);
-        console.error('This can cause conflicts and silent errors executing queries');
-    }
-    const types = query.types || emptyArray;
-    const len = types.length;
-    const buffer = writer
-        .addCString(name) // name of query
-        .addCString(query.text) // actual query text
-        .addInt16(len);
-    for (let i = 0; i < len; i++) {
-        buffer.addInt32(types[i]);
-    }
-    return writer.flush(80 /* code.parse */);
-};
-const paramWriter = new buffer_writer_1.Writer();
-const writeValues = function (values, valueMapper) {
-    for (let i = 0; i < values.length; i++) {
-        const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];
-        if (mappedVal == null) {
-            // add the param type (string) to the writer
-            writer.addInt16(0 /* ParamType.STRING */);
-            // write -1 to the param writer to indicate null
-            paramWriter.addInt32(-1);
-        }
-        else if (mappedVal instanceof Buffer) {
-            // add the param type (binary) to the writer
-            writer.addInt16(1 /* ParamType.BINARY */);
-            // add the buffer to the param writer
-            paramWriter.addInt32(mappedVal.length);
-            paramWriter.add(mappedVal);
-        }
-        else {
-            // add the param type (string) to the writer
-            writer.addInt16(0 /* ParamType.STRING */);
-            // length prefix + UTF-8 bytes in one pass (Buffer.byteLength computed once)
-            paramWriter.addInt32PrefixedString(mappedVal);
-        }
-    }
-};
-const bind = (config = {}) => {
-    // normalize config
-    const portal = config.portal || '';
-    const statement = config.statement || '';
-    const binary = config.binary || false;
-    const values = config.values || emptyArray;
-    const len = values.length;
-    writer.addCString(portal).addCString(statement);
-    writer.addInt16(len);
-    try {
-        writeValues(values, config.valueMapper);
-    }
-    catch (err) {
-        writer.clear();
-        paramWriter.clear();
-        throw err;
-    }
-    writer.addInt16(len);
-    writer.add(paramWriter.flush());
-    // all results use the same format code
-    writer.addInt16(1);
-    // format code
-    writer.addInt16(binary ? 1 /* ParamType.BINARY */ : 0 /* ParamType.STRING */);
-    return writer.flush(66 /* code.bind */);
-};
-const emptyExecute = Buffer.from([69 /* code.execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);
-const execute = (config) => {
-    // this is the happy path for most queries
-    if (!config || (!config.portal && !config.rows)) {
-        return emptyExecute;
-    }
-    const portal = config.portal || '';
-    const rows = config.rows || 0;
-    const portalLength = Buffer.byteLength(portal);
-    const len = 4 + portalLength + 1 + 4;
-    // one extra bit for code
-    const buff = Buffer.allocUnsafe(1 + len);
-    buff[0] = 69 /* code.execute */;
-    buff.writeInt32BE(len, 1);
-    buff.write(portal, 5, 'utf-8');
-    buff[portalLength + 5] = 0; // null terminate portal cString
-    buff.writeUInt32BE(rows, buff.length - 4);
-    return buff;
-};
-const cancel = (processID, secretKey) => {
-    const buffer = Buffer.allocUnsafe(16);
-    buffer.writeInt32BE(16, 0);
-    buffer.writeInt16BE(1234, 4);
-    buffer.writeInt16BE(5678, 6);
-    buffer.writeInt32BE(processID, 8);
-    buffer.writeInt32BE(secretKey, 12);
-    return buffer;
-};
-const cstringMessage = (code, string) => {
-    const stringLen = Buffer.byteLength(string);
-    const len = 4 + stringLen + 1;
-    // one extra bit for code
-    const buffer = Buffer.allocUnsafe(1 + len);
-    buffer[0] = code;
-    buffer.writeInt32BE(len, 1);
-    buffer.write(string, 5, 'utf-8');
-    buffer[len] = 0; // null terminate cString
-    return buffer;
-};
-const emptyDescribePortal = writer.addCString('P').flush(68 /* code.describe */);
-const emptyDescribeStatement = writer.addCString('S').flush(68 /* code.describe */);
-const describe = (msg) => {
-    return msg.name
-        ? cstringMessage(68 /* code.describe */, `${msg.type}${msg.name || ''}`)
-        : msg.type === 'P'
-            ? emptyDescribePortal
-            : emptyDescribeStatement;
-};
-const close = (msg) => {
-    const text = `${msg.type}${msg.name || ''}`;
-    return cstringMessage(67 /* code.close */, text);
-};
-const copyData = (chunk) => {
-    return writer.add(chunk).flush(100 /* code.copyFromChunk */);
-};
-const copyFail = (message) => {
-    return cstringMessage(102 /* code.copyFail */, message);
-};
-const codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);
-const flushBuffer = codeOnlyBuffer(72 /* code.flush */);
-const syncBuffer = codeOnlyBuffer(83 /* code.sync */);
-const endBuffer = codeOnlyBuffer(88 /* code.end */);
-const copyDoneBuffer = codeOnlyBuffer(99 /* code.copyDone */);
-const serialize = {
-    startup,
-    password,
-    requestSsl,
-    sendSASLInitialResponseMessage,
-    sendSCRAMClientFinalMessage,
-    query,
-    parse,
-    bind,
-    execute,
-    describe,
-    close,
-    flush: () => flushBuffer,
-    sync: () => syncBuffer,
-    end: () => endBuffer,
-    copyData,
-    copyDone: () => copyDoneBuffer,
-    copyFail,
-    cancel,
-};
-exports.serialize = serialize;
-//# sourceMappingURL=serializer.js.map
Index: de_modules/pg-protocol/dist/serializer.js.map
===================================================================
--- node_modules/pg-protocol/dist/serializer.js.map	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
Index: de_modules/pg-protocol/esm/index.js
===================================================================
--- node_modules/pg-protocol/esm/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,11 +1,0 @@
-// ESM wrapper for pg-protocol
-import * as protocol from '../dist/index.js'
-
-// Re-export all the properties
-export const DatabaseError = protocol.DatabaseError
-export const SASL = protocol.SASL
-export const serialize = protocol.serialize
-export const parse = protocol.parse
-
-// Re-export the default
-export default protocol
Index: de_modules/pg-protocol/package.json
===================================================================
--- node_modules/pg-protocol/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,44 +1,0 @@
-{
-  "name": "pg-protocol",
-  "version": "1.16.0",
-  "description": "The postgres client/server binary protocol, implemented in TypeScript",
-  "main": "dist/index.js",
-  "types": "dist/index.d.ts",
-  "exports": {
-    ".": {
-      "import": "./esm/index.js",
-      "require": "./dist/index.js",
-      "default": "./dist/index.js"
-    },
-    "./dist/*": "./dist/*.js",
-    "./dist/*.js": "./dist/*.js"
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "@types/chai": "^4.2.7",
-    "@types/mocha": "^10.0.10",
-    "@types/node": "^16",
-    "chai": "^4.2.0",
-    "mocha": "^11.7.5",
-    "ts-node": "^8.5.4",
-    "typescript": "^6.0.3"
-  },
-  "scripts": {
-    "test": "mocha dist/**/*.test.js",
-    "build": "tsc",
-    "build:watch": "tsc --watch",
-    "prepublish": "yarn build",
-    "pretest": "yarn build"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-postgres.git",
-    "directory": "packages/pg-protocol"
-  },
-  "files": [
-    "/dist/*{js,ts,map}",
-    "/src",
-    "/esm"
-  ],
-  "gitHead": "df274d1ba9ad9d11a8f1079314faeafde7208207"
-}
Index: de_modules/pg-protocol/src/b.ts
===================================================================
--- node_modules/pg-protocol/src/b.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,25 +1,0 @@
-// file for microbenchmarking
-
-import { BufferReader } from './buffer-reader'
-
-const LOOPS = 1000
-let count = 0
-const start = performance.now()
-
-const reader = new BufferReader()
-const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0])
-
-const run = () => {
-  if (count > LOOPS) {
-    console.log(performance.now() - start)
-    return
-  }
-  count++
-  for (let i = 0; i < LOOPS; i++) {
-    reader.setBuffer(0, buffer)
-    reader.cstring()
-  }
-  setImmediate(run)
-}
-
-run()
Index: de_modules/pg-protocol/src/buffer-reader.ts
===================================================================
--- node_modules/pg-protocol/src/buffer-reader.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,58 +1,0 @@
-export class BufferReader {
-  private buffer: Buffer = Buffer.allocUnsafe(0)
-
-  // TODO(bmc): support non-utf8 encoding?
-  private encoding: BufferEncoding = 'utf-8'
-
-  constructor(private offset: number = 0) {}
-
-  public setBuffer(offset: number, buffer: Buffer): void {
-    this.offset = offset
-    this.buffer = buffer
-  }
-
-  public int16(): number {
-    const result = this.buffer.readInt16BE(this.offset)
-    this.offset += 2
-    return result
-  }
-
-  public byte(): number {
-    const result = this.buffer[this.offset]
-    this.offset++
-    return result
-  }
-
-  public int32(): number {
-    const result = this.buffer.readInt32BE(this.offset)
-    this.offset += 4
-    return result
-  }
-
-  public uint32(): number {
-    const result = this.buffer.readUInt32BE(this.offset)
-    this.offset += 4
-    return result
-  }
-
-  public string(length: number): string {
-    const result = this.buffer.toString(this.encoding, this.offset, this.offset + length)
-    this.offset += length
-    return result
-  }
-
-  public cstring(): string {
-    const start = this.offset
-    let end = start
-    // eslint-disable-next-line no-empty
-    while (this.buffer[end++]) {}
-    this.offset = end
-    return this.buffer.toString(this.encoding, start, end - 1)
-  }
-
-  public bytes(length: number): Buffer {
-    const result = this.buffer.slice(this.offset, this.offset + length)
-    this.offset += length
-    return result
-  }
-}
Index: de_modules/pg-protocol/src/buffer-writer.ts
===================================================================
--- node_modules/pg-protocol/src/buffer-writer.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,110 +1,0 @@
-//binary data writer tuned for encoding binary specific to the postgres binary protocol
-
-export class Writer {
-  private buffer: Buffer
-  private offset: number = 5
-  private headerPosition: number = 0
-  constructor(private size = 256) {
-    this.buffer = Buffer.allocUnsafe(size)
-  }
-
-  private ensure(size: number): void {
-    const remaining = this.buffer.length - this.offset
-    if (remaining < size) {
-      const oldBuffer = this.buffer
-      // exponential growth factor of around ~ 1.5
-      // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
-      const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size
-      this.buffer = Buffer.allocUnsafe(newSize)
-      oldBuffer.copy(this.buffer)
-    }
-  }
-
-  public addInt32(num: number): Writer {
-    this.ensure(4)
-    this.buffer[this.offset++] = (num >>> 24) & 0xff
-    this.buffer[this.offset++] = (num >>> 16) & 0xff
-    this.buffer[this.offset++] = (num >>> 8) & 0xff
-    this.buffer[this.offset++] = (num >>> 0) & 0xff
-    return this
-  }
-
-  public addInt16(num: number): Writer {
-    this.ensure(2)
-    this.buffer[this.offset++] = (num >>> 8) & 0xff
-    this.buffer[this.offset++] = (num >>> 0) & 0xff
-    return this
-  }
-
-  public addCString(string: string): Writer {
-    if (!string) {
-      this.ensure(1)
-    } else {
-      const len = Buffer.byteLength(string)
-      this.ensure(len + 1) // +1 for null terminator
-      this.buffer.write(string, this.offset, 'utf-8')
-      this.offset += len
-    }
-
-    this.buffer[this.offset++] = 0 // null terminator
-    return this
-  }
-
-  public addString(string: string = ''): Writer {
-    const len = Buffer.byteLength(string)
-    this.ensure(len)
-    this.buffer.write(string, this.offset)
-    this.offset += len
-    return this
-  }
-
-  // Write an Int32 byte-length prefix immediately followed by the string's UTF-8
-  // bytes. Postgres' Bind wire format prefixes every parameter with its length,
-  // and doing it in one method computes Buffer.byteLength ONCE — the previous
-  // `addInt32(Buffer.byteLength(s)).addString(s)` pairing scanned the string
-  // three times (byteLength for the prefix, byteLength again inside addString,
-  // then the encode), which is costly for large text parameters.
-  public addInt32PrefixedString(string: string): Writer {
-    const len = Buffer.byteLength(string)
-    this.ensure(4 + len)
-    const buffer = this.buffer
-    let offset = this.offset
-    buffer[offset++] = (len >>> 24) & 0xff
-    buffer[offset++] = (len >>> 16) & 0xff
-    buffer[offset++] = (len >>> 8) & 0xff
-    buffer[offset++] = (len >>> 0) & 0xff
-    buffer.write(string, offset, 'utf-8')
-    this.offset = offset + len
-    return this
-  }
-
-  public add(otherBuffer: Buffer): Writer {
-    this.ensure(otherBuffer.length)
-    otherBuffer.copy(this.buffer, this.offset)
-    this.offset += otherBuffer.length
-    return this
-  }
-
-  private join(code?: number): Buffer {
-    if (code) {
-      this.buffer[this.headerPosition] = code
-      //length is everything in this packet minus the code
-      const length = this.offset - (this.headerPosition + 1)
-      this.buffer.writeInt32BE(length, this.headerPosition + 1)
-    }
-    return this.buffer.slice(code ? 0 : 5, this.offset)
-  }
-
-  public flush(code?: number): Buffer {
-    const result = this.join(code)
-    this.offset = 5
-    this.headerPosition = 0
-    this.buffer = Buffer.allocUnsafe(this.size)
-    return result
-  }
-
-  public clear(): void {
-    this.offset = 5
-    this.headerPosition = 0
-  }
-}
Index: de_modules/pg-protocol/src/inbound-parser.test.ts
===================================================================
--- node_modules/pg-protocol/src/inbound-parser.test.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,585 +1,0 @@
-import buffers from './testing/test-buffers'
-import BufferList from './testing/buffer-list'
-import { parse } from '.'
-import assert from 'assert'
-import { PassThrough } from 'stream'
-import { BackendMessage } from './messages'
-import { Parser } from './parser'
-
-const authOkBuffer = buffers.authenticationOk()
-const paramStatusBuffer = buffers.parameterStatus('client_encoding', 'UTF8')
-const readyForQueryBuffer = buffers.readyForQuery()
-const backendKeyDataBuffer = buffers.backendKeyData(1, 2)
-const commandCompleteBuffer = buffers.commandComplete('SELECT 3')
-const parseCompleteBuffer = buffers.parseComplete()
-const bindCompleteBuffer = buffers.bindComplete()
-const portalSuspendedBuffer = buffers.portalSuspended()
-
-const row1 = {
-  name: 'id',
-  tableID: 1,
-  attributeNumber: 2,
-  dataTypeID: 3,
-  dataTypeSize: 4,
-  typeModifier: 5,
-  formatCode: 0,
-}
-const oneRowDescBuff = buffers.rowDescription([row1])
-row1.name = 'bang'
-
-const twoRowBuf = buffers.rowDescription([
-  row1,
-  {
-    name: 'whoah',
-    tableID: 10,
-    attributeNumber: 11,
-    dataTypeID: 12,
-    dataTypeSize: 13,
-    typeModifier: 14,
-    formatCode: 0,
-  },
-])
-
-const rowWithBigOids = {
-  name: 'bigoid',
-  tableID: 3000000001,
-  attributeNumber: 2,
-  dataTypeID: 3000000003,
-  dataTypeSize: 4,
-  typeModifier: 5,
-  formatCode: 0,
-}
-const bigOidDescBuff = buffers.rowDescription([rowWithBigOids])
-
-const emptyRowFieldBuf = buffers.dataRow([])
-
-const oneFieldBuf = buffers.dataRow(['test'])
-
-const expectedAuthenticationOkayMessage = {
-  name: 'authenticationOk',
-  length: 8,
-}
-
-const expectedParameterStatusMessage = {
-  name: 'parameterStatus',
-  parameterName: 'client_encoding',
-  parameterValue: 'UTF8',
-  length: 25,
-}
-
-const expectedBackendKeyDataMessage = {
-  name: 'backendKeyData',
-  processID: 1,
-  secretKey: 2,
-}
-
-const expectedReadyForQueryMessage = {
-  name: 'readyForQuery',
-  length: 5,
-  status: 'I',
-}
-
-const expectedCommandCompleteMessage = {
-  name: 'commandComplete',
-  length: 13,
-  text: 'SELECT 3',
-}
-const emptyRowDescriptionBuffer = new BufferList()
-  .addInt16(0) // number of fields
-  .join(true, 'T')
-
-const expectedEmptyRowDescriptionMessage = {
-  name: 'rowDescription',
-  length: 6,
-  fieldCount: 0,
-  fields: [],
-}
-const expectedOneRowMessage = {
-  name: 'rowDescription',
-  length: 27,
-  fieldCount: 1,
-  fields: [
-    {
-      name: 'id',
-      tableID: 1,
-      columnID: 2,
-      dataTypeID: 3,
-      dataTypeSize: 4,
-      dataTypeModifier: 5,
-      format: 'text',
-    },
-  ],
-}
-
-const expectedTwoRowMessage = {
-  name: 'rowDescription',
-  length: 53,
-  fieldCount: 2,
-  fields: [
-    {
-      name: 'bang',
-      tableID: 1,
-      columnID: 2,
-      dataTypeID: 3,
-      dataTypeSize: 4,
-      dataTypeModifier: 5,
-      format: 'text',
-    },
-    {
-      name: 'whoah',
-      tableID: 10,
-      columnID: 11,
-      dataTypeID: 12,
-      dataTypeSize: 13,
-      dataTypeModifier: 14,
-      format: 'text',
-    },
-  ],
-}
-const expectedBigOidMessage = {
-  name: 'rowDescription',
-  length: 31,
-  fieldCount: 1,
-  fields: [
-    {
-      name: 'bigoid',
-      tableID: 3000000001,
-      columnID: 2,
-      dataTypeID: 3000000003,
-      dataTypeSize: 4,
-      dataTypeModifier: 5,
-      format: 'text',
-    },
-  ],
-}
-
-const emptyParameterDescriptionBuffer = new BufferList()
-  .addInt16(0) // number of parameters
-  .join(true, 't')
-
-const oneParameterDescBuf = buffers.parameterDescription([1111])
-
-const twoParameterDescBuf = buffers.parameterDescription([2222, 3333])
-
-const bigOidParameterDescBuf = buffers.parameterDescription([3000000003])
-
-const expectedEmptyParameterDescriptionMessage = {
-  name: 'parameterDescription',
-  length: 6,
-  parameterCount: 0,
-  dataTypeIDs: [],
-}
-
-const expectedOneParameterMessage = {
-  name: 'parameterDescription',
-  length: 10,
-  parameterCount: 1,
-  dataTypeIDs: [1111],
-}
-
-const expectedTwoParameterMessage = {
-  name: 'parameterDescription',
-  length: 14,
-  parameterCount: 2,
-  dataTypeIDs: [2222, 3333],
-}
-
-const expectedBigOidParameterMessage = {
-  name: 'parameterDescription',
-  length: 10,
-  parameterCount: 1,
-  dataTypeIDs: [3000000003],
-}
-
-const testForMessage = function (buffer: Buffer, expectedMessage: any) {
-  it('receives and parses ' + expectedMessage.name, async () => {
-    const messages = await parseBuffers([buffer])
-    const [lastMessage] = messages
-
-    for (const key in expectedMessage) {
-      assert.deepEqual((lastMessage as any)[key], expectedMessage[key])
-    }
-  })
-}
-
-const plainPasswordBuffer = buffers.authenticationCleartextPassword()
-const md5PasswordBuffer = buffers.authenticationMD5Password()
-const SASLBuffer = buffers.authenticationSASL()
-const SASLContinueBuffer = buffers.authenticationSASLContinue()
-const SASLFinalBuffer = buffers.authenticationSASLFinal()
-
-const expectedPlainPasswordMessage = {
-  name: 'authenticationCleartextPassword',
-}
-
-const expectedMD5PasswordMessage = {
-  name: 'authenticationMD5Password',
-  salt: Buffer.from([1, 2, 3, 4]),
-}
-
-const expectedSASLMessage = {
-  name: 'authenticationSASL',
-  mechanisms: ['SCRAM-SHA-256'],
-}
-
-const expectedSASLContinueMessage = {
-  name: 'authenticationSASLContinue',
-  data: 'data',
-}
-
-const expectedSASLFinalMessage = {
-  name: 'authenticationSASLFinal',
-  data: 'data',
-}
-
-const notificationResponseBuffer = buffers.notification(4, 'hi', 'boom')
-const expectedNotificationResponseMessage = {
-  name: 'notification',
-  processId: 4,
-  channel: 'hi',
-  payload: 'boom',
-}
-
-const parseBuffers = async (buffers: Buffer[]): Promise<BackendMessage[]> => {
-  const stream = new PassThrough()
-  for (const buffer of buffers) {
-    stream.write(buffer)
-  }
-  stream.end()
-  const msgs: BackendMessage[] = []
-  await parse(stream, (msg) => msgs.push(msg))
-  return msgs
-}
-
-describe('PgPacketStream', function () {
-  testForMessage(authOkBuffer, expectedAuthenticationOkayMessage)
-  testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage)
-  testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage)
-  testForMessage(SASLBuffer, expectedSASLMessage)
-  testForMessage(SASLContinueBuffer, expectedSASLContinueMessage)
-
-  // this exercises a found bug in the parser:
-  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
-  // and adds a test which is deterministic, rather than relying on network packet chunking
-  const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])])
-  testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage)
-
-  testForMessage(SASLFinalBuffer, expectedSASLFinalMessage)
-
-  // this exercises a found bug in the parser:
-  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
-  // and adds a test which is deterministic, rather than relying on network packet chunking
-  const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])])
-  testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage)
-
-  testForMessage(paramStatusBuffer, expectedParameterStatusMessage)
-  testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage)
-  testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage)
-  testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage)
-  testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage)
-  testForMessage(buffers.emptyQuery(), {
-    name: 'emptyQuery',
-    length: 4,
-  })
-
-  testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
-    name: 'noData',
-  })
-
-  describe('rowDescription messages', function () {
-    testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage)
-    testForMessage(oneRowDescBuff, expectedOneRowMessage)
-    testForMessage(twoRowBuf, expectedTwoRowMessage)
-    testForMessage(bigOidDescBuff, expectedBigOidMessage)
-  })
-
-  describe('parameterDescription messages', function () {
-    testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage)
-    testForMessage(oneParameterDescBuf, expectedOneParameterMessage)
-    testForMessage(twoParameterDescBuf, expectedTwoParameterMessage)
-    testForMessage(bigOidParameterDescBuf, expectedBigOidParameterMessage)
-  })
-
-  describe('parsing rows', function () {
-    describe('parsing empty row', function () {
-      testForMessage(emptyRowFieldBuf, {
-        name: 'dataRow',
-        fieldCount: 0,
-      })
-    })
-
-    describe('parsing data row with fields', function () {
-      testForMessage(oneFieldBuf, {
-        name: 'dataRow',
-        fieldCount: 1,
-        fields: ['test'],
-      })
-    })
-  })
-
-  describe('notice message', function () {
-    // this uses the same logic as error message
-    const buff = buffers.notice([{ type: 'C', value: 'code' }])
-    testForMessage(buff, {
-      name: 'notice',
-      code: 'code',
-    })
-  })
-
-  testForMessage(buffers.error([]), {
-    name: 'error',
-  })
-
-  describe('with all the fields', function () {
-    const buffer = buffers.error([
-      {
-        type: 'S',
-        value: 'ERROR',
-      },
-      {
-        type: 'C',
-        value: 'code',
-      },
-      {
-        type: 'M',
-        value: 'message',
-      },
-      {
-        type: 'D',
-        value: 'details',
-      },
-      {
-        type: 'H',
-        value: 'hint',
-      },
-      {
-        type: 'P',
-        value: '100',
-      },
-      {
-        type: 'p',
-        value: '101',
-      },
-      {
-        type: 'q',
-        value: 'query',
-      },
-      {
-        type: 'W',
-        value: 'where',
-      },
-      {
-        type: 'F',
-        value: 'file',
-      },
-      {
-        type: 'L',
-        value: 'line',
-      },
-      {
-        type: 'R',
-        value: 'routine',
-      },
-      {
-        type: 'Z', // ignored
-        value: 'alsdkf',
-      },
-    ])
-
-    testForMessage(buffer, {
-      name: 'error',
-      severity: 'ERROR',
-      code: 'code',
-      message: 'message',
-      detail: 'details',
-      hint: 'hint',
-      position: '100',
-      internalPosition: '101',
-      internalQuery: 'query',
-      where: 'where',
-      file: 'file',
-      line: 'line',
-      routine: 'routine',
-    })
-  })
-
-  testForMessage(parseCompleteBuffer, {
-    name: 'parseComplete',
-  })
-
-  testForMessage(bindCompleteBuffer, {
-    name: 'bindComplete',
-  })
-
-  testForMessage(bindCompleteBuffer, {
-    name: 'bindComplete',
-  })
-
-  testForMessage(buffers.closeComplete(), {
-    name: 'closeComplete',
-  })
-
-  describe('parses portal suspended message', function () {
-    testForMessage(portalSuspendedBuffer, {
-      name: 'portalSuspended',
-    })
-  })
-
-  describe('parses replication start message', function () {
-    testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
-      name: 'replicationStart',
-      length: 4,
-    })
-  })
-
-  describe('copy', () => {
-    testForMessage(buffers.copyIn(0), {
-      name: 'copyInResponse',
-      length: 7,
-      binary: false,
-      columnTypes: [],
-    })
-
-    testForMessage(buffers.copyIn(2), {
-      name: 'copyInResponse',
-      length: 11,
-      binary: false,
-      columnTypes: [0, 1],
-    })
-
-    testForMessage(buffers.copyOut(0), {
-      name: 'copyOutResponse',
-      length: 7,
-      binary: false,
-      columnTypes: [],
-    })
-
-    testForMessage(buffers.copyOut(3), {
-      name: 'copyOutResponse',
-      length: 13,
-      binary: false,
-      columnTypes: [0, 1, 2],
-    })
-
-    testForMessage(buffers.copyDone(), {
-      name: 'copyDone',
-      length: 4,
-    })
-
-    testForMessage(buffers.copyData(Buffer.from([5, 6, 7])), {
-      name: 'copyData',
-      length: 7,
-      chunk: Buffer.from([5, 6, 7]),
-    })
-  })
-
-  // since the data message on a stream can randomly divide the incomming
-  // tcp packets anywhere, we need to make sure we can parse every single
-  // split on a tcp message
-  describe('split buffer, single message parsing', function () {
-    const fullBuffer = buffers.dataRow([null, 'bang', 'zug zug', null, '!'])
-
-    it('parses when full buffer comes in', async function () {
-      const messages = await parseBuffers([fullBuffer])
-      const message = messages[0] as any
-      assert.equal(message.fields.length, 5)
-      assert.equal(message.fields[0], null)
-      assert.equal(message.fields[1], 'bang')
-      assert.equal(message.fields[2], 'zug zug')
-      assert.equal(message.fields[3], null)
-      assert.equal(message.fields[4], '!')
-    })
-
-    const testMessageReceivedAfterSplitAt = async function (split: number) {
-      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
-      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
-      fullBuffer.copy(firstBuffer, 0, 0)
-      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
-      const messages = await parseBuffers([firstBuffer, secondBuffer])
-      const message = messages[0] as any
-      assert.equal(message.fields.length, 5)
-      assert.equal(message.fields[0], null)
-      assert.equal(message.fields[1], 'bang')
-      assert.equal(message.fields[2], 'zug zug')
-      assert.equal(message.fields[3], null)
-      assert.equal(message.fields[4], '!')
-    }
-
-    it('parses when split in the middle', function () {
-      return testMessageReceivedAfterSplitAt(6)
-    })
-
-    it('parses when split at end', function () {
-      return testMessageReceivedAfterSplitAt(2)
-    })
-
-    it('parses when split at beginning', function () {
-      return Promise.all([
-        testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
-        testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
-        testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
-      ])
-    })
-  })
-
-  describe('split buffer, multiple message parsing', function () {
-    const dataRowBuffer = buffers.dataRow(['!'])
-    const readyForQueryBuffer = buffers.readyForQuery()
-    const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length)
-    dataRowBuffer.copy(fullBuffer, 0, 0)
-    readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0)
-
-    const verifyMessages = function (messages: any[]) {
-      assert.strictEqual(messages.length, 2)
-      assert.deepEqual(messages[0], {
-        name: 'dataRow',
-        fieldCount: 1,
-        length: 11,
-        fields: ['!'],
-      })
-      assert.equal(messages[0].fields[0], '!')
-      assert.deepEqual(messages[1], {
-        name: 'readyForQuery',
-        length: 5,
-        status: 'I',
-      })
-    }
-    // sanity check
-    it('receives both messages when packet is not split', async function () {
-      const messages = await parseBuffers([fullBuffer])
-      verifyMessages(messages)
-    })
-
-    const splitAndVerifyTwoMessages = async function (split: number) {
-      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
-      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
-      fullBuffer.copy(firstBuffer, 0, 0)
-      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
-      const messages = await parseBuffers([firstBuffer, secondBuffer])
-      verifyMessages(messages)
-    }
-
-    describe('receives both messages when packet is split', function () {
-      it('in the middle', function () {
-        return splitAndVerifyTwoMessages(11)
-      })
-      it('at the front', function () {
-        return Promise.all([
-          splitAndVerifyTwoMessages(fullBuffer.length - 1),
-          splitAndVerifyTwoMessages(fullBuffer.length - 4),
-          splitAndVerifyTwoMessages(fullBuffer.length - 6),
-        ])
-      })
-
-      it('at the end', function () {
-        return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)])
-      })
-    })
-  })
-
-  it('cleans up the reader after handling a packet', function () {
-    const parser = new Parser()
-    parser.parse(oneFieldBuf, () => {})
-    assert.strictEqual((parser as any).reader.buffer.byteLength, 0)
-  })
-})
Index: de_modules/pg-protocol/src/index.ts
===================================================================
--- node_modules/pg-protocol/src/index.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { DatabaseError } from './messages'
-import { serialize } from './serializer'
-import { Parser, MessageCallback } from './parser'
-
-export function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void> {
-  const parser = new Parser()
-  stream.on('data', (buffer: Buffer) => parser.parse(buffer, callback))
-  return new Promise((resolve) => stream.on('end', () => resolve()))
-}
-
-export { serialize, DatabaseError }
Index: de_modules/pg-protocol/src/messages.ts
===================================================================
--- node_modules/pg-protocol/src/messages.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,262 +1,0 @@
-export type Mode = 'text' | 'binary'
-
-export type MessageName =
-  | 'parseComplete'
-  | 'bindComplete'
-  | 'closeComplete'
-  | 'noData'
-  | 'portalSuspended'
-  | 'replicationStart'
-  | 'emptyQuery'
-  | 'copyDone'
-  | 'copyData'
-  | 'rowDescription'
-  | 'parameterDescription'
-  | 'parameterStatus'
-  | 'backendKeyData'
-  | 'notification'
-  | 'readyForQuery'
-  | 'commandComplete'
-  | 'dataRow'
-  | 'copyInResponse'
-  | 'copyOutResponse'
-  | 'authenticationOk'
-  | 'authenticationMD5Password'
-  | 'authenticationCleartextPassword'
-  | 'authenticationSASL'
-  | 'authenticationSASLContinue'
-  | 'authenticationSASLFinal'
-  | 'error'
-  | 'notice'
-
-export interface BackendMessage {
-  name: MessageName
-  length: number
-}
-
-export const parseComplete: BackendMessage = {
-  name: 'parseComplete',
-  length: 5,
-}
-
-export const bindComplete: BackendMessage = {
-  name: 'bindComplete',
-  length: 5,
-}
-
-export const closeComplete: BackendMessage = {
-  name: 'closeComplete',
-  length: 5,
-}
-
-export const noData: BackendMessage = {
-  name: 'noData',
-  length: 5,
-}
-
-export const portalSuspended: BackendMessage = {
-  name: 'portalSuspended',
-  length: 5,
-}
-
-export const replicationStart: BackendMessage = {
-  name: 'replicationStart',
-  length: 4,
-}
-
-export const emptyQuery: BackendMessage = {
-  name: 'emptyQuery',
-  length: 4,
-}
-
-export const copyDone: BackendMessage = {
-  name: 'copyDone',
-  length: 4,
-}
-
-interface NoticeOrError {
-  message: string | undefined
-  severity: string | undefined
-  code: string | undefined
-  detail: string | undefined
-  hint: string | undefined
-  position: string | undefined
-  internalPosition: string | undefined
-  internalQuery: string | undefined
-  where: string | undefined
-  schema: string | undefined
-  table: string | undefined
-  column: string | undefined
-  dataType: string | undefined
-  constraint: string | undefined
-  file: string | undefined
-  line: string | undefined
-  routine: string | undefined
-}
-
-export class DatabaseError extends Error implements NoticeOrError {
-  public severity: string | undefined
-  public code: string | undefined
-  public detail: string | undefined
-  public hint: string | undefined
-  public position: string | undefined
-  public internalPosition: string | undefined
-  public internalQuery: string | undefined
-  public where: string | undefined
-  public schema: string | undefined
-  public table: string | undefined
-  public column: string | undefined
-  public dataType: string | undefined
-  public constraint: string | undefined
-  public file: string | undefined
-  public line: string | undefined
-  public routine: string | undefined
-  constructor(
-    message: string,
-    public readonly length: number,
-    public readonly name: MessageName
-  ) {
-    super(message)
-  }
-}
-
-export class CopyDataMessage {
-  public readonly name = 'copyData'
-  constructor(
-    public readonly length: number,
-    public readonly chunk: Buffer
-  ) {}
-}
-
-export class CopyResponse {
-  public readonly columnTypes: number[]
-  constructor(
-    public readonly length: number,
-    public readonly name: MessageName,
-    public readonly binary: boolean,
-    columnCount: number
-  ) {
-    this.columnTypes = new Array(columnCount)
-  }
-}
-
-export class Field {
-  constructor(
-    public readonly name: string,
-    public readonly tableID: number,
-    public readonly columnID: number,
-    public readonly dataTypeID: number,
-    public readonly dataTypeSize: number,
-    public readonly dataTypeModifier: number,
-    public readonly format: Mode
-  ) {}
-}
-
-export class RowDescriptionMessage {
-  public readonly name: MessageName = 'rowDescription'
-  public readonly fields: Field[]
-  constructor(
-    public readonly length: number,
-    public readonly fieldCount: number
-  ) {
-    this.fields = new Array(this.fieldCount)
-  }
-}
-
-export class ParameterDescriptionMessage {
-  public readonly name: MessageName = 'parameterDescription'
-  public readonly dataTypeIDs: number[]
-  constructor(
-    public readonly length: number,
-    public readonly parameterCount: number
-  ) {
-    this.dataTypeIDs = new Array(this.parameterCount)
-  }
-}
-
-export class ParameterStatusMessage {
-  public readonly name: MessageName = 'parameterStatus'
-  constructor(
-    public readonly length: number,
-    public readonly parameterName: string,
-    public readonly parameterValue: string
-  ) {}
-}
-
-export class AuthenticationMD5Password implements BackendMessage {
-  public readonly name: MessageName = 'authenticationMD5Password'
-  constructor(
-    public readonly length: number,
-    public readonly salt: Buffer
-  ) {}
-}
-
-export class BackendKeyDataMessage {
-  public readonly name: MessageName = 'backendKeyData'
-  constructor(
-    public readonly length: number,
-    public readonly processID: number,
-    public readonly secretKey: number
-  ) {}
-}
-
-export class NotificationResponseMessage {
-  public readonly name: MessageName = 'notification'
-  constructor(
-    public readonly length: number,
-    public readonly processId: number,
-    public readonly channel: string,
-    public readonly payload: string
-  ) {}
-}
-
-export class ReadyForQueryMessage {
-  public readonly name: MessageName = 'readyForQuery'
-  constructor(
-    public readonly length: number,
-    public readonly status: string
-  ) {}
-}
-
-export class CommandCompleteMessage {
-  public readonly name: MessageName = 'commandComplete'
-  constructor(
-    public readonly length: number,
-    public readonly text: string
-  ) {}
-}
-
-export class DataRowMessage {
-  public readonly fieldCount: number
-  public readonly name: MessageName = 'dataRow'
-  constructor(
-    public length: number,
-    public fields: any[]
-  ) {
-    this.fieldCount = fields.length
-  }
-}
-
-export class NoticeMessage implements BackendMessage, NoticeOrError {
-  constructor(
-    public readonly length: number,
-    public readonly message: string | undefined
-  ) {}
-  public readonly name = 'notice'
-  public severity: string | undefined
-  public code: string | undefined
-  public detail: string | undefined
-  public hint: string | undefined
-  public position: string | undefined
-  public internalPosition: string | undefined
-  public internalQuery: string | undefined
-  public where: string | undefined
-  public schema: string | undefined
-  public table: string | undefined
-  public column: string | undefined
-  public dataType: string | undefined
-  public constraint: string | undefined
-  public file: string | undefined
-  public line: string | undefined
-  public routine: string | undefined
-}
Index: de_modules/pg-protocol/src/outbound-serializer.test.ts
===================================================================
--- node_modules/pg-protocol/src/outbound-serializer.test.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,356 +1,0 @@
-import assert from 'assert'
-import { serialize } from './serializer'
-import BufferList from './testing/buffer-list'
-
-describe('serializer', () => {
-  it('builds startup message', function () {
-    const actual = serialize.startup({
-      user: 'brian',
-      database: 'bang',
-    })
-    assert.deepEqual(
-      actual,
-      new BufferList()
-        .addInt16(3)
-        .addInt16(0)
-        .addCString('user')
-        .addCString('brian')
-        .addCString('database')
-        .addCString('bang')
-        .addCString('client_encoding')
-        .addCString('UTF8')
-        .addCString('')
-        .join(true)
-    )
-  })
-
-  it('builds password message', function () {
-    const actual = serialize.password('!')
-    assert.deepEqual(actual, new BufferList().addCString('!').join(true, 'p'))
-  })
-
-  it('builds request ssl message', function () {
-    const actual = serialize.requestSsl()
-    const expected = new BufferList().addInt32(80877103).join(true)
-    assert.deepEqual(actual, expected)
-  })
-
-  it('builds SASLInitialResponseMessage message', function () {
-    const actual = serialize.sendSASLInitialResponseMessage('mech', 'data')
-    assert.deepEqual(actual, new BufferList().addCString('mech').addInt32(4).addString('data').join(true, 'p'))
-  })
-
-  it('builds SCRAMClientFinalMessage message', function () {
-    const actual = serialize.sendSCRAMClientFinalMessage('data')
-    assert.deepEqual(actual, new BufferList().addString('data').join(true, 'p'))
-  })
-
-  it('builds query message', function () {
-    const txt = 'select * from boom'
-    const actual = serialize.query(txt)
-    assert.deepEqual(actual, new BufferList().addCString(txt).join(true, 'Q'))
-  })
-
-  describe('parse message', () => {
-    it('builds parse message', function () {
-      const actual = serialize.parse({ text: '!' })
-      const expected = new BufferList().addCString('').addCString('!').addInt16(0).join(true, 'P')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('builds parse message with named query', function () {
-      const actual = serialize.parse({
-        name: 'boom',
-        text: 'select * from boom',
-        types: [],
-      })
-      const expected = new BufferList().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('with multiple parameters', function () {
-      const actual = serialize.parse({
-        name: 'force',
-        text: 'select * from bang where name = $1',
-        types: [1, 2, 3, 4],
-      })
-      const expected = new BufferList()
-        .addCString('force')
-        .addCString('select * from bang where name = $1')
-        .addInt16(4)
-        .addInt32(1)
-        .addInt32(2)
-        .addInt32(3)
-        .addInt32(4)
-        .join(true, 'P')
-      assert.deepEqual(actual, expected)
-    })
-  })
-
-  describe('bind messages', function () {
-    it('with no values', function () {
-      const actual = serialize.bind()
-
-      const expectedBuffer = new BufferList()
-        .addCString('')
-        .addCString('')
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(1)
-        .addInt16(0)
-        .join(true, 'B')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-
-    it('with named statement, portal, and values', function () {
-      const actual = serialize.bind({
-        portal: 'bang',
-        statement: 'woo',
-        values: ['1', 'hi', null, 'zing'],
-      })
-      const expectedBuffer = new BufferList()
-        .addCString('bang') // portal name
-        .addCString('woo') // statement name
-        .addInt16(4)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(4)
-        .addInt32(1)
-        .add(Buffer.from('1'))
-        .addInt32(2)
-        .add(Buffer.from('hi'))
-        .addInt32(-1)
-        .addInt32(4)
-        .add(Buffer.from('zing'))
-        .addInt16(1)
-        .addInt16(0)
-        .join(true, 'B')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-
-    it('encodes a multi-byte string param with its UTF-8 byte length, not char length', function () {
-      // Guards the single-pass addInt32PrefixedString write path: the Int32
-      // length prefix must be the UTF-8 byte count, not String.length. 'héllo中🎉'
-      // is 7 code points / 8 UTF-16 code units but 13 UTF-8 bytes.
-      const value = 'héllo中🎉'
-      const bytes = Buffer.from(value, 'utf8')
-      assert.notEqual(bytes.length, value.length) // sanity: the divergence we're testing
-      const actual = serialize.bind({ values: [value] })
-      const expectedBuffer = new BufferList()
-        .addCString('') // portal
-        .addCString('') // statement
-        .addInt16(1) // param format code count
-        .addInt16(0) // format code for the one value (text)
-        .addInt16(1) // value count
-        .addInt32(bytes.length) // 13 — the UTF-8 byte length, NOT value.length (8)
-        .add(bytes)
-        .addInt16(1) // result format code count
-        .addInt16(0) // result format (text)
-        .join(true, 'B')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-  })
-
-  it('with custom valueMapper', function () {
-    const actual = serialize.bind({
-      portal: 'bang',
-      statement: 'woo',
-      values: ['1', 'hi', null, 'zing'],
-      valueMapper: () => null,
-    })
-    const expectedBuffer = new BufferList()
-      .addCString('bang') // portal name
-      .addCString('woo') // statement name
-      .addInt16(4)
-      .addInt16(0)
-      .addInt16(0)
-      .addInt16(0)
-      .addInt16(0)
-      .addInt16(4)
-      .addInt32(-1)
-      .addInt32(-1)
-      .addInt32(-1)
-      .addInt32(-1)
-      .addInt16(1)
-      .addInt16(0)
-      .join(true, 'B')
-    assert.deepEqual(actual, expectedBuffer)
-  })
-
-  it('with named statement, portal, and buffer value', function () {
-    const actual = serialize.bind({
-      portal: 'bang',
-      statement: 'woo',
-      values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
-    })
-    const expectedBuffer = new BufferList()
-      .addCString('bang') // portal name
-      .addCString('woo') // statement name
-      .addInt16(4) // value count
-      .addInt16(0) // string
-      .addInt16(0) // string
-      .addInt16(0) // string
-      .addInt16(1) // binary
-      .addInt16(4)
-      .addInt32(1)
-      .add(Buffer.from('1'))
-      .addInt32(2)
-      .add(Buffer.from('hi'))
-      .addInt32(-1)
-      .addInt32(4)
-      .add(Buffer.from('zing', 'utf-8'))
-      .addInt16(1)
-      .addInt16(0)
-      .join(true, 'B')
-    assert.deepEqual(actual, expectedBuffer)
-  })
-
-  describe('builds execute message', function () {
-    it('for unamed portal with no row limit', function () {
-      const actual = serialize.execute()
-      const expectedBuffer = new BufferList().addCString('').addInt32(0).join(true, 'E')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-
-    it('for named portal with row limit', function () {
-      const actual = serialize.execute({
-        portal: 'my favorite portal',
-        rows: 100,
-      })
-      const expectedBuffer = new BufferList().addCString('my favorite portal').addInt32(100).join(true, 'E')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-  })
-
-  it('builds flush command', function () {
-    const actual = serialize.flush()
-    const expected = new BufferList().join(true, 'H')
-    assert.deepEqual(actual, expected)
-  })
-
-  it('builds sync command', function () {
-    const actual = serialize.sync()
-    const expected = new BufferList().join(true, 'S')
-    assert.deepEqual(actual, expected)
-  })
-
-  it('builds end command', function () {
-    const actual = serialize.end()
-    const expected = Buffer.from([0x58, 0, 0, 0, 4])
-    assert.deepEqual(actual, expected)
-  })
-
-  describe('builds describe command', function () {
-    it('describe statement', function () {
-      const actual = serialize.describe({ type: 'S', name: 'bang' })
-      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'D')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('describe unnamed portal', function () {
-      const actual = serialize.describe({ type: 'P' })
-      const expected = new BufferList().addChar('P').addCString('').join(true, 'D')
-      assert.deepEqual(actual, expected)
-    })
-  })
-
-  describe('builds close command', function () {
-    it('describe statement', function () {
-      const actual = serialize.close({ type: 'S', name: 'bang' })
-      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'C')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('describe unnamed portal', function () {
-      const actual = serialize.close({ type: 'P' })
-      const expected = new BufferList().addChar('P').addCString('').join(true, 'C')
-      assert.deepEqual(actual, expected)
-    })
-  })
-
-  describe('copy messages', function () {
-    it('builds copyFromChunk', () => {
-      const actual = serialize.copyData(Buffer.from([1, 2, 3]))
-      const expected = new BufferList().add(Buffer.from([1, 2, 3])).join(true, 'd')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('builds copy fail', () => {
-      const actual = serialize.copyFail('err!')
-      const expected = new BufferList().addCString('err!').join(true, 'f')
-      assert.deepEqual(actual, expected)
-    })
-
-    it('builds copy done', () => {
-      const actual = serialize.copyDone()
-      const expected = new BufferList().join(true, 'c')
-      assert.deepEqual(actual, expected)
-    })
-  })
-
-  it('builds cancel message', () => {
-    const actual = serialize.cancel(3, 4)
-    const expected = new BufferList().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true)
-    assert.deepEqual(actual, expected)
-  })
-
-  describe('bind error recovery', () => {
-    const throwingMapper = () => {
-      throw new Error('valueMapper error')
-    }
-
-    it('produces correct bind output after a valueMapper exception', () => {
-      assert.throws(() => {
-        serialize.bind({
-          values: ['fail'],
-          valueMapper: throwingMapper,
-        })
-      }, /valueMapper error/)
-
-      const actual = serialize.bind({
-        portal: 'bang',
-        statement: 'woo',
-        values: ['1', 'hi', null, 'zing'],
-      })
-      const expectedBuffer = new BufferList()
-        .addCString('bang')
-        .addCString('woo')
-        .addInt16(4)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(0)
-        .addInt16(4)
-        .addInt32(1)
-        .add(Buffer.from('1'))
-        .addInt32(2)
-        .add(Buffer.from('hi'))
-        .addInt32(-1)
-        .addInt32(4)
-        .add(Buffer.from('zing'))
-        .addInt16(1)
-        .addInt16(0)
-        .join(true, 'B')
-      assert.deepEqual(actual, expectedBuffer)
-    })
-
-    it('produces correct output from other serializer methods after a failed bind', () => {
-      assert.throws(() => {
-        serialize.bind({
-          values: ['fail'],
-          valueMapper: throwingMapper,
-        })
-      }, /valueMapper error/)
-
-      const parseActual = serialize.parse({ text: '!' })
-      const parseExpected = new BufferList().addCString('').addCString('!').addInt16(0).join(true, 'P')
-      assert.deepEqual(parseActual, parseExpected)
-
-      const queryActual = serialize.query('select 1')
-      const queryExpected = new BufferList().addCString('select 1').join(true, 'Q')
-      assert.deepEqual(queryActual, queryExpected)
-    })
-  })
-})
Index: de_modules/pg-protocol/src/parser.ts
===================================================================
--- node_modules/pg-protocol/src/parser.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,414 +1,0 @@
-import { TransformOptions } from 'stream'
-import {
-  Mode,
-  bindComplete,
-  parseComplete,
-  closeComplete,
-  noData,
-  portalSuspended,
-  copyDone,
-  replicationStart,
-  emptyQuery,
-  ReadyForQueryMessage,
-  CommandCompleteMessage,
-  CopyDataMessage,
-  CopyResponse,
-  NotificationResponseMessage,
-  RowDescriptionMessage,
-  ParameterDescriptionMessage,
-  Field,
-  DataRowMessage,
-  ParameterStatusMessage,
-  BackendKeyDataMessage,
-  DatabaseError,
-  BackendMessage,
-  MessageName,
-  AuthenticationMD5Password,
-  NoticeMessage,
-} from './messages'
-import { BufferReader } from './buffer-reader'
-
-// every message is prefixed with a single byte
-const CODE_LENGTH = 1
-// every message has an int32 length which includes itself but does
-// NOT include the code in the length
-const LEN_LENGTH = 4
-
-const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH
-
-// A placeholder for a `BackendMessage`’s length value that will be set after construction.
-const LATEINIT_LENGTH = -1
-
-export type Packet = {
-  code: number
-  packet: Buffer
-}
-
-const emptyBuffer = Buffer.allocUnsafe(0)
-
-type StreamOptions = TransformOptions & {
-  mode: Mode
-}
-
-const enum MessageCodes {
-  DataRow = 0x44, // D
-  ParseComplete = 0x31, // 1
-  BindComplete = 0x32, // 2
-  CloseComplete = 0x33, // 3
-  CommandComplete = 0x43, // C
-  ReadyForQuery = 0x5a, // Z
-  NoData = 0x6e, // n
-  NotificationResponse = 0x41, // A
-  AuthenticationResponse = 0x52, // R
-  ParameterStatus = 0x53, // S
-  BackendKeyData = 0x4b, // K
-  ErrorMessage = 0x45, // E
-  NoticeMessage = 0x4e, // N
-  RowDescriptionMessage = 0x54, // T
-  ParameterDescriptionMessage = 0x74, // t
-  PortalSuspended = 0x73, // s
-  ReplicationStart = 0x57, // W
-  EmptyQuery = 0x49, // I
-  CopyIn = 0x47, // G
-  CopyOut = 0x48, // H
-  CopyDone = 0x63, // c
-  CopyData = 0x64, // d
-}
-
-export type MessageCallback = (msg: BackendMessage) => void
-
-export class Parser {
-  private buffer: Buffer = emptyBuffer
-  private bufferLength: number = 0
-  private bufferOffset: number = 0
-  private reader = new BufferReader()
-  private mode: Mode
-
-  constructor(opts?: StreamOptions) {
-    if (opts?.mode === 'binary') {
-      throw new Error('Binary mode not supported yet')
-    }
-    this.mode = opts?.mode || 'text'
-  }
-
-  public parse(buffer: Buffer, callback: MessageCallback) {
-    this.mergeBuffer(buffer)
-    const bufferFullLength = this.bufferOffset + this.bufferLength
-    let offset = this.bufferOffset
-    while (offset + HEADER_LENGTH <= bufferFullLength) {
-      // code is 1 byte long - it identifies the message type
-      const code = this.buffer[offset]
-      // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
-      const length = this.buffer.readUInt32BE(offset + CODE_LENGTH)
-      const fullMessageLength = CODE_LENGTH + length
-      if (fullMessageLength + offset <= bufferFullLength) {
-        const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer)
-        callback(message)
-        offset += fullMessageLength
-      } else {
-        break
-      }
-    }
-    if (offset === bufferFullLength) {
-      // No more use for the buffer
-      this.buffer = emptyBuffer
-      this.bufferLength = 0
-      this.bufferOffset = 0
-    } else {
-      // Adjust the cursors of remainingBuffer
-      this.bufferLength = bufferFullLength - offset
-      this.bufferOffset = offset
-    }
-  }
-
-  private mergeBuffer(buffer: Buffer): void {
-    if (this.bufferLength > 0) {
-      const newLength = this.bufferLength + buffer.byteLength
-      const newFullLength = newLength + this.bufferOffset
-      if (newFullLength > this.buffer.byteLength) {
-        // We can't concat the new buffer with the remaining one
-        let newBuffer: Buffer
-        if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
-          // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
-          newBuffer = this.buffer
-        } else {
-          // Allocate a new larger buffer
-          let newBufferLength = this.buffer.byteLength * 2
-          while (newLength >= newBufferLength) {
-            newBufferLength *= 2
-          }
-          newBuffer = Buffer.allocUnsafe(newBufferLength)
-        }
-        // Move the remaining buffer to the new one
-        this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength)
-        this.buffer = newBuffer
-        this.bufferOffset = 0
-      }
-      // Concat the new buffer with the remaining one
-      buffer.copy(this.buffer, this.bufferOffset + this.bufferLength)
-      this.bufferLength = newLength
-    } else {
-      this.buffer = buffer
-      this.bufferOffset = 0
-      this.bufferLength = buffer.byteLength
-    }
-  }
-
-  private handlePacket(offset: number, code: number, length: number, bytes: Buffer): BackendMessage {
-    const { reader } = this
-
-    // NOTE: This undesirably retains the buffer in `this.reader` if the `parse*Message` calls below throw. However, those should only throw in the case of a protocol error, which normally results in the reader being discarded.
-    reader.setBuffer(offset, bytes)
-
-    let message: BackendMessage
-
-    switch (code) {
-      case MessageCodes.BindComplete:
-        message = bindComplete
-        break
-      case MessageCodes.ParseComplete:
-        message = parseComplete
-        break
-      case MessageCodes.CloseComplete:
-        message = closeComplete
-        break
-      case MessageCodes.NoData:
-        message = noData
-        break
-      case MessageCodes.PortalSuspended:
-        message = portalSuspended
-        break
-      case MessageCodes.CopyDone:
-        message = copyDone
-        break
-      case MessageCodes.ReplicationStart:
-        message = replicationStart
-        break
-      case MessageCodes.EmptyQuery:
-        message = emptyQuery
-        break
-      case MessageCodes.DataRow:
-        message = parseDataRowMessage(reader)
-        break
-      case MessageCodes.CommandComplete:
-        message = parseCommandCompleteMessage(reader)
-        break
-      case MessageCodes.ReadyForQuery:
-        message = parseReadyForQueryMessage(reader)
-        break
-      case MessageCodes.NotificationResponse:
-        message = parseNotificationMessage(reader)
-        break
-      case MessageCodes.AuthenticationResponse:
-        message = parseAuthenticationResponse(reader, length)
-        break
-      case MessageCodes.ParameterStatus:
-        message = parseParameterStatusMessage(reader)
-        break
-      case MessageCodes.BackendKeyData:
-        message = parseBackendKeyData(reader)
-        break
-      case MessageCodes.ErrorMessage:
-        message = parseErrorMessage(reader, 'error')
-        break
-      case MessageCodes.NoticeMessage:
-        message = parseErrorMessage(reader, 'notice')
-        break
-      case MessageCodes.RowDescriptionMessage:
-        message = parseRowDescriptionMessage(reader)
-        break
-      case MessageCodes.ParameterDescriptionMessage:
-        message = parseParameterDescriptionMessage(reader)
-        break
-      case MessageCodes.CopyIn:
-        message = parseCopyInMessage(reader)
-        break
-      case MessageCodes.CopyOut:
-        message = parseCopyOutMessage(reader)
-        break
-      case MessageCodes.CopyData:
-        message = parseCopyData(reader, length)
-        break
-      default:
-        return new DatabaseError('received invalid response: ' + code.toString(16), length, 'error')
-    }
-
-    reader.setBuffer(0, emptyBuffer)
-
-    message.length = length
-    return message
-  }
-}
-
-const parseReadyForQueryMessage = (reader: BufferReader) => {
-  const status = reader.string(1)
-  return new ReadyForQueryMessage(LATEINIT_LENGTH, status)
-}
-
-const parseCommandCompleteMessage = (reader: BufferReader) => {
-  const text = reader.cstring()
-  return new CommandCompleteMessage(LATEINIT_LENGTH, text)
-}
-
-const parseCopyData = (reader: BufferReader, length: number) => {
-  const chunk = reader.bytes(length - 4)
-  return new CopyDataMessage(LATEINIT_LENGTH, chunk)
-}
-
-const parseCopyInMessage = (reader: BufferReader) => parseCopyMessage(reader, 'copyInResponse')
-
-const parseCopyOutMessage = (reader: BufferReader) => parseCopyMessage(reader, 'copyOutResponse')
-
-const parseCopyMessage = (reader: BufferReader, messageName: MessageName) => {
-  const isBinary = reader.byte() !== 0
-  const columnCount = reader.int16()
-  const message = new CopyResponse(LATEINIT_LENGTH, messageName, isBinary, columnCount)
-  for (let i = 0; i < columnCount; i++) {
-    message.columnTypes[i] = reader.int16()
-  }
-  return message
-}
-
-const parseNotificationMessage = (reader: BufferReader) => {
-  const processId = reader.int32()
-  const channel = reader.cstring()
-  const payload = reader.cstring()
-  return new NotificationResponseMessage(LATEINIT_LENGTH, processId, channel, payload)
-}
-
-const parseRowDescriptionMessage = (reader: BufferReader) => {
-  const fieldCount = reader.int16()
-  const message = new RowDescriptionMessage(LATEINIT_LENGTH, fieldCount)
-  for (let i = 0; i < fieldCount; i++) {
-    message.fields[i] = parseField(reader)
-  }
-  return message
-}
-
-const parseField = (reader: BufferReader) => {
-  const name = reader.cstring()
-  const tableID = reader.uint32()
-  const columnID = reader.int16()
-  const dataTypeID = reader.uint32()
-  const dataTypeSize = reader.int16()
-  const dataTypeModifier = reader.int32()
-  const mode = reader.int16() === 0 ? 'text' : 'binary'
-  return new Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode)
-}
-
-const parseParameterDescriptionMessage = (reader: BufferReader) => {
-  const parameterCount = reader.int16()
-  const message = new ParameterDescriptionMessage(LATEINIT_LENGTH, parameterCount)
-  for (let i = 0; i < parameterCount; i++) {
-    // OIDs are unsigned, same as dataTypeID in parseField above
-    message.dataTypeIDs[i] = reader.uint32()
-  }
-  return message
-}
-
-const parseDataRowMessage = (reader: BufferReader) => {
-  const fieldCount = reader.int16()
-  const fields: any[] = new Array(fieldCount)
-  for (let i = 0; i < fieldCount; i++) {
-    const len = reader.int32()
-    // a -1 for length means the value of the field is null
-    fields[i] = len === -1 ? null : reader.string(len)
-  }
-  return new DataRowMessage(LATEINIT_LENGTH, fields)
-}
-
-const parseParameterStatusMessage = (reader: BufferReader) => {
-  const name = reader.cstring()
-  const value = reader.cstring()
-  return new ParameterStatusMessage(LATEINIT_LENGTH, name, value)
-}
-
-const parseBackendKeyData = (reader: BufferReader) => {
-  const processID = reader.int32()
-  const secretKey = reader.int32()
-  return new BackendKeyDataMessage(LATEINIT_LENGTH, processID, secretKey)
-}
-
-const parseAuthenticationResponse = (reader: BufferReader, length: number) => {
-  const code = reader.int32()
-  // TODO(bmc): maybe better types here
-  const message: BackendMessage & any = {
-    name: 'authenticationOk',
-    length,
-  }
-
-  switch (code) {
-    case 0: // AuthenticationOk
-      break
-    case 3: // AuthenticationCleartextPassword
-      if (message.length === 8) {
-        message.name = 'authenticationCleartextPassword'
-      }
-      break
-    case 5: // AuthenticationMD5Password
-      if (message.length === 12) {
-        message.name = 'authenticationMD5Password'
-        const salt = reader.bytes(4)
-        return new AuthenticationMD5Password(LATEINIT_LENGTH, salt)
-      }
-      break
-    case 10: // AuthenticationSASL
-      {
-        message.name = 'authenticationSASL'
-        message.mechanisms = []
-        let mechanism: string
-        do {
-          mechanism = reader.cstring()
-          if (mechanism) {
-            message.mechanisms.push(mechanism)
-          }
-        } while (mechanism)
-      }
-      break
-    case 11: // AuthenticationSASLContinue
-      message.name = 'authenticationSASLContinue'
-      message.data = reader.string(length - 8)
-      break
-    case 12: // AuthenticationSASLFinal
-      message.name = 'authenticationSASLFinal'
-      message.data = reader.string(length - 8)
-      break
-    default:
-      throw new Error('Unknown authenticationOk message type ' + code)
-  }
-  return message
-}
-
-const parseErrorMessage = (reader: BufferReader, name: MessageName) => {
-  const fields: Record<string, string> = {}
-  let fieldType = reader.string(1)
-  while (fieldType !== '\0') {
-    fields[fieldType] = reader.cstring()
-    fieldType = reader.string(1)
-  }
-
-  const messageValue = fields.M
-
-  const message =
-    name === 'notice'
-      ? new NoticeMessage(LATEINIT_LENGTH, messageValue)
-      : new DatabaseError(messageValue, LATEINIT_LENGTH, name)
-
-  message.severity = fields.S
-  message.code = fields.C
-  message.detail = fields.D
-  message.hint = fields.H
-  message.position = fields.P
-  message.internalPosition = fields.p
-  message.internalQuery = fields.q
-  message.where = fields.W
-  message.schema = fields.s
-  message.table = fields.t
-  message.column = fields.c
-  message.dataType = fields.d
-  message.constraint = fields.n
-  message.file = fields.F
-  message.line = fields.L
-  message.routine = fields.R
-  return message
-}
Index: de_modules/pg-protocol/src/serializer.ts
===================================================================
--- node_modules/pg-protocol/src/serializer.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,280 +1,0 @@
-import { Writer } from './buffer-writer'
-
-const enum code {
-  startup = 0x70,
-  query = 0x51,
-  parse = 0x50,
-  bind = 0x42,
-  execute = 0x45,
-  flush = 0x48,
-  sync = 0x53,
-  end = 0x58,
-  close = 0x43,
-  describe = 0x44,
-  copyFromChunk = 0x64,
-  copyDone = 0x63,
-  copyFail = 0x66,
-}
-
-const writer = new Writer()
-
-const startup = (opts: Record<string, string>): Buffer => {
-  // protocol version
-  writer.addInt16(3).addInt16(0)
-  for (const key of Object.keys(opts)) {
-    writer.addCString(key).addCString(opts[key])
-  }
-
-  writer.addCString('client_encoding').addCString('UTF8')
-
-  const bodyBuffer = writer.addCString('').flush()
-  // this message is sent without a code
-
-  const length = bodyBuffer.length + 4
-
-  return new Writer().addInt32(length).add(bodyBuffer).flush()
-}
-
-const requestSsl = (): Buffer => {
-  const response = Buffer.allocUnsafe(8)
-  response.writeInt32BE(8, 0)
-  response.writeInt32BE(80877103, 4)
-  return response
-}
-
-const password = (password: string): Buffer => {
-  return writer.addCString(password).flush(code.startup)
-}
-
-const sendSASLInitialResponseMessage = function (mechanism: string, initialResponse: string): Buffer {
-  // 0x70 = 'p'
-  writer.addCString(mechanism).addInt32PrefixedString(initialResponse)
-
-  return writer.flush(code.startup)
-}
-
-const sendSCRAMClientFinalMessage = function (additionalData: string): Buffer {
-  return writer.addString(additionalData).flush(code.startup)
-}
-
-const query = (text: string): Buffer => {
-  return writer.addCString(text).flush(code.query)
-}
-
-type ParseOpts = {
-  name?: string
-  types?: number[]
-  text: string
-}
-
-const emptyArray: any[] = []
-
-const parse = (query: ParseOpts): Buffer => {
-  // expect something like this:
-  // { name: 'queryName',
-  //   text: 'select * from blah',
-  //   types: ['int8', 'bool'] }
-
-  // normalize missing query names to allow for null
-  const name = query.name || ''
-  if (name.length > 63) {
-    console.error('Warning! Postgres only supports 63 characters for query names.')
-    console.error('You supplied %s (%s)', name, name.length)
-    console.error('This can cause conflicts and silent errors executing queries')
-  }
-
-  const types = query.types || emptyArray
-
-  const len = types.length
-
-  const buffer = writer
-    .addCString(name) // name of query
-    .addCString(query.text) // actual query text
-    .addInt16(len)
-
-  for (let i = 0; i < len; i++) {
-    buffer.addInt32(types[i])
-  }
-
-  return writer.flush(code.parse)
-}
-
-type ValueMapper = (param: any, index: number) => any
-
-type BindOpts = {
-  portal?: string
-  binary?: boolean
-  statement?: string
-  values?: any[]
-  // optional map from JS value to postgres value per parameter
-  valueMapper?: ValueMapper
-}
-
-const paramWriter = new Writer()
-
-// make this a const enum so typescript will inline the value
-const enum ParamType {
-  STRING = 0,
-  BINARY = 1,
-}
-
-const writeValues = function (values: any[], valueMapper?: ValueMapper): void {
-  for (let i = 0; i < values.length; i++) {
-    const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i]
-    if (mappedVal == null) {
-      // add the param type (string) to the writer
-      writer.addInt16(ParamType.STRING)
-      // write -1 to the param writer to indicate null
-      paramWriter.addInt32(-1)
-    } else if (mappedVal instanceof Buffer) {
-      // add the param type (binary) to the writer
-      writer.addInt16(ParamType.BINARY)
-      // add the buffer to the param writer
-      paramWriter.addInt32(mappedVal.length)
-      paramWriter.add(mappedVal)
-    } else {
-      // add the param type (string) to the writer
-      writer.addInt16(ParamType.STRING)
-      // length prefix + UTF-8 bytes in one pass (Buffer.byteLength computed once)
-      paramWriter.addInt32PrefixedString(mappedVal)
-    }
-  }
-}
-
-const bind = (config: BindOpts = {}): Buffer => {
-  // normalize config
-  const portal = config.portal || ''
-  const statement = config.statement || ''
-  const binary = config.binary || false
-  const values = config.values || emptyArray
-  const len = values.length
-
-  writer.addCString(portal).addCString(statement)
-  writer.addInt16(len)
-
-  try {
-    writeValues(values, config.valueMapper)
-  } catch (err) {
-    writer.clear()
-    paramWriter.clear()
-    throw err
-  }
-
-  writer.addInt16(len)
-  writer.add(paramWriter.flush())
-
-  // all results use the same format code
-  writer.addInt16(1)
-  // format code
-  writer.addInt16(binary ? ParamType.BINARY : ParamType.STRING)
-  return writer.flush(code.bind)
-}
-
-type ExecOpts = {
-  portal?: string
-  rows?: number
-}
-
-const emptyExecute = Buffer.from([code.execute, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00])
-
-const execute = (config?: ExecOpts): Buffer => {
-  // this is the happy path for most queries
-  if (!config || (!config.portal && !config.rows)) {
-    return emptyExecute
-  }
-
-  const portal = config.portal || ''
-  const rows = config.rows || 0
-
-  const portalLength = Buffer.byteLength(portal)
-  const len = 4 + portalLength + 1 + 4
-  // one extra bit for code
-  const buff = Buffer.allocUnsafe(1 + len)
-  buff[0] = code.execute
-  buff.writeInt32BE(len, 1)
-  buff.write(portal, 5, 'utf-8')
-  buff[portalLength + 5] = 0 // null terminate portal cString
-  buff.writeUInt32BE(rows, buff.length - 4)
-  return buff
-}
-
-const cancel = (processID: number, secretKey: number): Buffer => {
-  const buffer = Buffer.allocUnsafe(16)
-  buffer.writeInt32BE(16, 0)
-  buffer.writeInt16BE(1234, 4)
-  buffer.writeInt16BE(5678, 6)
-  buffer.writeInt32BE(processID, 8)
-  buffer.writeInt32BE(secretKey, 12)
-  return buffer
-}
-
-type PortalOpts = {
-  type: 'S' | 'P'
-  name?: string
-}
-
-const cstringMessage = (code: code, string: string): Buffer => {
-  const stringLen = Buffer.byteLength(string)
-  const len = 4 + stringLen + 1
-  // one extra bit for code
-  const buffer = Buffer.allocUnsafe(1 + len)
-  buffer[0] = code
-  buffer.writeInt32BE(len, 1)
-  buffer.write(string, 5, 'utf-8')
-  buffer[len] = 0 // null terminate cString
-  return buffer
-}
-
-const emptyDescribePortal = writer.addCString('P').flush(code.describe)
-const emptyDescribeStatement = writer.addCString('S').flush(code.describe)
-
-const describe = (msg: PortalOpts): Buffer => {
-  return msg.name
-    ? cstringMessage(code.describe, `${msg.type}${msg.name || ''}`)
-    : msg.type === 'P'
-    ? emptyDescribePortal
-    : emptyDescribeStatement
-}
-
-const close = (msg: PortalOpts): Buffer => {
-  const text = `${msg.type}${msg.name || ''}`
-  return cstringMessage(code.close, text)
-}
-
-const copyData = (chunk: Buffer): Buffer => {
-  return writer.add(chunk).flush(code.copyFromChunk)
-}
-
-const copyFail = (message: string): Buffer => {
-  return cstringMessage(code.copyFail, message)
-}
-
-const codeOnlyBuffer = (code: code): Buffer => Buffer.from([code, 0x00, 0x00, 0x00, 0x04])
-
-const flushBuffer = codeOnlyBuffer(code.flush)
-const syncBuffer = codeOnlyBuffer(code.sync)
-const endBuffer = codeOnlyBuffer(code.end)
-const copyDoneBuffer = codeOnlyBuffer(code.copyDone)
-
-const serialize = {
-  startup,
-  password,
-  requestSsl,
-  sendSASLInitialResponseMessage,
-  sendSCRAMClientFinalMessage,
-  query,
-  parse,
-  bind,
-  execute,
-  describe,
-  close,
-  flush: () => flushBuffer,
-  sync: () => syncBuffer,
-  end: () => endBuffer,
-  copyData,
-  copyDone: () => copyDoneBuffer,
-  copyFail,
-  cancel,
-}
-
-export { serialize }
Index: de_modules/pg-protocol/src/testing/buffer-list.ts
===================================================================
--- node_modules/pg-protocol/src/testing/buffer-list.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,67 +1,0 @@
-export default class BufferList {
-  constructor(public buffers: Buffer[] = []) {}
-
-  public add(buffer: Buffer, front?: boolean) {
-    this.buffers[front ? 'unshift' : 'push'](buffer)
-    return this
-  }
-
-  public addInt16(val: number, front?: boolean) {
-    return this.add(Buffer.from([val >>> 8, val >>> 0]), front)
-  }
-
-  public getByteLength() {
-    return this.buffers.reduce(function (previous, current) {
-      return previous + current.length
-    }, 0)
-  }
-
-  public addInt32(val: number, first?: boolean) {
-    return this.add(
-      Buffer.from([(val >>> 24) & 0xff, (val >>> 16) & 0xff, (val >>> 8) & 0xff, (val >>> 0) & 0xff]),
-      first
-    )
-  }
-
-  public addCString(val: string, front?: boolean) {
-    const len = Buffer.byteLength(val)
-    const buffer = Buffer.alloc(len + 1)
-    buffer.write(val)
-    buffer[len] = 0
-    return this.add(buffer, front)
-  }
-
-  public addString(val: string, front?: boolean) {
-    const len = Buffer.byteLength(val)
-    const buffer = Buffer.alloc(len)
-    buffer.write(val)
-    return this.add(buffer, front)
-  }
-
-  public addChar(char: string, first?: boolean) {
-    return this.add(Buffer.from(char, 'utf8'), first)
-  }
-
-  public addByte(byte: number) {
-    return this.add(Buffer.from([byte]))
-  }
-
-  public join(appendLength?: boolean, char?: string): Buffer {
-    let length = this.getByteLength()
-    if (appendLength) {
-      this.addInt32(length + 4, true)
-      return this.join(false, char)
-    }
-    if (char) {
-      this.addChar(char, true)
-      length++
-    }
-    const result = Buffer.alloc(length)
-    let index = 0
-    this.buffers.forEach(function (buffer) {
-      buffer.copy(result, index, 0)
-      index += buffer.length
-    })
-    return result
-  }
-}
Index: de_modules/pg-protocol/src/testing/test-buffers.ts
===================================================================
--- node_modules/pg-protocol/src/testing/test-buffers.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,166 +1,0 @@
-// https://www.postgresql.org/docs/current/protocol-message-formats.html
-import BufferList from './buffer-list'
-
-const buffers = {
-  readyForQuery: function () {
-    return new BufferList().add(Buffer.from('I')).join(true, 'Z')
-  },
-
-  authenticationOk: function () {
-    return new BufferList().addInt32(0).join(true, 'R')
-  },
-
-  authenticationCleartextPassword: function () {
-    return new BufferList().addInt32(3).join(true, 'R')
-  },
-
-  authenticationMD5Password: function () {
-    return new BufferList()
-      .addInt32(5)
-      .add(Buffer.from([1, 2, 3, 4]))
-      .join(true, 'R')
-  },
-
-  authenticationSASL: function () {
-    return new BufferList().addInt32(10).addCString('SCRAM-SHA-256').addCString('').join(true, 'R')
-  },
-
-  authenticationSASLContinue: function () {
-    return new BufferList().addInt32(11).addString('data').join(true, 'R')
-  },
-
-  authenticationSASLFinal: function () {
-    return new BufferList().addInt32(12).addString('data').join(true, 'R')
-  },
-
-  parameterStatus: function (name: string, value: string) {
-    return new BufferList().addCString(name).addCString(value).join(true, 'S')
-  },
-
-  backendKeyData: function (processID: number, secretKey: number) {
-    return new BufferList().addInt32(processID).addInt32(secretKey).join(true, 'K')
-  },
-
-  commandComplete: function (string: string) {
-    return new BufferList().addCString(string).join(true, 'C')
-  },
-
-  rowDescription: function (fields: any[]) {
-    fields = fields || []
-    const buf = new BufferList()
-    buf.addInt16(fields.length)
-    fields.forEach(function (field) {
-      buf
-        .addCString(field.name)
-        .addInt32(field.tableID || 0)
-        .addInt16(field.attributeNumber || 0)
-        .addInt32(field.dataTypeID || 0)
-        .addInt16(field.dataTypeSize || 0)
-        .addInt32(field.typeModifier || 0)
-        .addInt16(field.formatCode || 0)
-    })
-    return buf.join(true, 'T')
-  },
-
-  parameterDescription: function (dataTypeIDs: number[]) {
-    dataTypeIDs = dataTypeIDs || []
-    const buf = new BufferList()
-    buf.addInt16(dataTypeIDs.length)
-    dataTypeIDs.forEach(function (dataTypeID) {
-      buf.addInt32(dataTypeID)
-    })
-    return buf.join(true, 't')
-  },
-
-  dataRow: function (columns: any[]) {
-    columns = columns || []
-    const buf = new BufferList()
-    buf.addInt16(columns.length)
-    columns.forEach(function (col) {
-      if (col == null) {
-        buf.addInt32(-1)
-      } else {
-        const strBuf = Buffer.from(col, 'utf8')
-        buf.addInt32(strBuf.length)
-        buf.add(strBuf)
-      }
-    })
-    return buf.join(true, 'D')
-  },
-
-  error: function (fields: any) {
-    return buffers.errorOrNotice(fields).join(true, 'E')
-  },
-
-  notice: function (fields: any) {
-    return buffers.errorOrNotice(fields).join(true, 'N')
-  },
-
-  errorOrNotice: function (fields: any) {
-    fields = fields || []
-    const buf = new BufferList()
-    fields.forEach(function (field: any) {
-      buf.addChar(field.type)
-      buf.addCString(field.value)
-    })
-    return buf.add(Buffer.from([0])) // terminator
-  },
-
-  parseComplete: function () {
-    return new BufferList().join(true, '1')
-  },
-
-  bindComplete: function () {
-    return new BufferList().join(true, '2')
-  },
-
-  notification: function (id: number, channel: string, payload: string) {
-    return new BufferList().addInt32(id).addCString(channel).addCString(payload).join(true, 'A')
-  },
-
-  emptyQuery: function () {
-    return new BufferList().join(true, 'I')
-  },
-
-  portalSuspended: function () {
-    return new BufferList().join(true, 's')
-  },
-
-  closeComplete: function () {
-    return new BufferList().join(true, '3')
-  },
-
-  copyIn: function (cols: number) {
-    const list = new BufferList()
-      // text mode
-      .addByte(0)
-      // column count
-      .addInt16(cols)
-    for (let i = 0; i < cols; i++) {
-      list.addInt16(i)
-    }
-    return list.join(true, 'G')
-  },
-
-  copyOut: function (cols: number) {
-    const list = new BufferList()
-      // text mode
-      .addByte(0)
-      // column count
-      .addInt16(cols)
-    for (let i = 0; i < cols; i++) {
-      list.addInt16(i)
-    }
-    return list.join(true, 'H')
-  },
-
-  copyData: function (bytes: Buffer) {
-    return new BufferList().add(bytes).join(true, 'd')
-  },
-
-  copyDone: function () {
-    return new BufferList().join(true, 'c')
-  },
-}
-
-export default buffers
Index: de_modules/pg-types/.travis.yml
===================================================================
--- node_modules/pg-types/.travis.yml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-language: node_js
-node_js:
-  - '4'
-  - 'lts/*'
-  - 'node'
-env:
-  - PGUSER=postgres
Index: de_modules/pg-types/Makefile
===================================================================
--- node_modules/pg-types/Makefile	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-.PHONY: publish-patch test
-
-test:
-	npm test
-
-patch: test
-	npm version patch -m "Bump version"
-	git push origin master --tags
-	npm publish
-
-minor: test
-	npm version minor -m "Bump version"
-	git push origin master --tags
-	npm publish
Index: de_modules/pg-types/README.md
===================================================================
--- node_modules/pg-types/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,75 +1,0 @@
-# pg-types
-
-This is the code that turns all the raw text from postgres into JavaScript types for [node-postgres](https://github.com/brianc/node-postgres.git)
-
-## use
-
-This module is consumed and exported from the root `pg` object of node-postgres.  To access it, do the following:
-
-```js
-var types = require('pg').types
-```
-
-Generally what you'll want to do is override how a specific data-type is parsed and turned into a JavaScript type.  By default the PostgreSQL backend server returns everything as strings.  Every data type corresponds to a unique `OID` within the server, and these `OIDs` are sent back with the query response.  So, you need to match a particluar `OID` to a function you'd like to use to take the raw text input and produce a valid JavaScript object as a result. `null` values are never parsed.
-
-Let's do something I commonly like to do on projects: return 64-bit integers `(int8)` as JavaScript integers.  Because JavaScript doesn't have support for 64-bit integers node-postgres cannot confidently parse `int8` data type results as numbers because if you have a _huge_ number it will overflow and the result you'd get back from node-postgres would not be the result in the datbase.  That would be a __very bad thing__ so node-postgres just returns `int8` results as strings and leaves the parsing up to you.  Let's say that you know you don't and wont ever have numbers greater than `int4` in your database, but you're tired of recieving results from the `COUNT(*)` function as strings (because that function returns `int8`).  You would do this:
-
-```js
-var types = require('pg').types
-types.setTypeParser(20, function(val) {
-  return parseInt(val)
-})
-```
-
-__boom__: now you get numbers instead of strings.
-
-Just as another example -- not saying this is a good idea -- let's say you want to return all dates from your database as [moment](http://momentjs.com/docs/) objects.  Okay, do this:
-
-```js
-var types = require('pg').types
-var moment = require('moment')
-var parseFn = function(val) {
-   return val === null ? null : moment(val)
-}
-types.setTypeParser(types.builtins.TIMESTAMPTZ, parseFn)
-types.setTypeParser(types.builtins.TIMESTAMP, parseFn)
-```
-_note: I've never done that with my dates, and I'm not 100% sure moment can parse all the date strings returned from postgres.  It's just an example!_
-
-If you're thinking "gee, this seems pretty handy, but how can I get a list of all the OIDs in the database and what they correspond to?!?!?!" worry not:
-
-```bash
-$ psql -c "select typname, oid, typarray from pg_type order by oid"
-```
-
-If you want to find out the OID of a specific type:
-
-```bash
-$ psql -c "select typname, oid, typarray from pg_type where typname = 'daterange' order by oid"
-```
-
-:smile:
-
-## license
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Brian M. Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/pg-types/index.d.ts
===================================================================
--- node_modules/pg-types/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,137 +1,0 @@
-export enum TypeId {
-    BOOL = 16,
-    BYTEA = 17,
-    CHAR = 18,
-    INT8 = 20,
-    INT2 = 21,
-    INT4 = 23,
-    REGPROC = 24,
-    TEXT = 25,
-    OID = 26,
-    TID = 27,
-    XID = 28,
-    CID = 29,
-    JSON = 114,
-    XML = 142,
-    PG_NODE_TREE = 194,
-    SMGR = 210,
-    PATH = 602,
-    POLYGON = 604,
-    CIDR = 650,
-    FLOAT4 = 700,
-    FLOAT8 = 701,
-    ABSTIME = 702,
-    RELTIME = 703,
-    TINTERVAL = 704,
-    CIRCLE = 718,
-    MACADDR8 = 774,
-    MONEY = 790,
-    MACADDR = 829,
-    INET = 869,
-    ACLITEM = 1033,
-    BPCHAR = 1042,
-    VARCHAR = 1043,
-    DATE = 1082,
-    TIME = 1083,
-    TIMESTAMP = 1114,
-    TIMESTAMPTZ = 1184,
-    INTERVAL = 1186,
-    TIMETZ = 1266,
-    BIT = 1560,
-    VARBIT = 1562,
-    NUMERIC = 1700,
-    REFCURSOR = 1790,
-    REGPROCEDURE = 2202,
-    REGOPER = 2203,
-    REGOPERATOR = 2204,
-    REGCLASS = 2205,
-    REGTYPE = 2206,
-    UUID = 2950,
-    TXID_SNAPSHOT = 2970,
-    PG_LSN = 3220,
-    PG_NDISTINCT = 3361,
-    PG_DEPENDENCIES = 3402,
-    TSVECTOR = 3614,
-    TSQUERY = 3615,
-    GTSVECTOR = 3642,
-    REGCONFIG = 3734,
-    REGDICTIONARY = 3769,
-    JSONB = 3802,
-    REGNAMESPACE = 4089,
-    REGROLE = 4096
-}
-
-export type builtinsTypes =
-    'BOOL' |
-    'BYTEA' |
-    'CHAR' |
-    'INT8' |
-    'INT2' |
-    'INT4' |
-    'REGPROC' |
-    'TEXT' |
-    'OID' |
-    'TID' |
-    'XID' |
-    'CID' |
-    'JSON' |
-    'XML' |
-    'PG_NODE_TREE' |
-    'SMGR' |
-    'PATH' |
-    'POLYGON' |
-    'CIDR' |
-    'FLOAT4' |
-    'FLOAT8' |
-    'ABSTIME' |
-    'RELTIME' |
-    'TINTERVAL' |
-    'CIRCLE' |
-    'MACADDR8' |
-    'MONEY' |
-    'MACADDR' |
-    'INET' |
-    'ACLITEM' |
-    'BPCHAR' |
-    'VARCHAR' |
-    'DATE' |
-    'TIME' |
-    'TIMESTAMP' |
-    'TIMESTAMPTZ' |
-    'INTERVAL' |
-    'TIMETZ' |
-    'BIT' |
-    'VARBIT' |
-    'NUMERIC' |
-    'REFCURSOR' |
-    'REGPROCEDURE' |
-    'REGOPER' |
-    'REGOPERATOR' |
-    'REGCLASS' |
-    'REGTYPE' |
-    'UUID' |
-    'TXID_SNAPSHOT' |
-    'PG_LSN' |
-    'PG_NDISTINCT' |
-    'PG_DEPENDENCIES' |
-    'TSVECTOR' |
-    'TSQUERY' |
-    'GTSVECTOR' |
-    'REGCONFIG' |
-    'REGDICTIONARY' |
-    'JSONB' |
-    'REGNAMESPACE' |
-    'REGROLE';
-
-export type TypesBuiltins = {[key in builtinsTypes]: TypeId};
-
-export type TypeFormat = 'text' | 'binary';
-
-export const builtins: TypesBuiltins;
-
-export function setTypeParser (id: TypeId, parseFn: ((value: string) => any)): void;
-export function setTypeParser (id: TypeId, format: TypeFormat, parseFn: (value: string) => any): void;
-
-export const getTypeParser: (id: TypeId, format?: TypeFormat) => any
-
-export const arrayParser: (source: string, transform: (entry: any) => any) => any[];
Index: de_modules/pg-types/index.js
===================================================================
--- node_modules/pg-types/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,47 +1,0 @@
-var textParsers = require('./lib/textParsers');
-var binaryParsers = require('./lib/binaryParsers');
-var arrayParser = require('./lib/arrayParser');
-var builtinTypes = require('./lib/builtins');
-
-exports.getTypeParser = getTypeParser;
-exports.setTypeParser = setTypeParser;
-exports.arrayParser = arrayParser;
-exports.builtins = builtinTypes;
-
-var typeParsers = {
-  text: {},
-  binary: {}
-};
-
-//the empty parse function
-function noParse (val) {
-  return String(val);
-};
-
-//returns a function used to convert a specific type (specified by
-//oid) into a result javascript type
-//note: the oid can be obtained via the following sql query:
-//SELECT oid FROM pg_type WHERE typname = 'TYPE_NAME_HERE';
-function getTypeParser (oid, format) {
-  format = format || 'text';
-  if (!typeParsers[format]) {
-    return noParse;
-  }
-  return typeParsers[format][oid] || noParse;
-};
-
-function setTypeParser (oid, format, parseFn) {
-  if(typeof format == 'function') {
-    parseFn = format;
-    format = 'text';
-  }
-  typeParsers[format][oid] = parseFn;
-};
-
-textParsers.init(function(oid, converter) {
-  typeParsers.text[oid] = converter;
-});
-
-binaryParsers.init(function(oid, converter) {
-  typeParsers.binary[oid] = converter;
-});
Index: de_modules/pg-types/index.test-d.ts
===================================================================
--- node_modules/pg-types/index.test-d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-import * as types from '.';
-import { expectType } from 'tsd';
-
-// builtins
-expectType<types.TypesBuiltins>(types.builtins);
-
-// getTypeParser
-const noParse = types.getTypeParser(types.builtins.NUMERIC, 'text');
-const numericParser = types.getTypeParser(types.builtins.NUMERIC, 'binary');
-expectType<string>(noParse('noParse'));
-expectType<number>(numericParser([200, 1, 0, 15]));
-
-// getArrayParser 
-const value = types.arrayParser('{1,2,3}', (num) => parseInt(num));
-expectType<number[]>(value);
-
-//setTypeParser
-types.setTypeParser(types.builtins.INT8, parseInt);
-types.setTypeParser(types.builtins.FLOAT8, parseFloat);
-types.setTypeParser(types.builtins.FLOAT8, 'binary', (data) => data[0]);
-types.setTypeParser(types.builtins.FLOAT8, 'text', parseFloat);
Index: de_modules/pg-types/lib/arrayParser.js
===================================================================
--- node_modules/pg-types/lib/arrayParser.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,11 +1,0 @@
-var array = require('postgres-array');
-
-module.exports = {
-  create: function (source, transform) {
-    return {
-      parse: function() {
-        return array.parse(source, transform);
-      }
-    };
-  }
-};
Index: de_modules/pg-types/lib/binaryParsers.js
===================================================================
--- node_modules/pg-types/lib/binaryParsers.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,257 +1,0 @@
-var parseInt64 = require('pg-int8');
-
-var parseBits = function(data, bits, offset, invert, callback) {
-  offset = offset || 0;
-  invert = invert || false;
-  callback = callback || function(lastValue, newValue, bits) { return (lastValue * Math.pow(2, bits)) + newValue; };
-  var offsetBytes = offset >> 3;
-
-  var inv = function(value) {
-    if (invert) {
-      return ~value & 0xff;
-    }
-
-    return value;
-  };
-
-  // read first (maybe partial) byte
-  var mask = 0xff;
-  var firstBits = 8 - (offset % 8);
-  if (bits < firstBits) {
-    mask = (0xff << (8 - bits)) & 0xff;
-    firstBits = bits;
-  }
-
-  if (offset) {
-    mask = mask >> (offset % 8);
-  }
-
-  var result = 0;
-  if ((offset % 8) + bits >= 8) {
-    result = callback(0, inv(data[offsetBytes]) & mask, firstBits);
-  }
-
-  // read bytes
-  var bytes = (bits + offset) >> 3;
-  for (var i = offsetBytes + 1; i < bytes; i++) {
-    result = callback(result, inv(data[i]), 8);
-  }
-
-  // bits to read, that are not a complete byte
-  var lastBits = (bits + offset) % 8;
-  if (lastBits > 0) {
-    result = callback(result, inv(data[bytes]) >> (8 - lastBits), lastBits);
-  }
-
-  return result;
-};
-
-var parseFloatFromBits = function(data, precisionBits, exponentBits) {
-  var bias = Math.pow(2, exponentBits - 1) - 1;
-  var sign = parseBits(data, 1);
-  var exponent = parseBits(data, exponentBits, 1);
-
-  if (exponent === 0) {
-    return 0;
-  }
-
-  // parse mantissa
-  var precisionBitsCounter = 1;
-  var parsePrecisionBits = function(lastValue, newValue, bits) {
-    if (lastValue === 0) {
-      lastValue = 1;
-    }
-
-    for (var i = 1; i <= bits; i++) {
-      precisionBitsCounter /= 2;
-      if ((newValue & (0x1 << (bits - i))) > 0) {
-        lastValue += precisionBitsCounter;
-      }
-    }
-
-    return lastValue;
-  };
-
-  var mantissa = parseBits(data, precisionBits, exponentBits + 1, false, parsePrecisionBits);
-
-  // special cases
-  if (exponent == (Math.pow(2, exponentBits + 1) - 1)) {
-    if (mantissa === 0) {
-      return (sign === 0) ? Infinity : -Infinity;
-    }
-
-    return NaN;
-  }
-
-  // normale number
-  return ((sign === 0) ? 1 : -1) * Math.pow(2, exponent - bias) * mantissa;
-};
-
-var parseInt16 = function(value) {
-  if (parseBits(value, 1) == 1) {
-    return -1 * (parseBits(value, 15, 1, true) + 1);
-  }
-
-  return parseBits(value, 15, 1);
-};
-
-var parseInt32 = function(value) {
-  if (parseBits(value, 1) == 1) {
-    return -1 * (parseBits(value, 31, 1, true) + 1);
-  }
-
-  return parseBits(value, 31, 1);
-};
-
-var parseFloat32 = function(value) {
-  return parseFloatFromBits(value, 23, 8);
-};
-
-var parseFloat64 = function(value) {
-  return parseFloatFromBits(value, 52, 11);
-};
-
-var parseNumeric = function(value) {
-  var sign = parseBits(value, 16, 32);
-  if (sign == 0xc000) {
-    return NaN;
-  }
-
-  var weight = Math.pow(10000, parseBits(value, 16, 16));
-  var result = 0;
-
-  var digits = [];
-  var ndigits = parseBits(value, 16);
-  for (var i = 0; i < ndigits; i++) {
-    result += parseBits(value, 16, 64 + (16 * i)) * weight;
-    weight /= 10000;
-  }
-
-  var scale = Math.pow(10, parseBits(value, 16, 48));
-  return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;
-};
-
-var parseDate = function(isUTC, value) {
-  var sign = parseBits(value, 1);
-  var rawValue = parseBits(value, 63, 1);
-
-  // discard usecs and shift from 2000 to 1970
-  var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);
-
-  if (!isUTC) {
-    result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);
-  }
-
-  // add microseconds to the date
-  result.usec = rawValue % 1000;
-  result.getMicroSeconds = function() {
-    return this.usec;
-  };
-  result.setMicroSeconds = function(value) {
-    this.usec = value;
-  };
-  result.getUTCMicroSeconds = function() {
-    return this.usec;
-  };
-
-  return result;
-};
-
-var parseArray = function(value) {
-  var dim = parseBits(value, 32);
-
-  var flags = parseBits(value, 32, 32);
-  var elementType = parseBits(value, 32, 64);
-
-  var offset = 96;
-  var dims = [];
-  for (var i = 0; i < dim; i++) {
-    // parse dimension
-    dims[i] = parseBits(value, 32, offset);
-    offset += 32;
-
-    // ignore lower bounds
-    offset += 32;
-  }
-
-  var parseElement = function(elementType) {
-    // parse content length
-    var length = parseBits(value, 32, offset);
-    offset += 32;
-
-    // parse null values
-    if (length == 0xffffffff) {
-      return null;
-    }
-
-    var result;
-    if ((elementType == 0x17) || (elementType == 0x14)) {
-      // int/bigint
-      result = parseBits(value, length * 8, offset);
-      offset += length * 8;
-      return result;
-    }
-    else if (elementType == 0x19) {
-      // string
-      result = value.toString(this.encoding, offset >> 3, (offset += (length << 3)) >> 3);
-      return result;
-    }
-    else {
-      console.log("ERROR: ElementType not implemented: " + elementType);
-    }
-  };
-
-  var parse = function(dimension, elementType) {
-    var array = [];
-    var i;
-
-    if (dimension.length > 1) {
-      var count = dimension.shift();
-      for (i = 0; i < count; i++) {
-        array[i] = parse(dimension, elementType);
-      }
-      dimension.unshift(count);
-    }
-    else {
-      for (i = 0; i < dimension[0]; i++) {
-        array[i] = parseElement(elementType);
-      }
-    }
-
-    return array;
-  };
-
-  return parse(dims, elementType);
-};
-
-var parseText = function(value) {
-  return value.toString('utf8');
-};
-
-var parseBool = function(value) {
-  if(value === null) return null;
-  return (parseBits(value, 8) > 0);
-};
-
-var init = function(register) {
-  register(20, parseInt64);
-  register(21, parseInt16);
-  register(23, parseInt32);
-  register(26, parseInt32);
-  register(1700, parseNumeric);
-  register(700, parseFloat32);
-  register(701, parseFloat64);
-  register(16, parseBool);
-  register(1114, parseDate.bind(null, false));
-  register(1184, parseDate.bind(null, true));
-  register(1000, parseArray);
-  register(1007, parseArray);
-  register(1016, parseArray);
-  register(1008, parseArray);
-  register(1009, parseArray);
-  register(25, parseText);
-};
-
-module.exports = {
-  init: init
-};
Index: de_modules/pg-types/lib/builtins.js
===================================================================
--- node_modules/pg-types/lib/builtins.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,73 +1,0 @@
-/**
- * Following query was used to generate this file:
-
- SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)
- FROM pg_type PT
- WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)
- AND typtype = 'b' -- Only basic types
- AND typelem = 0 -- Ignore aliases
- AND typisdefined -- Ignore undefined types
- */
-
-module.exports = {
-    BOOL: 16,
-    BYTEA: 17,
-    CHAR: 18,
-    INT8: 20,
-    INT2: 21,
-    INT4: 23,
-    REGPROC: 24,
-    TEXT: 25,
-    OID: 26,
-    TID: 27,
-    XID: 28,
-    CID: 29,
-    JSON: 114,
-    XML: 142,
-    PG_NODE_TREE: 194,
-    SMGR: 210,
-    PATH: 602,
-    POLYGON: 604,
-    CIDR: 650,
-    FLOAT4: 700,
-    FLOAT8: 701,
-    ABSTIME: 702,
-    RELTIME: 703,
-    TINTERVAL: 704,
-    CIRCLE: 718,
-    MACADDR8: 774,
-    MONEY: 790,
-    MACADDR: 829,
-    INET: 869,
-    ACLITEM: 1033,
-    BPCHAR: 1042,
-    VARCHAR: 1043,
-    DATE: 1082,
-    TIME: 1083,
-    TIMESTAMP: 1114,
-    TIMESTAMPTZ: 1184,
-    INTERVAL: 1186,
-    TIMETZ: 1266,
-    BIT: 1560,
-    VARBIT: 1562,
-    NUMERIC: 1700,
-    REFCURSOR: 1790,
-    REGPROCEDURE: 2202,
-    REGOPER: 2203,
-    REGOPERATOR: 2204,
-    REGCLASS: 2205,
-    REGTYPE: 2206,
-    UUID: 2950,
-    TXID_SNAPSHOT: 2970,
-    PG_LSN: 3220,
-    PG_NDISTINCT: 3361,
-    PG_DEPENDENCIES: 3402,
-    TSVECTOR: 3614,
-    TSQUERY: 3615,
-    GTSVECTOR: 3642,
-    REGCONFIG: 3734,
-    REGDICTIONARY: 3769,
-    JSONB: 3802,
-    REGNAMESPACE: 4089,
-    REGROLE: 4096
-};
Index: de_modules/pg-types/lib/textParsers.js
===================================================================
--- node_modules/pg-types/lib/textParsers.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,215 +1,0 @@
-var array = require('postgres-array')
-var arrayParser = require('./arrayParser');
-var parseDate = require('postgres-date');
-var parseInterval = require('postgres-interval');
-var parseByteA = require('postgres-bytea');
-
-function allowNull (fn) {
-  return function nullAllowed (value) {
-    if (value === null) return value
-    return fn(value)
-  }
-}
-
-function parseBool (value) {
-  if (value === null) return value
-  return value === 'TRUE' ||
-    value === 't' ||
-    value === 'true' ||
-    value === 'y' ||
-    value === 'yes' ||
-    value === 'on' ||
-    value === '1';
-}
-
-function parseBoolArray (value) {
-  if (!value) return null
-  return array.parse(value, parseBool)
-}
-
-function parseBaseTenInt (string) {
-  return parseInt(string, 10)
-}
-
-function parseIntegerArray (value) {
-  if (!value) return null
-  return array.parse(value, allowNull(parseBaseTenInt))
-}
-
-function parseBigIntegerArray (value) {
-  if (!value) return null
-  return array.parse(value, allowNull(function (entry) {
-    return parseBigInteger(entry).trim()
-  }))
-}
-
-var parsePointArray = function(value) {
-  if(!value) { return null; }
-  var p = arrayParser.create(value, function(entry) {
-    if(entry !== null) {
-      entry = parsePoint(entry);
-    }
-    return entry;
-  });
-
-  return p.parse();
-};
-
-var parseFloatArray = function(value) {
-  if(!value) { return null; }
-  var p = arrayParser.create(value, function(entry) {
-    if(entry !== null) {
-      entry = parseFloat(entry);
-    }
-    return entry;
-  });
-
-  return p.parse();
-};
-
-var parseStringArray = function(value) {
-  if(!value) { return null; }
-
-  var p = arrayParser.create(value);
-  return p.parse();
-};
-
-var parseDateArray = function(value) {
-  if (!value) { return null; }
-
-  var p = arrayParser.create(value, function(entry) {
-    if (entry !== null) {
-      entry = parseDate(entry);
-    }
-    return entry;
-  });
-
-  return p.parse();
-};
-
-var parseIntervalArray = function(value) {
-  if (!value) { return null; }
-
-  var p = arrayParser.create(value, function(entry) {
-    if (entry !== null) {
-      entry = parseInterval(entry);
-    }
-    return entry;
-  });
-
-  return p.parse();
-};
-
-var parseByteAArray = function(value) {
-  if (!value) { return null; }
-
-  return array.parse(value, allowNull(parseByteA));
-};
-
-var parseInteger = function(value) {
-  return parseInt(value, 10);
-};
-
-var parseBigInteger = function(value) {
-  var valStr = String(value);
-  if (/^\d+$/.test(valStr)) { return valStr; }
-  return value;
-};
-
-var parseJsonArray = function(value) {
-  if (!value) { return null; }
-
-  return array.parse(value, allowNull(JSON.parse));
-};
-
-var parsePoint = function(value) {
-  if (value[0] !== '(') { return null; }
-
-  value = value.substring( 1, value.length - 1 ).split(',');
-
-  return {
-    x: parseFloat(value[0])
-  , y: parseFloat(value[1])
-  };
-};
-
-var parseCircle = function(value) {
-  if (value[0] !== '<' && value[1] !== '(') { return null; }
-
-  var point = '(';
-  var radius = '';
-  var pointParsed = false;
-  for (var i = 2; i < value.length - 1; i++){
-    if (!pointParsed) {
-      point += value[i];
-    }
-
-    if (value[i] === ')') {
-      pointParsed = true;
-      continue;
-    } else if (!pointParsed) {
-      continue;
-    }
-
-    if (value[i] === ','){
-      continue;
-    }
-
-    radius += value[i];
-  }
-  var result = parsePoint(point);
-  result.radius = parseFloat(radius);
-
-  return result;
-};
-
-var init = function(register) {
-  register(20, parseBigInteger); // int8
-  register(21, parseInteger); // int2
-  register(23, parseInteger); // int4
-  register(26, parseInteger); // oid
-  register(700, parseFloat); // float4/real
-  register(701, parseFloat); // float8/double
-  register(16, parseBool);
-  register(1082, parseDate); // date
-  register(1114, parseDate); // timestamp without timezone
-  register(1184, parseDate); // timestamp
-  register(600, parsePoint); // point
-  register(651, parseStringArray); // cidr[]
-  register(718, parseCircle); // circle
-  register(1000, parseBoolArray);
-  register(1001, parseByteAArray);
-  register(1005, parseIntegerArray); // _int2
-  register(1007, parseIntegerArray); // _int4
-  register(1028, parseIntegerArray); // oid[]
-  register(1016, parseBigIntegerArray); // _int8
-  register(1017, parsePointArray); // point[]
-  register(1021, parseFloatArray); // _float4
-  register(1022, parseFloatArray); // _float8
-  register(1231, parseFloatArray); // _numeric
-  register(1014, parseStringArray); //char
-  register(1015, parseStringArray); //varchar
-  register(1008, parseStringArray);
-  register(1009, parseStringArray);
-  register(1040, parseStringArray); // macaddr[]
-  register(1041, parseStringArray); // inet[]
-  register(1115, parseDateArray); // timestamp without time zone[]
-  register(1182, parseDateArray); // _date
-  register(1185, parseDateArray); // timestamp with time zone[]
-  register(1186, parseInterval);
-  register(1187, parseIntervalArray);
-  register(17, parseByteA);
-  register(114, JSON.parse.bind(JSON)); // json
-  register(3802, JSON.parse.bind(JSON)); // jsonb
-  register(199, parseJsonArray); // json[]
-  register(3807, parseJsonArray); // jsonb[]
-  register(3907, parseStringArray); // numrange[]
-  register(2951, parseStringArray); // uuid[]
-  register(791, parseStringArray); // money[]
-  register(1183, parseStringArray); // time[]
-  register(1270, parseStringArray); // timetz[]
-};
-
-module.exports = {
-  init: init
-};
Index: de_modules/pg-types/package.json
===================================================================
--- node_modules/pg-types/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,42 +1,0 @@
-{
-  "name": "pg-types",
-  "version": "2.2.0",
-  "description": "Query result type converters for node-postgres",
-  "main": "index.js",
-  "scripts": {
-    "test": "tape test/*.js | tap-spec && npm run test-ts",
-    "test-ts": "if-node-version '>= 8' tsd"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-pg-types.git"
-  },
-  "keywords": [
-    "postgres",
-    "PostgreSQL",
-    "pg"
-  ],
-  "author": "Brian M. Carlson",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/brianc/node-pg-types/issues"
-  },
-  "homepage": "https://github.com/brianc/node-pg-types",
-  "devDependencies": {
-    "if-node-version": "^1.1.1",
-    "pff": "^1.0.0",
-    "tap-spec": "^4.0.0",
-    "tape": "^4.0.0",
-    "tsd": "^0.7.4"
-  },
-  "dependencies": {
-    "pg-int8": "1.0.1",
-    "postgres-array": "~2.0.0",
-    "postgres-bytea": "~1.0.0",
-    "postgres-date": "~1.0.4",
-    "postgres-interval": "^1.1.0"
-  },
-  "engines": {
-    "node": ">=4"
-  }
-}
Index: de_modules/pg-types/test/index.js
===================================================================
--- node_modules/pg-types/test/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,24 +1,0 @@
-
-var test = require('tape')
-var printf = require('pff')
-var getTypeParser = require('../').getTypeParser
-var types = require('./types')
-
-test('types', function (t) {
-  Object.keys(types).forEach(function (typeName) {
-    var type = types[typeName]
-    t.test(typeName, function (t) {
-      var parser = getTypeParser(type.id, type.format)
-      type.tests.forEach(function (tests) {
-        var input = tests[0]
-        var expected = tests[1]
-        var result = parser(input)
-        if (typeof expected === 'function') {
-          return expected(t, result)
-        }
-        t.equal(result, expected)
-      })
-      t.end()
-    })
-  })
-})
Index: de_modules/pg-types/test/types.js
===================================================================
--- node_modules/pg-types/test/types.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,597 +1,0 @@
-'use strict'
-
-exports['string/varchar'] = {
-  format: 'text',
-  id: 1043,
-  tests: [
-    ['bang', 'bang']
-  ]
-}
-
-exports['integer/int4'] = {
-  format: 'text',
-  id: 23,
-  tests: [
-    ['2147483647', 2147483647]
-  ]
-}
-
-exports['smallint/int2'] = {
-  format: 'text',
-  id: 21,
-  tests: [
-    ['32767', 32767]
-  ]
-}
-
-exports['bigint/int8'] = {
-  format: 'text',
-  id: 20,
-  tests: [
-    ['9223372036854775807', '9223372036854775807']
-  ]
-}
-
-exports.oid = {
-  format: 'text',
-  id: 26,
-  tests: [
-    ['103', 103]
-  ]
-}
-
-var bignum = '31415926535897932384626433832795028841971693993751058.16180339887498948482045868343656381177203091798057628'
-exports.numeric = {
-  format: 'text',
-  id: 1700,
-  tests: [
-    [bignum, bignum]
-  ]
-}
-
-exports['real/float4'] = {
-  format: 'text',
-  id: 700,
-  tests: [
-    ['123.456', 123.456]
-  ]
-}
-
-exports['double precision / float 8'] = {
-  format: 'text',
-  id: 701,
-  tests: [
-    ['12345678.12345678', 12345678.12345678]
-  ]
-}
-
-exports.boolean = {
-  format: 'text',
-  id: 16,
-  tests: [
-    ['TRUE', true],
-    ['t', true],
-    ['true', true],
-    ['y', true],
-    ['yes', true],
-    ['on', true],
-    ['1', true],
-    ['f', false],
-    [null, null]
-  ]
-}
-
-exports.timestamptz = {
-  format: 'text',
-  id: 1184,
-  tests: [
-    [
-      '2010-10-31 14:54:13.74-05:30',
-      dateEquals(2010, 9, 31, 20, 24, 13, 740)
-    ],
-    [
-      '2011-01-23 22:05:00.68-06',
-       dateEquals(2011, 0, 24, 4, 5, 0, 680)
-    ],
-    [
-      '2010-10-30 14:11:12.730838Z',
-      dateEquals(2010, 9, 30, 14, 11, 12, 730)
-    ],
-    [
-      '2010-10-30 13:10:01+05',
-      dateEquals(2010, 9, 30, 8, 10, 1, 0)
-    ]
-  ]
-}
-
-exports.timestamp = {
-  format: 'text',
-  id: 1114,
-  tests: [
-    [
-      '2010-10-31 00:00:00',
-      function (t, value) {
-        t.equal(
-          value.toUTCString(),
-          new Date(2010, 9, 31, 0, 0, 0, 0, 0).toUTCString()
-        )
-        t.equal(
-          value.toString(),
-          new Date(2010, 9, 31, 0, 0, 0, 0, 0, 0).toString()
-        )
-      }
-    ]
-  ]
-}
-
-exports.date = {
-  format: 'text',
-  id: 1082,
-  tests: [
-    ['2010-10-31', function (t, value) {
-      var now = new Date(2010, 9, 31)
-      dateEquals(
-        2010,
-        now.getUTCMonth(),
-        now.getUTCDate(),
-        now.getUTCHours(), 0, 0, 0)(t, value)
-      t.equal(value.getHours(), now.getHours())
-    }]
-  ]
-}
-
-exports.inet = {
-  format: 'text',
-  id: 869,
-  tests: [
-    ['8.8.8.8', '8.8.8.8'],
-    ['2001:4860:4860::8888', '2001:4860:4860::8888'],
-    ['127.0.0.1', '127.0.0.1'],
-    ['fd00:1::40e', 'fd00:1::40e'],
-    ['1.2.3.4', '1.2.3.4']
-  ]
-}
-
-exports.cidr = {
-  format: 'text',
-  id: 650,
-  tests: [
-    ['172.16.0.0/12', '172.16.0.0/12'],
-    ['fe80::/10', 'fe80::/10'],
-    ['fc00::/7', 'fc00::/7'],
-    ['192.168.0.0/24', '192.168.0.0/24'],
-    ['10.0.0.0/8', '10.0.0.0/8']
-  ]
-}
-
-exports.macaddr = {
-  format: 'text',
-  id: 829,
-  tests: [
-    ['08:00:2b:01:02:03', '08:00:2b:01:02:03'],
-    ['16:10:9f:0d:66:00', '16:10:9f:0d:66:00']
-  ]
-}
-
-exports.numrange = {
-  format: 'text',
-  id: 3906,
-  tests: [
-    ['[,]', '[,]'],
-    ['(,)', '(,)'],
-    ['(,]', '(,]'],
-    ['[1,)', '[1,)'],
-    ['[,1]', '[,1]'],
-    ['(1,2)', '(1,2)'],
-    ['(1,20.5]', '(1,20.5]']
-  ]
-}
-
-exports.interval = {
-  format: 'text',
-  id: 1186,
-  tests: [
-    ['01:02:03', function (t, value) {
-      t.equal(value.toPostgres(), '3 seconds 2 minutes 1 hours')
-      t.deepEqual(value, {hours: 1, minutes: 2, seconds: 3})
-    }],
-    ['01:02:03.456', function (t, value) {
-      t.deepEqual(value, {hours: 1, minutes:2, seconds: 3, milliseconds: 456})
-    }],
-    ['1 year -32 days', function (t, value) {
-      t.equal(value.toPostgres(), '-32 days 1 years')
-      t.deepEqual(value, {years: 1, days: -32})
-    }],
-    ['1 day -00:00:03', function (t, value) {
-      t.equal(value.toPostgres(), '-3 seconds 1 days')
-      t.deepEqual(value, {days: 1, seconds: -3})
-    }]
-  ]
-}
-
-exports.bytea = {
-  format: 'text',
-  id: 17,
-  tests: [
-    ['foo\\000\\200\\\\\\377', function (t, value) {
-      var buffer = new Buffer([102, 111, 111, 0, 128, 92, 255])
-      t.ok(buffer.equals(value))
-    }],
-    ['', function (t, value) {
-      var buffer = new Buffer(0)
-      t.ok(buffer.equals(value))
-    }]
-  ]
-}
-
-exports['array/boolean'] = {
-    format: 'text',
-    id: 1000,
-    tests: [
-        ['{true,false}', function (t, value) {
-            t.deepEqual(value, [true, false])
-        }]
-    ]
-}
-
-exports['array/char'] = {
-  format: 'text',
-  id: 1014,
-  tests: [
-    ['{foo,bar}', function (t, value) {
-      t.deepEqual(value, ['foo', 'bar'])
-    }]
-  ]
-}
-
-exports['array/varchar'] = {
-  format: 'text',
-  id: 1015,
-  tests: [
-    ['{foo,bar}', function (t, value) {
-      t.deepEqual(value, ['foo', 'bar'])
-    }]
-  ]
-}
-
-exports['array/text'] = {
-  format: 'text',
-  id: 1008,
-  tests: [
-    ['{foo}', function (t, value) {
-      t.deepEqual(value, ['foo'])
-    }]
-  ]
-}
-
-exports['array/bytea'] = {
-  format: 'text',
-  id: 1001,
-  tests: [
-    ['{"\\\\x00000000"}', function (t, value) {
-      var buffer = new Buffer('00000000', 'hex')
-      t.ok(Array.isArray(value))
-      t.equal(value.length, 1)
-      t.ok(buffer.equals(value[0]))
-    }],
-    ['{NULL,"\\\\x4e554c4c"}', function (t, value) {
-      var buffer = new Buffer('4e554c4c', 'hex')
-      t.ok(Array.isArray(value))
-      t.equal(value.length, 2)
-      t.equal(value[0], null)
-      t.ok(buffer.equals(value[1]))
-    }],
-  ]
-}
-
-exports['array/numeric'] = {
-  format: 'text',
-  id: 1231,
-  tests: [
-    ['{1.2,3.4}', function (t, value) {
-      t.deepEqual(value, [1.2, 3.4])
-    }]
-  ]
-}
-
-exports['array/int2'] = {
-  format: 'text',
-  id: 1005,
-  tests: [
-    ['{-32768, -32767, 32766, 32767}', function (t, value) {
-      t.deepEqual(value, [-32768, -32767, 32766, 32767])
-    }]
-  ]
-}
-
-exports['array/int4'] = {
-  format: 'text',
-  id: 1005,
-  tests: [
-    ['{-2147483648, -2147483647, 2147483646, 2147483647}', function (t, value) {
-      t.deepEqual(value, [-2147483648, -2147483647, 2147483646, 2147483647])
-    }]
-  ]
-}
-
-exports['array/int8'] = {
-  format: 'text',
-  id: 1016,
-  tests: [
-    [
-      '{-9223372036854775808, -9223372036854775807, 9223372036854775806, 9223372036854775807}',
-      function (t, value) {
-        t.deepEqual(value, [
-          '-9223372036854775808',
-          '-9223372036854775807',
-          '9223372036854775806',
-          '9223372036854775807'
-        ])
-      }
-    ]
-  ]
-}
-
-exports['array/json'] = {
-  format: 'text',
-  id: 199,
-  tests: [
-    [
-      '{{1,2},{[3],"[4,5]"},{null,NULL}}',
-      function (t, value) {
-        t.deepEqual(value, [
-          [1, 2],
-          [[3], [4, 5]],
-          [null, null],
-        ])
-      }
-    ]
-  ]
-}
-
-exports['array/jsonb'] = {
-  format: 'text',
-  id: 3807,
-  tests: exports['array/json'].tests
-}
-
-exports['array/point'] = {
-  format: 'text',
-  id: 1017,
-  tests: [
-    ['{"(25.1,50.5)","(10.1,40)"}', function (t, value) {
-      t.deepEqual(value, [{x: 25.1, y: 50.5}, {x: 10.1, y: 40}])
-    }]
-  ]
-}
-
-exports['array/oid'] = {
-  format: 'text',
-  id: 1028,
-  tests: [
-    ['{25864,25860}', function (t, value) {
-      t.deepEqual(value, [25864, 25860])
-    }]
-  ]
-}
-
-exports['array/float4'] = {
-  format: 'text',
-  id: 1021,
-  tests: [
-    ['{1.2, 3.4}', function (t, value) {
-      t.deepEqual(value, [1.2, 3.4])
-    }]
-  ]
-}
-
-exports['array/float8'] = {
-  format: 'text',
-  id: 1022,
-  tests: [
-    ['{-12345678.1234567, 12345678.12345678}', function (t, value) {
-      t.deepEqual(value, [-12345678.1234567, 12345678.12345678])
-    }]
-  ]
-}
-
-exports['array/date'] = {
-  format: 'text',
-  id: 1182,
-  tests: [
-    ['{2014-01-01,2015-12-31}', function (t, value) {
-      var expecteds = [new Date(2014, 0, 1), new Date(2015, 11, 31)]
-      t.equal(value.length, 2)
-      value.forEach(function (date, index) {
-        var expected = expecteds[index]
-        dateEquals(
-          expected.getUTCFullYear(),
-          expected.getUTCMonth(),
-          expected.getUTCDate(),
-          expected.getUTCHours(), 0, 0, 0)(t, date)
-      })
-    }]
-  ]
-}
-
-exports['array/interval'] = {
-  format: 'text',
-  id: 1187,
-  tests: [
-    ['{01:02:03,1 day -00:00:03}', function (t, value) {
-      var expecteds = [{hours: 1, minutes: 2, seconds: 3},
-                       {days: 1, seconds: -3}]
-      t.equal(value.length, 2)
-      t.deepEqual(value, expecteds);
-    }]
-  ]
-}
-
-exports['array/inet'] = {
-  format: 'text',
-  id: 1041,
-  tests: [
-    ['{8.8.8.8}', function (t, value) {
-      t.deepEqual(value, ['8.8.8.8']);
-    }],
-    ['{2001:4860:4860::8888}', function (t, value) {
-      t.deepEqual(value, ['2001:4860:4860::8888']);
-    }],
-    ['{127.0.0.1,fd00:1::40e,1.2.3.4}', function (t, value) {
-      t.deepEqual(value, ['127.0.0.1', 'fd00:1::40e', '1.2.3.4']);
-    }]
-  ]
-}
-
-exports['array/cidr'] = {
-  format: 'text',
-  id: 651,
-  tests: [
-    ['{172.16.0.0/12}', function (t, value) {
-      t.deepEqual(value, ['172.16.0.0/12']);
-    }],
-    ['{fe80::/10}', function (t, value) {
-      t.deepEqual(value, ['fe80::/10']);
-    }],
-    ['{10.0.0.0/8,fc00::/7,192.168.0.0/24}', function (t, value) {
-      t.deepEqual(value, ['10.0.0.0/8', 'fc00::/7', '192.168.0.0/24']);
-    }]
-  ]
-}
-
-exports['array/macaddr'] = {
-  format: 'text',
-  id: 1040,
-  tests: [
-    ['{08:00:2b:01:02:03,16:10:9f:0d:66:00}', function (t, value) {
-      t.deepEqual(value, ['08:00:2b:01:02:03', '16:10:9f:0d:66:00']);
-    }]
-  ]
-}
-
-exports['array/numrange'] = {
-  format: 'text',
-  id: 3907,
-  tests: [
-    ['{"[1,2]","(4.5,8)","[10,40)","(-21.2,60.3]"}', function (t, value) {
-      t.deepEqual(value, ['[1,2]', '(4.5,8)', '[10,40)', '(-21.2,60.3]']);
-    }],
-    ['{"[,20]","[3,]","[,]","(,35)","(1,)","(,)"}', function (t, value) {
-      t.deepEqual(value, ['[,20]', '[3,]', '[,]', '(,35)', '(1,)', '(,)']);
-    }],
-    ['{"[,20)","[3,)","[,)","[,35)","[1,)","[,)"}', function (t, value) {
-      t.deepEqual(value, ['[,20)', '[3,)', '[,)', '[,35)', '[1,)', '[,)']);
-    }]
-  ]
-}
-
-exports['binary-string/varchar'] = {
-  format: 'binary',
-  id: 1043,
-  tests: [
-    ['bang', 'bang']
-  ]
-}
-
-exports['binary-integer/int4'] = {
-  format: 'binary',
-  id: 23,
-  tests: [
-    [[0, 0, 0, 100], 100]
-  ]
-}
-
-exports['binary-smallint/int2'] = {
-  format: 'binary',
-  id: 21,
-  tests: [
-    [[0, 101], 101]
-  ]
-}
-
-exports['binary-bigint/int8'] = {
-  format: 'binary',
-  id: 20,
-  tests: [
-    [new Buffer([0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), '9223372036854775807']
-  ]
-}
-
-exports['binary-oid'] = {
-  format: 'binary',
-  id: 26,
-  tests: [
-    [[0, 0, 0, 103], 103]
-  ]
-}
-
-exports['binary-numeric'] = {
-  format: 'binary',
-  id: 1700,
-  tests: [
-    [
-      [0, 2, 0, 0, 0, 0, 0, hex('0x64'), 0, 12, hex('0xd'), hex('0x48'), 0, 0, 0, 0],
-      12.34
-    ]
-  ]
-}
-
-exports['binary-real/float4'] = {
-  format: 'binary',
-  id: 700,
-  tests: [
-    [['0x41', '0x48', '0x00', '0x00'].map(hex), 12.5]
-  ]
-}
-
-exports['binary-boolean'] = {
-  format: 'binary',
-  id: 16,
-  tests: [
-    [[1], true],
-    [[0], false],
-    [null, null]
-  ]
-}
-
-exports['binary-string'] = {
-  format: 'binary',
-  id: 25,
-  tests: [
-    [
-      new Buffer(['0x73', '0x6c', '0x61', '0x64', '0x64', '0x61'].map(hex)),
-      'sladda'
-    ]
-  ]
-}
-
-exports.point = {
-  format: 'text',
-  id: 600,
-  tests: [
-    ['(25.1,50.5)', function (t, value) {
-      t.deepEqual(value, {x: 25.1, y: 50.5})
-    }]
-  ]
-}
-
-exports.circle = {
-  format: 'text',
-  id: 718,
-  tests: [
-    ['<(25,10),5>', function (t, value) {
-      t.deepEqual(value, {x: 25, y: 10, radius: 5})
-    }]
-  ]
-}
-
-function hex (string) {
-  return parseInt(string, 16)
-}
-
-function dateEquals () {
-  var timestamp = Date.UTC.apply(Date, arguments)
-  return function (t, value) {
-    t.equal(value.toUTCString(), new Date(timestamp).toUTCString())
-  }
-}
Index: de_modules/pg/LICENSE
===================================================================
--- node_modules/pg/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2010 - 2021 Brian Carlson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/pg/README.md
===================================================================
--- node_modules/pg/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,96 +1,0 @@
-# node-postgres
-
-[![Build Status](https://secure.travis-ci.org/brianc/node-postgres.svg?branch=master)](http://travis-ci.org/brianc/node-postgres)
-<span class="badge-npmversion"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/v/pg.svg" alt="NPM version" /></a></span>
-<span class="badge-npmdownloads"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/dm/pg.svg" alt="NPM downloads" /></a></span>
-
-Non-blocking PostgreSQL client for Node.js. Pure JavaScript and optional native libpq bindings.
-
-## Install
-
-```sh
-$ npm install pg
-```
-
----
-
-## :star: [Documentation](https://node-postgres.com) :star:
-
-### Features
-
-- [Fastest PostgreSQL client for Node.js](https://github.com/nigrosimone/postgres-benchmarks)
-- Pure JavaScript client and native libpq bindings share _the same API_
-- Connection pooling
-- Extensible JS ↔ PostgreSQL data-type coercion
-- Supported PostgreSQL features
-  - Parameterized queries
-  - Named statements with query plan caching
-  - Async notifications with `LISTEN/NOTIFY`
-  - Bulk import & export with `COPY TO/COPY FROM`
-
-### Extras
-
-node-postgres is by design pretty light on abstractions. These are some handy modules we've been using over the years to complete the picture.
-The entire list can be found on our [wiki](https://github.com/brianc/node-postgres/wiki/Extras).
-
-## Support
-
-node-postgres is free software. If you encounter a bug with the library please open an issue on the [GitHub repo](https://github.com/brianc/node-postgres). If you have questions unanswered by the documentation please open an issue pointing out how the documentation was unclear & I will do my best to make it better!
-
-When you open an issue please provide:
-
-- version of Node
-- version of Postgres
-- smallest possible snippet of code to reproduce the problem
-
-You can also follow me [@brianc](https://bsky.app/profile/brianc.bsky.social) on bluesky if that's your thing for updates on node-postgres with nearly zero non node-postgres content. My old twitter/x account is no longer used.
-
-## Sponsorship :two_hearts:
-
-node-postgres's continued development has been made possible in part by generous financial support from [the community](https://github.com/brianc/node-postgres/blob/master/SPONSORS.md).
-
-If you or your company are benefiting from node-postgres and would like to help keep the project financially sustainable [please consider supporting](https://github.com/sponsors/brianc) its development.
-
-### Featured sponsor
-
-Special thanks to [medplum](https://medplum.com) for their generous and thoughtful support of node-postgres!
-
-![medplum](https://raw.githubusercontent.com/medplum/medplum-logo/refs/heads/main/medplum-logo.png)
-
-## Contributing
-
-**:heart: contributions!**
-
-I will **happily** accept your pull request if it:
-
-- **has tests**
-- looks reasonable
-- does not break backwards compatibility
-
-If your change involves breaking backwards compatibility please please point that out in the pull request & we can discuss & plan when and how to release it and what type of documentation or communicate it will require.
-
-## Troubleshooting and FAQ
-
-The causes and solutions to common errors can be found among the [Frequently Asked Questions (FAQ)](https://github.com/brianc/node-postgres/wiki/FAQ)
-
-## License
-
-Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/pg/esm/index.mjs
===================================================================
--- node_modules/pg/esm/index.mjs	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-// ESM wrapper for pg
-import pg from '../lib/index.js'
-
-// Re-export all the properties
-export const Client = pg.Client
-export const Pool = pg.Pool
-export const Connection = pg.Connection
-export const types = pg.types
-export const Query = pg.Query
-export const DatabaseError = pg.DatabaseError
-export const escapeIdentifier = pg.escapeIdentifier
-export const escapeLiteral = pg.escapeLiteral
-export const Result = pg.Result
-export const TypeOverrides = pg.TypeOverrides
-
-// Also export the defaults
-export const defaults = pg.defaults
-
-// Re-export the default
-export default pg
Index: de_modules/pg/lib/client.js
===================================================================
--- node_modules/pg/lib/client.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,828 +1,0 @@
-const EventEmitter = require('events').EventEmitter
-const utils = require('./utils')
-const nodeUtils = require('util')
-const sasl = require('./crypto/sasl')
-const TypeOverrides = require('./type-overrides')
-
-const ConnectionParameters = require('./connection-parameters')
-const Query = require('./query')
-const defaults = require('./defaults')
-const Connection = require('./connection')
-const crypto = require('./crypto/utils')
-
-const activeQueryDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'Client.activeQuery is deprecated and will be removed in pg@9.0'
-)
-
-const queryQueueDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'Client.queryQueue is deprecated and will be removed in pg@9.0.'
-)
-
-const pgPassDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'pgpass support is deprecated and will be removed in pg@9.0. ' +
-    'You can provide an async function as the password property to the Client/Pool constructor that returns a password instead. Within this function you can call the pgpass module in your own code.'
-)
-
-const byoPromiseDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'Passing a custom Promise implementation to the Client/Pool constructor is deprecated and will be removed in pg@9.0.'
-)
-
-const queryQueueLengthDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'
-)
-
-function coerceNumberOrDefault(value, defaultValue) {
-  if (typeof value === 'number') {
-    return Number.isFinite(value) ? value : defaultValue
-  }
-  if (typeof value === 'string' && value.trim() !== '') {
-    const n = Number(value)
-    return Number.isFinite(n) ? n : defaultValue
-  }
-  return defaultValue
-}
-
-class Client extends EventEmitter {
-  constructor(config) {
-    super()
-
-    this.connectionParameters = new ConnectionParameters(config)
-    this.user = this.connectionParameters.user
-    this.database = this.connectionParameters.database
-    this.port = this.connectionParameters.port
-    this.host = this.connectionParameters.host
-
-    // "hiding" the password so it doesn't show up in stack traces
-    // or if the client is console.logged
-    Object.defineProperty(this, 'password', {
-      configurable: true,
-      enumerable: false,
-      writable: true,
-      value: this.connectionParameters.password,
-    })
-
-    this.replication = this.connectionParameters.replication
-
-    const c = config || {}
-
-    if (c.Promise) {
-      byoPromiseDeprecationNotice()
-    }
-    this._Promise = c.Promise || global.Promise
-    this._types = new TypeOverrides(c.types)
-    this._ending = false
-    this._ended = false
-    this._connecting = false
-    this._connected = false
-    this._connectionError = false
-    this._queryable = true
-    this._activeQuery = null
-    this._txStatus = null
-
-    this.enableChannelBinding = Boolean(c.enableChannelBinding) // set true to use SCRAM-SHA-256-PLUS when offered
-    this.scramMaxIterations = coerceNumberOrDefault(c.scramMaxIterations, sasl.DEFAULT_MAX_SCRAM_ITERATIONS)
-    this.connection =
-      c.connection ||
-      new Connection({
-        stream: c.stream,
-        ssl: this.connectionParameters.ssl,
-        sslNegotiation: this.connectionParameters.sslnegotiation,
-        keepAlive: c.keepAlive || false,
-        keepAliveInitialDelayMillis: c.keepAliveInitialDelayMillis || 0,
-        encoding: this.connectionParameters.client_encoding || 'utf8',
-      })
-    this._queryQueue = []
-    this._sentQueryQueue = []
-    this.pipeline = Boolean(c.pipeline)
-    this.binary = c.binary || defaults.binary
-    this.processID = null
-    this.secretKey = null
-    this.ssl = this.connectionParameters.ssl || false
-    this.sslNegotiation = this.connectionParameters.sslnegotiation || 'postgres'
-    // As with Password, make SSL->Key (the private key) non-enumerable.
-    // It won't show up in stack traces
-    // or if the client is console.logged
-    if (this.ssl && this.ssl.key) {
-      Object.defineProperty(this.ssl, 'key', {
-        enumerable: false,
-      })
-    }
-
-    this._connectionTimeoutMillis = c.connectionTimeoutMillis || 0
-  }
-
-  get activeQuery() {
-    activeQueryDeprecationNotice()
-    return this._activeQuery
-  }
-
-  set activeQuery(val) {
-    activeQueryDeprecationNotice()
-    this._activeQuery = val
-  }
-
-  _getActiveQuery() {
-    return this._activeQuery
-  }
-
-  _errorAllQueries(err) {
-    const enqueueError = (query) => {
-      process.nextTick(() => {
-        query.handleError(err, this.connection)
-      })
-    }
-
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery) {
-      enqueueError(activeQuery)
-      this._activeQuery = null
-    }
-
-    this._sentQueryQueue.forEach(enqueueError)
-    this._sentQueryQueue.length = 0
-
-    this._queryQueue.forEach(enqueueError)
-    this._queryQueue.length = 0
-  }
-
-  _connect(callback) {
-    const self = this
-    const con = this.connection
-    this._connectionCallback = callback
-
-    if (this._connecting || this._connected) {
-      const err = new Error('Client has already been connected. You cannot reuse a client.')
-      process.nextTick(() => {
-        callback(err)
-      })
-      return
-    }
-    this._connecting = true
-
-    if (this._connectionTimeoutMillis > 0) {
-      this.connectionTimeoutHandle = setTimeout(() => {
-        con._ending = true
-        con.stream.destroy(new Error('timeout expired'))
-      }, this._connectionTimeoutMillis)
-
-      if (this.connectionTimeoutHandle.unref) {
-        this.connectionTimeoutHandle.unref()
-      }
-    }
-
-    if (this.host && this.host.indexOf('/') === 0) {
-      con.connect(this.host + '/.s.PGSQL.' + this.port)
-    } else {
-      con.connect(this.port, this.host)
-    }
-
-    // once connection is established send startup message
-    con.on('connect', function () {
-      if (self.ssl) {
-        // With direct SSL negotiation the connection upgrades to TLS without an
-        // SSLRequest packet, so the startup message is sent after 'sslconnect'.
-        if (self.sslNegotiation !== 'direct') {
-          con.requestSsl()
-        }
-      } else {
-        con.startup(self.getStartupConf())
-      }
-    })
-
-    con.on('sslconnect', function () {
-      con.startup(self.getStartupConf())
-    })
-
-    this._attachListeners(con)
-
-    con.once('end', () => {
-      const error = this._ending ? new Error('Connection terminated') : new Error('Connection terminated unexpectedly')
-
-      clearTimeout(this.connectionTimeoutHandle)
-      this._errorAllQueries(error)
-      this._ended = true
-
-      if (!this._ending) {
-        // if the connection is ended without us calling .end()
-        // on this client then we have an unexpected disconnection
-        // treat this as an error unless we've already emitted an error
-        // during connection.
-        if (this._connecting && !this._connectionError) {
-          if (this._connectionCallback) {
-            this._connectionCallback(error)
-          } else {
-            this._handleErrorEvent(error)
-          }
-        } else if (!this._connectionError) {
-          this._handleErrorEvent(error)
-        }
-      }
-
-      process.nextTick(() => {
-        this.emit('end')
-      })
-    })
-  }
-
-  connect(callback) {
-    if (callback) {
-      this._connect(callback)
-      return
-    }
-
-    return new this._Promise((resolve, reject) => {
-      this._connect((error) => {
-        if (error) {
-          reject(error)
-        } else {
-          resolve(this)
-        }
-      })
-    })
-  }
-
-  _attachListeners(con) {
-    // password request handling
-    con.on('authenticationCleartextPassword', this._handleAuthCleartextPassword.bind(this))
-    // password request handling
-    con.on('authenticationMD5Password', this._handleAuthMD5Password.bind(this))
-    // password request handling (SASL)
-    con.on('authenticationSASL', this._handleAuthSASL.bind(this))
-    con.on('authenticationSASLContinue', this._handleAuthSASLContinue.bind(this))
-    con.on('authenticationSASLFinal', this._handleAuthSASLFinal.bind(this))
-    con.on('backendKeyData', this._handleBackendKeyData.bind(this))
-    con.on('error', this._handleErrorEvent.bind(this))
-    con.on('errorMessage', this._handleErrorMessage.bind(this))
-    con.on('readyForQuery', this._handleReadyForQuery.bind(this))
-    con.on('notice', this._handleNotice.bind(this))
-    con.on('rowDescription', this._handleRowDescription.bind(this))
-    con.on('dataRow', this._handleDataRow.bind(this))
-    con.on('portalSuspended', this._handlePortalSuspended.bind(this))
-    con.on('emptyQuery', this._handleEmptyQuery.bind(this))
-    con.on('commandComplete', this._handleCommandComplete.bind(this))
-    con.on('parseComplete', this._handleParseComplete.bind(this))
-    con.on('copyInResponse', this._handleCopyInResponse.bind(this))
-    con.on('copyData', this._handleCopyData.bind(this))
-    con.on('notification', this._handleNotification.bind(this))
-  }
-
-  _getPassword(cb) {
-    const con = this.connection
-    if (typeof this.password === 'function') {
-      this._Promise
-        .resolve()
-        .then(() => this.password(this.connectionParameters))
-        .then((pass) => {
-          if (pass !== undefined) {
-            if (typeof pass !== 'string') {
-              con.emit('error', new TypeError('Password must be a string'))
-              return
-            }
-            this.connectionParameters.password = this.password = pass
-          } else {
-            this.connectionParameters.password = this.password = null
-          }
-          cb()
-        })
-        .catch((err) => {
-          con.emit('error', err)
-        })
-    } else if (this.password !== null) {
-      cb()
-    } else {
-      try {
-        const pgPass = require('pgpass')
-        pgPass(this.connectionParameters, (pass) => {
-          if (undefined !== pass) {
-            pgPassDeprecationNotice()
-            this.connectionParameters.password = this.password = pass
-          }
-          cb()
-        })
-      } catch (e) {
-        this.emit('error', e)
-      }
-    }
-  }
-
-  _handleAuthCleartextPassword(msg) {
-    this._getPassword(() => {
-      this.connection.password(this.password)
-    })
-  }
-
-  _handleAuthMD5Password(msg) {
-    this._getPassword(async () => {
-      try {
-        const hashedPassword = await crypto.postgresMd5PasswordHash(this.user, this.password, msg.salt)
-        this.connection.password(hashedPassword)
-      } catch (e) {
-        this.emit('error', e)
-      }
-    })
-  }
-
-  _handleAuthSASL(msg) {
-    this._getPassword(() => {
-      try {
-        this.saslSession = sasl.startSession(
-          msg.mechanisms,
-          this.enableChannelBinding && this.connection.stream,
-          this.scramMaxIterations
-        )
-        this.connection.sendSASLInitialResponseMessage(this.saslSession.mechanism, this.saslSession.response)
-      } catch (err) {
-        this.connection.emit('error', err)
-      }
-    })
-  }
-
-  async _handleAuthSASLContinue(msg) {
-    try {
-      await sasl.continueSession(
-        this.saslSession,
-        this.password,
-        msg.data,
-        this.enableChannelBinding && this.connection.stream
-      )
-      this.connection.sendSCRAMClientFinalMessage(this.saslSession.response)
-    } catch (err) {
-      this.connection.emit('error', err)
-    }
-  }
-
-  _handleAuthSASLFinal(msg) {
-    try {
-      sasl.finalizeSession(this.saslSession, msg.data)
-      this.saslSession = null
-    } catch (err) {
-      this.connection.emit('error', err)
-    }
-  }
-
-  _handleBackendKeyData(msg) {
-    this.processID = msg.processID
-    this.secretKey = msg.secretKey
-  }
-
-  _handleReadyForQuery(msg) {
-    if (this._connecting) {
-      this._connecting = false
-      this._connected = true
-      clearTimeout(this.connectionTimeoutHandle)
-
-      // process possible callback argument to Client#connect
-      if (this._connectionCallback) {
-        this._connectionCallback(null, this)
-        // remove callback for proper error handling
-        // after the connect event
-        this._connectionCallback = null
-      }
-      this.emit('connect')
-    }
-    const activeQuery = this._getActiveQuery()
-    this._activeQuery = null
-    this._txStatus = msg?.status ?? null
-    this.readyForQuery = true
-    if (activeQuery) {
-      activeQuery.handleReadyForQuery(this.connection)
-    }
-    this._pulseQueryQueue()
-  }
-
-  // if we receive an error event or error message
-  // during the connection process we handle it here
-  _handleErrorWhileConnecting(err) {
-    if (this._connectionError) {
-      // TODO(bmc): this is swallowing errors - we shouldn't do this
-      return
-    }
-    this._connectionError = true
-    clearTimeout(this.connectionTimeoutHandle)
-    if (this._connectionCallback) {
-      return this._connectionCallback(err)
-    }
-    this.emit('error', err)
-  }
-
-  // if we're connected and we receive an error event from the connection
-  // this means the socket is dead - do a hard abort of all queries and emit
-  // the socket error on the client as well
-  _handleErrorEvent(err) {
-    if (this._connecting) {
-      return this._handleErrorWhileConnecting(err)
-    }
-    this._queryable = false
-    this._errorAllQueries(err)
-    this.emit('error', err)
-  }
-
-  // handle error messages from the postgres backend
-  _handleErrorMessage(msg) {
-    if (this._connecting) {
-      return this._handleErrorWhileConnecting(msg)
-    }
-    const activeQuery = this._getActiveQuery()
-
-    if (!activeQuery) {
-      this._handleErrorEvent(msg)
-      return
-    }
-
-    this._activeQuery = null
-    if (activeQuery.name) {
-      delete this.connection.submittedNamedStatements[activeQuery.name]
-    }
-    activeQuery.handleError(msg, this.connection)
-  }
-
-  _handleRowDescription(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected rowDescription message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // delegate rowDescription to active query
-    activeQuery.handleRowDescription(msg)
-  }
-
-  _handleDataRow(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected dataRow message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // delegate dataRow to active query
-    activeQuery.handleDataRow(msg)
-  }
-
-  _handlePortalSuspended(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected portalSuspended message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // delegate portalSuspended to active query
-    activeQuery.handlePortalSuspended(this.connection)
-  }
-
-  _handleEmptyQuery(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected emptyQuery message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // delegate emptyQuery to active query
-    activeQuery.handleEmptyQuery(this.connection)
-  }
-
-  _handleCommandComplete(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected commandComplete message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // delegate commandComplete to active query
-    activeQuery.handleCommandComplete(msg, this.connection)
-  }
-
-  _handleParseComplete() {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected parseComplete message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    // if a prepared statement has a name and properly parses
-    // we track that its already been executed so we don't parse
-    // it again on the same client
-    if (activeQuery.name) {
-      this.connection.parsedStatements[activeQuery.name] = activeQuery.text
-      delete this.connection.submittedNamedStatements[activeQuery.name]
-    }
-  }
-
-  _handleCopyInResponse(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected copyInResponse message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    activeQuery.handleCopyInResponse(this.connection)
-  }
-
-  _handleCopyData(msg) {
-    const activeQuery = this._getActiveQuery()
-    if (activeQuery == null) {
-      const error = new Error('Received unexpected copyData message from backend.')
-      this._handleErrorEvent(error)
-      return
-    }
-    activeQuery.handleCopyData(msg, this.connection)
-  }
-
-  _handleNotification(msg) {
-    this.emit('notification', msg)
-  }
-
-  _handleNotice(msg) {
-    this.emit('notice', msg)
-  }
-
-  getStartupConf() {
-    const params = this.connectionParameters
-
-    const data = {
-      user: params.user,
-      database: params.database,
-    }
-
-    const appName = params.application_name || params.fallback_application_name
-    if (appName) {
-      data.application_name = appName
-    }
-    if (params.replication) {
-      data.replication = '' + params.replication
-    }
-    if (params.statement_timeout) {
-      data.statement_timeout = String(parseInt(params.statement_timeout, 10))
-    }
-    if (params.lock_timeout) {
-      data.lock_timeout = String(parseInt(params.lock_timeout, 10))
-    }
-    if (params.idle_in_transaction_session_timeout) {
-      data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))
-    }
-    if (params.options) {
-      data.options = params.options
-    }
-
-    return data
-  }
-
-  cancel(client, query) {
-    if (client.activeQuery === query) {
-      const con = this.connection
-
-      if (this.host && this.host.indexOf('/') === 0) {
-        con.connect(this.host + '/.s.PGSQL.' + this.port)
-      } else {
-        con.connect(this.port, this.host)
-      }
-
-      // once connection is established send cancel message
-      con.on('connect', function () {
-        con.cancel(client.processID, client.secretKey)
-      })
-    } else if (client._queryQueue.indexOf(query) !== -1) {
-      client._queryQueue.splice(client._queryQueue.indexOf(query), 1)
-    } else if (client._sentQueryQueue.indexOf(query) !== -1) {
-      // Query already sent on wire — can't remove it without corrupting the
-      // pipeline. No-op the callback so the result is silently discarded.
-      query.callback = () => {}
-    }
-  }
-
-  setTypeParser(oid, format, parseFn) {
-    return this._types.setTypeParser(oid, format, parseFn)
-  }
-
-  getTypeParser(oid, format) {
-    return this._types.getTypeParser(oid, format)
-  }
-
-  // escapeIdentifier and escapeLiteral moved to utility functions & exported
-  // on PG
-  // re-exported here for backwards compatibility
-  escapeIdentifier(str) {
-    return utils.escapeIdentifier(str)
-  }
-
-  escapeLiteral(str) {
-    return utils.escapeLiteral(str)
-  }
-
-  _pulseQueryQueue() {
-    if (this.pipeline) {
-      this._pulsePipelinedQueryQueue()
-      return
-    }
-    if (this.readyForQuery === true) {
-      this._activeQuery = this._queryQueue.shift()
-      const activeQuery = this._getActiveQuery()
-      if (activeQuery) {
-        this.readyForQuery = false
-        this.hasExecuted = true
-
-        const queryError = activeQuery.submit(this.connection)
-        if (queryError) {
-          process.nextTick(() => {
-            activeQuery.handleError(queryError, this.connection)
-            this.readyForQuery = true
-            this._pulseQueryQueue()
-          })
-        }
-      } else if (this.hasExecuted) {
-        this._activeQuery = null
-        this.emit('drain')
-      }
-    }
-  }
-
-  _pulsePipelinedQueryQueue() {
-    if (!this._connected || !this._queryable) {
-      return
-    }
-    while (this._queryQueue.length > 0) {
-      const query = this._queryQueue.shift()
-      this.hasExecuted = true
-      const queryError = query.submit(this.connection)
-      if (queryError) {
-        process.nextTick(() => {
-          query.handleError(queryError, this.connection)
-        })
-        continue
-      }
-      this._sentQueryQueue.push(query)
-    }
-    if (this.readyForQuery && !this._activeQuery && this._sentQueryQueue.length > 0) {
-      this._activeQuery = this._sentQueryQueue.shift()
-      this.readyForQuery = false
-    }
-    if (!this._activeQuery && this._sentQueryQueue.length === 0 && this._queryQueue.length === 0 && this.hasExecuted) {
-      this.emit('drain')
-    }
-  }
-
-  query(config, values, callback) {
-    // can take in strings, config object or query object
-    let query
-    let result
-
-    if (config == null) {
-      throw new TypeError('Client was passed a null or undefined query')
-    }
-
-    if (typeof config.submit === 'function') {
-      result = query = config
-      if (!query.callback) {
-        if (typeof values === 'function') {
-          query.callback = values
-        } else if (callback) {
-          query.callback = callback
-        }
-      }
-    } else {
-      query = new Query(config, values, callback)
-      if (!query.callback) {
-        result = new this._Promise((resolve, reject) => {
-          query.callback = (err, res) => (err ? reject(err) : resolve(res))
-        }).catch((err) => {
-          // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
-          // application that created the query
-          Error.captureStackTrace(err)
-          throw err
-        })
-      } else if (typeof query.callback !== 'function') {
-        throw new TypeError('callback is not a function')
-      }
-    }
-
-    const readTimeout = config.query_timeout || this.connectionParameters.query_timeout
-    if (readTimeout) {
-      const queryCallback = query.callback || (() => {})
-
-      const readTimeoutTimer = setTimeout(() => {
-        const error = new Error('Query read timeout')
-
-        process.nextTick(() => {
-          query.handleError(error, this.connection)
-        })
-
-        queryCallback(error)
-
-        // we already returned an error,
-        // just do nothing if query completes
-        query.callback = () => {}
-
-        // Remove from queue (only safe if not yet sent)
-        const index = this._queryQueue.indexOf(query)
-        if (index > -1) {
-          this._queryQueue.splice(index, 1)
-        } else if (this.pipeline) {
-          // Query already sent — the pipeline is blocked until it completes.
-          // Destroy the connection to unblock all remaining pipelined queries.
-          this.connection.stream.destroy()
-          return
-        }
-
-        this._pulseQueryQueue()
-      }, readTimeout)
-
-      query.callback = (err, res) => {
-        clearTimeout(readTimeoutTimer)
-        queryCallback(err, res)
-      }
-    }
-
-    if (this.binary && !query.binary) {
-      query.binary = true
-    }
-
-    if (query._result && !query._result._types) {
-      query._result._types = this._types
-    }
-
-    if (!this._queryable) {
-      process.nextTick(() => {
-        query.handleError(new Error('Client has encountered a connection error and is not queryable'), this.connection)
-      })
-      return result
-    }
-
-    if (this._ending) {
-      process.nextTick(() => {
-        query.handleError(new Error('Client was closed and is not queryable'), this.connection)
-      })
-      return result
-    }
-
-    if (this._queryQueue.length > 0 && !this.pipeline) {
-      queryQueueLengthDeprecationNotice()
-    }
-    this._queryQueue.push(query)
-    this._pulseQueryQueue()
-    return result
-  }
-
-  ref() {
-    this.connection.ref()
-  }
-
-  unref() {
-    this.connection.unref()
-  }
-
-  getTransactionStatus() {
-    return this._txStatus
-  }
-
-  end(cb) {
-    this._ending = true
-
-    // if we have never connected, then end is a noop, callback immediately
-    if (!this.connection._connecting || this._ended) {
-      if (cb) {
-        cb()
-        return
-      } else {
-        return this._Promise.resolve()
-      }
-    }
-
-    if (!this._queryable) {
-      // socket is dead — force close
-      this.connection.stream.destroy()
-    } else if (
-      this.pipeline &&
-      (this._getActiveQuery() || this._sentQueryQueue.length > 0 || this._queryQueue.length > 0)
-    ) {
-      // pipelined queries are already on the wire (or queued to send) and will
-      // complete normally; wait for drain then do a graceful goodbye
-      this.once('drain', () => this.connection.end())
-    } else if (this._getActiveQuery()) {
-      // non-pipeline: a hung query could block end forever — force disconnect
-      this.connection.stream.destroy()
-    } else {
-      this.connection.end()
-    }
-
-    if (cb) {
-      this.connection.once('end', cb)
-    } else {
-      return new this._Promise((resolve) => {
-        this.connection.once('end', resolve)
-      })
-    }
-  }
-  get queryQueue() {
-    queryQueueDeprecationNotice()
-    return this._queryQueue
-  }
-}
-
-// expose a Query constructor
-Client.Query = Query
-
-module.exports = Client
Index: de_modules/pg/lib/connection-parameters.js
===================================================================
--- node_modules/pg/lib/connection-parameters.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,184 +1,0 @@
-'use strict'
-
-const dns = require('dns')
-
-const defaults = require('./defaults')
-
-const parse = require('pg-connection-string').parse // parses a connection string
-
-const val = function (key, config, envVar) {
-  if (config[key]) {
-    return config[key]
-  }
-
-  if (envVar === undefined) {
-    envVar = process.env['PG' + key.toUpperCase()]
-  } else if (envVar === false) {
-    // do nothing ... use false
-  } else {
-    envVar = process.env[envVar]
-  }
-
-  return envVar || defaults[key]
-}
-
-const readSSLConfigFromEnvironment = function () {
-  switch (process.env.PGSSLMODE) {
-    case 'disable':
-      return false
-    case 'prefer':
-    case 'require':
-    case 'verify-ca':
-    case 'verify-full':
-      return true
-    case 'no-verify':
-      return { rejectUnauthorized: false }
-  }
-  return defaults.ssl
-}
-
-// Convert arg to a string, surround in single quotes, and escape single quotes and backslashes
-const quoteParamValue = function (value) {
-  return "'" + ('' + value).replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'"
-}
-
-const add = function (params, config, paramName) {
-  const value = config[paramName]
-  if (value !== undefined && value !== null) {
-    params.push(paramName + '=' + quoteParamValue(value))
-  }
-}
-
-class ConnectionParameters {
-  constructor(config) {
-    // if a string is passed, it is a raw connection string so we parse it into a config
-    config = typeof config === 'string' ? parse(config) : config || {}
-
-    // if the config has a connectionString defined, parse IT into the config we use
-    // this will override other default values with what is stored in connectionString
-    if (config.connectionString) {
-      config = Object.assign({}, config, parse(config.connectionString))
-    }
-
-    this.user = val('user', config)
-    this.database = val('database', config)
-
-    if (this.database === undefined) {
-      this.database = this.user
-    }
-
-    this.port = parseInt(val('port', config), 10)
-    this.host = val('host', config)
-
-    // "hiding" the password so it doesn't show up in stack traces
-    // or if the client is console.logged
-    Object.defineProperty(this, 'password', {
-      configurable: true,
-      enumerable: false,
-      writable: true,
-      value: val('password', config),
-    })
-
-    this.binary = val('binary', config)
-    this.options = val('options', config)
-
-    this.ssl = typeof config.ssl === 'undefined' ? readSSLConfigFromEnvironment() : config.ssl
-
-    if (typeof this.ssl === 'string') {
-      if (this.ssl === 'true') {
-        this.ssl = true
-      }
-    }
-    // support passing in ssl=no-verify via connection string
-    if (this.ssl === 'no-verify') {
-      this.ssl = { rejectUnauthorized: false }
-    }
-    if (this.ssl && this.ssl.key) {
-      Object.defineProperty(this.ssl, 'key', {
-        enumerable: false,
-      })
-    }
-
-    // How to negotiate SSL: 'postgres' (default, the traditional SSLRequest
-    // handshake) or 'direct' (start the TLS handshake immediately on connect).
-    this.sslnegotiation = val('sslnegotiation', config, 'PGSSLNEGOTIATION')
-    if (this.sslnegotiation !== undefined && this.sslnegotiation !== 'postgres' && this.sslnegotiation !== 'direct') {
-      throw new Error(
-        `Invalid sslnegotiation value: "${this.sslnegotiation}". Valid values are "postgres" and "direct".`
-      )
-    }
-    if (this.sslnegotiation === 'direct' && !this.ssl) {
-      throw new Error('sslnegotiation=direct requires SSL to be enabled')
-    }
-
-    this.client_encoding = val('client_encoding', config)
-    this.replication = val('replication', config)
-    // a domain socket begins with '/'
-    this.isDomainSocket = !(this.host || '').indexOf('/')
-
-    this.application_name = val('application_name', config, 'PGAPPNAME')
-    this.fallback_application_name = val('fallback_application_name', config, false)
-    this.statement_timeout = val('statement_timeout', config, false)
-    this.lock_timeout = val('lock_timeout', config, false)
-    this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)
-    this.query_timeout = val('query_timeout', config, false)
-
-    if (config.connectionTimeoutMillis === undefined) {
-      this.connect_timeout = process.env.PGCONNECT_TIMEOUT || 0
-    } else {
-      this.connect_timeout = Math.floor(config.connectionTimeoutMillis / 1000)
-    }
-
-    if (config.keepAlive === false) {
-      this.keepalives = 0
-    } else if (config.keepAlive === true) {
-      this.keepalives = 1
-    }
-
-    if (typeof config.keepAliveInitialDelayMillis === 'number') {
-      this.keepalives_idle = Math.floor(config.keepAliveInitialDelayMillis / 1000)
-    }
-  }
-
-  getLibpqConnectionString(cb) {
-    const params = []
-    add(params, this, 'user')
-    add(params, this, 'password')
-    add(params, this, 'port')
-    add(params, this, 'application_name')
-    add(params, this, 'fallback_application_name')
-    add(params, this, 'connect_timeout')
-    add(params, this, 'options')
-
-    const ssl = typeof this.ssl === 'object' ? this.ssl : this.ssl ? { sslmode: this.ssl } : {}
-    add(params, ssl, 'sslmode')
-    add(params, ssl, 'sslca')
-    add(params, ssl, 'sslkey')
-    add(params, ssl, 'sslcert')
-    add(params, ssl, 'sslrootcert')
-    add(params, this, 'sslnegotiation')
-
-    if (this.database) {
-      params.push('dbname=' + quoteParamValue(this.database))
-    }
-    if (this.replication) {
-      params.push('replication=' + quoteParamValue(this.replication))
-    }
-    if (this.host) {
-      params.push('host=' + quoteParamValue(this.host))
-    }
-    if (this.isDomainSocket) {
-      return cb(null, params.join(' '))
-    }
-    if (this.client_encoding) {
-      params.push('client_encoding=' + quoteParamValue(this.client_encoding))
-    }
-    dns.lookup(this.host, function (err, address) {
-      if (err) return cb(err, null)
-      params.push('hostaddr=' + quoteParamValue(address))
-      return cb(null, params.join(' '))
-    })
-  }
-}
-
-module.exports = ConnectionParameters
Index: de_modules/pg/lib/connection.js
===================================================================
--- node_modules/pg/lib/connection.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,243 +1,0 @@
-'use strict'
-
-const EventEmitter = require('events').EventEmitter
-
-const { parse, serialize } = require('pg-protocol')
-const stream = require('./stream')
-const { getStream } = stream
-
-const flushBuffer = serialize.flush()
-const syncBuffer = serialize.sync()
-const endBuffer = serialize.end()
-
-// TODO(bmc) support binary mode at some point
-class Connection extends EventEmitter {
-  constructor(config) {
-    super()
-    config = config || {}
-
-    this.stream = config.stream || getStream(config.ssl)
-    if (typeof this.stream === 'function') {
-      this.stream = this.stream(config)
-    }
-
-    this._keepAlive = config.keepAlive
-    this._keepAliveInitialDelayMillis = config.keepAliveInitialDelayMillis
-    this.parsedStatements = {}
-    this.submittedNamedStatements = {}
-    this.ssl = config.ssl || false
-    this.sslNegotiation = config.sslNegotiation || 'postgres'
-    this._ending = false
-    this._emitMessage = false
-    const self = this
-    this.on('newListener', function (eventName) {
-      if (eventName === 'message') {
-        self._emitMessage = true
-      }
-    })
-  }
-
-  connect(port, host) {
-    const self = this
-
-    this._connecting = true
-    this.stream.setNoDelay(true)
-    this.stream.connect(port, host)
-
-    this.stream.once('connect', function () {
-      if (self._keepAlive) {
-        self.stream.setKeepAlive(true, self._keepAliveInitialDelayMillis)
-      }
-      self.emit('connect')
-    })
-
-    const reportStreamError = function (error) {
-      // errors about disconnections should be ignored during disconnect
-      if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) {
-        return
-      }
-      self.emit('error', error)
-    }
-    this.stream.on('error', reportStreamError)
-
-    this.stream.on('close', function () {
-      self.emit('end')
-    })
-
-    if (!this.ssl) {
-      return this.attachListeners(this.stream)
-    }
-
-    // With direct SSL negotiation the TLS handshake starts immediately on the
-    // raw socket, skipping the SSLRequest packet and the server's 'S'/'N' reply.
-    if (this.sslNegotiation === 'direct') {
-      return this.stream.once('connect', function () {
-        self.upgradeToSSL(host, reportStreamError)
-      })
-    }
-
-    this.stream.once('data', function (buffer) {
-      const responseCode = buffer.toString('utf8')
-      switch (responseCode) {
-        case 'S': // Server supports SSL connections, continue with a secure connection
-          break
-        case 'N': // Server does not support SSL connections
-          self.stream.end()
-          return self.emit('error', new Error('The server does not support SSL connections'))
-        default:
-          // Any other response byte, including 'E' (ErrorResponse) indicating a server error
-          self.stream.end()
-          return self.emit('error', new Error('There was an error establishing an SSL connection'))
-      }
-      self.upgradeToSSL(host, reportStreamError)
-    })
-  }
-
-  upgradeToSSL(host, reportStreamError) {
-    const self = this
-    const options = {
-      socket: self.stream,
-    }
-
-    if (self.ssl !== true) {
-      Object.assign(options, self.ssl)
-
-      if ('key' in self.ssl) {
-        options.key = self.ssl.key
-      }
-    }
-
-    // Direct SSL negotiation requires ALPN so the server can confirm it is
-    // speaking the PostgreSQL protocol over the TLS connection.
-    if (self.sslNegotiation === 'direct') {
-      options.ALPNProtocols = ['postgresql']
-    }
-
-    const net = require('net')
-    if (net.isIP && net.isIP(host) === 0) {
-      options.servername = host
-    }
-    try {
-      self.stream = stream.getSecureStream(options)
-    } catch (err) {
-      return self.emit('error', err)
-    }
-    self.attachListeners(self.stream)
-    self.stream.on('error', reportStreamError)
-
-    self.emit('sslconnect')
-  }
-
-  attachListeners(stream) {
-    parse(stream, (msg) => {
-      const eventName = msg.name === 'error' ? 'errorMessage' : msg.name
-      if (this._emitMessage) {
-        this.emit('message', msg)
-      }
-      this.emit(eventName, msg)
-    })
-  }
-
-  requestSsl() {
-    this.stream.write(serialize.requestSsl())
-  }
-
-  startup(config) {
-    this.stream.write(serialize.startup(config))
-  }
-
-  cancel(processID, secretKey) {
-    this._send(serialize.cancel(processID, secretKey))
-  }
-
-  password(password) {
-    this._send(serialize.password(password))
-  }
-
-  sendSASLInitialResponseMessage(mechanism, initialResponse) {
-    this._send(serialize.sendSASLInitialResponseMessage(mechanism, initialResponse))
-  }
-
-  sendSCRAMClientFinalMessage(additionalData) {
-    this._send(serialize.sendSCRAMClientFinalMessage(additionalData))
-  }
-
-  _send(buffer) {
-    if (!this.stream.writable) {
-      return false
-    }
-    return this.stream.write(buffer)
-  }
-
-  query(text) {
-    this._send(serialize.query(text))
-  }
-
-  // send parse message
-  parse(query) {
-    this._send(serialize.parse(query))
-  }
-
-  // send bind message
-  bind(config) {
-    this._send(serialize.bind(config))
-  }
-
-  // send execute message
-  execute(config) {
-    this._send(serialize.execute(config))
-  }
-
-  flush() {
-    if (this.stream.writable) {
-      this.stream.write(flushBuffer)
-    }
-  }
-
-  sync() {
-    this._ending = true
-    this._send(syncBuffer)
-  }
-
-  ref() {
-    this.stream.ref()
-  }
-
-  unref() {
-    this.stream.unref()
-  }
-
-  end() {
-    // 0x58 = 'X'
-    this._ending = true
-    if (!this._connecting || !this.stream.writable) {
-      this.stream.end()
-      return
-    }
-    return this.stream.write(endBuffer, () => {
-      this.stream.end()
-    })
-  }
-
-  close(msg) {
-    this._send(serialize.close(msg))
-  }
-
-  describe(msg) {
-    this._send(serialize.describe(msg))
-  }
-
-  sendCopyFromChunk(chunk) {
-    this._send(serialize.copyData(chunk))
-  }
-
-  endCopyFrom() {
-    this._send(serialize.copyDone())
-  }
-
-  sendCopyFail(msg) {
-    this._send(serialize.copyFail(msg))
-  }
-}
-
-module.exports = Connection
Index: de_modules/pg/lib/crypto/cert-signatures.js
===================================================================
--- node_modules/pg/lib/crypto/cert-signatures.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,122 +1,0 @@
-function x509Error(msg, cert) {
-  return new Error('SASL channel binding: ' + msg + ' when parsing public certificate ' + cert.toString('base64'))
-}
-
-function readASN1Length(data, index) {
-  let length = data[index++]
-  if (length < 0x80) return { length, index }
-
-  const lengthBytes = length & 0x7f
-  if (lengthBytes > 4) throw x509Error('bad length', data)
-
-  length = 0
-  for (let i = 0; i < lengthBytes; i++) {
-    length = (length << 8) | data[index++]
-  }
-
-  return { length, index }
-}
-
-function readASN1OID(data, index) {
-  if (data[index++] !== 0x6) throw x509Error('non-OID data', data) // 6 = OID
-
-  const { length: OIDLength, index: indexAfterOIDLength } = readASN1Length(data, index)
-  index = indexAfterOIDLength
-  const lastIndex = index + OIDLength
-
-  const byte1 = data[index++]
-  let oid = ((byte1 / 40) >> 0) + '.' + (byte1 % 40)
-
-  while (index < lastIndex) {
-    // loop over numbers in OID
-    let value = 0
-    while (index < lastIndex) {
-      // loop over bytes in number
-      const nextByte = data[index++]
-      value = (value << 7) | (nextByte & 0x7f)
-      if (nextByte < 0x80) break
-    }
-    oid += '.' + value
-  }
-
-  return { oid, index }
-}
-
-function expectASN1Seq(data, index) {
-  if (data[index++] !== 0x30) throw x509Error('non-sequence data', data) // 30 = Sequence
-  return readASN1Length(data, index)
-}
-
-function signatureAlgorithmHashFromCertificate(data, index) {
-  // read this thread: https://www.postgresql.org/message-id/17760-b6c61e752ec07060%40postgresql.org
-  if (index === undefined) index = 0
-  index = expectASN1Seq(data, index).index
-  const { length: certInfoLength, index: indexAfterCertInfoLength } = expectASN1Seq(data, index)
-  index = indexAfterCertInfoLength + certInfoLength // skip over certificate info
-  index = expectASN1Seq(data, index).index // skip over signature length field
-  const { oid, index: indexAfterOID } = readASN1OID(data, index)
-  switch (oid) {
-    // RSA
-    case '1.2.840.113549.1.1.4':
-      return 'MD5'
-    case '1.2.840.113549.1.1.5':
-      return 'SHA-1'
-    case '1.2.840.113549.1.1.11':
-      return 'SHA-256'
-    case '1.2.840.113549.1.1.12':
-      return 'SHA-384'
-    case '1.2.840.113549.1.1.13':
-      return 'SHA-512'
-    case '1.2.840.113549.1.1.14':
-      return 'SHA-224'
-    case '1.2.840.113549.1.1.15':
-      return 'SHA512-224'
-    case '1.2.840.113549.1.1.16':
-      return 'SHA512-256'
-    // ECDSA
-    case '1.2.840.10045.4.1':
-      return 'SHA-1'
-    case '1.2.840.10045.4.3.1':
-      return 'SHA-224'
-    case '1.2.840.10045.4.3.2':
-      return 'SHA-256'
-    case '1.2.840.10045.4.3.3':
-      return 'SHA-384'
-    case '1.2.840.10045.4.3.4':
-      return 'SHA-512'
-    // RSASSA-PSS: hash is indicated separately
-    case '1.2.840.113549.1.1.10': {
-      index = indexAfterOID
-      index = expectASN1Seq(data, index).index
-      if (data[index++] !== 0xa0) throw x509Error('non-tag data', data) // a0 = constructed tag 0
-      index = readASN1Length(data, index).index // skip over tag length field
-      index = expectASN1Seq(data, index).index // skip over sequence length field
-      const { oid: hashOID } = readASN1OID(data, index)
-      switch (hashOID) {
-        // standalone hash OIDs
-        case '1.2.840.113549.2.5':
-          return 'MD5'
-        case '1.3.14.3.2.26':
-          return 'SHA-1'
-        case '2.16.840.1.101.3.4.2.1':
-          return 'SHA-256'
-        case '2.16.840.1.101.3.4.2.2':
-          return 'SHA-384'
-        case '2.16.840.1.101.3.4.2.3':
-          return 'SHA-512'
-      }
-      throw x509Error('unknown hash OID ' + hashOID, data)
-    }
-    // Ed25519 -- see https: return//github.com/openssl/openssl/issues/15477
-    case '1.3.101.110':
-    case '1.3.101.112': // ph
-      return 'SHA-512'
-    // Ed448 -- still not in pg 17.2 (if supported, digest would be SHAKE256 x 64 bytes)
-    case '1.3.101.111':
-    case '1.3.101.113': // ph
-      throw x509Error('Ed448 certificate channel binding is not currently supported by Postgres')
-  }
-  throw x509Error('unknown OID ' + oid, data)
-}
-
-module.exports = { signatureAlgorithmHashFromCertificate }
Index: de_modules/pg/lib/crypto/sasl.js
===================================================================
--- node_modules/pg/lib/crypto/sasl.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,262 +1,0 @@
-'use strict'
-const crypto = require('./utils')
-const { signatureAlgorithmHashFromCertificate } = require('./cert-signatures')
-
-// SASLprep (RFC 4013) — minimal in-tree implementation.
-//
-// Per RFC 5802 §2.2, the SCRAM-SHA-256 client must normalize the password via
-// SASLprep before feeding it into PBKDF2. PostgreSQL's server applies the same
-// SASLprep when computing the stored verifier, and libpq does the same client
-// side, so passwords whose NFKC form differs from the raw form
-// would otherwise authenticate against psql/libpq but fail against pg with `28P01`.
-//
-// We deliberately implement only the three steps that change the byte content:
-//   1. RFC 3454 Table C.1.2 (non-ASCII space) → U+0020 SPACE.
-//   2. RFC 3454 Table B.1 (commonly mapped to nothing) → empty.
-//   3. NFKC normalization.
-// We skip the prohibition (RFC 4013 §2.3) and bidi (RFC 3454 §6) checks.
-// libpq is forgiving on those paths and Postgres's own SASLprep matches that
-// leniency for legacy roles, so omitting the rejection logic keeps existing
-// roles working without adding complexity.
-function saslprep(password) {
-  // RFC 3454 Table C.1.2 — non-ASCII space characters, mapped to U+0020.
-  const nonAsciiSpace = /[\u00A0\u1680\u2000-\u200B\u202F\u205F\u3000]/g
-  // RFC 3454 Table B.1 — "commonly mapped to nothing". The set intentionally
-  // contains zero-width joiners and variation selectors — the very characters
-  // ESLint's no-misleading-character-class warns about — because they combine
-  // with their neighbors and the RFC strips them for that reason.
-  // eslint-disable-next-line no-misleading-character-class
-  const mappedToNothing = /[\u00AD\u034F\u1806\u180B\u180C\u180D\u200C\u200D\u2060\uFE00-\uFE0F\uFEFF]/g
-  return password.replace(nonAsciiSpace, ' ').replace(mappedToNothing, '').normalize('NFKC')
-}
-
-const DEFAULT_MAX_SCRAM_ITERATIONS = 100000
-
-function startSession(mechanisms, stream, scramMaxIterations = DEFAULT_MAX_SCRAM_ITERATIONS) {
-  const candidates = ['SCRAM-SHA-256']
-  if (stream) candidates.unshift('SCRAM-SHA-256-PLUS') // higher-priority, so placed first
-
-  const mechanism = candidates.find((candidate) => mechanisms.includes(candidate))
-
-  if (!mechanism) {
-    throw new Error('SASL: Only mechanism(s) ' + candidates.join(' and ') + ' are supported')
-  }
-
-  if (mechanism === 'SCRAM-SHA-256-PLUS' && typeof stream.getPeerCertificate !== 'function') {
-    // this should never happen if we are really talking to a Postgres server
-    throw new Error('SASL: Mechanism SCRAM-SHA-256-PLUS requires a certificate')
-  }
-
-  const clientNonce = crypto.randomBytes(18).toString('base64')
-  const gs2Header = mechanism === 'SCRAM-SHA-256-PLUS' ? 'p=tls-server-end-point' : stream ? 'y' : 'n'
-
-  return {
-    mechanism,
-    clientNonce,
-    response: gs2Header + ',,n=*,r=' + clientNonce,
-    message: 'SASLInitialResponse',
-    scramMaxIterations,
-  }
-}
-
-async function continueSession(session, password, serverData, stream) {
-  if (session.message !== 'SASLInitialResponse') {
-    throw new Error('SASL: Last message was not SASLInitialResponse')
-  }
-  if (typeof password !== 'string') {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')
-  }
-  if (password === '') {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a non-empty string')
-  }
-  if (typeof serverData !== 'string') {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: serverData must be a string')
-  }
-
-  const sv = parseServerFirstMessage(serverData)
-
-  if (!sv.nonce.startsWith(session.clientNonce)) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce does not start with client nonce')
-  } else if (sv.nonce.length === session.clientNonce.length) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short')
-  }
-
-  const scramMaxIterations =
-    typeof session.scramMaxIterations === 'number' ? session.scramMaxIterations : DEFAULT_MAX_SCRAM_ITERATIONS
-  // a value of 0 disables the iteration count check
-  if (scramMaxIterations !== 0 && sv.iteration > scramMaxIterations) {
-    throw new Error(
-      'SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration count ' +
-        sv.iteration +
-        ' exceeds scramMaxIterations of ' +
-        scramMaxIterations
-    )
-  }
-
-  const clientFirstMessageBare = 'n=*,r=' + session.clientNonce
-  const serverFirstMessage = 'r=' + sv.nonce + ',s=' + sv.salt + ',i=' + sv.iteration
-
-  // without channel binding:
-  let channelBinding = stream ? 'eSws' : 'biws' // 'y,,' or 'n,,', base64-encoded
-
-  // override if channel binding is in use:
-  if (session.mechanism === 'SCRAM-SHA-256-PLUS') {
-    const peerCert = stream.getPeerCertificate().raw
-    let hashName = signatureAlgorithmHashFromCertificate(peerCert)
-    if (hashName === 'MD5' || hashName === 'SHA-1') hashName = 'SHA-256'
-    const certHash = await crypto.hashByName(hashName, peerCert)
-    const bindingData = Buffer.concat([Buffer.from('p=tls-server-end-point,,'), Buffer.from(certHash)])
-    channelBinding = bindingData.toString('base64')
-  }
-
-  const clientFinalMessageWithoutProof = 'c=' + channelBinding + ',r=' + sv.nonce
-  const authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof
-
-  const saltBytes = Buffer.from(sv.salt, 'base64')
-  const saltedPassword = await crypto.deriveKey(saslprep(password), saltBytes, sv.iteration)
-  const clientKey = await crypto.hmacSha256(saltedPassword, 'Client Key')
-  const storedKey = await crypto.sha256(clientKey)
-  const clientSignature = await crypto.hmacSha256(storedKey, authMessage)
-  const clientProof = xorBuffers(Buffer.from(clientKey), Buffer.from(clientSignature)).toString('base64')
-  const serverKey = await crypto.hmacSha256(saltedPassword, 'Server Key')
-  const serverSignatureBytes = await crypto.hmacSha256(serverKey, authMessage)
-
-  session.message = 'SASLResponse'
-  session.serverSignature = Buffer.from(serverSignatureBytes).toString('base64')
-  session.response = clientFinalMessageWithoutProof + ',p=' + clientProof
-}
-
-function finalizeSession(session, serverData) {
-  if (session.message !== 'SASLResponse') {
-    throw new Error('SASL: Last message was not SASLResponse')
-  }
-  if (typeof serverData !== 'string') {
-    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: serverData must be a string')
-  }
-
-  const { serverSignature } = parseServerFinalMessage(serverData)
-
-  if (serverSignature !== session.serverSignature) {
-    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature does not match')
-  }
-}
-
-/**
- * printable       = %x21-2B / %x2D-7E
- *                   ;; Printable ASCII except ",".
- *                   ;; Note that any "printable" is also
- *                   ;; a valid "value".
- */
-function isPrintableChars(text) {
-  if (typeof text !== 'string') {
-    throw new TypeError('SASL: text must be a string')
-  }
-  return text
-    .split('')
-    .map((_, i) => text.charCodeAt(i))
-    .every((c) => (c >= 0x21 && c <= 0x2b) || (c >= 0x2d && c <= 0x7e))
-}
-
-/**
- * base64-char     = ALPHA / DIGIT / "/" / "+"
- *
- * base64-4        = 4base64-char
- *
- * base64-3        = 3base64-char "="
- *
- * base64-2        = 2base64-char "=="
- *
- * base64          = *base64-4 [base64-3 / base64-2]
- */
-function isBase64(text) {
-  return /^(?:[a-zA-Z0-9+/]{4})*(?:[a-zA-Z0-9+/]{2}==|[a-zA-Z0-9+/]{3}=)?$/.test(text)
-}
-
-function parseAttributePairs(text) {
-  if (typeof text !== 'string') {
-    throw new TypeError('SASL: attribute pairs text must be a string')
-  }
-
-  return new Map(
-    text.split(',').map((attrValue) => {
-      if (!/^.=/.test(attrValue)) {
-        throw new Error('SASL: Invalid attribute pair entry')
-      }
-      const name = attrValue[0]
-      const value = attrValue.substring(2)
-      return [name, value]
-    })
-  )
-}
-
-function parseServerFirstMessage(data) {
-  const attrPairs = parseAttributePairs(data)
-
-  const nonce = attrPairs.get('r')
-  if (!nonce) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce missing')
-  } else if (!isPrintableChars(nonce)) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce must only contain printable characters')
-  }
-  const salt = attrPairs.get('s')
-  if (!salt) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt missing')
-  } else if (!isBase64(salt)) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt must be base64')
-  }
-  const iterationText = attrPairs.get('i')
-  if (!iterationText) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration missing')
-  } else if (!/^[1-9][0-9]*$/.test(iterationText)) {
-    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: invalid iteration count')
-  }
-  const iteration = parseInt(iterationText, 10)
-
-  return {
-    nonce,
-    salt,
-    iteration,
-  }
-}
-
-function parseServerFinalMessage(serverData) {
-  const attrPairs = parseAttributePairs(serverData)
-  const error = attrPairs.get('e')
-  const serverSignature = attrPairs.get('v')
-
-  if (error) {
-    throw new Error(`SASL: SCRAM-SERVER-FINAL-MESSAGE: server returned error: "${error}"`)
-  }
-
-  if (!serverSignature) {
-    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature is missing')
-  } else if (!isBase64(serverSignature)) {
-    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature must be base64')
-  }
-  return {
-    serverSignature,
-  }
-}
-
-function xorBuffers(a, b) {
-  if (!Buffer.isBuffer(a)) {
-    throw new TypeError('first argument must be a Buffer')
-  }
-  if (!Buffer.isBuffer(b)) {
-    throw new TypeError('second argument must be a Buffer')
-  }
-  if (a.length !== b.length) {
-    throw new Error('Buffer lengths must match')
-  }
-  if (a.length === 0) {
-    throw new Error('Buffers cannot be empty')
-  }
-  return Buffer.from(a.map((_, i) => a[i] ^ b[i]))
-}
-
-module.exports = {
-  startSession,
-  continueSession,
-  finalizeSession,
-  DEFAULT_MAX_SCRAM_ITERATIONS,
-}
Index: de_modules/pg/lib/crypto/utils.js
===================================================================
--- node_modules/pg/lib/crypto/utils.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,89 +1,0 @@
-const nodeCrypto = require('crypto')
-
-module.exports = {
-  postgresMd5PasswordHash,
-  randomBytes,
-  deriveKey,
-  sha256,
-  hashByName,
-  hmacSha256,
-  md5,
-}
-
-/**
- * The Web Crypto API - grabbed from the Node.js library or the global
- * @type Crypto
- */
-// eslint-disable-next-line no-undef
-const webCrypto = nodeCrypto.webcrypto || globalThis.crypto
-/**
- * The SubtleCrypto API for low level crypto operations.
- * @type SubtleCrypto
- */
-const subtleCrypto = webCrypto.subtle
-const textEncoder = new TextEncoder()
-
-/**
- *
- * @param {*} length
- * @returns
- */
-function randomBytes(length) {
-  return webCrypto.getRandomValues(Buffer.alloc(length))
-}
-
-async function md5(string) {
-  try {
-    return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
-  } catch (e) {
-    // `createHash()` failed so we are probably not in Node.js, use the WebCrypto API instead.
-    // Note that the MD5 algorithm on WebCrypto is not available in Node.js.
-    // This is why we cannot just use WebCrypto in all environments.
-    const data = typeof string === 'string' ? textEncoder.encode(string) : string
-    const hash = await subtleCrypto.digest('MD5', data)
-    return Array.from(new Uint8Array(hash))
-      .map((b) => b.toString(16).padStart(2, '0'))
-      .join('')
-  }
-}
-
-// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
-async function postgresMd5PasswordHash(user, password, salt) {
-  const inner = await md5(password + user)
-  const outer = await md5(Buffer.concat([Buffer.from(inner), salt]))
-  return 'md5' + outer
-}
-
-/**
- * Create a SHA-256 digest of the given data
- * @param {Buffer} data
- */
-async function sha256(text) {
-  return await subtleCrypto.digest('SHA-256', text)
-}
-
-async function hashByName(hashName, text) {
-  return await subtleCrypto.digest(hashName, text)
-}
-
-/**
- * Sign the message with the given key
- * @param {ArrayBuffer} keyBuffer
- * @param {string} msg
- */
-async function hmacSha256(keyBuffer, msg) {
-  const key = await subtleCrypto.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])
-  return await subtleCrypto.sign('HMAC', key, textEncoder.encode(msg))
-}
-
-/**
- * Derive a key from the password and salt
- * @param {string} password
- * @param {Uint8Array} salt
- * @param {number} iterations
- */
-async function deriveKey(password, salt, iterations) {
-  const key = await subtleCrypto.importKey('raw', textEncoder.encode(password), 'PBKDF2', false, ['deriveBits'])
-  const params = { name: 'PBKDF2', hash: 'SHA-256', salt: salt, iterations: iterations }
-  return await subtleCrypto.deriveBits(params, key, 32 * 8, ['deriveBits'])
-}
Index: de_modules/pg/lib/defaults.js
===================================================================
--- node_modules/pg/lib/defaults.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,94 +1,0 @@
-'use strict'
-
-let user
-try {
-  user = process.platform === 'win32' ? process.env.USERNAME : process.env.USER
-} catch {
-  // ignore, e.g., Deno without --allow-env
-}
-
-module.exports = {
-  // database host. defaults to localhost
-  host: 'localhost',
-
-  // database user's name
-  user,
-
-  // name of database to connect
-  database: undefined,
-
-  // database user's password
-  password: null,
-
-  // a Postgres connection string to be used instead of setting individual connection items
-  // NOTE:  Setting this value will cause it to override any other value (such as database or user) defined
-  // in the defaults object.
-  connectionString: undefined,
-
-  // database port
-  port: 5432,
-
-  // number of rows to return at a time from a prepared statement's
-  // portal. 0 will return all rows at once
-  rows: 0,
-
-  // binary result mode
-  binary: false,
-
-  // Connection pool options - see https://github.com/brianc/node-pg-pool
-
-  // number of connections to use in connection pool
-  // 0 will disable connection pooling
-  max: 10,
-
-  // max milliseconds a client can go unused before it is removed
-  // from the pool and destroyed
-  idleTimeoutMillis: 30000,
-
-  client_encoding: '',
-
-  ssl: false,
-
-  // SSL negotiation style: 'postgres' (traditional SSLRequest) or 'direct'
-  sslnegotiation: undefined,
-
-  application_name: undefined,
-
-  fallback_application_name: undefined,
-
-  options: undefined,
-
-  parseInputDatesAsUTC: false,
-
-  // max milliseconds any query using this connection will execute for before timing out in error.
-  // false=unlimited
-  statement_timeout: false,
-
-  // Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.
-  // false=unlimited
-  lock_timeout: false,
-
-  // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds
-  // false=unlimited
-  idle_in_transaction_session_timeout: false,
-
-  // max milliseconds to wait for query to complete (client side)
-  query_timeout: false,
-
-  connect_timeout: 0,
-
-  keepalives: 1,
-
-  keepalives_idle: 0,
-}
-
-const pgTypes = require('pg-types')
-// save default parsers
-const parseBigInteger = pgTypes.getTypeParser(20, 'text')
-const parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')
-
-// parse int8 so you can get your count values as actual numbers
-module.exports.__defineSetter__('parseInt8', function (val) {
-  pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)
-  pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)
-})
Index: de_modules/pg/lib/index.js
===================================================================
--- node_modules/pg/lib/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,73 +1,0 @@
-'use strict'
-
-const Client = require('./client')
-const defaults = require('./defaults')
-const Connection = require('./connection')
-const Result = require('./result')
-const utils = require('./utils')
-const Pool = require('pg-pool')
-const TypeOverrides = require('./type-overrides')
-const { DatabaseError } = require('pg-protocol')
-const { escapeIdentifier, escapeLiteral } = require('./utils')
-
-const poolFactory = (Client) => {
-  return class BoundPool extends Pool {
-    constructor(options) {
-      super(options, Client)
-    }
-  }
-}
-
-const PG = function (clientConstructor) {
-  this.defaults = defaults
-  this.Client = clientConstructor
-  this.Query = this.Client.Query
-  this.Pool = poolFactory(this.Client)
-  this._pools = []
-  this.Connection = Connection
-  this.types = require('pg-types')
-  this.DatabaseError = DatabaseError
-  this.TypeOverrides = TypeOverrides
-  this.escapeIdentifier = escapeIdentifier
-  this.escapeLiteral = escapeLiteral
-  this.Result = Result
-  this.utils = utils
-}
-
-let clientConstructor = Client
-
-let forceNative = false
-try {
-  forceNative = !!process.env.NODE_PG_FORCE_NATIVE
-} catch {
-  // ignore, e.g., Deno without --allow-env
-}
-
-if (forceNative) {
-  clientConstructor = require('./native')
-}
-
-module.exports = new PG(clientConstructor)
-
-// lazy require native module...the native module may not have installed
-Object.defineProperty(module.exports, 'native', {
-  configurable: true,
-  enumerable: false,
-  get() {
-    let native = null
-    try {
-      native = new PG(require('./native'))
-    } catch (err) {
-      if (err.code !== 'MODULE_NOT_FOUND') {
-        throw err
-      }
-    }
-
-    // overwrite module.exports.native so that getter is never called again
-    Object.defineProperty(module.exports, 'native', {
-      value: native,
-    })
-
-    return native
-  },
-})
Index: de_modules/pg/lib/native/client.js
===================================================================
--- node_modules/pg/lib/native/client.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,420 +1,0 @@
-const nodeUtils = require('util')
-// eslint-disable-next-line
-var Native
-// eslint-disable-next-line no-useless-catch
-try {
-  // Wrap this `require()` in a try-catch to avoid upstream bundlers from complaining that this might not be available since it is an optional import
-  Native = require('pg-native')
-} catch (e) {
-  throw e
-}
-const TypeOverrides = require('../type-overrides')
-const EventEmitter = require('events').EventEmitter
-const util = require('util')
-const ConnectionParameters = require('../connection-parameters')
-
-const NativeQuery = require('./query')
-
-const queryQueueLengthDeprecationNotice = nodeUtils.deprecate(
-  () => {},
-  'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'
-)
-
-const Client = (module.exports = function (config) {
-  EventEmitter.call(this)
-  config = config || {}
-
-  this._Promise = config.Promise || global.Promise
-  this._types = new TypeOverrides(config.types)
-
-  this.native = new Native({
-    types: this._types,
-  })
-
-  this._queryQueue = []
-  this._ending = false
-  this._connecting = false
-  this._connected = false
-  this._queryable = true
-  this.pipeline = Boolean(config.pipeline)
-  this._pipelineInFlight = false
-
-  // keep these on the object for legacy reasons
-  // for the time being. TODO: deprecate all this jazz
-  const cp = (this.connectionParameters = new ConnectionParameters(config))
-  if (config.nativeConnectionString) cp.nativeConnectionString = config.nativeConnectionString
-  this.user = cp.user
-
-  // "hiding" the password so it doesn't show up in stack traces
-  // or if the client is console.logged
-  Object.defineProperty(this, 'password', {
-    configurable: true,
-    enumerable: false,
-    writable: true,
-    value: cp.password,
-  })
-  this.database = cp.database
-  this.host = cp.host
-  this.port = cp.port
-
-  // a hash to hold named queries
-  this.namedQueries = {}
-})
-
-Client.Query = NativeQuery
-
-util.inherits(Client, EventEmitter)
-
-Client.prototype._errorAllQueries = function (err) {
-  const enqueueError = (query) => {
-    process.nextTick(() => {
-      query.native = this.native
-      query.handleError(err)
-    })
-  }
-
-  if (this._hasActiveQuery()) {
-    enqueueError(this._activeQuery)
-    this._activeQuery = null
-  }
-
-  this._queryQueue.forEach(enqueueError)
-  this._queryQueue.length = 0
-}
-
-// connect to the backend
-// pass an optional callback to be called once connected
-// or with an error if there was a connection error
-Client.prototype._connect = function (cb) {
-  const self = this
-
-  if (this._connecting) {
-    process.nextTick(() => cb(new Error('Client has already been connected. You cannot reuse a client.')))
-    return
-  }
-
-  this._connecting = true
-
-  this.connectionParameters.getLibpqConnectionString(function (err, conString) {
-    if (self.connectionParameters.nativeConnectionString) conString = self.connectionParameters.nativeConnectionString
-    if (err) return cb(err)
-    self.native.connect(conString, function (err) {
-      if (err) {
-        self.native.end()
-        return cb(err)
-      }
-
-      // set internal states to connected
-      self._connected = true
-
-      // handle connection errors from the native layer
-      self.native.on('error', function (err) {
-        self._queryable = false
-        self._errorAllQueries(err)
-        self.emit('error', err)
-      })
-
-      self.native.on('notification', function (msg) {
-        self.emit('notification', {
-          channel: msg.relname,
-          payload: msg.extra,
-        })
-      })
-
-      // signal we are connected now
-      self.emit('connect')
-      self._pulseQueryQueue(true)
-
-      cb(null, this)
-    })
-  })
-}
-
-Client.prototype.connect = function (callback) {
-  if (callback) {
-    this._connect(callback)
-    return
-  }
-
-  return new this._Promise((resolve, reject) => {
-    this._connect((error) => {
-      if (error) {
-        reject(error)
-      } else {
-        resolve(this)
-      }
-    })
-  })
-}
-
-// send a query to the server
-// this method is highly overloaded to take
-// 1) string query, optional array of parameters, optional function callback
-// 2) object query with {
-//    string query
-//    optional array values,
-//    optional function callback instead of as a separate parameter
-//    optional string name to name & cache the query plan
-//    optional string rowMode = 'array' for an array of results
-//  }
-Client.prototype.query = function (config, values, callback) {
-  let query
-  let result
-  let readTimeout
-  let readTimeoutTimer
-  let queryCallback
-
-  if (config === null || config === undefined) {
-    throw new TypeError('Client was passed a null or undefined query')
-  } else if (typeof config.submit === 'function') {
-    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
-    result = query = config
-    // accept query(new Query(...), (err, res) => { }) style
-    if (typeof values === 'function') {
-      config.callback = values
-    }
-  } else {
-    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
-    query = new NativeQuery(config, values, callback)
-    if (!query.callback) {
-      let resolveOut, rejectOut
-      result = new this._Promise((resolve, reject) => {
-        resolveOut = resolve
-        rejectOut = reject
-      }).catch((err) => {
-        Error.captureStackTrace(err)
-        throw err
-      })
-      query.callback = (err, res) => (err ? rejectOut(err) : resolveOut(res))
-    }
-  }
-
-  if (readTimeout) {
-    queryCallback = query.callback || (() => {})
-
-    readTimeoutTimer = setTimeout(() => {
-      const error = new Error('Query read timeout')
-
-      process.nextTick(() => {
-        query.handleError(error, this.connection)
-      })
-
-      queryCallback(error)
-
-      // we already returned an error,
-      // just do nothing if query completes
-      query.callback = () => {}
-
-      // Remove from queue
-      const index = this._queryQueue.indexOf(query)
-      if (index > -1) {
-        this._queryQueue.splice(index, 1)
-      }
-
-      this._pulseQueryQueue()
-    }, readTimeout)
-
-    query.callback = (err, res) => {
-      clearTimeout(readTimeoutTimer)
-      queryCallback(err, res)
-    }
-  }
-
-  if (!this._queryable) {
-    query.native = this.native
-    process.nextTick(() => {
-      query.handleError(new Error('Client has encountered a connection error and is not queryable'))
-    })
-    return result
-  }
-
-  if (this._ending) {
-    query.native = this.native
-    process.nextTick(() => {
-      query.handleError(new Error('Client was closed and is not queryable'))
-    })
-    return result
-  }
-
-  if (this._queryQueue.length > 0 && !this.pipeline) {
-    queryQueueLengthDeprecationNotice()
-  }
-
-  this._queryQueue.push(query)
-  this._pulseQueryQueue()
-  return result
-}
-
-// disconnect from the backend server
-Client.prototype.end = function (cb) {
-  const self = this
-
-  this._ending = true
-
-  if (this._connecting && !this._connected) {
-    this.once('connect', () => {
-      this.end(() => {})
-    })
-  }
-  let result
-  if (!cb) {
-    result = new this._Promise(function (resolve, reject) {
-      cb = (err) => (err ? reject(err) : resolve())
-    })
-  }
-
-  const doEnd = function () {
-    self.native.end(function () {
-      self._connected = false
-
-      self._errorAllQueries(new Error('Connection terminated'))
-
-      process.nextTick(() => {
-        self.emit('end')
-        if (cb) cb()
-      })
-    })
-  }
-
-  // If pipeline has in-flight or queued queries, wait for them to drain before closing
-  if (this.pipeline && (this._pipelineInFlight || this._queryQueue.length > 0)) {
-    this.once('drain', doEnd)
-  } else {
-    doEnd()
-  }
-  return result
-}
-
-Client.prototype._hasActiveQuery = function () {
-  return this._activeQuery && this._activeQuery.state !== 'error' && this._activeQuery.state !== 'end'
-}
-
-Client.prototype._pulseQueryQueue = function (initialConnection) {
-  if (!this._connected) {
-    return
-  }
-  if (this.pipeline && !initialConnection) {
-    return this._pulsePipelinedQueryQueue()
-  }
-  if (this._hasActiveQuery()) {
-    return
-  }
-  const query = this._queryQueue.shift()
-  if (!query) {
-    if (!initialConnection) {
-      this.emit('drain')
-    }
-    return
-  }
-  this._activeQuery = query
-  query.submit(this)
-  const self = this
-  query.once('_done', function () {
-    self._pulseQueryQueue()
-  })
-}
-
-Client.prototype._pulsePipelinedQueryQueue = function () {
-  if (!this._connected || this._pipelineInFlight) {
-    return
-  }
-  if (this._queryQueue.length === 0) {
-    if (this.hasExecuted) {
-      this.emit('drain')
-    }
-    return
-  }
-
-  this._pipelineInFlight = true
-  const self = this
-  const queries = []
-  const nativeQueries = []
-  const utils = require('../utils')
-
-  while (this._queryQueue.length > 0) {
-    const query = this._queryQueue.shift()
-    this.hasExecuted = true
-    nativeQueries.push(query)
-
-    const values = query.values ? query.values.map(utils.prepareValue) : null
-    const pipelineEntry = { text: query.text, name: query.name }
-    if (values) {
-      pipelineEntry.values = values
-    }
-    if (query.name && this.namedQueries[query.name]) {
-      pipelineEntry._alreadyPrepared = true
-    }
-    queries.push(pipelineEntry)
-  }
-
-  this.native.pipeline(queries, function (err, results) {
-    self._pipelineInFlight = false
-
-    if (err) {
-      // Total pipeline failure — error all queries
-      for (let i = 0; i < nativeQueries.length; i++) {
-        const q = nativeQueries[i]
-        q.native = self.native
-        q.handleError(err)
-      }
-      self._pulsePipelinedQueryQueue()
-      return
-    }
-
-    // Deliver results to each query
-    for (let i = 0; i < nativeQueries.length; i++) {
-      const q = nativeQueries[i]
-      const r = results[i]
-      q.native = self.native
-
-      if (r.err) {
-        q.handleError(r.err)
-      } else {
-        // Track named queries on success
-        if (q.name) {
-          self.namedQueries[q.name] = q.text
-        }
-        q.state = 'end'
-        q.emit('end', r.result)
-        if (q.callback) {
-          q.callback(null, r.result)
-        }
-      }
-
-      setImmediate(function () {
-        q.emit('_done')
-      })
-    }
-
-    // Process any queries that arrived while we were reading
-    self._pulsePipelinedQueryQueue()
-  })
-}
-
-// attempt to cancel an in-progress query
-Client.prototype.cancel = function (query) {
-  if (this._activeQuery === query) {
-    this.native.cancel(function () {})
-  } else if (this._queryQueue.indexOf(query) !== -1) {
-    this._queryQueue.splice(this._queryQueue.indexOf(query), 1)
-  }
-}
-
-Client.prototype.ref = function () {}
-Client.prototype.unref = function () {}
-
-Client.prototype.setTypeParser = function (oid, format, parseFn) {
-  return this._types.setTypeParser(oid, format, parseFn)
-}
-
-Client.prototype.getTypeParser = function (oid, format) {
-  return this._types.getTypeParser(oid, format)
-}
-
-Client.prototype.isConnected = function () {
-  return this._connected
-}
-
-Client.prototype.getTransactionStatus = function () {
-  return this.native.getTransactionStatus()
-}
Index: de_modules/pg/lib/native/index.js
===================================================================
--- node_modules/pg/lib/native/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,2 +1,0 @@
-'use strict'
-module.exports = require('./client')
Index: de_modules/pg/lib/native/query.js
===================================================================
--- node_modules/pg/lib/native/query.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,165 +1,0 @@
-'use strict'
-
-const EventEmitter = require('events').EventEmitter
-const util = require('util')
-const utils = require('../utils')
-
-const NativeQuery = (module.exports = function (config, values, callback) {
-  EventEmitter.call(this)
-  config = utils.normalizeQueryConfig(config, values, callback)
-  this.text = config.text
-  this.values = config.values
-  this.name = config.name
-  this.queryMode = config.queryMode
-  this.callback = config.callback
-  this.state = 'new'
-  this._arrayMode = config.rowMode === 'array'
-
-  // if the 'row' event is listened for
-  // then emit them as they come in
-  // without setting singleRowMode to true
-  // this has almost no meaning because libpq
-  // reads all rows into memory before returning any
-  this._emitRowEvents = false
-  this.on(
-    'newListener',
-    function (event) {
-      if (event === 'row') this._emitRowEvents = true
-    }.bind(this)
-  )
-})
-
-util.inherits(NativeQuery, EventEmitter)
-
-const errorFieldMap = {
-  sqlState: 'code',
-  statementPosition: 'position',
-  messagePrimary: 'message',
-  context: 'where',
-  schemaName: 'schema',
-  tableName: 'table',
-  columnName: 'column',
-  dataTypeName: 'dataType',
-  constraintName: 'constraint',
-  sourceFile: 'file',
-  sourceLine: 'line',
-  sourceFunction: 'routine',
-}
-
-NativeQuery.prototype.handleError = function (err) {
-  // copy pq error fields into the error object
-  const fields = this.native && this.native.pq.resultErrorFields()
-  if (fields) {
-    for (const key in fields) {
-      const normalizedFieldName = errorFieldMap[key] || key
-      err[normalizedFieldName] = fields[key]
-    }
-  }
-  if (this.callback) {
-    this.callback(err)
-  } else {
-    this.emit('error', err)
-  }
-  this.state = 'error'
-}
-
-NativeQuery.prototype.then = function (onSuccess, onFailure) {
-  return this._getPromise().then(onSuccess, onFailure)
-}
-
-NativeQuery.prototype.catch = function (callback) {
-  return this._getPromise().catch(callback)
-}
-
-NativeQuery.prototype._getPromise = function () {
-  if (this._promise) return this._promise
-  this._promise = new Promise(
-    function (resolve, reject) {
-      this._once('end', resolve)
-      this._once('error', reject)
-    }.bind(this)
-  )
-  return this._promise
-}
-
-NativeQuery.prototype.submit = function (client) {
-  this.state = 'running'
-  const self = this
-  this.native = client.native
-  client.native.arrayMode = this._arrayMode
-
-  let after = function (err, rows, results) {
-    client.native.arrayMode = false
-    setImmediate(function () {
-      self.emit('_done')
-    })
-
-    // handle possible query error
-    if (err) {
-      return self.handleError(err)
-    }
-
-    // emit row events for each row in the result
-    if (self._emitRowEvents) {
-      if (results.length > 1) {
-        rows.forEach((rowOfRows, i) => {
-          rowOfRows.forEach((row) => {
-            self.emit('row', row, results[i])
-          })
-        })
-      } else {
-        rows.forEach(function (row) {
-          self.emit('row', row, results)
-        })
-      }
-    }
-
-    // handle successful result
-    self.state = 'end'
-    self.emit('end', results)
-    if (self.callback) {
-      self.callback(null, results)
-    }
-  }
-
-  if (process.domain) {
-    after = process.domain.bind(after)
-  }
-
-  // named query
-  if (this.name) {
-    if (this.name.length > 63) {
-      console.error('Warning! Postgres only supports 63 characters for query names.')
-      console.error('You supplied %s (%s)', this.name, this.name.length)
-      console.error('This can cause conflicts and silent errors executing queries')
-    }
-    const values = (this.values || []).map(utils.prepareValue)
-
-    // check if the client has already executed this named query
-    // if so...just execute it again - skip the planning phase
-    if (client.namedQueries[this.name]) {
-      if (this.text && client.namedQueries[this.name] !== this.text) {
-        const err = new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
-        return after(err)
-      }
-      return client.native.execute(this.name, values, after)
-    }
-    // plan the named query the first time, then execute it
-    return client.native.prepare(this.name, this.text, values.length, function (err) {
-      if (err) return after(err)
-      client.namedQueries[self.name] = self.text
-      return self.native.execute(self.name, values, after)
-    })
-  } else if (this.values) {
-    if (!Array.isArray(this.values)) {
-      const err = new Error('Query values must be an array')
-      return after(err)
-    }
-    const vals = this.values.map(utils.prepareValue)
-    client.native.query(this.text, vals, after)
-  } else if (this.queryMode === 'extended') {
-    client.native.query(this.text, [], after)
-  } else {
-    client.native.query(this.text, after)
-  }
-}
Index: de_modules/pg/lib/query.js
===================================================================
--- node_modules/pg/lib/query.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,259 +1,0 @@
-'use strict'
-
-const { EventEmitter } = require('events')
-
-const Result = require('./result')
-const utils = require('./utils')
-
-class Query extends EventEmitter {
-  constructor(config, values, callback) {
-    super()
-
-    config = utils.normalizeQueryConfig(config, values, callback)
-
-    this.text = config.text
-    this.values = config.values
-    this.rows = config.rows
-    this.types = config.types
-    this.name = config.name
-    this.queryMode = config.queryMode
-    this.binary = config.binary
-    // use unique portal name each time
-    this.portal = config.portal || ''
-    this.callback = config.callback
-    this._rowMode = config.rowMode
-    if (process.domain && config.callback) {
-      this.callback = process.domain.bind(config.callback)
-    }
-    this._result = new Result(this._rowMode, this.types)
-
-    // potential for multiple results
-    this._results = this._result
-    this._canceledDueToError = false
-  }
-
-  requiresPreparation() {
-    if (this.queryMode === 'extended') {
-      return true
-    }
-
-    // named queries must always be prepared
-    if (this.name) {
-      return true
-    }
-    // always prepare if there are max number of rows expected per
-    // portal execution
-    if (this.rows) {
-      return true
-    }
-    // don't prepare empty text queries
-    if (!this.text) {
-      return false
-    }
-    // prepare if there are values
-    if (!this.values) {
-      return false
-    }
-    return this.values.length > 0
-  }
-
-  _checkForMultirow() {
-    // if we already have a result with a command property
-    // then we've already executed one query in a multi-statement simple query
-    // turn our results into an array of results
-    if (this._result.command) {
-      if (!Array.isArray(this._results)) {
-        this._results = [this._result]
-      }
-      this._result = new Result(this._rowMode, this._result._types)
-      this._results.push(this._result)
-    }
-  }
-
-  // associates row metadata from the supplied
-  // message with this query object
-  // metadata used when parsing row results
-  handleRowDescription(msg) {
-    this._checkForMultirow()
-    this._result.addFields(msg.fields)
-    this._accumulateRows = this.callback || !this.listeners('row').length
-  }
-
-  handleDataRow(msg) {
-    let row
-
-    if (this._canceledDueToError) {
-      return
-    }
-
-    try {
-      row = this._result.parseRow(msg.fields)
-    } catch (err) {
-      this._canceledDueToError = err
-      return
-    }
-
-    this.emit('row', row, this._result)
-    if (this._accumulateRows) {
-      this._result.addRow(row)
-    }
-  }
-
-  handleCommandComplete(msg, connection) {
-    this._checkForMultirow()
-    this._result.addCommandComplete(msg)
-    // need to sync after each command complete of a prepared statement
-    // if we were using a row count which results in multiple calls to _getRows
-    if (this.rows) {
-      connection.sync()
-    }
-  }
-
-  // if a named prepared statement is created with empty query text
-  // the backend will send an emptyQuery message but *not* a command complete message
-  // since we pipeline sync immediately after execute we don't need to do anything here
-  // unless we have rows specified, in which case we did not pipeline the initial sync call
-  handleEmptyQuery(connection) {
-    if (this.rows) {
-      connection.sync()
-    }
-  }
-
-  handleError(err, connection) {
-    // need to sync after error during a prepared statement
-    if (this._canceledDueToError) {
-      err = this._canceledDueToError
-      this._canceledDueToError = false
-    }
-    // if callback supplied do not emit error event as uncaught error
-    // events will bubble up to node process
-    if (this.callback) {
-      return this.callback(err)
-    }
-    this.emit('error', err)
-  }
-
-  handleReadyForQuery(con) {
-    if (this._canceledDueToError) {
-      return this.handleError(this._canceledDueToError, con)
-    }
-    if (this.callback) {
-      try {
-        this.callback(null, this._results)
-      } catch (err) {
-        process.nextTick(() => {
-          throw err
-        })
-      }
-    }
-    this.emit('end', this._results)
-  }
-
-  submit(connection) {
-    if (typeof this.text !== 'string' && typeof this.name !== 'string') {
-      return new Error('A query must have either text or a name. Supplying neither is unsupported.')
-    }
-    const previous = connection.parsedStatements[this.name] || connection.submittedNamedStatements[this.name]
-    if (this.text && previous && this.text !== previous) {
-      return new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
-    }
-    if (this.values && !Array.isArray(this.values)) {
-      return new Error('Query values must be an array')
-    }
-    if (this.requiresPreparation()) {
-      // If we're using the extended query protocol we fire off several separate commands
-      // to the backend. On some versions of node & some operating system versions
-      // the network stack writes each message separately instead of buffering them together
-      // causing the client & network to send more slowly. Corking & uncorking the stream
-      // allows node to buffer up the messages internally before sending them all off at once.
-      // note: we're checking for existence of cork/uncork because some versions of streams
-      // might not have this (cloudflare?)
-      connection.stream.cork && connection.stream.cork()
-      try {
-        this.prepare(connection)
-      } finally {
-        // while unlikely for this.prepare to throw, if it does & we don't uncork this stream
-        // this client becomes unresponsive, so put in finally block "just in case"
-        connection.stream.uncork && connection.stream.uncork()
-      }
-    } else {
-      connection.query(this.text)
-    }
-    return null
-  }
-
-  hasBeenParsed(connection) {
-    return this.name && (connection.parsedStatements[this.name] || connection.submittedNamedStatements[this.name])
-  }
-
-  handlePortalSuspended(connection) {
-    this._getRows(connection, this.rows)
-  }
-
-  _getRows(connection, rows) {
-    connection.execute({
-      portal: this.portal,
-      rows: rows,
-    })
-    // if we're not reading pages of rows send the sync command
-    // to indicate the pipeline is finished
-    if (!rows) {
-      connection.sync()
-    } else {
-      // otherwise flush the call out to read more rows
-      connection.flush()
-    }
-  }
-
-  // http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
-  prepare(connection) {
-    // TODO refactor this poor encapsulation
-    if (!this.hasBeenParsed(connection)) {
-      connection.parse({
-        text: this.text,
-        name: this.name,
-        types: this.types,
-      })
-      if (this.name) {
-        connection.submittedNamedStatements[this.name] = this.text
-      }
-    }
-
-    // because we're mapping user supplied values to
-    // postgres wire protocol compatible values it could
-    // throw an exception, so try/catch this section
-    try {
-      connection.bind({
-        portal: this.portal,
-        statement: this.name,
-        values: this.values,
-        binary: this.binary,
-        valueMapper: utils.prepareValue,
-      })
-    } catch (err) {
-      // we should close parse to avoid leaking connections
-      connection.close({ type: 'S', name: this.name })
-      connection.sync()
-
-      this.handleError(err, connection)
-      return
-    }
-
-    connection.describe({
-      type: 'P',
-      name: this.portal || '',
-    })
-
-    this._getRows(connection, this.rows)
-  }
-
-  handleCopyInResponse(connection) {
-    connection.sendCopyFail('No source stream defined')
-  }
-
-  handleCopyData(msg, connection) {
-    // noop
-  }
-}
-
-module.exports = Query
Index: de_modules/pg/lib/result.js
===================================================================
--- node_modules/pg/lib/result.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,109 +1,0 @@
-'use strict'
-
-const types = require('pg-types')
-
-const matchRegexp = /^([A-Za-z]+)(?: (\d+))?(?: (\d+))?/
-
-// result object returned from query
-// in the 'end' event and also
-// passed as second argument to provided callback
-class Result {
-  constructor(rowMode, types) {
-    this.command = null
-    this.rowCount = null
-    this.oid = null
-    this.rows = []
-    this.fields = []
-    this._parsers = undefined
-    this._types = types
-    this.RowCtor = null
-    this.rowAsArray = rowMode === 'array'
-    if (this.rowAsArray) {
-      this.parseRow = this._parseRowAsArray
-    }
-    this._prebuiltEmptyResultObject = null
-  }
-
-  // adds a command complete message
-  addCommandComplete(msg) {
-    let match
-    if (msg.text) {
-      // pure javascript
-      match = matchRegexp.exec(msg.text)
-    } else {
-      // native bindings
-      match = matchRegexp.exec(msg.command)
-    }
-    if (match) {
-      this.command = match[1]
-      if (match[3]) {
-        // COMMAND OID ROWS
-        this.oid = parseInt(match[2], 10)
-        this.rowCount = parseInt(match[3], 10)
-      } else if (match[2]) {
-        // COMMAND ROWS
-        this.rowCount = parseInt(match[2], 10)
-      }
-    }
-  }
-
-  _parseRowAsArray(rowData) {
-    const row = new Array(rowData.length)
-    for (let i = 0, len = rowData.length; i < len; i++) {
-      const rawValue = rowData[i]
-      if (rawValue !== null) {
-        row[i] = this._parsers[i](rawValue)
-      } else {
-        row[i] = null
-      }
-    }
-    return row
-  }
-
-  parseRow(rowData) {
-    const row = { ...this._prebuiltEmptyResultObject }
-    for (let i = 0, len = rowData.length; i < len; i++) {
-      const rawValue = rowData[i]
-      const field = this.fields[i].name
-      if (rawValue !== null) {
-        const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue
-        row[field] = this._parsers[i](v)
-      } else {
-        row[field] = null
-      }
-    }
-    return row
-  }
-
-  addRow(row) {
-    this.rows.push(row)
-  }
-
-  addFields(fieldDescriptions) {
-    // clears field definitions
-    // multiple query statements in 1 action can result in multiple sets
-    // of rowDescriptions...eg: 'select NOW(); select 1::int;'
-    // you need to reset the fields
-    this.fields = fieldDescriptions
-    if (this.fields.length) {
-      this._parsers = new Array(fieldDescriptions.length)
-    }
-
-    const row = Object.create(null)
-
-    for (let i = 0; i < fieldDescriptions.length; i++) {
-      const desc = fieldDescriptions[i]
-      row[desc.name] = null
-
-      if (this._types) {
-        this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')
-      } else {
-        this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')
-      }
-    }
-
-    this._prebuiltEmptyResultObject = { ...row }
-  }
-}
-
-module.exports = Result
Index: de_modules/pg/lib/stream.js
===================================================================
--- node_modules/pg/lib/stream.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,83 +1,0 @@
-const { getStream, getSecureStream } = getStreamFuncs()
-
-module.exports = {
-  /**
-   * Get a socket stream compatible with the current runtime environment.
-   * @returns {Duplex}
-   */
-  getStream,
-  /**
-   * Get a TLS secured socket, compatible with the current environment,
-   * using the socket and other settings given in `options`.
-   * @returns {Duplex}
-   */
-  getSecureStream,
-}
-
-/**
- * The stream functions that work in Node.js
- */
-function getNodejsStreamFuncs() {
-  function getStream(ssl) {
-    const net = require('net')
-    return new net.Socket()
-  }
-
-  function getSecureStream(options) {
-    const tls = require('tls')
-    return tls.connect(options)
-  }
-  return {
-    getStream,
-    getSecureStream,
-  }
-}
-
-/**
- * The stream functions that work in Cloudflare Workers
- */
-function getCloudflareStreamFuncs() {
-  function getStream(ssl) {
-    const { CloudflareSocket } = require('pg-cloudflare')
-    return new CloudflareSocket(ssl)
-  }
-
-  function getSecureStream(options) {
-    options.socket.startTls(options)
-    return options.socket
-  }
-  return {
-    getStream,
-    getSecureStream,
-  }
-}
-
-/**
- * Are we running in a Cloudflare Worker?
- *
- * @returns true if the code is currently running inside a Cloudflare Worker.
- */
-function isCloudflareRuntime() {
-  // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers
-  // which means that `navigator.userAgent` will be defined.
-  // eslint-disable-next-line no-undef
-  if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {
-    // eslint-disable-next-line no-undef
-    return navigator.userAgent === 'Cloudflare-Workers'
-  }
-  // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach
-  if (typeof Response === 'function') {
-    const resp = new Response(null, { cf: { thing: true } })
-    if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {
-      return true
-    }
-  }
-  return false
-}
-
-function getStreamFuncs() {
-  if (isCloudflareRuntime()) {
-    return getCloudflareStreamFuncs()
-  }
-  return getNodejsStreamFuncs()
-}
Index: de_modules/pg/lib/type-overrides.js
===================================================================
--- node_modules/pg/lib/type-overrides.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,35 +1,0 @@
-'use strict'
-
-const types = require('pg-types')
-
-function TypeOverrides(userTypes) {
-  this._types = userTypes || types
-  this.text = {}
-  this.binary = {}
-}
-
-TypeOverrides.prototype.getOverrides = function (format) {
-  switch (format) {
-    case 'text':
-      return this.text
-    case 'binary':
-      return this.binary
-    default:
-      return {}
-  }
-}
-
-TypeOverrides.prototype.setTypeParser = function (oid, format, parseFn) {
-  if (typeof format === 'function') {
-    parseFn = format
-    format = 'text'
-  }
-  this.getOverrides(format)[oid] = parseFn
-}
-
-TypeOverrides.prototype.getTypeParser = function (oid, format) {
-  format = format || 'text'
-  return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format)
-}
-
-module.exports = TypeOverrides
Index: de_modules/pg/lib/utils.js
===================================================================
--- node_modules/pg/lib/utils.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,207 +1,0 @@
-'use strict'
-
-const defaults = require('./defaults')
-
-const { isDate } = require('util/types')
-
-function escapeElement(elementRepresentation) {
-  const escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"')
-
-  return '"' + escaped + '"'
-}
-
-// convert a JS array to a postgres array literal
-// uses comma separator so won't work for types like box that use
-// a different array separator.
-function arrayString(val) {
-  let result = '{'
-  for (let i = 0; i < val.length; i++) {
-    if (i > 0) {
-      result += ','
-    }
-    let item = val[i]
-    if (item == null) {
-      result += 'NULL'
-    } else if (Array.isArray(item)) {
-      result += arrayString(item)
-    } else if (ArrayBuffer.isView(item)) {
-      if (!(item instanceof Buffer)) {
-        item = Buffer.from(item.buffer, item.byteOffset, item.byteLength)
-      }
-      result += '\\\\x' + item.toString('hex')
-    } else {
-      result += escapeElement(prepareValue(item))
-    }
-  }
-  result += '}'
-  return result
-}
-
-// converts values from javascript types
-// to their 'raw' counterparts for use as a postgres parameter
-// note: you can override this function to provide your own conversion mechanism
-// for complex types, etc...
-const prepareValue = function (val, seen) {
-  // null and undefined are both null for postgres
-  if (val == null) {
-    return null
-  }
-  if (typeof val === 'object') {
-    if (val instanceof Buffer) {
-      return val
-    }
-    if (ArrayBuffer.isView(val)) {
-      return Buffer.from(val.buffer, val.byteOffset, val.byteLength)
-    }
-    if (isDate(val)) {
-      if (defaults.parseInputDatesAsUTC) {
-        return dateToStringUTC(val)
-      } else {
-        return dateToString(val)
-      }
-    }
-    if (Array.isArray(val)) {
-      return arrayString(val)
-    }
-
-    return prepareObject(val, seen)
-  }
-  return val.toString()
-}
-
-function prepareObject(val, seen) {
-  if (val && typeof val.toPostgres === 'function') {
-    seen = seen || []
-    if (seen.indexOf(val) !== -1) {
-      throw new Error('circular reference detected while preparing "' + val + '" for query')
-    }
-    seen.push(val)
-
-    return prepareValue(val.toPostgres(prepareValue), seen)
-  }
-  return JSON.stringify(val)
-}
-
-function dateToString(date) {
-  let offset = -date.getTimezoneOffset()
-
-  let year = date.getFullYear()
-  const isBCYear = year < 1
-  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
-
-  let ret =
-    String(year).padStart(4, '0') +
-    '-' +
-    String(date.getMonth() + 1).padStart(2, '0') +
-    '-' +
-    String(date.getDate()).padStart(2, '0') +
-    'T' +
-    String(date.getHours()).padStart(2, '0') +
-    ':' +
-    String(date.getMinutes()).padStart(2, '0') +
-    ':' +
-    String(date.getSeconds()).padStart(2, '0') +
-    '.' +
-    String(date.getMilliseconds()).padStart(3, '0')
-
-  if (offset < 0) {
-    ret += '-'
-    offset *= -1
-  } else {
-    ret += '+'
-  }
-
-  ret += String(Math.floor(offset / 60)).padStart(2, '0') + ':' + String(offset % 60).padStart(2, '0')
-  if (isBCYear) ret += ' BC'
-  return ret
-}
-
-function dateToStringUTC(date) {
-  let year = date.getUTCFullYear()
-  const isBCYear = year < 1
-  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
-
-  let ret =
-    String(year).padStart(4, '0') +
-    '-' +
-    String(date.getUTCMonth() + 1).padStart(2, '0') +
-    '-' +
-    String(date.getUTCDate()).padStart(2, '0') +
-    'T' +
-    String(date.getUTCHours()).padStart(2, '0') +
-    ':' +
-    String(date.getUTCMinutes()).padStart(2, '0') +
-    ':' +
-    String(date.getUTCSeconds()).padStart(2, '0') +
-    '.' +
-    String(date.getUTCMilliseconds()).padStart(3, '0')
-
-  ret += '+00:00'
-  if (isBCYear) ret += ' BC'
-  return ret
-}
-
-function normalizeQueryConfig(config, values, callback) {
-  // can take in strings or config objects
-  config = typeof config === 'string' ? { text: config } : config
-  if (values) {
-    if (typeof values === 'function') {
-      config.callback = values
-    } else {
-      config.values = values
-    }
-  }
-  if (callback) {
-    config.callback = callback
-  }
-  return config
-}
-
-// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c
-const escapeIdentifier = function (str) {
-  return '"' + str.replace(/"/g, '""') + '"'
-}
-
-const escapeLiteral = function (str) {
-  let hasBackslash = false
-  let escaped = "'"
-
-  if (str == null) {
-    return "''"
-  }
-
-  if (typeof str !== 'string') {
-    return "''"
-  }
-
-  for (let i = 0; i < str.length; i++) {
-    const c = str[i]
-    if (c === "'") {
-      escaped += c + c
-    } else if (c === '\\') {
-      escaped += c + c
-      hasBackslash = true
-    } else {
-      escaped += c
-    }
-  }
-
-  escaped += "'"
-
-  if (hasBackslash === true) {
-    escaped = ' E' + escaped
-  }
-
-  return escaped
-}
-
-module.exports = {
-  prepareValue: function prepareValueWrapper(value) {
-    // this ensures that extra arguments do not get passed into prepareValue
-    // by accident, eg: from calling values.map(utils.prepareValue)
-    return prepareValue(value)
-  },
-  normalizeQueryConfig,
-  escapeIdentifier,
-  escapeLiteral,
-}
Index: de_modules/pg/package.json
===================================================================
--- node_modules/pg/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,76 +1,0 @@
-{
-  "name": "pg",
-  "version": "8.23.0",
-  "description": "PostgreSQL client - pure javascript & libpq with the same API",
-  "keywords": [
-    "database",
-    "libpq",
-    "pg",
-    "postgre",
-    "postgres",
-    "postgresql",
-    "rdbms"
-  ],
-  "homepage": "https://github.com/brianc/node-postgres",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/brianc/node-postgres.git",
-    "directory": "packages/pg"
-  },
-  "author": "Brian Carlson <brian.m.carlson@gmail.com>",
-  "main": "./lib",
-  "exports": {
-    ".": {
-      "import": "./esm/index.mjs",
-      "require": "./lib/index.js",
-      "default": "./lib/index.js"
-    },
-    "./package.json": {
-      "default": "./package.json"
-    },
-    "./lib/*": "./lib/*.js",
-    "./lib/*.js": "./lib/*.js"
-  },
-  "dependencies": {
-    "pg-connection-string": "^2.14.0",
-    "pg-pool": "^3.14.0",
-    "pg-protocol": "^1.16.0",
-    "pg-types": "2.2.0",
-    "pgpass": "1.0.5"
-  },
-  "devDependencies": {
-    "@cloudflare/vitest-pool-workers": "0.8.23",
-    "@cloudflare/workers-types": "^4.20230404.0",
-    "async": "2.6.4",
-    "bluebird": "3.7.2",
-    "co": "4.6.0",
-    "pg-copy-streams": "0.3.0",
-    "typescript": "^6.0.3",
-    "vitest": "~3.0.9",
-    "wrangler": "^3.x"
-  },
-  "optionalDependencies": {
-    "pg-cloudflare": "^1.4.0"
-  },
-  "peerDependencies": {
-    "pg-native": ">=3.0.1"
-  },
-  "peerDependenciesMeta": {
-    "pg-native": {
-      "optional": true
-    }
-  },
-  "scripts": {
-    "test": "make test-all"
-  },
-  "files": [
-    "lib",
-    "esm",
-    "SPONSORS.md"
-  ],
-  "license": "MIT",
-  "engines": {
-    "node": ">= 16.0.0"
-  },
-  "gitHead": "df274d1ba9ad9d11a8f1079314faeafde7208207"
-}
Index: de_modules/pgpass/README.md
===================================================================
--- node_modules/pgpass/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,74 +1,0 @@
-# pgpass
-
-[![Build Status](https://github.com/hoegaarden/pgpass/workflows/CI/badge.svg?branch=master)](https://github.com/hoegaarden/pgpass/actions?query=workflow%3ACI+branch%3Amaster)
-
-## Install
-
-```sh
-npm install pgpass
-```
-
-## Usage
-```js
-var pgPass = require('pgpass');
-
-var connInfo = {
-  'host' : 'pgserver' ,
-  'user' : 'the_user_name' ,
-};
-
-pgPass(connInfo, function(pass){
-  conn_info.password = pass;
-  // connect to postgresql server
-});
-```
-
-## Description
-
-This module tries to read the `~/.pgpass` file (or the equivalent for windows systems). If the environment variable `PGPASSFILE` is set, this file is used instead. If everything goes right, the password from said file is passed to the callback; if the password cannot be read `undefined` is passed to the callback.
-
-Cases where `undefined` is returned:
-
-- the environment variable `PGPASSWORD` is set
-- the file cannot be read (wrong permissions, no such file, ...)
-- for non windows systems: the file is write-/readable by the group or by other users
-- there is no matching line for the given connection info
-
-There should be no need to use this module directly; it is already included in `node-postgres`.
-
-## Configuration
-
-The module reads the environment variable `PGPASS_NO_DEESCAPE` to decide if the the read tokens from the password file should be de-escaped or not. Default is to do de-escaping. For further information on this see [this commit](https://github.com/postgres/postgres/commit/8d15e3ec4fcb735875a8a70a09ec0c62153c3329).
-
-
-## Tests
-
-There are tests in `./test/`; including linting and coverage testing. Running `npm test` runs:
-
-- `jshint`
-- `mocha` tests
-- `jscoverage` and `mocha -R html-cov`
-
-You can see the coverage report in `coverage.html`.
-
-
-## Development, Patches, Bugs, ...
-
-If you find Bugs or have improvements, please feel free to open a issue on GitHub. If you provide a pull request, I'm more than happy to merge them, just make sure to add tests for your changes.
-
-## Links
-
-- https://github.com/hoegaarden/node-pgpass
-- http://www.postgresql.org/docs/current/static/libpq-pgpass.html
-- https://wiki.postgresql.org/wiki/Pgpass
-- https://github.com/postgres/postgres/blob/master/src/interfaces/libpq/fe-connect.c
-
-## License
-
-Copyright (c) 2013-2016 Hannes Hörl
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/pgpass/lib/helper.js
===================================================================
--- node_modules/pgpass/lib/helper.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,233 +1,0 @@
-'use strict';
-
-var path = require('path')
-  , Stream = require('stream').Stream
-  , split = require('split2')
-  , util = require('util')
-  , defaultPort = 5432
-  , isWin = (process.platform === 'win32')
-  , warnStream = process.stderr
-;
-
-
-var S_IRWXG = 56     //    00070(8)
-  , S_IRWXO = 7      //    00007(8)
-  , S_IFMT  = 61440  // 00170000(8)
-  , S_IFREG = 32768  //  0100000(8)
-;
-function isRegFile(mode) {
-    return ((mode & S_IFMT) == S_IFREG);
-}
-
-var fieldNames = [ 'host', 'port', 'database', 'user', 'password' ];
-var nrOfFields = fieldNames.length;
-var passKey = fieldNames[ nrOfFields -1 ];
-
-
-function warn() {
-    var isWritable = (
-        warnStream instanceof Stream &&
-          true === warnStream.writable
-    );
-
-    if (isWritable) {
-        var args = Array.prototype.slice.call(arguments).concat("\n");
-        warnStream.write( util.format.apply(util, args) );
-    }
-}
-
-
-Object.defineProperty(module.exports, 'isWin', {
-    get : function() {
-        return isWin;
-    } ,
-    set : function(val) {
-        isWin = val;
-    }
-});
-
-
-module.exports.warnTo = function(stream) {
-    var old = warnStream;
-    warnStream = stream;
-    return old;
-};
-
-module.exports.getFileName = function(rawEnv){
-    var env = rawEnv || process.env;
-    var file = env.PGPASSFILE || (
-        isWin ?
-          path.join( env.APPDATA || './' , 'postgresql', 'pgpass.conf' ) :
-          path.join( env.HOME || './', '.pgpass' )
-    );
-    return file;
-};
-
-module.exports.usePgPass = function(stats, fname) {
-    if (Object.prototype.hasOwnProperty.call(process.env, 'PGPASSWORD')) {
-        return false;
-    }
-
-    if (isWin) {
-        return true;
-    }
-
-    fname = fname || '<unkn>';
-
-    if (! isRegFile(stats.mode)) {
-        warn('WARNING: password file "%s" is not a plain file', fname);
-        return false;
-    }
-
-    if (stats.mode & (S_IRWXG | S_IRWXO)) {
-        /* If password file is insecure, alert the user and ignore it. */
-        warn('WARNING: password file "%s" has group or world access; permissions should be u=rw (0600) or less', fname);
-        return false;
-    }
-
-    return true;
-};
-
-
-var matcher = module.exports.match = function(connInfo, entry) {
-    return fieldNames.slice(0, -1).reduce(function(prev, field, idx){
-        if (idx == 1) {
-            // the port
-            if ( Number( connInfo[field] || defaultPort ) === Number( entry[field] ) ) {
-                return prev && true;
-            }
-        }
-        return prev && (
-            entry[field] === '*' ||
-              entry[field] === connInfo[field]
-        );
-    }, true);
-};
-
-
-module.exports.getPassword = function(connInfo, stream, cb) {
-    var pass;
-    var lineStream = stream.pipe(split());
-
-    function onLine(line) {
-        var entry = parseLine(line);
-        if (entry && isValidEntry(entry) && matcher(connInfo, entry)) {
-            pass = entry[passKey];
-            lineStream.end(); // -> calls onEnd(), but pass is set now
-        }
-    }
-
-    var onEnd = function() {
-        stream.destroy();
-        cb(pass);
-    };
-
-    var onErr = function(err) {
-        stream.destroy();
-        warn('WARNING: error on reading file: %s', err);
-        cb(undefined);
-    };
-
-    stream.on('error', onErr);
-    lineStream
-        .on('data', onLine)
-        .on('end', onEnd)
-        .on('error', onErr)
-    ;
-
-};
-
-
-var parseLine = module.exports.parseLine = function(line) {
-    if (line.length < 11 || line.match(/^\s+#/)) {
-        return null;
-    }
-
-    var curChar = '';
-    var prevChar = '';
-    var fieldIdx = 0;
-    var startIdx = 0;
-    var endIdx = 0;
-    var obj = {};
-    var isLastField = false;
-    var addToObj = function(idx, i0, i1) {
-        var field = line.substring(i0, i1);
-
-        if (! Object.hasOwnProperty.call(process.env, 'PGPASS_NO_DEESCAPE')) {
-            field = field.replace(/\\([:\\])/g, '$1');
-        }
-
-        obj[ fieldNames[idx] ] = field;
-    };
-
-    for (var i = 0 ; i < line.length-1 ; i += 1) {
-        curChar = line.charAt(i+1);
-        prevChar = line.charAt(i);
-
-        isLastField = (fieldIdx == nrOfFields-1);
-
-        if (isLastField) {
-            addToObj(fieldIdx, startIdx);
-            break;
-        }
-
-        if (i >= 0 && curChar == ':' && prevChar !== '\\') {
-            addToObj(fieldIdx, startIdx, i+1);
-
-            startIdx = i+2;
-            fieldIdx += 1;
-        }
-    }
-
-    obj = ( Object.keys(obj).length === nrOfFields ) ? obj : null;
-
-    return obj;
-};
-
-
-var isValidEntry = module.exports.isValidEntry = function(entry){
-    var rules = {
-        // host
-        0 : function(x){
-            return x.length > 0;
-        } ,
-        // port
-        1 : function(x){
-            if (x === '*') {
-                return true;
-            }
-            x = Number(x);
-            return (
-                isFinite(x) &&
-                  x > 0 &&
-                  x < 9007199254740992 &&
-                  Math.floor(x) === x
-            );
-        } ,
-        // database
-        2 : function(x){
-            return x.length > 0;
-        } ,
-        // username
-        3 : function(x){
-            return x.length > 0;
-        } ,
-        // password
-        4 : function(x){
-            return x.length > 0;
-        }
-    };
-
-    for (var idx = 0 ; idx < fieldNames.length ; idx += 1) {
-        var rule = rules[idx];
-        var value = entry[ fieldNames[idx] ] || '';
-
-        var res = rule(value);
-        if (!res) {
-            return false;
-        }
-    }
-
-    return true;
-};
-
Index: de_modules/pgpass/lib/index.js
===================================================================
--- node_modules/pgpass/lib/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,23 +1,0 @@
-'use strict';
-
-var path = require('path')
-  , fs = require('fs')
-  , helper = require('./helper.js')
-;
-
-
-module.exports = function(connInfo, cb) {
-    var file = helper.getFileName();
-    
-    fs.stat(file, function(err, stat){
-        if (err || !helper.usePgPass(stat, file)) {
-            return cb(undefined);
-        }
-
-        var st = fs.createReadStream(file);
-
-        helper.getPassword(connInfo, st, cb);
-    });
-};
-
-module.exports.warnTo = helper.warnTo;
Index: de_modules/pgpass/package.json
===================================================================
--- node_modules/pgpass/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,41 +1,0 @@
-{
-  "name": "pgpass",
-  "version": "1.0.5",
-  "description": "Module for reading .pgpass",
-  "main": "lib/index",
-  "scripts": {
-    "pretest": "chmod 600 ./test/_pgpass",
-    "_hint": "jshint --exclude node_modules --verbose lib test",
-    "_test": "mocha --recursive -R list",
-    "_covered_test": "nyc --reporter html --reporter text \"$npm_execpath\" run _test",
-    "test": "\"$npm_execpath\" run _hint && \"$npm_execpath\" run _covered_test"
-  },
-  "author": "Hannes Hörl <hannes.hoerl+pgpass@snowreporter.com>",
-  "license": "MIT",
-  "dependencies": {
-    "split2": "^4.1.0"
-  },
-  "devDependencies": {
-    "jshint": "^2.12.0",
-    "mocha": "^8.2.0",
-    "nyc": "^15.1.0",
-    "pg": "^8.4.1",
-    "pg-escape": "^0.2.0",
-    "pg-native": "3.0.0",
-    "resumer": "0.0.0",
-    "tmp": "^0.2.1",
-    "which": "^2.0.2"
-  },
-  "keywords": [
-    "postgres",
-    "pg",
-    "pgpass",
-    "password",
-    "postgresql"
-  ],
-  "bugs": "https://github.com/hoegaarden/pgpass/issues",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/hoegaarden/pgpass.git"
-  }
-}
Index: de_modules/picomatch/LICENSE
===================================================================
--- node_modules/picomatch/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2017-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/picomatch/README.md
===================================================================
--- node_modules/picomatch/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,716 +1,0 @@
-<h1 align="center">Picomatch</h1>
-
-<p align="center">
-<a href="https://npmjs.org/package/picomatch">
-<img src="https://img.shields.io/npm/v/picomatch.svg" alt="version">
-</a>
-<a href="https://github.com/micromatch/picomatch/actions?workflow=Tests">
-<img src="https://github.com/micromatch/picomatch/workflows/Tests/badge.svg" alt="test status">
-</a>
-<a href="https://coveralls.io/github/micromatch/picomatch">
-<img src="https://img.shields.io/coveralls/github/micromatch/picomatch/master.svg" alt="coverage status">
-</a>
-<a href="https://npmjs.org/package/picomatch">
-<img src="https://img.shields.io/npm/dm/picomatch.svg" alt="downloads">
-</a>
-</p>
-
-<br>
-<br>
-
-<p align="center">
-<strong>Blazing fast and accurate glob matcher written in JavaScript.</strong></br>
-<em>No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.</em>
-</p>
-
-<br>
-<br>
-
-## Why picomatch?
-
-* **Lightweight** - No dependencies
-* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function.
-* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps)
-* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files)
-* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes.
-* **Well tested** - Thousands of unit tests
-
-See the [library comparison](#library-comparisons) to other libraries.
-
-<br>
-<br>
-
-## Table of Contents
-
-<details><summary> Click to expand </summary>
-
-- [Install](#install)
-- [Usage](#usage)
-- [API](#api)
-  * [picomatch](#picomatch)
-  * [.test](#test)
-  * [.matchBase](#matchbase)
-  * [.isMatch](#ismatch)
-  * [.parse](#parse)
-  * [.scan](#scan)
-  * [.compileRe](#compilere)
-  * [.makeRe](#makere)
-  * [.toRegex](#toregex)
-- [Options](#options)
-  * [Picomatch options](#picomatch-options)
-  * [Scan Options](#scan-options)
-  * [Options Examples](#options-examples)
-- [Globbing features](#globbing-features)
-  * [Basic globbing](#basic-globbing)
-  * [Advanced globbing](#advanced-globbing)
-  * [Braces](#braces)
-  * [Matching special characters as literals](#matching-special-characters-as-literals)
-- [Library Comparisons](#library-comparisons)
-- [Benchmarks](#benchmarks)
-- [Philosophies](#philosophies)
-- [About](#about)
-  * [Author](#author)
-  * [License](#license)
-
-_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
-
-</details>
-
-<br>
-<br>
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-npm install --save picomatch
-```
-
-<br>
-
-## Usage
-
-The main export is a function that takes a glob pattern and an options object and returns a function for matching strings.
-
-```js
-const pm = require('picomatch');
-const isMatch = pm('*.js');
-
-console.log(isMatch('abcd')); //=> false
-console.log(isMatch('a.js')); //=> true
-console.log(isMatch('a.md')); //=> false
-console.log(isMatch('a/b.js')); //=> false
-```
-
-<br>
-
-## API
-
-### [picomatch](lib/picomatch.js#L32)
-
-Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information.
-
-**Params**
-
-* `globs` **{String|Array}**: One or more glob patterns.
-* `options` **{Object=}**
-* `returns` **{Function=}**: Returns a matcher function.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch(glob[, options]);
-
-const isMatch = picomatch('*.!(*a)');
-console.log(isMatch('a.a')); //=> false
-console.log(isMatch('a.b')); //=> true
-```
-
-### [.test](lib/picomatch.js#L117)
-
-Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string.
-
-**Params**
-
-* `input` **{String}**: String to test.
-* `regex` **{RegExp}**
-* `returns` **{Object}**: Returns an object with matching info.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.test(input, regex[, options]);
-
-console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
-// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
-```
-
-### [.matchBase](lib/picomatch.js#L161)
-
-Match the basename of a filepath.
-
-**Params**
-
-* `input` **{String}**: String to test.
-* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe).
-* `returns` **{Boolean}**
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.matchBase(input, glob[, options]);
-console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
-```
-
-### [.isMatch](lib/picomatch.js#L183)
-
-Returns true if **any** of the given glob `patterns` match the specified `string`.
-
-**Params**
-
-* **{String|Array}**: str The string to test.
-* **{String|Array}**: patterns One or more glob patterns to use for matching.
-* **{Object}**: See available [options](#options).
-* `returns` **{Boolean}**: Returns true if any patterns match `str`
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.isMatch(string, patterns[, options]);
-
-console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
-console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
-```
-
-### [.parse](lib/picomatch.js#L199)
-
-Parse a glob pattern to create the source string for a regular expression.
-
-**Params**
-
-* `pattern` **{String}**
-* `options` **{Object}**
-* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const result = picomatch.parse(pattern[, options]);
-```
-
-### [.scan](lib/picomatch.js#L231)
-
-Scan a glob pattern to separate the pattern into segments.
-
-**Params**
-
-* `input` **{String}**: Glob pattern to scan.
-* `options` **{Object}**
-* `returns` **{Object}**: Returns an object with
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.scan(input[, options]);
-
-const result = picomatch.scan('!./foo/*.js');
-console.log(result);
-{ prefix: '!./',
-  input: '!./foo/*.js',
-  start: 3,
-  base: 'foo',
-  glob: '*.js',
-  isBrace: false,
-  isBracket: false,
-  isGlob: true,
-  isExtglob: false,
-  isGlobstar: false,
-  negated: true }
-```
-
-### [.compileRe](lib/picomatch.js#L245)
-
-Compile a regular expression from the `state` object returned by the
-[parse()](#parse) method.
-
-**Params**
-
-* `state` **{Object}**
-* `options` **{Object}**
-* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser.
-* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
-* `returns` **{RegExp}**
-
-### [.makeRe](lib/picomatch.js#L286)
-
-Create a regular expression from a parsed glob pattern.
-
-**Params**
-
-* `state` **{String}**: The object returned from the `.parse` method.
-* `options` **{Object}**
-* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
-* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
-* `returns` **{RegExp}**: Returns a regex created from the given pattern.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const state = picomatch.parse('*.js');
-// picomatch.compileRe(state[, options]);
-
-console.log(picomatch.compileRe(state));
-//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
-```
-
-### [.toRegex](lib/picomatch.js#L321)
-
-Create a regular expression from the given regex source string.
-
-**Params**
-
-* `source` **{String}**: Regular expression source string.
-* `options` **{Object}**
-* `returns` **{RegExp}**
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.toRegex(source[, options]);
-
-const { output } = picomatch.parse('*.js');
-console.log(picomatch.toRegex(output));
-//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
-```
-
-<br>
-
-## Options
-
-### Picomatch options
-
-The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API.
-
-| **Option** | **Type** | **Default value** | **Description** |
-| --- | --- | --- | --- |
-| `basename`            | `boolean`      | `false`     | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes.  For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. |
-| `bash`                | `boolean`      | `false`     | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). |
-| `capture`             | `boolean`      | `undefined` | Return regex matches in supporting methods. |
-| `contains`            | `boolean`      | `undefined` | Allows glob to match any part of the given string(s). |
-| `cwd`                 | `string`       | `process.cwd()` | Current working directory. Used by `picomatch.split()` |
-| `debug`               | `boolean`      | `undefined` | Debug regular expressions when an error is thrown. |
-| `dot`                 | `boolean`      | `false`     | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true |
-| `expandRange`         | `function`     | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. |
-| `failglob`            | `boolean`      | `false`     | Throws an error if no matches are found. Based on the bash option of the same name. |
-| `fastpaths`           | `boolean`      | `true`      | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. |
-| `flags`               | `string`      | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. |
-| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. |
-| `ignore`              | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. |
-| `keepQuotes`          | `boolean`      | `false`     | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes.  |
-| `literalBrackets`     | `boolean`      | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. |
-| `matchBase`           | `boolean`      | `false`     | Alias for `basename` |
-| `maxLength`           | `number`      | `65536`     | Limit the max length of the input string. An error is thrown if the input string is longer than this value. |
-| `maxExtglobRecursion` | `number\|boolean` | `0` | Limit nested quantified extglobs and other risky repeated extglob forms. When the limit is exceeded, the extglob is treated as a literal string instead of being compiled to regex. Set to `false` to disable this safeguard. |
-| `nobrace`             | `boolean`      | `false`     | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. |
-| `nobracket`           | `boolean`      | `undefined` | Disable matching with regex brackets. |
-| `nocase`              | `boolean`      | `false`     | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. |
-| `nodupes`             | `boolean`      | `true`      | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. |
-| `noext`               | `boolean`      | `false`     | Alias for `noextglob` |
-| `noextglob`           | `boolean`      | `false`     | Disable support for matching with extglobs (like `+(a\|b)`) |
-| `noglobstar`          | `boolean`      | `false`     | Disable support for matching nested directories with globstars (`**`) |
-| `nonegate`            | `boolean`      | `false`     | Disable support for negating with leading `!` |
-| `noquantifiers`       | `boolean`      | `false`     | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. |
-| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. |
-| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. |
-| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. |
-| `posix`               | `boolean`      | `false`     | Support POSIX character classes ("posix brackets"). |
-| `posixSlashes`        | `boolean`      | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself |
-| `prepend`             | `boolean`      | `undefined` | String to prepend to the generated regex used for matching. |
-| `regex`               | `boolean`      | `false`     | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). |
-| `strictBrackets`      | `boolean`      | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. |
-| `strictSlashes`       | `boolean`      | `undefined` | When true, picomatch won't match trailing slashes with single stars. |
-| `unescape`            | `boolean`      | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. |
-| `unixify`             | `boolean`      | `undefined` | Alias for `posixSlashes`, for backwards compatibility. |
-
-picomatch has automatic detection for regex positive and negative lookbehinds. If the pattern contains a negative lookbehind, you must be using Node.js >= 8.10 or else picomatch will throw an error.
-
-### Scan Options
-
-In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method.
-
-| **Option** | **Type** | **Default value** | **Description** |
-| --- | --- | --- | --- |
-| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern |
-| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true |
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const result = picomatch.scan('!./foo/*.js', { tokens: true });
-console.log(result);
-// {
-//   prefix: '!./',
-//   input: '!./foo/*.js',
-//   start: 3,
-//   base: 'foo',
-//   glob: '*.js',
-//   isBrace: false,
-//   isBracket: false,
-//   isGlob: true,
-//   isExtglob: false,
-//   isGlobstar: false,
-//   negated: true,
-//   maxDepth: 2,
-//   tokens: [
-//     { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true },
-//     { value: 'foo', depth: 1, isGlob: false },
-//     { value: '*.js', depth: 1, isGlob: true }
-//   ],
-//   slashes: [ 2, 6 ],
-//   parts: [ 'foo', '*.js' ]
-// }
-```
-
-<br>
-
-### Options Examples
-
-#### options.expandRange
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need.
-
-**Example**
-
-The following example shows how to create a glob that matches a folder
-
-```js
-const fill = require('fill-range');
-const regex = pm.makeRe('foo/{01..25}/bar', {
-  expandRange(a, b) {
-    return `(${fill(a, b, { toRegex: true })})`;
-  }
-});
-
-console.log(regex);
-//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/
-
-console.log(regex.test('foo/00/bar'))  // false
-console.log(regex.test('foo/01/bar'))  // true
-console.log(regex.test('foo/10/bar')) // true
-console.log(regex.test('foo/22/bar')) // true
-console.log(regex.test('foo/25/bar')) // true
-console.log(regex.test('foo/26/bar')) // false
-```
-
-#### options.format
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-Custom function for formatting strings before they're matched.
-
-**Example**
-
-```js
-// strip leading './' from strings
-const format = str => str.replace(/^\.\//, '');
-const isMatch = picomatch('foo/*.js', { format });
-console.log(isMatch('./foo/bar.js')); //=> true
-```
-
-#### options.onMatch
-
-```js
-const onMatch = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onMatch });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-#### options.onIgnore
-
-```js
-const onIgnore = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onIgnore, ignore: 'f*' });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-#### options.onResult
-
-```js
-const onResult = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onResult, ignore: 'f*' });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-<br>
-<br>
-
-## Globbing features
-
-* [Basic globbing](#basic-globbing) (Wildcard matching)
-* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching)
-
-### Basic globbing
-
-| **Character** | **Description** |
-| --- | --- |
-| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. |
-| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` on Windows) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. |
-| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots.  |
-| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. |
-
-#### Matching behavior vs. Bash
-
-Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions:
-
-* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`.
-* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`.
-
-<br>
-
-### Advanced globbing
-
-* [extglobs](#extglobs)
-* [POSIX brackets](#posix-brackets)
-* [Braces](#brace-expansion)
-
-#### Extglobs
-
-| **Pattern** | **Description** |
-| --- | --- |
-| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` |
-| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` |
-| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` |
-| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` |
-| `!(pattern)` | Match _anything but_ `pattern` |
-
-**Examples**
-
-```js
-const pm = require('picomatch');
-
-// *(pattern) matches ZERO or more of "pattern"
-console.log(pm.isMatch('a', 'a*(z)')); // true
-console.log(pm.isMatch('az', 'a*(z)')); // true
-console.log(pm.isMatch('azzz', 'a*(z)')); // true
-
-// +(pattern) matches ONE or more of "pattern"
-console.log(pm.isMatch('a', 'a*(z)')); // true
-console.log(pm.isMatch('az', 'a*(z)')); // true
-console.log(pm.isMatch('azzz', 'a*(z)')); // true
-
-// supports multiple extglobs
-console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false
-
-// supports nested extglobs
-console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true
-
-// risky quantified extglobs are treated literally by default
-console.log(pm.makeRe('+(a|aa)'));
-//=> /^(?:\+\(a\|aa\))$/
-
-// increase the limit to allow a small amount of nested quantified extglobs
-console.log(pm.isMatch('aaa', '+(+(a))', { maxExtglobRecursion: 1 })); // true
-```
-
-#### POSIX brackets
-
-POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true.
-
-**Enable POSIX bracket support**
-
-```js
-console.log(pm.makeRe('[[:word:]]+', { posix: true }));
-//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/
-```
-
-**Supported POSIX classes**
-
-The following named POSIX bracket expressions are supported:
-
-* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]`
-* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`.
-* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`.
-* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`.
-* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`.
-* `[:digit:]` - Numerical digits, equivalent to `[0-9]`.
-* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`.
-* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`.
-* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`.
-* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`.
-* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`.
-* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`.
-* `[:word:]` -  Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`.
-* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`.
-
-See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information.
-
-### Braces
-
-Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces.
-
-### Matching special characters as literals
-
-If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes:
-
-**Special Characters**
-
-Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms.
-
-To match any of the following characters as literals: `$^*+?()[]
-
-Examples:
-
-```js
-console.log(pm.makeRe('foo/bar \\(1\\)'));
-console.log(pm.makeRe('foo/bar \\(1\\)'));
-```
-
-<br>
-<br>
-
-## Library Comparisons
-
-The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets).
-
-| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` |
-| --- | --- | --- | --- | --- | --- | --- | --- |
-| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - |
-| Advancing globbing        | ✔ | ✔ | ✔ | - | - | - | - |
-| Brace _matching_          | ✔ | ✔ | ✔ | - | - | ✔ | - |
-| Brace _expansion_         | ✔ | ✔ | - | - | - | ✔ | - |
-| Extglobs                  | partial | ✔ | ✔ | - | ✔ | - | - |
-| Posix brackets            | - | ✔ | ✔ | - | - | - | ✔ |
-| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ |
-| File system operations    | - | - | - | - | - | - | - |
-
-<br>
-<br>
-
-## Benchmarks
-
-Performance comparison of picomatch and minimatch.
-
-```
-# .makeRe star
-  picomatch x 1,993,050 ops/sec ±0.51% (91 runs sampled)
-  minimatch x 627,206 ops/sec ±1.96% (87 runs sampled))
-
-# .makeRe star; dot=true
-  picomatch x 1,436,640 ops/sec ±0.62% (91 runs sampled)
-  minimatch x 525,876 ops/sec ±0.60% (88 runs sampled)
-
-# .makeRe globstar
-  picomatch x 1,592,742 ops/sec ±0.42% (90 runs sampled)
-  minimatch x 962,043 ops/sec ±1.76% (91 runs sampled)d)
-
-# .makeRe globstars
-  picomatch x 1,615,199 ops/sec ±0.35% (94 runs sampled)
-  minimatch x 477,179 ops/sec ±1.33% (91 runs sampled)
-
-# .makeRe with leading star
-  picomatch x 1,220,856 ops/sec ±0.40% (92 runs sampled)
-  minimatch x 453,564 ops/sec ±1.43% (94 runs sampled)
-
-# .makeRe - basic braces
-  picomatch x 392,067 ops/sec ±0.70% (90 runs sampled)
-  minimatch x 99,532 ops/sec ±2.03% (87 runs sampled))
-```
-
-<br>
-<br>
-
-## Philosophies
-
-The goal of this library is to be blazing fast, without compromising on accuracy.
-
-**Accuracy**
-
-The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`.
-
-Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements.
-
-**Performance**
-
-Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer.
-
-<br>
-<br>
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
Index: de_modules/picomatch/index.js
===================================================================
--- node_modules/picomatch/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,3 +1,0 @@
-'use strict';
-
-module.exports = require('./lib/picomatch');
Index: de_modules/picomatch/lib/constants.js
===================================================================
--- node_modules/picomatch/lib/constants.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,184 +1,0 @@
-'use strict';
-
-const path = require('path');
-const WIN_SLASH = '\\\\/';
-const WIN_NO_SLASH = `[^${WIN_SLASH}]`;
-
-const DEFAULT_MAX_EXTGLOB_RECURSION = 0;
-
-/**
- * Posix glob regex
- */
-
-const DOT_LITERAL = '\\.';
-const PLUS_LITERAL = '\\+';
-const QMARK_LITERAL = '\\?';
-const SLASH_LITERAL = '\\/';
-const ONE_CHAR = '(?=.)';
-const QMARK = '[^/]';
-const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;
-const START_ANCHOR = `(?:^|${SLASH_LITERAL})`;
-const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;
-const NO_DOT = `(?!${DOT_LITERAL})`;
-const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;
-const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;
-const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;
-const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;
-const STAR = `${QMARK}*?`;
-
-const POSIX_CHARS = {
-  DOT_LITERAL,
-  PLUS_LITERAL,
-  QMARK_LITERAL,
-  SLASH_LITERAL,
-  ONE_CHAR,
-  QMARK,
-  END_ANCHOR,
-  DOTS_SLASH,
-  NO_DOT,
-  NO_DOTS,
-  NO_DOT_SLASH,
-  NO_DOTS_SLASH,
-  QMARK_NO_DOT,
-  STAR,
-  START_ANCHOR
-};
-
-/**
- * Windows glob regex
- */
-
-const WINDOWS_CHARS = {
-  ...POSIX_CHARS,
-
-  SLASH_LITERAL: `[${WIN_SLASH}]`,
-  QMARK: WIN_NO_SLASH,
-  STAR: `${WIN_NO_SLASH}*?`,
-  DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,
-  NO_DOT: `(?!${DOT_LITERAL})`,
-  NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
-  NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,
-  NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
-  QMARK_NO_DOT: `[^.${WIN_SLASH}]`,
-  START_ANCHOR: `(?:^|[${WIN_SLASH}])`,
-  END_ANCHOR: `(?:[${WIN_SLASH}]|$)`
-};
-
-/**
- * POSIX Bracket Regex
- */
-
-const POSIX_REGEX_SOURCE = {
-  __proto__: null,
-  alnum: 'a-zA-Z0-9',
-  alpha: 'a-zA-Z',
-  ascii: '\\x00-\\x7F',
-  blank: ' \\t',
-  cntrl: '\\x00-\\x1F\\x7F',
-  digit: '0-9',
-  graph: '\\x21-\\x7E',
-  lower: 'a-z',
-  print: '\\x20-\\x7E ',
-  punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~',
-  space: ' \\t\\r\\n\\v\\f',
-  upper: 'A-Z',
-  word: 'A-Za-z0-9_',
-  xdigit: 'A-Fa-f0-9'
-};
-
-module.exports = {
-  DEFAULT_MAX_EXTGLOB_RECURSION,
-  MAX_LENGTH: 1024 * 64,
-  POSIX_REGEX_SOURCE,
-
-  // regular expressions
-  REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
-  REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/,
-  REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/,
-  REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g,
-  REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
-  REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
-
-  // Replace globs with equivalent patterns to reduce parsing time.
-  REPLACEMENTS: {
-    __proto__: null,
-    '***': '*',
-    '**/**': '**',
-    '**/**/**': '**'
-  },
-
-  // Digits
-  CHAR_0: 48, /* 0 */
-  CHAR_9: 57, /* 9 */
-
-  // Alphabet chars.
-  CHAR_UPPERCASE_A: 65, /* A */
-  CHAR_LOWERCASE_A: 97, /* a */
-  CHAR_UPPERCASE_Z: 90, /* Z */
-  CHAR_LOWERCASE_Z: 122, /* z */
-
-  CHAR_LEFT_PARENTHESES: 40, /* ( */
-  CHAR_RIGHT_PARENTHESES: 41, /* ) */
-
-  CHAR_ASTERISK: 42, /* * */
-
-  // Non-alphabetic chars.
-  CHAR_AMPERSAND: 38, /* & */
-  CHAR_AT: 64, /* @ */
-  CHAR_BACKWARD_SLASH: 92, /* \ */
-  CHAR_CARRIAGE_RETURN: 13, /* \r */
-  CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */
-  CHAR_COLON: 58, /* : */
-  CHAR_COMMA: 44, /* , */
-  CHAR_DOT: 46, /* . */
-  CHAR_DOUBLE_QUOTE: 34, /* " */
-  CHAR_EQUAL: 61, /* = */
-  CHAR_EXCLAMATION_MARK: 33, /* ! */
-  CHAR_FORM_FEED: 12, /* \f */
-  CHAR_FORWARD_SLASH: 47, /* / */
-  CHAR_GRAVE_ACCENT: 96, /* ` */
-  CHAR_HASH: 35, /* # */
-  CHAR_HYPHEN_MINUS: 45, /* - */
-  CHAR_LEFT_ANGLE_BRACKET: 60, /* < */
-  CHAR_LEFT_CURLY_BRACE: 123, /* { */
-  CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */
-  CHAR_LINE_FEED: 10, /* \n */
-  CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */
-  CHAR_PERCENT: 37, /* % */
-  CHAR_PLUS: 43, /* + */
-  CHAR_QUESTION_MARK: 63, /* ? */
-  CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */
-  CHAR_RIGHT_CURLY_BRACE: 125, /* } */
-  CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */
-  CHAR_SEMICOLON: 59, /* ; */
-  CHAR_SINGLE_QUOTE: 39, /* ' */
-  CHAR_SPACE: 32, /*   */
-  CHAR_TAB: 9, /* \t */
-  CHAR_UNDERSCORE: 95, /* _ */
-  CHAR_VERTICAL_LINE: 124, /* | */
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */
-
-  SEP: path.sep,
-
-  /**
-   * Create EXTGLOB_CHARS
-   */
-
-  extglobChars(chars) {
-    return {
-      '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },
-      '?': { type: 'qmark', open: '(?:', close: ')?' },
-      '+': { type: 'plus', open: '(?:', close: ')+' },
-      '*': { type: 'star', open: '(?:', close: ')*' },
-      '@': { type: 'at', open: '(?:', close: ')' }
-    };
-  },
-
-  /**
-   * Create GLOB_CHARS
-   */
-
-  globChars(win32) {
-    return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;
-  }
-};
Index: de_modules/picomatch/lib/parse.js
===================================================================
--- node_modules/picomatch/lib/parse.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,1392 +1,0 @@
-'use strict';
-
-const constants = require('./constants');
-const utils = require('./utils');
-
-/**
- * Constants
- */
-
-const {
-  MAX_LENGTH,
-  POSIX_REGEX_SOURCE,
-  REGEX_NON_SPECIAL_CHARS,
-  REGEX_SPECIAL_CHARS_BACKREF,
-  REPLACEMENTS
-} = constants;
-
-/**
- * Helpers
- */
-
-const expandRange = (args, options) => {
-  if (typeof options.expandRange === 'function') {
-    return options.expandRange(...args, options);
-  }
-
-  args.sort();
-  const value = `[${args.join('-')}]`;
-
-  try {
-    /* eslint-disable-next-line no-new */
-    new RegExp(value);
-  } catch (ex) {
-    return args.map(v => utils.escapeRegex(v)).join('..');
-  }
-
-  return value;
-};
-
-/**
- * Create the message for a syntax error
- */
-
-const syntaxError = (type, char) => {
-  return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
-};
-
-const splitTopLevel = input => {
-  const parts = [];
-  let bracket = 0;
-  let paren = 0;
-  let quote = 0;
-  let value = '';
-  let escaped = false;
-
-  for (const ch of input) {
-    if (escaped === true) {
-      value += ch;
-      escaped = false;
-      continue;
-    }
-
-    if (ch === '\\') {
-      value += ch;
-      escaped = true;
-      continue;
-    }
-
-    if (ch === '"') {
-      quote = quote === 1 ? 0 : 1;
-      value += ch;
-      continue;
-    }
-
-    if (quote === 0) {
-      if (ch === '[') {
-        bracket++;
-      } else if (ch === ']' && bracket > 0) {
-        bracket--;
-      } else if (bracket === 0) {
-        if (ch === '(') {
-          paren++;
-        } else if (ch === ')' && paren > 0) {
-          paren--;
-        } else if (ch === '|' && paren === 0) {
-          parts.push(value);
-          value = '';
-          continue;
-        }
-      }
-    }
-
-    value += ch;
-  }
-
-  parts.push(value);
-  return parts;
-};
-
-const isPlainBranch = branch => {
-  let escaped = false;
-
-  for (const ch of branch) {
-    if (escaped === true) {
-      escaped = false;
-      continue;
-    }
-
-    if (ch === '\\') {
-      escaped = true;
-      continue;
-    }
-
-    if (/[?*+@!()[\]{}]/.test(ch)) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-const normalizeSimpleBranch = branch => {
-  let value = branch.trim();
-  let changed = true;
-
-  while (changed === true) {
-    changed = false;
-
-    if (/^@\([^\\()[\]{}|]+\)$/.test(value)) {
-      value = value.slice(2, -1);
-      changed = true;
-    }
-  }
-
-  if (!isPlainBranch(value)) {
-    return;
-  }
-
-  return value.replace(/\\(.)/g, '$1');
-};
-
-const hasRepeatedCharPrefixOverlap = branches => {
-  const values = branches.map(normalizeSimpleBranch).filter(Boolean);
-
-  for (let i = 0; i < values.length; i++) {
-    for (let j = i + 1; j < values.length; j++) {
-      const a = values[i];
-      const b = values[j];
-      const char = a[0];
-
-      if (!char || a !== char.repeat(a.length) || b !== char.repeat(b.length)) {
-        continue;
-      }
-
-      if (a === b || a.startsWith(b) || b.startsWith(a)) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-};
-
-const parseRepeatedExtglob = (pattern, requireEnd = true) => {
-  if ((pattern[0] !== '+' && pattern[0] !== '*') || pattern[1] !== '(') {
-    return;
-  }
-
-  let bracket = 0;
-  let paren = 0;
-  let quote = 0;
-  let escaped = false;
-
-  for (let i = 1; i < pattern.length; i++) {
-    const ch = pattern[i];
-
-    if (escaped === true) {
-      escaped = false;
-      continue;
-    }
-
-    if (ch === '\\') {
-      escaped = true;
-      continue;
-    }
-
-    if (ch === '"') {
-      quote = quote === 1 ? 0 : 1;
-      continue;
-    }
-
-    if (quote === 1) {
-      continue;
-    }
-
-    if (ch === '[') {
-      bracket++;
-      continue;
-    }
-
-    if (ch === ']' && bracket > 0) {
-      bracket--;
-      continue;
-    }
-
-    if (bracket > 0) {
-      continue;
-    }
-
-    if (ch === '(') {
-      paren++;
-      continue;
-    }
-
-    if (ch === ')') {
-      paren--;
-
-      if (paren === 0) {
-        if (requireEnd === true && i !== pattern.length - 1) {
-          return;
-        }
-
-        return {
-          type: pattern[0],
-          body: pattern.slice(2, i),
-          end: i
-        };
-      }
-    }
-  }
-};
-
-const getStarExtglobSequenceOutput = pattern => {
-  let index = 0;
-  const chars = [];
-
-  while (index < pattern.length) {
-    const match = parseRepeatedExtglob(pattern.slice(index), false);
-
-    if (!match || match.type !== '*') {
-      return;
-    }
-
-    const branches = splitTopLevel(match.body).map(branch => branch.trim());
-    if (branches.length !== 1) {
-      return;
-    }
-
-    const branch = normalizeSimpleBranch(branches[0]);
-    if (!branch || branch.length !== 1) {
-      return;
-    }
-
-    chars.push(branch);
-    index += match.end + 1;
-  }
-
-  if (chars.length < 1) {
-    return;
-  }
-
-  const source = chars.length === 1
-    ? utils.escapeRegex(chars[0])
-    : `[${chars.map(ch => utils.escapeRegex(ch)).join('')}]`;
-
-  return `${source}*`;
-};
-
-const repeatedExtglobRecursion = pattern => {
-  let depth = 0;
-  let value = pattern.trim();
-  let match = parseRepeatedExtglob(value);
-
-  while (match) {
-    depth++;
-    value = match.body.trim();
-    match = parseRepeatedExtglob(value);
-  }
-
-  return depth;
-};
-
-const analyzeRepeatedExtglob = (body, options) => {
-  if (options.maxExtglobRecursion === false) {
-    return { risky: false };
-  }
-
-  const max =
-    typeof options.maxExtglobRecursion === 'number'
-      ? options.maxExtglobRecursion
-      : constants.DEFAULT_MAX_EXTGLOB_RECURSION;
-
-  const branches = splitTopLevel(body).map(branch => branch.trim());
-
-  if (branches.length > 1) {
-    if (
-      branches.some(branch => branch === '') ||
-      branches.some(branch => /^[*?]+$/.test(branch)) ||
-      hasRepeatedCharPrefixOverlap(branches)
-    ) {
-      return { risky: true };
-    }
-  }
-
-  for (const branch of branches) {
-    const safeOutput = getStarExtglobSequenceOutput(branch);
-    if (safeOutput) {
-      return { risky: true, safeOutput };
-    }
-
-    if (repeatedExtglobRecursion(branch) > max) {
-      return { risky: true };
-    }
-  }
-
-  return { risky: false };
-};
-
-/**
- * Parse the given input string.
- * @param {String} input
- * @param {Object} options
- * @return {Object}
- */
-
-const parse = (input, options) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected a string');
-  }
-
-  input = REPLACEMENTS[input] || input;
-
-  const opts = { ...options };
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-
-  let len = input.length;
-  if (len > max) {
-    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
-  }
-
-  const bos = { type: 'bos', value: '', output: opts.prepend || '' };
-  const tokens = [bos];
-
-  const capture = opts.capture ? '' : '?:';
-  const win32 = utils.isWindows(options);
-
-  // create constants based on platform, for windows or posix
-  const PLATFORM_CHARS = constants.globChars(win32);
-  const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);
-
-  const {
-    DOT_LITERAL,
-    PLUS_LITERAL,
-    SLASH_LITERAL,
-    ONE_CHAR,
-    DOTS_SLASH,
-    NO_DOT,
-    NO_DOT_SLASH,
-    NO_DOTS_SLASH,
-    QMARK,
-    QMARK_NO_DOT,
-    STAR,
-    START_ANCHOR
-  } = PLATFORM_CHARS;
-
-  const globstar = opts => {
-    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
-  };
-
-  const nodot = opts.dot ? '' : NO_DOT;
-  const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;
-  let star = opts.bash === true ? globstar(opts) : STAR;
-
-  if (opts.capture) {
-    star = `(${star})`;
-  }
-
-  // minimatch options support
-  if (typeof opts.noext === 'boolean') {
-    opts.noextglob = opts.noext;
-  }
-
-  const state = {
-    input,
-    index: -1,
-    start: 0,
-    dot: opts.dot === true,
-    consumed: '',
-    output: '',
-    prefix: '',
-    backtrack: false,
-    negated: false,
-    brackets: 0,
-    braces: 0,
-    parens: 0,
-    quotes: 0,
-    globstar: false,
-    tokens
-  };
-
-  input = utils.removePrefix(input, state);
-  len = input.length;
-
-  const extglobs = [];
-  const braces = [];
-  const stack = [];
-  let prev = bos;
-  let value;
-
-  /**
-   * Tokenizing helpers
-   */
-
-  const eos = () => state.index === len - 1;
-  const peek = state.peek = (n = 1) => input[state.index + n];
-  const advance = state.advance = () => input[++state.index] || '';
-  const remaining = () => input.slice(state.index + 1);
-  const consume = (value = '', num = 0) => {
-    state.consumed += value;
-    state.index += num;
-  };
-
-  const append = token => {
-    state.output += token.output != null ? token.output : token.value;
-    consume(token.value);
-  };
-
-  const negate = () => {
-    let count = 1;
-
-    while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {
-      advance();
-      state.start++;
-      count++;
-    }
-
-    if (count % 2 === 0) {
-      return false;
-    }
-
-    state.negated = true;
-    state.start++;
-    return true;
-  };
-
-  const increment = type => {
-    state[type]++;
-    stack.push(type);
-  };
-
-  const decrement = type => {
-    state[type]--;
-    stack.pop();
-  };
-
-  /**
-   * Push tokens onto the tokens array. This helper speeds up
-   * tokenizing by 1) helping us avoid backtracking as much as possible,
-   * and 2) helping us avoid creating extra tokens when consecutive
-   * characters are plain text. This improves performance and simplifies
-   * lookbehinds.
-   */
-
-  const push = tok => {
-    if (prev.type === 'globstar') {
-      const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');
-      const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));
-
-      if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {
-        state.output = state.output.slice(0, -prev.output.length);
-        prev.type = 'star';
-        prev.value = '*';
-        prev.output = star;
-        state.output += prev.output;
-      }
-    }
-
-    if (extglobs.length && tok.type !== 'paren') {
-      extglobs[extglobs.length - 1].inner += tok.value;
-    }
-
-    if (tok.value || tok.output) append(tok);
-    if (prev && prev.type === 'text' && tok.type === 'text') {
-      prev.value += tok.value;
-      prev.output = (prev.output || '') + tok.value;
-      return;
-    }
-
-    tok.prev = prev;
-    tokens.push(tok);
-    prev = tok;
-  };
-
-  const extglobOpen = (type, value) => {
-    const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };
-
-    token.prev = prev;
-    token.parens = state.parens;
-    token.output = state.output;
-    token.startIndex = state.index;
-    token.tokensIndex = tokens.length;
-    const output = (opts.capture ? '(' : '') + token.open;
-
-    increment('parens');
-    push({ type, value, output: state.output ? '' : ONE_CHAR });
-    push({ type: 'paren', extglob: true, value: advance(), output });
-    extglobs.push(token);
-  };
-
-  const extglobClose = token => {
-    const literal = input.slice(token.startIndex, state.index + 1);
-    const body = input.slice(token.startIndex + 2, state.index);
-    const analysis = analyzeRepeatedExtglob(body, opts);
-
-    if ((token.type === 'plus' || token.type === 'star') && analysis.risky) {
-      const safeOutput = analysis.safeOutput
-        ? (token.output ? '' : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput)
-        : undefined;
-      const open = tokens[token.tokensIndex];
-
-      open.type = 'text';
-      open.value = literal;
-      open.output = safeOutput || utils.escapeRegex(literal);
-
-      for (let i = token.tokensIndex + 1; i < tokens.length; i++) {
-        tokens[i].value = '';
-        tokens[i].output = '';
-        delete tokens[i].suffix;
-      }
-
-      state.output = token.output + open.output;
-      state.backtrack = true;
-
-      push({ type: 'paren', extglob: true, value, output: '' });
-      decrement('parens');
-      return;
-    }
-
-    let output = token.close + (opts.capture ? ')' : '');
-    let rest;
-
-    if (token.type === 'negate') {
-      let extglobStar = star;
-
-      if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {
-        extglobStar = globstar(opts);
-      }
-
-      if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) {
-        output = token.close = `)$))${extglobStar}`;
-      }
-
-      if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
-        // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.
-        // In this case, we need to parse the string and use it in the output of the original pattern.
-        // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.
-        //
-        // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.
-        const expression = parse(rest, { ...options, fastpaths: false }).output;
-
-        output = token.close = `)${expression})${extglobStar})`;
-      }
-
-      if (token.prev.type === 'bos') {
-        state.negatedExtglob = true;
-      }
-    }
-
-    push({ type: 'paren', extglob: true, value, output });
-    decrement('parens');
-  };
-
-  /**
-   * Fast paths
-   */
-
-  if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) {
-    let backslashes = false;
-
-    let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {
-      if (first === '\\') {
-        backslashes = true;
-        return m;
-      }
-
-      if (first === '?') {
-        if (esc) {
-          return esc + first + (rest ? QMARK.repeat(rest.length) : '');
-        }
-        if (index === 0) {
-          return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');
-        }
-        return QMARK.repeat(chars.length);
-      }
-
-      if (first === '.') {
-        return DOT_LITERAL.repeat(chars.length);
-      }
-
-      if (first === '*') {
-        if (esc) {
-          return esc + first + (rest ? star : '');
-        }
-        return star;
-      }
-      return esc ? m : `\\${m}`;
-    });
-
-    if (backslashes === true) {
-      if (opts.unescape === true) {
-        output = output.replace(/\\/g, '');
-      } else {
-        output = output.replace(/\\+/g, m => {
-          return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : '');
-        });
-      }
-    }
-
-    if (output === input && opts.contains === true) {
-      state.output = input;
-      return state;
-    }
-
-    state.output = utils.wrapOutput(output, state, options);
-    return state;
-  }
-
-  /**
-   * Tokenize input until we reach end-of-string
-   */
-
-  while (!eos()) {
-    value = advance();
-
-    if (value === '\u0000') {
-      continue;
-    }
-
-    /**
-     * Escaped characters
-     */
-
-    if (value === '\\') {
-      const next = peek();
-
-      if (next === '/' && opts.bash !== true) {
-        continue;
-      }
-
-      if (next === '.' || next === ';') {
-        continue;
-      }
-
-      if (!next) {
-        value += '\\';
-        push({ type: 'text', value });
-        continue;
-      }
-
-      // collapse slashes to reduce potential for exploits
-      const match = /^\\+/.exec(remaining());
-      let slashes = 0;
-
-      if (match && match[0].length > 2) {
-        slashes = match[0].length;
-        state.index += slashes;
-        if (slashes % 2 !== 0) {
-          value += '\\';
-        }
-      }
-
-      if (opts.unescape === true) {
-        value = advance();
-      } else {
-        value += advance();
-      }
-
-      if (state.brackets === 0) {
-        push({ type: 'text', value });
-        continue;
-      }
-    }
-
-    /**
-     * If we're inside a regex character class, continue
-     * until we reach the closing bracket.
-     */
-
-    if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {
-      if (opts.posix !== false && value === ':') {
-        const inner = prev.value.slice(1);
-        if (inner.includes('[')) {
-          prev.posix = true;
-
-          if (inner.includes(':')) {
-            const idx = prev.value.lastIndexOf('[');
-            const pre = prev.value.slice(0, idx);
-            const rest = prev.value.slice(idx + 2);
-            const posix = POSIX_REGEX_SOURCE[rest];
-            if (posix) {
-              prev.value = pre + posix;
-              state.backtrack = true;
-              advance();
-
-              if (!bos.output && tokens.indexOf(prev) === 1) {
-                bos.output = ONE_CHAR;
-              }
-              continue;
-            }
-          }
-        }
-      }
-
-      if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {
-        value = `\\${value}`;
-      }
-
-      if (value === ']' && (prev.value === '[' || prev.value === '[^')) {
-        value = `\\${value}`;
-      }
-
-      if (opts.posix === true && value === '!' && prev.value === '[') {
-        value = '^';
-      }
-
-      prev.value += value;
-      append({ value });
-      continue;
-    }
-
-    /**
-     * If we're inside a quoted string, continue
-     * until we reach the closing double quote.
-     */
-
-    if (state.quotes === 1 && value !== '"') {
-      value = utils.escapeRegex(value);
-      prev.value += value;
-      append({ value });
-      continue;
-    }
-
-    /**
-     * Double quotes
-     */
-
-    if (value === '"') {
-      state.quotes = state.quotes === 1 ? 0 : 1;
-      if (opts.keepQuotes === true) {
-        push({ type: 'text', value });
-      }
-      continue;
-    }
-
-    /**
-     * Parentheses
-     */
-
-    if (value === '(') {
-      increment('parens');
-      push({ type: 'paren', value });
-      continue;
-    }
-
-    if (value === ')') {
-      if (state.parens === 0 && opts.strictBrackets === true) {
-        throw new SyntaxError(syntaxError('opening', '('));
-      }
-
-      const extglob = extglobs[extglobs.length - 1];
-      if (extglob && state.parens === extglob.parens + 1) {
-        extglobClose(extglobs.pop());
-        continue;
-      }
-
-      push({ type: 'paren', value, output: state.parens ? ')' : '\\)' });
-      decrement('parens');
-      continue;
-    }
-
-    /**
-     * Square brackets
-     */
-
-    if (value === '[') {
-      if (opts.nobracket === true || !remaining().includes(']')) {
-        if (opts.nobracket !== true && opts.strictBrackets === true) {
-          throw new SyntaxError(syntaxError('closing', ']'));
-        }
-
-        value = `\\${value}`;
-      } else {
-        increment('brackets');
-      }
-
-      push({ type: 'bracket', value });
-      continue;
-    }
-
-    if (value === ']') {
-      if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {
-        push({ type: 'text', value, output: `\\${value}` });
-        continue;
-      }
-
-      if (state.brackets === 0) {
-        if (opts.strictBrackets === true) {
-          throw new SyntaxError(syntaxError('opening', '['));
-        }
-
-        push({ type: 'text', value, output: `\\${value}` });
-        continue;
-      }
-
-      decrement('brackets');
-
-      const prevValue = prev.value.slice(1);
-      if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {
-        value = `/${value}`;
-      }
-
-      prev.value += value;
-      append({ value });
-
-      // when literal brackets are explicitly disabled
-      // assume we should match with a regex character class
-      if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {
-        continue;
-      }
-
-      const escaped = utils.escapeRegex(prev.value);
-      state.output = state.output.slice(0, -prev.value.length);
-
-      // when literal brackets are explicitly enabled
-      // assume we should escape the brackets to match literal characters
-      if (opts.literalBrackets === true) {
-        state.output += escaped;
-        prev.value = escaped;
-        continue;
-      }
-
-      // when the user specifies nothing, try to match both
-      prev.value = `(${capture}${escaped}|${prev.value})`;
-      state.output += prev.value;
-      continue;
-    }
-
-    /**
-     * Braces
-     */
-
-    if (value === '{' && opts.nobrace !== true) {
-      increment('braces');
-
-      const open = {
-        type: 'brace',
-        value,
-        output: '(',
-        outputIndex: state.output.length,
-        tokensIndex: state.tokens.length
-      };
-
-      braces.push(open);
-      push(open);
-      continue;
-    }
-
-    if (value === '}') {
-      const brace = braces[braces.length - 1];
-
-      if (opts.nobrace === true || !brace) {
-        push({ type: 'text', value, output: value });
-        continue;
-      }
-
-      let output = ')';
-
-      if (brace.dots === true) {
-        const arr = tokens.slice();
-        const range = [];
-
-        for (let i = arr.length - 1; i >= 0; i--) {
-          tokens.pop();
-          if (arr[i].type === 'brace') {
-            break;
-          }
-          if (arr[i].type !== 'dots') {
-            range.unshift(arr[i].value);
-          }
-        }
-
-        output = expandRange(range, opts);
-        state.backtrack = true;
-      }
-
-      if (brace.comma !== true && brace.dots !== true) {
-        const out = state.output.slice(0, brace.outputIndex);
-        const toks = state.tokens.slice(brace.tokensIndex);
-        brace.value = brace.output = '\\{';
-        value = output = '\\}';
-        state.output = out;
-        for (const t of toks) {
-          state.output += (t.output || t.value);
-        }
-      }
-
-      push({ type: 'brace', value, output });
-      decrement('braces');
-      braces.pop();
-      continue;
-    }
-
-    /**
-     * Pipes
-     */
-
-    if (value === '|') {
-      if (extglobs.length > 0) {
-        extglobs[extglobs.length - 1].conditions++;
-      }
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Commas
-     */
-
-    if (value === ',') {
-      let output = value;
-
-      const brace = braces[braces.length - 1];
-      if (brace && stack[stack.length - 1] === 'braces') {
-        brace.comma = true;
-        output = '|';
-      }
-
-      push({ type: 'comma', value, output });
-      continue;
-    }
-
-    /**
-     * Slashes
-     */
-
-    if (value === '/') {
-      // if the beginning of the glob is "./", advance the start
-      // to the current index, and don't add the "./" characters
-      // to the state. This greatly simplifies lookbehinds when
-      // checking for BOS characters like "!" and "." (not "./")
-      if (prev.type === 'dot' && state.index === state.start + 1) {
-        state.start = state.index + 1;
-        state.consumed = '';
-        state.output = '';
-        tokens.pop();
-        prev = bos; // reset "prev" to the first token
-        continue;
-      }
-
-      push({ type: 'slash', value, output: SLASH_LITERAL });
-      continue;
-    }
-
-    /**
-     * Dots
-     */
-
-    if (value === '.') {
-      if (state.braces > 0 && prev.type === 'dot') {
-        if (prev.value === '.') prev.output = DOT_LITERAL;
-        const brace = braces[braces.length - 1];
-        prev.type = 'dots';
-        prev.output += value;
-        prev.value += value;
-        brace.dots = true;
-        continue;
-      }
-
-      if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {
-        push({ type: 'text', value, output: DOT_LITERAL });
-        continue;
-      }
-
-      push({ type: 'dot', value, output: DOT_LITERAL });
-      continue;
-    }
-
-    /**
-     * Question marks
-     */
-
-    if (value === '?') {
-      const isGroup = prev && prev.value === '(';
-      if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        extglobOpen('qmark', value);
-        continue;
-      }
-
-      if (prev && prev.type === 'paren') {
-        const next = peek();
-        let output = value;
-
-        if (next === '<' && !utils.supportsLookbehinds()) {
-          throw new Error('Node.js v10 or higher is required for regex lookbehinds');
-        }
-
-        if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) {
-          output = `\\${value}`;
-        }
-
-        push({ type: 'text', value, output });
-        continue;
-      }
-
-      if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {
-        push({ type: 'qmark', value, output: QMARK_NO_DOT });
-        continue;
-      }
-
-      push({ type: 'qmark', value, output: QMARK });
-      continue;
-    }
-
-    /**
-     * Exclamation
-     */
-
-    if (value === '!') {
-      if (opts.noextglob !== true && peek() === '(') {
-        if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {
-          extglobOpen('negate', value);
-          continue;
-        }
-      }
-
-      if (opts.nonegate !== true && state.index === 0) {
-        negate();
-        continue;
-      }
-    }
-
-    /**
-     * Plus
-     */
-
-    if (value === '+') {
-      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        extglobOpen('plus', value);
-        continue;
-      }
-
-      if ((prev && prev.value === '(') || opts.regex === false) {
-        push({ type: 'plus', value, output: PLUS_LITERAL });
-        continue;
-      }
-
-      if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {
-        push({ type: 'plus', value });
-        continue;
-      }
-
-      push({ type: 'plus', value: PLUS_LITERAL });
-      continue;
-    }
-
-    /**
-     * Plain text
-     */
-
-    if (value === '@') {
-      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        push({ type: 'at', extglob: true, value, output: '' });
-        continue;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Plain text
-     */
-
-    if (value !== '*') {
-      if (value === '$' || value === '^') {
-        value = `\\${value}`;
-      }
-
-      const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());
-      if (match) {
-        value += match[0];
-        state.index += match[0].length;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Stars
-     */
-
-    if (prev && (prev.type === 'globstar' || prev.star === true)) {
-      prev.type = 'star';
-      prev.star = true;
-      prev.value += value;
-      prev.output = star;
-      state.backtrack = true;
-      state.globstar = true;
-      consume(value);
-      continue;
-    }
-
-    let rest = remaining();
-    if (opts.noextglob !== true && /^\([^?]/.test(rest)) {
-      extglobOpen('star', value);
-      continue;
-    }
-
-    if (prev.type === 'star') {
-      if (opts.noglobstar === true) {
-        consume(value);
-        continue;
-      }
-
-      const prior = prev.prev;
-      const before = prior.prev;
-      const isStart = prior.type === 'slash' || prior.type === 'bos';
-      const afterStar = before && (before.type === 'star' || before.type === 'globstar');
-
-      if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {
-        push({ type: 'star', value, output: '' });
-        continue;
-      }
-
-      const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');
-      const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');
-      if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {
-        push({ type: 'star', value, output: '' });
-        continue;
-      }
-
-      // strip consecutive `/**/`
-      while (rest.slice(0, 3) === '/**') {
-        const after = input[state.index + 4];
-        if (after && after !== '/') {
-          break;
-        }
-        rest = rest.slice(3);
-        consume('/**', 3);
-      }
-
-      if (prior.type === 'bos' && eos()) {
-        prev.type = 'globstar';
-        prev.value += value;
-        prev.output = globstar(opts);
-        state.output = prev.output;
-        state.globstar = true;
-        consume(value);
-        continue;
-      }
-
-      if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {
-        state.output = state.output.slice(0, -(prior.output + prev.output).length);
-        prior.output = `(?:${prior.output}`;
-
-        prev.type = 'globstar';
-        prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');
-        prev.value += value;
-        state.globstar = true;
-        state.output += prior.output + prev.output;
-        consume(value);
-        continue;
-      }
-
-      if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {
-        const end = rest[1] !== void 0 ? '|$' : '';
-
-        state.output = state.output.slice(0, -(prior.output + prev.output).length);
-        prior.output = `(?:${prior.output}`;
-
-        prev.type = 'globstar';
-        prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;
-        prev.value += value;
-
-        state.output += prior.output + prev.output;
-        state.globstar = true;
-
-        consume(value + advance());
-
-        push({ type: 'slash', value: '/', output: '' });
-        continue;
-      }
-
-      if (prior.type === 'bos' && rest[0] === '/') {
-        prev.type = 'globstar';
-        prev.value += value;
-        prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;
-        state.output = prev.output;
-        state.globstar = true;
-        consume(value + advance());
-        push({ type: 'slash', value: '/', output: '' });
-        continue;
-      }
-
-      // remove single star from output
-      state.output = state.output.slice(0, -prev.output.length);
-
-      // reset previous token to globstar
-      prev.type = 'globstar';
-      prev.output = globstar(opts);
-      prev.value += value;
-
-      // reset output with globstar
-      state.output += prev.output;
-      state.globstar = true;
-      consume(value);
-      continue;
-    }
-
-    const token = { type: 'star', value, output: star };
-
-    if (opts.bash === true) {
-      token.output = '.*?';
-      if (prev.type === 'bos' || prev.type === 'slash') {
-        token.output = nodot + token.output;
-      }
-      push(token);
-      continue;
-    }
-
-    if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {
-      token.output = value;
-      push(token);
-      continue;
-    }
-
-    if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {
-      if (prev.type === 'dot') {
-        state.output += NO_DOT_SLASH;
-        prev.output += NO_DOT_SLASH;
-
-      } else if (opts.dot === true) {
-        state.output += NO_DOTS_SLASH;
-        prev.output += NO_DOTS_SLASH;
-
-      } else {
-        state.output += nodot;
-        prev.output += nodot;
-      }
-
-      if (peek() !== '*') {
-        state.output += ONE_CHAR;
-        prev.output += ONE_CHAR;
-      }
-    }
-
-    push(token);
-  }
-
-  while (state.brackets > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));
-    state.output = utils.escapeLast(state.output, '[');
-    decrement('brackets');
-  }
-
-  while (state.parens > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));
-    state.output = utils.escapeLast(state.output, '(');
-    decrement('parens');
-  }
-
-  while (state.braces > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));
-    state.output = utils.escapeLast(state.output, '{');
-    decrement('braces');
-  }
-
-  if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {
-    push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });
-  }
-
-  // rebuild the output if we had to backtrack at any point
-  if (state.backtrack === true) {
-    state.output = '';
-
-    for (const token of state.tokens) {
-      state.output += token.output != null ? token.output : token.value;
-
-      if (token.suffix) {
-        state.output += token.suffix;
-      }
-    }
-  }
-
-  return state;
-};
-
-/**
- * Fast paths for creating regular expressions for common glob patterns.
- * This can significantly speed up processing and has very little downside
- * impact when none of the fast paths match.
- */
-
-parse.fastpaths = (input, options) => {
-  const opts = { ...options };
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-  const len = input.length;
-  if (len > max) {
-    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
-  }
-
-  input = REPLACEMENTS[input] || input;
-  const win32 = utils.isWindows(options);
-
-  // create constants based on platform, for windows or posix
-  const {
-    DOT_LITERAL,
-    SLASH_LITERAL,
-    ONE_CHAR,
-    DOTS_SLASH,
-    NO_DOT,
-    NO_DOTS,
-    NO_DOTS_SLASH,
-    STAR,
-    START_ANCHOR
-  } = constants.globChars(win32);
-
-  const nodot = opts.dot ? NO_DOTS : NO_DOT;
-  const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;
-  const capture = opts.capture ? '' : '?:';
-  const state = { negated: false, prefix: '' };
-  let star = opts.bash === true ? '.*?' : STAR;
-
-  if (opts.capture) {
-    star = `(${star})`;
-  }
-
-  const globstar = opts => {
-    if (opts.noglobstar === true) return star;
-    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
-  };
-
-  const create = str => {
-    switch (str) {
-      case '*':
-        return `${nodot}${ONE_CHAR}${star}`;
-
-      case '.*':
-        return `${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '*.*':
-        return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '*/*':
-        return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;
-
-      case '**':
-        return nodot + globstar(opts);
-
-      case '**/*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;
-
-      case '**/*.*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '**/.*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      default: {
-        const match = /^(.*?)\.(\w+)$/.exec(str);
-        if (!match) return;
-
-        const source = create(match[1]);
-        if (!source) return;
-
-        return source + DOT_LITERAL + match[2];
-      }
-    }
-  };
-
-  const output = utils.removePrefix(input, state);
-  let source = create(output);
-
-  if (source && opts.strictSlashes !== true) {
-    source += `${SLASH_LITERAL}?`;
-  }
-
-  return source;
-};
-
-module.exports = parse;
Index: de_modules/picomatch/lib/picomatch.js
===================================================================
--- node_modules/picomatch/lib/picomatch.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,342 +1,0 @@
-'use strict';
-
-const path = require('path');
-const scan = require('./scan');
-const parse = require('./parse');
-const utils = require('./utils');
-const constants = require('./constants');
-const isObject = val => val && typeof val === 'object' && !Array.isArray(val);
-
-/**
- * Creates a matcher function from one or more glob patterns. The
- * returned function takes a string to match as its first argument,
- * and returns true if the string is a match. The returned matcher
- * function also takes a boolean as the second argument that, when true,
- * returns an object with additional information.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch(glob[, options]);
- *
- * const isMatch = picomatch('*.!(*a)');
- * console.log(isMatch('a.a')); //=> false
- * console.log(isMatch('a.b')); //=> true
- * ```
- * @name picomatch
- * @param {String|Array} `globs` One or more glob patterns.
- * @param {Object=} `options`
- * @return {Function=} Returns a matcher function.
- * @api public
- */
-
-const picomatch = (glob, options, returnState = false) => {
-  if (Array.isArray(glob)) {
-    const fns = glob.map(input => picomatch(input, options, returnState));
-    const arrayMatcher = str => {
-      for (const isMatch of fns) {
-        const state = isMatch(str);
-        if (state) return state;
-      }
-      return false;
-    };
-    return arrayMatcher;
-  }
-
-  const isState = isObject(glob) && glob.tokens && glob.input;
-
-  if (glob === '' || (typeof glob !== 'string' && !isState)) {
-    throw new TypeError('Expected pattern to be a non-empty string');
-  }
-
-  const opts = options || {};
-  const posix = utils.isWindows(options);
-  const regex = isState
-    ? picomatch.compileRe(glob, options)
-    : picomatch.makeRe(glob, options, false, true);
-
-  const state = regex.state;
-  delete regex.state;
-
-  let isIgnored = () => false;
-  if (opts.ignore) {
-    const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
-    isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);
-  }
-
-  const matcher = (input, returnObject = false) => {
-    const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });
-    const result = { glob, state, regex, posix, input, output, match, isMatch };
-
-    if (typeof opts.onResult === 'function') {
-      opts.onResult(result);
-    }
-
-    if (isMatch === false) {
-      result.isMatch = false;
-      return returnObject ? result : false;
-    }
-
-    if (isIgnored(input)) {
-      if (typeof opts.onIgnore === 'function') {
-        opts.onIgnore(result);
-      }
-      result.isMatch = false;
-      return returnObject ? result : false;
-    }
-
-    if (typeof opts.onMatch === 'function') {
-      opts.onMatch(result);
-    }
-    return returnObject ? result : true;
-  };
-
-  if (returnState) {
-    matcher.state = state;
-  }
-
-  return matcher;
-};
-
-/**
- * Test `input` with the given `regex`. This is used by the main
- * `picomatch()` function to test the input string.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.test(input, regex[, options]);
- *
- * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
- * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
- * ```
- * @param {String} `input` String to test.
- * @param {RegExp} `regex`
- * @return {Object} Returns an object with matching info.
- * @api public
- */
-
-picomatch.test = (input, regex, options, { glob, posix } = {}) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected input to be a string');
-  }
-
-  if (input === '') {
-    return { isMatch: false, output: '' };
-  }
-
-  const opts = options || {};
-  const format = opts.format || (posix ? utils.toPosixSlashes : null);
-  let match = input === glob;
-  let output = (match && format) ? format(input) : input;
-
-  if (match === false) {
-    output = format ? format(input) : input;
-    match = output === glob;
-  }
-
-  if (match === false || opts.capture === true) {
-    if (opts.matchBase === true || opts.basename === true) {
-      match = picomatch.matchBase(input, regex, options, posix);
-    } else {
-      match = regex.exec(output);
-    }
-  }
-
-  return { isMatch: Boolean(match), match, output };
-};
-
-/**
- * Match the basename of a filepath.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.matchBase(input, glob[, options]);
- * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
- * ```
- * @param {String} `input` String to test.
- * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).
- * @return {Boolean}
- * @api public
- */
-
-picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {
-  const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);
-  return regex.test(path.basename(input));
-};
-
-/**
- * Returns true if **any** of the given glob `patterns` match the specified `string`.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.isMatch(string, patterns[, options]);
- *
- * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
- * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
- * ```
- * @param {String|Array} str The string to test.
- * @param {String|Array} patterns One or more glob patterns to use for matching.
- * @param {Object} [options] See available [options](#options).
- * @return {Boolean} Returns true if any patterns match `str`
- * @api public
- */
-
-picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
-
-/**
- * Parse a glob pattern to create the source string for a regular
- * expression.
- *
- * ```js
- * const picomatch = require('picomatch');
- * const result = picomatch.parse(pattern[, options]);
- * ```
- * @param {String} `pattern`
- * @param {Object} `options`
- * @return {Object} Returns an object with useful properties and output to be used as a regex source string.
- * @api public
- */
-
-picomatch.parse = (pattern, options) => {
-  if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));
-  return parse(pattern, { ...options, fastpaths: false });
-};
-
-/**
- * Scan a glob pattern to separate the pattern into segments.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.scan(input[, options]);
- *
- * const result = picomatch.scan('!./foo/*.js');
- * console.log(result);
- * { prefix: '!./',
- *   input: '!./foo/*.js',
- *   start: 3,
- *   base: 'foo',
- *   glob: '*.js',
- *   isBrace: false,
- *   isBracket: false,
- *   isGlob: true,
- *   isExtglob: false,
- *   isGlobstar: false,
- *   negated: true }
- * ```
- * @param {String} `input` Glob pattern to scan.
- * @param {Object} `options`
- * @return {Object} Returns an object with
- * @api public
- */
-
-picomatch.scan = (input, options) => scan(input, options);
-
-/**
- * Compile a regular expression from the `state` object returned by the
- * [parse()](#parse) method.
- *
- * @param {Object} `state`
- * @param {Object} `options`
- * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.
- * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
- * @return {RegExp}
- * @api public
- */
-
-picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {
-  if (returnOutput === true) {
-    return state.output;
-  }
-
-  const opts = options || {};
-  const prepend = opts.contains ? '' : '^';
-  const append = opts.contains ? '' : '$';
-
-  let source = `${prepend}(?:${state.output})${append}`;
-  if (state && state.negated === true) {
-    source = `^(?!${source}).*$`;
-  }
-
-  const regex = picomatch.toRegex(source, options);
-  if (returnState === true) {
-    regex.state = state;
-  }
-
-  return regex;
-};
-
-/**
- * Create a regular expression from a parsed glob pattern.
- *
- * ```js
- * const picomatch = require('picomatch');
- * const state = picomatch.parse('*.js');
- * // picomatch.compileRe(state[, options]);
- *
- * console.log(picomatch.compileRe(state));
- * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
- * ```
- * @param {String} `state` The object returned from the `.parse` method.
- * @param {Object} `options`
- * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
- * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
- * @return {RegExp} Returns a regex created from the given pattern.
- * @api public
- */
-
-picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
-  if (!input || typeof input !== 'string') {
-    throw new TypeError('Expected a non-empty string');
-  }
-
-  let parsed = { negated: false, fastpaths: true };
-
-  if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {
-    parsed.output = parse.fastpaths(input, options);
-  }
-
-  if (!parsed.output) {
-    parsed = parse(input, options);
-  }
-
-  return picomatch.compileRe(parsed, options, returnOutput, returnState);
-};
-
-/**
- * Create a regular expression from the given regex source string.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.toRegex(source[, options]);
- *
- * const { output } = picomatch.parse('*.js');
- * console.log(picomatch.toRegex(output));
- * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
- * ```
- * @param {String} `source` Regular expression source string.
- * @param {Object} `options`
- * @return {RegExp}
- * @api public
- */
-
-picomatch.toRegex = (source, options) => {
-  try {
-    const opts = options || {};
-    return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));
-  } catch (err) {
-    if (options && options.debug === true) throw err;
-    return /$^/;
-  }
-};
-
-/**
- * Picomatch constants.
- * @return {Object}
- */
-
-picomatch.constants = constants;
-
-/**
- * Expose "picomatch"
- */
-
-module.exports = picomatch;
Index: de_modules/picomatch/lib/scan.js
===================================================================
--- node_modules/picomatch/lib/scan.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,391 +1,0 @@
-'use strict';
-
-const utils = require('./utils');
-const {
-  CHAR_ASTERISK,             /* * */
-  CHAR_AT,                   /* @ */
-  CHAR_BACKWARD_SLASH,       /* \ */
-  CHAR_COMMA,                /* , */
-  CHAR_DOT,                  /* . */
-  CHAR_EXCLAMATION_MARK,     /* ! */
-  CHAR_FORWARD_SLASH,        /* / */
-  CHAR_LEFT_CURLY_BRACE,     /* { */
-  CHAR_LEFT_PARENTHESES,     /* ( */
-  CHAR_LEFT_SQUARE_BRACKET,  /* [ */
-  CHAR_PLUS,                 /* + */
-  CHAR_QUESTION_MARK,        /* ? */
-  CHAR_RIGHT_CURLY_BRACE,    /* } */
-  CHAR_RIGHT_PARENTHESES,    /* ) */
-  CHAR_RIGHT_SQUARE_BRACKET  /* ] */
-} = require('./constants');
-
-const isPathSeparator = code => {
-  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
-};
-
-const depth = token => {
-  if (token.isPrefix !== true) {
-    token.depth = token.isGlobstar ? Infinity : 1;
-  }
-};
-
-/**
- * Quickly scans a glob pattern and returns an object with a handful of
- * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
- * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
- * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
- *
- * ```js
- * const pm = require('picomatch');
- * console.log(pm.scan('foo/bar/*.js'));
- * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
- * ```
- * @param {String} `str`
- * @param {Object} `options`
- * @return {Object} Returns an object with tokens and regex source string.
- * @api public
- */
-
-const scan = (input, options) => {
-  const opts = options || {};
-
-  const length = input.length - 1;
-  const scanToEnd = opts.parts === true || opts.scanToEnd === true;
-  const slashes = [];
-  const tokens = [];
-  const parts = [];
-
-  let str = input;
-  let index = -1;
-  let start = 0;
-  let lastIndex = 0;
-  let isBrace = false;
-  let isBracket = false;
-  let isGlob = false;
-  let isExtglob = false;
-  let isGlobstar = false;
-  let braceEscaped = false;
-  let backslashes = false;
-  let negated = false;
-  let negatedExtglob = false;
-  let finished = false;
-  let braces = 0;
-  let prev;
-  let code;
-  let token = { value: '', depth: 0, isGlob: false };
-
-  const eos = () => index >= length;
-  const peek = () => str.charCodeAt(index + 1);
-  const advance = () => {
-    prev = code;
-    return str.charCodeAt(++index);
-  };
-
-  while (index < length) {
-    code = advance();
-    let next;
-
-    if (code === CHAR_BACKWARD_SLASH) {
-      backslashes = token.backslashes = true;
-      code = advance();
-
-      if (code === CHAR_LEFT_CURLY_BRACE) {
-        braceEscaped = true;
-      }
-      continue;
-    }
-
-    if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {
-      braces++;
-
-      while (eos() !== true && (code = advance())) {
-        if (code === CHAR_BACKWARD_SLASH) {
-          backslashes = token.backslashes = true;
-          advance();
-          continue;
-        }
-
-        if (code === CHAR_LEFT_CURLY_BRACE) {
-          braces++;
-          continue;
-        }
-
-        if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {
-          isBrace = token.isBrace = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-
-          if (scanToEnd === true) {
-            continue;
-          }
-
-          break;
-        }
-
-        if (braceEscaped !== true && code === CHAR_COMMA) {
-          isBrace = token.isBrace = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-
-          if (scanToEnd === true) {
-            continue;
-          }
-
-          break;
-        }
-
-        if (code === CHAR_RIGHT_CURLY_BRACE) {
-          braces--;
-
-          if (braces === 0) {
-            braceEscaped = false;
-            isBrace = token.isBrace = true;
-            finished = true;
-            break;
-          }
-        }
-      }
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-
-    if (code === CHAR_FORWARD_SLASH) {
-      slashes.push(index);
-      tokens.push(token);
-      token = { value: '', depth: 0, isGlob: false };
-
-      if (finished === true) continue;
-      if (prev === CHAR_DOT && index === (start + 1)) {
-        start += 2;
-        continue;
-      }
-
-      lastIndex = index + 1;
-      continue;
-    }
-
-    if (opts.noext !== true) {
-      const isExtglobChar = code === CHAR_PLUS
-        || code === CHAR_AT
-        || code === CHAR_ASTERISK
-        || code === CHAR_QUESTION_MARK
-        || code === CHAR_EXCLAMATION_MARK;
-
-      if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {
-        isGlob = token.isGlob = true;
-        isExtglob = token.isExtglob = true;
-        finished = true;
-        if (code === CHAR_EXCLAMATION_MARK && index === start) {
-          negatedExtglob = true;
-        }
-
-        if (scanToEnd === true) {
-          while (eos() !== true && (code = advance())) {
-            if (code === CHAR_BACKWARD_SLASH) {
-              backslashes = token.backslashes = true;
-              code = advance();
-              continue;
-            }
-
-            if (code === CHAR_RIGHT_PARENTHESES) {
-              isGlob = token.isGlob = true;
-              finished = true;
-              break;
-            }
-          }
-          continue;
-        }
-        break;
-      }
-    }
-
-    if (code === CHAR_ASTERISK) {
-      if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
-      isGlob = token.isGlob = true;
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-      break;
-    }
-
-    if (code === CHAR_QUESTION_MARK) {
-      isGlob = token.isGlob = true;
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-      break;
-    }
-
-    if (code === CHAR_LEFT_SQUARE_BRACKET) {
-      while (eos() !== true && (next = advance())) {
-        if (next === CHAR_BACKWARD_SLASH) {
-          backslashes = token.backslashes = true;
-          advance();
-          continue;
-        }
-
-        if (next === CHAR_RIGHT_SQUARE_BRACKET) {
-          isBracket = token.isBracket = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-          break;
-        }
-      }
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-
-    if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
-      negated = token.negated = true;
-      start++;
-      continue;
-    }
-
-    if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {
-      isGlob = token.isGlob = true;
-
-      if (scanToEnd === true) {
-        while (eos() !== true && (code = advance())) {
-          if (code === CHAR_LEFT_PARENTHESES) {
-            backslashes = token.backslashes = true;
-            code = advance();
-            continue;
-          }
-
-          if (code === CHAR_RIGHT_PARENTHESES) {
-            finished = true;
-            break;
-          }
-        }
-        continue;
-      }
-      break;
-    }
-
-    if (isGlob === true) {
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-  }
-
-  if (opts.noext === true) {
-    isExtglob = false;
-    isGlob = false;
-  }
-
-  let base = str;
-  let prefix = '';
-  let glob = '';
-
-  if (start > 0) {
-    prefix = str.slice(0, start);
-    str = str.slice(start);
-    lastIndex -= start;
-  }
-
-  if (base && isGlob === true && lastIndex > 0) {
-    base = str.slice(0, lastIndex);
-    glob = str.slice(lastIndex);
-  } else if (isGlob === true) {
-    base = '';
-    glob = str;
-  } else {
-    base = str;
-  }
-
-  if (base && base !== '' && base !== '/' && base !== str) {
-    if (isPathSeparator(base.charCodeAt(base.length - 1))) {
-      base = base.slice(0, -1);
-    }
-  }
-
-  if (opts.unescape === true) {
-    if (glob) glob = utils.removeBackslashes(glob);
-
-    if (base && backslashes === true) {
-      base = utils.removeBackslashes(base);
-    }
-  }
-
-  const state = {
-    prefix,
-    input,
-    start,
-    base,
-    glob,
-    isBrace,
-    isBracket,
-    isGlob,
-    isExtglob,
-    isGlobstar,
-    negated,
-    negatedExtglob
-  };
-
-  if (opts.tokens === true) {
-    state.maxDepth = 0;
-    if (!isPathSeparator(code)) {
-      tokens.push(token);
-    }
-    state.tokens = tokens;
-  }
-
-  if (opts.parts === true || opts.tokens === true) {
-    let prevIndex;
-
-    for (let idx = 0; idx < slashes.length; idx++) {
-      const n = prevIndex ? prevIndex + 1 : start;
-      const i = slashes[idx];
-      const value = input.slice(n, i);
-      if (opts.tokens) {
-        if (idx === 0 && start !== 0) {
-          tokens[idx].isPrefix = true;
-          tokens[idx].value = prefix;
-        } else {
-          tokens[idx].value = value;
-        }
-        depth(tokens[idx]);
-        state.maxDepth += tokens[idx].depth;
-      }
-      if (idx !== 0 || value !== '') {
-        parts.push(value);
-      }
-      prevIndex = i;
-    }
-
-    if (prevIndex && prevIndex + 1 < input.length) {
-      const value = input.slice(prevIndex + 1);
-      parts.push(value);
-
-      if (opts.tokens) {
-        tokens[tokens.length - 1].value = value;
-        depth(tokens[tokens.length - 1]);
-        state.maxDepth += tokens[tokens.length - 1].depth;
-      }
-    }
-
-    state.slashes = slashes;
-    state.parts = parts;
-  }
-
-  return state;
-};
-
-module.exports = scan;
Index: de_modules/picomatch/lib/utils.js
===================================================================
--- node_modules/picomatch/lib/utils.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,64 +1,0 @@
-'use strict';
-
-const path = require('path');
-const win32 = process.platform === 'win32';
-const {
-  REGEX_BACKSLASH,
-  REGEX_REMOVE_BACKSLASH,
-  REGEX_SPECIAL_CHARS,
-  REGEX_SPECIAL_CHARS_GLOBAL
-} = require('./constants');
-
-exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
-exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
-exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);
-exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1');
-exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');
-
-exports.removeBackslashes = str => {
-  return str.replace(REGEX_REMOVE_BACKSLASH, match => {
-    return match === '\\' ? '' : match;
-  });
-};
-
-exports.supportsLookbehinds = () => {
-  const segs = process.version.slice(1).split('.').map(Number);
-  if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {
-    return true;
-  }
-  return false;
-};
-
-exports.isWindows = options => {
-  if (options && typeof options.windows === 'boolean') {
-    return options.windows;
-  }
-  return win32 === true || path.sep === '\\';
-};
-
-exports.escapeLast = (input, char, lastIdx) => {
-  const idx = input.lastIndexOf(char, lastIdx);
-  if (idx === -1) return input;
-  if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1);
-  return `${input.slice(0, idx)}\\${input.slice(idx)}`;
-};
-
-exports.removePrefix = (input, state = {}) => {
-  let output = input;
-  if (output.startsWith('./')) {
-    output = output.slice(2);
-    state.prefix = './';
-  }
-  return output;
-};
-
-exports.wrapOutput = (input, state = {}, options = {}) => {
-  const prepend = options.contains ? '' : '^';
-  const append = options.contains ? '' : '$';
-
-  let output = `${prepend}(?:${input})${append}`;
-  if (state.negated === true) {
-    output = `(?:^(?!${output}).*$)`;
-  }
-  return output;
-};
Index: de_modules/picomatch/package.json
===================================================================
--- node_modules/picomatch/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,81 +1,0 @@
-{
-  "name": "picomatch",
-  "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.",
-  "version": "2.3.2",
-  "homepage": "https://github.com/micromatch/picomatch",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "funding": "https://github.com/sponsors/jonschlinkert",
-  "repository": "micromatch/picomatch",
-  "bugs": {
-    "url": "https://github.com/micromatch/picomatch/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js",
-    "lib"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.6"
-  },
-  "scripts": {
-    "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
-    "mocha": "mocha --reporter dot",
-    "test": "npm run lint && npm run mocha",
-    "test:ci": "npm run test:cover",
-    "test:cover": "nyc npm run mocha"
-  },
-  "devDependencies": {
-    "eslint": "^6.8.0",
-    "fill-range": "^7.0.1",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.2.2",
-    "nyc": "^15.0.0",
-    "time-require": "github:jonschlinkert/time-require"
-  },
-  "keywords": [
-    "glob",
-    "match",
-    "picomatch"
-  ],
-  "nyc": {
-    "reporter": [
-      "html",
-      "lcov",
-      "text-summary"
-    ]
-  },
-  "verb": {
-    "toc": {
-      "render": true,
-      "method": "preWrite",
-      "maxdepth": 3
-    },
-    "layout": "empty",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "related": {
-      "list": [
-        "braces",
-        "micromatch"
-      ]
-    },
-    "reflinks": [
-      "braces",
-      "expand-brackets",
-      "extglob",
-      "fill-range",
-      "micromatch",
-      "minimatch",
-      "nanomatch",
-      "picomatch"
-    ]
-  }
-}
Index: de_modules/postgres-array/index.d.ts
===================================================================
--- node_modules/postgres-array/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,4 +1,0 @@
-
-export function parse(source: string): string[];
-export function parse<T>(source: string, transform: (value: string) => T): T[];
-
Index: de_modules/postgres-array/index.js
===================================================================
--- node_modules/postgres-array/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,97 +1,0 @@
-'use strict'
-
-exports.parse = function (source, transform) {
-  return new ArrayParser(source, transform).parse()
-}
-
-class ArrayParser {
-  constructor (source, transform) {
-    this.source = source
-    this.transform = transform || identity
-    this.position = 0
-    this.entries = []
-    this.recorded = []
-    this.dimension = 0
-  }
-
-  isEof () {
-    return this.position >= this.source.length
-  }
-
-  nextCharacter () {
-    var character = this.source[this.position++]
-    if (character === '\\') {
-      return {
-        value: this.source[this.position++],
-        escaped: true
-      }
-    }
-    return {
-      value: character,
-      escaped: false
-    }
-  }
-
-  record (character) {
-    this.recorded.push(character)
-  }
-
-  newEntry (includeEmpty) {
-    var entry
-    if (this.recorded.length > 0 || includeEmpty) {
-      entry = this.recorded.join('')
-      if (entry === 'NULL' && !includeEmpty) {
-        entry = null
-      }
-      if (entry !== null) entry = this.transform(entry)
-      this.entries.push(entry)
-      this.recorded = []
-    }
-  }
-
-  consumeDimensions () {
-    if (this.source[0] === '[') {
-      while (!this.isEof()) {
-        var char = this.nextCharacter()
-        if (char.value === '=') break
-      }
-    }
-  }
-
-  parse (nested) {
-    var character, parser, quote
-    this.consumeDimensions()
-    while (!this.isEof()) {
-      character = this.nextCharacter()
-      if (character.value === '{' && !quote) {
-        this.dimension++
-        if (this.dimension > 1) {
-          parser = new ArrayParser(this.source.substr(this.position - 1), this.transform)
-          this.entries.push(parser.parse(true))
-          this.position += parser.position - 2
-        }
-      } else if (character.value === '}' && !quote) {
-        this.dimension--
-        if (!this.dimension) {
-          this.newEntry()
-          if (nested) return this.entries
-        }
-      } else if (character.value === '"' && !character.escaped) {
-        if (quote) this.newEntry(true)
-        quote = !quote
-      } else if (character.value === ',' && !quote) {
-        this.newEntry()
-      } else {
-        this.record(character.value)
-      }
-    }
-    if (this.dimension !== 0) {
-      throw new Error('array dimension not balanced')
-    }
-    return this.entries
-  }
-}
-
-function identity (value) {
-  return value
-}
Index: de_modules/postgres-array/license
===================================================================
--- node_modules/postgres-array/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/postgres-array/package.json
===================================================================
--- node_modules/postgres-array/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,35 +1,0 @@
-{
-  "name": "postgres-array",
-  "main": "index.js",
-  "version": "2.0.0",
-  "description": "Parse postgres array columns",
-  "license": "MIT",
-  "repository": "bendrucker/postgres-array",
-  "author": {
-    "name": "Ben Drucker",
-    "email": "bvdrucker@gmail.com",
-    "url": "bendrucker.me"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "scripts": {
-    "test": "standard && tape test.js"
-  },
-  "types": "index.d.ts",
-  "keywords": [
-    "postgres",
-    "array",
-    "parser"
-  ],
-  "dependencies": {},
-  "devDependencies": {
-    "standard": "^12.0.1",
-    "tape": "^4.0.0"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts",
-    "readme.md"
-  ]
-}
Index: de_modules/postgres-array/readme.md
===================================================================
--- node_modules/postgres-array/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-# postgres-array [![Build Status](https://travis-ci.org/bendrucker/postgres-array.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-array)
-
-> Parse postgres array columns
-
-
-## Install
-
-```
-$ npm install --save postgres-array
-```
-
-
-## Usage
-
-```js
-var postgresArray = require('postgres-array')
-
-postgresArray.parse('{1,2,3}', (value) => parseInt(value, 10))
-//=> [1, 2, 3]
-```
-
-## API
-
-#### `parse(input, [transform])` -> `array`
-
-##### input
-
-*Required*  
-Type: `string`
-
-A Postgres array string.
-
-##### transform
-
-Type: `function`  
-Default: `identity`
-
-A function that transforms non-null values inserted into the array.
-
-
-## License
-
-MIT © [Ben Drucker](http://bendrucker.me)
Index: de_modules/postgres-bytea/index.js
===================================================================
--- node_modules/postgres-bytea/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,33 +1,0 @@
-'use strict'
-
-var bufferFrom = Buffer.from || Buffer
-
-module.exports = function parseBytea (input) {
-  if (/^\\x/.test(input)) {
-    // new 'hex' style response (pg >9.0)
-    return bufferFrom(input.substr(2), 'hex')
-  }
-  var output = ''
-  var i = 0
-  while (i < input.length) {
-    if (input[i] !== '\\') {
-      output += input[i]
-      ++i
-    } else {
-      if (/[0-7]{3}/.test(input.substr(i + 1, 3))) {
-        output += String.fromCharCode(parseInt(input.substr(i + 1, 3), 8))
-        i += 4
-      } else {
-        var backslashes = 1
-        while (i + backslashes < input.length && input[i + backslashes] === '\\') {
-          backslashes++
-        }
-        for (var k = 0; k < Math.floor(backslashes / 2); ++k) {
-          output += '\\'
-        }
-        i += Math.floor(backslashes / 2) * 2
-      }
-    }
-  }
-  return bufferFrom(output, 'binary')
-}
Index: de_modules/postgres-bytea/license
===================================================================
--- node_modules/postgres-bytea/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/postgres-bytea/package.json
===================================================================
--- node_modules/postgres-bytea/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-{
-  "name": "postgres-bytea",
-  "main": "index.js",
-  "version": "1.0.1",
-  "description": "Postgres bytea parser",
-  "license": "MIT",
-  "repository": "bendrucker/postgres-bytea",
-  "author": {
-    "name": "Ben Drucker",
-    "email": "bvdrucker@gmail.com",
-    "url": "bendrucker.me"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "standard && tape test.js"
-  },
-  "keywords": [
-    "bytea",
-    "postgres",
-    "binary",
-    "parser"
-  ],
-  "dependencies": {},
-  "devDependencies": {
-    "tape": "^4.0.0",
-    "standard": "^4.0.0"
-  },
-  "files": [
-    "index.js",
-    "readme.md"
-  ]
-}
Index: de_modules/postgres-bytea/readme.md
===================================================================
--- node_modules/postgres-bytea/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-# postgres-bytea [![Build Status](https://travis-ci.org/bendrucker/postgres-bytea.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-bytea)
-
-> Postgres bytea parser
-
-
-## Install
-
-```
-$ npm install --save postgres-bytea
-```
-
-
-## Usage
-
-```js
-var bytea = require('postgres-bytea');
-bytea('\\000\\100\\200')
-//=> buffer
-```
-
-## API
-
-#### `bytea(input)` -> `buffer`
-
-##### input
-
-*Required*  
-Type: `string`
-
-A Postgres bytea binary string.
-
-## License
-
-MIT © [Ben Drucker](http://bendrucker.me)
Index: de_modules/postgres-date/index.js
===================================================================
--- node_modules/postgres-date/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,116 +1,0 @@
-'use strict'
-
-var DATE_TIME = /(\d{1,})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(\.\d{1,})?.*?( BC)?$/
-var DATE = /^(\d{1,})-(\d{2})-(\d{2})( BC)?$/
-var TIME_ZONE = /([Z+-])(\d{2})?:?(\d{2})?:?(\d{2})?/
-var INFINITY = /^-?infinity$/
-
-module.exports = function parseDate (isoDate) {
-  if (INFINITY.test(isoDate)) {
-    // Capitalize to Infinity before passing to Number
-    return Number(isoDate.replace('i', 'I'))
-  }
-  var matches = DATE_TIME.exec(isoDate)
-
-  if (!matches) {
-    // Force YYYY-MM-DD dates to be parsed as local time
-    return getDate(isoDate) || null
-  }
-
-  var isBC = !!matches[8]
-  var year = parseInt(matches[1], 10)
-  if (isBC) {
-    year = bcYearToNegativeYear(year)
-  }
-
-  var month = parseInt(matches[2], 10) - 1
-  var day = matches[3]
-  var hour = parseInt(matches[4], 10)
-  var minute = parseInt(matches[5], 10)
-  var second = parseInt(matches[6], 10)
-
-  var ms = matches[7]
-  ms = ms ? 1000 * parseFloat(ms) : 0
-
-  var date
-  var offset = timeZoneOffset(isoDate)
-  if (offset != null) {
-    date = new Date(Date.UTC(year, month, day, hour, minute, second, ms))
-
-    // Account for years from 0 to 99 being interpreted as 1900-1999
-    // by Date.UTC / the multi-argument form of the Date constructor
-    if (is0To99(year)) {
-      date.setUTCFullYear(year)
-    }
-
-    if (offset !== 0) {
-      date.setTime(date.getTime() - offset)
-    }
-  } else {
-    date = new Date(year, month, day, hour, minute, second, ms)
-
-    if (is0To99(year)) {
-      date.setFullYear(year)
-    }
-  }
-
-  return date
-}
-
-function getDate (isoDate) {
-  var matches = DATE.exec(isoDate)
-  if (!matches) {
-    return
-  }
-
-  var year = parseInt(matches[1], 10)
-  var isBC = !!matches[4]
-  if (isBC) {
-    year = bcYearToNegativeYear(year)
-  }
-
-  var month = parseInt(matches[2], 10) - 1
-  var day = matches[3]
-  // YYYY-MM-DD will be parsed as local time
-  var date = new Date(year, month, day)
-
-  if (is0To99(year)) {
-    date.setFullYear(year)
-  }
-
-  return date
-}
-
-// match timezones:
-// Z (UTC)
-// -05
-// +06:30
-function timeZoneOffset (isoDate) {
-  if (isoDate.endsWith('+00')) {
-    return 0
-  }
-
-  var zone = TIME_ZONE.exec(isoDate.split(' ')[1])
-  if (!zone) return
-  var type = zone[1]
-
-  if (type === 'Z') {
-    return 0
-  }
-  var sign = type === '-' ? -1 : 1
-  var offset = parseInt(zone[2], 10) * 3600 +
-    parseInt(zone[3] || 0, 10) * 60 +
-    parseInt(zone[4] || 0, 10)
-
-  return offset * sign * 1000
-}
-
-function bcYearToNegativeYear (year) {
-  // Account for numerical difference between representations of BC years
-  // See: https://github.com/bendrucker/postgres-date/issues/5
-  return -(year - 1)
-}
-
-function is0To99 (num) {
-  return num >= 0 && num < 100
-}
Index: de_modules/postgres-date/license
===================================================================
--- node_modules/postgres-date/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/postgres-date/package.json
===================================================================
--- node_modules/postgres-date/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,33 +1,0 @@
-{
-  "name": "postgres-date",
-  "main": "index.js",
-  "version": "1.0.7",
-  "description": "Postgres date column parser",
-  "license": "MIT",
-  "repository": "bendrucker/postgres-date",
-  "author": {
-    "name": "Ben Drucker",
-    "email": "bvdrucker@gmail.com",
-    "url": "bendrucker.me"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "standard && tape test.js"
-  },
-  "keywords": [
-    "postgres",
-    "date",
-    "parser"
-  ],
-  "dependencies": {},
-  "devDependencies": {
-    "standard": "^14.0.0",
-    "tape": "^5.0.0"
-  },
-  "files": [
-    "index.js",
-    "readme.md"
-  ]
-}
Index: de_modules/postgres-date/readme.md
===================================================================
--- node_modules/postgres-date/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,49 +1,0 @@
-# postgres-date [![Build Status](https://travis-ci.org/bendrucker/postgres-date.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-date) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-date.svg)](https://greenkeeper.io/)
-
-> Postgres date output parser
-
-This package parses [date/time outputs](https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-OUTPUT) from Postgres into Javascript `Date` objects. Its goal is to match Postgres behavior and preserve data accuracy.
-
-If you find a case where a valid Postgres output results in incorrect parsing (including loss of precision), please [create a pull request](https://github.com/bendrucker/postgres-date/compare) and provide a failing test.
-
-**Supported Postgres Versions:** `>= 9.6`
-
-All prior versions of Postgres are likely compatible but not officially supported.
-
-## Install
-
-```
-$ npm install --save postgres-date
-```
-
-
-## Usage
-
-```js
-var parse = require('postgres-date')
-parse('2011-01-23 22:15:51Z')
-// => 2011-01-23T22:15:51.000Z
-```
-
-## API
-
-#### `parse(isoDate)` -> `date`
-
-##### isoDate
-
-*Required*  
-Type: `string`
-
-A date string from Postgres.
-
-## Releases
-
-The following semantic versioning increments will be used for changes:
-
-* **Major**: Removal of support for Node.js versions or Postgres versions (not expected)
-* **Minor**: Unused, since Postgres returns dates in standard ISO 8601 format
-* **Patch**: Any fix for parsing behavior
-
-## License
-
-MIT © [Ben Drucker](http://bendrucker.me)
Index: de_modules/postgres-interval/index.d.ts
===================================================================
--- node_modules/postgres-interval/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-declare namespace PostgresInterval {
-  export interface IPostgresInterval {
-    years?: number;
-    months?: number;
-    days?: number;
-    hours?: number;
-    minutes?: number;
-    seconds?: number;
-    milliseconds?: number;
-
-    toPostgres(): string;
-
-    toISO(): string;
-    toISOString(): string;
-  }
-}
-
-declare function PostgresInterval(raw: string): PostgresInterval.IPostgresInterval;
-
-export = PostgresInterval;
Index: de_modules/postgres-interval/index.js
===================================================================
--- node_modules/postgres-interval/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,125 +1,0 @@
-'use strict'
-
-var extend = require('xtend/mutable')
-
-module.exports = PostgresInterval
-
-function PostgresInterval (raw) {
-  if (!(this instanceof PostgresInterval)) {
-    return new PostgresInterval(raw)
-  }
-  extend(this, parse(raw))
-}
-var properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years']
-PostgresInterval.prototype.toPostgres = function () {
-  var filtered = properties.filter(this.hasOwnProperty, this)
-
-  // In addition to `properties`, we need to account for fractions of seconds.
-  if (this.milliseconds && filtered.indexOf('seconds') < 0) {
-    filtered.push('seconds')
-  }
-
-  if (filtered.length === 0) return '0'
-  return filtered
-    .map(function (property) {
-      var value = this[property] || 0
-
-      // Account for fractional part of seconds,
-      // remove trailing zeroes.
-      if (property === 'seconds' && this.milliseconds) {
-        value = (value + this.milliseconds / 1000).toFixed(6).replace(/\.?0+$/, '')
-      }
-
-      return value + ' ' + property
-    }, this)
-    .join(' ')
-}
-
-var propertiesISOEquivalent = {
-  years: 'Y',
-  months: 'M',
-  days: 'D',
-  hours: 'H',
-  minutes: 'M',
-  seconds: 'S'
-}
-var dateProperties = ['years', 'months', 'days']
-var timeProperties = ['hours', 'minutes', 'seconds']
-// according to ISO 8601
-PostgresInterval.prototype.toISOString = PostgresInterval.prototype.toISO = function () {
-  var datePart = dateProperties
-    .map(buildProperty, this)
-    .join('')
-
-  var timePart = timeProperties
-    .map(buildProperty, this)
-    .join('')
-
-  return 'P' + datePart + 'T' + timePart
-
-  function buildProperty (property) {
-    var value = this[property] || 0
-
-    // Account for fractional part of seconds,
-    // remove trailing zeroes.
-    if (property === 'seconds' && this.milliseconds) {
-      value = (value + this.milliseconds / 1000).toFixed(6).replace(/0+$/, '')
-    }
-
-    return value + propertiesISOEquivalent[property]
-  }
-}
-
-var NUMBER = '([+-]?\\d+)'
-var YEAR = NUMBER + '\\s+years?'
-var MONTH = NUMBER + '\\s+mons?'
-var DAY = NUMBER + '\\s+days?'
-var TIME = '([+-])?([\\d]*):(\\d\\d):(\\d\\d)\\.?(\\d{1,6})?'
-var INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) {
-  return '(' + regexString + ')?'
-})
-  .join('\\s*'))
-
-// Positions of values in regex match
-var positions = {
-  years: 2,
-  months: 4,
-  days: 6,
-  hours: 9,
-  minutes: 10,
-  seconds: 11,
-  milliseconds: 12
-}
-// We can use negative time
-var negatives = ['hours', 'minutes', 'seconds', 'milliseconds']
-
-function parseMilliseconds (fraction) {
-  // add omitted zeroes
-  var microseconds = fraction + '000000'.slice(fraction.length)
-  return parseInt(microseconds, 10) / 1000
-}
-
-function parse (interval) {
-  if (!interval) return {}
-  var matches = INTERVAL.exec(interval)
-  var isNegative = matches[8] === '-'
-  return Object.keys(positions)
-    .reduce(function (parsed, property) {
-      var position = positions[property]
-      var value = matches[position]
-      // no empty string
-      if (!value) return parsed
-      // milliseconds are actually microseconds (up to 6 digits)
-      // with omitted trailing zeroes.
-      value = property === 'milliseconds'
-        ? parseMilliseconds(value)
-        : parseInt(value, 10)
-      // no zeros
-      if (!value) return parsed
-      if (isNegative && ~negatives.indexOf(property)) {
-        value *= -1
-      }
-      parsed[property] = value
-      return parsed
-    }, {})
-}
Index: de_modules/postgres-interval/license
===================================================================
--- node_modules/postgres-interval/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/postgres-interval/package.json
===================================================================
--- node_modules/postgres-interval/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,36 +1,0 @@
-{
-  "name": "postgres-interval",
-  "main": "index.js",
-  "version": "1.2.0",
-  "description": "Parse Postgres interval columns",
-  "license": "MIT",
-  "repository": "bendrucker/postgres-interval",
-  "author": {
-    "name": "Ben Drucker",
-    "email": "bvdrucker@gmail.com",
-    "url": "bendrucker.me"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "standard && tape test.js"
-  },
-  "keywords": [
-    "postgres",
-    "interval",
-    "parser"
-  ],
-  "dependencies": {
-    "xtend": "^4.0.0"
-  },
-  "devDependencies": {
-    "tape": "^4.0.0",
-    "standard": "^12.0.1"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts",
-    "readme.md"
-  ]
-}
Index: de_modules/postgres-interval/readme.md
===================================================================
--- node_modules/postgres-interval/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,48 +1,0 @@
-# postgres-interval [![Build Status](https://travis-ci.org/bendrucker/postgres-interval.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-interval) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-interval.svg)](https://greenkeeper.io/)
-
-> Parse Postgres interval columns
-
-
-## Install
-
-```
-$ npm install --save postgres-interval
-```
-
-
-## Usage
-
-```js
-var parse = require('postgres-interval')
-var interval = parse('01:02:03')
-//=> {hours: 1, minutes: 2, seconds: 3}
-interval.toPostgres()
-// 3 seconds 2 minutes 1 hours
-interval.toISO()
-// P0Y0M0DT1H2M3S
-```
-
-## API
-
-#### `parse(pgInterval)` -> `interval`
-
-##### pgInterval
-
-*Required*  
-Type: `string`
-
-A Postgres interval string.
-
-#### `interval.toPostgres()` -> `string`
-
-Returns an interval string. This allows the interval object to be passed into prepared statements.
-
-#### `interval.toISOString()` -> `string`
-
-Returns an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations) compliant string.
-
-Also available as `interval.toISO()` for backwards compatibility.
-
-## License
-
-MIT © [Ben Drucker](http://bendrucker.me)
Index: de_modules/pstree.remy/.travis.yml
===================================================================
--- node_modules/pstree.remy/.travis.yml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-language: node_js
-cache:
-  directories:
-    - ~/.npm
-notifications:
-  email: false
-node_js:
-  - '8'
Index: de_modules/pstree.remy/LICENSE
===================================================================
--- node_modules/pstree.remy/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-The MIT License (MIT)
-Copyright © 2019 Remy Sharp, https://remysharp.com <remy@remysharp.com>
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/pstree.remy/README.md
===================================================================
--- node_modules/pstree.remy/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,26 +1,0 @@
-# pstree.remy
-
-> Cross platform ps-tree (including unix flavours without ps)
-
-## Installation
-
-```shel
-npm install pstree.remy
-```
-
-## Usage
-
-```js
-const psTree = psTree require('pstree.remy');
-
-psTree(PID, (err, pids) => {
-  if (err) {
-    console.error(err);
-  }
-  console.log(pids)
-});
-
-console.log(psTree.hasPS
-  ? "This platform has the ps shell command"
-  : "This platform does not have the ps shell command");
-```
Index: de_modules/pstree.remy/lib/index.js
===================================================================
--- node_modules/pstree.remy/lib/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,37 +1,0 @@
-const exec = require('child_process').exec;
-const tree = require('./tree');
-const utils = require('./utils');
-var hasPS = true;
-
-// discover if the OS has `ps`, and therefore can use psTree
-exec('ps', (error) => {
-  module.exports.hasPS = hasPS = !error;
-});
-
-module.exports = function main(pid, callback) {
-  if (typeof pid === 'number') {
-    pid = pid.toString();
-  }
-
-  if (hasPS && !process.env.NO_PS) {
-    return tree(pid, callback);
-  }
-
-  utils
-    .getStat()
-    .then(utils.tree)
-    .then((tree) => utils.pidsForTree(tree, pid))
-    .then((res) =>
-      callback(
-        null,
-        res.map((p) => p.PID)
-      )
-    )
-    .catch((error) => callback(error));
-};
-
-if (!module.parent) {
-  module.exports(process.argv[2], (e, pids) => console.log(pids));
-}
-
-module.exports.hasPS = hasPS;
Index: de_modules/pstree.remy/lib/tree.js
===================================================================
--- node_modules/pstree.remy/lib/tree.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,37 +1,0 @@
-const spawn = require('child_process').spawn;
-
-module.exports = function (rootPid, callback) {
-  const pidsOfInterest = new Set([parseInt(rootPid, 10)]);
-  var output = '';
-
-  // *nix
-  const ps = spawn('ps', ['-A', '-o', 'ppid,pid']);
-  ps.stdout.on('data', (data) => {
-    output += data.toString('ascii');
-  });
-
-  ps.on('close', () => {
-    try {
-      const res = output
-        .split('\n')
-        .slice(1)
-        .map((_) => _.trim())
-        .reduce((acc, line) => {
-          const pids = line.split(/\s+/);
-          const ppid = parseInt(pids[0], 10);
-
-          if (pidsOfInterest.has(ppid)) {
-            const pid = parseInt(pids[1], 10);
-            acc.push(pid);
-            pidsOfInterest.add(pid);
-          }
-
-          return acc;
-        }, []);
-
-      callback(null, res);
-    } catch (e) {
-      callback(e, null);
-    }
-  });
-};
Index: de_modules/pstree.remy/lib/utils.js
===================================================================
--- node_modules/pstree.remy/lib/utils.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,53 +1,0 @@
-const spawn = require('child_process').spawn;
-
-module.exports = { tree, pidsForTree, getStat };
-
-function getStat() {
-  return new Promise((resolve) => {
-    const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`;
-    const spawned = spawn('sh', ['-c', command], {
-      stdio: ['pipe', 'pipe', 'pipe'],
-    });
-
-    var res = '';
-    spawned.stdout.on('data', (data) => (res += data));
-    spawned.on('close', () => resolve(res));
-  });
-}
-
-function template(s) {
-  var stat = null;
-  // 'pid', 'comm', 'state', 'ppid', 'pgrp'
-  // %d     (%s)    %c       %d      %d
-  s.replace(
-    /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g,
-    (all, PID, COMMAND, STAT, PPID) => {
-      stat = { PID, COMMAND, PPID, STAT };
-    }
-  );
-
-  return stat;
-}
-
-function tree(stats) {
-  const processes = stats.split('\n').map(template).filter(Boolean);
-
-  return processes;
-}
-
-function pidsForTree(tree, pid) {
-  if (typeof pid === 'number') {
-    pid = pid.toString();
-  }
-  const parents = [pid];
-  const pids = [];
-
-  tree.forEach((proc) => {
-    if (parents.indexOf(proc.PPID) !== -1) {
-      parents.push(proc.PID);
-      pids.push(proc);
-    }
-  });
-
-  return pids;
-}
Index: de_modules/pstree.remy/package.json
===================================================================
--- node_modules/pstree.remy/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,33 +1,0 @@
-{
-  "name": "pstree.remy",
-  "version": "1.1.8",
-  "main": "lib/index.js",
-  "prettier": {
-    "trailingComma": "es5",
-    "semi": true,
-    "singleQuote": true
-  },
-  "scripts": {
-    "test": "tap tests/*.test.js",
-    "_prepublish": "npm test"
-  },
-  "keywords": [
-    "ps",
-    "pstree",
-    "ps tree"
-  ],
-  "author": "Remy Sharp",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/pstree.git"
-  },
-  "devDependencies": {
-    "tap": "^11.0.0"
-  },
-  "directories": {
-    "test": "tests"
-  },
-  "dependencies": {},
-  "description": "Collects the full tree of processes from /proc"
-}
Index: de_modules/pstree.remy/tests/fixtures/index.js
===================================================================
--- node_modules/pstree.remy/tests/fixtures/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-const spawn = require('child_process').spawn;
-function run() {
-  spawn(
-    'sh',
-    ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'],
-    {
-      stdio: 'pipe',
-    }
-  );
-}
-
-var runCallCount = process.argv[2] || 1;
-for (var i = 0; i < runCallCount; i++) run();
Index: de_modules/pstree.remy/tests/fixtures/out1
===================================================================
--- node_modules/pstree.remy/tests/fixtures/out1	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,10 +1,0 @@
-1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0
-15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0
-16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0
-27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0
-28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0
-39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0
-45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0
-cat: /proc/50/stat: No such file or directory
-cat: /proc/51/stat: No such file or directory
-52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0
Index: de_modules/pstree.remy/tests/fixtures/out2
===================================================================
--- node_modules/pstree.remy/tests/fixtures/out2	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,29 +1,0 @@
-cat: /proc/4087/stat: No such file or directory
-cat: /proc/4088/stat: No such file or directory
-1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0
-1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0
-194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0
-359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0
-4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0
-4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0
-4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0
-4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0
-4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0
-4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0
-4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0
-50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0
-79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0
-94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
Index: de_modules/pstree.remy/tests/index.test.js
===================================================================
--- node_modules/pstree.remy/tests/index.test.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,51 +1,0 @@
-const tap = require('tap');
-const test = tap.test;
-const readFile = require('fs').readFileSync;
-const spawn = require('child_process').spawn;
-const pstree = require('../');
-const { tree, pidsForTree, getStat } = require('../lib/utils');
-
-if (process.platform !== 'darwin') {
-  test('reads from /proc', async (t) => {
-    const ps = await getStat();
-    t.ok(ps.split('\n').length > 1);
-  });
-}
-
-test('tree for live env', async (t) => {
-  const pid = 4079;
-  const fixture = readFile(__dirname + '/fixtures/out2', 'utf8');
-  const ps = await tree(fixture);
-  t.deepEqual(
-    pidsForTree(ps, pid).map((_) => _.PID),
-    ['4080']
-  );
-});
-
-function testTree(t, runCallCount) {
-  const sub = spawn('node', [`${__dirname}/fixtures/index.js`, runCallCount], {
-    stdio: 'pipe',
-  });
-  setTimeout(() => {
-    const pid = sub.pid;
-
-    pstree(pid, (error, pids) => {
-      pids.concat([pid]).forEach((p) => {
-        spawn('kill', ['-s', 'SIGTERM', p]);
-      });
-
-      // the fixture launches `sh` which launches node which is why we
-      // are looking for two processes.
-      // Important: IDKW but MacOS seems to skip the `sh` process. no idea.
-      t.equal(pids.length, runCallCount * 2);
-      t.end();
-    });
-  }, 1000);
-}
-
-test('can read full process tree', (t) => {
-  testTree(t, 1);
-});
-test('can read full process tree with multiple processes', (t) => {
-  testTree(t, 2);
-});
Index: de_modules/readdirp/LICENSE
===================================================================
--- node_modules/readdirp/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/readdirp/README.md
===================================================================
--- node_modules/readdirp/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,122 +1,0 @@
-# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp)
-
-Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**.
-
-
-```sh
-npm install readdirp
-```
-
-```javascript
-const readdirp = require('readdirp');
-
-// Use streams to achieve small RAM & CPU footprint.
-// 1) Streams example with for-await.
-for await (const entry of readdirp('.')) {
-  const {path} = entry;
-  console.log(`${JSON.stringify({path})}`);
-}
-
-// 2) Streams example, non for-await.
-// Print out all JS files along with their size within the current folder & subfolders.
-readdirp('.', {fileFilter: '*.js', alwaysStat: true})
-  .on('data', (entry) => {
-    const {path, stats: {size}} = entry;
-    console.log(`${JSON.stringify({path, size})}`);
-  })
-  // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted
-  .on('warn', error => console.error('non-fatal error', error))
-  .on('error', error => console.error('fatal error', error))
-  .on('end', () => console.log('done'));
-
-// 3) Promise example. More RAM and CPU than streams / for-await.
-const files = await readdirp.promise('.');
-console.log(files.map(file => file.path));
-
-// Other options.
-readdirp('test', {
-  fileFilter: '*.js',
-  directoryFilter: ['!.git', '!*modules']
-  // directoryFilter: (di) => di.basename.length === 9
-  type: 'files_directories',
-  depth: 1
-});
-```
-
-For more examples, check out `examples` directory.
-
-## API
-
-`const stream = readdirp(root[, options])` — **Stream API**
-
-- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo)
-- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`).
-- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir.
-- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user.
-- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed.
-- `on('end')` — we are done. Called when all entries were found and no more will be emitted.
-- `on('close')` — stream is destroyed via `stream.destroy()`.
-  Could be useful if you want to manually abort even on a non fatal error.
-  At that point the stream is no longer `readable` and no more entries, warning or errors are emitted
-- To learn more about streams, consult the very detailed [nodejs streams documentation](https://nodejs.org/api/stream.html)
-  or the [stream-handbook](https://github.com/substack/stream-handbook)
-
-`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo).
-
-First argument is awalys `root`, path in which to start reading and recursing into subdirectories.
-
-### options
-
-- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings.
-    - **Function**: a function that takes an entry info as a parameter and returns true to include or false to exclude the entry
-    - **Glob string**: a string (e.g., `*.js`) which is matched using [picomatch](https://github.com/micromatch/picomatch), so go there for more
-        information. Globstars (`**`) are not supported since specifying a recursive pattern for an already recursive function doesn't make sense. Negated globs (as explained in the minimatch documentation) are allowed, e.g., `!*.txt` matches everything but text files.
-    - **Array of glob strings**: either need to be all inclusive or all exclusive (negated) patterns otherwise an error is thrown.
-        `['*.json', '*.js']` includes all JavaScript and Json files.
-        `['!.git', '!node_modules']` includes all directories except the '.git' and 'node_modules'.
-    - Directories that do not pass a filter will not be recursed into.
-- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into.
-- `depth: 5`: depth at which to stop recursing even if more subdirectories are found
-- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes.
-- `alwaysStat: false`: always return `stats` property for every file. Default is `false`, readdirp will return `Dirent` entries. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0.
-- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat`
-
-### `EntryInfo`
-
-Has the following properties:
-
-- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root)
-- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found
-- `basename: 'react.js'`: name of the file/directory
-- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false`
-- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true`
-
-## Changelog
-
-- 3.5 (Oct 13, 2020) disallows recursive directory-based symlinks.
-  Before, it could have entered infinite loop.
-- 3.4 (Mar 19, 2020) adds support for directory-based symlinks.
-- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping.
-- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic.
-- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions".
-- 3.0 brings huge performance improvements and stream backpressure support.
-- Upgrading 2.x to 3.x:
-    - Signature changed from `readdirp(options)` to `readdirp(root, options)`
-    - Replaced callback API with promise API.
-    - Renamed `entryType` option to `type`
-    - Renamed `entryType: 'both'` to `'files_directories'`
-    - `EntryInfo`
-        - Renamed `stat` to `stats`
-            - Emitted only when `alwaysStat: true`
-            - `dirent` is emitted instead of `stats` by default with `alwaysStat: false`
-        - Renamed `name` to `basename`
-        - Removed `parentDir` and `fullParentDir` properties
-- Supported node.js versions:
-    - 3.x: node 8+
-    - 2.x: node 0.6+
-
-## License
-
-Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (<https://paulmillr.com>)
-
-MIT License, see [LICENSE](LICENSE) file.
Index: de_modules/readdirp/index.d.ts
===================================================================
--- node_modules/readdirp/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,43 +1,0 @@
-// TypeScript Version: 3.2
-
-/// <reference types="node" lib="esnext" />
-
-import * as fs from 'fs';
-import { Readable } from 'stream';
-
-declare namespace readdir {
-  interface EntryInfo {
-    path: string;
-    fullPath: string;
-    basename: string;
-    stats?: fs.Stats;
-    dirent?: fs.Dirent;
-  }
-
-  interface ReaddirpOptions {
-    root?: string;
-    fileFilter?: string | string[] | ((entry: EntryInfo) => boolean);
-    directoryFilter?: string | string[] | ((entry: EntryInfo) => boolean);
-    type?: 'files' | 'directories' | 'files_directories' | 'all';
-    lstat?: boolean;
-    depth?: number;
-    alwaysStat?: boolean;
-  }
-
-  interface ReaddirpStream extends Readable, AsyncIterable<EntryInfo> {
-    read(): EntryInfo;
-    [Symbol.asyncIterator](): AsyncIterableIterator<EntryInfo>;
-  }
-
-  function promise(
-    root: string,
-    options?: ReaddirpOptions
-  ): Promise<EntryInfo[]>;
-}
-
-declare function readdir(
-  root: string,
-  options?: readdir.ReaddirpOptions
-): readdir.ReaddirpStream;
-
-export = readdir;
Index: de_modules/readdirp/index.js
===================================================================
--- node_modules/readdirp/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,287 +1,0 @@
-'use strict';
-
-const fs = require('fs');
-const { Readable } = require('stream');
-const sysPath = require('path');
-const { promisify } = require('util');
-const picomatch = require('picomatch');
-
-const readdir = promisify(fs.readdir);
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const realpath = promisify(fs.realpath);
-
-/**
- * @typedef {Object} EntryInfo
- * @property {String} path
- * @property {String} fullPath
- * @property {fs.Stats=} stats
- * @property {fs.Dirent=} dirent
- * @property {String} basename
- */
-
-const BANG = '!';
-const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';
-const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);
-const FILE_TYPE = 'files';
-const DIR_TYPE = 'directories';
-const FILE_DIR_TYPE = 'files_directories';
-const EVERYTHING_TYPE = 'all';
-const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE];
-
-const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code);
-const [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10));
-const wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5));
-
-const normalizeFilter = filter => {
-  if (filter === undefined) return;
-  if (typeof filter === 'function') return filter;
-
-  if (typeof filter === 'string') {
-    const glob = picomatch(filter.trim());
-    return entry => glob(entry.basename);
-  }
-
-  if (Array.isArray(filter)) {
-    const positive = [];
-    const negative = [];
-    for (const item of filter) {
-      const trimmed = item.trim();
-      if (trimmed.charAt(0) === BANG) {
-        negative.push(picomatch(trimmed.slice(1)));
-      } else {
-        positive.push(picomatch(trimmed));
-      }
-    }
-
-    if (negative.length > 0) {
-      if (positive.length > 0) {
-        return entry =>
-          positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename));
-      }
-      return entry => !negative.some(f => f(entry.basename));
-    }
-    return entry => positive.some(f => f(entry.basename));
-  }
-};
-
-class ReaddirpStream extends Readable {
-  static get defaultOptions() {
-    return {
-      root: '.',
-      /* eslint-disable no-unused-vars */
-      fileFilter: (path) => true,
-      directoryFilter: (path) => true,
-      /* eslint-enable no-unused-vars */
-      type: FILE_TYPE,
-      lstat: false,
-      depth: 2147483648,
-      alwaysStat: false
-    };
-  }
-
-  constructor(options = {}) {
-    super({
-      objectMode: true,
-      autoDestroy: true,
-      highWaterMark: options.highWaterMark || 4096
-    });
-    const opts = { ...ReaddirpStream.defaultOptions, ...options };
-    const { root, type } = opts;
-
-    this._fileFilter = normalizeFilter(opts.fileFilter);
-    this._directoryFilter = normalizeFilter(opts.directoryFilter);
-
-    const statMethod = opts.lstat ? lstat : stat;
-    // Use bigint stats if it's windows and stat() supports options (node 10+).
-    if (wantBigintFsStats) {
-      this._stat = path => statMethod(path, { bigint: true });
-    } else {
-      this._stat = statMethod;
-    }
-
-    this._maxDepth = opts.depth;
-    this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);
-    this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);
-    this._wantsEverything = type === EVERYTHING_TYPE;
-    this._root = sysPath.resolve(root);
-    this._isDirent = ('Dirent' in fs) && !opts.alwaysStat;
-    this._statsProp = this._isDirent ? 'dirent' : 'stats';
-    this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };
-
-    // Launch stream with one parent, the root dir.
-    this.parents = [this._exploreDir(root, 1)];
-    this.reading = false;
-    this.parent = undefined;
-  }
-
-  async _read(batch) {
-    if (this.reading) return;
-    this.reading = true;
-
-    try {
-      while (!this.destroyed && batch > 0) {
-        const { path, depth, files = [] } = this.parent || {};
-
-        if (files.length > 0) {
-          const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path));
-          for (const entry of await Promise.all(slice)) {
-            if (this.destroyed) return;
-
-            const entryType = await this._getEntryType(entry);
-            if (entryType === 'directory' && this._directoryFilter(entry)) {
-              if (depth <= this._maxDepth) {
-                this.parents.push(this._exploreDir(entry.fullPath, depth + 1));
-              }
-
-              if (this._wantsDir) {
-                this.push(entry);
-                batch--;
-              }
-            } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) {
-              if (this._wantsFile) {
-                this.push(entry);
-                batch--;
-              }
-            }
-          }
-        } else {
-          const parent = this.parents.pop();
-          if (!parent) {
-            this.push(null);
-            break;
-          }
-          this.parent = await parent;
-          if (this.destroyed) return;
-        }
-      }
-    } catch (error) {
-      this.destroy(error);
-    } finally {
-      this.reading = false;
-    }
-  }
-
-  async _exploreDir(path, depth) {
-    let files;
-    try {
-      files = await readdir(path, this._rdOptions);
-    } catch (error) {
-      this._onError(error);
-    }
-    return { files, depth, path };
-  }
-
-  async _formatEntry(dirent, path) {
-    let entry;
-    try {
-      const basename = this._isDirent ? dirent.name : dirent;
-      const fullPath = sysPath.resolve(sysPath.join(path, basename));
-      entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename };
-      entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
-    } catch (err) {
-      this._onError(err);
-    }
-    return entry;
-  }
-
-  _onError(err) {
-    if (isNormalFlowError(err) && !this.destroyed) {
-      this.emit('warn', err);
-    } else {
-      this.destroy(err);
-    }
-  }
-
-  async _getEntryType(entry) {
-    // entry may be undefined, because a warning or an error were emitted
-    // and the statsProp is undefined
-    const stats = entry && entry[this._statsProp];
-    if (!stats) {
-      return;
-    }
-    if (stats.isFile()) {
-      return 'file';
-    }
-    if (stats.isDirectory()) {
-      return 'directory';
-    }
-    if (stats && stats.isSymbolicLink()) {
-      const full = entry.fullPath;
-      try {
-        const entryRealPath = await realpath(full);
-        const entryRealPathStats = await lstat(entryRealPath);
-        if (entryRealPathStats.isFile()) {
-          return 'file';
-        }
-        if (entryRealPathStats.isDirectory()) {
-          const len = entryRealPath.length;
-          if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) {
-            const recursiveError = new Error(
-              `Circular symlink detected: "${full}" points to "${entryRealPath}"`
-            );
-            recursiveError.code = RECURSIVE_ERROR_CODE;
-            return this._onError(recursiveError);
-          }
-          return 'directory';
-        }
-      } catch (error) {
-        this._onError(error);
-      }
-    }
-  }
-
-  _includeAsFile(entry) {
-    const stats = entry && entry[this._statsProp];
-
-    return stats && this._wantsEverything && !stats.isDirectory();
-  }
-}
-
-/**
- * @typedef {Object} ReaddirpArguments
- * @property {Function=} fileFilter
- * @property {Function=} directoryFilter
- * @property {String=} type
- * @property {Number=} depth
- * @property {String=} root
- * @property {Boolean=} lstat
- * @property {Boolean=} bigint
- */
-
-/**
- * Main function which ends up calling readdirRec and reads all files and directories in given root recursively.
- * @param {String} root Root directory
- * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth
- */
-const readdirp = (root, options = {}) => {
-  let type = options.entryType || options.type;
-  if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility
-  if (type) options.type = type;
-  if (!root) {
-    throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');
-  } else if (typeof root !== 'string') {
-    throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');
-  } else if (type && !ALL_TYPES.includes(type)) {
-    throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);
-  }
-
-  options.root = root;
-  return new ReaddirpStream(options);
-};
-
-const readdirpPromise = (root, options = {}) => {
-  return new Promise((resolve, reject) => {
-    const files = [];
-    readdirp(root, options)
-      .on('data', entry => files.push(entry))
-      .on('end', () => resolve(files))
-      .on('error', error => reject(error));
-  });
-};
-
-readdirp.promise = readdirpPromise;
-readdirp.ReaddirpStream = ReaddirpStream;
-readdirp.default = readdirp;
-
-module.exports = readdirp;
Index: de_modules/readdirp/package.json
===================================================================
--- node_modules/readdirp/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,122 +1,0 @@
-{
-  "name": "readdirp",
-  "description": "Recursive version of fs.readdir with streaming API.",
-  "version": "3.6.0",
-  "homepage": "https://github.com/paulmillr/readdirp",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/paulmillr/readdirp.git"
-  },
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/paulmillr/readdirp/issues"
-  },
-  "author": "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-  "contributors": [
-    "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-    "Paul Miller (https://paulmillr.com)"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.10.0"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts"
-  ],
-  "keywords": [
-    "recursive",
-    "fs",
-    "stream",
-    "streams",
-    "readdir",
-    "filesystem",
-    "find",
-    "filter"
-  ],
-  "scripts": {
-    "dtslint": "dtslint",
-    "nyc": "nyc",
-    "mocha": "mocha --exit",
-    "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .",
-    "test": "npm run lint && nyc npm run mocha"
-  },
-  "dependencies": {
-    "picomatch": "^2.2.1"
-  },
-  "devDependencies": {
-    "@types/node": "^14",
-    "chai": "^4.2",
-    "chai-subset": "^1.6",
-    "dtslint": "^3.3.0",
-    "eslint": "^7.0.0",
-    "mocha": "^7.1.1",
-    "nyc": "^15.0.0",
-    "rimraf": "^3.0.0",
-    "typescript": "^4.0.3"
-  },
-  "nyc": {
-    "reporter": [
-      "html",
-      "text"
-    ]
-  },
-  "eslintConfig": {
-    "root": true,
-    "extends": "eslint:recommended",
-    "parserOptions": {
-      "ecmaVersion": 9,
-      "sourceType": "script"
-    },
-    "env": {
-      "node": true,
-      "es6": true
-    },
-    "rules": {
-      "array-callback-return": "error",
-      "no-empty": [
-        "error",
-        {
-          "allowEmptyCatch": true
-        }
-      ],
-      "no-else-return": [
-        "error",
-        {
-          "allowElseIf": false
-        }
-      ],
-      "no-lonely-if": "error",
-      "no-var": "error",
-      "object-shorthand": "error",
-      "prefer-arrow-callback": [
-        "error",
-        {
-          "allowNamedFunctions": true
-        }
-      ],
-      "prefer-const": [
-        "error",
-        {
-          "ignoreReadBeforeAssign": true
-        }
-      ],
-      "prefer-destructuring": [
-        "error",
-        {
-          "object": true,
-          "array": false
-        }
-      ],
-      "prefer-spread": "error",
-      "prefer-template": "error",
-      "radix": "error",
-      "semi": "error",
-      "strict": "error",
-      "quotes": [
-        "error",
-        "single"
-      ]
-    }
-  }
-}
Index: de_modules/semver/LICENSE
===================================================================
--- node_modules/semver/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/semver/README.md
===================================================================
--- node_modules/semver/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,680 +1,0 @@
-semver(1) -- The semantic versioner for npm
-===========================================
-
-## Install
-
-```bash
-npm install semver
-````
-
-## Usage
-
-As a node module:
-
-```js
-const semver = require('semver')
-
-semver.valid('1.2.3') // '1.2.3'
-semver.valid('a.b.c') // null
-semver.clean('  =v1.2.3   ') // '1.2.3'
-semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
-semver.gt('1.2.3', '9.8.7') // false
-semver.lt('1.2.3', '9.8.7') // true
-semver.minVersion('>=1.0.0') // '1.0.0'
-semver.valid(semver.coerce('v2')) // '2.0.0'
-semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
-```
-
-You can also just load the module for the function that you care about if
-you'd like to minimize your footprint.
-
-```js
-// load the whole API at once in a single object
-const semver = require('semver')
-
-// or just load the bits you need
-// all of them listed here, just pick and choose what you want
-
-// classes
-const SemVer = require('semver/classes/semver')
-const Comparator = require('semver/classes/comparator')
-const Range = require('semver/classes/range')
-
-// functions for working with versions
-const semverParse = require('semver/functions/parse')
-const semverValid = require('semver/functions/valid')
-const semverClean = require('semver/functions/clean')
-const semverInc = require('semver/functions/inc')
-const semverDiff = require('semver/functions/diff')
-const semverMajor = require('semver/functions/major')
-const semverMinor = require('semver/functions/minor')
-const semverPatch = require('semver/functions/patch')
-const semverPrerelease = require('semver/functions/prerelease')
-const semverCompare = require('semver/functions/compare')
-const semverRcompare = require('semver/functions/rcompare')
-const semverCompareLoose = require('semver/functions/compare-loose')
-const semverCompareBuild = require('semver/functions/compare-build')
-const semverSort = require('semver/functions/sort')
-const semverRsort = require('semver/functions/rsort')
-const semverTruncate = require('semver/functions/truncate')
-
-// low-level comparators between versions
-const semverGt = require('semver/functions/gt')
-const semverLt = require('semver/functions/lt')
-const semverEq = require('semver/functions/eq')
-const semverNeq = require('semver/functions/neq')
-const semverGte = require('semver/functions/gte')
-const semverLte = require('semver/functions/lte')
-const semverCmp = require('semver/functions/cmp')
-const semverCoerce = require('semver/functions/coerce')
-
-// working with ranges
-const semverSatisfies = require('semver/functions/satisfies')
-const semverMaxSatisfying = require('semver/ranges/max-satisfying')
-const semverMinSatisfying = require('semver/ranges/min-satisfying')
-const semverToComparators = require('semver/ranges/to-comparators')
-const semverMinVersion = require('semver/ranges/min-version')
-const semverValidRange = require('semver/ranges/valid')
-const semverOutside = require('semver/ranges/outside')
-const semverGtr = require('semver/ranges/gtr')
-const semverLtr = require('semver/ranges/ltr')
-const semverIntersects = require('semver/ranges/intersects')
-const semverSimplifyRange = require('semver/ranges/simplify')
-const semverRangeSubset = require('semver/ranges/subset')
-```
-
-As a command-line utility:
-
-```
-$ semver -h
-
-A JavaScript implementation of the https://semver.org/ specification
-Copyright Isaac Z. Schlueter
-
-Usage: semver [options] <version> [<version> [...]]
-Prints valid versions sorted by SemVer precedence
-
-Options:
--r --range <range>
-        Print versions that match the specified range.
-
--i --increment [<level>]
-        Increment a version by the specified level.  Level can
-        be one of: major, minor, patch, premajor, preminor,
-        prepatch, prerelease, or release.  Default level is 'patch'.
-        Only one version may be specified.
-
---preid <identifier>
-        Identifier to be used to prefix premajor, preminor,
-        prepatch or prerelease version increments.
-
--l --loose
-        Interpret versions and ranges loosely
-
--n <0|1|false>
-        Base number for prerelease identifier (default: 0).
-        Use false to omit the number altogether.
-
--p --include-prerelease
-        Always include prerelease versions in range matching
-
--c --coerce
-        Coerce a string into SemVer if possible
-        (does not imply --loose)
-
---rtl
-        Coerce version strings right to left
-
---ltr
-        Coerce version strings left to right (default)
-
-Program exits successfully if any valid version satisfies
-all supplied ranges, and prints all satisfying versions.
-
-If no satisfying versions are found, then exits failure.
-
-Versions are printed in ascending order, so supplying
-multiple versions to the utility will just sort them.
-```
-
-## Versions
-
-A "version" is described by the `v2.0.0` specification found at
-<https://semver.org/>.
-
-A leading `"="` or `"v"` character is stripped off and ignored.
-Support for stripping a leading "v" is kept for compatibility with `v1.0.0` of the SemVer
-specification but should not be used anymore.
-
-## Ranges
-
-A `version range` is a set of `comparators` that specify versions
-that satisfy the range.
-
-A `comparator` is composed of an `operator` and a `version`.  The set
-of primitive `operators` is:
-
-* `<` Less than
-* `<=` Less than or equal to
-* `>` Greater than
-* `>=` Greater than or equal to
-* `=` Equal.  If no operator is specified, then equality is assumed,
-  so this operator is optional but MAY be included.
-
-For example, the comparator `>=1.2.7` would match the versions
-`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
-or `1.1.0`. The comparator `>1` is equivalent to `>=2.0.0` and
-would match the versions `2.0.0` and `3.1.0`, but not the versions
-`1.0.1` or `1.1.0`.
-
-Comparators can be joined by whitespace to form a `comparator set`,
-which is satisfied by the **intersection** of all of the comparators
-it includes.
-
-A range is composed of one or more comparator sets, joined by `||`.  A
-version matches a range if and only if every comparator in at least
-one of the `||`-separated comparator sets is satisfied by the version.
-
-For example, the range `>=1.2.7 <1.3.0` would match the versions
-`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
-or `1.1.0`.
-
-The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
-`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
-
-### Prerelease Tags
-
-If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
-it will only be allowed to satisfy comparator sets if at least one
-comparator with the same `[major, minor, patch]` tuple also has a
-prerelease tag.
-
-For example, the range `>1.2.3-alpha.3` would be allowed to match the
-version `1.2.3-alpha.7`, but it would *not* be satisfied by
-`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
-than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version
-range only accepts prerelease tags on the `1.2.3` version.
-Version `3.4.5` *would* satisfy the range because it does not have a
-prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
-
-The purpose of this behavior is twofold.  First, prerelease versions
-frequently are updated very quickly, and contain many breaking changes
-that are (by the author's design) not yet fit for public consumption.
-Therefore, by default, they are excluded from range-matching
-semantics.
-
-Second, a user who has opted into using a prerelease version has
-indicated the intent to use *that specific* set of
-alpha/beta/rc versions.  By including a prerelease tag in the range,
-the user is indicating that they are aware of the risk.  However, it
-is still not appropriate to assume that they have opted into taking a
-similar risk on the *next* set of prerelease versions.
-
-Note that this behavior can be suppressed (treating all prerelease
-versions as if they were normal versions, for range-matching)
-by setting the `includePrerelease` flag on the options
-object to any
-[functions](https://github.com/npm/node-semver#functions) that do
-range matching.
-
-#### Prerelease Identifiers
-
-The method `.inc` takes an additional `identifier` string argument that
-will append the value of the string as a prerelease identifier:
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta')
-// '1.2.4-beta.0'
-```
-
-command-line example:
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta
-1.2.4-beta.0
-```
-
-Which then can be used to increment further:
-
-```bash
-$ semver 1.2.4-beta.0 -i prerelease
-1.2.4-beta.1
-```
-
-To get out of the prerelease phase, use the `release` option:
-
-```bash
-$ semver 1.2.4-beta.1 -i release
-1.2.4
-```
-
-#### Prerelease Identifier Base
-
-The method `.inc` takes an optional parameter 'identifierBase' string
-that will let you let your prerelease number as zero-based or one-based.
-Set to `false` to omit the prerelease number altogether.
-If you do not specify this parameter, it will default to zero-based.
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta', '1')
-// '1.2.4-beta.1'
-```
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta', false)
-// '1.2.4-beta'
-```
-
-command-line example:
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta -n 1
-1.2.4-beta.1
-```
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta -n false
-1.2.4-beta
-```
-
-### Advanced Range Syntax
-
-Advanced range syntax desugars to primitive comparators in
-deterministic ways.
-
-Advanced ranges may be combined in the same way as primitive
-comparators using white space or `||`.
-
-#### Hyphen Ranges `X.Y.Z - A.B.C`
-
-Specifies an inclusive set.
-
-* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-
-If a partial version is provided as the first version in the inclusive
-range, then the missing pieces are replaced with zeroes.
-
-* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
-
-If a partial version is provided as the second version in the
-inclusive range, then all versions that start with the supplied parts
-of the tuple are accepted, but nothing that would be greater than the
-provided tuple parts.
-
-* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0`
-* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0`
-
-#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
-
-Any of `X`, `x`, or `*` may be used to "stand in" for one of the
-numeric values in the `[major, minor, patch]` tuple.
-
-* `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless
-  `includePrerelease` is specified, in which case any version at all
-  satisfies)
-* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version)
-* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions)
-
-A partial version range is treated as an X-Range, so the special
-character is in fact optional.
-
-* `""` (empty string) := `*` := `>=0.0.0`
-* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0`
-* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0`
-
-#### Tilde Ranges `~1.2.3` `~1.2` `~1`
-
-Allows patch-level changes if a minor version is specified on the
-comparator.  Allows minor-level changes if not.
-
-* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0`
-* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`)
-* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`)
-* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0`
-* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`)
-* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`)
-* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-
-#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
-
-Allows changes that do not modify the left-most non-zero element in the
-`[major, minor, patch]` tuple.  In other words, this allows patch and
-minor updates for versions `1.0.0` and above, patch updates for
-versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
-
-Many authors treat a `0.x` version as if the `x` were the major
-"breaking-change" indicator.
-
-Caret ranges are ideal when an author may make breaking changes
-between `0.2.4` and `0.3.0` releases, which is a common practice.
-However, it presumes that there will *not* be breaking changes between
-`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be
-additive (but non-breaking), according to commonly observed practices.
-
-* `^1.2.3` := `>=1.2.3 <2.0.0-0`
-* `^0.2.3` := `>=0.2.3 <0.3.0-0`
-* `^0.0.3` := `>=0.0.3 <0.0.4-0`
-* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0`  Note that prereleases in the
-  `0.0.3` version *only* will be allowed, if they are greater than or
-  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.
-
-When parsing caret ranges, a missing `patch` value desugars to the
-number `0`, but will allow flexibility within that value, even if the
-major and minor versions are both `0`.
-
-* `^1.2.x` := `>=1.2.0 <2.0.0-0`
-* `^0.0.x` := `>=0.0.0 <0.1.0-0`
-* `^0.0` := `>=0.0.0 <0.1.0-0`
-
-A missing `minor` and `patch` values will desugar to zero, but also
-allow flexibility within those values, even if the major version is
-zero.
-
-* `^1.x` := `>=1.0.0 <2.0.0-0`
-* `^0.x` := `>=0.0.0 <1.0.0-0`
-
-### Range Grammar
-
-Putting all this together, here is a Backus-Naur grammar for ranges,
-for the benefit of parser authors:
-
-```bnf
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= prepart ( '.' prepart ) *
-prepart    ::= nr | alphanumid
-build      ::= buildid ( '.' buildid ) *
-alphanumid ::= ( ['0'-'9'] ) * [-A-Za-z] [-0-9A-Za-z] *
-buildid    ::= [-0-9A-Za-z]+
-```
-
-Note: Prerelease identifiers (`pre`) use `nr` for numeric parts, which
-disallows leading zeros (e.g., `1.2.3-00` is invalid). Build metadata
-identifiers (`build`) allow any alphanumeric string including leading
-zeros (e.g., `1.2.3+00` is valid). This matches the
-[SemVer 2.0.0 specification](https://semver.org/#spec-item-9).
-
-## Functions
-
-All methods and classes take a final `options` object argument.  All
-options in this object are `false` by default.  The options supported
-are:
-
-- `loose`: Be more forgiving about not-quite-valid semver strings.
-  (Any resulting output will always be 100% strict compliant, of
-  course.)  For backwards compatibility reasons, if the `options`
-  argument is a boolean value instead of an object, it is interpreted
-  to be the `loose` param.
-- `includePrerelease`: Set to suppress the [default
-  behavior](https://github.com/npm/node-semver#prerelease-tags) of
-  excluding prerelease tagged versions from ranges unless they are
-  explicitly opted into.
-
-Strict-mode Comparators and Ranges will be strict about the SemVer
-strings that they parse.
-
-* `valid(v)`: Return the parsed version, or null if it's not valid.
-* `inc(v, releaseType, options, identifier, identifierBase)`: 
-  Return the version incremented by the release
-  type (`major`, `premajor`, `minor`, `preminor`, `patch`,
-  `prepatch`, `prerelease`, or `release`), or null if it's not valid
-  * `premajor` in one call will bump the version up to the next major
-    version and down to a prerelease of that major version.
-    `preminor`, and `prepatch` work the same way.
-  * If called from a non-prerelease version, `prerelease` will work the
-    same as `prepatch`. It increments the patch version and then makes a
-    prerelease. If the input version is already a prerelease it simply
-    increments it.
-  * `release` will remove any prerelease part of the version.
-  * `identifier` can be used to prefix `premajor`, `preminor`,
-    `prepatch`, or `prerelease` version increments. `identifierBase`
-    is the base to be used for the `prerelease` identifier.
-* `prerelease(v)`: Returns an array of prerelease components, or null
-  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
-* `major(v)`: Return the major version number.
-* `minor(v)`: Return the minor version number.
-* `patch(v)`: Return the patch version number.
-* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
-  or comparators intersect.
-* `parse(v)`: Attempt to parse a string as a semantic version, returning either
-  a `SemVer` object or `null`.
-* `truncate(v, releaseType)`: Return the version with components _lower_
-  than `releaseType` dropped off, e.g.:
-  * `major` removes build & prerelease info and sets minor & patch to 0.
-  * `minor` removes build & prerelease info, and sets patch to 0
-  * `patch` removes build & prerelease info
-  * All prerelease types remove build info only
-
-### Comparison
-
-* `gt(v1, v2)`: `v1 > v2`
-* `gte(v1, v2)`: `v1 >= v2`
-* `lt(v1, v2)`: `v1 < v2`
-* `lte(v1, v2)`: `v1 <= v2`
-* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
-  even if they're not the same string.  You already know how to
-  compare strings.
-* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
-* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
-  the corresponding function above.  `"==="` and `"!=="` do simple
-  string comparison, but are included for completeness.  Throws if an
-  invalid comparison string is provided.
-* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
-  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
-* `rcompare(v1, v2)`: The reverse of `compare`.  Sorts an array of versions
-  in descending order when passed to `Array.sort()`.
-* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
-  are equal.  Sorts in ascending order if passed to `Array.sort()`.
-* `compareLoose(v1, v2)`: Short for `compare(v1, v2, { loose: true })`.
-* `diff(v1, v2)`: Returns the difference between two versions by the release type
-  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
-  or null if the versions are the same.
-
-### Sorting
-
-* `sort(versions)`: Returns a sorted array of versions based on the `compareBuild` 
-  function.
-* `rsort(versions)`: The reverse of `sort`. Returns an array of versions based on
-  the `compareBuild` function in descending order.
-
-### Comparators
-
-* `intersects(comparator)`: Return true if the comparators intersect
-
-### Ranges
-
-* `validRange(range)`: Return the valid range or null if it's not valid.
-* `satisfies(version, range)`: Return true if the version satisfies the
-  range.
-* `maxSatisfying(versions, range)`: Return the highest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `minSatisfying(versions, range)`: Return the lowest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `minVersion(range)`: Return the lowest version that can match
-  the given range.
-* `gtr(version, range)`: Return `true` if the version is greater than all the
-  versions possible in the range.
-* `ltr(version, range)`: Return `true` if the version is less than all the
-  versions possible in the range.
-* `outside(version, range, hilo)`: Return true if the version is outside
-  the bounds of the range in either the high or low direction.  The
-  `hilo` argument must be either the string `'>'` or `'<'`.  (This is
-  the function called by `gtr` and `ltr`.)
-* `intersects(range)`: Return true if any of the range comparators intersect.
-* `simplifyRange(versions, range)`: Return a "simplified" range that
-  matches the same items in the `versions` list as the range specified.  Note
-  that it does *not* guarantee that it would match the same versions in all
-  cases, only for the set of versions provided.  This is useful when
-  generating ranges by joining together multiple versions with `||`
-  programmatically, to provide the user with something a bit more
-  ergonomic.  If the provided range is shorter in string-length than the
-  generated range, then that is returned.
-* `subset(subRange, superRange)`: Return `true` if the `subRange` range is
-  entirely contained by the `superRange` range.
-
-Note that, since ranges may be non-contiguous, a version might not be
-greater than a range, less than a range, *or* satisfy a range!  For
-example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
-until `2.0.0`, so version `1.2.10` would not be greater than the
-range (because `2.0.1` satisfies, which is higher), nor less than the
-range (since `1.2.8` satisfies, which is lower), and it also does not
-satisfy the range.
-
-If you want to know if a version satisfies or does not satisfy a
-range, use the `satisfies(version, range)` function.
-
-### Coercion
-
-* `coerce(version, options)`: Coerces a string to semver if possible
-
-This aims to provide a very forgiving translation of a non-semver string to
-semver. It looks for the first digit in a string and consumes all
-remaining characters which satisfy at least a partial semver (e.g., `1`,
-`1.2`, `1.2.3`) up to the max permitted length (256 characters).  Longer
-versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).  All
-surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
-`3.4.0`).  Only text which lacks digits will fail coercion (`version one`
-is not valid).  The maximum length for any semver component considered for
-coercion is 16 characters; longer components will be ignored
-(`10000000000000000.4.7.4` becomes `4.7.4`).  The maximum value for any
-semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
-components are invalid (`9999999999999999.4.7.4` is likely invalid).
-
-If the `options.rtl` flag is set, then `coerce` will return the right-most
-coercible tuple that does not share an ending index with a longer coercible
-tuple.  For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
-`4.0.0`.  `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
-any other overlapping SemVer tuple.
-
-If the `options.includePrerelease` flag is set, then the `coerce` result will contain
-prerelease and build parts of a version.  For example, `1.2.3.4-rc.1+rev.2`
-will preserve prerelease `rc.1` and build `rev.2` in the result.
-
-### Clean
-
-* `clean(version)`: Clean a string to be a valid semver if possible
-
-This will return a cleaned and trimmed semver version. If the provided
-version is not valid a null will be returned. This does not work for
-ranges.
-
-ex.
-* `s.clean(' = v 2.1.5foo')`: `null`
-* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
-* `s.clean(' = v 2.1.5-foo')`: `null`
-* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
-* `s.clean('=v2.1.5')`: `'2.1.5'`
-* `s.clean('  =v2.1.5')`: `'2.1.5'`
-* `s.clean('      2.1.5   ')`: `'2.1.5'`
-* `s.clean('~1.0.0')`: `null`
-
-## Constants
-
-As a convenience, helper constants are exported to provide information about what `node-semver` supports:
-
-### `RELEASE_TYPES`
-
-- major
-- premajor
-- minor
-- preminor
-- patch
-- prepatch
-- prerelease
-
-```
-const semver = require('semver');
-
-if (semver.RELEASE_TYPES.includes(arbitraryUserInput)) {
-  console.log('This is a valid release type!');
-} else {
-  console.warn('This is NOT a valid release type!');
-}
-```
-
-### `SEMVER_SPEC_VERSION`
-
-2.0.0
-
-```
-const semver = require('semver');
-
-console.log('We are currently using the semver specification version:', semver.SEMVER_SPEC_VERSION);
-```
-
-## Exported Modules
-
-<!--
-TODO: Make sure that all of these items are documented (classes aren't,
-eg), and then pull the module name into the documentation for that specific
-thing.
--->
-
-You may pull in just the part of this semver utility that you need if you
-are sensitive to packing and tree-shaking concerns.  The main
-`require('semver')` export uses getter functions to lazily load the parts
-of the API that are used.
-
-The following modules are available:
-
-* `require('semver')`
-* `require('semver/classes')`
-* `require('semver/classes/comparator')`
-* `require('semver/classes/range')`
-* `require('semver/classes/semver')`
-* `require('semver/functions/clean')`
-* `require('semver/functions/cmp')`
-* `require('semver/functions/coerce')`
-* `require('semver/functions/compare')`
-* `require('semver/functions/compare-build')`
-* `require('semver/functions/compare-loose')`
-* `require('semver/functions/diff')`
-* `require('semver/functions/eq')`
-* `require('semver/functions/gt')`
-* `require('semver/functions/gte')`
-* `require('semver/functions/inc')`
-* `require('semver/functions/lt')`
-* `require('semver/functions/lte')`
-* `require('semver/functions/major')`
-* `require('semver/functions/minor')`
-* `require('semver/functions/neq')`
-* `require('semver/functions/parse')`
-* `require('semver/functions/patch')`
-* `require('semver/functions/prerelease')`
-* `require('semver/functions/rcompare')`
-* `require('semver/functions/rsort')`
-* `require('semver/functions/satisfies')`
-* `require('semver/functions/sort')`
-* `require('semver/functions/truncate')`
-* `require('semver/functions/valid')`
-* `require('semver/ranges/gtr')`
-* `require('semver/ranges/intersects')`
-* `require('semver/ranges/ltr')`
-* `require('semver/ranges/max-satisfying')`
-* `require('semver/ranges/min-satisfying')`
-* `require('semver/ranges/min-version')`
-* `require('semver/ranges/outside')`
-* `require('semver/ranges/simplify')`
-* `require('semver/ranges/subset')`
-* `require('semver/ranges/to-comparators')`
-* `require('semver/ranges/valid')`
-
Index: de_modules/semver/classes/comparator.js
===================================================================
--- node_modules/semver/classes/comparator.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,143 +1,0 @@
-'use strict'
-
-const ANY = Symbol('SemVer ANY')
-// hoisted class for cyclic dependency
-class Comparator {
-  static get ANY () {
-    return ANY
-  }
-
-  constructor (comp, options) {
-    options = parseOptions(options)
-
-    if (comp instanceof Comparator) {
-      if (comp.loose === !!options.loose) {
-        return comp
-      } else {
-        comp = comp.value
-      }
-    }
-
-    comp = comp.trim().split(/\s+/).join(' ')
-    debug('comparator', comp, options)
-    this.options = options
-    this.loose = !!options.loose
-    this.parse(comp)
-
-    if (this.semver === ANY) {
-      this.value = ''
-    } else {
-      this.value = this.operator + this.semver.version
-    }
-
-    debug('comp', this)
-  }
-
-  parse (comp) {
-    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
-    const m = comp.match(r)
-
-    if (!m) {
-      throw new TypeError(`Invalid comparator: ${comp}`)
-    }
-
-    this.operator = m[1] !== undefined ? m[1] : ''
-    if (this.operator === '=') {
-      this.operator = ''
-    }
-
-    // if it literally is just '>' or '' then allow anything.
-    if (!m[2]) {
-      this.semver = ANY
-    } else {
-      this.semver = new SemVer(m[2], this.options.loose)
-    }
-  }
-
-  toString () {
-    return this.value
-  }
-
-  test (version) {
-    debug('Comparator.test', version, this.options.loose)
-
-    if (this.semver === ANY || version === ANY) {
-      return true
-    }
-
-    if (typeof version === 'string') {
-      try {
-        version = new SemVer(version, this.options)
-      } catch (er) {
-        return false
-      }
-    }
-
-    return cmp(version, this.operator, this.semver, this.options)
-  }
-
-  intersects (comp, options) {
-    if (!(comp instanceof Comparator)) {
-      throw new TypeError('a Comparator is required')
-    }
-
-    if (this.operator === '') {
-      if (this.value === '') {
-        return true
-      }
-      return new Range(comp.value, options).test(this.value)
-    } else if (comp.operator === '') {
-      if (comp.value === '') {
-        return true
-      }
-      return new Range(this.value, options).test(comp.semver)
-    }
-
-    options = parseOptions(options)
-
-    // Special cases where nothing can possibly be lower
-    if (options.includePrerelease &&
-      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
-      return false
-    }
-    if (!options.includePrerelease &&
-      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
-      return false
-    }
-
-    // Same direction increasing (> or >=)
-    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
-      return true
-    }
-    // Same direction decreasing (< or <=)
-    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
-      return true
-    }
-    // same SemVer and both sides are inclusive (<= or >=)
-    if (
-      (this.semver.version === comp.semver.version) &&
-      this.operator.includes('=') && comp.operator.includes('=')) {
-      return true
-    }
-    // opposite directions less than
-    if (cmp(this.semver, '<', comp.semver, options) &&
-      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
-      return true
-    }
-    // opposite directions greater than
-    if (cmp(this.semver, '>', comp.semver, options) &&
-      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
-      return true
-    }
-    return false
-  }
-}
-
-module.exports = Comparator
-
-const parseOptions = require('../internal/parse-options')
-const { safeRe: re, t } = require('../internal/re')
-const cmp = require('../functions/cmp')
-const debug = require('../internal/debug')
-const SemVer = require('./semver')
-const Range = require('./range')
Index: de_modules/semver/classes/index.js
===================================================================
--- node_modules/semver/classes/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-'use strict'
-
-module.exports = {
-  SemVer: require('./semver.js'),
-  Range: require('./range.js'),
-  Comparator: require('./comparator.js'),
-}
Index: de_modules/semver/classes/range.js
===================================================================
--- node_modules/semver/classes/range.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,577 +1,0 @@
-'use strict'
-
-const SPACE_CHARACTERS = /\s+/g
-
-// hoisted class for cyclic dependency
-class Range {
-  constructor (range, options) {
-    options = parseOptions(options)
-
-    if (range instanceof Range) {
-      if (
-        range.loose === !!options.loose &&
-        range.includePrerelease === !!options.includePrerelease
-      ) {
-        return range
-      } else {
-        return new Range(range.raw, options)
-      }
-    }
-
-    if (range instanceof Comparator) {
-      // just put it in the set and return
-      this.raw = range.value
-      this.set = [[range]]
-      this.formatted = undefined
-      return this
-    }
-
-    this.options = options
-    this.loose = !!options.loose
-    this.includePrerelease = !!options.includePrerelease
-
-    // First reduce all whitespace as much as possible so we do not have to rely
-    // on potentially slow regexes like \s*. This is then stored and used for
-    // future error messages as well.
-    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')
-
-    // First, split on ||
-    this.set = this.raw
-      .split('||')
-      // map the range to a 2d array of comparators
-      .map(r => this.parseRange(r.trim()))
-      // throw out any comparator lists that are empty
-      // this generally means that it was not a valid range, which is allowed
-      // in loose mode, but will still throw if the WHOLE range is invalid.
-      .filter(c => c.length)
-
-    if (!this.set.length) {
-      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
-    }
-
-    // if we have any that are not the null set, throw out null sets.
-    if (this.set.length > 1) {
-      // keep the first one, in case they're all null sets
-      const first = this.set[0]
-      this.set = this.set.filter(c => !isNullSet(c[0]))
-      if (this.set.length === 0) {
-        this.set = [first]
-      } else if (this.set.length > 1) {
-        // if we have any that are *, then the range is just *
-        for (const c of this.set) {
-          if (c.length === 1 && isAny(c[0])) {
-            this.set = [c]
-            break
-          }
-        }
-      }
-    }
-
-    this.formatted = undefined
-  }
-
-  get range () {
-    if (this.formatted === undefined) {
-      this.formatted = ''
-      for (let i = 0; i < this.set.length; i++) {
-        if (i > 0) {
-          this.formatted += '||'
-        }
-        const comps = this.set[i]
-        for (let k = 0; k < comps.length; k++) {
-          if (k > 0) {
-            this.formatted += ' '
-          }
-          this.formatted += comps[k].toString().trim()
-        }
-      }
-    }
-    return this.formatted
-  }
-
-  format () {
-    return this.range
-  }
-
-  toString () {
-    return this.range
-  }
-
-  parseRange (range) {
-    // strip build metadata so it can't bleed into the version
-    range = range.replace(BUILDSTRIPRE, '')
-
-    // memoize range parsing for performance.
-    // this is a very hot path, and fully deterministic.
-    const memoOpts =
-      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
-      (this.options.loose && FLAG_LOOSE)
-    const memoKey = memoOpts + ':' + range
-    const cached = cache.get(memoKey)
-    if (cached) {
-      return cached
-    }
-
-    const loose = this.options.loose
-    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
-    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
-    debug('hyphen replace', range)
-
-    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
-    debug('comparator trim', range)
-
-    // `~ 1.2.3` => `~1.2.3`
-    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
-    debug('tilde trim', range)
-
-    // `^ 1.2.3` => `^1.2.3`
-    range = range.replace(re[t.CARETTRIM], caretTrimReplace)
-    debug('caret trim', range)
-
-    // At this point, the range is completely trimmed and
-    // ready to be split into comparators.
-
-    let rangeList = range
-      .split(' ')
-      .map(comp => parseComparator(comp, this.options))
-      .join(' ')
-      .split(/\s+/)
-      // >=0.0.0 is equivalent to *
-      .map(comp => replaceGTE0(comp, this.options))
-
-    if (loose) {
-      // in loose mode, throw out any that are not valid comparators
-      rangeList = rangeList.filter(comp => {
-        debug('loose invalid filter', comp, this.options)
-        return !!comp.match(re[t.COMPARATORLOOSE])
-      })
-    }
-    debug('range list', rangeList)
-
-    // if any comparators are the null set, then replace with JUST null set
-    // if more than one comparator, remove any * comparators
-    // also, don't include the same comparator more than once
-    const rangeMap = new Map()
-    const comparators = rangeList.map(comp => new Comparator(comp, this.options))
-    for (const comp of comparators) {
-      if (isNullSet(comp)) {
-        return [comp]
-      }
-      rangeMap.set(comp.value, comp)
-    }
-    if (rangeMap.size > 1 && rangeMap.has('')) {
-      rangeMap.delete('')
-    }
-
-    const result = [...rangeMap.values()]
-    cache.set(memoKey, result)
-    return result
-  }
-
-  intersects (range, options) {
-    if (!(range instanceof Range)) {
-      throw new TypeError('a Range is required')
-    }
-
-    return this.set.some((thisComparators) => {
-      return (
-        isSatisfiable(thisComparators, options) &&
-        range.set.some((rangeComparators) => {
-          return (
-            isSatisfiable(rangeComparators, options) &&
-            thisComparators.every((thisComparator) => {
-              return rangeComparators.every((rangeComparator) => {
-                return thisComparator.intersects(rangeComparator, options)
-              })
-            })
-          )
-        })
-      )
-    })
-  }
-
-  // if ANY of the sets match ALL of its comparators, then pass
-  test (version) {
-    if (!version) {
-      return false
-    }
-
-    if (typeof version === 'string') {
-      try {
-        version = new SemVer(version, this.options)
-      } catch (er) {
-        return false
-      }
-    }
-
-    for (let i = 0; i < this.set.length; i++) {
-      if (testSet(this.set[i], version, this.options)) {
-        return true
-      }
-    }
-    return false
-  }
-}
-
-module.exports = Range
-
-const LRU = require('../internal/lrucache')
-const cache = new LRU()
-
-const parseOptions = require('../internal/parse-options')
-const Comparator = require('./comparator')
-const debug = require('../internal/debug')
-const SemVer = require('./semver')
-const {
-  safeRe: re,
-  src,
-  t,
-  comparatorTrimReplace,
-  tildeTrimReplace,
-  caretTrimReplace,
-} = require('../internal/re')
-const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')
-
-// unbounded global build-metadata stripper used by parseRange
-const BUILDSTRIPRE = new RegExp(src[t.BUILD], 'g')
-
-const isNullSet = c => c.value === '<0.0.0-0'
-const isAny = c => c.value === ''
-
-// take a set of comparators and determine whether there
-// exists a version which can satisfy it
-const isSatisfiable = (comparators, options) => {
-  let result = true
-  const remainingComparators = comparators.slice()
-  let testComparator = remainingComparators.pop()
-
-  while (result && remainingComparators.length) {
-    result = remainingComparators.every((otherComparator) => {
-      return testComparator.intersects(otherComparator, options)
-    })
-
-    testComparator = remainingComparators.pop()
-  }
-
-  return result
-}
-
-// comprised of xranges, tildes, stars, and gtlt's at this point.
-// already replaced the hyphen ranges
-// turn into a set of JUST comparators.
-const parseComparator = (comp, options) => {
-  comp = comp.replace(re[t.BUILD], '')
-  debug('comp', comp, options)
-  comp = replaceCarets(comp, options)
-  debug('caret', comp)
-  comp = replaceTildes(comp, options)
-  debug('tildes', comp)
-  comp = replaceXRanges(comp, options)
-  debug('xrange', comp)
-  comp = replaceStars(comp, options)
-  debug('stars', comp)
-  return comp
-}
-
-const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
-
-const invalidXRangeOrder = (M, m, p) => (
-  (isX(M) && !isX(m)) ||
-  (isX(m) && p && !isX(p))
-)
-
-// ~, ~> --> * (any, kinda silly)
-// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
-// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
-// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
-// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
-// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
-// ~0.0.1 --> >=0.0.1 <0.1.0-0
-const replaceTildes = (comp, options) => {
-  return comp
-    .trim()
-    .split(/\s+/)
-    .map((c) => replaceTilde(c, options))
-    .join(' ')
-}
-
-const replaceTilde = (comp, options) => {
-  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
-  // if we're including prereleases in the match, then the lower bound is
-  // -0, the lowest possible prerelease value, just like x-ranges and carets.
-  // this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as.
-  const z = options.includePrerelease ? '-0' : ''
-  return comp.replace(r, (_, M, m, p, pr) => {
-    debug('tilde', comp, _, M, m, p, pr)
-    let ret
-
-    if (isX(M)) {
-      ret = ''
-    } else if (isX(m)) {
-      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
-    } else if (isX(p)) {
-      // ~1.2 == >=1.2.0 <1.3.0-0
-      ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
-    } else if (pr) {
-      debug('replaceTilde pr', pr)
-      ret = `>=${M}.${m}.${p}-${pr
-      } <${M}.${+m + 1}.0-0`
-    } else {
-      // ~1.2.3 == >=1.2.3 <1.3.0-0
-      ret = `>=${M}.${m}.${p
-      } <${M}.${+m + 1}.0-0`
-    }
-
-    debug('tilde return', ret)
-    return ret
-  })
-}
-
-// ^ --> * (any, kinda silly)
-// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
-// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
-// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
-// ^1.2.3 --> >=1.2.3 <2.0.0-0
-// ^1.2.0 --> >=1.2.0 <2.0.0-0
-// ^0.0.1 --> >=0.0.1 <0.0.2-0
-// ^0.1.0 --> >=0.1.0 <0.2.0-0
-const replaceCarets = (comp, options) => {
-  return comp
-    .trim()
-    .split(/\s+/)
-    .map((c) => replaceCaret(c, options))
-    .join(' ')
-}
-
-const replaceCaret = (comp, options) => {
-  debug('caret', comp, options)
-  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
-  const z = options.includePrerelease ? '-0' : ''
-  return comp.replace(r, (_, M, m, p, pr) => {
-    debug('caret', comp, _, M, m, p, pr)
-    let ret
-
-    if (isX(M)) {
-      ret = ''
-    } else if (isX(m)) {
-      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
-    } else if (isX(p)) {
-      if (M === '0') {
-        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
-      } else {
-        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
-      }
-    } else if (pr) {
-      debug('replaceCaret pr', pr)
-      if (M === '0') {
-        if (m === '0') {
-          ret = `>=${M}.${m}.${p}-${pr
-          } <${M}.${m}.${+p + 1}-0`
-        } else {
-          ret = `>=${M}.${m}.${p}-${pr
-          } <${M}.${+m + 1}.0-0`
-        }
-      } else {
-        ret = `>=${M}.${m}.${p}-${pr
-        } <${+M + 1}.0.0-0`
-      }
-    } else {
-      debug('no pr')
-      if (M === '0') {
-        if (m === '0') {
-          ret = `>=${M}.${m}.${p
-          } <${M}.${m}.${+p + 1}-0`
-        } else {
-          ret = `>=${M}.${m}.${p
-          } <${M}.${+m + 1}.0-0`
-        }
-      } else {
-        ret = `>=${M}.${m}.${p
-        } <${+M + 1}.0.0-0`
-      }
-    }
-
-    debug('caret return', ret)
-    return ret
-  })
-}
-
-const replaceXRanges = (comp, options) => {
-  debug('replaceXRanges', comp, options)
-  return comp
-    .split(/\s+/)
-    .map((c) => replaceXRange(c, options))
-    .join(' ')
-}
-
-const replaceXRange = (comp, options) => {
-  comp = comp.trim()
-  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
-  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
-    debug('xRange', comp, ret, gtlt, M, m, p, pr)
-    if (invalidXRangeOrder(M, m, p)) {
-      return comp
-    }
-
-    const xM = isX(M)
-    const xm = xM || isX(m)
-    const xp = xm || isX(p)
-    const anyX = xp
-
-    if (gtlt === '=' && anyX) {
-      gtlt = ''
-    }
-
-    // if we're including prereleases in the match, then we need
-    // to fix this to -0, the lowest possible prerelease value
-    pr = options.includePrerelease ? '-0' : ''
-
-    if (xM) {
-      if (gtlt === '>' || gtlt === '<') {
-        // nothing is allowed
-        ret = '<0.0.0-0'
-      } else {
-        // nothing is forbidden
-        ret = '*'
-      }
-    } else if (gtlt && anyX) {
-      // we know patch is an x, because we have any x at all.
-      // replace X with 0
-      if (xm) {
-        m = 0
-      }
-      p = 0
-
-      if (gtlt === '>') {
-        // >1 => >=2.0.0
-        // >1.2 => >=1.3.0
-        gtlt = '>='
-        if (xm) {
-          M = +M + 1
-          m = 0
-          p = 0
-        } else {
-          m = +m + 1
-          p = 0
-        }
-      } else if (gtlt === '<=') {
-        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-        gtlt = '<'
-        if (xm) {
-          M = +M + 1
-        } else {
-          m = +m + 1
-        }
-      }
-
-      if (gtlt === '<') {
-        pr = '-0'
-      }
-
-      ret = `${gtlt + M}.${m}.${p}${pr}`
-    } else if (xm) {
-      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
-    } else if (xp) {
-      ret = `>=${M}.${m}.0${pr
-      } <${M}.${+m + 1}.0-0`
-    }
-
-    debug('xRange return', ret)
-
-    return ret
-  })
-}
-
-// Because * is AND-ed with everything else in the comparator,
-// and '' means "any version", just remove the *s entirely.
-const replaceStars = (comp, options) => {
-  debug('replaceStars', comp, options)
-  // Looseness is ignored here.  star is always as loose as it gets!
-  return comp
-    .trim()
-    .replace(re[t.STAR], '')
-}
-
-const replaceGTE0 = (comp, options) => {
-  debug('replaceGTE0', comp, options)
-  return comp
-    .trim()
-    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
-}
-
-// This function is passed to string.replace(re[t.HYPHENRANGE])
-// M, m, patch, prerelease, build
-// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
-// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
-// TODO build?
-const hyphenReplace = incPr => ($0,
-  from, fM, fm, fp, fpr, fb,
-  to, tM, tm, tp, tpr) => {
-  if (isX(fM)) {
-    from = ''
-  } else if (isX(fm)) {
-    from = `>=${fM}.0.0${incPr ? '-0' : ''}`
-  } else if (isX(fp)) {
-    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
-  } else if (fpr) {
-    from = `>=${from}`
-  } else {
-    from = `>=${from}${incPr ? '-0' : ''}`
-  }
-
-  if (isX(tM)) {
-    to = ''
-  } else if (isX(tm)) {
-    to = `<${+tM + 1}.0.0-0`
-  } else if (isX(tp)) {
-    to = `<${tM}.${+tm + 1}.0-0`
-  } else if (tpr) {
-    to = `<=${tM}.${tm}.${tp}-${tpr}`
-  } else if (incPr) {
-    to = `<${tM}.${tm}.${+tp + 1}-0`
-  } else {
-    to = `<=${to}`
-  }
-
-  return `${from} ${to}`.trim()
-}
-
-const testSet = (set, version, options) => {
-  for (let i = 0; i < set.length; i++) {
-    if (!set[i].test(version)) {
-      return false
-    }
-  }
-
-  if (version.prerelease.length && !options.includePrerelease) {
-    // Find the set of versions that are allowed to have prereleases
-    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-    // That should allow `1.2.3-pr.2` to pass.
-    // However, `1.2.4-alpha.notready` should NOT be allowed,
-    // even though it's within the range set by the comparators.
-    for (let i = 0; i < set.length; i++) {
-      debug(set[i].semver)
-      if (set[i].semver === Comparator.ANY) {
-        continue
-      }
-
-      if (set[i].semver.prerelease.length > 0) {
-        const allowed = set[i].semver
-        if (allowed.major === version.major &&
-            allowed.minor === version.minor &&
-            allowed.patch === version.patch) {
-          return true
-        }
-      }
-    }
-
-    // Version has a -pre, but it's not one of the ones we like.
-    return false
-  }
-
-  return true
-}
Index: de_modules/semver/classes/semver.js
===================================================================
--- node_modules/semver/classes/semver.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,350 +1,0 @@
-'use strict'
-
-const debug = require('../internal/debug')
-const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
-const { safeRe: re, t } = require('../internal/re')
-
-const parseOptions = require('../internal/parse-options')
-const { compareIdentifiers } = require('../internal/identifiers')
-
-const isPrereleaseIdentifier = (prerelease, identifier) => {
-  const identifiers = identifier.split('.')
-  if (identifiers.length > prerelease.length) {
-    return false
-  }
-
-  for (let i = 0; i < identifiers.length; i++) {
-    if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) {
-      return false
-    }
-  }
-
-  return true
-}
-
-class SemVer {
-  constructor (version, options) {
-    options = parseOptions(options)
-
-    if (version instanceof SemVer) {
-      if (version.loose === !!options.loose &&
-        version.includePrerelease === !!options.includePrerelease) {
-        return version
-      } else {
-        version = version.version
-      }
-    } else if (typeof version !== 'string') {
-      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
-    }
-
-    if (version.length > MAX_LENGTH) {
-      throw new TypeError(
-        `version is longer than ${MAX_LENGTH} characters`
-      )
-    }
-
-    debug('SemVer', version, options)
-    this.options = options
-    this.loose = !!options.loose
-    // this isn't actually relevant for versions, but keep it so that we
-    // don't run into trouble passing this.options around.
-    this.includePrerelease = !!options.includePrerelease
-
-    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
-
-    if (!m) {
-      throw new TypeError(`Invalid Version: ${version}`)
-    }
-
-    this.raw = version
-
-    // these are actually numbers
-    this.major = +m[1]
-    this.minor = +m[2]
-    this.patch = +m[3]
-
-    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
-      throw new TypeError('Invalid major version')
-    }
-
-    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
-      throw new TypeError('Invalid minor version')
-    }
-
-    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
-      throw new TypeError('Invalid patch version')
-    }
-
-    // numberify any prerelease numeric ids
-    if (!m[4]) {
-      this.prerelease = []
-    } else {
-      this.prerelease = m[4].split('.').map((id) => {
-        if (/^[0-9]+$/.test(id)) {
-          const num = +id
-          if (num >= 0 && num < MAX_SAFE_INTEGER) {
-            return num
-          }
-        }
-        return id
-      })
-    }
-
-    this.build = m[5] ? m[5].split('.') : []
-    this.format()
-  }
-
-  format () {
-    this.version = `${this.major}.${this.minor}.${this.patch}`
-    if (this.prerelease.length) {
-      this.version += `-${this.prerelease.join('.')}`
-    }
-    return this.version
-  }
-
-  toString () {
-    return this.version
-  }
-
-  compare (other) {
-    debug('SemVer.compare', this.version, this.options, other)
-    if (!(other instanceof SemVer)) {
-      if (typeof other === 'string' && other === this.version) {
-        return 0
-      }
-      other = new SemVer(other, this.options)
-    }
-
-    if (other.version === this.version) {
-      return 0
-    }
-
-    return this.compareMain(other) || this.comparePre(other)
-  }
-
-  compareMain (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    if (this.major < other.major) {
-      return -1
-    }
-    if (this.major > other.major) {
-      return 1
-    }
-    if (this.minor < other.minor) {
-      return -1
-    }
-    if (this.minor > other.minor) {
-      return 1
-    }
-    if (this.patch < other.patch) {
-      return -1
-    }
-    if (this.patch > other.patch) {
-      return 1
-    }
-    return 0
-  }
-
-  comparePre (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    // NOT having a prerelease is > having one
-    if (this.prerelease.length && !other.prerelease.length) {
-      return -1
-    } else if (!this.prerelease.length && other.prerelease.length) {
-      return 1
-    } else if (!this.prerelease.length && !other.prerelease.length) {
-      return 0
-    }
-
-    let i = 0
-    do {
-      const a = this.prerelease[i]
-      const b = other.prerelease[i]
-      debug('prerelease compare', i, a, b)
-      if (a === undefined && b === undefined) {
-        return 0
-      } else if (b === undefined) {
-        return 1
-      } else if (a === undefined) {
-        return -1
-      } else if (a === b) {
-        continue
-      } else {
-        return compareIdentifiers(a, b)
-      }
-    } while (++i)
-  }
-
-  compareBuild (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    let i = 0
-    do {
-      const a = this.build[i]
-      const b = other.build[i]
-      debug('build compare', i, a, b)
-      if (a === undefined && b === undefined) {
-        return 0
-      } else if (b === undefined) {
-        return 1
-      } else if (a === undefined) {
-        return -1
-      } else if (a === b) {
-        continue
-      } else {
-        return compareIdentifiers(a, b)
-      }
-    } while (++i)
-  }
-
-  // preminor will bump the version up to the next minor release, and immediately
-  // down to pre-release. premajor and prepatch work the same way.
-  inc (release, identifier, identifierBase) {
-    if (release.startsWith('pre')) {
-      if (!identifier && identifierBase === false) {
-        throw new Error('invalid increment argument: identifier is empty')
-      }
-      // Avoid an invalid semver results
-      if (identifier) {
-        const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])
-        if (!match || match[1] !== identifier) {
-          throw new Error(`invalid identifier: ${identifier}`)
-        }
-      }
-    }
-
-    switch (release) {
-      case 'premajor':
-        this.prerelease.length = 0
-        this.patch = 0
-        this.minor = 0
-        this.major++
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'preminor':
-        this.prerelease.length = 0
-        this.patch = 0
-        this.minor++
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'prepatch':
-        // If this is already a prerelease, it will bump to the next version
-        // drop any prereleases that might already exist, since they are not
-        // relevant at this point.
-        this.prerelease.length = 0
-        this.inc('patch', identifier, identifierBase)
-        this.inc('pre', identifier, identifierBase)
-        break
-      // If the input is a non-prerelease version, this acts the same as
-      // prepatch.
-      case 'prerelease':
-        if (this.prerelease.length === 0) {
-          this.inc('patch', identifier, identifierBase)
-        }
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'release':
-        if (this.prerelease.length === 0) {
-          throw new Error(`version ${this.raw} is not a prerelease`)
-        }
-        this.prerelease.length = 0
-        break
-
-      case 'major':
-        // If this is a pre-major version, bump up to the same major version.
-        // Otherwise increment major.
-        // 1.0.0-5 bumps to 1.0.0
-        // 1.1.0 bumps to 2.0.0
-        if (
-          this.minor !== 0 ||
-          this.patch !== 0 ||
-          this.prerelease.length === 0
-        ) {
-          this.major++
-        }
-        this.minor = 0
-        this.patch = 0
-        this.prerelease = []
-        break
-      case 'minor':
-        // If this is a pre-minor version, bump up to the same minor version.
-        // Otherwise increment minor.
-        // 1.2.0-5 bumps to 1.2.0
-        // 1.2.1 bumps to 1.3.0
-        if (this.patch !== 0 || this.prerelease.length === 0) {
-          this.minor++
-        }
-        this.patch = 0
-        this.prerelease = []
-        break
-      case 'patch':
-        // If this is not a pre-release version, it will increment the patch.
-        // If it is a pre-release it will bump up to the same patch version.
-        // 1.2.0-5 patches to 1.2.0
-        // 1.2.0 patches to 1.2.1
-        if (this.prerelease.length === 0) {
-          this.patch++
-        }
-        this.prerelease = []
-        break
-      // This probably shouldn't be used publicly.
-      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
-      case 'pre': {
-        const base = Number(identifierBase) ? 1 : 0
-
-        if (this.prerelease.length === 0) {
-          this.prerelease = [base]
-        } else {
-          let i = this.prerelease.length
-          while (--i >= 0) {
-            if (typeof this.prerelease[i] === 'number') {
-              this.prerelease[i]++
-              i = -2
-            }
-          }
-          if (i === -1) {
-            // didn't increment anything
-            if (identifier === this.prerelease.join('.') && identifierBase === false) {
-              throw new Error('invalid increment argument: identifier already exists')
-            }
-            this.prerelease.push(base)
-          }
-        }
-        if (identifier) {
-          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-          let prerelease = [identifier, base]
-          if (identifierBase === false) {
-            prerelease = [identifier]
-          }
-          if (isPrereleaseIdentifier(this.prerelease, identifier)) {
-            const prereleaseBase = this.prerelease[identifier.split('.').length]
-            if (isNaN(prereleaseBase)) {
-              this.prerelease = prerelease
-            }
-          } else {
-            this.prerelease = prerelease
-          }
-        }
-        break
-      }
-      default:
-        throw new Error(`invalid increment argument: ${release}`)
-    }
-    this.raw = this.format()
-    if (this.build.length) {
-      this.raw += `+${this.build.join('.')}`
-    }
-    return this
-  }
-}
-
-module.exports = SemVer
Index: de_modules/semver/functions/clean.js
===================================================================
--- node_modules/semver/functions/clean.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict'
-
-const parse = require('./parse')
-const clean = (version, options) => {
-  const s = parse(version.trim().replace(/^[=v]+/, ''), options)
-  return s ? s.version : null
-}
-module.exports = clean
Index: de_modules/semver/functions/cmp.js
===================================================================
--- node_modules/semver/functions/cmp.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,54 +1,0 @@
-'use strict'
-
-const eq = require('./eq')
-const neq = require('./neq')
-const gt = require('./gt')
-const gte = require('./gte')
-const lt = require('./lt')
-const lte = require('./lte')
-
-const cmp = (a, op, b, loose) => {
-  switch (op) {
-    case '===':
-      if (typeof a === 'object') {
-        a = a.version
-      }
-      if (typeof b === 'object') {
-        b = b.version
-      }
-      return a === b
-
-    case '!==':
-      if (typeof a === 'object') {
-        a = a.version
-      }
-      if (typeof b === 'object') {
-        b = b.version
-      }
-      return a !== b
-
-    case '':
-    case '=':
-    case '==':
-      return eq(a, b, loose)
-
-    case '!=':
-      return neq(a, b, loose)
-
-    case '>':
-      return gt(a, b, loose)
-
-    case '>=':
-      return gte(a, b, loose)
-
-    case '<':
-      return lt(a, b, loose)
-
-    case '<=':
-      return lte(a, b, loose)
-
-    default:
-      throw new TypeError(`Invalid operator: ${op}`)
-  }
-}
-module.exports = cmp
Index: de_modules/semver/functions/coerce.js
===================================================================
--- node_modules/semver/functions/coerce.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,62 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const parse = require('./parse')
-const { safeRe: re, t } = require('../internal/re')
-
-const coerce = (version, options) => {
-  if (version instanceof SemVer) {
-    return version
-  }
-
-  if (typeof version === 'number') {
-    version = String(version)
-  }
-
-  if (typeof version !== 'string') {
-    return null
-  }
-
-  options = options || {}
-
-  let match = null
-  if (!options.rtl) {
-    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
-  } else {
-    // Find the right-most coercible string that does not share
-    // a terminus with a more left-ward coercible string.
-    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
-    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
-    //
-    // Walk through the string checking with a /g regexp
-    // Manually set the index so as to pick up overlapping matches.
-    // Stop when we get a match that ends at the string end, since no
-    // coercible string can be more right-ward without the same terminus.
-    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
-    let next
-    while ((next = coerceRtlRegex.exec(version)) &&
-        (!match || match.index + match[0].length !== version.length)
-    ) {
-      if (!match ||
-            next.index + next[0].length !== match.index + match[0].length) {
-        match = next
-      }
-      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
-    }
-    // leave it in a clean state
-    coerceRtlRegex.lastIndex = -1
-  }
-
-  if (match === null) {
-    return null
-  }
-
-  const major = match[2]
-  const minor = match[3] || '0'
-  const patch = match[4] || '0'
-  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''
-  const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''
-
-  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
-}
-module.exports = coerce
Index: de_modules/semver/functions/compare-build.js
===================================================================
--- node_modules/semver/functions/compare-build.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const compareBuild = (a, b, loose) => {
-  const versionA = new SemVer(a, loose)
-  const versionB = new SemVer(b, loose)
-  return versionA.compare(versionB) || versionA.compareBuild(versionB)
-}
-module.exports = compareBuild
Index: de_modules/semver/functions/compare-loose.js
===================================================================
--- node_modules/semver/functions/compare-loose.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const compareLoose = (a, b) => compare(a, b, true)
-module.exports = compareLoose
Index: de_modules/semver/functions/compare.js
===================================================================
--- node_modules/semver/functions/compare.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,7 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const compare = (a, b, loose) =>
-  new SemVer(a, loose).compare(new SemVer(b, loose))
-
-module.exports = compare
Index: de_modules/semver/functions/diff.js
===================================================================
--- node_modules/semver/functions/diff.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,60 +1,0 @@
-'use strict'
-
-const parse = require('./parse.js')
-
-const diff = (version1, version2) => {
-  const v1 = parse(version1, null, true)
-  const v2 = parse(version2, null, true)
-  const comparison = v1.compare(v2)
-
-  if (comparison === 0) {
-    return null
-  }
-
-  const v1Higher = comparison > 0
-  const highVersion = v1Higher ? v1 : v2
-  const lowVersion = v1Higher ? v2 : v1
-  const highHasPre = !!highVersion.prerelease.length
-  const lowHasPre = !!lowVersion.prerelease.length
-
-  if (lowHasPre && !highHasPre) {
-    // Going from prerelease -> no prerelease requires some special casing
-
-    // If the low version has only a major, then it will always be a major
-    // Some examples:
-    // 1.0.0-1 -> 1.0.0
-    // 1.0.0-1 -> 1.1.1
-    // 1.0.0-1 -> 2.0.0
-    if (!lowVersion.patch && !lowVersion.minor) {
-      return 'major'
-    }
-
-    // If the main part has no difference
-    if (lowVersion.compareMain(highVersion) === 0) {
-      if (lowVersion.minor && !lowVersion.patch) {
-        return 'minor'
-      }
-      return 'patch'
-    }
-  }
-
-  // add the `pre` prefix if we are going to a prerelease version
-  const prefix = highHasPre ? 'pre' : ''
-
-  if (v1.major !== v2.major) {
-    return prefix + 'major'
-  }
-
-  if (v1.minor !== v2.minor) {
-    return prefix + 'minor'
-  }
-
-  if (v1.patch !== v2.patch) {
-    return prefix + 'patch'
-  }
-
-  // high and low are prereleases
-  return 'prerelease'
-}
-
-module.exports = diff
Index: de_modules/semver/functions/eq.js
===================================================================
--- node_modules/semver/functions/eq.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const eq = (a, b, loose) => compare(a, b, loose) === 0
-module.exports = eq
Index: de_modules/semver/functions/gt.js
===================================================================
--- node_modules/semver/functions/gt.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const gt = (a, b, loose) => compare(a, b, loose) > 0
-module.exports = gt
Index: de_modules/semver/functions/gte.js
===================================================================
--- node_modules/semver/functions/gte.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const gte = (a, b, loose) => compare(a, b, loose) >= 0
-module.exports = gte
Index: de_modules/semver/functions/inc.js
===================================================================
--- node_modules/semver/functions/inc.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-
-const inc = (version, release, options, identifier, identifierBase) => {
-  if (typeof (options) === 'string') {
-    identifierBase = identifier
-    identifier = options
-    options = undefined
-  }
-
-  try {
-    return new SemVer(
-      version instanceof SemVer ? version.version : version,
-      options
-    ).inc(release, identifier, identifierBase).version
-  } catch (er) {
-    return null
-  }
-}
-module.exports = inc
Index: de_modules/semver/functions/lt.js
===================================================================
--- node_modules/semver/functions/lt.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const lt = (a, b, loose) => compare(a, b, loose) < 0
-module.exports = lt
Index: de_modules/semver/functions/lte.js
===================================================================
--- node_modules/semver/functions/lte.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const lte = (a, b, loose) => compare(a, b, loose) <= 0
-module.exports = lte
Index: de_modules/semver/functions/major.js
===================================================================
--- node_modules/semver/functions/major.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const major = (a, loose) => new SemVer(a, loose).major
-module.exports = major
Index: de_modules/semver/functions/minor.js
===================================================================
--- node_modules/semver/functions/minor.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const minor = (a, loose) => new SemVer(a, loose).minor
-module.exports = minor
Index: de_modules/semver/functions/neq.js
===================================================================
--- node_modules/semver/functions/neq.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const neq = (a, b, loose) => compare(a, b, loose) !== 0
-module.exports = neq
Index: de_modules/semver/functions/parse.js
===================================================================
--- node_modules/semver/functions/parse.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,18 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const parse = (version, options, throwErrors = false) => {
-  if (version instanceof SemVer) {
-    return version
-  }
-  try {
-    return new SemVer(version, options)
-  } catch (er) {
-    if (!throwErrors) {
-      return null
-    }
-    throw er
-  }
-}
-
-module.exports = parse
Index: de_modules/semver/functions/patch.js
===================================================================
--- node_modules/semver/functions/patch.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const patch = (a, loose) => new SemVer(a, loose).patch
-module.exports = patch
Index: de_modules/semver/functions/prerelease.js
===================================================================
--- node_modules/semver/functions/prerelease.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict'
-
-const parse = require('./parse')
-const prerelease = (version, options) => {
-  const parsed = parse(version, options)
-  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
-}
-module.exports = prerelease
Index: de_modules/semver/functions/rcompare.js
===================================================================
--- node_modules/semver/functions/rcompare.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compare = require('./compare')
-const rcompare = (a, b, loose) => compare(b, a, loose)
-module.exports = rcompare
Index: de_modules/semver/functions/rsort.js
===================================================================
--- node_modules/semver/functions/rsort.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compareBuild = require('./compare-build')
-const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
-module.exports = rsort
Index: de_modules/semver/functions/satisfies.js
===================================================================
--- node_modules/semver/functions/satisfies.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-'use strict'
-
-const Range = require('../classes/range')
-const satisfies = (version, range, options) => {
-  try {
-    range = new Range(range, options)
-  } catch (er) {
-    return false
-  }
-  return range.test(version)
-}
-module.exports = satisfies
Index: de_modules/semver/functions/sort.js
===================================================================
--- node_modules/semver/functions/sort.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict'
-
-const compareBuild = require('./compare-build')
-const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
-module.exports = sort
Index: de_modules/semver/functions/truncate.js
===================================================================
--- node_modules/semver/functions/truncate.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,48 +1,0 @@
-'use strict'
-
-const parse = require('./parse')
-const constants = require('../internal/constants')
-const SemVer = require('../classes/semver')
-
-const truncate = (version, truncation, options) => {
-  if (!constants.RELEASE_TYPES.includes(truncation)) {
-    return null
-  }
-
-  const clonedVersion = cloneInputVersion(version, options)
-  return clonedVersion && doTruncation(clonedVersion, truncation)
-}
-
-const cloneInputVersion = (version, options) => {
-  const versionStringToParse = (
-    version instanceof SemVer ? version.version : version
-  )
-
-  return parse(versionStringToParse, options)
-}
-
-const doTruncation = (version, truncation) => {
-  if (isPrerelease(truncation)) {
-    return version.version
-  }
-
-  version.prerelease = []
-
-  switch (truncation) {
-    case 'major':
-      version.minor = 0
-      version.patch = 0
-      break
-    case 'minor':
-      version.patch = 0
-      break
-  }
-
-  return version.format()
-}
-
-const isPrerelease = (type) => {
-  return type.startsWith('pre')
-}
-
-module.exports = truncate
Index: de_modules/semver/functions/valid.js
===================================================================
--- node_modules/semver/functions/valid.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict'
-
-const parse = require('./parse')
-const valid = (version, options) => {
-  const v = parse(version, options)
-  return v ? v.version : null
-}
-module.exports = valid
Index: de_modules/semver/index.js
===================================================================
--- node_modules/semver/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,93 +1,0 @@
-'use strict'
-
-// just pre-load all the stuff that index.js lazily exports
-const internalRe = require('./internal/re')
-const constants = require('./internal/constants')
-const SemVer = require('./classes/semver')
-const identifiers = require('./internal/identifiers')
-const parse = require('./functions/parse')
-const valid = require('./functions/valid')
-const clean = require('./functions/clean')
-const inc = require('./functions/inc')
-const diff = require('./functions/diff')
-const major = require('./functions/major')
-const minor = require('./functions/minor')
-const patch = require('./functions/patch')
-const prerelease = require('./functions/prerelease')
-const compare = require('./functions/compare')
-const rcompare = require('./functions/rcompare')
-const compareLoose = require('./functions/compare-loose')
-const compareBuild = require('./functions/compare-build')
-const sort = require('./functions/sort')
-const rsort = require('./functions/rsort')
-const gt = require('./functions/gt')
-const lt = require('./functions/lt')
-const eq = require('./functions/eq')
-const neq = require('./functions/neq')
-const gte = require('./functions/gte')
-const lte = require('./functions/lte')
-const cmp = require('./functions/cmp')
-const coerce = require('./functions/coerce')
-const truncate = require('./functions/truncate')
-const Comparator = require('./classes/comparator')
-const Range = require('./classes/range')
-const satisfies = require('./functions/satisfies')
-const toComparators = require('./ranges/to-comparators')
-const maxSatisfying = require('./ranges/max-satisfying')
-const minSatisfying = require('./ranges/min-satisfying')
-const minVersion = require('./ranges/min-version')
-const validRange = require('./ranges/valid')
-const outside = require('./ranges/outside')
-const gtr = require('./ranges/gtr')
-const ltr = require('./ranges/ltr')
-const intersects = require('./ranges/intersects')
-const simplifyRange = require('./ranges/simplify')
-const subset = require('./ranges/subset')
-module.exports = {
-  parse,
-  valid,
-  clean,
-  inc,
-  diff,
-  major,
-  minor,
-  patch,
-  prerelease,
-  compare,
-  rcompare,
-  compareLoose,
-  compareBuild,
-  sort,
-  rsort,
-  gt,
-  lt,
-  eq,
-  neq,
-  gte,
-  lte,
-  cmp,
-  coerce,
-  truncate,
-  Comparator,
-  Range,
-  satisfies,
-  toComparators,
-  maxSatisfying,
-  minSatisfying,
-  minVersion,
-  validRange,
-  outside,
-  gtr,
-  ltr,
-  intersects,
-  simplifyRange,
-  subset,
-  SemVer,
-  re: internalRe.re,
-  src: internalRe.src,
-  tokens: internalRe.t,
-  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
-  RELEASE_TYPES: constants.RELEASE_TYPES,
-  compareIdentifiers: identifiers.compareIdentifiers,
-  rcompareIdentifiers: identifiers.rcompareIdentifiers,
-}
Index: de_modules/semver/internal/constants.js
===================================================================
--- node_modules/semver/internal/constants.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,37 +1,0 @@
-'use strict'
-
-// Note: this is the semver.org version of the spec that it implements
-// Not necessarily the package version of this code.
-const SEMVER_SPEC_VERSION = '2.0.0'
-
-const MAX_LENGTH = 256
-const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
-/* istanbul ignore next */ 9007199254740991
-
-// Max safe segment length for coercion.
-const MAX_SAFE_COMPONENT_LENGTH = 16
-
-// Max safe length for a build identifier. The max length minus 6 characters for
-// the shortest version with a build 0.0.0+BUILD.
-const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
-
-const RELEASE_TYPES = [
-  'major',
-  'premajor',
-  'minor',
-  'preminor',
-  'patch',
-  'prepatch',
-  'prerelease',
-]
-
-module.exports = {
-  MAX_LENGTH,
-  MAX_SAFE_COMPONENT_LENGTH,
-  MAX_SAFE_BUILD_LENGTH,
-  MAX_SAFE_INTEGER,
-  RELEASE_TYPES,
-  SEMVER_SPEC_VERSION,
-  FLAG_INCLUDE_PRERELEASE: 0b001,
-  FLAG_LOOSE: 0b010,
-}
Index: de_modules/semver/internal/debug.js
===================================================================
--- node_modules/semver/internal/debug.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,11 +1,0 @@
-'use strict'
-
-const debug = (
-  typeof process === 'object' &&
-  process.env &&
-  process.env.NODE_DEBUG &&
-  /\bsemver\b/i.test(process.env.NODE_DEBUG)
-) ? (...args) => console.error('SEMVER', ...args)
-  : () => {}
-
-module.exports = debug
Index: de_modules/semver/internal/identifiers.js
===================================================================
--- node_modules/semver/internal/identifiers.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,29 +1,0 @@
-'use strict'
-
-const numeric = /^[0-9]+$/
-const compareIdentifiers = (a, b) => {
-  if (typeof a === 'number' && typeof b === 'number') {
-    return a === b ? 0 : a < b ? -1 : 1
-  }
-
-  const anum = numeric.test(a)
-  const bnum = numeric.test(b)
-
-  if (anum && bnum) {
-    a = +a
-    b = +b
-  }
-
-  return a === b ? 0
-    : (anum && !bnum) ? -1
-    : (bnum && !anum) ? 1
-    : a < b ? -1
-    : 1
-}
-
-const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
-
-module.exports = {
-  compareIdentifiers,
-  rcompareIdentifiers,
-}
Index: de_modules/semver/internal/lrucache.js
===================================================================
--- node_modules/semver/internal/lrucache.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,42 +1,0 @@
-'use strict'
-
-class LRUCache {
-  constructor () {
-    this.max = 1000
-    this.map = new Map()
-  }
-
-  get (key) {
-    const value = this.map.get(key)
-    if (value === undefined) {
-      return undefined
-    } else {
-      // Remove the key from the map and add it to the end
-      this.map.delete(key)
-      this.map.set(key, value)
-      return value
-    }
-  }
-
-  delete (key) {
-    return this.map.delete(key)
-  }
-
-  set (key, value) {
-    const deleted = this.delete(key)
-
-    if (!deleted && value !== undefined) {
-      // If cache is full, delete the least recently used item
-      if (this.map.size >= this.max) {
-        const firstKey = this.map.keys().next().value
-        this.delete(firstKey)
-      }
-
-      this.map.set(key, value)
-    }
-
-    return this
-  }
-}
-
-module.exports = LRUCache
Index: de_modules/semver/internal/parse-options.js
===================================================================
--- node_modules/semver/internal/parse-options.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-'use strict'
-
-// parse out just the options we care about
-const looseOption = Object.freeze({ loose: true })
-const emptyOpts = Object.freeze({ })
-const parseOptions = options => {
-  if (!options) {
-    return emptyOpts
-  }
-
-  if (typeof options !== 'object') {
-    return looseOption
-  }
-
-  return options
-}
-module.exports = parseOptions
Index: de_modules/semver/internal/re.js
===================================================================
--- node_modules/semver/internal/re.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,223 +1,0 @@
-'use strict'
-
-const {
-  MAX_SAFE_COMPONENT_LENGTH,
-  MAX_SAFE_BUILD_LENGTH,
-  MAX_LENGTH,
-} = require('./constants')
-const debug = require('./debug')
-exports = module.exports = {}
-
-// The actual regexps go on exports.re
-const re = exports.re = []
-const safeRe = exports.safeRe = []
-const src = exports.src = []
-const safeSrc = exports.safeSrc = []
-const t = exports.t = {}
-let R = 0
-
-const LETTERDASHNUMBER = '[a-zA-Z0-9-]'
-
-// Replace some greedy regex tokens to prevent regex dos issues. These regex are
-// used internally via the safeRe object since all inputs in this library get
-// normalized first to trim and collapse all extra whitespace. The original
-// regexes are exported for userland consumption and lower level usage. A
-// future breaking change could export the safer regex only with a note that
-// all input should have extra whitespace removed.
-const safeRegexReplacements = [
-  ['\\s', 1],
-  ['\\d', MAX_LENGTH],
-  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
-]
-
-const makeSafeRegex = (value) => {
-  for (const [token, max] of safeRegexReplacements) {
-    value = value
-      .split(`${token}*`).join(`${token}{0,${max}}`)
-      .split(`${token}+`).join(`${token}{1,${max}}`)
-  }
-  return value
-}
-
-const createToken = (name, value, isGlobal) => {
-  const safe = makeSafeRegex(value)
-  const index = R++
-  debug(name, index, value)
-  t[name] = index
-  src[index] = value
-  safeSrc[index] = safe
-  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
-  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
-}
-
-// The following Regular Expressions can be used for tokenizing,
-// validating, and parsing SemVer version strings.
-
-// ## Numeric Identifier
-// A single `0`, or a non-zero digit followed by zero or more digits.
-
-createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
-createToken('NUMERICIDENTIFIERLOOSE', '\\d+')
-
-// ## Non-numeric Identifier
-// Zero or more digits, followed by a letter or hyphen, and then zero or
-// more letters, digits, or hyphens.
-
-createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)
-
-// ## Main Version
-// Three dot-separated numeric identifiers.
-
-createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
-                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
-                   `(${src[t.NUMERICIDENTIFIER]})`)
-
-createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)
-
-// ## Pre-release Version Identifier
-// A numeric identifier, or a non-numeric identifier.
-// Non-numeric identifiers include numeric identifiers but can be longer.
-// Therefore non-numeric identifiers must go first.
-
-createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]
-}|${src[t.NUMERICIDENTIFIER]})`)
-
-createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]
-}|${src[t.NUMERICIDENTIFIERLOOSE]})`)
-
-// ## Pre-release Version
-// Hyphen, followed by one or more dot-separated pre-release version
-// identifiers.
-
-createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
-}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)
-
-createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
-}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)
-
-// ## Build Metadata Identifier
-// Any combination of digits, letters, or hyphens.
-
-createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)
-
-// ## Build Metadata
-// Plus sign, followed by one or more period-separated build metadata
-// identifiers.
-
-createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
-}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)
-
-// ## Full Version String
-// A main version, followed optionally by a pre-release version and
-// build metadata.
-
-// Note that the only major, minor, patch, and pre-release sections of
-// the version string are capturing groups.  The build metadata is not a
-// capturing group, because it should not ever be used in version
-// comparison.
-
-createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
-}${src[t.PRERELEASE]}?${
-  src[t.BUILD]}?`)
-
-createToken('FULL', `^${src[t.FULLPLAIN]}$`)
-
-// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-// common in the npm registry.
-createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
-}${src[t.PRERELEASELOOSE]}?${
-  src[t.BUILD]}?`)
-
-createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
-
-createToken('GTLT', '((?:<|>)?=?)')
-
-// Something like "2.*" or "1.2.x".
-// Note that "x.x" is a valid xRange identifier, meaning "any version"
-// Only the first item is strictly required.
-createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
-createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
-
-createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:${src[t.PRERELEASE]})?${
-                     src[t.BUILD]}?` +
-                   `)?)?`)
-
-createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:${src[t.PRERELEASELOOSE]})?${
-                          src[t.BUILD]}?` +
-                        `)?)?`)
-
-createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
-createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
-
-// Coercion.
-// Extract anything that could conceivably be a part of a valid semver
-createToken('COERCEPLAIN', `${'(^|[^\\d])' +
-              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
-              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
-              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)
-createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`)
-createToken('COERCEFULL', src[t.COERCEPLAIN] +
-              `(?:${src[t.PRERELEASE]})?` +
-              `(?:${src[t.BUILD]})?` +
-              `(?:$|[^\\d])`)
-createToken('COERCERTL', src[t.COERCE], true)
-createToken('COERCERTLFULL', src[t.COERCEFULL], true)
-
-// Tilde ranges.
-// Meaning is "reasonably at or greater than"
-createToken('LONETILDE', '(?:~>?)')
-
-createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
-exports.tildeTrimReplace = '$1~'
-
-createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
-createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)
-
-// Caret ranges.
-// Meaning is "at least and backwards compatible with"
-createToken('LONECARET', '(?:\\^)')
-
-createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
-exports.caretTrimReplace = '$1^'
-
-createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
-createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)
-
-// A simple gt/lt/eq thing, or just "" to indicate "any version"
-createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
-createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)
-
-// An expression to strip any whitespace between the gtlt and the thing
-// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
-}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
-exports.comparatorTrimReplace = '$1$2$3'
-
-// Something like `1.2.3 - 1.2.4`
-// Note that these all use the loose form, because they'll be
-// checked against either the strict or loose comparator form
-// later.
-createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
-                   `\\s+-\\s+` +
-                   `(${src[t.XRANGEPLAIN]})` +
-                   `\\s*$`)
-
-createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
-                        `\\s+-\\s+` +
-                        `(${src[t.XRANGEPLAINLOOSE]})` +
-                        `\\s*$`)
-
-// Star ranges basically just allow anything at all.
-createToken('STAR', '(<|>)?=?\\s*\\*')
-// >=0.0.0 is like a star
-createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$')
-createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$')
Index: de_modules/semver/package.json
===================================================================
--- node_modules/semver/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,78 +1,0 @@
-{
-  "name": "semver",
-  "version": "7.8.5",
-  "description": "The semantic version parser used by npm.",
-  "main": "index.js",
-  "scripts": {
-    "test": "tap",
-    "snap": "tap",
-    "lint": "npm run eslint",
-    "postlint": "template-oss-check",
-    "lintfix": "npm run eslint -- --fix",
-    "posttest": "npm run lint",
-    "template-oss-apply": "template-oss-apply --force",
-    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
-  },
-  "devDependencies": {
-    "@npmcli/eslint-config": "^7.0.0",
-    "@npmcli/template-oss": "5.0.0",
-    "benchmark": "^2.1.4",
-    "tap": "^16.0.0"
-  },
-  "license": "ISC",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/node-semver.git"
-  },
-  "bin": {
-    "semver": "bin/semver.js"
-  },
-  "files": [
-    "bin/",
-    "lib/",
-    "classes/",
-    "functions/",
-    "internal/",
-    "ranges/",
-    "index.js",
-    "preload.js",
-    "range.bnf"
-  ],
-  "tap": {
-    "timeout": 30,
-    "coverage-map": "map.js",
-    "nyc-arg": [
-      "--exclude",
-      "tap-snapshots/**"
-    ]
-  },
-  "engines": {
-    "node": ">=10"
-  },
-  "author": "GitHub Inc.",
-  "templateOSS": {
-    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
-    "version": "5.0.0",
-    "engines": ">=10",
-    "distPaths": [
-      "classes/",
-      "functions/",
-      "internal/",
-      "ranges/",
-      "index.js",
-      "preload.js",
-      "range.bnf"
-    ],
-    "allowPaths": [
-      "/classes/",
-      "/functions/",
-      "/internal/",
-      "/ranges/",
-      "/index.js",
-      "/preload.js",
-      "/range.bnf",
-      "/benchmarks"
-    ],
-    "publish": "true"
-  }
-}
Index: de_modules/semver/preload.js
===================================================================
--- node_modules/semver/preload.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,4 +1,0 @@
-'use strict'
-
-// XXX remove in v8 or beyond
-module.exports = require('./index.js')
Index: de_modules/semver/range.bnf
===================================================================
--- node_modules/semver/range.bnf	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | [1-9] ( [0-9] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= prepart ( '.' prepart ) *
-prepart    ::= nr | alphanumid
-build      ::= buildid ( '.' buildid ) *
-alphanumid ::= ( [0-9] ) * [A-Za-z-] [-0-9A-Za-z] *
-buildid    ::= [-0-9A-Za-z]+
Index: de_modules/semver/ranges/gtr.js
===================================================================
--- node_modules/semver/ranges/gtr.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,6 +1,0 @@
-'use strict'
-
-// Determine if version is greater than all the versions possible in the range.
-const outside = require('./outside')
-const gtr = (version, range, options) => outside(version, range, '>', options)
-module.exports = gtr
Index: de_modules/semver/ranges/intersects.js
===================================================================
--- node_modules/semver/ranges/intersects.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-'use strict'
-
-const Range = require('../classes/range')
-const intersects = (r1, r2, options) => {
-  r1 = new Range(r1, options)
-  r2 = new Range(r2, options)
-  return r1.intersects(r2, options)
-}
-module.exports = intersects
Index: de_modules/semver/ranges/ltr.js
===================================================================
--- node_modules/semver/ranges/ltr.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,6 +1,0 @@
-'use strict'
-
-const outside = require('./outside')
-// Determine if version is less than all the versions possible in the range
-const ltr = (version, range, options) => outside(version, range, '<', options)
-module.exports = ltr
Index: de_modules/semver/ranges/max-satisfying.js
===================================================================
--- node_modules/semver/ranges/max-satisfying.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-
-const maxSatisfying = (versions, range, options) => {
-  let max = null
-  let maxSV = null
-  let rangeObj = null
-  try {
-    rangeObj = new Range(range, options)
-  } catch (er) {
-    return null
-  }
-  versions.forEach((v) => {
-    if (rangeObj.test(v)) {
-      // satisfies(v, range, options)
-      if (!max || maxSV.compare(v) === -1) {
-        // compare(max, v, true)
-        max = v
-        maxSV = new SemVer(max, options)
-      }
-    }
-  })
-  return max
-}
-module.exports = maxSatisfying
Index: de_modules/semver/ranges/min-satisfying.js
===================================================================
--- node_modules/semver/ranges/min-satisfying.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,26 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-const minSatisfying = (versions, range, options) => {
-  let min = null
-  let minSV = null
-  let rangeObj = null
-  try {
-    rangeObj = new Range(range, options)
-  } catch (er) {
-    return null
-  }
-  versions.forEach((v) => {
-    if (rangeObj.test(v)) {
-      // satisfies(v, range, options)
-      if (!min || minSV.compare(v) === 1) {
-        // compare(min, v, true)
-        min = v
-        minSV = new SemVer(min, options)
-      }
-    }
-  })
-  return min
-}
-module.exports = minSatisfying
Index: de_modules/semver/ranges/min-version.js
===================================================================
--- node_modules/semver/ranges/min-version.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,63 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-const gt = require('../functions/gt')
-
-const minVersion = (range, loose) => {
-  range = new Range(range, loose)
-
-  let minver = new SemVer('0.0.0')
-  if (range.test(minver)) {
-    return minver
-  }
-
-  minver = new SemVer('0.0.0-0')
-  if (range.test(minver)) {
-    return minver
-  }
-
-  minver = null
-  for (let i = 0; i < range.set.length; ++i) {
-    const comparators = range.set[i]
-
-    let setMin = null
-    comparators.forEach((comparator) => {
-      // Clone to avoid manipulating the comparator's semver object.
-      const compver = new SemVer(comparator.semver.version)
-      switch (comparator.operator) {
-        case '>':
-          if (compver.prerelease.length === 0) {
-            compver.patch++
-          } else {
-            compver.prerelease.push(0)
-          }
-          compver.raw = compver.format()
-          /* fallthrough */
-        case '':
-        case '>=':
-          if (!setMin || gt(compver, setMin)) {
-            setMin = compver
-          }
-          break
-        case '<':
-        case '<=':
-          /* Ignore maximum versions */
-          break
-        /* istanbul ignore next */
-        default:
-          throw new Error(`Unexpected operation: ${comparator.operator}`)
-      }
-    })
-    if (setMin && (!minver || gt(minver, setMin))) {
-      minver = setMin
-    }
-  }
-
-  if (minver && range.test(minver)) {
-    return minver
-  }
-
-  return null
-}
-module.exports = minVersion
Index: de_modules/semver/ranges/outside.js
===================================================================
--- node_modules/semver/ranges/outside.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-'use strict'
-
-const SemVer = require('../classes/semver')
-const Comparator = require('../classes/comparator')
-const { ANY } = Comparator
-const Range = require('../classes/range')
-const satisfies = require('../functions/satisfies')
-const gt = require('../functions/gt')
-const lt = require('../functions/lt')
-const lte = require('../functions/lte')
-const gte = require('../functions/gte')
-
-const outside = (version, range, hilo, options) => {
-  version = new SemVer(version, options)
-  range = new Range(range, options)
-
-  let gtfn, ltefn, ltfn, comp, ecomp
-  switch (hilo) {
-    case '>':
-      gtfn = gt
-      ltefn = lte
-      ltfn = lt
-      comp = '>'
-      ecomp = '>='
-      break
-    case '<':
-      gtfn = lt
-      ltefn = gte
-      ltfn = gt
-      comp = '<'
-      ecomp = '<='
-      break
-    default:
-      throw new TypeError('Must provide a hilo val of "<" or ">"')
-  }
-
-  // If it satisfies the range it is not outside
-  if (satisfies(version, range, options)) {
-    return false
-  }
-
-  // From now on, variable terms are as if we're in "gtr" mode.
-  // but note that everything is flipped for the "ltr" function.
-
-  for (let i = 0; i < range.set.length; ++i) {
-    const comparators = range.set[i]
-
-    let high = null
-    let low = null
-
-    comparators.forEach((comparator) => {
-      if (comparator.semver === ANY) {
-        comparator = new Comparator('>=0.0.0')
-      }
-      high = high || comparator
-      low = low || comparator
-      if (gtfn(comparator.semver, high.semver, options)) {
-        high = comparator
-      } else if (ltfn(comparator.semver, low.semver, options)) {
-        low = comparator
-      }
-    })
-
-    // If the edge version comparator has a operator then our version
-    // isn't outside it
-    if (high.operator === comp || high.operator === ecomp) {
-      return false
-    }
-
-    // If the lowest version comparator has an operator and our version
-    // is less than it then it isn't higher than the range
-    if ((!low.operator || low.operator === comp) &&
-        ltefn(version, low.semver)) {
-      return false
-    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-      return false
-    }
-  }
-  return true
-}
-
-module.exports = outside
Index: de_modules/semver/ranges/simplify.js
===================================================================
--- node_modules/semver/ranges/simplify.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,49 +1,0 @@
-'use strict'
-
-// given a set of versions and a range, create a "simplified" range
-// that includes the same versions that the original range does
-// If the original range is shorter than the simplified one, return that.
-const satisfies = require('../functions/satisfies.js')
-const compare = require('../functions/compare.js')
-module.exports = (versions, range, options) => {
-  const set = []
-  let first = null
-  let prev = null
-  const v = versions.sort((a, b) => compare(a, b, options))
-  for (const version of v) {
-    const included = satisfies(version, range, options)
-    if (included) {
-      prev = version
-      if (!first) {
-        first = version
-      }
-    } else {
-      if (prev) {
-        set.push([first, prev])
-      }
-      prev = null
-      first = null
-    }
-  }
-  if (first) {
-    set.push([first, null])
-  }
-
-  const ranges = []
-  for (const [min, max] of set) {
-    if (min === max) {
-      ranges.push(min)
-    } else if (!max && min === v[0]) {
-      ranges.push('*')
-    } else if (!max) {
-      ranges.push(`>=${min}`)
-    } else if (min === v[0]) {
-      ranges.push(`<=${max}`)
-    } else {
-      ranges.push(`${min} - ${max}`)
-    }
-  }
-  const simplified = ranges.join(' || ')
-  const original = typeof range.raw === 'string' ? range.raw : String(range)
-  return simplified.length < original.length ? simplified : range
-}
Index: de_modules/semver/ranges/subset.js
===================================================================
--- node_modules/semver/ranges/subset.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,249 +1,0 @@
-'use strict'
-
-const Range = require('../classes/range.js')
-const Comparator = require('../classes/comparator.js')
-const { ANY } = Comparator
-const satisfies = require('../functions/satisfies.js')
-const compare = require('../functions/compare.js')
-
-// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
-// - Every simple range `r1, r2, ...` is a null set, OR
-// - Every simple range `r1, r2, ...` which is not a null set is a subset of
-//   some `R1, R2, ...`
-//
-// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
-// - If c is only the ANY comparator
-//   - If C is only the ANY comparator, return true
-//   - Else if in prerelease mode, return false
-//   - else replace c with `[>=0.0.0]`
-// - If C is only the ANY comparator
-//   - if in prerelease mode, return true
-//   - else replace C with `[>=0.0.0]`
-// - Let EQ be the set of = comparators in c
-// - If EQ is more than one, return true (null set)
-// - Let GT be the highest > or >= comparator in c
-// - Let LT be the lowest < or <= comparator in c
-// - If GT and LT, and GT.semver > LT.semver, return true (null set)
-// - If any C is a = range, and GT or LT are set, return false
-// - If EQ
-//   - If GT, and EQ does not satisfy GT, return true (null set)
-//   - If LT, and EQ does not satisfy LT, return true (null set)
-//   - If EQ satisfies every C, return true
-//   - Else return false
-// - If GT
-//   - If GT.semver is lower than any > or >= comp in C, return false
-//   - If GT is >=, and GT.semver does not satisfy every C, return false
-//   - If GT.semver has a prerelease, and not in prerelease mode
-//     - If no C has a prerelease and the GT.semver tuple, return false
-// - If LT
-//   - If LT.semver is greater than any < or <= comp in C, return false
-//   - If LT is <=, and LT.semver does not satisfy every C, return false
-//   - If LT.semver has a prerelease, and not in prerelease mode
-//     - If no C has a prerelease and the LT.semver tuple, return false
-// - Else return true
-
-const subset = (sub, dom, options = {}) => {
-  if (sub === dom) {
-    return true
-  }
-
-  sub = new Range(sub, options)
-  dom = new Range(dom, options)
-  let sawNonNull = false
-
-  OUTER: for (const simpleSub of sub.set) {
-    for (const simpleDom of dom.set) {
-      const isSub = simpleSubset(simpleSub, simpleDom, options)
-      sawNonNull = sawNonNull || isSub !== null
-      if (isSub) {
-        continue OUTER
-      }
-    }
-    // the null set is a subset of everything, but null simple ranges in
-    // a complex range should be ignored.  so if we saw a non-null range,
-    // then we know this isn't a subset, but if EVERY simple range was null,
-    // then it is a subset.
-    if (sawNonNull) {
-      return false
-    }
-  }
-  return true
-}
-
-const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]
-const minimumVersion = [new Comparator('>=0.0.0')]
-
-const simpleSubset = (sub, dom, options) => {
-  if (sub === dom) {
-    return true
-  }
-
-  if (sub.length === 1 && sub[0].semver === ANY) {
-    if (dom.length === 1 && dom[0].semver === ANY) {
-      return true
-    } else if (options.includePrerelease) {
-      sub = minimumVersionWithPreRelease
-    } else {
-      sub = minimumVersion
-    }
-  }
-
-  if (dom.length === 1 && dom[0].semver === ANY) {
-    if (options.includePrerelease) {
-      return true
-    } else {
-      dom = minimumVersion
-    }
-  }
-
-  const eqSet = new Set()
-  let gt, lt
-  for (const c of sub) {
-    if (c.operator === '>' || c.operator === '>=') {
-      gt = higherGT(gt, c, options)
-    } else if (c.operator === '<' || c.operator === '<=') {
-      lt = lowerLT(lt, c, options)
-    } else {
-      eqSet.add(c.semver)
-    }
-  }
-
-  if (eqSet.size > 1) {
-    return null
-  }
-
-  let gtltComp
-  if (gt && lt) {
-    gtltComp = compare(gt.semver, lt.semver, options)
-    if (gtltComp > 0) {
-      return null
-    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
-      return null
-    }
-  }
-
-  // will iterate one or zero times
-  for (const eq of eqSet) {
-    if (gt && !satisfies(eq, String(gt), options)) {
-      return null
-    }
-
-    if (lt && !satisfies(eq, String(lt), options)) {
-      return null
-    }
-
-    for (const c of dom) {
-      if (!satisfies(eq, String(c), options)) {
-        return false
-      }
-    }
-
-    return true
-  }
-
-  let higher, lower
-  let hasDomLT, hasDomGT
-  // if the subset has a prerelease, we need a comparator in the superset
-  // with the same tuple and a prerelease, or it's not a subset
-  let needDomLTPre = lt &&
-    !options.includePrerelease &&
-    lt.semver.prerelease.length ? lt.semver : false
-  let needDomGTPre = gt &&
-    !options.includePrerelease &&
-    gt.semver.prerelease.length ? gt.semver : false
-  // exception: <1.2.3-0 is the same as <1.2.3
-  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
-      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
-    needDomLTPre = false
-  }
-
-  for (const c of dom) {
-    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='
-    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='
-    if (gt) {
-      if (needDomGTPre) {
-        if (c.semver.prerelease && c.semver.prerelease.length &&
-            c.semver.major === needDomGTPre.major &&
-            c.semver.minor === needDomGTPre.minor &&
-            c.semver.patch === needDomGTPre.patch) {
-          needDomGTPre = false
-        }
-      }
-      if (c.operator === '>' || c.operator === '>=') {
-        higher = higherGT(gt, c, options)
-        if (higher === c && higher !== gt) {
-          return false
-        }
-      } else if (gt.operator === '>=' && !c.test(gt.semver)) {
-        return false
-      }
-    }
-    if (lt) {
-      if (needDomLTPre) {
-        if (c.semver.prerelease && c.semver.prerelease.length &&
-            c.semver.major === needDomLTPre.major &&
-            c.semver.minor === needDomLTPre.minor &&
-            c.semver.patch === needDomLTPre.patch) {
-          needDomLTPre = false
-        }
-      }
-      if (c.operator === '<' || c.operator === '<=') {
-        lower = lowerLT(lt, c, options)
-        if (lower === c && lower !== lt) {
-          return false
-        }
-      } else if (lt.operator === '<=' && !c.test(lt.semver)) {
-        return false
-      }
-    }
-    if (!c.operator && (lt || gt) && gtltComp !== 0) {
-      return false
-    }
-  }
-
-  // if there was a < or >, and nothing in the dom, then must be false
-  // UNLESS it was limited by another range in the other direction.
-  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
-  if (gt && hasDomLT && !lt && gtltComp !== 0) {
-    return false
-  }
-
-  if (lt && hasDomGT && !gt && gtltComp !== 0) {
-    return false
-  }
-
-  // we needed a prerelease range in a specific tuple, but didn't get one
-  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,
-  // because it includes prereleases in the 1.2.3 tuple
-  if (needDomGTPre || needDomLTPre) {
-    return false
-  }
-
-  return true
-}
-
-// >=1.2.3 is lower than >1.2.3
-const higherGT = (a, b, options) => {
-  if (!a) {
-    return b
-  }
-  const comp = compare(a.semver, b.semver, options)
-  return comp > 0 ? a
-    : comp < 0 ? b
-    : b.operator === '>' && a.operator === '>=' ? b
-    : a
-}
-
-// <=1.2.3 is higher than <1.2.3
-const lowerLT = (a, b, options) => {
-  if (!a) {
-    return b
-  }
-  const comp = compare(a.semver, b.semver, options)
-  return comp < 0 ? a
-    : comp > 0 ? b
-    : b.operator === '<' && a.operator === '<=' ? b
-    : a
-}
-
-module.exports = subset
Index: de_modules/semver/ranges/to-comparators.js
===================================================================
--- node_modules/semver/ranges/to-comparators.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,10 +1,0 @@
-'use strict'
-
-const Range = require('../classes/range')
-
-// Mostly just for testing and legacy API reasons
-const toComparators = (range, options) =>
-  new Range(range, options).set
-    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))
-
-module.exports = toComparators
Index: de_modules/semver/ranges/valid.js
===================================================================
--- node_modules/semver/ranges/valid.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-'use strict'
-
-const Range = require('../classes/range')
-const validRange = (range, options) => {
-  try {
-    // Return '*' instead of '' so that truthiness works.
-    // This will throw if it's invalid anyway
-    return new Range(range, options).range || '*'
-  } catch (er) {
-    return null
-  }
-}
-module.exports = validRange
Index: de_modules/simple-update-notifier/LICENSE
===================================================================
--- node_modules/simple-update-notifier/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2022 Alex Brazier
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: de_modules/simple-update-notifier/README.md
===================================================================
--- node_modules/simple-update-notifier/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-# simple-update-notifier [![GitHub stars](https://img.shields.io/github/stars/alexbrazier/simple-update-notifier?label=Star%20Project&style=social)](https://github.com/alexbrazier/simple-update-notifier/stargazers)
-
-[![CI](https://github.com/alexbrazier/simple-update-notifier/workflows/Build%20and%20Deploy/badge.svg)](https://github.com/alexbrazier/simple-update-notifier/actions)
-[![Dependencies](https://img.shields.io/librariesio/release/npm/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier?activeTab=dependencies)
-[![npm](https://img.shields.io/npm/v/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier)
-[![npm bundle size](https://img.shields.io/bundlephobia/min/simple-update-notifier)](https://bundlephobia.com/result?p=simple-update-notifier)
-[![npm downloads](https://img.shields.io/npm/dw/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier)
-[![License](https://img.shields.io/npm/l/simple-update-notifier)](./LICENSE)
-
-Simple update notifier to check for npm updates for cli applications.
-
-<img src="./.github/demo.png" alt="Demo in terminal showing an update is required">
-
-Checks for updates for an npm module and outputs to the command line if there is one available. The result is cached for the specified time so it doesn't check every time the app runs.
-
-## Install
-
-```bash
-npm install simple-update-notifier
-OR
-yarn add simple-update-notifier
-```
-
-## Usage
-
-```js
-import updateNotifier from 'simple-update-notifier';
-import packageJson from './package.json' assert { type: 'json' };
-
-updateNotifier({ pkg: packageJson });
-```
-
-### Options
-
-#### pkg
-
-Type: `object`
-
-##### name
-
-_Required_\
-Type: `string`
-
-##### version
-
-_Required_\
-Type: `string`
-
-#### updateCheckInterval
-
-Type: `number`\
-Default: `1000 * 60 * 60 * 24` _(1 day)_
-
-How often to check for updates.
-
-#### shouldNotifyInNpmScript
-
-Type: `boolean`\
-Default: `false`
-
-Allows notification to be shown when running as an npm script.
-
-#### distTag
-
-Type: `string`\
-Default: `'latest'`
-
-Which [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages) to use to find the latest version.
-
-#### alwaysRun
-
-Type: `boolean`\
-Default: `false`
-
-When set, `updateCheckInterval` will not be respected and a check for an update will always be performed.
-
-#### debug
-
-Type: `boolean`\
-Default: `false`
-
-When set, logs explaining the decision will be output to `stderr` whenever the module opts to not print an update notification
Index: de_modules/simple-update-notifier/build/index.d.ts
===================================================================
--- node_modules/simple-update-notifier/build/index.d.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-interface IUpdate {
-    pkg: {
-        name: string;
-        version: string;
-    };
-    updateCheckInterval?: number;
-    shouldNotifyInNpmScript?: boolean;
-    distTag?: string;
-    alwaysRun?: boolean;
-    debug?: boolean;
-}
-declare const simpleUpdateNotifier: (args: IUpdate) => Promise<void>;
-export { simpleUpdateNotifier as default };
Index: de_modules/simple-update-notifier/build/index.js
===================================================================
--- node_modules/simple-update-notifier/build/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,210 +1,0 @@
-'use strict';
-
-var process$1 = require('process');
-var semver = require('semver');
-var os = require('os');
-var path = require('path');
-var fs = require('fs');
-var https = require('https');
-
-/******************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-
-function __awaiter(thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-}
-
-function __generator(thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (g && (g = 0, op[0] && (_ = 0)), _) try {
-            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [op[0] & 2, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-}
-
-var packageJson = process$1.env.npm_package_json;
-var userAgent = process$1.env.npm_config_user_agent;
-var isNpm6 = Boolean(userAgent && userAgent.startsWith('npm'));
-var isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json'));
-var isNpm = isNpm6 || isNpm7;
-var isYarn = Boolean(userAgent && userAgent.startsWith('yarn'));
-var isNpmOrYarn = isNpm || isYarn;
-
-var homeDirectory = os.homedir();
-var configDir = process.env.XDG_CONFIG_HOME ||
-    path.join(homeDirectory, '.config', 'simple-update-notifier');
-var getConfigFile = function (packageName) {
-    return path.join(configDir, "".concat(packageName.replace('@', '').replace('/', '__'), ".json"));
-};
-var createConfigDir = function () {
-    if (!fs.existsSync(configDir)) {
-        fs.mkdirSync(configDir, { recursive: true });
-    }
-};
-var getLastUpdate = function (packageName) {
-    var configFile = getConfigFile(packageName);
-    try {
-        if (!fs.existsSync(configFile)) {
-            return undefined;
-        }
-        var file = JSON.parse(fs.readFileSync(configFile, 'utf8'));
-        return file.lastUpdateCheck;
-    }
-    catch (_a) {
-        return undefined;
-    }
-};
-var saveLastUpdate = function (packageName) {
-    var configFile = getConfigFile(packageName);
-    fs.writeFileSync(configFile, JSON.stringify({ lastUpdateCheck: new Date().getTime() }));
-};
-
-var getDistVersion = function (packageName, distTag) { return __awaiter(void 0, void 0, void 0, function () {
-    var url;
-    return __generator(this, function (_a) {
-        url = "https://registry.npmjs.org/-/package/".concat(packageName, "/dist-tags");
-        return [2 /*return*/, new Promise(function (resolve, reject) {
-                https
-                    .get(url, function (res) {
-                    var body = '';
-                    res.on('data', function (chunk) { return (body += chunk); });
-                    res.on('end', function () {
-                        try {
-                            var json = JSON.parse(body);
-                            var version = json[distTag];
-                            if (!version) {
-                                reject(new Error('Error getting version'));
-                            }
-                            resolve(version);
-                        }
-                        catch (_a) {
-                            reject(new Error('Could not parse version response'));
-                        }
-                    });
-                })
-                    .on('error', function (err) { return reject(err); });
-            })];
-    });
-}); };
-
-var hasNewVersion = function (_a) {
-    var pkg = _a.pkg, _b = _a.updateCheckInterval, updateCheckInterval = _b === void 0 ? 1000 * 60 * 60 * 24 : _b, _c = _a.distTag, distTag = _c === void 0 ? 'latest' : _c, alwaysRun = _a.alwaysRun, debug = _a.debug;
-    return __awaiter(void 0, void 0, void 0, function () {
-        var lastUpdateCheck, latestVersion;
-        return __generator(this, function (_d) {
-            switch (_d.label) {
-                case 0:
-                    createConfigDir();
-                    lastUpdateCheck = getLastUpdate(pkg.name);
-                    if (!(alwaysRun ||
-                        !lastUpdateCheck ||
-                        lastUpdateCheck < new Date().getTime() - updateCheckInterval)) return [3 /*break*/, 2];
-                    return [4 /*yield*/, getDistVersion(pkg.name, distTag)];
-                case 1:
-                    latestVersion = _d.sent();
-                    saveLastUpdate(pkg.name);
-                    if (semver.gt(latestVersion, pkg.version)) {
-                        return [2 /*return*/, latestVersion];
-                    }
-                    else if (debug) {
-                        console.error("Latest version (".concat(latestVersion, ") not newer than current version (").concat(pkg.version, ")"));
-                    }
-                    return [3 /*break*/, 3];
-                case 2:
-                    if (debug) {
-                        console.error("Too recent to check for a new update. simpleUpdateNotifier() interval set to ".concat(updateCheckInterval, "ms but only ").concat(new Date().getTime() - lastUpdateCheck, "ms since last check."));
-                    }
-                    _d.label = 3;
-                case 3: return [2 /*return*/, false];
-            }
-        });
-    });
-};
-
-var borderedText = function (text) {
-    var lines = text.split('\n');
-    var width = Math.max.apply(Math, lines.map(function (l) { return l.length; }));
-    var res = ["\u250C".concat('─'.repeat(width + 2), "\u2510")];
-    for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
-        var line = lines_1[_i];
-        res.push("\u2502 ".concat(line.padEnd(width), " \u2502"));
-    }
-    res.push("\u2514".concat('─'.repeat(width + 2), "\u2518"));
-    return res.join('\n');
-};
-
-var simpleUpdateNotifier = function (args) { return __awaiter(void 0, void 0, void 0, function () {
-    var latestVersion, err_1;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                if (!args.alwaysRun &&
-                    (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))) {
-                    if (args.debug) {
-                        console.error('Opting out of running simpleUpdateNotifier()');
-                    }
-                    return [2 /*return*/];
-                }
-                _a.label = 1;
-            case 1:
-                _a.trys.push([1, 3, , 4]);
-                return [4 /*yield*/, hasNewVersion(args)];
-            case 2:
-                latestVersion = _a.sent();
-                if (latestVersion) {
-                    console.error(borderedText("New version of ".concat(args.pkg.name, " available!\nCurrent Version: ").concat(args.pkg.version, "\nLatest Version: ").concat(latestVersion)));
-                }
-                return [3 /*break*/, 4];
-            case 3:
-                err_1 = _a.sent();
-                // Catch any network errors or cache writing errors so module doesn't cause a crash
-                if (args.debug && err_1 instanceof Error) {
-                    console.error('Unexpected error in simpleUpdateNotifier():', err_1);
-                }
-                return [3 /*break*/, 4];
-            case 4: return [2 /*return*/];
-        }
-    });
-}); };
-
-module.exports = simpleUpdateNotifier;
Index: de_modules/simple-update-notifier/package.json
===================================================================
--- node_modules/simple-update-notifier/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,100 +1,0 @@
-{
-  "name": "simple-update-notifier",
-  "version": "2.0.0",
-  "description": "Simple update notifier to check for npm updates for cli applications",
-  "main": "build/index.js",
-  "types": "build/index.d.ts",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/alexbrazier/simple-update-notifier.git"
-  },
-  "homepage": "https://github.com/alexbrazier/simple-update-notifier.git",
-  "author": "alexbrazier",
-  "license": "MIT",
-  "engines": {
-    "node": ">=10"
-  },
-  "scripts": {
-    "test": "jest src --noStackTrace",
-    "build": "rollup -c rollup.config.js --bundleConfigAsCjs",
-    "prettier:check": "prettier --check src/**/*.ts",
-    "prettier": "prettier --write src/**/*.ts",
-    "eslint": "eslint src/**/*.ts",
-    "lint": "yarn prettier:check && yarn eslint",
-    "prepare": "yarn lint && yarn build",
-    "release": "release-it"
-  },
-  "dependencies": {
-    "semver": "^7.5.3"
-  },
-  "devDependencies": {
-    "@babel/preset-env": "^7.22.5",
-    "@babel/preset-typescript": "^7.22.5",
-    "@release-it/conventional-changelog": "^5.1.1",
-    "@types/jest": "^29.5.2",
-    "@types/node": "^20.3.1",
-    "@typescript-eslint/eslint-plugin": "^5.60.0",
-    "@typescript-eslint/parser": "^5.60.0",
-    "eslint": "^8.43.0",
-    "eslint-config-prettier": "^8.8.0",
-    "eslint-plugin-prettier": "^4.0.0",
-    "jest": "^29.5.0",
-    "prettier": "^2.8.8",
-    "release-it": "^15.11.0",
-    "rollup": "^3.25.2",
-    "rollup-plugin-ts": "^3.2.0",
-    "typescript": "^5.1.3"
-  },
-  "resolutions": {
-    "semver": "^7.5.3"
-  },
-  "publishConfig": {
-    "registry": "https://registry.npmjs.org/"
-  },
-  "files": [
-    "build",
-    "src"
-  ],
-  "release-it": {
-    "git": {
-      "commitMessage": "chore: release ${version}",
-      "tagName": "v${version}"
-    },
-    "npm": {
-      "publish": true
-    },
-    "github": {
-      "release": true
-    },
-    "plugins": {
-      "@release-it/conventional-changelog": {
-        "preset": "angular",
-        "infile": "CHANGELOG.md"
-      }
-    }
-  },
-  "eslintConfig": {
-    "plugins": [
-      "@typescript-eslint",
-      "prettier"
-    ],
-    "extends": [
-      "prettier",
-      "eslint:recommended",
-      "plugin:@typescript-eslint/recommended"
-    ],
-    "parser": "@typescript-eslint/parser",
-    "rules": {
-      "prettier/prettier": [
-        "error",
-        {
-          "quoteProps": "consistent",
-          "singleQuote": true,
-          "tabWidth": 2,
-          "trailingComma": "es5",
-          "useTabs": false
-        }
-      ]
-    }
-  }
-}
Index: de_modules/simple-update-notifier/src/borderedText.ts
===================================================================
--- node_modules/simple-update-notifier/src/borderedText.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-const borderedText = (text: string) => {
-  const lines = text.split('\n');
-  const width = Math.max(...lines.map((l) => l.length));
-  const res = [`┌${'─'.repeat(width + 2)}┐`];
-  for (const line of lines) {
-    res.push(`│ ${line.padEnd(width)} │`);
-  }
-  res.push(`└${'─'.repeat(width + 2)}┘`);
-  return res.join('\n');
-};
-
-export default borderedText;
Index: de_modules/simple-update-notifier/src/cache.spec.ts
===================================================================
--- node_modules/simple-update-notifier/src/cache.spec.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache';
-
-createConfigDir();
-
-jest.useFakeTimers().setSystemTime(new Date('2022-01-01'));
-
-const fakeTime = new Date('2022-01-01').getTime();
-
-test('can save update then get the update details', () => {
-  saveLastUpdate('test');
-  expect(getLastUpdate('test')).toBe(fakeTime);
-});
-
-test('prefixed module can save update then get the update details', () => {
-  saveLastUpdate('@alexbrazier/test');
-  expect(getLastUpdate('@alexbrazier/test')).toBe(fakeTime);
-});
Index: de_modules/simple-update-notifier/src/cache.ts
===================================================================
--- node_modules/simple-update-notifier/src/cache.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,44 +1,0 @@
-import os from 'os';
-import path from 'path';
-import fs from 'fs';
-
-const homeDirectory = os.homedir();
-const configDir =
-  process.env.XDG_CONFIG_HOME ||
-  path.join(homeDirectory, '.config', 'simple-update-notifier');
-
-const getConfigFile = (packageName: string) => {
-  return path.join(
-    configDir,
-    `${packageName.replace('@', '').replace('/', '__')}.json`
-  );
-};
-
-export const createConfigDir = () => {
-  if (!fs.existsSync(configDir)) {
-    fs.mkdirSync(configDir, { recursive: true });
-  }
-};
-
-export const getLastUpdate = (packageName: string) => {
-  const configFile = getConfigFile(packageName);
-
-  try {
-    if (!fs.existsSync(configFile)) {
-      return undefined;
-    }
-    const file = JSON.parse(fs.readFileSync(configFile, 'utf8'));
-    return file.lastUpdateCheck as number;
-  } catch {
-    return undefined;
-  }
-};
-
-export const saveLastUpdate = (packageName: string) => {
-  const configFile = getConfigFile(packageName);
-
-  fs.writeFileSync(
-    configFile,
-    JSON.stringify({ lastUpdateCheck: new Date().getTime() })
-  );
-};
Index: de_modules/simple-update-notifier/src/getDistVersion.spec.ts
===================================================================
--- node_modules/simple-update-notifier/src/getDistVersion.spec.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,35 +1,0 @@
-import Stream from 'stream';
-import https from 'https';
-import getDistVersion from './getDistVersion';
-
-jest.mock('https', () => ({
-  get: jest.fn(),
-}));
-
-test('Valid response returns version', async () => {
-  const st = new Stream();
-  (https.get as jest.Mock).mockImplementation((url, cb) => {
-    cb(st);
-
-    st.emit('data', '{"latest":"1.0.0"}');
-    st.emit('end');
-  });
-
-  const version = await getDistVersion('test', 'latest');
-
-  expect(version).toEqual('1.0.0');
-});
-
-test('Invalid response throws error', async () => {
-  const st = new Stream();
-  (https.get as jest.Mock).mockImplementation((url, cb) => {
-    cb(st);
-
-    st.emit('data', 'some invalid json');
-    st.emit('end');
-  });
-
-  expect(getDistVersion('test', 'latest')).rejects.toThrow(
-    'Could not parse version response'
-  );
-});
Index: de_modules/simple-update-notifier/src/getDistVersion.ts
===================================================================
--- node_modules/simple-update-notifier/src/getDistVersion.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,29 +1,0 @@
-import https from 'https';
-
-const getDistVersion = async (packageName: string, distTag: string) => {
-  const url = `https://registry.npmjs.org/-/package/${packageName}/dist-tags`;
-
-  return new Promise<string>((resolve, reject) => {
-    https
-      .get(url, (res) => {
-        let body = '';
-
-        res.on('data', (chunk) => (body += chunk));
-        res.on('end', () => {
-          try {
-            const json = JSON.parse(body);
-            const version = json[distTag];
-            if (!version) {
-              reject(new Error('Error getting version'));
-            }
-            resolve(version);
-          } catch {
-            reject(new Error('Could not parse version response'));
-          }
-        });
-      })
-      .on('error', (err) => reject(err));
-  });
-};
-
-export default getDistVersion;
Index: de_modules/simple-update-notifier/src/hasNewVersion.spec.ts
===================================================================
--- node_modules/simple-update-notifier/src/hasNewVersion.spec.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,82 +1,0 @@
-import hasNewVersion from './hasNewVersion';
-import { getLastUpdate } from './cache';
-import getDistVersion from './getDistVersion';
-
-jest.mock('./getDistVersion', () => jest.fn().mockReturnValue('1.0.0'));
-jest.mock('./cache', () => ({
-  getLastUpdate: jest.fn().mockReturnValue(undefined),
-  createConfigDir: jest.fn(),
-  saveLastUpdate: jest.fn(),
-}));
-
-const pkg = { name: 'test', version: '1.0.0' };
-
-afterEach(() => jest.clearAllMocks());
-
-const defaultArgs = {
-  pkg,
-  shouldNotifyInNpmScript: true,
-  alwaysRun: true,
-};
-
-test('it should not trigger update for same version', async () => {
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe(false);
-});
-
-test('it should trigger update for patch version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('1.0.1');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('1.0.1');
-});
-
-test('it should trigger update for minor version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('1.1.0');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('1.1.0');
-});
-
-test('it should trigger update for major version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('2.0.0');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('2.0.0');
-});
-
-test('it should not trigger update if version is lower', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('0.0.9');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe(false);
-});
-
-it('should trigger update check if last update older than config', async () => {
-  const TWO_WEEKS = new Date().getTime() - 1000 * 60 * 60 * 24 * 14;
-  (getLastUpdate as jest.Mock).mockReturnValue(TWO_WEEKS);
-  const newVersion = await hasNewVersion({
-    pkg,
-    shouldNotifyInNpmScript: true,
-  });
-
-  expect(newVersion).toBe(false);
-  expect(getDistVersion).toHaveBeenCalled();
-});
-
-it('should not trigger update check if last update is too recent', async () => {
-  const TWELVE_HOURS = new Date().getTime() - 1000 * 60 * 60 * 12;
-  (getLastUpdate as jest.Mock).mockReturnValue(TWELVE_HOURS);
-  const newVersion = await hasNewVersion({
-    pkg,
-    shouldNotifyInNpmScript: true,
-  });
-
-  expect(newVersion).toBe(false);
-  expect(getDistVersion).not.toHaveBeenCalled();
-});
Index: de_modules/simple-update-notifier/src/hasNewVersion.ts
===================================================================
--- node_modules/simple-update-notifier/src/hasNewVersion.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,40 +1,0 @@
-import semver from 'semver';
-import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache';
-import getDistVersion from './getDistVersion';
-import { IUpdate } from './types';
-
-const hasNewVersion = async ({
-  pkg,
-  updateCheckInterval = 1000 * 60 * 60 * 24,
-  distTag = 'latest',
-  alwaysRun,
-  debug,
-}: IUpdate) => {
-  createConfigDir();
-  const lastUpdateCheck = getLastUpdate(pkg.name);
-  if (
-    alwaysRun ||
-    !lastUpdateCheck ||
-    lastUpdateCheck < new Date().getTime() - updateCheckInterval
-  ) {
-    const latestVersion = await getDistVersion(pkg.name, distTag);
-    saveLastUpdate(pkg.name);
-    if (semver.gt(latestVersion, pkg.version)) {
-      return latestVersion;
-    } else if (debug) {
-      console.error(
-        `Latest version (${latestVersion}) not newer than current version (${pkg.version})`
-      );
-    }
-  } else if (debug) {
-    console.error(
-      `Too recent to check for a new update. simpleUpdateNotifier() interval set to ${updateCheckInterval}ms but only ${
-        new Date().getTime() - lastUpdateCheck
-      }ms since last check.`
-    );
-  }
-
-  return false;
-};
-
-export default hasNewVersion;
Index: de_modules/simple-update-notifier/src/index.spec.ts
===================================================================
--- node_modules/simple-update-notifier/src/index.spec.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,27 +1,0 @@
-import simpleUpdateNotifier from '.';
-import hasNewVersion from './hasNewVersion';
-
-const consoleSpy = jest.spyOn(console, 'error');
-
-jest.mock('./hasNewVersion', () => jest.fn().mockResolvedValue('2.0.0'));
-
-beforeEach(jest.clearAllMocks);
-
-test('it logs message if update is available', async () => {
-  await simpleUpdateNotifier({
-    pkg: { name: 'test', version: '1.0.0' },
-    alwaysRun: true,
-  });
-
-  expect(consoleSpy).toHaveBeenCalledTimes(1);
-});
-
-test('it does not log message if update is not available', async () => {
-  (hasNewVersion as jest.Mock).mockResolvedValue(false);
-  await simpleUpdateNotifier({
-    pkg: { name: 'test', version: '2.0.0' },
-    alwaysRun: true,
-  });
-
-  expect(consoleSpy).toHaveBeenCalledTimes(0);
-});
Index: de_modules/simple-update-notifier/src/index.ts
===================================================================
--- node_modules/simple-update-notifier/src/index.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-import isNpmOrYarn from './isNpmOrYarn';
-import hasNewVersion from './hasNewVersion';
-import { IUpdate } from './types';
-import borderedText from './borderedText';
-
-const simpleUpdateNotifier = async (args: IUpdate) => {
-  if (
-    !args.alwaysRun &&
-    (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))
-  ) {
-    if (args.debug) {
-      console.error('Opting out of running simpleUpdateNotifier()');
-    }
-    return;
-  }
-
-  try {
-    const latestVersion = await hasNewVersion(args);
-    if (latestVersion) {
-      console.error(
-        borderedText(`New version of ${args.pkg.name} available!
-Current Version: ${args.pkg.version}
-Latest Version: ${latestVersion}`)
-      );
-    }
-  } catch (err) {
-    // Catch any network errors or cache writing errors so module doesn't cause a crash
-    if (args.debug && err instanceof Error) {
-      console.error('Unexpected error in simpleUpdateNotifier():', err);
-    }
-  }
-};
-
-export default simpleUpdateNotifier;
Index: de_modules/simple-update-notifier/src/isNpmOrYarn.ts
===================================================================
--- node_modules/simple-update-notifier/src/isNpmOrYarn.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,12 +1,0 @@
-import process from 'process';
-
-const packageJson = process.env.npm_package_json;
-const userAgent = process.env.npm_config_user_agent;
-const isNpm6 = Boolean(userAgent && userAgent.startsWith('npm'));
-const isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json'));
-
-const isNpm = isNpm6 || isNpm7;
-const isYarn = Boolean(userAgent && userAgent.startsWith('yarn'));
-const isNpmOrYarn = isNpm || isYarn;
-
-export default isNpmOrYarn;
Index: de_modules/simple-update-notifier/src/types.ts
===================================================================
--- node_modules/simple-update-notifier/src/types.ts	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,8 +1,0 @@
-export interface IUpdate {
-  pkg: { name: string; version: string };
-  updateCheckInterval?: number;
-  shouldNotifyInNpmScript?: boolean;
-  distTag?: string;
-  alwaysRun?: boolean;
-  debug?: boolean;
-}
Index: de_modules/split2/LICENSE
===================================================================
--- node_modules/split2/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-Copyright (c) 2014-2018, Matteo Collina <hello@matteocollina.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/split2/README.md
===================================================================
--- node_modules/split2/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,85 +1,0 @@
-# Split2(matcher, mapper, options)
-
-![ci](https://github.com/mcollina/split2/workflows/ci/badge.svg)
-
-Break up a stream and reassemble it so that each line is a chunk.
-`split2` is inspired by [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) module,
-and it is totally API compatible with it.
-However, it is based on Node.js core [`Transform`](https://nodejs.org/api/stream.html#stream_new_stream_transform_options).
-
-`matcher` may be a `String`, or a `RegExp`. Example, read every line in a file ...
-
-``` js
-  fs.createReadStream(file)
-    .pipe(split2())
-    .on('data', function (line) {
-      //each chunk now is a separate line!
-    })
-
-```
-
-`split` takes the same arguments as `string.split` except it defaults to '/\r?\n/', and the optional `limit` paremeter is ignored.
-[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split)
-
-`split` takes an optional options object on it's third argument, which
-is directly passed as a
-[Transform](https://nodejs.org/api/stream.html#stream_new_stream_transform_options)
-option.
-
-Additionally, the `.maxLength` and `.skipOverflow` options are implemented, which set limits on the internal
-buffer size and the stream's behavior when the limit is exceeded. There is no limit unless `maxLength` is set. When
-the internal buffer size exceeds `maxLength`, the stream emits an error by default. You may also set `skipOverflow` to
-true to suppress the error and instead skip past any lines that cause the internal buffer to exceed `maxLength`.
-
-Calling `.destroy` will make the stream emit `close`. Use this to perform cleanup logic
-
-``` js
-var splitFile = function(filename) {
-  var file = fs.createReadStream(filename)
-
-  return file
-    .pipe(split2())
-    .on('close', function() {
-      // destroy the file stream in case the split stream was destroyed
-      file.destroy()
-    })
-}
-
-var stream = splitFile('my-file.txt')
-
-stream.destroy() // will destroy the input file stream
-```
-
-# NDJ - Newline Delimited Json
-
-`split2` accepts a function which transforms each line.
-
-``` js
-fs.createReadStream(file)
-  .pipe(split2(JSON.parse))
-  .on('data', function (obj) {
-    //each chunk now is a js object
-  })
-  .on("error", function(error) {
-    //handling parsing errors
-  })
-```
-
-However, in [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) the mapper
-is wrapped in a try-catch, while here it is not: if your parsing logic can throw, wrap it yourself. Otherwise, you can also use the stream error handling when mapper function throw.
-
-# License
-
-Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/split2/bench.js
===================================================================
--- node_modules/split2/bench.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict'
-
-const split = require('./')
-const bench = require('fastbench')
-const binarySplit = require('binary-split')
-const fs = require('fs')
-
-function benchSplit (cb) {
-  fs.createReadStream('package.json')
-    .pipe(split())
-    .on('end', cb)
-    .resume()
-}
-
-function benchBinarySplit (cb) {
-  fs.createReadStream('package.json')
-    .pipe(binarySplit())
-    .on('end', cb)
-    .resume()
-}
-
-const run = bench([
-  benchSplit,
-  benchBinarySplit
-], 10000)
-
-run(run)
Index: de_modules/split2/index.js
===================================================================
--- node_modules/split2/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,141 +1,0 @@
-/*
-Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-*/
-
-'use strict'
-
-const { Transform } = require('stream')
-const { StringDecoder } = require('string_decoder')
-const kLast = Symbol('last')
-const kDecoder = Symbol('decoder')
-
-function transform (chunk, enc, cb) {
-  let list
-  if (this.overflow) { // Line buffer is full. Skip to start of next line.
-    const buf = this[kDecoder].write(chunk)
-    list = buf.split(this.matcher)
-
-    if (list.length === 1) return cb() // Line ending not found. Discard entire chunk.
-
-    // Line ending found. Discard trailing fragment of previous line and reset overflow state.
-    list.shift()
-    this.overflow = false
-  } else {
-    this[kLast] += this[kDecoder].write(chunk)
-    list = this[kLast].split(this.matcher)
-  }
-
-  this[kLast] = list.pop()
-
-  for (let i = 0; i < list.length; i++) {
-    try {
-      push(this, this.mapper(list[i]))
-    } catch (error) {
-      return cb(error)
-    }
-  }
-
-  this.overflow = this[kLast].length > this.maxLength
-  if (this.overflow && !this.skipOverflow) {
-    cb(new Error('maximum buffer reached'))
-    return
-  }
-
-  cb()
-}
-
-function flush (cb) {
-  // forward any gibberish left in there
-  this[kLast] += this[kDecoder].end()
-
-  if (this[kLast]) {
-    try {
-      push(this, this.mapper(this[kLast]))
-    } catch (error) {
-      return cb(error)
-    }
-  }
-
-  cb()
-}
-
-function push (self, val) {
-  if (val !== undefined) {
-    self.push(val)
-  }
-}
-
-function noop (incoming) {
-  return incoming
-}
-
-function split (matcher, mapper, options) {
-  // Set defaults for any arguments not supplied.
-  matcher = matcher || /\r?\n/
-  mapper = mapper || noop
-  options = options || {}
-
-  // Test arguments explicitly.
-  switch (arguments.length) {
-    case 1:
-      // If mapper is only argument.
-      if (typeof matcher === 'function') {
-        mapper = matcher
-        matcher = /\r?\n/
-      // If options is only argument.
-      } else if (typeof matcher === 'object' && !(matcher instanceof RegExp) && !matcher[Symbol.split]) {
-        options = matcher
-        matcher = /\r?\n/
-      }
-      break
-
-    case 2:
-      // If mapper and options are arguments.
-      if (typeof matcher === 'function') {
-        options = mapper
-        mapper = matcher
-        matcher = /\r?\n/
-      // If matcher and options are arguments.
-      } else if (typeof mapper === 'object') {
-        options = mapper
-        mapper = noop
-      }
-  }
-
-  options = Object.assign({}, options)
-  options.autoDestroy = true
-  options.transform = transform
-  options.flush = flush
-  options.readableObjectMode = true
-
-  const stream = new Transform(options)
-
-  stream[kLast] = ''
-  stream[kDecoder] = new StringDecoder('utf8')
-  stream.matcher = matcher
-  stream.mapper = mapper
-  stream.maxLength = options.maxLength
-  stream.skipOverflow = options.skipOverflow || false
-  stream.overflow = false
-  stream._destroy = function (err, cb) {
-    // Weird Node v12 bug that we need to work around
-    this._writableState.errorEmitted = false
-    cb(err)
-  }
-
-  return stream
-}
-
-module.exports = split
Index: de_modules/split2/package.json
===================================================================
--- node_modules/split2/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,39 +1,0 @@
-{
-  "name": "split2",
-  "version": "4.2.0",
-  "description": "split a Text Stream into a Line Stream, using Stream 3",
-  "main": "index.js",
-  "scripts": {
-    "lint": "standard --verbose",
-    "unit": "nyc --lines 100 --branches 100 --functions 100 --check-coverage --reporter=text tape test.js",
-    "coverage": "nyc --reporter=html --reporter=cobertura --reporter=text tape test/test.js",
-    "test:report": "npm run lint && npm run unit:report",
-    "test": "npm run lint && npm run unit",
-    "legacy": "tape test.js"
-  },
-  "pre-commit": [
-    "test"
-  ],
-  "website": "https://github.com/mcollina/split2",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/mcollina/split2.git"
-  },
-  "bugs": {
-    "url": "http://github.com/mcollina/split2/issues"
-  },
-  "engines": {
-    "node": ">= 10.x"
-  },
-  "author": "Matteo Collina <hello@matteocollina.com>",
-  "license": "ISC",
-  "devDependencies": {
-    "binary-split": "^1.0.3",
-    "callback-stream": "^1.1.0",
-    "fastbench": "^1.0.0",
-    "nyc": "^15.0.1",
-    "pre-commit": "^1.1.2",
-    "standard": "^17.0.0",
-    "tape": "^5.0.0"
-  }
-}
Index: de_modules/split2/test.js
===================================================================
--- node_modules/split2/test.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,409 +1,0 @@
-'use strict'
-
-const test = require('tape')
-const split = require('./')
-const callback = require('callback-stream')
-const strcb = callback.bind(null, { decodeStrings: false })
-const objcb = callback.bind(null, { objectMode: true })
-
-test('split two lines on end', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello\nworld')
-})
-
-test('split two lines on two writes', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.write('hello')
-  input.write('\nworld')
-  input.end()
-})
-
-test('split four lines on three writes', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world', 'bye', 'world'])
-  }))
-
-  input.write('hello\nwor')
-  input.write('ld\nbye\nwo')
-  input.write('rld')
-  input.end()
-})
-
-test('accumulate multiple writes', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['helloworld'])
-  }))
-
-  input.write('hello')
-  input.write('world')
-  input.end()
-})
-
-test('split using a custom string matcher', function (t) {
-  t.plan(2)
-
-  const input = split('~')
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello~world')
-})
-
-test('split using a custom regexp matcher', function (t) {
-  t.plan(2)
-
-  const input = split(/~/)
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello~world')
-})
-
-test('support an option argument', function (t) {
-  t.plan(2)
-
-  const input = split({ highWaterMark: 2 })
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello\nworld')
-})
-
-test('support a mapper function', function (t) {
-  t.plan(2)
-
-  const a = { a: '42' }
-  const b = { b: '24' }
-
-  const input = split(JSON.parse)
-
-  input.pipe(objcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, [a, b])
-  }))
-
-  input.write(JSON.stringify(a))
-  input.write('\n')
-  input.end(JSON.stringify(b))
-})
-
-test('split lines windows-style', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello\r\nworld')
-})
-
-test('splits a buffer', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end(Buffer.from('hello\nworld'))
-})
-
-test('do not end on undefined', function (t) {
-  t.plan(2)
-
-  const input = split(function (line) { })
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, [])
-  }))
-
-  input.end(Buffer.from('hello\nworld'))
-})
-
-test('has destroy method', function (t) {
-  t.plan(1)
-
-  const input = split(function (line) { })
-
-  input.on('close', function () {
-    t.ok(true, 'close emitted')
-    t.end()
-  })
-
-  input.destroy()
-})
-
-test('support custom matcher and mapper', function (t) {
-  t.plan(4)
-
-  const a = { a: '42' }
-  const b = { b: '24' }
-  const input = split('~', JSON.parse)
-
-  t.equal(input.matcher, '~')
-  t.equal(typeof input.mapper, 'function')
-
-  input.pipe(objcb(function (err, list) {
-    t.notOk(err, 'no errors')
-    t.deepEqual(list, [a, b])
-  }))
-
-  input.write(JSON.stringify(a))
-  input.write('~')
-  input.end(JSON.stringify(b))
-})
-
-test('support custom matcher and options', function (t) {
-  t.plan(6)
-
-  const input = split('~', { highWaterMark: 1024 })
-
-  t.equal(input.matcher, '~')
-  t.equal(typeof input.mapper, 'function')
-  t.equal(input._readableState.highWaterMark, 1024)
-  t.equal(input._writableState.highWaterMark, 1024)
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello~world')
-})
-
-test('support mapper and options', function (t) {
-  t.plan(6)
-
-  const a = { a: '42' }
-  const b = { b: '24' }
-  const input = split(JSON.parse, { highWaterMark: 1024 })
-
-  t.ok(input.matcher instanceof RegExp, 'matcher is RegExp')
-  t.equal(typeof input.mapper, 'function')
-  t.equal(input._readableState.highWaterMark, 1024)
-  t.equal(input._writableState.highWaterMark, 1024)
-
-  input.pipe(objcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, [a, b])
-  }))
-
-  input.write(JSON.stringify(a))
-  input.write('\n')
-  input.end(JSON.stringify(b))
-})
-
-test('split utf8 chars', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['烫烫烫', '锟斤拷'])
-  }))
-
-  const buf = Buffer.from('烫烫烫\r\n锟斤拷', 'utf8')
-  for (let i = 0; i < buf.length; ++i) {
-    input.write(buf.slice(i, i + 1))
-  }
-  input.end()
-})
-
-test('split utf8 chars 2by2', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['烫烫烫', '烫烫烫'])
-  }))
-
-  const str = '烫烫烫\r\n烫烫烫'
-  const buf = Buffer.from(str, 'utf8')
-  for (let i = 0; i < buf.length; i += 2) {
-    input.write(buf.slice(i, i + 2))
-  }
-  input.end()
-})
-
-test('split lines when the \n comes at the end of a chunk', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.write('hello\n')
-  input.end('world')
-})
-
-test('truncated utf-8 char', function (t) {
-  t.plan(2)
-
-  const input = split()
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['烫' + Buffer.from('e7', 'hex').toString()])
-  }))
-
-  const str = '烫烫'
-  const buf = Buffer.from(str, 'utf8')
-
-  input.write(buf.slice(0, 3))
-  input.end(buf.slice(3, 4))
-})
-
-test('maximum buffer limit', function (t) {
-  t.plan(1)
-
-  const input = split({ maxLength: 2 })
-  input.on('error', function (err) {
-    t.ok(err)
-  })
-
-  input.resume()
-
-  input.write('hey')
-})
-
-test('readable highWaterMark', function (t) {
-  const input = split()
-  t.equal(input._readableState.highWaterMark, 16)
-  t.end()
-})
-
-test('maxLength < chunk size', function (t) {
-  t.plan(2)
-
-  const input = split({ maxLength: 2 })
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['a', 'b'])
-  }))
-
-  input.end('a\nb')
-})
-
-test('maximum buffer limit w/skip', function (t) {
-  t.plan(2)
-
-  const input = split({ maxLength: 2, skipOverflow: true })
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['a', 'b', 'c'])
-  }))
-
-  input.write('a\n123')
-  input.write('456')
-  input.write('789\nb\nc')
-  input.end()
-})
-
-test("don't modify the options object", function (t) {
-  t.plan(2)
-
-  const options = {}
-  const input = split(options)
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.same(options, {})
-  }))
-
-  input.end()
-})
-
-test('mapper throws flush', function (t) {
-  t.plan(1)
-  const error = new Error()
-  const input = split(function () {
-    throw error
-  })
-
-  input.on('error', (err, list) => {
-    t.same(err, error)
-  })
-  input.end('hello')
-})
-
-test('mapper throws on transform', function (t) {
-  t.plan(1)
-
-  const error = new Error()
-  const input = split(function (l) {
-    throw error
-  })
-
-  input.on('error', (err) => {
-    t.same(err, error)
-  })
-  input.write('a')
-  input.write('\n')
-  input.end('b')
-})
-
-test('supports Symbol.split', function (t) {
-  t.plan(2)
-
-  const input = split({
-    [Symbol.split] (str) {
-      return str.split('~')
-    }
-  })
-
-  input.pipe(strcb(function (err, list) {
-    t.error(err)
-    t.deepEqual(list, ['hello', 'world'])
-  }))
-
-  input.end('hello~world')
-})
Index: de_modules/supports-color/browser.js
===================================================================
--- node_modules/supports-color/browser.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,5 +1,0 @@
-'use strict';
-module.exports = {
-	stdout: false,
-	stderr: false
-};
Index: de_modules/supports-color/index.js
===================================================================
--- node_modules/supports-color/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,131 +1,0 @@
-'use strict';
-const os = require('os');
-const hasFlag = require('has-flag');
-
-const env = process.env;
-
-let forceColor;
-if (hasFlag('no-color') ||
-	hasFlag('no-colors') ||
-	hasFlag('color=false')) {
-	forceColor = false;
-} else if (hasFlag('color') ||
-	hasFlag('colors') ||
-	hasFlag('color=true') ||
-	hasFlag('color=always')) {
-	forceColor = true;
-}
-if ('FORCE_COLOR' in env) {
-	forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
-}
-
-function translateLevel(level) {
-	if (level === 0) {
-		return false;
-	}
-
-	return {
-		level,
-		hasBasic: true,
-		has256: level >= 2,
-		has16m: level >= 3
-	};
-}
-
-function supportsColor(stream) {
-	if (forceColor === false) {
-		return 0;
-	}
-
-	if (hasFlag('color=16m') ||
-		hasFlag('color=full') ||
-		hasFlag('color=truecolor')) {
-		return 3;
-	}
-
-	if (hasFlag('color=256')) {
-		return 2;
-	}
-
-	if (stream && !stream.isTTY && forceColor !== true) {
-		return 0;
-	}
-
-	const min = forceColor ? 1 : 0;
-
-	if (process.platform === 'win32') {
-		// Node.js 7.5.0 is the first version of Node.js to include a patch to
-		// libuv that enables 256 color output on Windows. Anything earlier and it
-		// won't work. However, here we target Node.js 8 at minimum as it is an LTS
-		// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
-		// release that supports 256 colors. Windows 10 build 14931 is the first release
-		// that supports 16m/TrueColor.
-		const osRelease = os.release().split('.');
-		if (
-			Number(process.versions.node.split('.')[0]) >= 8 &&
-			Number(osRelease[0]) >= 10 &&
-			Number(osRelease[2]) >= 10586
-		) {
-			return Number(osRelease[2]) >= 14931 ? 3 : 2;
-		}
-
-		return 1;
-	}
-
-	if ('CI' in env) {
-		if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
-			return 1;
-		}
-
-		return min;
-	}
-
-	if ('TEAMCITY_VERSION' in env) {
-		return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
-	}
-
-	if (env.COLORTERM === 'truecolor') {
-		return 3;
-	}
-
-	if ('TERM_PROGRAM' in env) {
-		const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
-
-		switch (env.TERM_PROGRAM) {
-			case 'iTerm.app':
-				return version >= 3 ? 3 : 2;
-			case 'Apple_Terminal':
-				return 2;
-			// No default
-		}
-	}
-
-	if (/-256(color)?$/i.test(env.TERM)) {
-		return 2;
-	}
-
-	if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
-		return 1;
-	}
-
-	if ('COLORTERM' in env) {
-		return 1;
-	}
-
-	if (env.TERM === 'dumb') {
-		return min;
-	}
-
-	return min;
-}
-
-function getSupportLevel(stream) {
-	const level = supportsColor(stream);
-	return translateLevel(level);
-}
-
-module.exports = {
-	supportsColor: getSupportLevel,
-	stdout: getSupportLevel(process.stdout),
-	stderr: getSupportLevel(process.stderr)
-};
Index: de_modules/supports-color/license
===================================================================
--- node_modules/supports-color/license	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,9 +1,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/supports-color/package.json
===================================================================
--- node_modules/supports-color/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,53 +1,0 @@
-{
-	"name": "supports-color",
-	"version": "5.5.0",
-	"description": "Detect whether a terminal supports color",
-	"license": "MIT",
-	"repository": "chalk/supports-color",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=4"
-	},
-	"scripts": {
-		"test": "xo && ava"
-	},
-	"files": [
-		"index.js",
-		"browser.js"
-	],
-	"keywords": [
-		"color",
-		"colour",
-		"colors",
-		"terminal",
-		"console",
-		"cli",
-		"ansi",
-		"styles",
-		"tty",
-		"rgb",
-		"256",
-		"shell",
-		"xterm",
-		"command-line",
-		"support",
-		"supports",
-		"capability",
-		"detect",
-		"truecolor",
-		"16m"
-	],
-	"dependencies": {
-		"has-flag": "^3.0.0"
-	},
-	"devDependencies": {
-		"ava": "^0.25.0",
-		"import-fresh": "^2.0.0",
-		"xo": "^0.20.0"
-	},
-	"browser": "browser.js"
-}
Index: de_modules/supports-color/readme.md
===================================================================
--- node_modules/supports-color/readme.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,66 +1,0 @@
-# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
-
-> Detect whether a terminal supports color
-
-
-## Install
-
-```
-$ npm install supports-color
-```
-
-
-## Usage
-
-```js
-const supportsColor = require('supports-color');
-
-if (supportsColor.stdout) {
-	console.log('Terminal stdout supports color');
-}
-
-if (supportsColor.stdout.has256) {
-	console.log('Terminal stdout supports 256 colors');
-}
-
-if (supportsColor.stderr.has16m) {
-	console.log('Terminal stderr supports 16 million colors (truecolor)');
-}
-```
-
-
-## API
-
-Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.
-
-The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:
-
-- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)
-- `.level = 2` and `.has256 = true`: 256 color support
-- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)
-
-
-## Info
-
-It obeys the `--color` and `--no-color` CLI flags.
-
-Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
-
-Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
-
-
-## Related
-
-- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
-- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
-
-
-## Maintainers
-
-- [Sindre Sorhus](https://github.com/sindresorhus)
-- [Josh Junon](https://github.com/qix-)
-
-
-## License
-
-MIT
Index: de_modules/to-regex-range/LICENSE
===================================================================
--- node_modules/to-regex-range/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/to-regex-range/README.md
===================================================================
--- node_modules/to-regex-range/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,305 +1,0 @@
-# to-regex-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/to-regex-range.svg?style=flat)](https://www.npmjs.com/package/to-regex-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![Linux Build Status](https://img.shields.io/travis/micromatch/to-regex-range.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/to-regex-range)
-
-> Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save to-regex-range
-```
-
-<details>
-<summary><strong>What does this do?</strong></summary>
-
-<br>
-
-This libary generates the `source` string to be passed to `new RegExp()` for matching a range of numbers.
-
-**Example**
-
-```js
-const toRegexRange = require('to-regex-range');
-const regex = new RegExp(toRegexRange('15', '95'));
-```
-
-A string is returned so that you can do whatever you need with it before passing it to `new RegExp()` (like adding `^` or `$` boundaries, defining flags, or combining it another string).
-
-<br>
-
-</details>
-
-<details>
-<summary><strong>Why use this library?</strong></summary>
-
-<br>
-
-### Convenience
-
-Creating regular expressions for matching numbers gets deceptively complicated pretty fast.
-
-For example, let's say you need a validation regex for matching part of a user-id, postal code, social security number, tax id, etc:
-
-* regex for matching `1` => `/1/` (easy enough)
-* regex for matching `1` through `5` => `/[1-5]/` (not bad...)
-* regex for matching `1` or `5` => `/(1|5)/` (still easy...)
-* regex for matching `1` through `50` => `/([1-9]|[1-4][0-9]|50)/` (uh-oh...)
-* regex for matching `1` through `55` => `/([1-9]|[1-4][0-9]|5[0-5])/` (no prob, I can do this...)
-* regex for matching `1` through `555` => `/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/` (maybe not...)
-* regex for matching `0001` through `5555` => `/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/` (okay, I get the point!)
-
-The numbers are contrived, but they're also really basic. In the real world you might need to generate a regex on-the-fly for validation.
-
-**Learn more**
-
-If you're interested in learning more about [character classes](http://www.regular-expressions.info/charclass.html) and other regex features, I personally have always found [regular-expressions.info](http://www.regular-expressions.info/charclass.html) to be pretty useful.
-
-### Heavily tested
-
-As of April 07, 2019, this library runs [>1m test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are correct.
-
-Tests run in ~280ms on my MacBook Pro, 2.5 GHz Intel Core i7.
-
-### Optimized
-
-Generated regular expressions are optimized:
-
-* duplicate sequences and character classes are reduced using quantifiers
-* smart enough to use `?` conditionals when number(s) or range(s) can be positive or negative
-* uses fragment caching to avoid processing the same exact string more than once
-
-<br>
-
-</details>
-
-## Usage
-
-Add this library to your javascript application with the following line of code
-
-```js
-const toRegexRange = require('to-regex-range');
-```
-
-The main export is a function that takes two integers: the `min` value and `max` value (formatted as strings or numbers).
-
-```js
-const source = toRegexRange('15', '95');
-//=> 1[5-9]|[2-8][0-9]|9[0-5]
-
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('14')); //=> false
-console.log(regex.test('50')); //=> true
-console.log(regex.test('94')); //=> true
-console.log(regex.test('96')); //=> false
-```
-
-## Options
-
-### options.capture
-
-**Type**: `boolean`
-
-**Deafault**: `undefined`
-
-Wrap the returned value in parentheses when there is more than one regex condition. Useful when you're dynamically generating ranges.
-
-```js
-console.log(toRegexRange('-10', '10'));
-//=> -[1-9]|-?10|[0-9]
-
-console.log(toRegexRange('-10', '10', { capture: true }));
-//=> (-[1-9]|-?10|[0-9])
-```
-
-### options.shorthand
-
-**Type**: `boolean`
-
-**Deafault**: `undefined`
-
-Use the regex shorthand for `[0-9]`:
-
-```js
-console.log(toRegexRange('0', '999999'));
-//=> [0-9]|[1-9][0-9]{1,5}
-
-console.log(toRegexRange('0', '999999', { shorthand: true }));
-//=> \d|[1-9]\d{1,5}
-```
-
-### options.relaxZeros
-
-**Type**: `boolean`
-
-**Default**: `true`
-
-This option relaxes matching for leading zeros when when ranges are zero-padded.
-
-```js
-const source = toRegexRange('-0010', '0010');
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('-10')); //=> true
-console.log(regex.test('-010')); //=> true
-console.log(regex.test('-0010')); //=> true
-console.log(regex.test('10')); //=> true
-console.log(regex.test('010')); //=> true
-console.log(regex.test('0010')); //=> true
-```
-
-When `relaxZeros` is false, matching is strict:
-
-```js
-const source = toRegexRange('-0010', '0010', { relaxZeros: false });
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('-10')); //=> false
-console.log(regex.test('-010')); //=> false
-console.log(regex.test('-0010')); //=> true
-console.log(regex.test('10')); //=> false
-console.log(regex.test('010')); //=> false
-console.log(regex.test('0010')); //=> true
-```
-
-## Examples
-
-| **Range**                   | **Result**                                                                      | **Compile time** |
-| ---                         | ---                                                                             | ---              |
-| `toRegexRange(-10, 10)`     | `-[1-9]\|-?10\|[0-9]`                                                           | _132μs_          |
-| `toRegexRange(-100, -10)`   | `-1[0-9]\|-[2-9][0-9]\|-100`                                                    | _50μs_           |
-| `toRegexRange(-100, 100)`   | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]`                                            | _42μs_           |
-| `toRegexRange(001, 100)`    | `0{0,2}[1-9]\|0?[1-9][0-9]\|100`                                                | _109μs_          |
-| `toRegexRange(001, 555)`    | `0{0,2}[1-9]\|0?[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                | _51μs_           |
-| `toRegexRange(0010, 1000)`  | `0{0,2}1[0-9]\|0{0,2}[2-9][0-9]\|0?[1-9][0-9]{2}\|1000`                         | _31μs_           |
-| `toRegexRange(1, 50)`       | `[1-9]\|[1-4][0-9]\|50`                                                         | _24μs_           |
-| `toRegexRange(1, 55)`       | `[1-9]\|[1-4][0-9]\|5[0-5]`                                                     | _23μs_           |
-| `toRegexRange(1, 555)`      | `[1-9]\|[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                        | _30μs_           |
-| `toRegexRange(1, 5555)`     | `[1-9]\|[1-9][0-9]{1,2}\|[1-4][0-9]{3}\|5[0-4][0-9]{2}\|55[0-4][0-9]\|555[0-5]` | _43μs_           |
-| `toRegexRange(111, 555)`    | `11[1-9]\|1[2-9][0-9]\|[2-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                     | _38μs_           |
-| `toRegexRange(29, 51)`      | `29\|[34][0-9]\|5[01]`                                                          | _24μs_           |
-| `toRegexRange(31, 877)`     | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]`                       | _32μs_           |
-| `toRegexRange(5, 5)`        | `5`                                                                             | _8μs_            |
-| `toRegexRange(5, 6)`        | `5\|6`                                                                          | _11μs_           |
-| `toRegexRange(1, 2)`        | `1\|2`                                                                          | _6μs_            |
-| `toRegexRange(1, 5)`        | `[1-5]`                                                                         | _15μs_           |
-| `toRegexRange(1, 10)`       | `[1-9]\|10`                                                                     | _22μs_           |
-| `toRegexRange(1, 100)`      | `[1-9]\|[1-9][0-9]\|100`                                                        | _25μs_           |
-| `toRegexRange(1, 1000)`     | `[1-9]\|[1-9][0-9]{1,2}\|1000`                                                  | _31μs_           |
-| `toRegexRange(1, 10000)`    | `[1-9]\|[1-9][0-9]{1,3}\|10000`                                                 | _34μs_           |
-| `toRegexRange(1, 100000)`   | `[1-9]\|[1-9][0-9]{1,4}\|100000`                                                | _36μs_           |
-| `toRegexRange(1, 1000000)`  | `[1-9]\|[1-9][0-9]{1,5}\|1000000`                                               | _42μs_           |
-| `toRegexRange(1, 10000000)` | `[1-9]\|[1-9][0-9]{1,6}\|10000000`                                              | _42μs_           |
-
-## Heads up!
-
-**Order of arguments**
-
-When the `min` is larger than the `max`, values will be flipped to create a valid range:
-
-```js
-toRegexRange('51', '29');
-```
-
-Is effectively flipped to:
-
-```js
-toRegexRange('29', '51');
-//=> 29|[3-4][0-9]|5[0-1]
-```
-
-**Steps / increments**
-
-This library does not support steps (increments). A pr to add support would be welcome.
-
-## History
-
-### v2.0.0 - 2017-04-21
-
-**New features**
-
-Adds support for zero-padding!
-
-### v1.0.0
-
-**Optimizations**
-
-Repeating ranges are now grouped using quantifiers. rocessing time is roughly the same, but the generated regex is much smaller, which should result in faster matching.
-
-## Attribution
-
-Inspired by the python library [range-regex](https://github.com/dimka665/range-regex).
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used by micromatch.")
-* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`")
-* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
-* [repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.")
-* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.")
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 63 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 3  | [doowb](https://github.com/doowb) |  
-| 2  | [realityking](https://github.com/realityking) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)!
-
-<a href="https://www.patreon.com/jonschlinkert">
-<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="50">
-</a>
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 07, 2019._
Index: de_modules/to-regex-range/index.js
===================================================================
--- node_modules/to-regex-range/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,288 +1,0 @@
-/*!
- * to-regex-range <https://github.com/micromatch/to-regex-range>
- *
- * Copyright (c) 2015-present, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-'use strict';
-
-const isNumber = require('is-number');
-
-const toRegexRange = (min, max, options) => {
-  if (isNumber(min) === false) {
-    throw new TypeError('toRegexRange: expected the first argument to be a number');
-  }
-
-  if (max === void 0 || min === max) {
-    return String(min);
-  }
-
-  if (isNumber(max) === false) {
-    throw new TypeError('toRegexRange: expected the second argument to be a number.');
-  }
-
-  let opts = { relaxZeros: true, ...options };
-  if (typeof opts.strictZeros === 'boolean') {
-    opts.relaxZeros = opts.strictZeros === false;
-  }
-
-  let relax = String(opts.relaxZeros);
-  let shorthand = String(opts.shorthand);
-  let capture = String(opts.capture);
-  let wrap = String(opts.wrap);
-  let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;
-
-  if (toRegexRange.cache.hasOwnProperty(cacheKey)) {
-    return toRegexRange.cache[cacheKey].result;
-  }
-
-  let a = Math.min(min, max);
-  let b = Math.max(min, max);
-
-  if (Math.abs(a - b) === 1) {
-    let result = min + '|' + max;
-    if (opts.capture) {
-      return `(${result})`;
-    }
-    if (opts.wrap === false) {
-      return result;
-    }
-    return `(?:${result})`;
-  }
-
-  let isPadded = hasPadding(min) || hasPadding(max);
-  let state = { min, max, a, b };
-  let positives = [];
-  let negatives = [];
-
-  if (isPadded) {
-    state.isPadded = isPadded;
-    state.maxLen = String(state.max).length;
-  }
-
-  if (a < 0) {
-    let newMin = b < 0 ? Math.abs(b) : 1;
-    negatives = splitToPatterns(newMin, Math.abs(a), state, opts);
-    a = state.a = 0;
-  }
-
-  if (b >= 0) {
-    positives = splitToPatterns(a, b, state, opts);
-  }
-
-  state.negatives = negatives;
-  state.positives = positives;
-  state.result = collatePatterns(negatives, positives, opts);
-
-  if (opts.capture === true) {
-    state.result = `(${state.result})`;
-  } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {
-    state.result = `(?:${state.result})`;
-  }
-
-  toRegexRange.cache[cacheKey] = state;
-  return state.result;
-};
-
-function collatePatterns(neg, pos, options) {
-  let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];
-  let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];
-  let intersected = filterPatterns(neg, pos, '-?', true, options) || [];
-  let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);
-  return subpatterns.join('|');
-}
-
-function splitToRanges(min, max) {
-  let nines = 1;
-  let zeros = 1;
-
-  let stop = countNines(min, nines);
-  let stops = new Set([max]);
-
-  while (min <= stop && stop <= max) {
-    stops.add(stop);
-    nines += 1;
-    stop = countNines(min, nines);
-  }
-
-  stop = countZeros(max + 1, zeros) - 1;
-
-  while (min < stop && stop <= max) {
-    stops.add(stop);
-    zeros += 1;
-    stop = countZeros(max + 1, zeros) - 1;
-  }
-
-  stops = [...stops];
-  stops.sort(compare);
-  return stops;
-}
-
-/**
- * Convert a range to a regex pattern
- * @param {Number} `start`
- * @param {Number} `stop`
- * @return {String}
- */
-
-function rangeToPattern(start, stop, options) {
-  if (start === stop) {
-    return { pattern: start, count: [], digits: 0 };
-  }
-
-  let zipped = zip(start, stop);
-  let digits = zipped.length;
-  let pattern = '';
-  let count = 0;
-
-  for (let i = 0; i < digits; i++) {
-    let [startDigit, stopDigit] = zipped[i];
-
-    if (startDigit === stopDigit) {
-      pattern += startDigit;
-
-    } else if (startDigit !== '0' || stopDigit !== '9') {
-      pattern += toCharacterClass(startDigit, stopDigit, options);
-
-    } else {
-      count++;
-    }
-  }
-
-  if (count) {
-    pattern += options.shorthand === true ? '\\d' : '[0-9]';
-  }
-
-  return { pattern, count: [count], digits };
-}
-
-function splitToPatterns(min, max, tok, options) {
-  let ranges = splitToRanges(min, max);
-  let tokens = [];
-  let start = min;
-  let prev;
-
-  for (let i = 0; i < ranges.length; i++) {
-    let max = ranges[i];
-    let obj = rangeToPattern(String(start), String(max), options);
-    let zeros = '';
-
-    if (!tok.isPadded && prev && prev.pattern === obj.pattern) {
-      if (prev.count.length > 1) {
-        prev.count.pop();
-      }
-
-      prev.count.push(obj.count[0]);
-      prev.string = prev.pattern + toQuantifier(prev.count);
-      start = max + 1;
-      continue;
-    }
-
-    if (tok.isPadded) {
-      zeros = padZeros(max, tok, options);
-    }
-
-    obj.string = zeros + obj.pattern + toQuantifier(obj.count);
-    tokens.push(obj);
-    start = max + 1;
-    prev = obj;
-  }
-
-  return tokens;
-}
-
-function filterPatterns(arr, comparison, prefix, intersection, options) {
-  let result = [];
-
-  for (let ele of arr) {
-    let { string } = ele;
-
-    // only push if _both_ are negative...
-    if (!intersection && !contains(comparison, 'string', string)) {
-      result.push(prefix + string);
-    }
-
-    // or _both_ are positive
-    if (intersection && contains(comparison, 'string', string)) {
-      result.push(prefix + string);
-    }
-  }
-  return result;
-}
-
-/**
- * Zip strings
- */
-
-function zip(a, b) {
-  let arr = [];
-  for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);
-  return arr;
-}
-
-function compare(a, b) {
-  return a > b ? 1 : b > a ? -1 : 0;
-}
-
-function contains(arr, key, val) {
-  return arr.some(ele => ele[key] === val);
-}
-
-function countNines(min, len) {
-  return Number(String(min).slice(0, -len) + '9'.repeat(len));
-}
-
-function countZeros(integer, zeros) {
-  return integer - (integer % Math.pow(10, zeros));
-}
-
-function toQuantifier(digits) {
-  let [start = 0, stop = ''] = digits;
-  if (stop || start > 1) {
-    return `{${start + (stop ? ',' + stop : '')}}`;
-  }
-  return '';
-}
-
-function toCharacterClass(a, b, options) {
-  return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;
-}
-
-function hasPadding(str) {
-  return /^-?(0+)\d/.test(str);
-}
-
-function padZeros(value, tok, options) {
-  if (!tok.isPadded) {
-    return value;
-  }
-
-  let diff = Math.abs(tok.maxLen - String(value).length);
-  let relax = options.relaxZeros !== false;
-
-  switch (diff) {
-    case 0:
-      return '';
-    case 1:
-      return relax ? '0?' : '0';
-    case 2:
-      return relax ? '0{0,2}' : '00';
-    default: {
-      return relax ? `0{0,${diff}}` : `0{${diff}}`;
-    }
-  }
-}
-
-/**
- * Cache
- */
-
-toRegexRange.cache = {};
-toRegexRange.clearCache = () => (toRegexRange.cache = {});
-
-/**
- * Expose `toRegexRange`
- */
-
-module.exports = toRegexRange;
Index: de_modules/to-regex-range/package.json
===================================================================
--- node_modules/to-regex-range/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,88 +1,0 @@
-{
-  "name": "to-regex-range",
-  "description": "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.",
-  "version": "5.0.1",
-  "homepage": "https://github.com/micromatch/to-regex-range",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Rouven Weßling (www.rouvenwessling.de)"
-  ],
-  "repository": "micromatch/to-regex-range",
-  "bugs": {
-    "url": "https://github.com/micromatch/to-regex-range/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "dependencies": {
-    "is-number": "^7.0.0"
-  },
-  "devDependencies": {
-    "fill-range": "^6.0.0",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.0.2",
-    "text-table": "^0.2.0",
-    "time-diff": "^0.3.1"
-  },
-  "keywords": [
-    "bash",
-    "date",
-    "expand",
-    "expansion",
-    "expression",
-    "glob",
-    "match",
-    "match date",
-    "match number",
-    "match numbers",
-    "match year",
-    "matches",
-    "matching",
-    "number",
-    "numbers",
-    "numerical",
-    "range",
-    "ranges",
-    "regex",
-    "regexp",
-    "regular",
-    "regular expression",
-    "sequence"
-  ],
-  "verb": {
-    "layout": "default",
-    "toc": false,
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "helpers": {
-      "examples": {
-        "displayName": "examples"
-      }
-    },
-    "related": {
-      "list": [
-        "expand-range",
-        "fill-range",
-        "micromatch",
-        "repeat-element",
-        "repeat-string"
-      ]
-    }
-  }
-}
Index: de_modules/touch/LICENSE
===================================================================
--- node_modules/touch/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,15 +1,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: de_modules/touch/README.md
===================================================================
--- node_modules/touch/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,52 +1,0 @@
-# node-touch
-
-For all your node touching needs.
-
-## Installing
-
-```bash
-npm install touch
-```
-
-## CLI Usage:
-
-See `man touch`
-
-This package exports a binary called `nodetouch` that works mostly
-like the unix builtin `touch(1)`.
-
-## API Usage:
-
-```javascript
-var touch = require("touch")
-```
-
-Gives you the following functions:
-
-* `touch(filename, options, cb)`
-* `touch.sync(filename, options)`
-* `touch.ftouch(fd, options, cb)`
-* `touch.ftouchSync(fd, options)`
-
-All the `options` objects are optional.
-
-All the async functions return a Promise.  If a callback function is
-provided, then it's attached to the Promise.
-
-## Options
-
-* `force` like `touch -f` Boolean
-* `time` like `touch -t <date>` Can be a Date object, or any parseable
-  Date string, or epoch ms number.
-* `atime` like `touch -a` Can be either a Boolean, or a Date.
-* `mtime` like `touch -m` Can be either a Boolean, or a Date.
-* `ref` like `touch -r <file>` Must be path to a file.
-* `nocreate` like `touch -c` Boolean
-
-If neither `atime` nor `mtime` are set, then both values are set.  If
-one of them is set, then the other is not.
-
-## cli
-
-This package creates a `nodetouch` command line executable that works
-very much like the unix builtin `touch(1)`
Index: de_modules/touch/index.js
===================================================================
--- node_modules/touch/index.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,224 +1,0 @@
-'use strict'
-
-const EE = require('events').EventEmitter
-const cons = require('constants')
-const fs = require('fs')
-
-module.exports = (f, options, cb) => {
-  if (typeof options === 'function')
-    cb = options, options = {}
-
-  const p = new Promise((res, rej) => {
-    new Touch(validOpts(options, f, null))
-      .on('done', res).on('error', rej)
-  })
-
-  return cb ? p.then(res => cb(null, res), cb) : p
-}
-
-module.exports.sync = module.exports.touchSync = (f, options) =>
-  (new TouchSync(validOpts(options, f, null)), undefined)
-
-module.exports.ftouch = (fd, options, cb) => {
-  if (typeof options === 'function')
-    cb = options, options = {}
-
-  const p = new Promise((res, rej) => {
-    new Touch(validOpts(options, null, fd))
-      .on('done', res).on('error', rej)
-  })
-
-  return cb ? p.then(res => cb(null, res), cb) : p
-}
-
-module.exports.ftouchSync = (fd, opt) =>
-  (new TouchSync(validOpts(opt, null, fd)), undefined)
-
-const validOpts = (options, path, fd) => {
-  options = Object.create(options || {})
-  options.fd = fd
-  options.path = path
-
-  // {mtime: true}, {ctime: true}
-  // If set to something else, then treat as epoch ms value
-  const now = new Date(options.time || Date.now()).getTime() / 1000
-  if (!options.atime && !options.mtime)
-    options.atime = options.mtime = now
-  else {
-    if (true === options.atime)
-      options.atime = now
-
-    if (true === options.mtime)
-      options.mtime = now
-  }
-
-  let oflags = 0
-  if (!options.force)
-    oflags = oflags | cons.O_RDWR
-
-  if (!options.nocreate)
-    oflags = oflags | cons.O_CREAT
-
-  options.oflags = oflags
-  return options
-}
-
-class Touch extends EE {
-  constructor (options) {
-    super(options)
-    this.fd = options.fd
-    this.path = options.path
-    this.atime = options.atime
-    this.mtime = options.mtime
-    this.ref = options.ref
-    this.nocreate = !!options.nocreate
-    this.force = !!options.force
-    this.closeAfter = options.closeAfter
-    this.oflags = options.oflags
-    this.options = options
-
-    if (typeof this.fd !== 'number') {
-      this.closeAfter = true
-      this.open()
-    } else
-      this.onopen(null, this.fd)
-  }
-
-  emit (ev, data) {
-    // we only emit when either done or erroring
-    // in both cases, need to close
-    this.close()
-    return super.emit(ev, data)
-  }
-
-  close () {
-    if (typeof this.fd === 'number' && this.closeAfter)
-      fs.close(this.fd, () => {})
-  }
-
-  open () {
-    fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd))
-  }
-
-  onopen (er, fd) {
-    if (er) {
-      if (er.code === 'EISDIR')
-        this.onopen(null, null)
-      else if (er.code === 'ENOENT' && this.nocreate)
-        this.emit('done')
-      else
-        this.emit('error', er)
-    } else {
-      this.fd = fd
-      if (this.ref)
-        this.statref()
-      else if (!this.atime || !this.mtime)
-        this.fstat()
-      else
-        this.futimes()
-    }
-  }
-
-  statref () {
-    fs.stat(this.ref, (er, st) => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.onstatref(st)
-    })
-  }
-
-  onstatref (st) {
-    this.atime = this.atime && st.atime.getTime()/1000
-    this.mtime = this.mtime && st.mtime.getTime()/1000
-    if (!this.atime || !this.mtime)
-      this.fstat()
-    else
-      this.futimes()
-  }
-
-  fstat () {
-    const stat = this.fd ? 'fstat' : 'stat'
-    const target = this.fd || this.path
-    fs[stat](target, (er, st) => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.onfstat(st)
-    })
-  }
-
-  onfstat (st) {
-    if (typeof this.atime !== 'number')
-      this.atime = st.atime.getTime()/1000
-
-    if (typeof this.mtime !== 'number')
-      this.mtime = st.mtime.getTime()/1000
-
-    this.futimes()
-  }
-
-  futimes () {
-    const utimes = this.fd ? 'futimes' : 'utimes'
-    const target = this.fd || this.path
-    fs[utimes](target, ''+this.atime, ''+this.mtime, er => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.emit('done')
-    })
-  }
-}
-
-class TouchSync extends Touch {
-  open () {
-    try {
-      this.onopen(null, fs.openSync(this.path, this.oflags))
-    } catch (er) {
-      this.onopen(er)
-    }
-  }
-
-  statref () {
-    let threw = true
-    try {
-      this.onstatref(fs.statSync(this.ref))
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-  }
-
-  fstat () {
-    let threw = true
-    const stat = this.fd ? 'fstatSync' : 'statSync'
-    const target = this.fd || this.path
-    try {
-      this.onfstat(fs[stat](target))
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-  }
-
-  futimes () {
-    let threw = true
-    const utimes = this.fd ? 'futimesSync' : 'utimesSync'
-    const target = this.fd || this.path
-    try {
-      fs[utimes](target, this.atime, this.mtime)
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-    this.emit('done')
-  }
-
-  close () {
-    if (typeof this.fd === 'number' && this.closeAfter)
-      try { fs.closeSync(this.fd) } catch (er) {}
-  }
-}
Index: de_modules/touch/package.json
===================================================================
--- node_modules/touch/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,25 +1,0 @@
-{
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "name": "touch",
-  "description": "like touch(1) in node",
-  "version": "3.1.1",
-  "repository": "git://github.com/isaacs/node-touch.git",
-  "bin": {
-    "nodetouch": "./bin/nodetouch.js"
-  },
-  "license": "ISC",
-  "scripts": {
-    "test": "tap test/*.js --100 -J",
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "postpublish": "git push origin --all; git push origin --tags"
-  },
-  "devDependencies": {
-    "mutate-fs": "^1.1.0",
-    "tap": "^10.7.0"
-  },
-  "files": [
-    "index.js",
-    "bin/nodetouch.js"
-  ]
-}
Index: de_modules/undefsafe/.github/workflows/release.yml
===================================================================
--- node_modules/undefsafe/.github/workflows/release.yml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,25 +1,0 @@
-name: Release
-on:
-  push:
-    branches:
-      - master
-jobs:
-  release:
-    name: Release
-    runs-on: ubuntu-18.04
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v1
-      - name: Setup Node.js
-        uses: actions/setup-node@v1
-        with:
-          node-version: 16
-      - name: Install dependencies
-        run: npm ci
-      - name: Test
-        run: npm run test
-      - name: Release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
-        run: npx semantic-release
Index: de_modules/undefsafe/.jscsrc
===================================================================
--- node_modules/undefsafe/.jscsrc	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,13 +1,0 @@
-{
-  "preset": "node-style-guide",
-  "requireCapitalizedComments": null,
-  "requireSpacesInAnonymousFunctionExpression": {
-    "beforeOpeningCurlyBrace": true,
-    "beforeOpeningRoundBrace": true
-  },
-  "disallowSpacesInNamedFunctionExpression": {
-    "beforeOpeningRoundBrace": true
-  },
-  "excludeFiles": ["node_modules/**"],
-  "disallowSpacesInFunction": null
-}
Index: de_modules/undefsafe/.jshintrc
===================================================================
--- node_modules/undefsafe/.jshintrc	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,16 +1,0 @@
-{
-  "browser": false,
-  "camelcase": true,
-  "curly": true,
-  "devel": true,
-  "eqeqeq": true,
-  "forin": true,
-  "indent": 2,
-  "noarg": true,
-  "node": true,
-  "quotmark": "single",
-  "undef": true,
-  "strict": false,
-  "unused": true
-}
-
Index: de_modules/undefsafe/.travis.yml
===================================================================
--- node_modules/undefsafe/.travis.yml	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,18 +1,0 @@
-sudo: false
-language: node_js
-cache:
-  directories:
-    - node_modules
-notifications:
-  email: false
-node_js:
-  - '4'
-before_install:
-  - npm i -g npm@^2.0.0
-before_script:
-  - npm prune
-after_success:
-  - npm run semantic-release
-branches:
-  except:
-    - "/^v\\d+\\.\\d+\\.\\d+$/"
Index: de_modules/undefsafe/LICENSE
===================================================================
--- node_modules/undefsafe/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,22 +1,0 @@
-The MIT License (MIT)
-
-Copyright © 2016 Remy Sharp, http://remysharp.com <remy@remysharp.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: de_modules/undefsafe/README.md
===================================================================
--- node_modules/undefsafe/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,63 +1,0 @@
-# undefsafe
-
-Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined"
-
-Can also be used to safely set deep values.
-
-## Usage
-
-```js
-var object = {
-  a: {
-    b: {
-      c: 1,
-      d: [1,2,3],
-      e: 'remy'
-    }
-  }
-};
-
-console.log(undefsafe(object, 'a.b.e')); // "remy"
-console.log(undefsafe(object, 'a.b.not.found')); // undefined
-```
-
-Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console)
-
-## Setting
-
-```js
-var object = {
-  a: {
-    b: [1,2,3]
-  }
-};
-
-// modified object
-var res = undefsafe(object, 'a.b.0', 10);
-
-console.log(object); // { a: { b: [10, 2, 3] } }
-console.log(res); // 1 - previous value
-```
-
-## Star rules in paths
-
-As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element.
-
-The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data:
-
-```js
-const githubData = {
-        commits: [{
-          modified: [
-            "one",
-            "two"
-          ]
-        }, /* ... */ ]
-      };
-
-// first modified file found in the first commit
-console.log(undefsafe(githubData, 'commits.*.modified.0'));
-
-// returns `two` or undefined if not found
-console.log(undefsafe(githubData, 'commits.*.modified.*', 'two'));
-```
Index: de_modules/undefsafe/example.js
===================================================================
--- node_modules/undefsafe/example.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,14 +1,0 @@
-var undefsafe = require('undefsafe');
-
-var object = {
-  a: {
-    b: {
-      c: 1,
-      d: [1, 2, 3],
-      e: 'remy'
-    }
-  }
-};
-
-console.log(undefsafe(object, 'a.b.e')); // "remy"
-console.log(undefsafe(object, 'a.b.not.found')); // undefined
Index: de_modules/undefsafe/lib/undefsafe.js
===================================================================
--- node_modules/undefsafe/lib/undefsafe.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,125 +1,0 @@
-'use strict';
-
-function undefsafe(obj, path, value, __res) {
-  // I'm not super keen on this private function, but it's because
-  // it'll also be use in the browser and I wont *one* function exposed
-  function split(path) {
-    var res = [];
-    var level = 0;
-    var key = '';
-
-    for (var i = 0; i < path.length; i++) {
-      var c = path.substr(i, 1);
-
-      if (level === 0 && (c === '.' || c === '[')) {
-        if (c === '[') {
-          level++;
-          i++;
-          c = path.substr(i, 1);
-        }
-
-        if (key) {
-          // the first value could be a string
-          res.push(key);
-        }
-        key = '';
-        continue;
-      }
-
-      if (c === ']') {
-        level--;
-        key = key.slice(0, -1);
-        continue;
-      }
-
-      key += c;
-    }
-
-    res.push(key);
-
-    return res;
-  }
-
-  // bail if there's nothing
-  if (obj === undefined || obj === null) {
-    return undefined;
-  }
-
-  var parts = split(path);
-  var key = null;
-  var type = typeof obj;
-  var root = obj;
-  var parent = obj;
-
-  var star =
-    parts.filter(function(_) {
-      return _ === '*';
-    }).length > 0;
-
-  // we're dealing with a primitive
-  if (type !== 'object' && type !== 'function') {
-    return obj;
-  } else if (path.trim() === '') {
-    return obj;
-  }
-
-  key = parts[0];
-  var i = 0;
-  for (; i < parts.length; i++) {
-    key = parts[i];
-    parent = obj;
-
-    if (key === '*') {
-      // loop through each property
-      var prop = '';
-      var res = __res || [];
-
-      for (prop in parent) {
-        var shallowObj = undefsafe(
-          obj[prop],
-          parts.slice(i + 1).join('.'),
-          value,
-          res
-        );
-        if (shallowObj && shallowObj !== res) {
-          if ((value && shallowObj === value) || value === undefined) {
-            if (value !== undefined) {
-              return shallowObj;
-            }
-
-            res.push(shallowObj);
-          }
-        }
-      }
-
-      if (res.length === 0) {
-        return undefined;
-      }
-
-      return res;
-    }
-
-    if (Object.getOwnPropertyNames(obj).indexOf(key) == -1) {
-      return undefined;
-    }
-
-    obj = obj[key];
-    if (obj === undefined || obj === null) {
-      break;
-    }
-  }
-
-  // if we have a null object, make sure it's the one the user was after,
-  // if it's not (i.e. parts has a length) then give undefined back.
-  if (obj === null && i !== parts.length - 1) {
-    obj = undefined;
-  } else if (!star && value) {
-    key = path.split('.').pop();
-    parent[key] = value;
-  }
-  return obj;
-}
-
-if (typeof module !== 'undefined') {
-  module.exports = undefsafe;
-}
Index: de_modules/undefsafe/package.json
===================================================================
--- node_modules/undefsafe/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,34 +1,0 @@
-{
-  "name": "undefsafe",
-  "description": "Undefined safe way of extracting object properties",
-  "main": "lib/undefsafe.js",
-  "tonicExampleFilename": "example.js",
-  "directories": {
-    "test": "test"
-  },
-  "scripts": {
-    "test": "tap test/**/*.test.js -R spec",
-    "cover": "tap test/*.test.js --cov --coverage-report=lcov",
-    "semantic-release": "semantic-release"
-  },
-  "prettier": {
-    "trailingComma": "none",
-    "singleQuote": true
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/undefsafe.git"
-  },
-  "keywords": [
-    "undefined"
-  ],
-  "author": "Remy Sharp",
-  "license": "MIT",
-  "devDependencies": {
-    "semantic-release": "^18.0.0",
-    "tap": "^5.7.1",
-    "tap-only": "0.0.5"
-  },
-  "dependencies": {},
-  "version": "2.0.5"
-}
Index: de_modules/xtend/.jshintrc
===================================================================
--- node_modules/xtend/.jshintrc	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,30 +1,0 @@
-{
-    "maxdepth": 4,
-    "maxstatements": 200,
-    "maxcomplexity": 12,
-    "maxlen": 80,
-    "maxparams": 5,
-
-    "curly": true,
-    "eqeqeq": true,
-    "immed": true,
-    "latedef": false,
-    "noarg": true,
-    "noempty": true,
-    "nonew": true,
-    "undef": true,
-    "unused": "vars",
-    "trailing": true,
-
-    "quotmark": true,
-    "expr": true,
-    "asi": true,
-
-    "browser": false,
-    "esnext": true,
-    "devel": false,
-    "node": false,
-    "nonstandard": false,
-
-    "predef": ["require", "module", "__dirname", "__filename"]
-}
Index: de_modules/xtend/LICENSE
===================================================================
--- node_modules/xtend/LICENSE	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,20 +1,0 @@
-The MIT License (MIT)
-Copyright (c) 2012-2014 Raynos.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: de_modules/xtend/README.md
===================================================================
--- node_modules/xtend/README.md	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,32 +1,0 @@
-# xtend
-
-[![browser support][3]][4]
-
-[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
-
-Extend like a boss
-
-xtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence.
-
-## Examples
-
-```js
-var extend = require("xtend")
-
-// extend returns a new object. Does not mutate arguments
-var combination = extend({
-    a: "a",
-    b: "c"
-}, {
-    b: "b"
-})
-// { a: "a", b: "b" }
-```
-
-## Stability status: Locked
-
-## MIT Licensed 
-
-
-  [3]: http://ci.testling.com/Raynos/xtend.png
-  [4]: http://ci.testling.com/Raynos/xtend
Index: de_modules/xtend/immutable.js
===================================================================
--- node_modules/xtend/immutable.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,19 +1,0 @@
-module.exports = extend
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-function extend() {
-    var target = {}
-
-    for (var i = 0; i < arguments.length; i++) {
-        var source = arguments[i]
-
-        for (var key in source) {
-            if (hasOwnProperty.call(source, key)) {
-                target[key] = source[key]
-            }
-        }
-    }
-
-    return target
-}
Index: de_modules/xtend/mutable.js
===================================================================
--- node_modules/xtend/mutable.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,17 +1,0 @@
-module.exports = extend
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-function extend(target) {
-    for (var i = 1; i < arguments.length; i++) {
-        var source = arguments[i]
-
-        for (var key in source) {
-            if (hasOwnProperty.call(source, key)) {
-                target[key] = source[key]
-            }
-        }
-    }
-
-    return target
-}
Index: de_modules/xtend/package.json
===================================================================
--- node_modules/xtend/package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,55 +1,0 @@
-{
-  "name": "xtend",
-  "version": "4.0.2",
-  "description": "extend like a boss",
-  "keywords": [
-    "extend",
-    "merge",
-    "options",
-    "opts",
-    "object",
-    "array"
-  ],
-  "author": "Raynos <raynos2@gmail.com>",
-  "repository": "git://github.com/Raynos/xtend.git",
-  "main": "immutable",
-  "scripts": {
-    "test": "node test"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "tape": "~1.1.0"
-  },
-  "homepage": "https://github.com/Raynos/xtend",
-  "contributors": [
-    {
-      "name": "Jake Verbaten"
-    },
-    {
-      "name": "Matt Esch"
-    }
-  ],
-  "bugs": {
-    "url": "https://github.com/Raynos/xtend/issues",
-    "email": "raynos2@gmail.com"
-  },
-  "license": "MIT",
-  "testling": {
-    "files": "test.js",
-    "browsers": [
-      "ie/7..latest",
-      "firefox/16..latest",
-      "firefox/nightly",
-      "chrome/22..latest",
-      "chrome/canary",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest"
-    ]
-  },
-  "engines": {
-    "node": ">=0.4"
-  }
-}
Index: de_modules/xtend/test.js
===================================================================
--- node_modules/xtend/test.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ 	(revision )
@@ -1,103 +1,0 @@
-var test = require("tape")
-var extend = require("./")
-var mutableExtend = require("./mutable")
-
-test("merge", function(assert) {
-    var a = { a: "foo" }
-    var b = { b: "bar" }
-
-    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
-    assert.end()
-})
-
-test("replace", function(assert) {
-    var a = { a: "foo" }
-    var b = { a: "bar" }
-
-    assert.deepEqual(extend(a, b), { a: "bar" })
-    assert.end()
-})
-
-test("undefined", function(assert) {
-    var a = { a: undefined }
-    var b = { b: "foo" }
-
-    assert.deepEqual(extend(a, b), { a: undefined, b: "foo" })
-    assert.deepEqual(extend(b, a), { a: undefined, b: "foo" })
-    assert.end()
-})
-
-test("handle 0", function(assert) {
-    var a = { a: "default" }
-    var b = { a: 0 }
-
-    assert.deepEqual(extend(a, b), { a: 0 })
-    assert.deepEqual(extend(b, a), { a: "default" })
-    assert.end()
-})
-
-test("is immutable", function (assert) {
-    var record = {}
-
-    extend(record, { foo: "bar" })
-    assert.equal(record.foo, undefined)
-    assert.end()
-})
-
-test("null as argument", function (assert) {
-    var a = { foo: "bar" }
-    var b = null
-    var c = void 0
-
-    assert.deepEqual(extend(b, a, c), { foo: "bar" })
-    assert.end()
-})
-
-test("mutable", function (assert) {
-    var a = { foo: "bar" }
-
-    mutableExtend(a, { bar: "baz" })
-
-    assert.equal(a.bar, "baz")
-    assert.end()
-})
-
-test("null prototype", function(assert) {
-    var a = { a: "foo" }
-    var b = Object.create(null)
-    b.b = "bar";
-
-    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
-    assert.end()
-})
-
-test("null prototype mutable", function (assert) {
-    var a = { foo: "bar" }
-    var b = Object.create(null)
-    b.bar = "baz";
-
-    mutableExtend(a, b)
-
-    assert.equal(a.bar, "baz")
-    assert.end()
-})
-
-test("prototype pollution", function (assert) {
-    var a = {}
-    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
-
-    assert.strictEqual(a.oops, undefined)
-    extend({}, maliciousPayload)
-    assert.strictEqual(a.oops, undefined)
-    assert.end()
-})
-
-test("prototype pollution mutable", function (assert) {
-    var a = {}
-    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
-
-    assert.strictEqual(a.oops, undefined)
-    mutableExtend({}, maliciousPayload)
-    assert.strictEqual(a.oops, undefined)
-    assert.end()
-})
Index: package.json
===================================================================
--- package.json	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ package.json	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -13,5 +13,5 @@
     "dotenv": "^16.3.1",
     "nodemailer": "^6.9.7",
-    "pg": "^8.23.0"
+    "sqlite3": "^5.1.6"
   },
   "devDependencies": {
Index: server.js
===================================================================
--- server.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ server.js	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -1,5 +1,5 @@
 const http = require('http');
 const url = require('url');
-const { Pool } = require('pg');
+const database = require('./database.js');
 const fs = require('fs');
 const path = require('path');
@@ -7,9 +7,7 @@
 const nodemailer = require('nodemailer');
 const bcrypt = require('bcryptjs');
-const { AsyncLocalStorage } = require('async_hooks');
 require('dotenv').config();
 
 const port = process.env.PORT || 3000;
-
 const sessions = new Map();
 const verificationCodes = new Map();
@@ -26,9 +24,5 @@
     const emailConfig = {
         host: process.env.SMTP_HOST || 'smtp.gmail.com',
-        port: (() => {
-            const configuredPort = parseInt(process.env.SMTP_PORT, 10);
-            if (process.env.SMTP_HOST === 'smtp.ethereal.email' && configuredPort === 3000) return 587;
-            return configuredPort || 587;
-        })(),
+        port: parseInt(process.env.SMTP_PORT) || 587,
         secure: false,
         auth: {
@@ -37,5 +31,4 @@
         }
     };
-
     emailTransporter = nodemailer.createTransport(emailConfig);
 
@@ -60,5 +53,4 @@
                 const codeMatch = mailOptions.html.match(/\b\d{6}\b/);
                 const code = codeMatch ? codeMatch[0] : 'unknown';
-
                 console.log('');
                 console.log('🎯 ===== VERIFICATION CODE =====');
@@ -69,5 +61,4 @@
                 console.log('================================');
                 console.log('');
-
                 resolve({ messageId: 'dev-' + Date.now() });
             });
@@ -174,5 +165,5 @@
     let code = '';
     for(let i = 0; i < 6; i++) {
-        code += crypto.randomInt(0, 10);
+        code += crypto.randomInt(0, 9);
     }
     return code;
@@ -309,1630 +300,335 @@
         requireAuth(req, res, (userId) => {
             const userIdStr = String(userId);
-
-            // Check if this is the admin user (ID 000000)
-            if (userIdStr === '000000') {
-                // Admin is not a store owner
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Access denied - not a store owner' }));
-                return;
-            }
-
-            // Check if it's a personal user
-            if (userIdStr.startsWith('personal_')) {
-                const personalId = userIdStr.replace('personal_', '');
-
-                database.database.get(
-                    'SELECT boss_id FROM boss WHERE boss_id = $1',
-                    [personalId],
-                    (err, boss) => {
-                        if (err || !boss) {
-                            res.writeHead(403, { 'Content-Type': 'application/json' });
-                            res.end(JSON.stringify({ success: false, message: 'Access denied - not a store owner' }));
-                            return;
-                        }
-
-                        callback(personalId);
+            const personalId = userIdStr.replace('personal_', '');
+
+            database.database.get(
+                'SELECT boss_id FROM boss WHERE boss_id = $1',
+                [personalId],
+                (err, boss) => {
+                    if (err || !boss) {
+                        res.writeHead(403, { 'Content-Type': 'application/json' });
+                        res.end(JSON.stringify({ success: false, message: 'Access denied - not a store owner' }));
+                        return;
                     }
-                );
-            } else {
-                // Not a personal user, so not a store owner
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Access denied - not a store owner' }));
-            }
+
+                    callback(personalId);
+                }
+            );
         });
     };
 }
 
-
-
-const pool = new Pool({
-    connectionString: process.env.DATABASE_URL,
-    host: process.env.PGHOST || process.env.DB_HOST || 'localhost',
-    port: Number(process.env.PGPORT || process.env.DB_PORT || 5432),
-    user: process.env.PGUSER || process.env.DB_USER || 'postgres',
-    password: process.env.PGPASSWORD || process.env.DB_PASSWORD || '',
-    database: process.env.PGDATABASE || process.env.DB_NAME || 'handcraft_marketplace',
-    max: Number(process.env.PG_POOL_MAX || 10),
-    idleTimeoutMillis: 30000
-});
-
-const transactionStorage = new AsyncLocalStorage();
-
-function dbQuery(sql, params = [], callback) {
-    const client = transactionStorage.getStore() || pool;
-
-    client.query(sql, params)
-        .then(result => callback(null, result))
-        .catch(err => callback(err));
+// Database initialization function
+async function initializeDatabase() {
+    console.log('🔍 Checking database schema...');
+
+    // List of all required tables
+    const requiredTables = [
+        'client',
+        'store',
+        'category',
+        'users',
+        'personal',
+        'product',
+        'boss',
+        'employees',
+        'works_in_store',
+        'permissions',
+        'order',
+        'order_items',
+        'review',
+        'request',
+        'refund',
+        'report',
+        'audit_log',
+        'color',
+        'image',
+        'delivery_address',
+        'roles',
+        'user_roles'
+    ];
+
+    try {
+        // Check if all tables exist
+        const checkTablesQuery = `
+            SELECT table_name
+            FROM information_schema.tables
+            WHERE table_schema = 'public'
+        `;
+
+        const result = await new Promise((resolve, reject) => {
+            database.database.all(checkTablesQuery, [], (err, rows) => {
+                if (err) reject(err);
+                else resolve(rows || []);
+            });
+        });
+
+        const existingTables = result.map(row => row.table_name);
+        const missingTables = requiredTables.filter(table => !existingTables.includes(table));
+
+        if (missingTables.length > 0) {
+            console.log(`⚠️ Missing tables: ${missingTables.join(', ')}`);
+            console.log('🔄 Recreating entire database...');
+
+            // Drop all tables in correct order (respecting foreign keys)
+            await dropAllTables();
+
+            // Create all tables
+            await createAllTables();
+
+            // Create indexes
+            await createIndexes();
+
+            // Insert initial data
+            await insertInitialData();
+
+            console.log('✅ Database recreation completed');
+        } else {
+            console.log('✅ All required tables exist');
+        }
+    } catch (err) {
+        console.error('❌ Error checking database schema:', err);
+        console.log('⚠️ Attempting to recreate database anyway...');
+
+        try {
+            await dropAllTables();
+            await createAllTables();
+            await createIndexes();
+            await insertInitialData();
+            console.log('✅ Database recreation completed');
+        } catch (createErr) {
+            console.error('❌ Failed to recreate database:', createErr);
+        }
+    }
 }
 
-const REPORT_FUNCTIONS_SQL = String.raw`
--- ============================================================
--- HANDCRAFT MARKETPLACE REPORT FUNCTIONS
--- PostgreSQL / exact project schema
--- ============================================================
-
-CREATE OR REPLACE FUNCTION get_orders_by_total()
-RETURNS TABLE (
-    order_num VARCHAR(11),
-    client_id INTEGER,
-    client_name TEXT,
-    order_quantity BIGINT,
-    order_status VARCHAR(20),
-    payment_method VARCHAR(250),
-    discount NUMERIC,
-    order_total NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        o.order_num,
-        o.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name) AS client_name,
-        COALESCE(SUM(i.quantity), 0)::BIGINT AS order_quantity,
-        o.status,
-        o.payment_method,
-        COALESCE(o.discount, 0)::NUMERIC AS discount,
-        ROUND(
-            COALESCE(SUM(p.price * i.quantity), 0)
-            * (1 - COALESCE(o.discount, 0) / 100.0),
-            2
-        ) AS order_total
-    FROM "order" o
-    LEFT JOIN client c ON c.client_id = o.client_id
-    LEFT JOIN includes i ON i.order_num = o.order_num
-    LEFT JOIN product p ON p.code = i.product_code
-    GROUP BY
-        o.order_num, o.client_id, c.first_name, c.last_name,
-        o.status, o.payment_method, o.discount
-    ORDER BY 8 DESC, o.order_num;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_by_total_sales()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.price::NUMERIC,
-        COUNT(DISTINCT i.order_num) AS number_of_orders,
-        COALESCE(SUM(i.quantity), 0)::BIGINT AS total_quantity_sold,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        ) AS total_revenue
-    FROM product p
-    LEFT JOIN includes i ON i.product_code = p.code
-    LEFT JOIN "order" o ON o.order_num = i.order_num
-    GROUP BY p.code, p.description, p.price
-    ORDER BY 4 DESC, 5 DESC, 6 DESC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_low_stock_high_demand_products(
-    p_stock_threshold INTEGER,
-    p_demand_threshold INTEGER
-)
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    current_stock INTEGER,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.availability,
-        COUNT(DISTINCT i.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    GROUP BY p.code, p.description, p.availability
-    HAVING
-        p.availability < p_stock_threshold
-        AND COUNT(DISTINCT i.order_num) >= p_demand_threshold
-    ORDER BY 4 DESC, 5 DESC, 3 ASC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_monthly_sales()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    year INTEGER,
-    month INTEGER,
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        EXTRACT(YEAR FROM o.last_date_mod)::INTEGER,
-        EXTRACT(MONTH FROM o.last_date_mod)::INTEGER,
-        COUNT(DISTINCT o.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        )
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    JOIN "order" o ON o.order_num = i.order_num
-    GROUP BY
-        p.code, p.description,
-        EXTRACT(YEAR FROM o.last_date_mod),
-        EXTRACT(MONTH FROM o.last_date_mod)
-    ORDER BY 3 DESC, 4 DESC, 7 DESC;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_last_calendar_year_revenue()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    number_of_orders BIGINT,
-    total_quantity_sold BIGINT,
-    total_revenue NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COUNT(DISTINCT o.order_num),
-        COALESCE(SUM(i.quantity), 0)::BIGINT,
-        ROUND(
-            COALESCE(
-                SUM(
-                    p.price * i.quantity
-                    * (1 - COALESCE(o.discount, 0) / 100.0)
-                ),
-                0
-            ),
-            2
-        )
-    FROM store s
-    LEFT JOIN sells se ON se.store_id = s.store_id
-    LEFT JOIN product p ON p.code = se.product_code
-    LEFT JOIN includes i ON i.product_code = p.code
-    LEFT JOIN "order" o
-        ON o.order_num = i.order_num
-       AND o.last_date_mod >= DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 year'
-       AND o.last_date_mod < DATE_TRUNC('year', CURRENT_DATE)
-    GROUP BY s.store_id, s.name
-    ORDER BY 5 DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_never_ordered()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    current_stock INTEGER
-)
-LANGUAGE sql
-AS $$
-    SELECT p.code, p.description, p.price::NUMERIC, p.availability
-    FROM product p
-    WHERE NOT EXISTS (
-        SELECT 1
-        FROM includes i
-        WHERE i.product_code = p.code
-    )
-    ORDER BY p.code;
-$$;
-
-CREATE OR REPLACE FUNCTION get_products_by_number_of_orders()
-RETURNS TABLE (
-    product_code VARCHAR(8),
-    product_description VARCHAR(500),
-    product_price NUMERIC,
-    number_of_orders BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        p.code,
-        p.description,
-        p.price::NUMERIC,
-        COUNT(DISTINCT i.order_num)
-    FROM product p
-    JOIN includes i ON i.product_code = p.code
-    GROUP BY p.code, p.description, p.price
-    ORDER BY 4 DESC, p.code;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_average_review()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    average_review NUMERIC,
-    number_of_reviews BIGINT
-)
-LANGUAGE sql
-AS $$
-    WITH store_reviews AS (
-        SELECT DISTINCT
-            s.store_id,
-            s.name AS store_name,
-            r.order_num,
-            r.rating
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN review r ON r.order_num = i.order_num
-    )
-    SELECT
-        s.store_id,
-        s.name,
-        COALESCE(ROUND(AVG(sr.rating), 2), 0)::NUMERIC,
-        COUNT(sr.order_num)
-    FROM store s
-    LEFT JOIN store_reviews sr ON sr.store_id = s.store_id
-    GROUP BY s.store_id, s.name
-    ORDER BY 3 DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_store_with_highest_revenue_growth()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    previous_year_revenue NUMERIC,
-    last_year_revenue NUMERIC,
-    revenue_growth NUMERIC
-)
-LANGUAGE sql
-AS $$
-    WITH store_years AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            EXTRACT(YEAR FROM o.last_date_mod)::INTEGER AS sales_year,
-            SUM(
-                p.price * i.quantity
-                * (1 - COALESCE(o.discount, 0) / 100.0)
-            ) AS revenue
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN product p ON p.code = i.product_code
-        JOIN "order" o ON o.order_num = i.order_num
-        WHERE o.last_date_mod >= DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '2 years'
-          AND o.last_date_mod < DATE_TRUNC('year', CURRENT_DATE)
-        GROUP BY s.store_id, s.name, EXTRACT(YEAR FROM o.last_date_mod)
-    ),
-    comparison AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            COALESCE(MAX(CASE
-                WHEN sy.sales_year = EXTRACT(YEAR FROM CURRENT_DATE)::INTEGER - 2
-                THEN sy.revenue ELSE 0 END), 0) AS previous_year_revenue,
-            COALESCE(MAX(CASE
-                WHEN sy.sales_year = EXTRACT(YEAR FROM CURRENT_DATE)::INTEGER - 1
-                THEN sy.revenue ELSE 0 END), 0) AS last_year_revenue
-        FROM store s
-        LEFT JOIN store_years sy ON sy.store_id = s.store_id
-        GROUP BY s.store_id, s.name
-    )
-    SELECT
-        store_id,
-        store_name,
-        ROUND(previous_year_revenue, 2),
-        ROUND(last_year_revenue, 2),
-        ROUND(last_year_revenue - previous_year_revenue, 2)
-    FROM comparison
-    ORDER BY 5 DESC, store_id
-    LIMIT 1;
-$$;
-
-CREATE OR REPLACE FUNCTION get_clients_by_number_of_orders()
-RETURNS TABLE (
-    client_id INTEGER,
-    client_name TEXT,
-    number_of_orders BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        c.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name),
-        COUNT(o.order_num)
-    FROM client c
-    JOIN "order" o ON o.client_id = c.client_id
-    GROUP BY c.client_id, c.first_name, c.last_name
-    ORDER BY 3 DESC, c.client_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_approximate_orders_per_client()
-RETURNS TABLE (
-    total_clients BIGINT,
-    total_orders BIGINT,
-    approximate_orders_per_client NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        (SELECT COUNT(*) FROM client),
-        (SELECT COUNT(*) FROM "order"),
-        ROUND(
-            (SELECT COUNT(*)::NUMERIC FROM "order")
-            / NULLIF((SELECT COUNT(*) FROM client), 0),
-            2
-        );
-$$;
-
-CREATE OR REPLACE FUNCTION get_clients_without_orders()
-RETURNS TABLE (
-    client_id INTEGER,
-    client_name TEXT,
-    email VARCHAR(50)
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        c.client_id,
-        CONCAT_WS(' ', c.first_name, c.last_name),
-        c.email
-    FROM client c
-    WHERE NOT EXISTS (
-        SELECT 1 FROM "order" o WHERE o.client_id = c.client_id
-    )
-    ORDER BY c.client_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_store_request_statistics()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    total_requests BIGINT,
-    solved_requests BIGINT,
-    requests_in_progress BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COUNT(r.request_num),
-        COUNT(r.request_num) FILTER (WHERE r.customer_satisfaction > 0),
-        COUNT(r.request_num) FILTER (WHERE r.customer_satisfaction <= 0)
-    FROM store s
-    LEFT JOIN for_store fs ON fs.store_id = s.store_id
-    LEFT JOIN request r ON r.request_num = fs.request_num
-    GROUP BY s.store_id, s.name
-    ORDER BY 3 DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_top_10_employees_by_requests_last_month()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    number_of_requests BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COUNT(DISTINCT a.request_num)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    JOIN answers a ON a.personal_id = e.employee_id
-    JOIN request r ON r.request_num = a.request_num
-    WHERE r.date_and_time >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-      AND r.date_and_time < DATE_TRUNC('month', CURRENT_DATE)
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY 3 DESC, e.employee_id
-    LIMIT 10;
-$$;
-
-CREATE OR REPLACE FUNCTION get_employees_by_hours_and_pay()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    total_hours_worked NUMERIC,
-    total_pay NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COALESCE(SUM(w.total_hours), 0),
-        COALESCE(SUM(w.wage * w.total_hours), 0)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    LEFT JOIN worked w ON w.personal_id = e.employee_id
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY 3 DESC, 4 DESC, e.employee_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_average_pay()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    average_pay NUMERIC
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        s.store_id,
-        s.name,
-        COALESCE(ROUND(AVG(w.wage), 2), 0)
-    FROM store s
-    LEFT JOIN worked w ON w.store_id = s.store_id
-    GROUP BY s.store_id, s.name
-    ORDER BY 3 DESC, s.store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_employee_product_changes_last_month()
-RETURNS TABLE (
-    employee_id VARCHAR(10),
-    employee_name TEXT,
-    number_of_product_changes BIGINT
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        e.employee_id,
-        CONCAT_WS(' ', p.first_name, p.last_name),
-        COUNT(mc.change_date_time)
-    FROM employees e
-    JOIN personal p ON p.id = e.employee_id
-    LEFT JOIN makes_change mc
-        ON mc.personal_id = e.employee_id
-       AND mc.change_date_time >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-       AND mc.change_date_time < DATE_TRUNC('month', CURRENT_DATE)
-    GROUP BY e.employee_id, p.first_name, p.last_name
-    ORDER BY 3 DESC, e.employee_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_stores_by_monthly_profit_and_revenue_growth()
-RETURNS TABLE (
-    store_id VARCHAR(3),
-    store_name VARCHAR(50),
-    month_and_year TEXT,
-    monthly_profit NUMERIC,
-    previous_month_revenue NUMERIC,
-    current_month_revenue NUMERIC,
-    revenue_growth NUMERIC
-)
-LANGUAGE sql
-AS $$
-    WITH monthly_revenue AS (
-        SELECT
-            s.store_id,
-            s.name AS store_name,
-            DATE_TRUNC('month', o.last_date_mod)::DATE AS month_date,
-            SUM(
-                p.price * i.quantity
-                * (1 - COALESCE(o.discount, 0) / 100.0)
-            ) AS revenue
-        FROM store s
-        JOIN sells se ON se.store_id = s.store_id
-        JOIN includes i ON i.product_code = se.product_code
-        JOIN product p ON p.code = i.product_code
-        JOIN "order" o ON o.order_num = i.order_num
-        GROUP BY s.store_id, s.name, DATE_TRUNC('month', o.last_date_mod)
-    ),
-    with_previous AS (
-        SELECT
-            store_id,
-            store_name,
-            month_date,
-            revenue,
-            LAG(revenue) OVER (
-                PARTITION BY store_id
-                ORDER BY month_date
-            ) AS previous_revenue
-        FROM monthly_revenue
-    )
-    SELECT
-        store_id,
-        store_name,
-        TO_CHAR(month_date, 'YYYY-MM'),
-        ROUND(revenue, 2),
-        ROUND(COALESCE(previous_revenue, 0), 2),
-        ROUND(revenue, 2),
-        ROUND(revenue - COALESCE(previous_revenue, 0), 2)
-    FROM with_previous
-    ORDER BY month_date DESC, 4 DESC, store_id;
-$$;
-
-CREATE OR REPLACE FUNCTION get_unapproved_reports()
-RETURNS TABLE (
-    report_date TIMESTAMP,
-    store_id VARCHAR(3),
-    overall_profit NUMERIC,
-    sales_trend VARCHAR(100),
-    marketing_growth VARCHAR(100),
-    owner_signature VARCHAR(50)
-)
-LANGUAGE sql
-AS $$
-    SELECT
-        r.date,
-        r.store_id,
-        r.overall_profit,
-        r.sales_trend,
-        r.marketing_growth,
-        r.owner_signature
-    FROM report r
-    LEFT JOIN approves a
-        ON a.report_date = r.date
-       AND a.store_id = r.store_id
-    WHERE a.report_date IS NULL
-    ORDER BY r.date DESC, r.store_id;
-$$;
-`;
-
-
-const TRIGGERS_SQL = String.raw`
--- ============================================================
--- HANDCRAFT MARKETPLACE TRIGGERS
--- Compatible with the supplied project schema.
--- ============================================================
-
-CREATE OR REPLACE FUNCTION update_store_rating()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-DECLARE
-    v_order_num VARCHAR(11);
-    v_store_id VARCHAR(3);
-BEGIN
-    IF TG_OP = 'DELETE' THEN
-        v_order_num := OLD.order_num;
-    ELSE
-        v_order_num := NEW.order_num;
-    END IF;
-
-    v_store_id := LEFT(v_order_num, 3);
-
-    UPDATE store s
-    SET rating = COALESCE(
-        (
-            SELECT ROUND(AVG(r.rating), 1)
-            FROM review r
-            JOIN includes i
-              ON i.order_num = r.order_num
-            JOIN sells sl
-              ON sl.product_code = i.product_code
-             AND sl.store_ID = v_store_id
-            JOIN "order" o
-              ON o.order_num = r.order_num
-            WHERE LEFT(o.order_num, 3) = v_store_id
-        ),
-        0
-    )
-    WHERE s.store_ID = v_store_id;
-
-    RETURN NULL;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_update_store_rating ON review;
-
-CREATE TRIGGER trg_update_store_rating
-AFTER INSERT OR UPDATE OR DELETE
-ON review
-FOR EACH ROW
-EXECUTE FUNCTION update_store_rating();
-
-
-CREATE OR REPLACE FUNCTION check_product_availability()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-DECLARE
-    v_available_quantity INTEGER;
-BEGIN
-    SELECT p.availability
-    INTO v_available_quantity
-    FROM product p
-    WHERE p.code = NEW.product_code
-    FOR UPDATE;
-
-    IF v_available_quantity IS NULL THEN
-        RAISE EXCEPTION
-            'Product % does not exist or is not available.',
-            NEW.product_code;
-    END IF;
-
-    IF TG_OP = 'INSERT' THEN
-        IF NEW.quantity > v_available_quantity THEN
-            RAISE EXCEPTION
-                'Insufficient stock for product %. Available: %, requested: %.',
-                NEW.product_code,
-                v_available_quantity,
-                NEW.quantity;
-        END IF;
-
-    ELSIF TG_OP = 'UPDATE' THEN
-        IF NEW.product_code = OLD.product_code THEN
-            IF NEW.quantity > OLD.quantity
-               AND (NEW.quantity - OLD.quantity) > v_available_quantity THEN
-                RAISE EXCEPTION
-                    'Insufficient stock for product %. Available: %, additional requested: %.',
-                    NEW.product_code,
-                    v_available_quantity,
-                    NEW.quantity - OLD.quantity;
-            END IF;
-        ELSE
-            IF NEW.quantity > v_available_quantity THEN
-                RAISE EXCEPTION
-                    'Insufficient stock for product %. Available: %, requested: %.',
-                    NEW.product_code,
-                    v_available_quantity,
-                    NEW.quantity;
-            END IF;
-        END IF;
-    END IF;
-
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_check_product_availability ON includes;
-
-CREATE TRIGGER trg_check_product_availability
-BEFORE INSERT OR UPDATE
-ON includes
-FOR EACH ROW
-EXECUTE FUNCTION check_product_availability();
-
-
-CREATE OR REPLACE FUNCTION update_product_availability()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-BEGIN
-    IF TG_OP = 'INSERT' THEN
-
-        UPDATE product
-        SET availability = availability - NEW.quantity
-        WHERE code = NEW.product_code;
-
-    ELSIF TG_OP = 'UPDATE' THEN
-
-        IF NEW.product_code = OLD.product_code THEN
-
-            UPDATE product
-            SET availability = availability - (NEW.quantity - OLD.quantity)
-            WHERE code = NEW.product_code;
-
-        ELSE
-
-            UPDATE product
-            SET availability = availability + OLD.quantity
-            WHERE code = OLD.product_code;
-
-            UPDATE product
-            SET availability = availability - NEW.quantity
-            WHERE code = NEW.product_code;
-
-        END IF;
-
-    ELSIF TG_OP = 'DELETE' THEN
-
-        UPDATE product
-        SET availability = availability + OLD.quantity
-        WHERE code = OLD.product_code;
-
-    END IF;
-
-    RETURN NULL;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_update_product_availability ON includes;
-
-CREATE TRIGGER trg_update_product_availability
-AFTER INSERT OR UPDATE OR DELETE
-ON includes
-FOR EACH ROW
-EXECUTE FUNCTION update_product_availability();
-
-
-CREATE OR REPLACE FUNCTION delete_product_changes()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-BEGIN
-    DELETE FROM "change"
-    WHERE product_code = OLD.code;
-
-    RETURN OLD;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_delete_product_changes ON product;
-
-CREATE TRIGGER trg_delete_product_changes
-BEFORE DELETE
-ON product
-FOR EACH ROW
-EXECUTE FUNCTION delete_product_changes();
-
-
-CREATE OR REPLACE FUNCTION prevent_store_deletion()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-BEGIN
-    IF EXISTS (
-        SELECT 1
-        FROM report
-        WHERE store_ID = OLD.store_ID
-    ) THEN
-        RAISE EXCEPTION
-            'Store % cannot be deleted because it has existing reports.',
-            OLD.store_ID;
-    END IF;
-
-    IF EXISTS (
-        SELECT 1
-        FROM sells
-        WHERE store_ID = OLD.store_ID
-    ) THEN
-        RAISE EXCEPTION
-            'Store % cannot be deleted because it has existing product records.',
-            OLD.store_ID;
-    END IF;
-
-    IF EXISTS (
-        SELECT 1
-        FROM "order"
-        WHERE LEFT(order_num, 3) = OLD.store_ID
-    ) THEN
-        RAISE EXCEPTION
-            'Store % cannot be deleted because it has existing orders.',
-            OLD.store_ID;
-    END IF;
-
-    RETURN OLD;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_prevent_store_deletion ON store;
-
-CREATE TRIGGER trg_prevent_store_deletion
-BEFORE DELETE
-ON store
-FOR EACH ROW
-EXECUTE FUNCTION prevent_store_deletion();
-
-
-CREATE OR REPLACE FUNCTION update_order_modified_date()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-BEGIN
-    NEW.last_date_mod := CURRENT_TIMESTAMP;
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_update_order_modified_date ON "order";
-
-CREATE TRIGGER trg_update_order_modified_date
-BEFORE UPDATE
-ON "order"
-FOR EACH ROW
-EXECUTE FUNCTION update_order_modified_date();
-
-
-CREATE OR REPLACE FUNCTION validate_employee_authorization()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-DECLARE
-    v_authorisation TEXT;
-BEGIN
-    SELECT p.authorisation
-    INTO v_authorisation
-    FROM permissions p
-    WHERE p.personal_id = NEW.personal_id;
-
-    IF v_authorisation IS NULL THEN
-        RAISE EXCEPTION
-            'Employee % does not have valid authorization.',
-            NEW.personal_id;
-    END IF;
-
-    -- makes_change has no authorisation column in the supplied schema.
-    -- The employee's permission row is therefore the source of truth.
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_validate_employee_authorization ON makes_change;
-
-CREATE TRIGGER trg_validate_employee_authorization
-BEFORE INSERT OR UPDATE
-ON makes_change
-FOR EACH ROW
-EXECUTE FUNCTION validate_employee_authorization();
-
-
-CREATE OR REPLACE FUNCTION initialize_employee_statistics()
-RETURNS TRIGGER
-LANGUAGE plpgsql
-AS $$
-BEGIN
-    /*
-     * The schema creates an employee before store/report assignment in the
-     * normal application flow. If an assignment and a report already exist,
-     * create a zero-hours starting record; otherwise there is nothing to
-     * initialize yet.
-     */
-    INSERT INTO worked (
-        personal_id,
-        report_date,
-        store_ID,
-        wage,
-        pay_method,
-        total_hours,
-        week
-    )
-    SELECT
-        NEW.employee_id,
-        r.date,
-        wis.store_ID,
-        0,
-        'full_time',
-        0,
-        TO_CHAR(CURRENT_DATE - INTERVAL '6 days', 'DD.MM.YYYY')
-            || ' - ' ||
-        TO_CHAR(CURRENT_DATE, 'DD.MM.YYYY')
-    FROM works_in_store wis
-    JOIN LATERAL (
-        SELECT r2.date
-        FROM report r2
-        WHERE r2.store_ID = wis.store_ID
-        ORDER BY r2.date DESC
-        LIMIT 1
-    ) r ON TRUE
-    WHERE wis.personal_id = NEW.employee_id
-    ON CONFLICT (personal_id, report_date, store_ID) DO NOTHING;
-
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trg_initialize_employee_statistics ON employees;
-
-CREATE TRIGGER trg_initialize_employee_statistics
-AFTER INSERT
-ON employees
-FOR EACH ROW
-EXECUTE FUNCTION initialize_employee_statistics();
-`;
-
-
-const VIEWS_SQL = String.raw`
--- ============================================================
--- HANDCRAFT MARKETPLACE VIEWS
--- Compatible with the supplied project schema.
--- ============================================================
-
-DROP VIEW IF EXISTS vw_product_store_overview;
-CREATE VIEW vw_product_store_overview AS
-SELECT
-    p.code AS product_code,
-    p.description,
-    p.price,
-    p.availability,
-    p.weight,
-    p.width_x_length_x_depth,
-    p.aprox_production_time,
-    s.store_ID,
-    s.name AS store_name,
-    s.physical_address,
-    s.rating,
-    sl.discount
-FROM product p
-JOIN sells sl
-    ON sl.product_code = p.code
-JOIN store s
-    ON s.store_ID = sl.store_ID;
-
-
-DROP VIEW IF EXISTS vw_customer_order_overview;
-CREATE VIEW vw_customer_order_overview AS
-SELECT
-    o.order_num,
-    i.quantity,
-    o.status,
-    o.last_date_mod,
-    o.payment_method,
-    o.discount,
-    c.client_ID,
-    c.first_name,
-    c.last_name,
-    c.email,
-    p.code AS product_code,
-    p.description AS product_description,
-    p.price
-FROM "order" o
-JOIN makes_request mr
-    ON mr.order_num = o.order_num
-JOIN client c
-    ON c.client_ID = mr.client_ID
-JOIN includes i
-    ON i.order_num = o.order_num
-JOIN product p
-    ON p.code = i.product_code;
-
-
-DROP VIEW IF EXISTS vw_monthly_sales_profit;
-CREATE VIEW vw_monthly_sales_profit AS
-SELECT
-    s.store_ID,
-    s.name AS store_name,
-    r.date AS report_date,
-    mp.month_and_year,
-    mp.profit,
-    r.overall_profit,
-    ed.monthly_profit,
-    ed.sales,
-    ed.damages
-FROM store s
-JOIN report r
-    ON r.store_ID = s.store_ID
-LEFT JOIN monthly_profit mp
-    ON mp.report_date = r.date
-   AND mp.store_ID = r.store_ID
-LEFT JOIN exchanges_data ed
-    ON ed.report_date = r.date
-   AND ed.store_ID = r.store_ID;
-
-
-DROP VIEW IF EXISTS vw_employee_workload_salary;
-CREATE VIEW vw_employee_workload_salary AS
-SELECT
-    e.employee_id,
-    p.first_name,
-    p.last_name,
-    p.email,
-    e.date_of_hire,
-    s.store_ID,
-    s.name AS store_name,
-    w.week,
-    w.total_hours,
-    w.wage,
-    w.pay_method,
-    COALESCE(w.wage * w.total_hours, 0) AS total_pay
-FROM employees e
-JOIN personal p
-    ON p.id = e.employee_id
-JOIN works_in_store wis
-    ON wis.personal_id = e.employee_id
-JOIN store s
-    ON s.store_ID = wis.store_ID
-LEFT JOIN worked w
-    ON w.personal_id = e.employee_id
-   AND w.store_ID = wis.store_ID;
-
-
-DROP VIEW IF EXISTS vw_customer_request_response;
-CREATE VIEW vw_customer_request_response AS
-SELECT
-    r.request_num,
-    r.date_and_time,
-    r.problem,
-    r.notes_of_communication,
-    r.customer_satisfaction,
-    c.client_ID,
-    c.first_name AS client_first_name,
-    c.last_name AS client_last_name,
-    c.email AS client_email,
-    p.id AS employee_id,
-    p.first_name AS employee_first_name,
-    p.last_name AS employee_last_name
-FROM request r
-LEFT JOIN client c
-    ON c.client_ID = CASE
-        WHEN SUBSTRING(r.request_num FROM 9 FOR 4) ~ '^[0-9]{4}$'
-        THEN SUBSTRING(r.request_num FROM 9 FOR 4)::INTEGER
-        ELSE NULL
-    END
-LEFT JOIN answers a
-    ON a.request_num = r.request_num
-LEFT JOIN personal p
-    ON p.id = a.personal_id;
-
-
-DROP VIEW IF EXISTS vw_store_inventory;
-CREATE VIEW vw_store_inventory AS
-SELECT
-    s.store_ID,
-    s.name AS store_name,
-    p.code AS product_code,
-    p.description,
-    p.price,
-    p.availability,
-    p.aprox_production_time,
-    sl.discount
-FROM store s
-JOIN sells sl
-    ON sl.store_ID = s.store_ID
-JOIN product p
-    ON p.code = sl.product_code;
-
-
-DROP VIEW IF EXISTS vw_customer_order_history;
-CREATE VIEW vw_customer_order_history AS
-SELECT
-    c.client_ID,
-    c.first_name,
-    c.last_name,
-    c.email,
-    o.order_num,
-    i.quantity,
-    o.status,
-    o.last_date_mod,
-    o.payment_method,
-    o.discount,
-    p.code AS product_code,
-    p.description AS product_description,
-    p.price
-FROM client c
-JOIN makes_request mr
-    ON mr.client_ID = c.client_ID
-JOIN "order" o
-    ON o.order_num = mr.order_num
-JOIN includes i
-    ON i.order_num = o.order_num
-JOIN product p
-    ON p.code = i.product_code;
-
-
-DROP VIEW IF EXISTS vw_store_performance;
-CREATE VIEW vw_store_performance AS
-SELECT
-    s.store_ID,
-    s.name AS store_name,
-    s.date_of_founding,
-    s.rating,
-    COUNT(DISTINCT r.date) AS number_of_reports,
-    COALESCE(SUM(mp.profit), 0) AS total_reported_profit,
-    COALESCE(MAX(r.overall_profit), 0) AS overall_profit,
-    COALESCE(SUM(ed.sales), 0) AS total_sales,
-    COALESCE(SUM(ed.damages), 0) AS total_damages,
-    COALESCE(SUM(ed.monthly_profit), 0) AS total_monthly_profit
-FROM store s
-LEFT JOIN report r
-    ON r.store_ID = s.store_ID
-LEFT JOIN monthly_profit mp
-    ON mp.report_date = r.date
-   AND mp.store_ID = r.store_ID
-LEFT JOIN exchanges_data ed
-    ON ed.report_date = r.date
-   AND ed.store_ID = r.store_ID
-GROUP BY
-    s.store_ID,
-    s.name,
-    s.date_of_founding,
-    s.rating;
-`;
-
-
-const database = {
-    database: {
-        get(sql, params, callback) {
-            if (typeof params === 'function') {
-                callback = params;
-                params = [];
-            }
-            dbQuery(sql, params || [], (err, result) => {
-                callback(err, result && result.rows ? result.rows[0] : undefined);
-            });
-        },
-        all(sql, params, callback) {
-            if (typeof params === 'function') {
-                callback = params;
-                params = [];
-            }
-            dbQuery(sql, params || [], (err, result) => {
-                callback(err, result ? result.rows : []);
-            });
-        },
-        run(sql, params, callback) {
-            if (typeof params === 'function') {
-                callback = params;
-                params = [];
-            }
-            const normalized = String(sql).trim().replace(/;\s*$/, '').toUpperCase();
-
-            if (normalized === 'BEGIN TRANSACTION' || normalized === 'BEGIN') {
-                const existingClient = transactionStorage.getStore();
-
-                // A transaction is already active in this async execution context.
-                // Do not create a second transaction on the same request.
-                if (existingClient) {
-                    callback?.(null);
-                    return;
-                }
-
-                pool.connect()
-                    .then(client => {
-                        return client.query('BEGIN')
-                            .then(() => {
-                                // Everything scheduled by the callback now inherits
-                                // this client through AsyncLocalStorage. Other
-                                // concurrent requests get their own transaction.
-                                transactionStorage.run(client, () => {
-                                    callback?.(null);
-                                });
-                            })
-                            .catch(err => {
-                                client.release();
-                                callback?.(err);
-                            });
-                    })
-                    .catch(err => {
-                        callback?.(err);
-                    });
-
-                return;
-            }
-
-            if (normalized === 'COMMIT') {
-                const client = transactionStorage.getStore();
-
-                if (!client) {
-                    callback?.(null);
-                    return;
-                }
-
-                client.query('COMMIT')
-                    .then(() => {
-                        client.release();
-                        callback?.(null);
-                    })
-                    .catch(err => {
-                        // COMMIT may fail before the transaction is completed.
-                        // Roll back before releasing the client when possible.
-                        client.query('ROLLBACK')
-                            .catch(() => {})
-                            .then(() => {
-                                client.release();
-                                callback?.(err);
-                            });
-                    });
-
-                return;
-            }
-
-            if (normalized === 'ROLLBACK') {
-                const client = transactionStorage.getStore();
-
-                if (!client) {
-                    callback?.(null);
-                    return;
-                }
-
-                client.query('ROLLBACK')
-                    .then(() => {
-                        client.release();
-                        callback?.(null);
-                    })
-                    .catch(err => {
-                        client.release();
-                        callback?.(err);
-                    });
-
-                return;
-            }
-
-            dbQuery(sql, params || [], (err, result) => {
-                if (callback) {
-                    callback.call(
-                        { changes: result ? result.rowCount : 0, lastID: result?.rows?.[0]?.id },
-                        err
-                    );
-                }
+function dropAllTables() {
+    return new Promise((resolve, reject) => {
+        console.log('🗑️ Dropping all tables...');
+
+        // Drop in reverse order of creation (respect foreign keys)
+        const dropQueries = [
+            'DROP TABLE IF EXISTS user_roles CASCADE',
+            'DROP TABLE IF EXISTS roles CASCADE',
+            'DROP TABLE IF EXISTS delivery_address CASCADE',
+            'DROP TABLE IF EXISTS image CASCADE',
+            'DROP TABLE IF EXISTS color CASCADE',
+            'DROP TABLE IF EXISTS audit_log CASCADE',
+            'DROP TABLE IF EXISTS report CASCADE',
+            'DROP TABLE IF EXISTS refund CASCADE',
+            'DROP TABLE IF EXISTS request CASCADE',
+            'DROP TABLE IF EXISTS review CASCADE',
+            'DROP TABLE IF EXISTS order_items CASCADE',
+            'DROP TABLE IF EXISTS "order" CASCADE',
+            'DROP TABLE IF EXISTS permissions CASCADE',
+            'DROP TABLE IF EXISTS works_in_store CASCADE',
+            'DROP TABLE IF EXISTS employees CASCADE',
+            'DROP TABLE IF EXISTS boss CASCADE',
+            'DROP TABLE IF EXISTS product CASCADE',
+            'DROP TABLE IF EXISTS personal CASCADE',
+            'DROP TABLE IF EXISTS users CASCADE',
+            'DROP TABLE IF EXISTS category CASCADE',
+            'DROP TABLE IF EXISTS store CASCADE',
+            'DROP TABLE IF EXISTS client CASCADE'
+        ];
+
+        let index = 0;
+
+        function runNext() {
+            if (index >= dropQueries.length) {
+                console.log('✅ All tables dropped');
+                resolve();
+                return;
+            }
+
+            database.database.run(dropQueries[index], [], (err) => {
+                if (err) {
+                    console.error(`Error dropping table: ${err.message}`);
+                    // Continue anyway
+                }
+                index++;
+                runNext();
             });
         }
-    },
-
-    async installReportFunctions() {
-        await pool.query(REPORT_FUNCTIONS_SQL);
-        console.log('✅ PostgreSQL report functions installed');
-    },
-
-    async installTriggersAndViews() {
-        await pool.query(TRIGGERS_SQL);
-        console.log('✅ PostgreSQL triggers installed');
-
-        await pool.query(VIEWS_SQL);
-        console.log('✅ PostgreSQL views installed');
-    },
-
-    runReport(reportName, params, callback) {
-        const allowed = new Set([
-            'get_orders_by_total',
-            'get_products_by_total_sales',
-            'get_low_stock_high_demand_products',
-            'get_products_monthly_sales',
-            'get_stores_by_last_calendar_year_revenue',
-            'get_products_never_ordered',
-            'get_products_by_number_of_orders',
-            'get_stores_by_average_review',
-            'get_store_with_highest_revenue_growth',
-            'get_clients_by_number_of_orders',
-            'get_approximate_orders_per_client',
-            'get_clients_without_orders',
-            'get_store_request_statistics',
-            'get_top_10_employees_by_requests_last_month',
-            'get_employees_by_hours_and_pay',
-            'get_stores_average_pay',
-            'get_employee_product_changes_last_month',
-            'get_stores_by_monthly_profit_and_revenue_growth',
-            'get_unapproved_reports'
-        ]);
-
-        if (!allowed.has(reportName)) {
-            callback(new Error('Unknown report: ' + reportName), null);
-            return;
-        }
-
-        const values = Array.isArray(params) ? params : [];
-        const placeholders = values.map((_, index) => '$' + (index + 1)).join(', ');
-
-        dbQuery(
-            `SELECT * FROM ${reportName}(${placeholders})`,
-            values,
-            (err, result) => callback(err, result?.rows || [])
-        );
-    },
-
-    async initializeDatabase() {
-        // The database supplied by the project is authoritative.  Existing tables
-        // are removed before recreation so an old incompatible schema can never
-        // survive a restart and cause CREATE TABLE IF NOT EXISTS to skip columns.
-        const schemaCompatibility = await pool.query(`
-            SELECT
-                EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema='public' AND table_name='product') AS product_exists,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='product' AND column_name='category_id') AS product_has_category,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='product' AND column_name='store_id') AS product_has_store,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='order' AND column_name='store_id') AS order_has_store,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='request' AND column_name='store_id') AS request_has_store,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='review' AND column_name='review_id') AS review_has_review_id,
-                EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='refund' AND column_name='request_date') AS refund_has_request_date
-        `);
-
-        const c = schemaCompatibility.rows[0];
-        const forceReset = String(process.env.RESET_DATABASE || '').toLowerCase() === 'true' || process.env.RESET_DATABASE === '1';
-        const schemaMismatch = !c.product_exists || !c.product_has_category || c.product_has_store || c.order_has_store || c.request_has_store || c.review_has_review_id || c.refund_has_request_date;
-        const resetDatabase = forceReset || schemaMismatch;
-
-        if (resetDatabase) {
-            console.log('🧹 Existing PostgreSQL schema is incompatible with the project schema. Recreating project tables...');
-            await pool.query(`
-                DROP TABLE IF EXISTS audit_log CASCADE;
-                DROP TABLE IF EXISTS user_roles CASCADE;
-                DROP TABLE IF EXISTS roles CASCADE;
-                DROP TABLE IF EXISTS users CASCADE;
-                DROP TABLE IF EXISTS approves CASCADE;
-                DROP TABLE IF EXISTS includes CASCADE;
-                DROP TABLE IF EXISTS sells CASCADE;
-                DROP TABLE IF EXISTS worked CASCADE;
-                DROP TABLE IF EXISTS works_in_store CASCADE;
-                DROP TABLE IF EXISTS makes_change CASCADE;
-                DROP TABLE IF EXISTS "change" CASCADE;
-                DROP TABLE IF EXISTS for_store CASCADE;
-                DROP TABLE IF EXISTS answers CASCADE;
-                DROP TABLE IF EXISTS makes_request CASCADE;
-                DROP TABLE IF EXISTS request CASCADE;
-                DROP TABLE IF EXISTS exchanges_data CASCADE;
-                DROP TABLE IF EXISTS monthly_profit CASCADE;
-                DROP TABLE IF EXISTS report CASCADE;
-                DROP TABLE IF EXISTS refund CASCADE;
-                DROP TABLE IF EXISTS review CASCADE;
-                DROP TABLE IF EXISTS "order" CASCADE;
-                DROP TABLE IF EXISTS delivery_address CASCADE;
-                DROP TABLE IF EXISTS client CASCADE;
-                DROP TABLE IF EXISTS employees CASCADE;
-                DROP TABLE IF EXISTS boss CASCADE;
-                DROP TABLE IF EXISTS permissions CASCADE;
-                DROP TABLE IF EXISTS personal CASCADE;
-                DROP TABLE IF EXISTS color CASCADE;
-                DROP TABLE IF EXISTS image CASCADE;
-                DROP TABLE IF EXISTS product CASCADE;
-                DROP TABLE IF EXISTS store CASCADE;
-                DROP TABLE IF EXISTS category CASCADE;
-            `);
-        }
-
-        const schema = `
-            CREATE TABLE IF NOT EXISTS category (
-                                                    id SERIAL PRIMARY KEY,
-                                                    name VARCHAR(50) NOT NULL,
-                parent_category_id INTEGER REFERENCES category(id) NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS product (
-                                                   code VARCHAR(8) PRIMARY KEY DEFAULT '-1',
-                price DECIMAL(10,2) NOT NULL CHECK (price >= 0.0),
-                availability INTEGER NOT NULL,
-                weight DECIMAL(5,2) NOT NULL CHECK (weight > 0),
-                width_x_length_x_depth VARCHAR(20) NOT NULL,
-                aprox_production_time INTEGER NOT NULL,
-                description VARCHAR(500) NOT NULL,
-                category_id INTEGER NOT NULL REFERENCES category(id) ON DELETE SET DEFAULT
-                );
-
-            CREATE TABLE IF NOT EXISTS image (
-                                                 product_code VARCHAR(8) REFERENCES product(code) ON DELETE CASCADE,
-                image VARCHAR NOT NULL DEFAULT 'Image NOT found!'
-                );
-
-            CREATE TABLE IF NOT EXISTS color (
-                                                 product_code VARCHAR(8) REFERENCES product(code) ON DELETE CASCADE,
-                color VARCHAR(50)
-                );
-
-            CREATE TABLE IF NOT EXISTS store (
-                                                 store_ID VARCHAR(3) PRIMARY KEY,
-                name VARCHAR(50) UNIQUE NOT NULL,
+
+        runNext();
+    });
+}
+
+function createAllTables() {
+    return new Promise((resolve, reject) => {
+        console.log('🏗️ Creating tables...');
+
+        const createQueries = [
+            // Client table (SERIAL ID starting from 1000)
+            `CREATE TABLE IF NOT EXISTS client (
+                                                   client_id SERIAL PRIMARY KEY,
+                                                   first_name VARCHAR(100) NOT NULL,
+                last_name VARCHAR(100) NOT NULL,
+                email VARCHAR(255) UNIQUE NOT NULL,
+                password VARCHAR(255) NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Store table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS store (
+                                                  store_id VARCHAR(10) PRIMARY KEY,
+                name VARCHAR(255) NOT NULL,
                 date_of_founding DATE NOT NULL,
-                physical_address VARCHAR(100) NOT NULL,
-                store_email VARCHAR(40) UNIQUE NOT NULL CHECK (store_email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$'),
-                rating DECIMAL(2,1) NOT NULL DEFAULT 0 CHECK (rating>=0.0 AND rating<=5.0)
-                );
-
-            CREATE TABLE IF NOT EXISTS personal (
-                                                    id VARCHAR(10) PRIMARY KEY,
-                first_name VARCHAR(20) NOT NULL,
-                last_name VARCHAR(20) NOT NULL,
-                ssn VARCHAR(13) NOT NULL CHECK (ssn ~ '^[0-9]{13}$'),
-                email VARCHAR(50) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$'),
-                password VARCHAR NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS permissions (
-                                                       personal_id VARCHAR(10) PRIMARY KEY REFERENCES personal(id) ON DELETE CASCADE,
-                type VARCHAR(50) NOT NULL,
-                authorisation VARCHAR(50) NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS boss (
-                                                boss_id VARCHAR(10) PRIMARY KEY REFERENCES personal(id) ON DELETE CASCADE
-                );
-
-            CREATE TABLE IF NOT EXISTS employees (
-                                                     employee_id VARCHAR(10) PRIMARY KEY REFERENCES personal(id) ON DELETE CASCADE,
-                date_of_hire DATE NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS client (
-                                                  client_ID SERIAL PRIMARY KEY,
-                                                  first_name VARCHAR(50) NOT NULL,
-                last_name VARCHAR(50) NOT NULL,
-                email VARCHAR(50) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$'),
-                password VARCHAR NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS delivery_address (
-                                                            client_ID INTEGER PRIMARY KEY REFERENCES client(client_ID) ON DELETE CASCADE,
-                address VARCHAR(200) NOT NULL,
-                city VARCHAR(30) NOT NULL,
-                postcode VARCHAR(20) NOT NULL,
-                country VARCHAR(40) NOT NULL,
-                is_default BOOLEAN DEFAULT TRUE
-                );
-
-            CREATE TABLE IF NOT EXISTS "order" (
-                                                   order_num VARCHAR(11) PRIMARY KEY,
-                client_ID INTEGER REFERENCES client(client_ID) ON DELETE CASCADE,
-                status VARCHAR(20) NOT NULL DEFAULT 'placed order',
-                last_date_mod TIMESTAMP NOT NULL,
-                payment_method VARCHAR(250) NOT NULL,
-                discount DECIMAL(5,2) DEFAULT 0.0 CHECK(discount>=0.0 AND discount<=100.00),
-                CONSTRAINT check_status CHECK (status IN ('placed order', 'being processed', 'shipping', 'delivered', 'canceled'))
-                );
-
-            CREATE TABLE IF NOT EXISTS review (
-                                                  order_num VARCHAR(11) PRIMARY KEY REFERENCES "order"(order_num) ON DELETE CASCADE,
-                comment VARCHAR(300),
-                rating DECIMAL(2,1) NOT NULL CHECK(rating>=0.0 AND rating<=5.0),
-                last_mod_date TIMESTAMP NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS refund (
-                                                  refund_id SERIAL PRIMARY KEY,
-                                                  order_num VARCHAR(11) REFERENCES "order"(order_num) ON DELETE CASCADE,
-                reason VARCHAR(300),
-                amount DECIMAL(5,2) NOT NULL,
-                status VARCHAR(100) NOT NULL DEFAULT 'requested refund',
-                CONSTRAINT check_refund_status CHECK (status IN ('requested refund', 'being reviewed', 'approved', 'not approved', 'processed'))
-                );
-
-            CREATE TABLE IF NOT EXISTS report (
-                                                  date TIMESTAMP NOT NULL,
-                                                  store_ID VARCHAR(3) NOT NULL REFERENCES store(store_ID) ON DELETE CASCADE,
-                overall_profit NUMERIC NOT NULL DEFAULT 0.0 CHECK(overall_profit>=0),
-                sales_trend VARCHAR(100) NOT NULL,
-                marketing_growth VARCHAR(100) NOT NULL,
-                owner_signature VARCHAR(50) NOT NULL DEFAULT 'Not signed yet',
-                PRIMARY KEY (date, store_ID)
-                );
-
-            CREATE TABLE IF NOT EXISTS monthly_profit (
-                                                          report_date TIMESTAMP NOT NULL,
-                                                          store_ID VARCHAR(3) NOT NULL,
-                month_and_year DATE NOT NULL,
-                profit NUMERIC NOT NULL DEFAULT 0.0,
-                PRIMARY KEY(report_date, store_ID),
-                FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) ON DELETE CASCADE
-                );
-
-            CREATE TABLE IF NOT EXISTS exchanges_data (
-                                                          report_date TIMESTAMP NOT NULL,
-                                                          store_ID VARCHAR(3) NOT NULL,
-                monthly_profit NUMERIC NOT NULL DEFAULT 0.0,
-                date TIMESTAMP NOT NULL,
-                sales NUMERIC NOT NULL DEFAULT 0.0,
-                damages NUMERIC NOT NULL DEFAULT 0.0 CHECK (damages<=0),
-                PRIMARY KEY (report_date, store_ID),
-                FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) ON DELETE CASCADE
-                );
-
-            CREATE TABLE IF NOT EXISTS request (
-                                                   request_num VARCHAR(14) PRIMARY KEY,
-                date_and_time TIMESTAMP NOT NULL,
-                problem VARCHAR(300) NOT NULL,
-                notes_of_communication VARCHAR,
-                customer_satisfaction NUMERIC NOT NULL
-                );
-
-            CREATE TABLE IF NOT EXISTS makes_request (
-                                                         client_ID INTEGER NOT NULL REFERENCES client(client_ID) ON DELETE CASCADE,
-                order_num VARCHAR(11) UNIQUE NOT NULL REFERENCES "order"(order_num) ON DELETE CASCADE,
-                PRIMARY KEY(client_ID, order_num)
-                );
-
-            CREATE TABLE IF NOT EXISTS answers (
-                                                   request_num VARCHAR(14) REFERENCES request(request_num) ON DELETE CASCADE,
-                personal_id VARCHAR(10) NOT NULL REFERENCES personal(id) ON DELETE CASCADE,
-                PRIMARY KEY(request_num, personal_id)
-                );
-
-            CREATE TABLE IF NOT EXISTS for_store (
-                                                     request_num VARCHAR(14) REFERENCES request(request_num) ON DELETE CASCADE,
-                store_ID VARCHAR(3) REFERENCES store(store_ID) ON DELETE CASCADE,
-                PRIMARY KEY(request_num, store_ID)
-                );
-
-            CREATE TABLE IF NOT EXISTS "change" (
-                                                    date_and_time TIMESTAMP NOT NULL,
-                                                    product_code VARCHAR(8) REFERENCES product(code) ON DELETE CASCADE,
-                changes VARCHAR NOT NULL,
-                PRIMARY KEY (date_and_time, product_code)
-                );
-
-            CREATE TABLE IF NOT EXISTS makes_change (
-                                                        personal_id VARCHAR(10) REFERENCES personal(id) ON DELETE CASCADE,
-                change_date_time TIMESTAMP,
-                product_code VARCHAR(8),
-                PRIMARY KEY(personal_id, change_date_time, product_code),
-                FOREIGN KEY(change_date_time, product_code) REFERENCES "change"(date_and_time, product_code) ON DELETE CASCADE
-                );
-
-            CREATE TABLE IF NOT EXISTS works_in_store (
-                                                          personal_id VARCHAR(10) REFERENCES personal(id) ON DELETE CASCADE,
-                store_ID VARCHAR(3) REFERENCES store(store_ID) ON DELETE CASCADE,
-                PRIMARY KEY(personal_id, store_ID)
-                );
-
-            CREATE TABLE IF NOT EXISTS worked (
-                                                  personal_id VARCHAR(10) REFERENCES personal(id) ON DELETE CASCADE,
-                report_date TIMESTAMP,
-                store_ID VARCHAR(3),
-                wage NUMERIC NOT NULL CHECK (wage>=0),
-                pay_method VARCHAR DEFAULT 'full-time',
-                total_hours NUMERIC NOT NULL,
-                week VARCHAR(23) NOT NULL,
-                PRIMARY KEY (personal_id, report_date, store_ID),
-                FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) ON DELETE CASCADE,
-                CONSTRAINT check_pay_method CHECK (pay_method IN ('full_time', 'part-time', 'custom'))
-                );
-
-            CREATE TABLE IF NOT EXISTS sells (
-                                                 product_code VARCHAR(8) REFERENCES product(code) ON DELETE CASCADE,
-                store_ID VARCHAR(3) REFERENCES store(store_ID) ON DELETE CASCADE,
-                discount NUMERIC NOT NULL DEFAULT 0.0,
-                PRIMARY KEY (product_code, store_ID)
-                );
-
-            CREATE TABLE IF NOT EXISTS includes (
-                                                    order_num VARCHAR(11) REFERENCES "order"(order_num) ON DELETE CASCADE,
-                product_code VARCHAR(8) REFERENCES product(code) ON DELETE CASCADE,
-                quantity INTEGER NOT NULL CHECK(quantity>=0),
-                PRIMARY KEY (order_num, product_code)
-                );
-
-            CREATE TABLE IF NOT EXISTS approves (
-                                                    boss_id VARCHAR(10) REFERENCES boss(boss_id) ON DELETE CASCADE,
-                report_date TIMESTAMP,
-                store_ID VARCHAR(3),
-                owner_signature VARCHAR NOT NULL,
-                PRIMARY KEY (boss_id, report_date, store_ID),
-                FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) ON DELETE CASCADE
-                );
-
-            -- These four small tables are application authentication/audit storage.
-            -- They do not modify any of the project tables above.
-            CREATE TABLE IF NOT EXISTS users (
-                                                 id VARCHAR(50) PRIMARY KEY,
+                physical_address TEXT NOT NULL,
+                store_email VARCHAR(255) UNIQUE NOT NULL,
+                rating DECIMAL(3,2) DEFAULT 0.0
+                )`,
+
+            // Category table (SERIAL ID starting from 1)
+            `CREATE TABLE IF NOT EXISTS category (
+                                                     category_id SERIAL PRIMARY KEY,
+                                                     name VARCHAR(100) NOT NULL,
+                description TEXT,
+                parent_category_id INTEGER REFERENCES category(category_id) ON DELETE SET NULL
+                )`,
+
+            // Users table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS users (
+                                                  id VARCHAR(50) PRIMARY KEY,
                 username VARCHAR(100) UNIQUE NOT NULL,
                 email VARCHAR(255) UNIQUE NOT NULL,
                 password VARCHAR(255) NOT NULL,
                 user_type VARCHAR(50) NOT NULL,
-                force_password_change BOOLEAN DEFAULT FALSE,
+                force_password_change INTEGER DEFAULT 0,
                 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-                );
-
-            CREATE TABLE IF NOT EXISTS roles (
-                                                 role_id SERIAL PRIMARY KEY,
-                                                 name VARCHAR(50) UNIQUE NOT NULL,
-                description TEXT
-                );
-
-            CREATE TABLE IF NOT EXISTS user_roles (
-                                                      user_id VARCHAR(50) REFERENCES users(id) ON DELETE CASCADE,
-                role_id INTEGER REFERENCES roles(role_id) ON DELETE CASCADE,
-                PRIMARY KEY(user_id, role_id)
-                );
-
-            CREATE TABLE IF NOT EXISTS audit_log (
-                                                     log_id BIGSERIAL PRIMARY KEY,
-                                                     user_id VARCHAR(50),
+                )`,
+
+            // Personal table (VARCHAR ID - format: storeId(3) + '001' for owner, storeId(3) + employeeNum(3) for employees)
+            `CREATE TABLE IF NOT EXISTS personal (
+                                                     id VARCHAR(10) PRIMARY KEY,
+                first_name VARCHAR(100) NOT NULL,
+                last_name VARCHAR(100) NOT NULL,
+                ssn VARCHAR(13) UNIQUE NOT NULL,
+                email VARCHAR(255) UNIQUE NOT NULL,
+                password VARCHAR(255) NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Product table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS product (
+                                                    id VARCHAR(50) PRIMARY KEY,
+                code VARCHAR(20) UNIQUE NOT NULL,
+                description TEXT NOT NULL,
+                price DECIMAL(10,2) NOT NULL,
+                availability INTEGER NOT NULL DEFAULT 0,
+                weight DECIMAL(10,2),
+                dimensions VARCHAR(50),
+                production_time INTEGER,
+                category_id INTEGER REFERENCES category(category_id) ON DELETE SET NULL,
+                store_id VARCHAR(10) REFERENCES store(store_id) ON DELETE CASCADE,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Boss table (VARCHAR ID - references personal.id)
+            `CREATE TABLE IF NOT EXISTS boss (
+                                                 boss_id VARCHAR(10) PRIMARY KEY REFERENCES personal(id) ON DELETE CASCADE,
+                signature TEXT NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Employees table (VARCHAR ID - references personal.id)
+            `CREATE TABLE IF NOT EXISTS employees (
+                                                      employee_id VARCHAR(10) PRIMARY KEY REFERENCES personal(id) ON DELETE CASCADE,
+                date_of_hire DATE NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Works_in_store table (junction)
+            `CREATE TABLE IF NOT EXISTS works_in_store (
+                                                           personal_id VARCHAR(10) REFERENCES personal(id) ON DELETE CASCADE,
+                store_id VARCHAR(10) REFERENCES store(store_id) ON DELETE CASCADE,
+                PRIMARY KEY (personal_id, store_id)
+                )`,
+
+            // Permissions table
+            `CREATE TABLE IF NOT EXISTS permissions (
+                                                        permission_id SERIAL PRIMARY KEY,
+                                                        personal_id VARCHAR(10) REFERENCES personal(id) ON DELETE CASCADE,
+                type VARCHAR(50) NOT NULL,
+                authorisation TEXT,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Order table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS "order" (
+                                                    order_num VARCHAR(20) PRIMARY KEY,
+                client_id INTEGER REFERENCES client(client_id) ON DELETE SET NULL,
+                order_date TIMESTAMP NOT NULL,
+                quantity INTEGER NOT NULL,
+                payment_method VARCHAR(50) NOT NULL,
+                discount DECIMAL(10,2) DEFAULT 0,
+                delivery_address TEXT NOT NULL,
+                store_id VARCHAR(10) REFERENCES store(store_id) ON DELETE SET NULL,
+                status VARCHAR(50) DEFAULT 'pending',
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Order_items table
+            `CREATE TABLE IF NOT EXISTS order_items (
+                                                        item_id SERIAL PRIMARY KEY,
+                                                        order_num VARCHAR(20) REFERENCES "order"(order_num) ON DELETE CASCADE,
+                product_code VARCHAR(20) REFERENCES product(code) ON DELETE SET NULL,
+                quantity INTEGER NOT NULL,
+                price DECIMAL(10,2) NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Review table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS review (
+                                                   review_id VARCHAR(20) PRIMARY KEY,
+                client_id INTEGER REFERENCES client(client_id) ON DELETE SET NULL,
+                product_code VARCHAR(20) REFERENCES product(code) ON DELETE CASCADE,
+                rating INTEGER NOT NULL CHECK (rating >= 1 AND rating <= 5),
+                comment TEXT,
+                review_date TIMESTAMP NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Request table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS request (
+                                                    request_num VARCHAR(50) PRIMARY KEY,
+                date_and_time TIMESTAMP NOT NULL,
+                problem TEXT NOT NULL,
+                client_id INTEGER REFERENCES client(client_id) ON DELETE SET NULL,
+                store_id VARCHAR(10) REFERENCES store(store_id) ON DELETE CASCADE,
+                status VARCHAR(50) DEFAULT 'pending',
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Refund table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS refund (
+                                                   refund_id VARCHAR(50) PRIMARY KEY,
+                order_num VARCHAR(20) REFERENCES "order"(order_num) ON DELETE CASCADE,
+                amount DECIMAL(10,2) NOT NULL,
+                reason TEXT NOT NULL,
+                status VARCHAR(50) DEFAULT 'pending',
+                request_date TIMESTAMP NOT NULL,
+                processed_date TIMESTAMP,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Report table (VARCHAR ID)
+            `CREATE TABLE IF NOT EXISTS report (
+                                                   id VARCHAR(50) PRIMARY KEY,
+                store_id VARCHAR(10) REFERENCES store(store_id) ON DELETE CASCADE,
+                period VARCHAR(50) NOT NULL,
+                start_date DATE NOT NULL,
+                end_date DATE NOT NULL,
+                type VARCHAR(50) NOT NULL,
+                generated_by VARCHAR(10) REFERENCES personal(id) ON DELETE SET NULL,
+                generated_at TIMESTAMP NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Audit_log table (SERIAL ID)
+            `CREATE TABLE IF NOT EXISTS audit_log (
+                                                      log_id SERIAL PRIMARY KEY,
+                                                      user_id VARCHAR(50),
                 action VARCHAR(100) NOT NULL,
                 resource_type VARCHAR(50),
@@ -1941,790 +637,212 @@
                 ip_address VARCHAR(45),
                 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-                );
-
-            CREATE INDEX IF NOT EXISTS idx_product_category ON product(category_id);
-            CREATE INDEX IF NOT EXISTS idx_order_client ON "order"(client_ID);
-            CREATE INDEX IF NOT EXISTS idx_review_order ON review(order_num);
-            CREATE INDEX IF NOT EXISTS idx_request_date ON request(date_and_time);
-            CREATE INDEX IF NOT EXISTS idx_refund_order ON refund(order_num);
-            CREATE INDEX IF NOT EXISTS idx_personal_email ON personal(email);
-            CREATE INDEX IF NOT EXISTS idx_client_email ON client(email);
-            CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
-            CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
-            CREATE INDEX IF NOT EXISTS idx_audit_user ON audit_log(user_id);
-        `;
-
-        await pool.query(schema);
-
-        // ------------------------------------------------------------
-        // Compatibility migration for older PostgreSQL databases.
-        //
-        // Some existing project databases contain a permissions table
-        // created by an older version of the schema with a typo such as
-        // personal_is instead of personal_id. CREATE TABLE IF NOT EXISTS cannot add
-        // missing columns to an existing table, so the admin bootstrap
-        // INSERT would otherwise fail with PostgreSQL error 42703.
-        //
-        // The migration is intentionally non-destructive: it keeps all
-        // existing rows, renames the typo when possible, and migrates the old typo column into the expected schema without deleting
-        // permission values.
-        // ------------------------------------------------------------
-        await pool.query(`
-            DO $$
-            BEGIN
-                -- Some older versions of the database used the typo
-                -- personal_is instead of personal_id. Rename it rather
-                -- than adding a second column: the old column may be NOT NULL
-                -- and would otherwise make the admin bootstrap INSERT fail.
-                IF EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'personal_is'
-                ) AND NOT EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'personal_id'
-                ) THEN
-                    ALTER TABLE permissions
-                        RENAME COLUMN personal_is TO personal_id;
-                END IF;
-
-                -- If neither spelling exists, add the expected column.
-                IF NOT EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'personal_id'
-                ) THEN
-                    ALTER TABLE permissions
-                        ADD COLUMN personal_id VARCHAR(10);
-                END IF;
-
-                -- Some databases were already partially migrated and therefore
-                -- contain BOTH personal_is and personal_id. If the old typo
-                -- column participates in the primary key, PostgreSQL will not
-                -- allow us to drop its NOT NULL requirement. Migrate the
-                -- primary-key data to personal_id first, then remove the old
-                -- typo column from the key and drop it.
-                IF EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'personal_is'
-                ) AND EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'personal_id'
-                ) THEN
-                    -- Copy old primary-key values into the new column where
-                    -- the new column is currently empty.
-                    UPDATE permissions
-                    SET personal_id = personal_is
-                    WHERE personal_id IS NULL
-                      AND personal_is IS NOT NULL;
-
-                    -- Remove the old typo column from the primary key.
-                    DO $drop_old_permission_pk$
-                    DECLARE
-                        pk_name TEXT;
-                    BEGIN
-                        SELECT tc.constraint_name
-                        INTO pk_name
-                        FROM information_schema.table_constraints tc
-                        JOIN information_schema.key_column_usage kcu
-                          ON kcu.constraint_name = tc.constraint_name
-                         AND kcu.table_schema = tc.table_schema
-                         AND kcu.table_name = tc.table_name
-                        WHERE tc.table_schema = 'public'
-                          AND tc.table_name = 'permissions'
-                          AND tc.constraint_type = 'PRIMARY KEY'
-                          AND kcu.column_name = 'personal_is'
-                        LIMIT 1;
-
-                        IF pk_name IS NOT NULL THEN
-                            EXECUTE format(
-                                'ALTER TABLE permissions DROP CONSTRAINT %I',
-                                pk_name
-                            );
-                        END IF;
-                    END
-                    $drop_old_permission_pk$;
-
-                    -- The application uses personal_id as the primary key.
-                    -- Drop the obsolete typo column after preserving its data.
-                    ALTER TABLE permissions
-                        DROP COLUMN personal_is;
-
-                    -- Recreate the primary key on the correct column if one
-                    -- was removed above and no primary key currently exists.
-                    IF NOT EXISTS (
-                        SELECT 1
-                        FROM information_schema.table_constraints
-                        WHERE table_schema = 'public'
-                          AND table_name = 'permissions'
-                          AND constraint_type = 'PRIMARY KEY'
-                    ) THEN
-                        ALTER TABLE permissions
-                            ADD PRIMARY KEY (personal_id);
-                    END IF;
-                END IF;
-
-                IF NOT EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'type'
-                ) THEN
-                    ALTER TABLE permissions
-                        ADD COLUMN type VARCHAR(50);
-                END IF;
-
-                IF NOT EXISTS (
-                    SELECT 1
-                    FROM information_schema.columns
-                    WHERE table_schema = 'public'
-                      AND table_name = 'permissions'
-                      AND column_name = 'authorisation'
-                ) THEN
-                    ALTER TABLE permissions
-                        ADD COLUMN authorisation VARCHAR(50);
-                END IF;
-            END
-            $$;
-        `);
-
-        // ON CONFLICT(personal_id) requires a unique/exclusion constraint
-        // that PostgreSQL can use for conflict inference. A unique index
-        // permits multiple NULL values, so this remains safe for any legacy
-        // permission rows that do not have a personal_id yet.
-        await pool.query(`
-            CREATE UNIQUE INDEX IF NOT EXISTS
-                permissions_personal_id_unique
-                ON permissions(personal_id)
-        `);
-
+                )`,
+
+            // Color table (SERIAL ID)
+            `CREATE TABLE IF NOT EXISTS color (
+                                                  color_id SERIAL PRIMARY KEY,
+                                                  name VARCHAR(50) NOT NULL,
+                hex_code VARCHAR(7) NOT NULL,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Image table (SERIAL ID)
+            `CREATE TABLE IF NOT EXISTS image (
+                                                  image_id SERIAL PRIMARY KEY,
+                                                  product_code VARCHAR(20) REFERENCES product(code) ON DELETE CASCADE,
+                image_url TEXT NOT NULL,
+                is_primary BOOLEAN DEFAULT FALSE,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Delivery_address table (SERIAL ID)
+            `CREATE TABLE IF NOT EXISTS delivery_address (
+                                                             address_id SERIAL PRIMARY KEY,
+                                                             client_id INTEGER REFERENCES client(client_id) ON DELETE CASCADE,
+                address TEXT NOT NULL,
+                city VARCHAR(100) NOT NULL,
+                postcode VARCHAR(20) NOT NULL,
+                country VARCHAR(100) NOT NULL,
+                is_default BOOLEAN DEFAULT FALSE,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // Roles table (SERIAL ID)
+            `CREATE TABLE IF NOT EXISTS roles (
+                                                  role_id SERIAL PRIMARY KEY,
+                                                  name VARCHAR(50) UNIQUE NOT NULL,
+                description TEXT,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+                )`,
+
+            // User_roles table (junction)
+            `CREATE TABLE IF NOT EXISTS user_roles (
+                                                       user_id VARCHAR(50) REFERENCES users(id) ON DELETE CASCADE,
+                role_id INTEGER REFERENCES roles(role_id) ON DELETE CASCADE,
+                PRIMARY KEY (user_id, role_id)
+                )`
+        ];
+
+        let index = 0;
+
+        function runNext() {
+            if (index >= createQueries.length) {
+                console.log('✅ All tables created');
+                resolve();
+                return;
+            }
+
+            const tableName = createQueries[index].split('TABLE')[1].split('(')[0].trim().replace('IF NOT EXISTS', '').trim();
+            console.log(`Creating table: ${tableName}...`);
+
+            database.database.run(createQueries[index], [], (err) => {
+                if (err) {
+                    console.error(`Error creating table: ${err.message}`);
+                    reject(err);
+                    return;
+                }
+                console.log(`✅ Created table: ${tableName}`);
+                index++;
+                runNext();
+            });
+        }
+
+        runNext();
+    });
+}
+
+function createIndexes() {
+    return new Promise((resolve, reject) => {
+        console.log('📊 Creating indexes...');
+
+        const indexQueries = [
+            'CREATE INDEX IF NOT EXISTS idx_product_store ON product(store_id)',
+            'CREATE INDEX IF NOT EXISTS idx_product_category ON product(category_id)',
+            'CREATE INDEX IF NOT EXISTS idx_order_client ON "order"(client_id)',
+            'CREATE INDEX IF NOT EXISTS idx_order_store ON "order"(store_id)',
+            'CREATE INDEX IF NOT EXISTS idx_order_date ON "order"(order_date)',
+            'CREATE INDEX IF NOT EXISTS idx_review_client ON review(client_id)',
+            'CREATE INDEX IF NOT EXISTS idx_review_product ON review(product_code)',
+            'CREATE INDEX IF NOT EXISTS idx_request_client ON request(client_id)',
+            'CREATE INDEX IF NOT EXISTS idx_request_store ON request(store_id)',
+            'CREATE INDEX IF NOT EXISTS idx_refund_order ON refund(order_num)',
+            'CREATE INDEX IF NOT EXISTS idx_refund_status ON refund(status)',
+            'CREATE INDEX IF NOT EXISTS idx_personal_email ON personal(email)',
+            'CREATE INDEX IF NOT EXISTS idx_client_email ON client(email)',
+            'CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)',
+            'CREATE INDEX IF NOT EXISTS idx_users_username ON users(username)',
+            'CREATE INDEX IF NOT EXISTS idx_audit_user ON audit_log(user_id)',
+            'CREATE INDEX IF NOT EXISTS idx_audit_action ON audit_log(action)',
+            'CREATE INDEX IF NOT EXISTS idx_audit_created ON audit_log(created_at)',
+            'CREATE INDEX IF NOT EXISTS idx_delivery_client ON delivery_address(client_id)',
+            'CREATE INDEX IF NOT EXISTS idx_works_in_store_personal ON works_in_store(personal_id)',
+            'CREATE INDEX IF NOT EXISTS idx_works_in_store_store ON works_in_store(store_id)'
+        ];
+
+        let index = 0;
+
+        function runNext() {
+            if (index >= indexQueries.length) {
+                console.log('✅ Indexes created');
+                resolve();
+                return;
+            }
+
+            database.database.run(indexQueries[index], [], (err) => {
+                if (err) {
+                    console.log(`⚠️ Index creation warning for ${indexQueries[index].substring(0, 50)}...: ${err.message}`);
+                }
+                index++;
+                runNext();
+            });
+        }
+
+        runNext();
+    });
+}
+
+function insertInitialData() {
+    return new Promise((resolve, reject) => {
+        console.log('📝 Inserting initial data...');
+
+        // Insert General category (ID will be 1 due to SERIAL)
+        database.database.run(
+            `INSERT INTO category (name, description)
+             VALUES ('General', 'General products category')
+                 ON CONFLICT DO NOTHING`,
+            [],
+            (err) => {
+                if (err) {
+                    console.error('Error inserting General category:', err.message);
+                }
+            }
+        );
+
+        // Insert admin user
+        const adminId = 'admin_' + Date.now().toString().slice(-6);
+        const adminPassword = bcrypt.hashSync('Admin123!', 10);
+
+        database.database.run(
+            `INSERT INTO users (id, username, email, password, user_type, force_password_change)
+             VALUES ($1, $2, $3, $4, $5, $6)
+                 ON CONFLICT DO NOTHING`,
+            [adminId, 'admin', 'admin@handcraft.com', adminPassword, 'admin', 1],
+            (err) => {
+                if (err) {
+                    console.error('Error inserting admin user:', err.message);
+                } else {
+                    console.log('✅ Admin user created');
+                }
+            }
+        );
+
+        // Insert default roles
         const roles = [
-            ['admin', 'System administrator'],
-            ['store_owner', 'Store owner'],
-            ['store_employee', 'Store employee'],
-            ['client', 'Registered client'],
-            ['guest', 'Unregistered guest']
+            { name: 'admin', description: 'System administrator' },
+            { name: 'store_owner', description: 'Store owner' },
+            { name: 'store_employee', description: 'Store employee' },
+            { name: 'client', description: 'Registered client' },
+            { name: 'guest', description: 'Unregistered guest' }
         ];
 
-        for (const [name, description] of roles) {
-            await pool.query(
-                'INSERT INTO roles(name, description) VALUES($1,$2) ON CONFLICT(name) DO NOTHING',
-                [name, description]
+        let rolesInserted = 0;
+
+        roles.forEach(role => {
+            database.database.run(
+                `INSERT INTO roles (name, description)
+                 VALUES ($1, $2)
+                     ON CONFLICT DO NOTHING`,
+                [role.name, role.description],
+                (err) => {
+                    if (err) {
+                        console.error(`Error inserting role ${role.name}:`, err.message);
+                    }
+                    rolesInserted++;
+                    if (rolesInserted === roles.length) {
+                        console.log('✅ Roles inserted');
+
+                        // Check if General category exists
+                        database.ensureGeneralCategory((err) => {
+                            if (err) {
+                                console.error('Error ensuring General category:', err.message);
+                            } else {
+                                console.log('✅ General category exists');
+                            }
+                            resolve();
+                        });
+                    }
+                }
             );
-        }
-
-        const hash = bcrypt.hashSync('Admin123!', 10);
-        await pool.query(
-            `INSERT INTO users(id, username, email, password, user_type, force_password_change)
-             VALUES('000000','admin','admin@handcraft.com',$1,'admin',TRUE) ON CONFLICT(id) DO NOTHING`,
-            [hash]
-        );
-        await pool.query(
-            `INSERT INTO personal(id, first_name, last_name, ssn, email, password)
-             VALUES('000000','Admin','User','0000000000000','admin@handcraft.com',$1) ON CONFLICT(id) DO NOTHING`,
-            [hash]
-        );
-        await pool.query(`INSERT INTO boss(boss_id) VALUES('000000') ON CONFLICT(boss_id) DO NOTHING`);
-        await pool.query(
-            `INSERT INTO permissions(personal_id,type,authorisation)
-             VALUES('000000','ADMIN','full_access') ON CONFLICT(personal_id) DO NOTHING`
-        );
-        await pool.query(
-            `INSERT INTO user_roles(user_id,role_id)
-             SELECT '000000', role_id FROM roles WHERE name='admin' ON CONFLICT DO NOTHING`
-        );
-        console.log('✅ PostgreSQL project schema was recreated successfully');
-    },
-
-    close() {
-        return pool.end();
-    },
-
-    getUserById(id, callback) {
-        dbQuery(
-            `SELECT u.*,
-                    COALESCE(json_agg(json_build_object('name',r.name,'description',r.description))
-                             FILTER (WHERE r.role_id IS NOT NULL), '[]') AS roles
-             FROM users u
-                      LEFT JOIN user_roles ur ON ur.user_id=u.id
-                      LEFT JOIN roles r ON r.role_id=ur.role_id
-             WHERE u.id=$1
-             GROUP BY u.id`,
-            [String(id)],
-            (err, result) => callback(err, result?.rows?.[0])
-        );
-    },
-
-    getUserByUsername(username, callback) {
-        dbQuery(
-            `SELECT u.*,
-                    COALESCE(json_agg(json_build_object('name',r.name,'description',r.description))
-                             FILTER (WHERE r.role_id IS NOT NULL), '[]') AS roles
-             FROM users u
-                      LEFT JOIN user_roles ur ON ur.user_id=u.id
-                      LEFT JOIN roles r ON r.role_id=ur.role_id
-             WHERE u.username=$1 OR u.email=$1
-             GROUP BY u.id
-                 LIMIT 1`,
-            [username],
-            (err, result) => callback(err, result?.rows?.[0])
-        );
-    },
-
-    createUser(id, username, email, password, userType, callback) {
-        dbQuery(
-            `INSERT INTO users(id,username,email,password,user_type,force_password_change)
-             VALUES($1,$2,$3,$4,$5,FALSE) RETURNING id`,
-            [String(id), username, email, password, userType],
-            (err, result) => {
-                if (err) return callback(err);
-                const roleName = userType === 'client' ? 'client' :
-                    userType === 'store_owner' ? 'store_owner' :
-                        userType === 'store_employee' ? 'store_employee' : 'guest';
-                dbQuery(
-                    `INSERT INTO user_roles(user_id,role_id)
-                     SELECT $1, role_id FROM roles WHERE name=$2`,
-                    [String(id), roleName],
-                    roleErr => callback(roleErr, String(id))
-                );
-            }
-        );
-    },
-
-    createClient(data, callback) {
-        dbQuery(
-            `INSERT INTO client(first_name,last_name,email,password)
-             VALUES($1,$2,$3,$4) RETURNING client_id`,
-            [data.firstName || data.first_name || '', data.lastName || data.last_name || '', data.email, data.password],
-            (err, result) => callback(err, result?.rows?.[0]?.client_id)
-        );
-    },
-
-    getClientByEmail(email, callback) {
-        dbQuery('SELECT * FROM client WHERE email=$1', [email],
-            (err, result) => callback(err, result?.rows?.[0]));
-    },
-
-    getClientById(id, callback) {
-        dbQuery('SELECT * FROM client WHERE client_id=$1', [id],
-            (err, result) => callback(err, result?.rows?.[0]));
-    },
-
-    getPersonalByEmail(email, callback) {
-        dbQuery('SELECT * FROM personal WHERE email=$1', [email],
-            (err, result) => callback(err, result?.rows?.[0]));
-    },
-
-    getPersonalById(id, callback) {
-        dbQuery('SELECT * FROM personal WHERE id=$1', [String(id)],
-            (err, result) => callback(err, result?.rows?.[0]));
-    },
-
-    verifyPassword(password, hash) {
-        try { return bcrypt.compareSync(password, hash); } catch { return false; }
-    },
-
-    verifyClientPassword(password, hash, callback) {
-        bcrypt.compare(password, hash, callback);
-    },
-
-    logAudit(userId, action, resourceType, resourceId, details, ipAddress) {
-        dbQuery(
-            `INSERT INTO audit_log(user_id,action,resource_type,resource_id,details,ip_address)
-             VALUES($1,$2,$3,$4,$5,$6)`,
-            [userId == null ? null : String(userId), action, resourceType,
-                resourceId == null ? null : String(resourceId), details, ipAddress],
-            () => {}
-        );
-    },
-
-    getProducts(categoryId, searchTerm, callback) {
-        const params = [];
-        const where = [];
-        if (categoryId) {
-            params.push(categoryId);
-            where.push(`p.category_id=$${params.length}`);
-        }
-        if (searchTerm) {
-            params.push(`%${searchTerm}%`);
-            where.push(`(p.description ILIKE $${params.length} OR p.code ILIKE $${params.length})`);
-        }
-        const sql = `SELECT p.*, c.name AS category_name, LEFT(p.code,3) AS store_id
-                     FROM product p
-                         LEFT JOIN category c ON c.id=p.category_id
-                         ${where.length ? 'WHERE ' + where.join(' AND ') : ''}
-                     ORDER BY p.code`;
-        dbQuery(sql, params, (err, result) => callback(err, result?.rows || []));
-    },
-
-    getProductById(id, callback) {
-        dbQuery(
-            `SELECT p.*, c.name AS category_name, LEFT(p.code,3) AS store_id
-             FROM product p
-                 LEFT JOIN category c ON c.id=p.category_id
-             WHERE p.code=$1 LIMIT 1`,
-            [String(id)],
-            (err,result)=>callback(err,result?.rows?.[0])
-        );
-    },
-
-    getProductByCode(code, callback) {
-        dbQuery(
-            `SELECT p.*, c.name AS category_name, LEFT(p.code,3) AS store_id
-             FROM product p
-                 LEFT JOIN category c ON c.id=p.category_id
-             WHERE p.code=$1`,
-            [code],
-            (err,result)=>callback(err,result?.rows?.[0])
-        );
-    },
-
-    addProduct(personalId, data, callback) {
-        const storeId = data.store_id || data.storeId || String(data.code || '').slice(0,3);
-        if (!data.category_id) {
-            return callback(new Error('category_id is required because product.category_id is NOT NULL'));
-        }
-        dbQuery(
-            `INSERT INTO product(code,price,availability,weight,width_x_length_x_depth,
-                                 aprox_production_time,description,category_id)
-             VALUES($1,$2,$3,$4,$5,$6,$7,$8) RETURNING code`,
-            [
-                data.code, data.price, data.availability ?? 0, data.weight,
-                data.width_x_length_x_depth || data.dimensions || '',
-                data.aprox_production_time ?? data.production_time ?? 0,
-                data.description, data.category_id
-            ],
-            (err,result)=>{
-                if (err) return callback(err);
-                dbQuery(
-                    `INSERT INTO sells(product_code,store_ID,discount)
-                     VALUES($1,$2,$3)
-                         ON CONFLICT(product_code,store_ID)
-                     DO UPDATE SET discount=EXCLUDED.discount`,
-                    [data.code,storeId,data.discount || 0],
-                    e => callback(e, data.code)
-                );
-            }
-        );
-    },
-
-    updateProduct(personalId, data, callback) {
-        const fields = [];
-        const params = [];
-        const allowed = [
-            ['price','price'], ['availability','availability'], ['weight','weight'],
-            ['width_x_length_x_depth','width_x_length_x_depth'],
-            ['dimensions','width_x_length_x_depth'],
-            ['aprox_production_time','aprox_production_time'],
-            ['production_time','aprox_production_time'],
-            ['description','description'], ['category_id','category_id']
-        ];
-        for (const [input,col] of allowed) {
-            if (data[input] !== undefined) {
-                params.push(data[input]);
-                fields.push(`${col}=$${params.length}`);
-            }
-        }
-        if (!fields.length) return callback(null,0);
-        params.push(data.code);
-        dbQuery(`UPDATE product SET ${fields.join(', ')} WHERE code=$${params.length}`, params,
-            (err,result)=>callback(err,result?.rowCount || 0));
-    },
-
-    deleteProduct(productCode, storeId, personalId, callback) {
-        dbQuery('DELETE FROM product WHERE code=$1 AND LEFT(code,3)=$2', [productCode,storeId],
-            (err)=>callback(err));
-    },
-
-    createCategory(data, callback) {
-        const parent = data.parent_category_id ?? data.parentCategoryId ?? data.parent_id;
-        if (parent === undefined || parent === null || parent === '') {
-            return callback(new Error('parent_category_id is required by the project schema'));
-        }
-        dbQuery(
-            `INSERT INTO category(name,parent_category_id) VALUES($1,$2) RETURNING id,name,parent_category_id`,
-            [data.name, parent],
-            (err,result)=>callback(err,result?.rows?.[0])
-        );
-    },
-
-    getCategories(callback) {
-        dbQuery('SELECT * FROM category ORDER BY name', [], (err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getCategoriesWithParents(callback) {
-        dbQuery(
-            `SELECT c.*,p.name AS parent_name
-             FROM category c LEFT JOIN category p ON p.id=c.parent_category_id
-             ORDER BY c.name`,
-            [], (err,result)=>callback(err,result?.rows||[])
-        );
-    },
-
-    getStores(callback) {
-        dbQuery('SELECT * FROM store ORDER BY name', [], (err,result)=>callback(err,result?.rows||[]));
-    },
-
-    createOrderNew(data, callback) {
-        const items = data.items || data.products || data.order_items || [];
-        const storeId = data.store_id || data.storeId || (items[0]?.code ? String(items[0].code).slice(0,3) : null);
-        if (!storeId) return callback(new Error('Store ID is required'));
-        const year = String(new Date().getFullYear()).slice(-3);
-
-        dbQuery(
-            `SELECT COUNT(*)::int AS n
-             FROM "order"
-             WHERE LEFT(order_num,3)=$1
-               AND SUBSTRING(order_num FROM 4 FOR 3)=$2`,
-            [storeId, year],
-            (countErr,countResult)=>{
-                if (countErr) return callback(countErr);
-                const seq=Number(countResult.rows[0].n)+1;
-                const orderNum=`${storeId}${year}${String(seq).padStart(5,'0')}`;
-                dbQuery(
-                    `INSERT INTO "order"(order_num,client_ID,status,last_date_mod,payment_method,discount)
-                     VALUES($1,$2,$3,CURRENT_TIMESTAMP,$4,$5) RETURNING order_num`,
-                    [orderNum,data.client_id,data.status||'placed order',data.payment_method||'cash',data.discount||0],
-                    (err,result)=>{
-                        if(err) return callback(err);
-                        let pending=items.length;
-                        if(!pending) return callback(null,orderNum);
-                        let firstErr=null;
-                        for(const item of items){
-                            dbQuery(
-                                `INSERT INTO includes(order_num,product_code,quantity) VALUES($1,$2,$3)`,
-                                [orderNum,item.product_code||item.code,item.quantity||1],
-                                e=>{ if(e && !firstErr) firstErr=e; if(--pending===0) callback(firstErr,firstErr?undefined:orderNum); }
-                            );
-                        }
-                    }
-                );
-            }
-        );
-    },
-
-    getOrdersByClient(clientId, callback) {
-        dbQuery(
-            `SELECT o.*, LEFT(o.order_num,3) AS store_id,
-                 o.last_date_mod AS order_date,
-                 COALESCE(json_agg(json_build_object('product_code',i.product_code,'quantity',i.quantity,'price',p.price))
-                 FILTER(WHERE i.product_code IS NOT NULL),'[]') AS items
-             FROM "order" o
-                 LEFT JOIN includes i ON i.order_num=o.order_num
-                 LEFT JOIN product p ON p.code=i.product_code
-             WHERE o.client_ID=$1
-             GROUP BY o.order_num
-             ORDER BY o.last_date_mod DESC`,
-            [clientId],(err,result)=>callback(err,result?.rows||[])
-        );
-    },
-
-    createReviewNew(data, callback) {
-        dbQuery(
-            `INSERT INTO review(order_num,comment,rating,last_mod_date)
-             VALUES($1,$2,$3,CURRENT_TIMESTAMP)
-                 RETURNING order_num`,
-            [data.order_num,data.comment||null,data.rating],
-            (err,result)=>callback(err,result?.rows?.[0]?.order_num)
-        );
-    },
-
-    createRequest(data, callback) {
-        dbQuery(
-            `INSERT INTO request(request_num,date_and_time,problem,notes_of_communication,customer_satisfaction)
-             VALUES($1,$2,$3,$4,0) RETURNING request_num`,
-            [data.request_num,data.date_and_time,data.problem,data.notes_of_communication||null],
-            (err,result)=>{
-                if (err) return callback(err);
-                dbQuery(
-                    `INSERT INTO for_store(request_num,store_ID) VALUES($1,$2)`,
-                    [data.request_num,data.store_id],
-                    storeErr=>{
-                        if (storeErr) return callback(storeErr);
-                        if (data.order_num) {
-                            dbQuery(
-                                `INSERT INTO makes_request(client_ID,order_num) VALUES($1,$2)`,
-                                [data.client_id,data.order_num],
-                                e=>callback(e,data.request_num)
-                            );
-                        } else {
-                            callback(null,data.request_num);
-                        }
-                    }
-                );
-            }
-        );
-    },
-
-    createRefund(data, callback) {
-        const suppliedId = data.refund_id;
-        const query = suppliedId
-            ? `INSERT INTO refund(refund_id,order_num,reason,amount,status) VALUES($1,$2,$3,$4,$5) RETURNING refund_id`
-            : `INSERT INTO refund(order_num,reason,amount,status) VALUES($1,$2,$3,$4) RETURNING refund_id`;
-        const params = suppliedId
-            ? [Number.parseInt(String(suppliedId),10) || undefined,data.order_num,data.reason||null,data.amount,data.status||'requested refund']
-            : [data.order_num,data.reason||null,data.amount,data.status||'requested refund'];
-        dbQuery(query,params,(err,result)=>callback(err,result?.rows?.[0]?.refund_id));
-    },
-
-    getAllUsers(callback) {
-        dbQuery(`SELECT u.*,COALESCE(json_agg(r.name) FILTER(WHERE r.role_id IS NOT NULL),'[]') roles
-                 FROM users u LEFT JOIN user_roles ur ON ur.user_id=u.id
-                              LEFT JOIN roles r ON r.role_id=ur.role_id GROUP BY u.id ORDER BY u.created_at DESC`,
-            [],(err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getAllOrders(callback) {
-        dbQuery(`SELECT o.*, LEFT(o.order_num,3) AS store_id, o.last_date_mod AS order_date,
-                     c.first_name,c.last_name,c.email
-                 FROM "order" o
-                     LEFT JOIN client c ON c.client_id=o.client_ID
-                 ORDER BY o.last_date_mod DESC`,
-            [],(err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getStoreProducts(storeId, callback) {
-        dbQuery(`SELECT p.*,c.name AS category_name,LEFT(p.code,3) AS store_id,s.discount
-                 FROM product p
-                     LEFT JOIN category c ON c.id=p.category_id
-                     LEFT JOIN sells s ON s.product_code=p.code AND s.store_ID=$1
-                 WHERE LEFT(p.code,3)=$1 OR EXISTS(SELECT 1 FROM sells sx WHERE sx.product_code=p.code AND sx.store_ID=$1)
-                 ORDER BY p.code`,[storeId],(err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getStoreOrders(storeId, callback) {
-        dbQuery(`SELECT o.*,LEFT(o.order_num,3) AS store_id,o.last_date_mod AS order_date,c.first_name,c.last_name
-                 FROM "order" o
-                     LEFT JOIN client c ON c.client_id=o.client_ID
-                 WHERE LEFT(o.order_num,3)=$1 ORDER BY o.last_date_mod DESC`,[storeId],
-            (err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getStoreEmployees(storeId, callback) {
-        dbQuery(`SELECT p.*,e.date_of_hire,per.type,per.authorisation
-                 FROM personal p JOIN works_in_store w ON w.personal_id=p.id
-                                 LEFT JOIN employees e ON e.employee_id=p.id
-                                 LEFT JOIN permissions per ON per.personal_id=p.id
-                 WHERE w.store_ID=$1 ORDER BY p.last_name,p.first_name`,
-            [storeId],(err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getStoreReports(storeId, callback) {
-        dbQuery(
-            `SELECT date, store_id, overall_profit, sales_trend, marketing_growth, owner_signature
-             FROM report
-             WHERE store_id = $1
-             ORDER BY date DESC`,
-            [storeId],
-            (err, result) => callback(err, result?.rows || [])
-        );
-    },
-
-    getStoreStats(storeId, callback) {
-        const sql = `
-            SELECT
-                (SELECT COUNT(DISTINCT product_code)
-                 FROM sells
-                 WHERE store_ID = $1)::int AS product_count,
-
-                    (SELECT COUNT(DISTINCT o.order_num)
-                     FROM sells se
-                              JOIN includes i ON i.product_code = se.product_code
-                              JOIN "order" o ON o.order_num = i.order_num
-                     WHERE se.store_ID = $1)::int AS order_count,
-
-                    (SELECT COALESCE(SUM(
-                                             i.quantity * p.price
-                                                 * (1 - COALESCE(o.discount, 0) / 100.0)
-                                     ), 0)
-                     FROM sells se
-                              JOIN includes i ON i.product_code = se.product_code
-                              JOIN "order" o ON o.order_num = i.order_num
-                              JOIN product p ON p.code = i.product_code
-                     WHERE se.store_ID = $1) AS revenue,
-
-                (SELECT COUNT(*)
-                 FROM works_in_store
-                 WHERE store_ID = $1)::int AS employee_count,
-
-                    (SELECT COUNT(*)
-                     FROM for_store
-                     WHERE store_ID = $1)::int AS request_count,
-
-                    (SELECT COUNT(*)
-                     FROM refund r
-                              JOIN "order" o ON o.order_num = r.order_num
-                     WHERE LEFT(o.order_num, 3) = $1)::int AS refund_count
-        `;
-
-        dbQuery(sql, [storeId], (err, result) => {
-            callback(err, result?.rows?.[0] || {});
-        });
-    },
-
-    generateStoreReport(storeId, startDate, endDate, type, period, ownerSignature, callback) {
-        dbQuery(
-            `WITH sales AS (
-                SELECT COALESCE(SUM(
-                                        p.price * i.quantity
-                                            * (1 - COALESCE(o.discount, 0) / 100.0)
-                                ), 0) AS revenue
-                FROM sells se
-                         JOIN product p ON p.code = se.product_code
-                         JOIN includes i ON i.product_code = se.product_code
-                         JOIN "order" o ON o.order_num = i.order_num
-                WHERE se.store_ID = $1
-                  AND o.last_date_mod >= $2::timestamp
-                 AND o.last_date_mod < ($3::timestamp + INTERVAL '1 day')
-                 ),
-                 refunds AS (
-             SELECT COALESCE(SUM(rf.amount), 0) AS refund_total
-             FROM refund rf
-                 JOIN "order" o ON o.order_num = rf.order_num
-             WHERE LEFT(o.order_num, 3) = $1
-               AND o.last_date_mod >= $2::timestamp
-               AND o.last_date_mod < ($3::timestamp + INTERVAL '1 day')
-               AND rf.status IN ('approved', 'processed')
-                 )
-            SELECT sales.revenue, refunds.refund_total,
-                   sales.revenue - refunds.refund_total AS net_profit
-            FROM sales CROSS JOIN refunds`,
-            [storeId, startDate, endDate],
-            (err, result) => {
-                if (err) return callback(err);
-
-                const row = result.rows[0] || {};
-                const revenue = Number(row.revenue || 0);
-                const refundTotal = Number(row.refund_total || 0);
-                const netProfit = Number(row.net_profit || 0);
-
-                dbQuery(
-                    `SELECT COALESCE(SUM(
-                                             p.price * i.quantity
-                                                 * (1 - COALESCE(o.discount, 0) / 100.0)
-                                     ), 0) AS previous_revenue
-                     FROM sells se
-                              JOIN product p ON p.code = se.product_code
-                              JOIN includes i ON i.product_code = se.product_code
-                              JOIN "order" o ON o.order_num = i.order_num
-                     WHERE se.store_ID = $1
-                       AND o.last_date_mod >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
-                       AND o.last_date_mod < DATE_TRUNC('month', CURRENT_DATE)`,
-                    [storeId],
-                    (previousErr, previousResult) => {
-                        if (previousErr) return callback(previousErr);
-
-                        const previousRevenue = Number(previousResult.rows[0]?.previous_revenue || 0);
-                        const growth = previousRevenue === 0
-                            ? (revenue > 0 ? 100 : 0)
-                            : ((revenue - previousRevenue) / previousRevenue) * 100;
-
-                        dbQuery(
-                            `INSERT INTO report
-                             (date, store_ID, overall_profit, sales_trend, marketing_growth, owner_signature)
-                             VALUES
-                                 (CURRENT_TIMESTAMP, $1, $2, $3, $4, $5)
-                                 RETURNING date, store_ID, overall_profit, sales_trend, marketing_growth, owner_signature`,
-                            [
-                                storeId,
-                                Math.max(0, netProfit),
-                                `Revenue ${revenue.toFixed(2)}; Refunds ${refundTotal.toFixed(2)}`.slice(0, 100),
-                                `${growth.toFixed(2)}%`,
-                                ownerSignature || 'Not signed yet'
-                            ],
-                            (insertErr, insertResult) => {
-                                if (insertErr) return callback(insertErr);
-
-                                const report = insertResult.rows[0];
-
-                                dbQuery(
-                                    `INSERT INTO monthly_profit
-                                         (report_date, store_ID, month_and_year, profit)
-                                     VALUES
-                                         ($1, $2, DATE_TRUNC('month', $3::timestamp)::DATE, $4)
-                                         ON CONFLICT (report_date, store_ID)
-                                     DO UPDATE SET
-                                        month_and_year = EXCLUDED.month_and_year,
-                                                                                     profit = EXCLUDED.profit`,
-                                    [report.date, storeId, endDate, Math.max(0, netProfit)],
-                                    (monthlyErr) => {
-                                        if (monthlyErr) console.error('Warning inserting monthly profit:', monthlyErr);
-
-                                        dbQuery(
-                                            `INSERT INTO exchanges_data
-                                                 (report_date, store_ID, monthly_profit, date, sales, damages)
-                                             VALUES ($1, $2, $3, CURRENT_TIMESTAMP, $4, $5)
-                                                 ON CONFLICT (report_date, store_ID)
-                                             DO UPDATE SET
-                                                monthly_profit = EXCLUDED.monthly_profit,
-                                                                                                     date = EXCLUDED.date,
-                                                                                                     sales = EXCLUDED.sales,
-                                                                                                     damages = EXCLUDED.damages`,
-                                            [report.date, storeId, Math.max(0, netProfit), revenue, -refundTotal],
-                                            (exchangeErr) => {
-                                                if (exchangeErr) console.error('Warning inserting exchange data:', exchangeErr);
-                                                callback(null, report);
-                                            }
-                                        );
-                                    }
-                                );
-                            }
-                        );
-                    }
-                );
-            }
-        );
-    },
-
-    getEmployeeTasks(personalId, storeId, callback) {
-        dbQuery(`SELECT r.*,a.personal_id AS answered_by
-                 FROM request r
-                          JOIN for_store fs ON fs.request_num=r.request_num
-                          LEFT JOIN answers a ON a.request_num=r.request_num
-                 WHERE fs.store_ID=$1 AND (a.personal_id=$2 OR a.personal_id IS NULL)
-                 ORDER BY r.date_and_time DESC`,
-            [storeId,personalId],(err,result)=>callback(err,result?.rows||[]));
-    },
-
-    getClientStats(clientId, callback) {
-        dbQuery(`SELECT
-                         (SELECT COUNT(*) FROM "order" WHERE client_ID=$1)::int AS order_count,
-                         (SELECT COUNT(*) FROM review r JOIN "order" o ON o.order_num=r.order_num WHERE o.client_ID=$1)::int AS review_count,
-                         (SELECT COUNT(*) FROM makes_request WHERE client_ID=$1)::int AS request_count,
-                         (SELECT COUNT(*) FROM refund r JOIN "order" o ON o.order_num=r.order_num WHERE o.client_ID=$1)::int AS refund_count`,
-            [clientId],(err,result)=>callback(err,result?.rows?.[0]||{}));
-    }
-};
-
-
-
-// PostgreSQL schema initialization.
-// The schema is based on the supplied Pasted markdown.md. A few invalid PostgreSQL
-// declarations in the original paste are corrected here (for example DECIMMAL,
-// PARTIAL KEY, and composite-key column-name typos). The existing HTTP layer also
-// uses only the project schema plus the four authentication/audit support tables.
-(async () => {
+        });
+    });
+}
+
+// Initialize database on startup
+(async function() {
     try {
-        await database.initializeDatabase();
-        await database.installReportFunctions();
-        await database.installTriggersAndViews();
+        await initializeDatabase();
         console.log('✅ Database initialization completed');
     } catch (err) {
         console.error('❌ Database initialization failed:', err);
-        process.exitCode = 1;
     }
 })();
@@ -2777,46 +895,4 @@
         serveStaticFile(res, 'verify-2fa.html', 'text/html');
     } else if (pathname === '/admin.html') {
-        // Check if user is authenticated
-        const cookies = parseCookies(req);
-        const sessionId = cookies.sessionId;
-
-        if (!sessionId || !sessions.has(sessionId)) {
-            res.writeHead(302, { 'Location': '/login.html' });
-            res.end();
-            return;
-        }
-
-        // Get user from session
-        const userId = sessions.get(sessionId);
-
-        // Check if this is the admin user
-        if (userId !== '000000') {
-            // Not admin, redirect to appropriate dashboard
-            if (userId.startsWith('client_')) {
-                res.writeHead(302, { 'Location': '/client-dashboard.html' });
-            } else if (userId.startsWith('personal_')) {
-                // Check if store owner or employee
-                const personalId = userId.replace('personal_', '');
-
-                database.database.get(
-                    'SELECT boss_id FROM boss WHERE boss_id = $1',
-                    [personalId],
-                    (err, boss) => {
-                        if (boss) {
-                            res.writeHead(302, { 'Location': '/store-owner.html' });
-                        } else {
-                            res.writeHead(302, { 'Location': '/store-employee.html' });
-                        }
-                        res.end();
-                    }
-                );
-                return;
-            } else {
-                res.writeHead(302, { 'Location': '/dashboard.html' });
-            }
-            res.end();
-            return;
-        }
-
         serveStaticFile(res, 'admin.html', 'text/html');
     } else if (pathname === '/store-owner.html') {
@@ -2970,5 +1046,4 @@
 
             const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
-
             if (!emailRegex.test(formData.ownerEmail)) {
                 res.writeHead(400, { 'Content-Type': 'application/json' });
@@ -3052,5 +1127,4 @@
                                 // Next store number is max + 1, starting from 1 if no stores exist
                                 let nextStoreNumber = 1;
-
                                 if (result && result.max_store_num) {
                                     // Extract numeric part from store_id (format: XXX)
@@ -3435,5 +1509,4 @@
                                         database.database.run('ROLLBACK');
                                         console.error('Error inserting personal:', err);
-
                                         if (err.code === '23505') {
                                             res.writeHead(400, { 'Content-Type': 'application/json' });
@@ -3451,6 +1524,6 @@
                                     // Insert into boss table (boss_id is VARCHAR, references personal.id)
                                     database.database.run(
-                                        'INSERT INTO boss (boss_id) VALUES ($1)',
-                                        [tempStoreData.personalId],
+                                        'INSERT INTO boss (boss_id, signature) VALUES ($1, $2)',
+                                        [tempStoreData.personalId, tempStoreData.signature],
                                         (err) => {
                                             if (err) {
@@ -3484,54 +1557,36 @@
                                                             }
 
-                                                            // Also create entry in users table for login with force_password_change = 1
-                                                            database.database.run(
-                                                                'INSERT INTO users (id, username, email, password, user_type, force_password_change) VALUES ($1, $2, $3, $4, $5, $6)',
-                                                                [
-                                                                    tempStoreData.personalId,
-                                                                    `${tempStoreData.ownerFirstName} ${tempStoreData.ownerLastName}`,
-                                                                    tempStoreData.ownerEmail,
-                                                                    bcrypt.hashSync(tempStoreData.password, 10),
-                                                                    'store_owner',
-                                                                    1
-                                                                ],
-                                                                (err) => {
-                                                                    if (err) {
-                                                                        console.error('Error creating user entry for store owner:', err);
-                                                                    }
-
-                                                                    database.database.run('COMMIT', (commitErr) => {
-                                                                        if (commitErr) {
-                                                                            console.error('Error committing transaction:', commitErr);
-                                                                            database.database.run('ROLLBACK');
-                                                                            res.writeHead(500, { 'Content-Type': 'application/json' });
-                                                                            res.end(JSON.stringify({ success: false, message: 'Error completing registration' }));
-                                                                            return;
-                                                                        }
-
-                                                                        tempStoreRegistrations.delete(code);
-                                                                        verificationCodes.delete(email);
-
-                                                                        console.log(`✅ Store registration completed successfully:`);
-                                                                        console.log(`   Store ID: ${tempStoreData.storeId}`);
-                                                                        console.log(`   Store Name: ${tempStoreData.storeName}`);
-                                                                        console.log(`   Personal ID: ${tempStoreData.personalId}`);
-                                                                        console.log(`   Owner: ${tempStoreData.ownerFirstName} ${tempStoreData.ownerLastName}`);
-
-                                                                        database.logAudit(tempStoreData.personalId, 'STORE_REGISTER_SUCCESS', 'store', tempStoreData.storeId, `Store registered: ${tempStoreData.storeName}`, ipAddress);
-
-                                                                        res.writeHead(200, { 'Content-Type': 'application/json' });
-                                                                        res.end(JSON.stringify({
-                                                                            success: true,
-                                                                            message: 'Store registration successful! You can now login.',
-                                                                            storeId: tempStoreData.storeId,
-                                                                            storeIdPadded: tempStoreData.storeIdPadded,
-                                                                            storeName: tempStoreData.storeName,
-                                                                            personalId: tempStoreData.personalId,
-                                                                            userType: 'store_owner',
-                                                                            redirectTo: 'login.html'
-                                                                        }));
-                                                                    });
+                                                            database.database.run('COMMIT', (commitErr) => {
+                                                                if (commitErr) {
+                                                                    console.error('Error committing transaction:', commitErr);
+                                                                    database.database.run('ROLLBACK');
+                                                                    res.writeHead(500, { 'Content-Type': 'application/json' });
+                                                                    res.end(JSON.stringify({ success: false, message: 'Error completing registration' }));
+                                                                    return;
                                                                 }
-                                                            );
+
+                                                                tempStoreRegistrations.delete(code);
+                                                                verificationCodes.delete(email);
+
+                                                                console.log(`✅ Store registration completed successfully:`);
+                                                                console.log(`   Store ID: ${tempStoreData.storeId}`);
+                                                                console.log(`   Store Name: ${tempStoreData.storeName}`);
+                                                                console.log(`   Personal ID: ${tempStoreData.personalId}`);
+                                                                console.log(`   Owner: ${tempStoreData.ownerFirstName} ${tempStoreData.ownerLastName}`);
+
+                                                                database.logAudit(tempStoreData.personalId, 'STORE_REGISTER_SUCCESS', 'store', tempStoreData.storeId, `Store registered: ${tempStoreData.storeName}`, ipAddress);
+
+                                                                res.writeHead(200, { 'Content-Type': 'application/json' });
+                                                                res.end(JSON.stringify({
+                                                                    success: true,
+                                                                    message: 'Store registration successful! You can now login.',
+                                                                    storeId: tempStoreData.storeId,
+                                                                    storeIdPadded: tempStoreData.storeIdPadded,
+                                                                    storeName: tempStoreData.storeName,
+                                                                    personalId: tempStoreData.personalId,
+                                                                    userType: 'store_owner',
+                                                                    redirectTo: 'login.html'
+                                                                }));
+                                                            });
                                                         }
                                                     );
@@ -3613,5 +1668,4 @@
             } else {
                 const userId = 'user_' + Date.now().toString().slice(-8);
-
                 database.createUser(userId, tempUserData.username, tempUserData.email, tempUserData.password, tempUserData.userType, (err, userId) => {
                     if (err) {
@@ -3646,69 +1700,5 @@
         req.on('end', () => {
             const { email, password } = JSON.parse(body);
-
             console.log(`🔍 Login attempt for email: ${email}`);
-
-            // First check if it's the admin user (special case)
-            if (email === 'admin@handcraft.com') {
-                database.getUserByUsername('admin', (err, adminUser) => {
-                    if (err || !adminUser) {
-                        console.error('Admin user not found');
-                        database.logAudit(null, 'LOGIN_FAILED', 'auth', null, `Admin login failed - user not found`, ipAddress);
-                        res.writeHead(401, { 'Content-Type': 'application/json' });
-                        res.end(JSON.stringify({ success: false, message: 'Invalid email or password' }));
-                        return;
-                    }
-
-                    if (database.verifyPassword(password, adminUser.password)) {
-                        const isFirstTimeLogin = adminUser.force_password_change === 1;
-
-                        const twoFACode = generateVerificationCode();
-                        verificationCodes.set(adminUser.email, {
-                            code: twoFACode,
-                            timestamp: Date.now(),
-                            userId: adminUser.id,
-                            isFirstTimeLogin: isFirstTimeLogin,
-                            userType: 'admin',
-                            needsPasswordChange: isFirstTimeLogin
-                        });
-
-                        console.log(`⏰ Generated 2FA code for admin ${adminUser.email}`);
-
-                        send2FACode(adminUser.email, twoFACode)
-                            .then(() => {
-                                res.writeHead(200, { 'Content-Type': 'application/json' });
-                                res.end(JSON.stringify({
-                                    success: true,
-                                    message: 'Two-factor authentication code sent to your email',
-                                    requires2FA: true,
-                                    email: adminUser.email,
-                                    username: adminUser.username,
-                                    isFirstTimeLogin: isFirstTimeLogin,
-                                    userType: 'admin'
-                                }));
-                            })
-                            .catch(error => {
-                                console.error('Error sending 2FA email:', error);
-                                res.writeHead(200, { 'Content-Type': 'application/json' });
-                                res.end(JSON.stringify({
-                                    success: true,
-                                    message: 'Two-factor authentication required',
-                                    requires2FA: true,
-                                    email: adminUser.email,
-                                    username: adminUser.username,
-                                    isFirstTimeLogin: isFirstTimeLogin,
-                                    userType: 'admin',
-                                    developmentCode: twoFACode
-                                }));
-                            });
-                    } else {
-                        database.logAudit(adminUser.id, 'LOGIN_FAILED', 'auth', adminUser.id.toString(), 'Invalid password for admin', ipAddress);
-                        res.writeHead(401, { 'Content-Type': 'application/json' });
-                        res.end(JSON.stringify({ success: false, message: 'Invalid email or password' }));
-                    }
-                });
-
-                return;
-            }
 
             // First check if it's a client
@@ -3720,5 +1710,4 @@
                 if (client) {
                     console.log(`🔍 Found client: ${client.email}`);
-
                     if (!client.password) {
                         console.log('❌ Client has no password set');
@@ -3746,5 +1735,4 @@
 
                         console.log(`✅ Client login successful. Session: ${sessionId}, User: client_${clientId}`);
-
                         database.logAudit(clientId, 'LOGIN_SUCCESS', 'auth',
                             typeof clientId === 'string' ? clientId : String(clientId),
@@ -3769,5 +1757,4 @@
                         }));
                     });
-
                     return;
                 }
@@ -3781,5 +1768,4 @@
                     if (personal) {
                         console.log(`🔍 Found personal user: ${personal.email}`);
-
                         if (!personal.password) {
                             console.log('❌ Personal has no password set');
@@ -3800,5 +1786,5 @@
                             // Check if this is a boss (store owner)
                             database.database.get(
-                                'SELECT boss_id FROM boss WHERE boss_id = $1',
+                                'SELECT boss_id FROM boss WHERE boss_id = ?',
                                 [personal.id],
                                 (err, boss) => {
@@ -3811,5 +1797,5 @@
                                         // Check if first time login from users table
                                         database.database.get(
-                                            'SELECT force_password_change FROM users WHERE email = $1',
+                                            'SELECT force_password_change FROM users WHERE email = ?',
                                             [email],
                                             (err, user) => {
@@ -3855,5 +1841,4 @@
                                             }
                                         );
-
                                         return;
                                     }
@@ -3861,5 +1846,5 @@
                                     // Check if this is an employee
                                     database.database.get(
-                                        'SELECT employee_id FROM employees WHERE employee_id = $1',
+                                        'SELECT employee_id FROM employees WHERE employee_id = ?',
                                         [personal.id],
                                         (err, employee) => {
@@ -3871,5 +1856,5 @@
                                                 // This is an employee
                                                 database.database.get(
-                                                    'SELECT force_password_change FROM users WHERE email = $1',
+                                                    'SELECT force_password_change FROM users WHERE email = ?',
                                                     [email],
                                                     (err, user) => {
@@ -3915,5 +1900,4 @@
                                                     }
                                                 );
-
                                                 return;
                                             }
@@ -3922,5 +1906,5 @@
                                             // Treat as regular user
                                             database.database.get(
-                                                'SELECT * FROM users WHERE email = $1',
+                                                'SELECT * FROM users WHERE email = ?',
                                                 [email],
                                                 (err, user) => {
@@ -3935,5 +1919,6 @@
 
                                                             if (database.verifyPassword(password, userByUsername.password)) {
-                                                                const isFirstTimeLogin = userByUsername.force_password_change === 1;
+                                                                const isAdminUser = userByUsername.username === 'admin';
+                                                                const isFirstTimeLogin = isAdminUser && userByUsername.force_password_change === 1;
 
                                                                 const twoFACode = generateVerificationCode();
@@ -3943,5 +1928,5 @@
                                                                     userId: userByUsername.id,
                                                                     isFirstTimeLogin: isFirstTimeLogin,
-                                                                    userType: userByUsername.user_type,
+                                                                    userType: isAdminUser ? 'admin' : userByUsername.user_type,
                                                                     needsPasswordChange: isFirstTimeLogin
                                                                 });
@@ -3957,5 +1942,5 @@
                                                                             username: userByUsername.username,
                                                                             isFirstTimeLogin: isFirstTimeLogin,
-                                                                            userType: userByUsername.user_type
+                                                                            userType: isAdminUser ? 'admin' : userByUsername.user_type
                                                                         }));
                                                                     })
@@ -3970,5 +1955,5 @@
                                                                             username: userByUsername.username,
                                                                             isFirstTimeLogin: isFirstTimeLogin,
-                                                                            userType: userByUsername.user_type,
+                                                                            userType: isAdminUser ? 'admin' : userByUsername.user_type,
                                                                             developmentCode: twoFACode
                                                                         }));
@@ -3980,10 +1965,10 @@
                                                             }
                                                         });
-
                                                         return;
                                                     }
 
                                                     if (database.verifyPassword(password, user.password)) {
-                                                        const isFirstTimeLogin = user.force_password_change === 1;
+                                                        const isAdminUser = user.username === 'admin';
+                                                        const isFirstTimeLogin = isAdminUser && user.force_password_change === 1;
 
                                                         const twoFACode = generateVerificationCode();
@@ -3993,5 +1978,5 @@
                                                             userId: user.id,
                                                             isFirstTimeLogin: isFirstTimeLogin,
-                                                            userType: user.user_type,
+                                                            userType: isAdminUser ? 'admin' : user.user_type,
                                                             needsPasswordChange: isFirstTimeLogin
                                                         });
@@ -4007,5 +1992,5 @@
                                                                     username: user.username,
                                                                     isFirstTimeLogin: isFirstTimeLogin,
-                                                                    userType: user.user_type
+                                                                    userType: isAdminUser ? 'admin' : user.user_type
                                                                 }));
                                                             })
@@ -4020,5 +2005,5 @@
                                                                     username: user.username,
                                                                     isFirstTimeLogin: isFirstTimeLogin,
-                                                                    userType: user.user_type,
+                                                                    userType: isAdminUser ? 'admin' : user.user_type,
                                                                     developmentCode: twoFACode
                                                                 }));
@@ -4036,5 +2021,4 @@
                             );
                         });
-
                         return;
                     }
@@ -4080,6 +2064,6 @@
                                 timestamp: Date.now(),
                                 userId: userByUsername.id,
-                                isFirstTimeLogin: userByUsername.force_password_change === 1,
-                                needsPasswordChange: userByUsername.force_password_change === 1,
+                                isAdmin: userByUsername.username === 'admin' && userByUsername.force_password_change === 1,
+                                needsPasswordChange: userByUsername.username === 'admin' && userByUsername.force_password_change === 1,
                                 userType: userByUsername.user_type
                             });
@@ -4107,5 +2091,4 @@
                                 });
                         });
-
                         return;
                     }
@@ -4116,6 +2099,6 @@
                         timestamp: Date.now(),
                         userId: user.id,
-                        isFirstTimeLogin: user.force_password_change === 1,
-                        needsPasswordChange: user.force_password_change === 1,
+                        isAdmin: user.username === 'admin' && user.force_password_change === 1,
+                        needsPasswordChange: user.username === 'admin' && user.force_password_change === 1,
                         userType: user.user_type
                     });
@@ -4186,16 +2169,4 @@
                 verificationCodes.delete(email);
 
-                // Determine redirect based on user type
-                let redirectTo = 'change-password.html?forced=true';
-                if (verificationData.userType === 'store_owner') {
-                    redirectTo = 'change-password.html?forced=true&redirect=store-owner.html';
-                } else if (verificationData.userType === 'store_employee') {
-                    redirectTo = 'change-password.html?forced=true&redirect=store-employee.html';
-                } else if (verificationData.userType === 'admin') {
-                    redirectTo = 'change-password.html?forced=true&redirect=admin.html';
-                } else if (verificationData.userType === 'client') {
-                    redirectTo = 'change-password.html?forced=true&redirect=client-dashboard.html';
-                }
-
                 res.writeHead(200, {
                     'Content-Type': 'application/json',
@@ -4208,7 +2179,6 @@
                     requiresPasswordChange: true,
                     userType: verificationData.userType,
-                    redirectTo: redirectTo
+                    redirectTo: 'change-password.html?forced=true'
                 }));
-
                 return;
             }
@@ -4233,5 +2203,4 @@
             // Determine redirect based on user type
             let redirectTo = '';
-
             switch(verificationData.userType) {
                 case 'client':
@@ -4284,5 +2253,4 @@
             'Set-Cookie': 'sessionId=; HttpOnly; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict'
         });
-
         res.end(JSON.stringify({ success: true, message: 'Successfully logged out' }));
     }
@@ -4294,96 +2262,21 @@
 
             if (tempAdminSessions.has(sessionId)) {
-                // This is a temporary session (password change required)
-                // Get user info to determine type
-                database.getUserById(userId, (err, user) => {
-                    if (err || !user) {
-                        // Check if it's a personal user
-                        database.getPersonalById(userId, (err, personal) => {
-                            if (err || !personal) {
-                                res.writeHead(200, { 'Content-Type': 'application/json' });
-                                res.end(JSON.stringify({
-                                    success: true,
-                                    user: {
-                                        id: userId,
-                                        username: 'admin',
-                                        userType: 'admin',
-                                        needsPasswordChange: true
-                                    },
-                                    isTempSession: true
-                                }));
-                            } else {
-                                // Personal user (store owner/employee)
-                                database.database.get(
-                                    'SELECT boss_id FROM boss WHERE boss_id = $1',
-                                    [userId],
-                                    (err, boss) => {
-                                        let userType = 'store_employee';
-                                        if (boss) {
-                                            userType = 'store_owner';
-                                        }
-
-                                        res.writeHead(200, { 'Content-Type': 'application/json' });
-                                        res.end(JSON.stringify({
-                                            success: true,
-                                            user: {
-                                                id: personal.id,
-                                                firstName: personal.first_name,
-                                                lastName: personal.last_name,
-                                                email: personal.email,
-                                                userType: userType,
-                                                needsPasswordChange: true
-                                            },
-                                            isTempSession: true
-                                        }));
-                                    }
-                                );
-                            }
-                        });
-                    } else {
-                        // Regular user (admin)
-                        res.writeHead(200, { 'Content-Type': 'application/json' });
-                        res.end(JSON.stringify({
-                            success: true,
-                            user: {
-                                id: user.id,
-                                username: user.username,
-                                email: user.email,
-                                userType: user.user_type || 'admin',
-                                needsPasswordChange: true
-                            },
-                            isTempSession: true
-                        }));
-                    }
-                });
-
-                return;
-            }
-
-            // Regular session
+                res.writeHead(200, { 'Content-Type': 'application/json' });
+                res.end(JSON.stringify({
+                    success: true,
+                    user: {
+                        id: userId,
+                        username: 'admin',
+                        needsPasswordChange: true
+                    },
+                    isTempSession: true
+                }));
+                return;
+            }
+
             const userIdStr = String(userId);
 
-            if (userIdStr === '000000') {
-                // Admin user
-                database.getUserById(userIdStr, (err, user) => {
-                    if (err || !user) {
-                        res.writeHead(404, { 'Content-Type': 'application/json' });
-                        res.end(JSON.stringify({ success: false, message: 'User not found' }));
-                    } else {
-                        res.writeHead(200, { 'Content-Type': 'application/json' });
-                        res.end(JSON.stringify({
-                            success: true,
-                            user: {
-                                id: user.id,
-                                username: user.username,
-                                email: user.email,
-                                userType: 'admin'
-                            }
-                        }));
-                    }
-                });
-            }
-            else if (userIdStr.startsWith('client_')) {
+            if (userIdStr.startsWith('client_')) {
                 const clientId = parseInt(userIdStr.replace('client_', ''));
-
                 database.getClientById(clientId, (err, client) => {
                     if (err || !client) {
@@ -4407,5 +2300,4 @@
             else if (userIdStr.startsWith('personal_')) {
                 const personalId = userIdStr.replace('personal_', '');
-
                 database.getPersonalById(personalId, (err, personal) => {
                     if (err || !personal) {
@@ -4578,5 +2470,4 @@
                     } else {
                         database.logAudit(personalId, 'CATEGORY_CREATED', 'category', category.id.toString(), `New category created: ${category.name}`, ipAddress);
-
                         res.writeHead(200, { 'Content-Type': 'application/json' });
                         res.end(JSON.stringify({
@@ -4586,5 +2477,5 @@
                                 id: category.id,
                                 name: category.name,
-                                parent_id: category.parent_category_id,
+                                parent_id: category.parent_id,
                                 description: category.description
                             }
@@ -4637,4 +2528,5 @@
             req.on('end', () => {
                 const orderData = JSON.parse(body);
+
                 const userIdStr = String(userId);
 
@@ -4652,6 +2544,6 @@
 
                     database.database.get(
-                        'SELECT COUNT(*) AS order_count FROM "order" WHERE LEFT(order_num,3) = $1 AND SUBSTRING(order_num FROM 4 FOR 3)::INTEGER = ($2::INTEGER % 1000)',
-                        [storeId, new Date().getFullYear().toString()],
+                        'SELECT COUNT(*) as order_count FROM "order" WHERE store_id = $1 AND EXTRACT(YEAR FROM order_date) = $2',
+                        [storeId, new Date().getFullYear()],
                         (err, result) => {
                             if (err) {
@@ -4662,5 +2554,5 @@
                             }
 
-                            const orderCount = result ? result.order_count + 1 : 1;
+                            const orderCount = result && result[0] ? parseInt(result[0].order_count) + 1 : 1;
                             const orderNumPadded = orderCount.toString().padStart(5, '0');
 
@@ -4709,5 +2601,4 @@
             if (userIdStr.startsWith('client_')) {
                 const clientId = parseInt(userIdStr.replace('client_', ''));
-
                 database.getOrdersByClient(clientId, (err, orders) => {
                     if (err) {
@@ -4734,4 +2625,5 @@
             req.on('end', () => {
                 const reviewData = JSON.parse(body);
+
                 const userIdStr = String(userId);
 
@@ -4766,4 +2658,5 @@
             req.on('end', () => {
                 const requestData = JSON.parse(body);
+
                 const userIdStr = String(userId);
 
@@ -4783,6 +2676,6 @@
 
                     database.database.get(
-                        'SELECT COUNT(*)::int AS request_count FROM request r JOIN for_store fs ON fs.request_num=r.request_num WHERE fs.store_ID = $1 AND EXTRACT(YEAR FROM r.date_and_time)::int = $2::int AND EXTRACT(MONTH FROM r.date_and_time)::int = $3::int',
-                        [storeId, now.getFullYear().toString(), (now.getMonth() + 1).toString().padStart(2, '0')],
+                        'SELECT COUNT(*) as request_count FROM request WHERE store_id = $1 AND EXTRACT(YEAR FROM date_and_time) = $2 AND EXTRACT(MONTH FROM date_and_time) = $3',
+                        [storeId, now.getFullYear(), now.getMonth() + 1],
                         (err, result) => {
                             if (err) {
@@ -4793,5 +2686,5 @@
                             }
 
-                            const requestCount = result ? result.request_count + 1 : 1;
+                            const requestCount = result && result[0] ? parseInt(result[0].request_count) + 1 : 1;
                             const requestSeqPadded = requestCount.toString().padStart(2, '0');
 
@@ -4835,4 +2728,5 @@
             req.on('end', () => {
                 const refundData = JSON.parse(body);
+
                 const userIdStr = String(userId);
 
@@ -4841,8 +2735,8 @@
 
                     database.database.get(
-                        'SELECT LEFT(order_num,3) AS store_id FROM "order" WHERE order_num = $1',
+                        'SELECT store_id FROM "order" WHERE order_num = $1',
                         [refundData.order_num],
                         (err, result) => {
-                            if (err || !result) {
+                            if (err || !result || result.length === 0) {
                                 res.writeHead(404, { 'Content-Type': 'application/json' });
                                 res.end(JSON.stringify({ success: false, message: 'Order not found' }));
@@ -4850,5 +2744,6 @@
                             }
 
-                            const storeId = result.store_id;
+                            const storeId = result[0].store_id;
+
                             const now = new Date();
                             const month = (now.getMonth() + 1).toString().padStart(2, '0');
@@ -4856,6 +2751,6 @@
 
                             database.database.get(
-                                'SELECT COUNT(*)::int AS refund_count FROM refund WHERE SUBSTRING(refund_id::text FROM 4 FOR 2)::int = $2::int AND SUBSTRING(refund_id::text FROM 6 FOR 3)::int = ($1::int % 1000)',
-                                [now.getFullYear().toString(), (now.getMonth() + 1).toString().padStart(2, '0')],
+                                'SELECT COUNT(*) as refund_count FROM refund WHERE EXTRACT(YEAR FROM request_date) = $1 AND EXTRACT(MONTH FROM request_date) = $2',
+                                [now.getFullYear(), now.getMonth() + 1],
                                 (err, result) => {
                                     if (err) {
@@ -4866,5 +2761,5 @@
                                     }
 
-                                    const refundCount = result ? result.refund_count + 1 : 1;
+                                    const refundCount = result && result[0] ? parseInt(result[0].refund_count) + 1 : 1;
                                     const refundSeqPadded = refundCount.toString().padStart(2, '0');
 
@@ -4933,7 +2828,6 @@
                                 }
 
-                                // PostgreSQL: extract the numeric product sequence from the store-prefixed product code
                                 database.database.get(
-                                    'SELECT MAX(CAST(SUBSTRING(code FROM 4) AS INTEGER)) AS max_product_num FROM product WHERE LEFT(code,3) = $1',
+                                    'SELECT MAX(CAST(SUBSTRING(code FROM 4) AS INTEGER)) as max_product_num FROM product WHERE store_id = $1',
                                     [storeId],
                                     (err, result) => {
@@ -5004,5 +2898,5 @@
 
                 database.database.get(
-                    'SELECT LEFT(code,3) AS store_id FROM product WHERE code = $1',
+                    'SELECT store_id FROM product WHERE code = $1',
                     [productData.code],
                     (err, product) => {
@@ -5087,5 +2981,4 @@
     }
 
-    // Updated /api/force-change-password endpoint with redirect handling
     else if (pathname === '/api/force-change-password' && req.method === 'POST') {
         const cookies = parseCookies(req);
@@ -5104,203 +2997,67 @@
         });
         req.on('end', () => {
-            try {
-                const { newPassword, confirmPassword, redirectTo } = JSON.parse(body);
-
-                if (!newPassword || !confirmPassword) {
-                    res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({ success: false, message: 'All fields are required' }));
+            const { currentPassword, newPassword, confirmPassword } = JSON.parse(body);
+
+            if (!currentPassword || !newPassword || !confirmPassword) {
+                res.writeHead(400, { 'Content-Type': 'application/json' });
+                res.end(JSON.stringify({ success: false, message: 'All fields are required' }));
+                return;
+            }
+
+            if (newPassword !== confirmPassword) {
+                res.writeHead(400, { 'Content-Type': 'application/json' });
+                res.end(JSON.stringify({ success: false, message: 'New passwords do not match' }));
+                return;
+            }
+
+            if (!validatePassword(newPassword)) {
+                res.writeHead(400, { 'Content-Type': 'application/json' });
+                res.end(JSON.stringify({
+                    success: false,
+                    message: 'Password must have at least 8 characters, including uppercase, lowercase, number and special character'
+                }));
+                return;
+            }
+
+            database.getUserByUsername('admin', (err, user) => {
+                if (err || !user) {
+                    res.writeHead(404, { 'Content-Type': 'application/json' });
+                    res.end(JSON.stringify({ success: false, message: 'User not found' }));
                     return;
                 }
 
-                if (newPassword !== confirmPassword) {
-                    res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({ success: false, message: 'New passwords do not match' }));
-                    return;
-                }
-
-                if (!validatePassword(newPassword)) {
-                    res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({
-                        success: false,
-                        message: 'Password must have at least 8 characters, including uppercase, lowercase, number and special character'
-                    }));
-                    return;
-                }
-
-                // First, try to find the user in the users table (for admin)
-                database.getUserById(userId, (err, user) => {
-                    if (err) {
-                        console.error('Error finding user by ID:', err);
+                database.verifyPassword(currentPassword, user.password, (err, isValid) => {
+                    if (err || !isValid) {
+                        res.writeHead(400, { 'Content-Type': 'application/json' });
+                        res.end(JSON.stringify({ success: false, message: 'Current password is incorrect' }));
+                        return;
                     }
 
-                    if (user) {
-                        // Found in users table (admin or regular user)
-                        console.log('Found user in users table:', user);
-
-                        const hashedPassword = bcrypt.hashSync(newPassword, 10);
-
-                        database.database.run(
-                            'UPDATE users SET password = $1, force_password_change = FALSE WHERE id = $2',
-                            [hashedPassword, userId],
-                            function(err) {
-                                if (err) {
-                                    console.error('Error updating password:', err);
-                                    res.writeHead(500, { 'Content-Type': 'application/json' });
-                                    res.end(JSON.stringify({ success: false, message: 'Failed to update password' }));
-                                    return;
-                                }
-
-                                // Also update password in personal table if it exists (for admin)
-                                database.database.run(
-                                    'UPDATE personal SET password = $1 WHERE id = $2',
-                                    [hashedPassword, userId],
-                                    function(err) {
-                                        if (err) {
-                                            console.log('No personal record to update for ID:', userId);
-                                        }
-                                    }
-                                );
-
-                                // Clear temp session
-                                tempAdminSessions.delete(sessionId);
-
-                                // Create new permanent session
-                                const newSessionId = generateSessionId();
-
-                                // Determine how to store the user ID based on user type
-                                let sessionUserId = String(userId);
-
-                                if (user.user_type === 'store_owner' || user.user_type === 'store_employee') {
-                                    sessionUserId = `personal_${userId}`;
-                                }
-
-                                sessions.set(newSessionId, sessionUserId);
-
-                                // Determine redirect based on user type or provided redirectTo
-                                let finalRedirect = redirectTo || 'dashboard.html';
-
-                                if (!redirectTo) {
-                                    if (user.username === 'admin' || user.user_type === 'admin') {
-                                        finalRedirect = 'admin.html';
-                                    } else if (user.user_type === 'store_owner') {
-                                        finalRedirect = 'store-owner.html';
-                                    } else if (user.user_type === 'store_employee') {
-                                        finalRedirect = 'store-employee.html';
-                                    } else if (user.user_type === 'client') {
-                                        finalRedirect = 'client-dashboard.html';
-                                    }
-                                }
-
-                                console.log(`Password changed successfully for user ${userId}, redirecting to ${finalRedirect}`);
-
-                                database.logAudit(userId, 'FORCED_PASSWORD_CHANGE', 'auth', userId.toString(),
-                                    `${user.user_type || 'user'} forced password change completed`, ipAddress);
-
-                                // Set the cookie with proper options
-                                res.writeHead(200, {
-                                    'Content-Type': 'application/json',
-                                    'Set-Cookie': `sessionId=${newSessionId}; HttpOnly; Path=/; Max-Age=86400; SameSite=Strict` // Extended to 24 hours
-                                });
-
-                                res.end(JSON.stringify({
-                                    success: true,
-                                    message: 'Password changed successfully.',
-                                    redirectTo: finalRedirect,
-                                    userType: user.user_type || 'user'
-                                }));
-                            }
-                        );
-                    } else {
-                        // Not found in users table, check personal table (for store owners/employees)
-                        console.log('User not found in users table, checking personal table for ID:', userId);
-
-                        database.getPersonalById(userId, (err, personal) => {
-                            if (err) {
-                                console.error('Error finding personal by ID:', err);
-                            }
-
-                            if (personal) {
-                                console.log('Found user in personal table:', personal);
-
-                                // Update password in personal table
-                                const hashedPassword = bcrypt.hashSync(newPassword, 10);
-
-                                database.database.run(
-                                    'UPDATE personal SET password = $1 WHERE id = $2',
-                                    [hashedPassword, userId],
-                                    function(err) {
-                                        if (err) {
-                                            console.error('Error updating personal password:', err);
-                                            res.writeHead(500, { 'Content-Type': 'application/json' });
-                                            res.end(JSON.stringify({ success: false, message: 'Failed to update password' }));
-                                            return;
-                                        }
-
-                                        // Also update in users table if exists
-                                        database.database.run(
-                                            'UPDATE users SET password = $1, force_password_change = FALSE WHERE email = $2',
-                                            [hashedPassword, personal.email],
-                                            function(err) {
-                                                if (err) {
-                                                    console.log('No users record to update for email:', personal.email);
-                                                }
-                                            }
-                                        );
-
-                                        // Determine user type (boss/owner or employee)
-                                        database.database.get(
-                                            'SELECT boss_id FROM boss WHERE boss_id = $1',
-                                            [userId],
-                                            (err, boss) => {
-                                                let userType = 'store_employee';
-                                                let finalRedirect = redirectTo || 'store-employee.html';
-
-                                                if (boss) {
-                                                    userType = 'store_owner';
-                                                    finalRedirect = redirectTo || 'store-owner.html';
-                                                }
-
-                                                // Clear temp session
-                                                tempAdminSessions.delete(sessionId);
-
-                                                // Create new permanent session with personal_ prefix
-                                                const newSessionId = generateSessionId();
-                                                sessions.set(newSessionId, `personal_${userId}`);
-
-                                                console.log(`Password changed successfully for ${userType} ${userId}, redirecting to ${finalRedirect}`);
-
-                                                database.logAudit(userId, 'FORCED_PASSWORD_CHANGE', 'auth', userId.toString(),
-                                                    `${userType} forced password change completed`, ipAddress);
-
-                                                // Set the cookie with proper options - extended to 24 hours
-                                                res.writeHead(200, {
-                                                    'Content-Type': 'application/json',
-                                                    'Set-Cookie': `sessionId=${newSessionId}; HttpOnly; Path=/; Max-Age=86400; SameSite=Strict`
-                                                });
-
-                                                res.end(JSON.stringify({
-                                                    success: true,
-                                                    message: 'Password changed successfully.',
-                                                    redirectTo: finalRedirect,
-                                                    userType: userType
-                                                }));
-                                            }
-                                        );
-                                    }
-                                );
-                            } else {
-                                // User not found in any table
-                                console.error('User not found in any table with ID:', userId);
-                                res.writeHead(404, { 'Content-Type': 'application/json' });
-                                res.end(JSON.stringify({ success: false, message: 'User not found' }));
-                            }
-                        });
-                    }
+                    database.updatePasswordAndClearForce(userId, newPassword, (err) => {
+                        if (err) {
+                            res.writeHead(500, { 'Content-Type': 'application/json' });
+                            res.end(JSON.stringify({ success: false, message: 'Failed to update password' }));
+                        } else {
+                            tempAdminSessions.delete(sessionId);
+
+                            const newSessionId = generateSessionId();
+                            sessions.set(newSessionId, String(userId));
+
+                            database.logAudit(userId, 'FORCED_PASSWORD_CHANGE', 'auth', userId.toString(),
+                                'Admin forced password change completed', ipAddress);
+
+                            res.writeHead(200, {
+                                'Content-Type': 'application/json',
+                                'Set-Cookie': `sessionId=${newSessionId}; HttpOnly; Path=/; Max-Age=3600; SameSite=Strict`
+                            });
+                            res.end(JSON.stringify({
+                                success: true,
+                                message: 'Password changed successfully. You can now access the dashboard.',
+                                redirectTo: 'admin.html'
+                            }));
+                        }
+                    });
                 });
-            } catch (parseError) {
-                console.error('JSON parse error:', parseError);
-                res.writeHead(400, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Invalid request format' }));
-            }
+            });
         });
     }
@@ -5309,11 +3066,4 @@
         requireAuth(req, res, (userId) => {
             const userIdStr = String(userId);
-
-            // Check if this is the admin user
-            if (userIdStr === '000000') {
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Only store owners can register employees' }));
-                return;
-            }
 
             if (!userIdStr.startsWith('personal_')) {
@@ -5445,11 +3195,7 @@
                                                     database.database.run('ROLLBACK');
                                                     console.error('Error inserting personal:', err);
-
                                                     if (err.code === '23505') {
                                                         res.writeHead(400, { 'Content-Type': 'application/json' });
-                                                        res.end(JSON.stringify({
-                                                            success: false,
-                                                            message: 'This personal ID is already taken. Please try again.'
-                                                        }));
+                                                        res.end(JSON.stringify({ success: false, message: 'This personal ID is already taken. Please try again.' }));
                                                     } else {
                                                         res.writeHead(400, { 'Content-Type': 'application/json' });
@@ -5491,41 +3237,23 @@
                                                                         }
 
-                                                                        // Also create entry in users table for login with force_password_change = 1
-                                                                        database.database.run(
-                                                                            'INSERT INTO users (id, username, email, password, user_type, force_password_change) VALUES ($1, $2, $3, $4, $5, $6)',
-                                                                            [
-                                                                                newPersonalId,
-                                                                                `${firstName} ${lastName}`,
-                                                                                email,
-                                                                                bcrypt.hashSync(password, 10),
-                                                                                'store_employee',
-                                                                                1
-                                                                            ],
-                                                                            (err) => {
-                                                                                if (err) {
-                                                                                    console.error('Error creating user entry for employee:', err);
-                                                                                }
-
-                                                                                database.database.run('COMMIT', (err) => {
-                                                                                    if (err) {
-                                                                                        database.database.run('ROLLBACK');
-                                                                                        console.error('Error committing transaction:', err);
-                                                                                        res.writeHead(500, { 'Content-Type': 'application/json' });
-                                                                                        res.end(JSON.stringify({ success: false, message: 'Error completing registration' }));
-                                                                                        return;
-                                                                                    }
-
-                                                                                    database.logAudit(personalId, 'EMPLOYEE_REGISTERED', 'employee', newPersonalId, `Employee registered: ${firstName} ${lastName}`, ipAddress);
-
-                                                                                    res.writeHead(200, { 'Content-Type': 'application/json' });
-                                                                                    res.end(JSON.stringify({
-                                                                                        success: true,
-                                                                                        message: 'Employee registered successfully!',
-                                                                                        employeeId: newPersonalId,
-                                                                                        name: `${firstName} ${lastName}`
-                                                                                    }));
-                                                                                });
+                                                                        database.database.run('COMMIT', (err) => {
+                                                                            if (err) {
+                                                                                database.database.run('ROLLBACK');
+                                                                                console.error('Error committing transaction:', err);
+                                                                                res.writeHead(500, { 'Content-Type': 'application/json' });
+                                                                                res.end(JSON.stringify({ success: false, message: 'Error completing registration' }));
+                                                                                return;
                                                                             }
-                                                                        );
+
+                                                                            database.logAudit(personalId, 'EMPLOYEE_REGISTERED', 'employee', newPersonalId, `Employee registered: ${firstName} ${lastName}`, ipAddress);
+
+                                                                            res.writeHead(200, { 'Content-Type': 'application/json' });
+                                                                            res.end(JSON.stringify({
+                                                                                success: true,
+                                                                                message: 'Employee registered successfully!',
+                                                                                employeeId: newPersonalId,
+                                                                                name: `${firstName} ${lastName}`
+                                                                            }));
+                                                                        });
                                                                     }
                                                                 );
@@ -5550,11 +3278,4 @@
             const userIdStr = String(userId);
 
-            // Check if this is the admin user
-            if (userIdStr === '000000') {
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Only store owners can delete employees' }));
-                return;
-            }
-
             if (!userIdStr.startsWith('personal_')) {
                 res.writeHead(403, { 'Content-Type': 'application/json' });
@@ -5666,32 +3387,21 @@
                                                                                     }
 
-                                                                                    // Also delete from users table
-                                                                                    database.database.run(
-                                                                                        'DELETE FROM users WHERE id = $1',
-                                                                                        [employeeId],
-                                                                                        (err) => {
-                                                                                            if (err) {
-                                                                                                console.error('Error deleting from users:', err);
-                                                                                            }
-
-                                                                                            database.database.run('COMMIT', (commitErr) => {
-                                                                                                if (commitErr) {
-                                                                                                    database.database.run('ROLLBACK');
-                                                                                                    console.error('Error committing transaction:', commitErr);
-                                                                                                    res.writeHead(500, { 'Content-Type': 'application/json' });
-                                                                                                    res.end(JSON.stringify({ success: false, message: 'Error completing deletion' }));
-                                                                                                    return;
-                                                                                                }
-
-                                                                                                database.logAudit(personalId, 'EMPLOYEE_DELETED', 'employee', employeeId, `Employee deleted from store ${storeId}`, ipAddress);
-
-                                                                                                res.writeHead(200, { 'Content-Type': 'application/json' });
-                                                                                                res.end(JSON.stringify({
-                                                                                                    success: true,
-                                                                                                    message: 'Employee deleted successfully'
-                                                                                                }));
-                                                                                            });
+                                                                                    database.database.run('COMMIT', (commitErr) => {
+                                                                                        if (commitErr) {
+                                                                                            database.database.run('ROLLBACK');
+                                                                                            console.error('Error committing transaction:', commitErr);
+                                                                                            res.writeHead(500, { 'Content-Type': 'application/json' });
+                                                                                            res.end(JSON.stringify({ success: false, message: 'Error completing deletion' }));
+                                                                                            return;
                                                                                         }
-                                                                                    );
+
+                                                                                        database.logAudit(personalId, 'EMPLOYEE_DELETED', 'employee', employeeId, `Employee deleted from store ${storeId}`, ipAddress);
+
+                                                                                        res.writeHead(200, { 'Content-Type': 'application/json' });
+                                                                                        res.end(JSON.stringify({
+                                                                                            success: true,
+                                                                                            message: 'Employee deleted successfully'
+                                                                                        }));
+                                                                                    });
                                                                                 }
                                                                             );
@@ -5719,11 +3429,4 @@
             const userIdStr = String(userId);
 
-            // Check if this is the admin user
-            if (userIdStr === '000000') {
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Only store owners can update employee status' }));
-                return;
-            }
-
             if (!userIdStr.startsWith('personal_')) {
                 res.writeHead(403, { 'Content-Type': 'application/json' });
@@ -5825,11 +3528,4 @@
             const userIdStr = String(userId);
 
-            // Check if this is the admin user
-            if (userIdStr === '000000') {
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Only store owners can update employees' }));
-                return;
-            }
-
             if (!userIdStr.startsWith('personal_')) {
                 res.writeHead(403, { 'Content-Type': 'application/json' });
@@ -5887,10 +3583,10 @@
 
                                         if (firstName) {
-                                            updates.push(`first_name = $${params.length + 1}`);
+                                            updates.push('first_name = $' + (params.length + 1));
                                             params.push(firstName);
                                         }
 
                                         if (lastName) {
-                                            updates.push(`last_name = $${params.length + 1}`);
+                                            updates.push('last_name = $' + (params.length + 1));
                                             params.push(lastName);
                                         }
@@ -5902,5 +3598,5 @@
                                                 return;
                                             }
-                                            updates.push(`email = $${params.length + 1}`);
+                                            updates.push('email = $' + (params.length + 1));
                                             params.push(email);
                                         }
@@ -5923,38 +3619,4 @@
                                                     res.end(JSON.stringify({ success: false, message: 'Error updating employee information' }));
                                                     return;
-                                                }
-
-                                                // Also update in users table if email was changed
-                                                if (email) {
-                                                    database.database.run(
-                                                        'UPDATE users SET email = $1 WHERE id = $2',
-                                                        [email, employeeId],
-                                                        (err) => {
-                                                            if (err) {
-                                                                console.error('Error updating user email:', err);
-                                                            }
-                                                        }
-                                                    );
-                                                }
-
-                                                if (firstName || lastName) {
-                                                    database.database.get(
-                                                        'SELECT first_name, last_name FROM personal WHERE id = $1',
-                                                        [employeeId],
-                                                        (err, personal) => {
-                                                            if (!err && personal) {
-                                                                const newUsername = `${personal.first_name} ${personal.last_name}`;
-                                                                database.database.run(
-                                                                    'UPDATE users SET username = $1 WHERE id = $2',
-                                                                    [newUsername, employeeId],
-                                                                    (err) => {
-                                                                        if (err) {
-                                                                            console.error('Error updating user username:', err);
-                                                                        }
-                                                                    }
-                                                                );
-                                                            }
-                                                        }
-                                                    );
                                                 }
 
@@ -6004,5 +3666,4 @@
                     }
                 );
-
                 return;
             }
@@ -6058,5 +3719,4 @@
                     }
                 );
-
                 return;
             }
@@ -6112,5 +3772,4 @@
                     }
                 );
-
                 return;
             }
@@ -6166,5 +3825,4 @@
                     }
                 );
-
                 return;
             }
@@ -6220,5 +3878,4 @@
                     }
                 );
-
                 return;
             }
@@ -6248,66 +3905,7 @@
     }
 
-    else if (pathname === '/api/advanced-reports' && req.method === 'GET') {
-        requireRole('admin')(req, res, () => {
-            const reportName = parsedUrl.query.report;
-
-            if (!reportName) {
-                res.writeHead(400, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({
-                    success: false,
-                    message: 'The report query parameter is required'
-                }));
-                return;
-            }
-
-            let params = [];
-
-            if (reportName === 'get_low_stock_high_demand_products') {
-                const stockThreshold = Number(parsedUrl.query.stockThreshold ?? 5);
-                const demandThreshold = Number(parsedUrl.query.demandThreshold ?? 5);
-
-                if (!Number.isInteger(stockThreshold) || !Number.isInteger(demandThreshold)) {
-                    res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({
-                        success: false,
-                        message: 'stockThreshold and demandThreshold must be integers'
-                    }));
-                    return;
-                }
-
-                params = [stockThreshold, demandThreshold];
-            }
-
-            database.runReport(reportName, params, (err, rows) => {
-                if (err) {
-                    console.error('Error executing report:', err);
-                    res.writeHead(500, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({
-                        success: false,
-                        message: 'Error executing report: ' + err.message
-                    }));
-                    return;
-                }
-
-                res.writeHead(200, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({
-                    success: true,
-                    report: reportName,
-                    rows
-                }));
-            });
-        });
-    }
-
     else if (pathname === '/api/employee-tasks' && req.method === 'GET') {
         requireAuth(req, res, (userId) => {
             const userIdStr = String(userId);
-
-            // Check if this is the admin user
-            if (userIdStr === '000000') {
-                res.writeHead(403, { 'Content-Type': 'application/json' });
-                res.end(JSON.stringify({ success: false, message: 'Only store employees can access this endpoint' }));
-                return;
-            }
 
             if (!userIdStr.startsWith('personal_')) {
@@ -6434,38 +4032,13 @@
         requireStoreOwner()(req, res, (personalId) => {
             let body = '';
-
             req.on('data', chunk => {
                 body += chunk.toString();
             });
-
             req.on('end', () => {
-                let data;
-
-                try {
-                    data = JSON.parse(body);
-                } catch (err) {
-                    res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({
-                        success: false,
-                        message: 'Invalid JSON request body'
-                    }));
-                    return;
-                }
-
-                const {
-                    storeId,
-                    period,
-                    startDate,
-                    endDate,
-                    type,
-                    ownerSignature
-                } = data;
+                const { storeId, period, startDate, endDate, type } = JSON.parse(body);
 
                 if (!storeId || !period || !startDate || !endDate || !type) {
                     res.writeHead(400, { 'Content-Type': 'application/json' });
-                    res.end(JSON.stringify({
-                        success: false,
-                        message: 'All fields are required'
-                    }));
+                    res.end(JSON.stringify({ success: false, message: 'All fields are required' }));
                     return;
                 }
@@ -6477,62 +4050,38 @@
                         if (err || !ownsStore) {
                             res.writeHead(403, { 'Content-Type': 'application/json' });
-                            res.end(JSON.stringify({
-                                success: false,
-                                message: 'You are not authorized to generate reports for this store'
-                            }));
+                            res.end(JSON.stringify({ success: false, message: 'You are not authorized to generate reports for this store' }));
                             return;
                         }
 
-                        database.generateStoreReport(
-                            storeId,
-                            startDate,
-                            endDate,
-                            type,
-                            period,
-                            ownerSignature,
-                            (reportErr, report) => {
-                                if (reportErr) {
-                                    console.error('Error generating report:', reportErr);
+                        const reportId = 'RPT' + Date.now().toString().slice(-6);
+
+                        database.database.run(
+                            'INSERT INTO report (id, store_id, period, start_date, end_date, type, generated_by, generated_at) VALUES ($1, $2, $3, $4, $5, $6, $7, CURRENT_TIMESTAMP)',
+                            [reportId, storeId, period, startDate, endDate, type, personalId],
+                            function(err) {
+                                if (err) {
+                                    console.error('Error generating report:', err);
                                     res.writeHead(500, { 'Content-Type': 'application/json' });
+                                    res.end(JSON.stringify({ success: false, message: 'Error generating report: ' + err.message }));
+                                } else {
+                                    database.logAudit(personalId, 'REPORT_GENERATED', 'report', reportId, `Report generated: ${type} for ${period}`, ipAddress);
+
+                                    res.writeHead(200, { 'Content-Type': 'application/json' });
                                     res.end(JSON.stringify({
-                                        success: false,
-                                        message: 'Error generating report: ' + reportErr.message
+                                        success: true,
+                                        message: 'Report generated successfully',
+                                        reportId: reportId,
+                                        report: {
+                                            id: reportId,
+                                            storeId: storeId,
+                                            period: period,
+                                            startDate: startDate,
+                                            endDate: endDate,
+                                            type: type,
+                                            generatedBy: personalId,
+                                            generatedAt: new Date().toISOString()
+                                        }
                                     }));
-                                    return;
                                 }
-
-                                const reportId =
-                                    'RPT' +
-                                    new Date(report.date).getTime().toString().slice(-6);
-
-                                database.logAudit(
-                                    personalId,
-                                    'REPORT_GENERATED',
-                                    'report',
-                                    reportId,
-                                    `Report generated: ${type} for ${period}`,
-                                    ipAddress
-                                );
-
-                                res.writeHead(200, { 'Content-Type': 'application/json' });
-                                res.end(JSON.stringify({
-                                    success: true,
-                                    message: 'Report generated successfully',
-                                    reportId,
-                                    report: {
-                                        id: reportId,
-                                        storeId: report.store_id,
-                                        period,
-                                        startDate,
-                                        endDate,
-                                        type,
-                                        generatedBy: personalId,
-                                        generatedAt: report.date,
-                                        overallProfit: report.overall_profit,
-                                        salesTrend: report.sales_trend,
-                                        marketingGrowth: report.marketing_growth,
-                                        ownerSignature: report.owner_signature
-                                    }
-                                }));
                             }
                         );
Index: view-database.js
===================================================================
--- view-database.js	(revision 2d1ec46933bbbd721e985423c96581bc0a7485ed)
+++ view-database.js	(revision 69f2a41cff81a4c7825abb68eb0f0eff6818e4e5)
@@ -3,10 +3,5 @@
 
 const dbPath = path.join(__dirname, 'database', 'handcraft.db');
-const db = new sqlite3.Database(dbPath, (err) => {
-    if (err) {
-        console.error('Error opening database:', err.message);
-        process.exit(1);
-    }
-});
+const db = new sqlite3.Database(dbPath);
 
 console.log('\n🎨 HANDCRAFT MARKETPLACE - DATABASE CONTENTS\n');
@@ -30,82 +25,43 @@
 }
 
-// Main execution chain
-function executeChecks() {
-    let currentCheck = 0;
-
-    const checks = [
-        { name: 'clients', func: checkClients },
-        { name: 'personal', func: checkPersonal },
-        { name: 'store', func: checkStore },
-        { name: 'product', func: checkProduct },
-        { name: 'category', func: checkCategory },
-        { name: 'works_in_store', func: checkWorksInStore },
-        { name: 'permissions', func: checkPermissions },
-        { name: 'employees', func: checkEmployees },
-        { name: 'boss', func: checkBoss },
-        { name: 'order', func: checkOrder },
-        { name: 'report', func: checkReport },
-        { name: 'refund', func: checkRefund },
-        { name: 'image', func: checkImage },
-        { name: 'color', func: checkColor }
-    ];
-
-    function next() {
-        currentCheck++;
-        if (currentCheck < checks.length) {
-            checks[currentCheck].func(next);
+// Display CLIENTS table
+console.log('\n👤 CLIENTS TABLE:');
+console.log('================================================================================');
+tableExists('client', (exists) => {
+    if (!exists) {
+        console.log('Table does not exist');
+        checkNext();
+        return;
+    }
+
+    db.all('SELECT * FROM client', [], (err, rows) => {
+        if (err) {
+            console.log(`Error: ${err.message}`);
+            checkNext();
+            return;
+        }
+
+        if (!rows || rows.length === 0) {
+            console.log('No clients found');
         } else {
-            finish();
-        }
-    }
-
-    // Start with first check
-    checks[0].func(next);
-}
-
-// Display CLIENTS table
-function checkClients(next) {
-    console.log('\n👤 CLIENTS TABLE:');
-    console.log('================================================================================');
-
-    tableExists('client', (exists) => {
-        if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
-            return;
-        }
-
-        db.all('SELECT * FROM client', [], (err, rows) => {
-            if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No clients found\n');
-            } else {
-                console.log(`Total: ${rows.length} clients\n`);
-                rows.forEach((client, index) => {
-                    console.log(`ID: ${client.client_id} | Name: ${client.first_name || ''} ${client.last_name || ''}`);
-                    console.log(`Email: ${client.email || 'N/A'}`);
-                    if (index < rows.length - 1) console.log('-'.repeat(80));
-                });
-                console.log(); // Add blank line after table
-            }
-            if (next) next();
-        });
-    });
-}
+            console.log(`Total: ${rows.length} clients\n`);
+            rows.forEach((client, index) => {
+                console.log(`ID: ${client.client_id} | Name: ${client.first_name || ''} ${client.last_name || ''}`);
+                console.log(`Email: ${client.email || 'N/A'}`);
+                if (index < rows.length - 1) console.log('-'.repeat(80));
+            });
+        }
+        checkNext();
+    });
+});
 
 // Display PERSONAL table
-function checkPersonal(next) {
+function checkPersonal() {
     console.log('\n👔 PERSONAL TABLE (STORE OWNERS/EMPLOYEES):');
     console.log('================================================================================');
-
     tableExists('personal', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkStore();
             return;
         }
@@ -121,11 +77,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No personal records found\n');
+                console.log(`Error: ${err.message}`);
+                checkStore();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No personal records found');
             } else {
                 console.log(`Total: ${rows.length} personal records\n`);
@@ -135,7 +91,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkStore();
         });
     });
@@ -143,12 +98,11 @@
 
 // Display STORE table
-function checkStore(next) {
+function checkStore() {
     console.log('\n🏪 STORE TABLE:');
     console.log('================================================================================');
-
     tableExists('store', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkProduct();
             return;
         }
@@ -156,11 +110,11 @@
         db.all('SELECT * FROM store', [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No stores found\n');
+                console.log(`Error: ${err.message}`);
+                checkProduct();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No stores found');
             } else {
                 console.log(`Total: ${rows.length} stores\n`);
@@ -172,7 +126,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkProduct();
         });
     });
@@ -180,12 +133,11 @@
 
 // Display PRODUCT table
-function checkProduct(next) {
+function checkProduct() {
     console.log('\n🛍️ PRODUCT TABLE:');
     console.log('================================================================================');
-
     tableExists('product', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkCategory();
             return;
         }
@@ -197,11 +149,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No products found\n');
+                console.log(`Error: ${err.message}`);
+                checkCategory();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No products found');
             } else {
                 console.log(`Total: ${rows.length} products\n`);
@@ -213,7 +165,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkCategory();
         });
     });
@@ -221,12 +172,11 @@
 
 // Display CATEGORY table
-function checkCategory(next) {
+function checkCategory() {
     console.log('\n📁 CATEGORY TABLE:');
     console.log('================================================================================');
-
     tableExists('category', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkWorksInStore();
             return;
         }
@@ -238,11 +188,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No categories found\n');
+                console.log(`Error: ${err.message}`);
+                checkWorksInStore();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No categories found');
             } else {
                 console.log(`Total: ${rows.length} categories\n`);
@@ -253,7 +203,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkWorksInStore();
         });
     });
@@ -261,12 +210,11 @@
 
 // Display WORKS_IN_STORE table
-function checkWorksInStore(next) {
+function checkWorksInStore() {
     console.log('\n🔗 WORKS_IN_STORE TABLE:');
     console.log('================================================================================');
-
     tableExists('works_in_store', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkPermissions();
             return;
         }
@@ -279,11 +227,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No assignments found\n');
+                console.log(`Error: ${err.message}`);
+                checkPermissions();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No assignments found');
             } else {
                 console.log(`Total: ${rows.length} assignments\n`);
@@ -293,7 +241,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkPermissions();
         });
     });
@@ -301,12 +248,11 @@
 
 // Display PERMISSIONS table
-function checkPermissions(next) {
+function checkPermissions() {
     console.log('\n🔐 PERMISSIONS TABLE:');
     console.log('================================================================================');
-
     tableExists('permissions', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkEmployees();
             return;
         }
@@ -318,11 +264,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No permissions found\n');
+                console.log(`Error: ${err.message}`);
+                checkEmployees();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No permissions found');
             } else {
                 console.log(`Total: ${rows.length} permissions\n`);
@@ -332,7 +278,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkEmployees();
         });
     });
@@ -340,12 +285,11 @@
 
 // Display EMPLOYEES table
-function checkEmployees(next) {
+function checkEmployees() {
     console.log('\n👷 EMPLOYEES TABLE:');
     console.log('================================================================================');
-
     tableExists('employees', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkBoss();
             return;
         }
@@ -357,11 +301,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No employees found\n');
+                console.log(`Error: ${err.message}`);
+                checkBoss();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No employees found');
             } else {
                 console.log(`Total: ${rows.length} employees\n`);
@@ -371,7 +315,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkBoss();
         });
     });
@@ -379,12 +322,11 @@
 
 // Display BOSS table
-function checkBoss(next) {
+function checkBoss() {
     console.log('\n👑 BOSS TABLE:');
     console.log('================================================================================');
-
     tableExists('boss', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkOrder();
             return;
         }
@@ -396,11 +338,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No bosses found\n');
+                console.log(`Error: ${err.message}`);
+                checkOrder();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No bosses found');
             } else {
                 console.log(`Total: ${rows.length} bosses\n`);
@@ -410,7 +352,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkOrder();
         });
     });
@@ -418,12 +359,11 @@
 
 // Display ORDER table
-function checkOrder(next) {
+function checkOrder() {
     console.log('\n📦 ORDERS TABLE:');
     console.log('================================================================================');
-
     tableExists('order', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkReport();
             return;
         }
@@ -436,11 +376,11 @@
         `, [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No orders found\n');
+                console.log(`Error: ${err.message}`);
+                checkReport();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No orders found');
             } else {
                 console.log(`Total: ${rows.length} orders\n`);
@@ -452,7 +392,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkReport();
         });
     });
@@ -460,12 +399,11 @@
 
 // Display REPORT table
-function checkReport(next) {
+function checkReport() {
     console.log('\n📊 REPORTS TABLE:');
     console.log('================================================================================');
-
     tableExists('report', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkRefund();
             return;
         }
@@ -473,11 +411,11 @@
         db.all('SELECT * FROM report', [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No reports found\n');
+                console.log(`Error: ${err.message}`);
+                checkRefund();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No reports found');
             } else {
                 console.log(`Total: ${rows.length} reports\n`);
@@ -487,7 +425,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkRefund();
         });
     });
@@ -495,12 +432,11 @@
 
 // Display REFUND table
-function checkRefund(next) {
+function checkRefund() {
     console.log('\n💰 REFUND TABLE:');
     console.log('================================================================================');
-
     tableExists('refund', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkImage();
             return;
         }
@@ -508,11 +444,11 @@
         db.all('SELECT * FROM refund', [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No refunds found\n');
+                console.log(`Error: ${err.message}`);
+                checkImage();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No refunds found');
             } else {
                 console.log(`Total: ${rows.length} refunds\n`);
@@ -523,7 +459,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkImage();
         });
     });
@@ -531,12 +466,11 @@
 
 // Display IMAGE table
-function checkImage(next) {
+function checkImage() {
     console.log('\n🖼️ IMAGE TABLE:');
     console.log('================================================================================');
-
     tableExists('image', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            checkColor();
             return;
         }
@@ -544,11 +478,11 @@
         db.all('SELECT * FROM image', [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No images found\n');
+                console.log(`Error: ${err.message}`);
+                checkColor();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No images found');
             } else {
                 console.log(`Total: ${rows.length} images\n`);
@@ -557,7 +491,6 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
+            }
+            checkColor();
         });
     });
@@ -565,12 +498,11 @@
 
 // Display COLOR table
-function checkColor(next) {
+function checkColor() {
     console.log('\n🎨 COLOR TABLE:');
     console.log('================================================================================');
-
     tableExists('color', (exists) => {
         if (!exists) {
-            console.log('Table does not exist\n');
-            if (next) next();
+            console.log('Table does not exist');
+            finish();
             return;
         }
@@ -578,11 +510,11 @@
         db.all('SELECT * FROM color', [], (err, rows) => {
             if (err) {
-                console.log(`Error: ${err.message}\n`);
-                if (next) next();
-                return;
-            }
-
-            if (!rows || rows.length === 0) {
-                console.log('No colors found\n');
+                console.log(`Error: ${err.message}`);
+                finish();
+                return;
+            }
+
+            if (!rows || rows.length === 0) {
+                console.log('No colors found');
             } else {
                 console.log(`Total: ${rows.length} colors\n`);
@@ -591,24 +523,23 @@
                     if (index < rows.length - 1) console.log('-'.repeat(80));
                 });
-                console.log();
-            }
-            if (next) next();
-        });
-    });
-}
-
-// Finish and close database
+            }
+            finish();
+        });
+    });
+}
+
+// Start the chain of checks
+function checkNext() {
+    checkPersonal();
+}
+
 function finish() {
-    console.log('='.repeat(80));
+    console.log('\n' + '='.repeat(80));
     console.log('✅ Database inspection complete');
     console.log('='.repeat(80) + '\n');
 
-    db.close((err) => {
-        if (err) {
-            console.error('Error closing database:', err.message);
-        }
-    });
-}
-
-// Start the execution chain
-executeChecks();
+    db.close();
+}
+
+// Start with CLIENTS
+checkNext();
