text:
## Changes

### 8.1.3
- Updated dependencies

### 8.1.2
- Updated dependencies

### 8.1.1
- Changes to `api-lambdas` and `other-lambdas` modules:
  - Changed `succeedLambdaCallback` and `failLambdaCallback` functions to return promises of the callback results
  - Added more error handling to `succeedLambdaCallback` and `failLambdaCallback` functions in an attempt to catch and
    resolve issues encountered where callback is not being invoked

### 8.1.0
- Changes to `api-lambdas` module:
  - Added support for an optional `postConfigure` function, which can be configured onto `context.handler`, that can be
    used by an AWS Lambda `handler` to add any additional configuration needed to the context AFTER the primary
    configuration of the context has completed and BEFORE the main function is executed
  - Added more checks to better handle missing `context` failure cases
  - Added `stringify` function to better survive responses with circular dependencies
- Changes to `other-lambdas` module:
  - Added support for an optional `postConfigure` function, which can be configured onto `context.handler`, that can be
    used by an AWS Lambda `handler` to add any additional configuration needed to the context AFTER the primary
    configuration of the context has completed and BEFORE the main function is executed
  - Added more checks to better handle missing `context` failure cases
  - Added `stringify` function to better survive responses with circular dependencies
  - Fixed intermittent unit test issues
- Changes to `stages` module:
  - Enabled configuration of logging options via a new `logging` property or the legacy `loggingOptions` property
  - Enabled configuration of logging settings via a new `logging` property or the legacy `loggingSettings` property
- Changes to `contexts` module:
  - Enabled configuration of staging options via a new `staging` property or the legacy `stagingOptions` property
  - Enabled configuration of staging settings via a new `staging` property or the legacy `stagingSettings` property
  - Enabled configuration of custom options via a new `custom` property or the legacy `customOptions` property
  - Enabled configuration of custom settings via a new `custom` property or the legacy `customSettings` property
  - Fixed unit test defect

### 8.0.2
- Updated `aws-sdk` dev dependency to match latest used in AWS Lambda

### 8.0.1
- Updated `aws-core-test-utils` dependency

### 8.0.0
- Breaking changes to `api-lambdas` module:
  - Removed deprecated `succeedCallback` function - replaced by `succeedLambdaCallback` function
  - Removed deprecated `failCallback` function - replaced by `failLambdaCallback` function
  - Removed deprecated `failCallbackForApiGateway` function - replaced by `failLambdaCallback` function
  - Removed `useLambdaProxy`, `defaultHeaders` & `allowedHttpStatusCodes` properties and `toErrorResponse` function from
    the `opts` argument of the `generateHandlerFunction` function in favour of rather configuring these properties via
    the `generateHandlerFunction` function's existing `createSettings` & `createOptions` arguments
  - Removed `opts` from the `configureHandlerContext` function in favour of rather configuring its properties via the
    function's existing `createSettings` & `createOptions` arguments
  - Dropped support for the legacy 6th `allowedHttpStatusCodes` argument of the `generateHandlerFunction` function -
    i.e. any code still using legacy 5th to 9th parameters: `logRequestResponseAtLogLevel`, `allowedHttpStatusCodes`,
    `invalidRequestMsg`, `failureMsg` & `successMsg` (instead of `opts`) will now ignore any `allowedHttpStatusCodes`
    argument
- Breaking changes to `other-lambdas` module:
  - Removed `toErrorResponse` function from the `opts` argument of the `generateHandlerFunction` function in favour of
    rather configuring the `generateHandlerFunction` function with the `toErrorResponse` function (and others) via its
    existing `createSettings` argument
  - Removed `opts` from the `configureHandlerContext` function in favour of rather configuring its `toErrorResponse`
    function via the `configureHandlerContext` function's existing `createSettings` argument
- Breaking changes to `lambdas` module:
  - Removed out-of-date `failCallback` function - replaced by `failLambdaCallback` & other functions of the
    `other-lambdas` module
- Added `.npmignore`
- Renamed `release_notes.md` to `CHANGES.md`
- Updated dependencies

### 7.2.0
- Changes to `api-lambdas` module:
  - Added support for configuring a custom `preSuccessCallback` function to be run before succeeding the Lambda callback
  - Added support for configuring a custom `preFailureCallback` function to be run before failing the Lambda callback
  - Minor breaking changes to API of "new" `failLambdaCallback` and `succeedLambdaCallback` functions added in 7.1.0
- Changes to `other-lambdas` module:
  - Added support for configuring a custom `preSuccessCallback` function to be run before succeeding the Lambda callback
  - Added support for configuring a custom `preFailureCallback` function to be run before failing the Lambda callback
  - Minor breaking changes to API of "new" `failLambdaCallback` and `succeedLambdaCallback` functions added in 7.1.0

### 7.1.1
- Committed updated `package-lock.json`

### 7.1.0
- Changes to `api-lambdas` module:
  - Added error response configuration options & settings to the context
  - Added new `succeedLambdaCallback` and `failLambdaCallback` functions with cleaner parameters needed by custom
    `toErrorResponse` functions
  - Deprecated & removed internal usage of old `succeedCallback` and `failCallback` functions
  - Changed `generateHandlerFunction` to use new `succeedLambdaCallback` and `failLambdaCallback` functions instead
- Added a new `other-lambdas` module, which is a simplified version of `api-lambdas`, for generating handler functions
  for "other" AWS Lambdas that are NOT exposed via API Gateway

### 7.0.12
- Added an optional `toErrorResponse` function to the `opts` arguments of `failLambdaCallback` and
  `generateHandlerFunction` functions of the `api-lambdas` module to enable callers to customise the error response
  object or Lambda Proxy error response body returned
- Updated `core-functions` dependency to version 3.0.22
- Updated `logging-utils` dependency to version 4.0.22
- Updated `aws-sdk` dev dependency to version 2.190.0

### 7.0.11
- Updated `core-functions` dependency to version 3.0.20
- Updated `logging-utils` dependency to version 4.0.20
- Updated `aws-sdk` dev dependency to version 2.161.0
- Updated `aws-core-test-utils` dev dependency to version 3.0.7

### 7.0.10
- Renamed dummy first exports (`exports._ = '_'; //IDE workaround`) of most modules to (`exports._$_ = '_$_';`) to avoid
  potential future collisions with `lodash` & `underscore`
- Updated `core-functions` dependency to version 3.0.19
- Updated `logging-utils` dependency to version 4.0.19
- Updated `aws-core-test-utils` dev dependency to version 3.0.6

### 7.0.9
- Changed `dynamodb-doc-client-cache`, `kinesis-cache`, `kms-cache` & `lambda-cache` modules to use an optional,
  alternative AWS constructor passed via a new optional `context.AWS` property to enable use of an AWS XRay-captured
  AWS constructor
- Updated `aws-sdk` dependency to version 2.143.0

### 7.0.8
- Updated `core-functions` dependency to version 3.0.18
- Updated `logging-utils` dependency to version 4.0.18

### 7.0.7
- Changes to `api-lambdas` module to support API Gateway Lambda Proxy integration:
  - Replaced legacy 5th to 9th parameters of `generateHandlerFunction` function with a preferred single optional `opts`
    5th parameter, which includes the 5 legacy parameters (`logRequestResponseAtLogLevel`, `allowedHttpStatusCodes`,
    `invalidRequestMsg`, `failureMsg` & `successMsg`) and also includes 2 new parameters (`useLambdaProxy` & `defaultHeaders`)
    - Note that the `generateHandlerFunction` function still supports invoking it with its legacy 5th to 9th parameters
  - Replaced legacy 6th parameter of `failCallback` function with a preferred optional `opts` 6th parameter, which
    includes the legacy parameter (`allowedHttpStatusCodes`) and also includes 2 new parameters (`useLambdaProxy` &
    `defaultHeaders`)
    - Note that the `failCallback` function still supports invoking it with its legacy 6th parameter
  - Changed `failCallback` function to also support Lambda Proxy integration
  - Added a new `succeedCallback` function to support both default integration & Lambda Proxy integration
  - Changed inner `handler` function to use new `succeedCallback` function & to pass the `generateHandlerFunction`
    function's new `opts` parameter on all `failCallback` & `succeedCallback` calls
  - Setting the new `useLambdaProxy` parameter to `true`:
    - Enables your Lambda to be called from API Gateway using its Lambda Proxy integration mode
    - Changes the `failCallback` & new `succeedCallback` functions to invoke your Lambda's callback function with ONLY a
      null "error" parameter and a non-null "data" parameter, which is compatible with Lambda Proxy integration
- Fixed unbound logger issues in logging in `dynamodb-doc-client-cache`, `kinesis-cache`, `kms-cache`, `lambda-cache` & `regions` modules
- Updated `core-functions` dependency to version 3.0.17
- Updated `logging-utils` dependency to version 4.0.17
- Updated `aws-core-test-utils` dev dependency to version 3.0.5
- Updated `aws-sdk` dev dependency to version 2.128.0

### 7.0.6
- Changes to `regions` module:
  - Changed behaviour of `getRegionKey` function to EITHER get the existing region key (if any) OR return undefined and
    NOT set a new region key (if none)
  - Added new `getOrSetRegionKey` function that gets the existing region key (if any) or sets a new region key (if none)
  - Added new `listRegionKeys` function to list the currently cached region keys
- Changes to `dynamodb-doc-client-cache`, `kinesis-cache`, `kms-cache` & `lambda-cache`:
  - Synchronised code to handle changes in `regions.getRegionKey` behaviour and to use new `regions.getOrSetRegionKey`
  - Added new `clearCache` function to clear the instance & options caches according to the currently cached region keys

### 7.0.5
- Changes to `lambdas` module:
  - Added new `getInvokedFunctionNameWithAliasOrVersion` function
  - Changed the `getFunctionNameVersionAndAlias` function to also return an `invoked` property containing the same
    concatenation of invoked function name & alias or version generated by `getInvokedFunctionNameWithAliasOrVersion`
- Changes to `type-defs` module:
  - Added new `invoked` property to `LambdaFunctionNameVersionAndAlias` type definition
- Changes to `lambda-utils` module:
  - Replaced uses of deprecated `Promises.wrapMethod` with `Promises.wrap`
- Replaced all logging of `error.stack` with logging of just the error
- Updated `core-functions` dependency to version 3.0.15
- Updated `logging-utils` dependency to version 4.0.14

### 7.0.4
- Changed almost all modules' exports to modifications of the default `exports` object instead of replacing the default `module.exports` object
- Added dummy first exports (`exports._ = '_'; //IDE workaround`) to most modules as a temporary workaround for IDE issue
- Updated `core-functions` dependency to version 3.0.14
- Updated `logging-utils` dependency to version 4.0.13

### 7.0.3
- Updated `core-functions` dependency to version 3.0.11
- Updated `logging-utils` dependency to version 4.0.11

### 7.0.2
- Synchronized `test/samples.js` with versions from other modules:
  - Added `sampleKinesisMessageAndRecord` & `sampleDynamoDBMessageAndRecord` functions
  - Added `sampleMsg`, `sampleKinesisRecord2` & `sampleDynamoDBRecord` functions
  - Removed `sampleKinesisMessage` & `sampleDynamoDBMessage` functions, which are no longer usable after removal of
    setting of `consumerState` properties on messages
- Replaced usage of deleted `sampleDynamoDBMessage` function with `sampleDynamoDBMessageAndRecord`

### 7.0.1
- Minor patches to type definitions in `type-defs` module & to JsDoc comments in `contexts` module

### 7.0.0
- Changes to `type-defs` module:
  - Defined more properties of `AWSContext` type definition
  - Added `LambdaFunctionNameVersionAndAlias` type definition
  - Added optional `invokedLambda` property to `EventAWSContextAndStageAware` type definition
- Changes to `regions` module:
  - Removed `ONLY_FOR_TESTING.setRegionIfNotSet` function
  - Removed fail fast logic from `getRegion`, `getRegionKey` & `configureRegion` functions, since its only applicable for unit testing
  - Replaced `ONLY_FOR_TESTING.getRegionRaw` export with direct export of `getRegionRaw` function
  - Replaced `ONLY_FOR_TESTING.getDefaultRegionRaw` export with direct export of `getDefaultRegionRaw` function
  - Removed `deprecation` from `configureRegion` function
- Changes to `stages` module:
  - Removed deprecated `configureStageAndAwsContext` function
  - Removed deprecated `configureRegionStageAndAwsContext` function
- Changes to `lambdas` module:
  - Changed `getFunctionName` function to also use `process.env.AWS_LAMBDA_FUNCTION_NAME`
  - Changed `getFunctionVersion` function to also use `process.env.AWS_LAMBDA_FUNCTION_VERSION`
  - Changed `getFunctionNameVersionAndAlias` function to also use `process.env.AWS_LAMBDA_FUNCTION_NAME` & `AWS_LAMBDA_FUNCTION_VERSION`
- Changes to `contexts` module:
  - Changed `configureEventAwsContextAndStage` function to also set `context.invokedLambda` when `awsContext` provided &
    to NOT fail if region is not defined
- Upgraded `aws-sdk` dependency to 2.92.0

### 6.1.0
- Changes to `type-defs` module:
  - Added `event` property to `StandardContext` type definition
  - Renamed `StageAndAWSContextAware` type definition to `EventAWSContextAndStageAware`
  - Added `event` property to `EventAWSContextAndStageAware` type definition
  - Added `AWS.Lambda` related type definitions
  - Added `AWS.KMS` related type definitions
- Changes to `stages` module:
  - Deprecated `configureStageAndAwsContext` function
  - Changed `configureStageAndAwsContext` & `configureRegionStageAndAwsContext` functions to also set `context.event`
- Changes to `contexts` module:
  - Added `configureEventAwsContextAndStage` function
  - Changed `configureStandardContext` function to use `configureEventAwsContextAndStage` instead of deprecated
    `stages.configureStageAndAwsContext` function
- Changes to `regions` module:
  - Added `regionKeysByRegion` cache
  - Added `getRegionKey` function
- Changes to `dynamodb-doc-client-cache` module:
  - Removed `regionKeysByRegion` cache & `getRegionKey` function & replaced usage with `regions/getRegionKey`
- Changes to `kinesis-cache` module:
  - Removed `regionKeysByRegion` cache & `getRegionKey` function & replaced usage with `regions/getRegionKey`
- Added new `lambda-cache` module
- Added new `lambda-utils` module
- Added new `kms-cache` module
- Added new `kms-utils` module

### 6.0.14
- Updated `core-functions` dependency to version 3.0.9
- Updated `logging-utils` dependency to version 4.0.9

### 6.0.13
- Changes to `dynamodb-doc-client-utils` module:
  - Added new `updateProjectionExpression`, `updateExpressionAttributeNames` & `updateExpressionAttributeValues` functions
  - Changed `getItem` function to throw a TypeError if no result or non-object result is returned
- Moved test devDependencies to package.json & removed test/package.json
- Upgraded `aws-core-test-utils` test dependency to 2.0.9
- Updated `core-functions` dependency to version 3.0.7
- Updated `logging-utils` dependency to version 4.0.7

### 6.0.12
- Changes to `api-lambdas` module:
  - Renamed `initContext`, `initSettings` & `initOptions` parameters of `generateHandler` function to `generateContext`,
    `generateSettings` & `generateOptions` respectively
  - Changed `generateHandler` function to accept `generateContext`, `generateSettings` & `generateOptions` arguments
    as functions that can be used to generate non-shared objects, in addition to still providing legacy support for them
    being passed as shared, module-scoped objects that must be copied to be safely used
- Upgraded `logging-utils` dependency to 4.0.6
- Upgraded `aws-sdk` dev dependency to 2.54.0 to match current AWS Lambda runtime version
- Upgraded `aws-core-test-utils` test dependency to 2.0.8

### 6.0.11
- Upgraded `aws-core-test-utils` test dependency to 2.0.7
- Upgraded `uuid` test dependency to 3.1.0

### 6.0.10
- Changes to `type-defs` module - added more detail to type definitions:
  - Renamed `DynamoDBGetOpts` type definition to `DynamoGetOpts`
  - Renamed `DynamoDBQueryOpts` type definition to `DynamoQueryOpts` & added key `K` template
  - Renamed `DynamoDBGetResult` type definition to `DynamoGetResult`
  - Renamed `DynamoDBQueryResult` type definition to `DynamoQueryResult` & added extra key `K` template
  - Added new `DynamoBatchGetResult` type definition with item `I` & key `K` templates
  - Added new `DynamoScanResult` type definition with item `I` & key `K` templates
  - Added new `UnprocessedKeysMap` & `CapacityUnitsMap` type definitions
  - Added details & properties to `ConsumedCapacity` type definition
- Upgraded `aws-core-test-utils` test dependency to 2.0.6
- Updated `core-functions` dependency to version 3.0.6
- Updated `logging-utils` dependency to version 4.0.5

### 6.0.9
- Upgraded `aws-core-test-utils` test dependency to 2.0.5
- Updated `core-functions` dependency to version 3.0.5
- Updated `logging-utils` dependency to version 4.0.4

### 6.0.8
- Upgraded `aws-core-test-utils` test dependency to 2.0.4

### 6.0.7
- Upgraded `aws-core-test-utils` test dependency to 2.0.3

### 6.0.6
- Upgraded `aws-core-test-utils` test dependency to 2.0.2

### 6.0.5
- Upgraded `aws-core-test-utils` test dependency to 2.0.1

### 6.0.4
- Added new `dynamodb-doc-client-utils` module
- Changes to `type-defs` module (to sync with `get` method of DynamoDB.DocumentClient rather than `getItem` method):
   - Renamed `DynamoDBGetItemOpts` to `DynamoDBGetOpts` type definition
   - Renamed `DynamoDBGetItemResult` to `DynamoDBGetResult` type definition

### 6.0.3
- Changes to `regions` module:
  - Changed `getRegion` function to treat "undefined" or "null" regions as undefined
  - Added `setRegion` function
  - Changed `setRegionIfNotSet` function to use `setRegion`
  - Deprecated `setRegionIfNotSet` function
  - Changed `configureRegion` function to fallback to using `console.log` if `context.info` is not configured yet
- Changes to `stages` module:
  - Added `configureStageAndAwsContext` convenience function to configure resolved stage and AWS context on the given context
  - Deprecated old `configureRegionStageAndAwsContext` convenience function
- Changes to `contexts` module:
  - Changed `configureStandardContext` function to invoke `regions.configureRegion` as early in the function as possible
    & to invoke `stages.configureStageAndAwsContext` instead of `stages.configureRegionStageAndAwsContext`
- Changes to `type-defs` module:
   - Added `StageAndAWSContextAware` type definition
   - Added `DynamoDBGetItemOpts`, `DynamoDBGetItemResult`, `DynamoDBQueryOpts`, `DynamoDBQueryResult` & `ConsumedCapacity` type definitions

### 6.0.2
- Upgraded to Node 6.10.3
- Updated `core-functions` dependency to version 3.0.4
- Updated `logging-utils` dependency to version 4.0.3
- Upgraded `aws-sdk` dev dependency to version 2.45.0
- Changes to `dynamodb-doc-client-cache` module:
  - Changed `setDynamoDBDocClient` to create & cache each new DynamoDB.DocumentClient instance with a COPY of the options
    while still caching the ORIGINAL options to avoid subsequent cache comparison failures related to AWS SDK 2.45.0
    mutating the options passed to the constructor, e.g. by adding "attrValue" with value "S8"

### 6.0.1
- Updated `core-functions` dependency to version 3.0.2
- Updated `logging-utils` dependency to version 4.0.1
- Patches to `test/samples.js`:
  - Fixed potential shared global regular expression issues in `sampleAwsContext` function
- Changes to `aws-errors` module:
  - Added `isResourceNotFoundException` function
- Changes to `dynamodb-utils` module:
  - Added `simplifyKeysNewImageAndOldImage` function

### 6.0.0
- Updated `core-functions` dependency to version 3.0.0
- Updated `logging-utils` dependency to version 4.0.0
- Changes to `api-lambdas.js` module:
  - Removed `log` function (replaced use with new `log` function & `log` method in `logging-utils`)
- Changes to `arns.js` module:
  - Moved `ArnResources` typedef to `type-defs.js`
- Changes to `aws-errors.js` module:
  - Added `isItemCollectionSizeLimitExceededException` function
  - Added `isLimitExceeded` function
  - Removed limit exceeded cases from `isThrottled` function (not backward-compatible)
  - Added S3 `SlowDown` case to `isThrottled` function
  - Added `isLimitExceeded` & `err.retryable` checks to `isRetryable` function
- Changes to `dynamodb-utils.js` module:
  - Removed `toNumber` function (replaced use with new `toNumberOrIntegerLike` function in `core-functions/numbers.js`)
  - Added new `toStorableObject` function
  - Added new `defaults` static property with `emptyStringReplacement` property
- Changes to `stages.js` module:
  - Replaced all setting names constants (e.g. CUSTOM_TO_STAGE_SETTING) with use of a new module-scope `settingNames`
    object property that holds all the standard stage handling settings names (e.g. settingNames.customToStage)
  - Added new `extractNameAndStageFromStreamName` & `extractNameAndStageFromResourceName` settings
  - Added `extractNameAndStageFromQualifiedStreamName` & `extractNameAndStageFromQualifiedResourceName` functions
  - Added `extractNameAndStageFromSuffixedStreamName` & `extractNameAndStageFromSuffixedResourceName` functions
  - Added `_extractNameAndStageFromQualifiedName` & `_extractNameAndStageFromSuffixedName` functions
  - Changed `extractStageFromQualifiedStreamName` to attempt fallback with `_extractNameAndStageFromQualifiedName`
  - Changed `extractStageFromQualifiedResourceName` to attempt fallback with `_extractNameAndStageFromQualifiedName`
- Changes to `stream-events.js` module:
  - Added `MAX_PARTITION_KEY_SIZE` constant
  - Added `DynamoDBEventName` enum
  - Added `getEventID`, `getEventName`, `getEventSource` & `getEventSourceARN` functions
  - Added `getKinesisShardId`, `getKinesisShardIdFromEventID`, `getKinesisShardIdAndEventNoFromEventID` & `getKinesisSequenceNumber` functions
  - Added `getDynamoDBSequenceNumber` function
  - Added additional validation checks to `validateStreamEventRecord`, `validateKinesisStreamEventRecord` & `validateDynamoDBStreamEventRecord` functions
- Added many new typedefs to `type-defs.js`

### 5.0.17
- Fixed critical module-scope defects in `generateHandlerFunction` function in `api-lambdas` module
- Changes to `dynamodb-utils` module:
  - Changed `toNumber` function to return the given string if a large integer number's precision cannot be preserved
  - Added `toKeyValuePairs` function
- Updated `core-functions` dependency to version 2.0.14
- Updated `logging-utils` dependency to version 3.0.12

### 5.0.16
- Added missing `context` as first argument to `generateHandlerFunction` function of `api-lambdas.js` module

### 5.0.15
- Fixed missing require `core-functions/promises` issue in `api-lambdas.js` module

### 5.0.14
- Fixed defect in `generateHandlerFunction` function of `api-lambdas.js` module

### 5.0.13
- Added new `generateHandlerFunction` function to `api-lambdas.js` module
- More improvements to typedefs in `type-defs.js` module
- Updated `core-functions` dependency to version 2.0.12
- Updated `logging-utils` dependency to version 3.0.10

### 5.0.12
- Updated `logging-utils` dependency to version 3.0.9

### 5.0.11
- Changes to `type-defs.js` module:
  - Added `StandardContext`, `StandardSettings`, `StandardOptions`, `CustomAware`, `CustomSettings`, `CustomOptions`
    and `RegionStageAWSContextAware`
- Added new `contexts.js` module with `configureStandardContext` and `configureCustomSettings` functions
- Added new `api-lambdas.js` module with `failCallback` (and synonym `failCallbackForApiGateway`) functions and
  re-exported `configureStandardContext` function from `contexts.js` to simplify imports for API Gateway exposed Lambdas
- Changes to `lambdas.js` module:
  - Moved `failCallbackForApiGateway` function to new `api-lambdas.js` module
- Changes to `stages.js` module:
  - Added new `configureRegionStageAndAwsContext` convenience function to configure current region, resolved stage and
    AWS context on the given context
  - Improved JsDoc type definitions on all of the configuration functions
- Added and improved existing examples in README.md

### 5.0.10
- Fixed broken unit tests by changing incorrect imports of `node-uuid` to `uuid`
- Added new `RegionAware`, `KinesisAware` and `DynamoDBDocClientAware` typedefs to `type-defs.js` module
- Changes to `regions.js` module:
  - Changed the `context` argument and return type of `configureRegion` function to use new `RegionAware` typedef
- Changes to `kinesis-cache.js` module:
  - Changed the `context` argument and return types of `configureKinesis` function to use new `KinesisAware` typedef
- Changes to `dynamodb-doc-client-cache.js` module:
  - Changed the `context` argument and return type of `configureDynamoDBDocClient` function to use new
    `DynamoDBDocClientAware` typedef

### 5.0.9
- Updated `logging-utils` dependency to version 3.0.8
- Renamed `stages-defs.js` module to `type-defs.js` to synchronize with other modules

### 5.0.8
- Renamed `stage-handling-type-defs.js` module to `stages-type-defs.js`

### 5.0.7
- Added `stage-handling-type-defs.js` module to hold all of the stage handling related typedefs
  - Added `StageHandlingOptions` and `StageHandlingSettings` typedefs from `stages.js`
  - Added new `StageHandling` and `StageAware` typedefs
- Changes to `stages.js` module:
  - Removed `StageHandlingOptions` and `StageHandlingSettings` typedefs
  - Changed the argument and return types on many of the functions to use the existing and new typedefs
- Updated `logging-utils` dependency to version 3.0.7

### 5.0.6
- Updated `core-functions` dependency to version 2.0.11
- Updated `logging-utils` dependency to version 3.0.6
- Replaced `node-uuid` dependency with `uuid` dependency in `test\package.json`

### 5.0.5
- Changes to `stream-events` module:
  - Added new `getEventSources` function
  - Added new `getDynamoDBEventSourceTableNames` function
- Changes to `stages` module:
  - Changed `resolveStage` function to resolve the event's eventSource and when its DynamoDB to use the table names
    of the DynamoDB stream event as a stage source, instead of always assuming the event is a Kinesis stream event
    and only using the stream names of the Kinesis stream event as a stage source
- Updated `core-functions` dependency to version 2.0.10
- Updated `logging-utils` dependency to version 3.0.5

### 5.0.4
- Updated `core-functions` dependency to version 2.0.9
- Updated `logging-utils` dependency to version 3.0.3

### 5.0.3
- Updated `core-functions` dependency to version 2.0.8
- Updated `logging-utils` dependency to version 3.0.2

### 5.0.2
- Changes to `stages.js` module:
  - Moved export of `configureStageHandlingWithSettings` to `FOR_TESTING_ONLY`
  - Added missing notes on changes for Release 5.0.1 to `README.md`

### 5.0.1
- Changes to `stages.js` module:
  - Changed `configureStageHandling` function to use `core-functions/objects` module's `copy` and
    `merge` functions to ensure that any and all given custom settings and options are not lost
  - Changed `getDefaultStageHandlingSettings` & `loadDefaultStageHandlingOptions` functions to use
    `core-functions/objects` module's `copy` and `merge` functions to ensure that any and all given
    custom options are not lost
- Changes to `kinesis-cache.js` module:
  - Changed `setKinesis` to only modify a copy of the given kinesisOptions to avoid side-effects
- Changes to `dynamodb-doc-client-cache.js` module:
  - Changed `setDynamoDBDocClient` to only modify a copy of the given dynamoDBDocClientOptions to avoid side-effects
- Updated `core-functions` dependency to version 2.0.7
- Updated `tape` dependency to 4.6.3

### 5.0.0
- Changes to `arns.js` module:
  - Changed `getArnResources` function to support DynamoDB eventSourceARNs
- Changes to `stream-events.js` module:
  - Renamed `getEventSourceStreamNames` function to `getKinesisEventSourceStreamNames`
  - Renamed `getEventSourceStreamName` function to `getKinesisEventSourceStreamName`
  - Added new `getDynamoDBEventSourceTableName` function
  - Added new `getDynamoDBEventSourceTableNameAndStreamTimestamp` function
- Changes to `stages.js` module:
  - Renamed `configureStageHandling` function to `configureStageHandlingWithSettings`
  - Renamed `configureStageHandlingAndDependencies` function to `configureStageHandling`
  - Removed `configureDependenciesIfNotConfigured` function
  - Removed `configureDefaultStageHandlingIfNotConfigured` function
  - Removed `configureStageHandlingIfNotConfigured` function
- Renamed `config.json` to `stages-options.json`
- Updated `core-functions` dependency to version 2.0.5
- Updated `logging-utils` dependency to version 3.0.0

### 4.0.0
- Renamed `kinesis-utils` module to `kinesis-cache` to better reflect its actual purpose
- Renamed `dynamodb-doc-clients` module to `dynamodb-doc-client-cache` to better reflect its actual purpose
- Added new `dynamodb-utils` module
- Changes to `stages.js` module:
  - Added new `configureStageHandlingAndDependencies` function to enable configuration of stage handling settings and
    all stage handling dependencies (currently just logging) at the same time
  - Added new `configureDependencies` function, which is used by the new `configureStageHandlingAndDependencies` function
  - Added new `envStageName` setting to enable configuration of the name of the `process.env` environment variable to be
    checked for a stage value during execution of the `resolveStage` or `configureStage` functions
  - Changed `resolveStage` function to first attempt to resolve a stage from a named `process.env` environment variable
    (if available), which must be configured using AWS Lambda's new environment support

### 3.0.2
- Changes to `stages.js` module:
  - Added `configureDependenciesIfNotConfigured` function to configure stage handling dependencies (i.e. only logging for now)
  - Changed `configureStageHandlingIfNotConfigured` function to first invoke new `configureDependenciesIfNotConfigured` function
  - Changed `configureStageHandling` function to accept `otherSettings` and `otherOptions` as 3rd & 4th arguments to
    enable configuration of dependencies and to first invoke invoke new `configureDependenciesIfNotConfigured` function
  - Changed `configureDefaultStageHandling` function to accept `otherSettings` and `otherOptions` as 3rd & 4th arguments
    to enable configuration of dependencies and to always invoke `configureStageHandling`

### 3.0.1
- Changes to `stages.js` module:
  - Added a convenience `configureStageHandlingIfNotConfigured` function
  - Changed `configureDefaultStageHandlingIfNotConfigured` function to use new `configureStageHandlingIfNotConfigured` function
- Updated `logging-utils` dependency to version 2.0.3

### 3.0.0
- Changes to `stages.js` module:
  - Added typedef for `StageHandlingOptions` to better define parameters and return types
  - Changed `getDefaultStageHandlingSettings` function to accept an `options` argument of type `StageHandlingOptions`
    instead of an arbitrary `config` object and to also load default options from `config.json`
  - Changed `configureDefaultStageHandling` function to accept a new `options` argument of type `StageHandlingOptions`
    to enable optional, partial overriding of default stage handling settings
  - Changed `stageHandlingSettings` to `stageHandlingOptions` in `config.json`
  - Fixed require `logging-utils` link
- Updated `logging-utils` dependency to version 2.0.1

### 2.1.4
- Updated JsDoc comments in `dynamodb-doc-clients` and `kinesis-utils` modules.

### 2.1.3
- Added a new `dynamodb-doc-clients` module to enable creation and configuration of AWS DynamoDB.DocumentClient instances
  and caching of a DynamoDB.DocumentClient instance per region. Note that this new module is an almost exact replica of
  the `kinesis-utils` module, but for getting, setting and caching DynamoDB.DocumentClient instances instead of Kinesis
  instances.
  - Added `setDynamoDBDocClient`, `getDynamoDBDocClient`, `getDynamoDBDocClientOptionsUsed`, `deleteDynamoDBDocClient`
    and `configureDynamoDBDocClient` functions and unit tests for same.

### 2.1.2
- Updated `core-functions` dependency to version 2.0.3
- Updated `logging-utils` dependency to version 1.0.6

### 2.1.1
- Added `getDefaultStageHandlingSettings` function to get the default stage handling settings

### 2.1.0

- Changes to `stages` module:
  - Changed API of `configureStageHandling` function to accept a setting object instead of the multiple fixed parameters,
    to simplify configuration of new, custom settings.
  - Minor changes and fixes to code & unit tests to accommodate this change.
- Major overhaul of `kinesis-utils` module to enable full configuration of an AWS Kinesis instance and caching of a Kinesis
  instance per region.
  - Added `setKinesis`, `getKinesis`, `getKinesisOptionsUsed` & `deleteKinesis` functions and unit tests for same.
  - Rewrote and changed API of `configureKinesis` function to use the new `setKinesis` function and patched its unit tests.
- Technically should have been a 3.0.0 release semantically speaking, since I changed the APIs of two existing functions,
  but it did not seem warranted.

### 2.0.1
- Added new `kinesis-utils` module to provide basic configuration and caching of an AWS.Kinesis instance for Lambda
- Changes to `stream-events` module:
    - Added `validateStreamEventRecord` function to check if a record is either a valid Kinesis or DynamoDB stream event record
    - Added `validateKinesisStreamEventRecord` function to check if a record is a valid Kinesis stream event record
    - Added `validateDynamoDBStreamEventRecord` function to check if a record is a valid DynamoDB stream event record
    - Added unit tests for new functions
- Minor change to `setRegionIfNotSet` to eliminate unnecessary logging when regions are the same
- Updated `core-functions` dependency to version 2.0.2
- Updated `logging-utils` dependency to version 1.0.5

### 2.0.0
- Major changes to `stages`:
    - Changed existing configuration API from `resolveStage`-specific configuration to general stage handling configuration.
        - Added support for a custom to stage function.
        - Added support for configuration of stream and resource name qualification.
    - Added `configureStage` function.
    - Added configurable `toStageQualifiedStreamName` and default `toStageSuffixedStreamName` functions.
    - Added configurable `extractStageFromQualifiedStreamName` and default `extractStageFromSuffixedStreamName` functions.
    - Added configurable `toStageQualifiedResourceName` and default `toStageSuffixedResourceName` functions.
    - Added configurable `extractStageFromQualifiedResourceName` and default `extractStageFromSuffixedResourceName` functions.
    - Changed and added unit tests for revamped `stages` module.
- Changes to `regions`:
    - Added `configureRegion` function.
    - Added optional, hidden failFast argument to `getRegion` function needed for `configureRegion` function.
- Changes to `aws-errors`:
    - Fixed incorrect usage in comments.
    - Moved exported object's methods bodies to module-level functions.
- Changes to `lambdas`:
    - Added `failCallback` function to fail non-API Gateway Lambda callbacks with standard app errors to facilitate mapping of errors to HTTP status codes
    - Added `failCallbackForApiGateway` function to fail API Gateway Lambda callbacks with standard app errors to facilitate mapping of errors to HTTP status codes
- Added `stream-events` module and unit tests for it.
- Updated `core-functions` dependency to version 1.2.0.
- Added `logging-utils` 1.0.2 dependency.

### 1.0.0
- Completed changes needed to release 1.0.0
- Added unit tests for stages.js
- Simplified regions.js API down to relevant methods
- Fixed defects attempting to source awsRegion and eventSourceARN from event instead of Kinesis records within event.
- Patched repository in package.json

### 0.9.0
- Initial commit

repository: byron-dupreez/aws-core-utils

repo_name: byron-dupreez/aws-core-utils


text:
# CalendarFX
A Java framework for creating sophisticated calendar views based on JavaFX. A detailed developer manual can be found online: http://dlsc.com/wp-content/html/calendarfx/manual.html

![alt text](screenshot.png "Screenshot")

# Modules

1. CalendarFXApp - contains a standalone application (day, week, month, year views).
2. CalendarFXAssembly - a module used for creating distributions / assemblies
3. CalendarFXExperimental - a playground for new controls
4. CalendarFXGoogle - code for working with Google calendars
5. CalendarFXiCal - code for dealing with iCal data
6. CalendarFXRecurrence - an extension for the Google recurrence API (RFC 2445). Needed for the new date and time API of Java 8
7. CalendarFXSampler - a demo app based on FXSampler to test controls individually
8. CalendarFXView - the main module containing the various calendar views
9. CalendarFXWeather - a standalone demo for the month sheet view

# Building It
Simply run the 'install' target inside the top level project. Once completed you will find the installation inside the target folder of the assembly module.

# Assemblies

There are currently two assemblies being created inside the target folder of the assembly module.
The "bin" assembly contains almost everything except for the source files.

## Binary Assembly

The following are the directories found inside the binary assembly.

### css

Contains the calendar.css file.

### demos

Contains several standalone / runnable JAR files. Demos can be started by either double clicking on them or by calling java -jar demo.jar. Make sure to use at least Java 8u60+.

### docs

Contains the generated JavaDocs / API HTML files.

### ext

Contains third party libraries that are needed for running CalendarFX (controlsfx, license4j, fontawesomefx).

### i18n

The resource bundles used by CalendarFX.

### lib

The actual CalendarFX libraries.

### misc

Property files used for logging.

### tutorial

Getting started files.

repository: kekutiia/OOP-project

branch_name: refs/heads/master

extension: md

gha_language: Java

license_type: permissive

repo_name: kekutiia/OOP-project


text:
### 2.2.1 - 2023-08-13

* fixed set checkbox checked with array values on implicit names https://github.com/brainfoolong/form-data-json/issues/35

### 2.2.0 - 2023-08-03

* added ES6 module support with `form-data-json.es6.js`

### 2.1.4 - 2022-12-02

* fixed bug with option `skipEmpty` in select fields (https://github.com/brainfoolong/form-data-json/issues/31)

### 2.1.2 and 2.1.3 - 2022-02-09

* fixed issue with skipEmpty and nested input value #25
* fixed issue with callback is empty in case of file input

### 2.1.1 - 06.December 2021

* accept a `$` instance also as html element in `toJson/fromJson`, which is used by many libraries that memic jquery
  behaviour - previously only explicitly `jQuery` was supported

### 2.1.0 - 24.October 2021

* added new toJson option `arrayify` to explicitely disable array return values when needed, default is `true`

### 2.0.0 - 04.October 2021

* complete refactoring - thx to https://github.com/KES777 for extensive testing
* fixed many edge case issues from v1
* removed class `FormDataJsonOptions`. Use bare `{}` objects now as options
* removed method `FormDataJson.flattenJsonFormValues`. Use `flatList = true` option in `toJson`. Note: Output still has
  changed significantly to v1.
* changed method `FormDataJson.setInputValue` and is now considered internal only. No direct replacement. Use `fromJson`
  if you need to set any input value
* changed returned data of `formToJson/toJson` - Now some objects will be real JS arrays, if the keys are enumerated
  from 0 to x without a gap
* removed 3rd parameter `formToJson/toJson` callback function. It is now set into option `filesCallback`
* renamed method `formToJson` to `toJson`
* renamed method `fillFormFromJsonValues` to `fromJson`
* renamed option `unsetAllInputsOnFill` to `clearOthers`
* renamed option `includeUncheckedAsNull` to `uncheckedValue` and now represent the value that unchecked inputs should
  have in output
* added option `skipEmpty`
* added option `fileReaderFunction`
* added option `triggerChangeEvent`
* added option `resetOthers`
* added method `clear`
* added method `reset`
* added unminified compiled file
* optimized compiled files

### 2.0.5beta - 28. September 2021

* reverted option `uncheckedValue` to default to `undefined`. https://github.com/brainfoolong/form-data-json/issues/15

### 2.0.4beta - 27. September 2021

* fixed https://github.com/brainfoolong/form-data-json/issues/16 in `toJson()` in combination with `skipEmpty`
  and `flatList`

### 2.0.3beta - 27. September 2021

* fixed https://github.com/brainfoolong/form-data-json/issues/13 in `toJson()`
* changed option `uncheckedValue` is now false by default, instead of undefined
* added option `resetOthers` for `fromJson()`
* changed output of option `flatList`, it now contains an array list with same values like native `FormData()`

### 2.0.2beta - 27. September 2021

* incorrectly compiled files

### 2.0.1beta - 27. September 2021

* fixed glitch in `toJson()` doesn't respect all filter options correctly

### 2.0.0beta - 26. September 2021

* complete refactoring
* removed class `FormDataJsonOptions`. Use bare `{}` objects now as options
* removed method `FormDataJson.flattenJsonFormValues`. Use `flatList = true` option in `toJson`. Note: Output still has
  changed significantly to v1.
* removed method `FormDataJson.setInputValue`. No direct replacement. Use `fromJson` if you need to set any input value
* removed 3rd parameter `formToJson/toJson` callback function. It is now set into option `filesCallback`
* renamed method `formToJson` to `toJson`
* renamed method `fillFormFromJsonValues` to `fromJson`
* renamed option `unsetAllInputsOnFill` to `clearOthers`
* renamed option `includeUncheckedAsNull` to `uncheckedValue` and now represent the value that unchecked inputs should
  have in output
* added option `skipEmpty`
* added option `fileReaderFunction`
* added option `triggerChangeEvent`
* added unminified compiled file
* optimized compiled files

### 1.3.1 - 27. July 2021

* fixed bug that `setInputValue` will not work for `selects` when passed a non-string value

### 1.3.0 - 1. April 2021

* added a new feature `inputFilter` to `FormDataOptions` - Thanks to [@alcalyn](https://github.com/alcalyn) for the idea
  and initial coding in [#8](https://github.com/brainfoolong/form-data-json/issues/8)

### 1.2.2 - 9. December 2020

* fixed node module usage [#7](https://github.com/brainfoolong/form-data-json/issues/7)

### 1.2.1 - 2. December 2020

* fixed a bug that delete `null` values out of the result, even when they should be included

### 1.2.0 - 25. November 2020

* added `FormDataJson.flattenJsonFormValues`

### 1.1.5 - 14. April 2020

* added `FormDataJsonOptions.defaults`

### 1.1.4 - 14. April 2020

* NPM version bump

### 1.1.3 - 8. April 2020

* fixed setInputValue for file input fields, to not create an error
* updated src documentation

### 1.1.2 - 6. April 2020

* Version bump

### 1.1.1 - 6. April 2020

* Reduced NPM package included files

### 1.1.0 - 6. April 2020

* Added read of file inputs

### 1.0.2 - 6. April 2020

* Fixed populate of Array.isArray

### 1.0.1 - 6. April 2020

* NPM and Playground added

### 1.0.0 - 3. April 2020

* Initial release

license: MIT

repository: brainfoolong/form-data-json

gha_language: JavaScript

gha_license_id: MIT

repo_name: brainfoolong/form-data-json


text:
{{{
  "title": "Bare Metal Network FAQ",
  "date": "2-21-2021",
  "author": "Brent Smith",
  "attachments": [],
  "contentIsHTML": false,
  "sticky": true
}}}

### Description

Lumen Bare Metal servers are built with connectivity to either the Internet or an MPLS IPVPN(coming soon).
This FAQ addresses how the access to these networks are setup for servers.

### How are IP addresses assigned?

 Each server is assigned its own IPv4 /29 subnet.
 The first three IP addresses are assigned to the upstream routers, with the fourth address assigned to the server.
 The 5th and 6th IP addresses are unassigned and may be utilized by the customer on their server.

**1st IP** – router default gateway

**2nd IP** – reserved for router1

**3rd IP** – reserved for router2

**4th IP** – assigned to server

**5th IP** – unused/available

**6th IP** – unused/available

### How can more IP addresses be assigned to my server?

At this time, additional IP space is not supported. Only the /29 subnet that is assigned to the server can be used.

### How is the network protected against failure?

 Each Edge Bare Metal size server has four 25 Gigabit Ethernet interfaces, with two interfaces on each of two separate NIC cards.
 By default all four interfaces are placed into a single Link Access Group (LAG) or bond utilizing LACP for individual link monitoring.

 Each server connects to two switches: 2x 25GE to switch A and 2x 25GE to switch B.
 These switches are located in the same physical rack as the server.
 Each of these switches have multiple 100GE fiber connections to multiple other switches in the datacenter that create an ethernet switching fabric.
 This switching fabric can sustain full traffic capacity with any single switch or link failure.
 **Note** This switch redundancy means that a server can always expect up to 50 Gbps of throughput, even if one of its directly connected switches were to fail.
 While a server does have 100 Gbps of total bandwidth capacity, half of that is redundant.

Egress from the datacenter’s switch fabric to either the Internet (AS3356) or the MPLS IPVPN network (AS3549) is provided by two diverse Provider Edge (PE) routers – one pair per each network. These PE pairs connect to a corresponding pair of switches in the fabric. Traffic can be forwarded through both PEs and will switchover automatically upon failure of a PE, switch or the link between them. This dual routing path is important to remember when utilizing traceroutes or other reporting. PE1 may be active today but PE2 become the active path tomorrow.

You can learn more about how you are billed for Egress for Edge Bare Metal [here](../Getting Started/edge-bare-metal-billing).

repository: rwansing/PublicKB

gha_license_id: NOASSERTION

repo_name: rwansing/PublicKB


text:
---
layout: post
title: "Beyond nightlife..."
date: 2012-08-09 00:49
comments: true
sharing: true
categories: [Testing, landscape, key west, florida, photo]
---
{% img https://s3.amazonaws.com/dvblog/bridge-4199_blog.jpg 960 640 'Islamorada Crossing' %}

I venture outside of the world of nightlife in my shooting when possible. While challenging as it is to shoot in that sort of environment "my way", even more of a challenge is to take something rather common, the landscape photograph, and put my own spin on it.

What I like to find is a mix of the works of humans with the works of nature. So, on a drive to Key West one evening, I had it in my mind to try to capture a sunset off of one of the islands on the way down to Key West.

One of the frustrations of that, is that it isn't always possible to get that ideal angle, simply due to the traffic situation on the way down. Unless you plan way in advance (which I should have), you have to deal with the vagaries of only having one main road the entire way. Thus you can find yourself stuck behind some slow-movers, just as that magic hour hits.

I was gauging an ideal destination based on an earlier trip I had made a few weeks prior. I didn't make it all the way down to Key West, but I had dropped a few pins on my iPhone's map utility, to mark a few places. The one I had in mind was close, but traffic wasn't cooperating. So, when the ideal time hit, I took a gamble and pulled over next to this bridge.

The wind was whipping about like crazy, to the point where I had to fight to stabilize both myself and my camera, despite a heavy-duty Manfrotto tripod. Eventually, I settled into the scene, and ended up composing the above. Much like an expert sniper, I knew I "had it" even before the RAW data worked it's way through my MK II's processors and appeared on the screen. Initially a little underexposed to preserve the sky detail (you can always adjust your exposure upwards later, it's much harder to adjust downwards and bring out detail, even in RAW), I could still see the end result in my head, which is represented above.

While I'm fairly new to landscape photography, I can definitely appreciate the skill it takes to get the image, both from a technical and a logistical perspective. Preparation helps, but sometimes you just have to be ready for the moment to hit.

I'll be posting more images in this theme as time goes on, both from my back catalog, and new works as I produce them.

And now a word from our sponsor...me.

Enjoy 'Islamorada Crossing'? Why not purchase a quality printed copy of it for yourself or someone special? Point your browsers over to my print provider (click/tap!) and get your copy today. Available in a whole range of sizes and finishes.  I definitely appreciate the business!

Yes, even I have to eat on occasion.

repository: podblog/octoblog

extension: markdown

repo_name: podblog/octoblog


text:
# `predictions`’ errors and warnings

<!-- markdownlint-disable MD038 -->

## cannot unmarshal !!str `…` into float64

Whatever you wrote, probably a confidence level, isn’t recognized as such. Confidence levels need to be written as a number between 0 and 100, without the percent sign.

## [error.metadata.unexpected-claim]

TODO: reduce jargon

The first document in a stream is supposed to contain metadata about the predictions that follow. It is not supposed to contain things only predictions have, like a claim. This error is displayed when `claim: ` occurs in a document that `predictions` expects to contain only metadata, like `title: ` and `scope: `.

## [error.metadata-unexpected-confidence]

TODO: reduce jargon

The first document in a stream is supposed to contain metadata about the predictions that follow. It is not supposed to contain things only predictions have, like a confidence level. This error is displayed when `confidence: ` occurs in a document that `predictions` expects to contain only metadata, like `title: ` and `scope: `.

## [error.claim.missing]

A prediction doesn’t have a claim in it. Claims start with `claim: `.

## [error.confidence.missing]

A prediction doesn’t have a confidence level in it. Confidence levels start with `confidence: `.

## [error.confidence.impossible]

Confidence levels need to be written as a number between 0 and 100, corresponding to confidence levels of 0% and 100%. While fractional confidence levels are permissible (if unwise), negative numbers and numbers over 100 make no sense.

## [warn.confidence.zero]

It’s a bad idea to claim that something has a 0% chance of happening. [Infinite Certainty][ic] explains why.

## [warn.confidence.unity]

It’s a bad idea to claim that something has a 100% chance of happening. [Infinite Certainty][ic] explains why.

[ic]: https://www.readthesequences.com/Infinite-Certainty

repository: adiabatic/predictions

gha_language: Go

repo_name: adiabatic/predictions


text:
# Roadmap

## 11/24/2014: alpha

Design and code:

- implements a basic configuration loading mechanism: https://github.com/docker/docker-registry/issues/646
- storage API is frozen, implemented and used: https://github.com/docker/docker-registry/issues/616
- REST API defined and partly implemented: https://github.com/docker/docker-registry/issues/634
- basic logging: https://github.com/docker/docker-registry/issues/635
- auth design is frozen: https://github.com/docker/docker-registry/issues/623

Environment:

- some good practice are in place and documented: https://github.com/docker/docker-registry/issues/657

## 12/22/2014: beta

Design and code:

- feature freeze
- mirroring defined: https://github.com/docker/docker-registry/issues/658
- extension model defined: https://github.com/docker/docker-registry/issues/613

Environment:

- doc-driven approach: https://github.com/docker/docker-registry/issues/627

## 01/12/2015: RC

Design and code:

- third party drivers and extensions
- basic search extension
- third-party layers garbage collection scripts
- healthcheck endpoints: https://github.com/docker/docker-registry/issues/656
- bugnsnag/new-relic support: https://github.com/docker/docker-registry/issues/680

Environment:

- exhaustive test-cases

repository: rasata/distribution

repo_name: rasata/distribution


text:
# Change Log

- **Last updated**: 2021-12-13T10:26:00Z
- **Generator**: [thi.ng/monopub](https://thi.ng/monopub)

All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org/) for commit guidelines.

**Note:** Unlisted _patch_ versions only involve non-code or otherwise excluded changes
and/or version bumps of transitive dependencies.

## [2.1.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2021-11-17)

#### 🚀 Features

- Using workspaces for local tools ([bf7a404](https://github.com/thi-ng/umbrella/commit/bf7a404))
  Improving the overall build ergonomics
  - introduced a tools workspaces
  - imported it in all needed packages/examples
  - inclusive project root

#### ♻ Refactoring

- testrunner to binary ([4ebbbb2](https://github.com/thi-ng/umbrella/commit/4ebbbb2))
  this commit reverts (partly) changes made in:
  ef346d7a8753590dc9094108a3d861a8dbd5dd2c
  overall purpose is better testament ergonomics:
  instead of having to pass NODE_OPTIONS with every invocation
  having a binary to handle this for us.

### [2.0.1](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2021-10-13)

#### ♻ Refactoring

- update imports in all tests/pkgs ([effd591](https://github.com/thi-ng/umbrella/commit/effd591))
- update imports in all pkgs ([5fa2b6f](https://github.com/thi-ng/umbrella/commit/5fa2b6f))
  - add .js suffix for all relative imports

# [2.0.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2021-10-12)

#### 🛑 Breaking changes

- major update of ALL pkgs (export maps, ESM only) ([0d1d6ea](https://github.com/thi-ng/umbrella/commit/0d1d6ea))
- BREAKING CHANGE: discontinue CommonJS & UMD versions
  - only ESM modules will be published from now on
  - CJS obsolete due to ESM support in recent versions of node:
    - i.e. launch NodeJS via:
    - `node --experimental-specifier-resolution=node --experimental-repl-await`
    - in the node REPL use `await import(...)` instead of `require()`
  - UMD obsolete due to widespread browser support for ESM
  Also:
  - normalize/restructure/reorg all package.json files
  - cleanup all build scripts, remove obsolete
  - switch from mocha to [@thi.ng/testament](https://github.com/thi-ng/umbrella/tree/main/packages/testament) for all tests

#### ♻ Refactoring

- update defmulti impls ([0188d23](https://github.com/thi-ng/umbrella/commit/0188d23))
- update deps & imports in various pkgs ([e1cf29e](https://github.com/thi-ng/umbrella/commit/e1cf29e))
  - largely related to recent updates/restructuring of these packages:
    - api
    - defmulti
    - errors
    - logger
- update imports (transducers) ([3ddf8f3](https://github.com/thi-ng/umbrella/commit/3ddf8f3))
- update imports (text-canvas) ([fe5c91e](https://github.com/thi-ng/umbrella/commit/fe5c91e))
- update imports ([138571a](https://github.com/thi-ng/umbrella/commit/138571a))
- update all tests in _all_ pkgs ([8b582bc](https://github.com/thi-ng/umbrella/commit/8b582bc))
  - update all to use [@thi.ng/testament](https://github.com/thi-ng/umbrella/tree/main/packages/testament)

## [1.3.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2021-01-22)

#### 🚀 Features

- update DEFAULT_TAGS ([8f7f9d4](https://github.com/thi-ng/umbrella/commit/8f7f9d4))
  - emit normalized hiccup (w/ attribs obj)
  - update tests

### [1.2.38](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2020-12-07)

#### ♻ Refactoring

- update type-only imports in various tests/pkgs ([3fd9c24](https://github.com/thi-ng/umbrella/commit/3fd9c24))

## [1.2.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2020-03-28)

#### 🚀 Features

- add table caption support ([4b72b92](https://github.com/thi-ng/umbrella/commit/4b72b92))
  - update `th` serializer to use bold formatting
- add table serializer & test, update deps ([7cecf24](https://github.com/thi-ng/umbrella/commit/7cecf24))

### [1.1.10](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2020-02-25)

#### ♻ Refactoring

- update imports ([1b511d7](https://github.com/thi-ng/umbrella/commit/1b511d7))

### [1.1.6](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-11-09)

#### 🩹 Bug fixes

- [#156](https://github.com/thi-ng/umbrella/issues/156) undo trimming of element children ([ccc9d40](https://github.com/thi-ng/umbrella/commit/ccc9d40))
  - was wrongly introduced in [602510c5150dbf26d43a1c9e7ca8afd7c5230f28](https://github.com/thi-ng/umbrella/commit/602510c5150dbf26d43a1c9e7ca8afd7c5230f28)
- [#156](https://github.com/thi-ng/umbrella/issues/156) fix blockquote default tag factory args, add test ([12e445a](https://github.com/thi-ng/umbrella/commit/12e445a))
- [#156](https://github.com/thi-ng/umbrella/issues/156) update parse(), remove CR chars, add initial test ([602510c](https://github.com/thi-ng/umbrella/commit/602510c))

### [1.1.4](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-08-21)

#### ♻ Refactoring

- update serializeElement, add SerializeState ([745ea65](https://github.com/thi-ng/umbrella/commit/745ea65))

## [1.1.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-07-07)

#### 🚀 Features

- enable TS strict compiler flags (refactor) ([36c8109](https://github.com/thi-ng/umbrella/commit/36c8109))

#### ♻ Refactoring

- TS strictNullChecks, add tests ([9e44bfd](https://github.com/thi-ng/umbrella/commit/9e44bfd))

### [1.0.5](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-02-15)

#### ♻ Refactoring

- update to use [@thi.ng/arrays](https://github.com/thi-ng/umbrella/tree/main/packages/arrays) ([3a74bf1](https://github.com/thi-ng/umbrella/commit/3a74bf1))
- update fsm until() usage ([e8cd242](https://github.com/thi-ng/umbrella/commit/e8cd242))

# [1.0.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-01-21)

#### 🛑 Breaking changes

- update package build scripts & outputs, imports in ~50 packages ([b54b703](https://github.com/thi-ng/umbrella/commit/b54b703))
- BREAKING CHANGE: enabled multi-outputs (ES6 modules, CJS, UMD)
  - build scripts now first build ES6 modules in package root, then call
    `scripts/bundle-module` to build minified CJS & UMD bundles in `/lib`
  - all imports MUST be updated to only refer to package level
    (not individual files anymore). tree shaking in user land will get rid of
    all unused imported symbols.

#### 🩹 Bug fixes

- re-export TagFactories interface ([b198c19](https://github.com/thi-ng/umbrella/commit/b198c19))

## [0.2.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2019-01-04)

#### 🚀 Features

- add & refactor markdown parser (from example), update docs ([35db07f](https://github.com/thi-ng/umbrella/commit/35db07f))

## [0.1.0](https://github.com/thi-ng/umbrella/tree/<EMAIL_ADDRESS>(2018-12-20)

#### 🚀 Features

- add new package ([58f591e](https://github.com/thi-ng/umbrella/commit/58f591e))

repository: nrfm/umbrella

branch_name: refs/heads/main

repo_name: nrfm/umbrella


text:
---
layout: post
title: Jiuzhang-Maximum Depth of A Binary Tree
tags: algorithm jiuzhang binary_tree divide_conquer revisit
date: 2017-04-30 11:50:10 -0400
comments: true
---

>Q: Given a binary tree, find its maximum depth.

Example:

Given a binary tree, return 3.
```
            1
          /   \
         2    10
              /  \
             4    7
```
Thoughts:

Find and compare the maximum depth of the left of the root node and that of the right of the root node, choose the larger one and add 1 because of the root.

```java
public class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left, right) + 1;
    }
}
```
Jiuzhang has provided another way to solve the problem using the **Traverse** concept.

```java
// version 2: Traverse
public class Solution {
    private int depth;

    public int maxDepth(TreeNode root) {
        depth = 0;
        helper(root, 1);

        return depth;
    }

    private void helper(TreeNode node, int curtDepth) {
        if (node == null) {
            return;
        }

        if (curtDepth > depth) {
            depth = curtDepth;
        }

        helper(node.left, curtDepth + 1);
        helper(node.right, curtDepth + 1);
    }
}
```

Reference:

http://www.jiuzhang.com/solutions/maximum-depth-of-binary-tree/

repository: Yunhan-Zheng/codingBlog

repo_name: Yunhan-Zheng/codingBlog


text:
##Install
 - run `npm install` to install node modules
 - run `bower install` to install bower & Polymer components

## Run for development
`npm start`

## Run for production
`npm run start:dist`

## Levels
layouts -> elements -> components

### layouts
`layouts` will not be vulcanized, it will import stuffs from `elements`.

`layouts` doesn't know where the data comes from, it only combines a few `elements` in various ways.

### elements
`elements` will be vulcanized one file per sub folder, e.g.

- finance: vulcanize to `elements/finance/index.html`
- product: vulcanize to `elements/product/index.html`
- warehouse: vulcanize to `elements/warehouse/index.html`

`elements` will import stuffs from `components` and `bower_components`.

`elements` itself knows where and how the data comes from, and is able to save user's input back to server side.

### components
`components` is the basic controls, it will be vulcanized to one single file

- `components/index.html`

`components` will import stuffs from `bower_components`, and use the basic HTML controls.

`components` only accepts data binding from outside, it knows how to bind the data, but it's not aware of where the data comes from.

## Customization
Customization includes custom menu and custom layout.

### custom menu
`custom-menus` exists in `layouts/custom/` folder, it should contains the menu items that link to custom layouts.

### custom layout
Custom layouts exist in `layouts/custom/` folder, it could either uses the existing `sparklet` and `widget`, or uses other custom elements which by default will be available in the same custom folder (`layouts/custom/`).

repository: jdomzhang/polymer-vulcanize-example

repo_name: jdomzhang/polymer-vulcanize-example


text:
# WECG Meetings 2022, Public Notes, Sep 1

 * Chair: Timothy Hatcher
 * Scribes: Rob Wu

Time: 8 AM PDT = https://everytimezone.com/?t=630ff600,384
Call-in details: [WebExtensions CG, 1st September 2022](https://www.w3.org/events/meetings/d7bbce8f-549f-46ea-b440-ea6902f8707c/20220901T080000)
Zoom issues? Ping `@robwu` (Rob Wu) in [chat](https://github.com/w3c/webextensions/blob/main/CONTRIBUTING.md#joining-chat)

## Agenda: [github issues](https://github.com/w3c/webextensions/issues)

The meeting will start at 3 minutes after the hour.

 * **Carry-over from previous meetings**
   * None
 * **Other new issues**
   * [todd] Optional permissions affordances for enterprise security/compliance use cases
     * [Issue 260](https://github.com/w3c/webextensions/issues/260): "Runtime allowed hosts" on Enterprise to pre-grant optional host permissions without user action
     * [Issue 261](https://github.com/w3c/webextensions/issues/261): API to retrieve user email or well-known identifier on Enterprise deployments
   * [Issue 262](https://github.com/w3c/webextensions/issues/262): Inconsistency: oldValue in storage.StorageChange inconsistency
   * [Issue 263](https://github.com/w3c/webextensions/issues/263): undefined value in StorageArea.set()
   * [Issue 264](https://github.com/w3c/webextensions/issues/264): Supply credentials for proxy authorization in MV3
   * [Issue 267](https://github.com/w3c/webextensions/issues/267): Proposal: declarative way for opening an extension page in a new tab when click the extension icon
 * **Open discussion queue (add yourself at the bottom)**
   * None
 * **Check-in on ongoing issues**
   * [Issue 244](https://github.com/w3c/webextensions/issues/244): Better GitHub status labels
   * [Issue 232](https://github.com/w3c/webextensions/issues/232): WECG at TPAC 2022
   * [Issue 242](https://github.com/w3c/webextensions/issues/242): Inconsistency: extension popup's prefered color scheme
   * [Issue 162](https://github.com/w3c/webextensions/issues/162): DNR: disable individual static rules

## Attendees (sign yourself in)

 1. Rob Wu (Mozilla)
 2. Todd Schiller (PixieBrix)
 3. Timothy Hatcher (Apple)
 4. David Johnson (Apple)
 5. Juha-Matti Santala (Mozilla)
 6. Richard Worth (Capital One)
 7. Kyle Spearrin (Bitwarden)
 8. Matt Gibson (Bitwarden)
 9. Steven McLintock (1Password)
 10. Rainer Enders (Keeper Security)
 11. Oliver Dunk (1Password)
 12. Carlos Jeurissen (Jeurissen Apps)
 13. Simeon Vincent (Google)
 14. Bradley Cushing (Dashlane)
 15. Bastien Granger (Dashlane)
 16. Lucas Selker (Dashlane)
 17. Benjamin Bruneau (1Pasword)
 18. Felipe Erias (Igalia)
 19. Tyler Carson (Keeper)
 20. Jack Steam (CRXJS)
 21. Mukul Purohit (Microsoft)
 22. Tim Heflin (Keeper)

## Meeting notes

[Issue 260](https://github.com/w3c/webextensions/issues/260): “Runtime allowed hosts" on Enterprise to pre-grant optional host permissions without user action

 * [todd] Extension used by both individuals and enterprises. Aim to keep permissions limited. Enterprise needs a minimal setup process to minimize risk of incorrect setup. Chromium has runtime_allowed_hosts in policy. What is the intention of browser vendors here?
 * [timothy] Safari does currently not have force-installed extensions at all, and probably not something we'd do in the meantime.
 * [simeon] (Chrome) Personally, I think the interaction between runtime_allowed_hosts and runtime host permissions is confusing. There is room for improvement, and we should probably talk with other teams to figure out how to do better. Chances of taking action would improve if clear use cases are demonstrated that are currently difficult to address.
 * [mukul] (Microsoft) Agreed to what Simeon said.
 * [rob] (Firefox) Would not be opposed to improving this.
 * [todd] What are the next steps?
 * [simeon] Next step is clearly outlining the current situation, and the challenges - what are the problems we're trying to solve.
 * [timothy] Is this in scope for this CG? Deployments are explicitly out of scope in our charter.
 * [rob] It's not in scope, but we're all here and can answer this.
 * [simeon] Deployment is indeed out of scope. Like storage.managed this is part of the platform, even though it's management is elsewhere.
 * [todd] Also has direct implications for the permissions that extensions request in the marketplace. Part of that is a reasonable deployment strategy.

[Issue 261](https://github.com/w3c/webextensions/issues/261): API to retrieve user email or well-known identifier on Enterprise deployments

 * [todd] Chrome has a chrome.identity API that offers access to the e-mail (up to Jan 2021 in Chromium). Need a way to retrieve the well-known identifier on enterprise deployments.
 * [simeon] Potentially challenging that it presumes that the user is logged in to the browser. Using managed storage API it's possible to expose the LDAP-authenticated user in enterprise policies. Browser does not have visibility on the authentication system that the user used to sign in to the OS.
 * [rob] Is managed storage user-specific? I thought that it was global.
 * [simeon] On Windows, I believe that this can be configured per user via the Windows registry which has multiple levels such as machine and user.
 * [todd] Managed storage is a potential workaround, but it's also very onerous for developers.
 * [rob] Let's move on to the next topic; this is not something that we can currently address in a cross-browser way.

[Issue 262](https://github.com/w3c/webextensions/issues/262): Inconsistency: oldValue in storage.StorageChange inconsistency

 * [timothy] Safari is similar to Chrome here.
 * [simeon] Feels like the kind of thing where it will potentially lead to unexpected results and therefore may result in subtle bugs, but I'm not aware of any material impact from this issue.
 * [timothy] The absence of a key could prevent extensions from doing feature detection.
 * [rob] In this case it does not really matter.
 * Resolution: close issue

[Issue 263](https://github.com/w3c/webextensions/issues/263): undefined value in StorageArea.set()

 * [timothy] Safari matches Chrome's behavior.
 * [rob] Firefox accepts undefined as a value, and overwrites the key with undefined. Changing that could break extensions that expect `storage.local.set({key: func()})` to overwrite `key` with the result. Will reconsider by re-opening the existing bug report in Firefox.
 * [timothy] In Safari null can be used to overwrite.

[Issue 264](https://github.com/w3c/webextensions/issues/264): Supply credentials for proxy authorization in MV3

 * [simeon] Believe that the intent is to support webRequest.onAuthRequired in Chrome.
 * [rob] To confirm, is Chrome going to suspend requests until an extension has responded to webRequest.onAuthRequired events?
 * [simeon] That's my understanding.
 * [timothy] We don't support this event currently. Generally support declarative behavior, but in this case a callback could indeed make more sense.

[Issue 267](https://github.com/w3c/webextensions/issues/267): Proposal: declarative way for opening an extension page in a new tab when click the extension icon

 * [timothy] Not opposed to this, but if extensions can already do it anyway, with a one-liner, do we need another API?
 * [simeon] In general in favor of making developers lifes easier. No strong objections, but in terms of relative priority this feels like something as an Available issue.
 * [rob] Given how easy it is already, I am inclined to not add a specific manifest entry to support that functionality. API enhancements are more well suited for functionality that is difficult to achieve with existing APIs.
 * Resolution: close issue

[Issue 244](https://github.com/w3c/webextensions/issues/244): Better GitHub status labels

 * [timothy] When possible we should use these labels to mark our positions.
 * [simeon] Should Accepted be changed to Supportive?
 * [timothy] Accepted sounds a bit strong indeed.
 * [simeon] We could document the meanings of the labels in the README.
 * [rob] Or we can just rename Accepted to Supportive...
 * [timothy] I added the “proposal” label and also took a stab at labeling existing issues.

[Issue 232](https://github.com/w3c/webextensions/issues/232): WECG at TPAC 2022

 * [timothy] I wanted to create an agenda. With the new labels it should be easier to find relevant topics to discuss. The TPAC meeting is split in two parts: first to discuss topics, the second part to make progress with the charter objectives (spec, etc.).
 * [mukul] How many people are going to attend?
   * From this group: Simeon (Google), Rob and Tomislav (Mozilla), Timothy (Apple; remotely). Mukul (Microsoft; remotely)
 * [simeon] Last time we spoke we discussed Service Workers, but I don't have specific topics yet. May be useful to get clarity on how we should collaborate to agree on a common API.
 * [timothy] Seems to be an opinion that a lot of APIs are missing from service workers and whether we want to bring them over to extensions or web service workers more broadly.
 * [simeon] Of the topics discussed during the last session, user script managers & dynamic content scripts sounds like one of the main topics that we can cover during TPAC.
 * [rob] We should probably also get in touch with the Browser Testing and Tools WG. We already have an issue, but I'm not sure if they are aware of our intent to discuss this topic.
 * [simeon] I will reach out to them.

[Issue 242](https://github.com/w3c/webextensions/issues/242): Inconsistency: extension popup's prefered color scheme

 * [timothy] Safari will look for the color-scheme meta tag and try to match.
 * [simeon] I believe we have an opaque white background by default for popups.
 * [timothy] Does it change to dark in dark mode, or is it unconditionally white?
 * [simeon] Dark when dark mode is forced.
 * [oliver] We support a preference to allow the user to configure the color scheme.
 * [rob] A way to avoid the white flash is to use a different HTML page.
 * [rob] The meta tag approach seems like an elegant approach to the issue.
 * [timothy] color-scheme can be used in a meta tag. As long as it is very early in the HTML there is usually not a flash.
 * [simeon] Can media queries be used here?
 * [rob] A media query can respond to browser settings, but in this case the browser wants to read the intent from the extension.
 * [simeon] Ah, I misinterpreted the issue, sorry.
 * [rob] Next steps is to get this topic to the engineering teams of the browser vendors to discuss the desired approach.

[Issue 162](https://github.com/w3c/webextensions/issues/162): DNR: disable individual static rules

 * [felipe] Updated API proposal in response to feedback. Current status: https://github.com/w3c/webextensions/issues/162#issuecomment-1234129962. Going to implement the three approaches, and experiment & benchmark.
 * [timothy] The browser implementations are out of scope for the group (e.g. flatbuffers specific to other browsers). The extension API is relevant to other browsers though.
 * [timothy] Since we (Safari) combine the rulesets together, updating individual rules can trigger expensive computation in the background.
 * [rob] Safari uses a state machine, so the third approach from the issue could conceptually work (storing disabled rules separately) - before exiting the state machine, check whether the rule is disabled, and if so, continue as usual.

The next meeting will be on [Thursday, September 15th, 8 AM PDT (3 PM UTC)](https://everytimezone.com/?t=63226b00,384).

gha_language: HTML


text:
# Graph DFS

## Depth First Search \(DFS\)

### Objective

* Learn about one of the more famous graph algorithms
* Learn uses of DFS

### Overview

When searching a graph, one of the approaches is called _depth first search_. This "dives" "down" the graph as far as it can before needing to backtrack and explore another branch.

The algorithm never attempts to explore a vert that it either has explored or is exploring.

For example, when starting from the upper left, the numbers on this graph show a vertex visitation order in a DFS:

![](../../../../.gitbook/assets/image%20%2812%29.png)

The bold lines show with edges were followed. \(The thin edges were not followed since their destination nodes had already been visited.\)

\(Of course, the exact order will vary depending on which branches get taken first and which vertex is the starting vertex.\)

### Applications of DFS

* Finding [Minimum Spanning Trees](https://en.wikipedia.org/wiki/Minimum_spanning_tree) of weighted graphs
* Path finding
* Detecting cycles in graphs
* [Topological sorting](https://en.wikipedia.org/wiki/Topological_sorting), useful for scheduling sequences of dependent jobs
* Solving and generating mazes

### Coloring Vertexes

As the graph is explored, it's useful to color verts as you arrive at them and as you leave them behind as "already searched".

### Recursion

Since we want to pursue leads in the graph as far as we can, and then "back up" to an earlier branch point to explore that way, recursion is a good approach to help "remember" where we left off.

Looking at it with pseudocode to make the recursion more apparent:

```text
explore(graph) {
    visit(this_vert);
    explore(remaining_graph);
}
```

### Pseudocode for DFS

```text
DFS(graph):
    for v of graph.verts:
        v.color = white
        v.parent = null

    for v of graph.verts:
        if v.color == white:
            DFS_visit(v)

DFS_visit(v):
    v.color = gray

    for neighbor of v.adjacent_nodes:
        if neighbor.color == white:
            neighbor.parent = v
            DFS_visit(neighbor)

    v.color = black
```

## Implementation:

```python
class Node(object):

    def __init__(self, name):
        self.name = name
        self.adjacencyList = []
        self.visited = False
        self.predecessor = None

class DepthFirstSearch(object):  # BFS -> queue + layer by layer algorithm   DFS -> stack + goes
    # as deep as possible into the tree !!!

    def dfs(self, node):

        node.visited = True
        print("%s " % node.name)

        for n in node.adjacencyList:
            if not n.visited:
                self.dfs(n)

node1 = Node("A")
node2 = Node("B")
node3 = Node("C")
node4 = Node("D")
node5 = Node("E")

node1.adjacencyList.append(node2)
node1.adjacencyList.append(node3)
node2.adjacencyList.append(node4)
node4.adjacencyList.append(node5)

dfs = DepthFirstSearch()
dfs.dfs(node1)

```

![](../../../../.gitbook/assets/image%20%284%29.png)

```python
def graph_dfs(matrix):
    rows, cols = len(matrix), len(matrix[0])
    visited = set()
    directions = ((0, 1), (0, -1), (1, 0), (-1, 0))
    def dfs(i, j):
        if (i, j) in visited:
            return
        visited.add((i, j))
        # Traverse neighbors.
        for direction in directions:
            next_i, next_j = i + direction[0], j + direction[1]
            if 0 <= next_i < rows and 0 <= next_j < cols: # Check boundary.
                # Add any other checking here ^
                dfs(next_i, next_j)

    for i in range(rows):
        for j in range(cols):
            dfs(i, j)

graph_dfs([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
])

```