@macedon-technologies/batman 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -245,5 +245,5 @@ class BatmanProject extends awscdk_1.AwsCdkTypeScriptApp {
245
245
  }
246
246
  exports.BatmanProject = BatmanProject;
247
247
  _a = JSII_RTTI_SYMBOL_1;
248
- BatmanProject[_a] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.8.0" };
248
+ BatmanProject[_a] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.9.0" };
249
249
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0bWFuUHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXRtYW5Qcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQW9GO0FBQ3BGLDhDQUFzRDtBQUN0RCwrQ0FBMEU7QUFDMUUscURBQWtEO0FBQ2xELDJEQUF3RDtBQUN4RCx1REFBb0Q7QUFDcEQseURBQXNEO0FBb0N0RCxNQUFhLGFBQWMsU0FBUSw0QkFBbUI7SUFDcEQsWUFBWSxPQUE2QjtRQUN2QyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFTO1lBQzNDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxNQUFNO1lBQzVELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixhQUFhLEVBQUUsS0FBSztZQUNwQixJQUFJLEVBQUU7Z0JBQ0osbUJBQW1CO2dCQUNuQixnQkFBZ0I7Z0JBQ2hCLFdBQVc7Z0JBQ1gsSUFBSTtnQkFDSixxQkFBcUI7Z0JBQ3JCLHNCQUFzQjtnQkFDdEIsMkJBQTJCO2dCQUMzQiwwQkFBMEI7Z0JBQzFCLG1DQUFtQztnQkFDbkMsY0FBYztnQkFDZCxpQ0FBaUM7Z0JBQ2pDLFNBQVM7Z0JBQ1QsaUJBQWlCO2dCQUNqQixHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRTthQUN0QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxxQkFBcUI7Z0JBQ3JCLFNBQVM7Z0JBQ1QsY0FBYztnQkFDZCxxQ0FBcUM7Z0JBQ3JDLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO2FBQ3pCO1lBQ0QsU0FBUyxFQUFFO2dCQUNULG1EQUFtRDtnQkFDbkQsY0FBYztnQkFDZCxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTthQUMzQjtZQUNELFFBQVEsRUFBRTtnQkFDUixHQUFHLE9BQU8sQ0FBQyxR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LEVBQUUsTUFBTTtZQUM1QixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQzFCLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFjLEVBQUUsRUFBRTtZQUN6QyxPQUFPLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2xCLElBQUksRUFBRSxZQUFZLENBQ2hCLGdGQUFnRixFQUNoRixTQUFTLENBQUMsVUFBVSxDQUNyQjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLElBQUksRUFBRSxnRkFBZ0Y7WUFDdEYsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO0lBR0wsQ0FBQzs7QUF0UEgsc0NBdVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCwgQXdzQ2RrVHlwZVNjcmlwdEFwcE9wdGlvbnMgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBHaXRodWJDcmVkZW50aWFscyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvbkVudmlyb25tZW50Q29uZmlnIH0gZnJvbSAnLi9BcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb2RlT3duZXJzRmlsZSB9IGZyb20gJy4vQ29kZU93bmVyc0ZpbGUnO1xuaW1wb3J0IHsgRGF0YURvZ0FzcGVjdEZpbGUgfSBmcm9tICcuL0RhdGFEb2dBc3BlY3RGaWxlJztcbmltcG9ydCB7IEdpdEh1YlJvbGVzRmlsZSB9IGZyb20gJy4vR2l0SHViUm9sZXNGaWxlJztcbmltcG9ydCB7IFZpdGVSZWFjdFByb2plY3QgfSBmcm9tICcuL1ZpdGVSZWFjdFByb2plY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhdG1hblByb2plY3RPcHRpb25zIGV4dGVuZHMgQXdzQ2RrVHlwZVNjcmlwdEFwcE9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXY6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIERldmVsb3BtZW50IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmc6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZDogQXBwbGljYXRpb25FbnZpcm9ubWVudENvbmZpZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCB0YWdzIHRvIGFwcGx5IHRvIGFsbCBzdGFja3NcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxUYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb2RlIG93bmVycyB0byBhZGQgdG8gdGhlIENPREVPV05FUlMgZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbENvZGVPd25lcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2Vic2l0ZSBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEZXBzPzogc3RyaW5nW107XG59XG5cblxuZXhwb3J0IGNsYXNzIEJhdG1hblByb2plY3QgZXh0ZW5kcyBBd3NDZGtUeXBlU2NyaXB0QXBwIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQmF0bWFuUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2RrVmVyc2lvbjogb3B0aW9ucy5jZGtWZXJzaW9uIHx8ICcyLjIyNC4wJyxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiBvcHRpb25zLmRlZmF1bHRSZWxlYXNlQnJhbmNoIHx8ICdtYWluJyxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIHByb2plbnJjVHM6IHRydWUsXG4gICAgICBidWlsZFdvcmtmbG93OiBmYWxzZSxcbiAgICAgIGRlcHM6IFtcbiAgICAgICAgJ0B0eXBlcy9hd3MtbGFtYmRhJyxcbiAgICAgICAgJ0B0eXBlcy9leHByZXNzJyxcbiAgICAgICAgJ0B0eXBlcy9wZycsXG4gICAgICAgICdwZycsXG4gICAgICAgICdAYXdzLXNkay9yZHMtc2lnbmVyJyxcbiAgICAgICAgJ0BtYXR0aGV3Ym9uaWcvc2VjcmV0JyxcbiAgICAgICAgJ2RhdGFkb2ctY2RrLWNvbnN0cnVjdHMtdjInLFxuICAgICAgICAnQGNka2xhYnMvYXdzLWxhbWJkYS1ydXN0JyxcbiAgICAgICAgJ0Bhd3MtbGFtYmRhLXBvd2VydG9vbHMvcGFyYW1ldGVycycsXG4gICAgICAgICdqc29ud2VidG9rZW4nLFxuICAgICAgICAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcicsXG4gICAgICAgICdleHByZXNzJyxcbiAgICAgICAgJ3NlcnZlcmxlc3MtaHR0cCcsXG4gICAgICAgIC4uLm9wdGlvbnMuZGVwcyB8fCBbXSxcbiAgICAgIF0sXG4gICAgICBkZXZEZXBzOiBbXG4gICAgICAgICdAdHlwZXMvanNvbndlYnRva2VuJyxcbiAgICAgICAgJ25vZGVtb24nLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgJ0BtYWNlZG9uLXRlY2hub2xvZ2llcy9iYXRtYW5AXjEuMC4wJyxcbiAgICAgICAgLi4ub3B0aW9ucy5kZXZEZXBzIHx8IFtdLFxuICAgICAgXSxcbiAgICAgIGdpdGlnbm9yZTogW1xuICAgICAgICAnc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9jbGVyay1hdXRob3JpemVyL3RhcmdldC8qKicsXG4gICAgICAgICcqKi8uRFNfU3RvcmUnLFxuICAgICAgICAuLi5vcHRpb25zLmdpdGlnbm9yZSB8fCBbXSxcbiAgICAgIF0sXG4gICAgICB0c2NvbmZpZzoge1xuICAgICAgICAuLi5vcHRpb25zLnRzY29uZmlnLFxuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLnRzY29uZmlnPy5jb21waWxlck9wdGlvbnMsXG4gICAgICAgICAgaXNvbGF0ZWRNb2R1bGVzOiB0cnVlLFxuICAgICAgICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNhbXBsZUNvZGU6IGZhbHNlLFxuICAgICAgbWluTm9kZVZlcnNpb246IG9wdGlvbnMubWluTm9kZVZlcnNpb24gfHwgJzIyJyxcbiAgICAgIGRlcHNVcGdyYWRlT3B0aW9uczoge1xuICAgICAgICB3b3JrZmxvd09wdGlvbnM6IHtcbiAgICAgICAgICBwcm9qZW5DcmVkZW50aWFsczogR2l0aHViQ3JlZGVudGlhbHMuZnJvbVBlcnNvbmFsQWNjZXNzVG9rZW4oe1xuICAgICAgICAgICAgc2VjcmV0OiAnR0lUSFVCX1RPS0VOJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkbWU6IHtcbiAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICBgIyAke29wdGlvbnMubmFtZX1gLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdUaGlzIHByb2plY3Qgd2FzIGJvb3RzdHJhcHBlZCB3aXRoIFtCYXRtYW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYWNlZG9uLXRlY2hub2xvZ2llcy9wbGF0Zm9ybS1jb21tb24pLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIFdoYXQgQmF0bWFuIENyZWF0ZWQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyMgQ0RLIEluZnJhc3RydWN0dXJlIChgc3JjL2ApJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgICAgICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICAgICAgICd8IGBzcmMvbWFpbi50c2AgfCBDREsgYXBwIGVudHJ5IHBvaW50IOKAlCBpbnN0YW50aWF0ZXMgZGV2LCBzdGFnaW5nLCBhbmQgcHJvZCBgQXBwbGljYXRpb25TdGFja2BzIHwnLFxuICAgICAgICAgICd8IGBzcmMvTG9jYWxEZXZBcHAudHNgIHwgTG9jYWwgZGV2ZWxvcG1lbnQgQ0RLIGFwcCDigJQgdXNlZCBieSBgeWFybiBjZGs6ZGV2YCB8JyxcbiAgICAgICAgICAnfCBgc3JjL0dpdEh1YlJvbGVzLnRzYCB8IENESyBhcHAgZm9yIGRlcGxveWluZyB0aGUgR2l0SHViIE9JREMgSUFNIHJvbGUgKG9uZS10aW1lIGJvb3RzdHJhcCkgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AgfCBZb3VyIHByaW1hcnkgc3RhY2sg4oCUIGV4dGVuZCBpdCB0byBhZGQgcmVzb3VyY2VzIHwnLFxuICAgICAgICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IEJhc2Ugc3RhY2sgd2l0aCBWUEMsIEFQSSwgc3RhdGljIHdlYnNpdGUsIERhdGFkb2csIGFuZCBSb3V0ZSA1MyB3aXJlZCB1cCB8JyxcbiAgICAgICAgICAnfCBgc3JjL3N0YWNrcy9HaXRIdWJSb2xlc1N0YWNrLnRzYCB8IElBTSByb2xlIHN0YWNrIGZvciBHaXRIdWIgQWN0aW9ucyBPSURDIGF1dGhlbnRpY2F0aW9uIHwnLFxuICAgICAgICAgICd8IGBzcmMvY29uc3RydWN0cy9BcGkudHNgIHwgQVBJIEdhdGV3YXkgKyBMYW1iZGEgY29uc3RydWN0IHdpdGggQ2xlcmsgSldUIGF1dGhvcml6ZXIgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL1N0YXRpY1dlYnNpdGUudHNgIHwgQ2xvdWRGcm9udCArIFMzICsgQUNNICsgUm91dGUgNTMgY29uc3RydWN0IHwnLFxuICAgICAgICAgICd8IGBzcmMvY29uc3RydWN0cy9oYW5kbGVyL0FwaS5GdW5jdGlvbi50c2AgfCBMYW1iZGEgaGFuZGxlciBlbnRyeSBwb2ludCB8JyxcbiAgICAgICAgICAnfCBgc3JjL2FzcGVjdHMvRGF0YURvZ0FzcGVjdC50c2AgfCBDREsgYXNwZWN0IHRoYXQgd2lyZXMgYWxsIExhbWJkYSBmdW5jdGlvbnMgdG8gRGF0YWRvZyB8JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMjIEZyb250ZW5kIChgd2ViL2ApJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgICAgICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IFJlYWN0IGFwcCBlbnRyeSBwb2ludCB3aXRoIENsZXJrIGFuZCBSZWFjdCBRdWVyeSBwcm92aWRlcnMgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBSb290IGFwcGxpY2F0aW9uIGNvbXBvbmVudCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBCYXNlIHN0eWxlc2hlZXRzIChUYWlsd2luZCBDU1MgdjQpIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBgdXNlQ29uZmlnKClgIGhvb2sg4oCUIGxvYWRzIHJ1bnRpbWUgY29uZmlnIGZyb20gYGNvbmZpZy5qc29uYCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AgfCBgdXNlQmFzZVF1ZXJ5KClgIOKAlCBhdXRoZW50aWNhdGVkIEFQSSBmZXRjaCBob29rIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYCB8IEV4YW1wbGUgc2VydmljZSB1c2luZyBgdXNlQmFzZVF1ZXJ5YCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3B1YmxpYy9jb25maWcuanNvbmAgfCBSdW50aW1lIGNvbmZpZyAoQVBJIGJhc2UgVVJMLCBDbGVyayBwdWJsaXNoYWJsZSBrZXkpIHwnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyMgR2l0SHViIEFjdGlvbnMgV29ya2Zsb3dzIChgLmdpdGh1Yi93b3JrZmxvd3MvYCknLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICd8IEZpbGUgfCBUcmlnZ2VyIHwnLFxuICAgICAgICAgICd8LS0tLS0tfC0tLS0tLS0tLXwnLFxuICAgICAgICAgICd8IGBwci1kZXBsb3kueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBvcGVuL3VwZGF0ZSDigJQgZGVwbG95cyBhIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgICAgICAgJ3wgYHByLWNsZWFudXAueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBjbG9zZSDigJQgdGVhcnMgZG93biB0aGUgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAgICAgICAnfCBgc3RhZ2luZy1kZXBsb3kueW1sYCB8IE9uIHB1c2ggdG8gYG1haW5gIOKAlCBkZXBsb3lzIHRvIHN0YWdpbmcgfCcsXG4gICAgICAgICAgJ3wgYHByb2R1Y3Rpb24tZGVwbG95LnltbGAgfCBNYW51YWxseSB0cmlnZ2VyZWQg4oCUIGRlcGxveXMgdG8gcHJvZHVjdGlvbiB8JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnLS0tJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRmlsZXMgWW91IENhbiBFZGl0JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBvbmNlIGFuZCBuZXZlciBvdmVyd3JpdHRlbiBieSBCYXRtYW4uIE1vZGlmeSB0aGVtIGZyZWVseS4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICd8IEZpbGUgfCBXaGF0IHRvIGRvIHdpdGggaXQgfCcsXG4gICAgICAgICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAgICAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8ICoqU3RhcnQgaGVyZS4qKiBBZGQgQ0RLIGNvbnN0cnVjdHMgdG8gYnVpbGQgeW91ciBpbmZyYXN0cnVjdHVyZSB8JyxcbiAgICAgICAgICAnfCBgc3JjL2NvbnN0cnVjdHMvQXBpLnRzYCB8IEV4dGVuZCB0aGUgQVBJIOKAlCBhZGQgTGFtYmRhIGludGVncmF0aW9ucywgcm91dGVzLCBvciBvdmVycmlkZSBtZXRob2RzIHwnLFxuICAgICAgICAgICd8IGBzcmMvY29uc3RydWN0cy9TdGF0aWNXZWJzaXRlLnRzYCB8IEN1c3RvbWl6ZSBDbG91ZEZyb250IGJlaGF2aW9ycywgUzMgc2V0dGluZ3MsIG9yIGRlcGxveW1lbnQgb3B0aW9ucyB8JyxcbiAgICAgICAgICAnfCBgc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9BcGkuRnVuY3Rpb24udHNgIHwgSW1wbGVtZW50IHlvdXIgTGFtYmRhIGhhbmRsZXIgbG9naWMgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9zdGFja3MvR2l0SHViUm9sZXNTdGFjay50c2AgfCBBZGQgSUFNIHBlcm1pc3Npb25zIG5lZWRlZCBieSBHaXRIdWIgQWN0aW9ucyB8JyxcbiAgICAgICAgICAnfCBgc3JjL21haW4udHNgIHwgQWRqdXN0IHN0YWNrIGluc3RhbnRpYXRpb24gb3IgYWRkIGFkZGl0aW9uYWwgc3RhY2tzIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL0FwcC50c3hgIHwgQnVpbGQgeW91ciBVSSBoZXJlIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL0FwcC5jc3NgIC8gYHdlYi9zcmMvaW5kZXguY3NzYCB8IFN0eWxlIHlvdXIgYXBwbGljYXRpb24gfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvbWFpbi50c3hgIHwgQWRqdXN0IHRvcC1sZXZlbCBwcm92aWRlcnMgb3Igcm91dGluZyB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9Sb290U2VydmljZS50c2AgfCBBZGQgb3IgcmVwbGFjZSBBUEkgc2VydmljZSBob29rcyB8JyxcbiAgICAgICAgICAnfCBgd2ViL3B1YmxpYy9jb25maWcuanNvbmAgfCBVcGRhdGUgZm9yIGxvY2FsIGRldmVsb3BtZW50IChBUEkgVVJMLCBDbGVyayBrZXkpIHwnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBGaWxlcyBZb3UgQ2Fubm90IEVkaXQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdUaGVzZSBmaWxlcyBhcmUgKiptYW5hZ2VkIGJ5IEJhdG1hbioqIGFuZCB3aWxsIGJlIG92ZXJ3cml0dGVuIGV2ZXJ5IHRpbWUgYG5weCBwcm9qZW5gIHJ1bnMuIERvIG5vdCBlZGl0IHRoZW0gZGlyZWN0bHkg4oCUIG1ha2UgY2hhbmdlcyBpbiBgLnByb2plbnJjLnRzYCBpbnN0ZWFkLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJz4gWyFJTVBPUlRBTlRdJyxcbiAgICAgICAgICAnPiBJZiB5b3UgaGF2ZSBBTlkgY2hhbmdlcyB5b3Ugd2FudCB0byBtYWtlIHRvIHRoZXNlIGZpbGVzLCBub3RpZnkgI3RlYW0tYmF0bWFuIG9uIFNsYWNrLiAnLFxuICAgICAgICAgICc+IFdlIG1haW50YWluIHRoZXNlIGZpbGVzIGFzIHBhcnQgb2YgdGhlIGNvcmUgQmF0bWFuIGV4cGVyaWVuY2UsIGFuZCB5b3VyIGZlZWRiYWNrIGlzIGNydWNpYWwgdG8gZW5zdXJlIHRoZXkgbWVldCB5b3VyIG5lZWRzLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ3wgRmlsZSB8IFdoeSBpdFxcJ3MgbWFuYWdlZCB8JyxcbiAgICAgICAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwnLFxuICAgICAgICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IENvcmUgc3RhY2sgd2lyaW5nIOKAlCB1cGRhdGVkIHdpdGggQmF0bWFuIHJlbGVhc2VzIHwnLFxuICAgICAgICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IERhdGFkb2cgQ0RLIGFzcGVjdCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3ZpdGUuY29uZmlnLnRzYCB8IFZpdGUgY29uZmlndXJhdGlvbiB8JyxcbiAgICAgICAgICAnfCBgd2ViL2VzbGludC5jb25maWcuanNgIHwgRVNMaW50IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgICAgICAgJ3wgYHdlYi9wb3N0Y3NzLmNvbmZpZy5qc2AgfCBQb3N0Q1NTIC8gVGFpbHdpbmQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAgICAgICAnfCBgd2ViL2luZGV4Lmh0bWxgIHwgSFRNTCBlbnRyeSBwb2ludCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3RzY29uZmlnLmpzb25gIC8gYHdlYi90c2NvbmZpZy5hcHAuanNvbmAgLyBgd2ViL3RzY29uZmlnLm5vZGUuanNvbmAgfCBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvdml0ZS1lbnYuZC50c2AgfCBWaXRlIHR5cGUgZGVjbGFyYXRpb25zIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBSdW50aW1lIGNvbmZpZyBob29rIOKAlCBzaGFwZSBkcml2ZW4gYnkgYC5wcm9qZW5yYy50c2AgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvQmFzZVNlcnZpY2UudHNgIHwgQmFzZSBhdXRoZW50aWNhdGVkIGZldGNoIGhvb2sgfCcsXG4gICAgICAgICAgJ3wgYC5naXRodWIvQ09ERU9XTkVSU2AgfCBDb2RlIG93bmVyc2hpcCBwb2xpY3kgfCcsXG4gICAgICAgICAgJ3wgYC5naXRodWIvd29ya2Zsb3dzLyoueW1sYCB8IEFsbCBDSS9DRCB3b3JrZmxvd3MgfCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJz4gKipUaXA6KiogRmlsZXMgd2l0aCBhIGB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJucHggcHJvamVuXCIuIH5+YCBoZWFkZXIgYXJlIG1hbmFnZWQgZmlsZXMuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnLS0tJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgV2hlcmUgdG8gU3RhcnQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcxLiAqKmBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgKiog4oCUIEFkZCB5b3VyIENESyBjb25zdHJ1Y3RzIGhlcmUuIFRoZSBiYXNlIHN0YWNrIGFscmVhZHkgcHJvdmlkZXMgYHRoaXMuYXBpYCwgYHRoaXMudnBjYCwgYHRoaXMuaG9zdGVkWm9uZWAsIGFuZCBgdGhpcy5kYXRhZG9nYCBhcyBwcm90ZWN0ZWQgcHJvcGVydGllcy4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcyLiAqKmB3ZWIvYCoqIOKAlCBCdWlsZCB5b3VyIGZyb250ZW5kLiBTdGFydCB3aXRoIGB3ZWIvc3JjL0FwcC50c3hgIGFuZCBhZGQgc2VydmljZXMgYWxvbmdzaWRlIGB3ZWIvc3JjL3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYC4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICczLiAqKmBzcmMvY29uc3RydWN0cy9oYW5kbGVyL0FwaS5GdW5jdGlvbi50c2AqKiDigJQgSW1wbGVtZW50IHlvdXIgYmFja2VuZCBMYW1iZGEgaGFuZGxlciBsb2dpYyBoZXJlLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJy0tLScsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIERldmVsb3BtZW50IFdvcmtmbG93JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnYGBgYmFzaCcsXG4gICAgICAgICAgJyMgSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICd5YXJuIGluc3RhbGwnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIFN0YXJ0IGxvY2FsIGRldiBzZXJ2ZXIgKGJhY2tlbmQgTGFtYmRhICsgVml0ZSBmcm9udGVuZCBpbiBwYXJhbGxlbCknLFxuICAgICAgICAgICd5YXJuIGRldicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMgRGVwbG95IGEgcGVyc29uYWwgZGV2IHN0YWNrIHRvIEFXUycsXG4gICAgICAgICAgJ3lhcm4gY2RrOmRldiAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZSBkZXBsb3knLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIFJ1biB0ZXN0cycsXG4gICAgICAgICAgJ3lhcm4gdGVzdCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMgUmUtc3ludGhlc2l6ZSBwcm9qZWN0IGZpbGVzIGFmdGVyIGVkaXRpbmcgLnByb2plbnJjLnRzJyxcbiAgICAgICAgICAnbnB4IHByb2plbicsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJy0tLScsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIFVwZ3JhZGluZyBCYXRtYW4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdgYGBiYXNoJyxcbiAgICAgICAgICAneWFybiBhZGQgQG1hY2Vkb24tdGVjaG5vbG9naWVzL2JhdG1hbkBsYXRlc3QnLFxuICAgICAgICAgICducHggcHJvamVuJyxcbiAgICAgICAgICAnYGBgJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnVGhpcyB1cGRhdGVzIGFsbCBtYW5hZ2VkIGZpbGVzIHRvIHRoZSBsYXRlc3QgQmF0bWFuIHN0YW5kYXJkcy4gWW91ciBlZGl0YWJsZSBzYW1wbGUgZmlsZXMgYXJlIG5ldmVyIHRvdWNoZWQuJyxcbiAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cblxuICAgIC8vIENyZWF0ZSBzdGFuZGFyZCBwcm9qZWN0IGZpbGVzXG4gICAgY29uc3QgUFJJTUFSWV9BQ0NPVU5UID0gJzAxNTk1NTgxNzI2Myc7XG4gICAgY29uc3QgUFJJTUFSWV9SRUdJT04gPSAndXMtZWFzdC0xJztcblxuICAgIG5ldyBBcHBsaWNhdGlvbih0aGlzLCB7XG4gICAgICBnaXRodWJSZXBvc2l0b3J5OiBgbWFjZWRvbi10ZWNobm9sb2dpZXMvJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgIGNsZXJrUHVibGlzaGFibGVLZXk6ICdwa190ZXN0X2FXNTBaVzV6WlMxc1pXVmphQzB5TWk1amJHVnlheTVoWTJOdmRXNTBjeTVrWlhZaycsXG4gICAgICBkZXY6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5kZXYsXG4gICAgICB9LFxuICAgICAgc3RhZ2luZzoge1xuICAgICAgICAuLi5vcHRpb25zLnN0YWdpbmcsXG4gICAgICB9LFxuICAgICAgcHJvZDoge1xuICAgICAgICAuLi5vcHRpb25zLmRldixcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsVGFnczogb3B0aW9ucy5hZGRpdGlvbmFsVGFncyxcbiAgICB9KTtcblxuICAgIG5ldyBHaXRIdWJSb2xlc0ZpbGUodGhpcywge1xuICAgICAgYWNjb3VudDogUFJJTUFSWV9BQ0NPVU5ULFxuICAgICAgcHJpbWFyeVJlZ2lvbjogUFJJTUFSWV9SRUdJT04sXG4gICAgfSk7XG5cbiAgICBuZXcgQ29kZU93bmVyc0ZpbGUodGhpcywge1xuICAgICAgYWRkaXRpb25hbE93bmVyczogb3B0aW9ucy5hZGRpdGlvbmFsQ29kZU93bmVycyxcbiAgICB9KTtcblxuICAgIG5ldyBEYXRhRG9nQXNwZWN0RmlsZSh0aGlzKTtcblxuICAgIGNvbnN0IHZpdGVSZWFjdCA9IG5ldyBWaXRlUmVhY3RQcm9qZWN0KHtcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiAnbWFpbicsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBvdXRkaXI6ICd3ZWInLFxuICAgICAgZGVwczogb3B0aW9ucy53ZWJzaXRlRGVwcyxcbiAgICB9KTtcbiAgICB2aXRlUmVhY3QuYWRkQ29uZmlnRmllbGQoJ3NvbWV0aGluZycsICdudW1iZXInKTtcbiAgICB2aXRlUmVhY3QuYWRkQ29uZmlnRmllbGQoJ3NvbWV0aGluZ0Vsc2UnLCAnc3RyaW5nJyk7XG5cbiAgICBjb25zdCBjb25jdXJyZW50bHkgPSAoLi4uYXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIHJldHVybiBgY29uY3VycmVudGx5ICR7YXJncy5tYXAoYSA9PiBgXCIke2F9XCJgKS5qb2luKCcgJyl9YDtcbiAgICB9O1xuXG4gICAgdGhpcy5hZGRUYXNrKCdkZXYnLCB7XG4gICAgICBleGVjOiBjb25jdXJyZW50bHkoXG4gICAgICAgICdub2RlbW9uIC0td2F0Y2ggLi9zcmMvY29uc3RydWN0cy9oYW5kbGVyIC0td2F0Y2ggLi9sb2NhbC9kZXYudHMgLi9sb2NhbC9kZXYudHMnLFxuICAgICAgICB2aXRlUmVhY3QuZGV2Q29tbWFuZCxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZFRhc2soJ2NkazpkZXYnLCB7XG4gICAgICBleGVjOiAneWFybiBjZGsgLWEgXCJucHggdHMtbm9kZSAtUCB0c2NvbmZpZy5qc29uIC0tcHJlZmVyLXRzLWV4dHMgc3JjL0xvY2FsRGV2QXBwLnRzXCInLFxuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgfSk7XG5cblxuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
2
+ import { EnvironmentConfig } from './MainFile';
3
+ export interface ApplicationEnvironmentConfig extends EnvironmentConfig {
4
+ readonly githubActionRoleArn: `arn:aws:iam::${string}:role/${string}`;
5
+ }
6
+ export interface ApplicationOptions {
7
+ readonly githubRepository: string;
8
+ readonly dev: ApplicationEnvironmentConfig;
9
+ readonly staging: ApplicationEnvironmentConfig;
10
+ readonly prod: ApplicationEnvironmentConfig;
11
+ readonly clerkPublishableKey: string;
12
+ readonly additionalTags?: {
13
+ [key: string]: string;
14
+ };
15
+ }
16
+ /**
17
+ * Application construct that creates all standard project files
18
+ */
19
+ export declare class BootcampApplication {
20
+ constructor(project: AwsCdkTypeScriptApp, options: ApplicationOptions);
21
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BootcampApplication = void 0;
4
+ const ApiConstructFile_1 = require("./ApiConstructFile");
5
+ const ApiFunctionFile_1 = require("./ApiFunctionFile");
6
+ const BaseApplicationStackFile_1 = require("./BaseApplicationStackFile");
7
+ const BootcampApplicationStackFile_1 = require("./BootcampApplicationStackFile");
8
+ const CodeRabbitFile_1 = require("./CodeRabbitFile");
9
+ const GitHubRolesStackFile_1 = require("./GitHubRolesStackFile");
10
+ const LocalDevAppFile_1 = require("./LocalDevAppFile");
11
+ const MainFile_1 = require("./MainFile");
12
+ const MainTestFile_1 = require("./MainTestFile");
13
+ const PrCleanupWorkflow_1 = require("./PrCleanupWorkflow");
14
+ const PrDeployWorkflow_1 = require("./PrDeployWorkflow");
15
+ const ProductionDeployWorkflow_1 = require("./ProductionDeployWorkflow");
16
+ const StagingDeployWorkflow_1 = require("./StagingDeployWorkflow");
17
+ const StaticWebsiteConstructFile_1 = require("./StaticWebsiteConstructFile");
18
+ /**
19
+ * Application construct that creates all standard project files
20
+ */
21
+ class BootcampApplication {
22
+ constructor(project, options) {
23
+ // Create main entry point files
24
+ new MainFile_1.MainFile(project, {
25
+ projectName: project.name,
26
+ dev: options.dev,
27
+ staging: options.staging,
28
+ prod: options.prod,
29
+ additionalTags: options.additionalTags,
30
+ });
31
+ new LocalDevAppFile_1.LocalDevAppFile(project, {
32
+ projectName: project.name,
33
+ dev: options.dev,
34
+ });
35
+ // Create stack files
36
+ new GitHubRolesStackFile_1.GitHubRolesStackFile(project, {
37
+ githubRepository: options.githubRepository,
38
+ });
39
+ new BaseApplicationStackFile_1.BaseApplicationStackFile(project);
40
+ new BootcampApplicationStackFile_1.BootcampApplicationStackFile(project);
41
+ // Create construct files
42
+ new ApiConstructFile_1.ApiConstructFile(project);
43
+ new StaticWebsiteConstructFile_1.StaticWebsiteConstructFile(project);
44
+ // Create handler files
45
+ new ApiFunctionFile_1.ApiFunctionFile(project);
46
+ // Create test files
47
+ new MainTestFile_1.MainTestFile(project);
48
+ // Create config files
49
+ new CodeRabbitFile_1.CodeRabbitFile(project);
50
+ // Create GitHub Actions workflows
51
+ new PrDeployWorkflow_1.PrDeployWorkflow(project, {
52
+ roleArn: options.dev.githubActionRoleArn,
53
+ awsRegion: options.dev.region,
54
+ clerkPublishableKey: options.clerkPublishableKey,
55
+ });
56
+ new PrCleanupWorkflow_1.PrCleanupWorkflow(project, {
57
+ roleArn: options.dev.githubActionRoleArn,
58
+ awsRegion: options.dev.region,
59
+ });
60
+ new StagingDeployWorkflow_1.StagingDeployWorkflow(project, {
61
+ roleArn: options.staging.githubActionRoleArn,
62
+ awsRegion: options.staging.region,
63
+ projectName: project.name,
64
+ clerkPublishableKey: options.staging.clerkPublishableKey,
65
+ });
66
+ new ProductionDeployWorkflow_1.ProductionDeployWorkflow(project, {
67
+ roleArn: options.prod.githubActionRoleArn,
68
+ awsRegion: options.prod.region,
69
+ projectName: project.name,
70
+ clerkPublishableKey: options.prod.clerkPublishableKey,
71
+ });
72
+ }
73
+ }
74
+ exports.BootcampApplication = BootcampApplication;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBBcHBsaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb290Y2FtcEFwcGxpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlEQUFzRDtBQUN0RCx1REFBb0Q7QUFDcEQseUVBQXNFO0FBQ3RFLGlGQUE4RTtBQUM5RSxxREFBa0Q7QUFDbEQsaUVBQThEO0FBQzlELHVEQUFvRDtBQUNwRCx5Q0FBeUQ7QUFDekQsaURBQThDO0FBQzlDLDJEQUF3RDtBQUN4RCx5REFBc0Q7QUFDdEQseUVBQXNFO0FBQ3RFLG1FQUFnRTtBQUNoRSw2RUFBMEU7QUFlMUU7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUM5QixZQUFZLE9BQTRCLEVBQUUsT0FBMkI7UUFDbkUsZ0NBQWdDO1FBRWhDLElBQUksbUJBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDcEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztTQUN2QyxDQUFDLENBQUM7UUFFSCxJQUFJLGlDQUFlLENBQUMsT0FBTyxFQUFFO1lBQzNCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUN6QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7U0FDakIsQ0FBQyxDQUFDO1FBRUgscUJBQXFCO1FBQ3JCLElBQUksMkNBQW9CLENBQUMsT0FBTyxFQUFFO1lBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxtREFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLDJEQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLHlCQUF5QjtRQUN6QixJQUFJLG1DQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksdURBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsdUJBQXVCO1FBQ3ZCLElBQUksaUNBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsSUFBSSwyQkFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLHNCQUFzQjtRQUN0QixJQUFJLCtCQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUIsa0NBQWtDO1FBQ2xDLElBQUksbUNBQWdCLENBQUMsT0FBTyxFQUFFO1lBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUN4QyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQzdCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxtQkFBbUI7U0FDakQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxxQ0FBaUIsQ0FBQyxPQUFPLEVBQUU7WUFDN0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CO1lBQ3hDLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSw2Q0FBcUIsQ0FBQyxPQUFPLEVBQUU7WUFDakMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CO1lBQzVDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDakMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CO1NBQ3pELENBQUMsQ0FBQztRQUVILElBQUksbURBQXdCLENBQUMsT0FBTyxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUN6QyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQzlCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUN6QixtQkFBbUIsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoRUQsa0RBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcbmltcG9ydCB7IEFwaUNvbnN0cnVjdEZpbGUgfSBmcm9tICcuL0FwaUNvbnN0cnVjdEZpbGUnO1xuaW1wb3J0IHsgQXBpRnVuY3Rpb25GaWxlIH0gZnJvbSAnLi9BcGlGdW5jdGlvbkZpbGUnO1xuaW1wb3J0IHsgQmFzZUFwcGxpY2F0aW9uU3RhY2tGaWxlIH0gZnJvbSAnLi9CYXNlQXBwbGljYXRpb25TdGFja0ZpbGUnO1xuaW1wb3J0IHsgQm9vdGNhbXBBcHBsaWNhdGlvblN0YWNrRmlsZSB9IGZyb20gJy4vQm9vdGNhbXBBcHBsaWNhdGlvblN0YWNrRmlsZSc7XG5pbXBvcnQgeyBDb2RlUmFiYml0RmlsZSB9IGZyb20gJy4vQ29kZVJhYmJpdEZpbGUnO1xuaW1wb3J0IHsgR2l0SHViUm9sZXNTdGFja0ZpbGUgfSBmcm9tICcuL0dpdEh1YlJvbGVzU3RhY2tGaWxlJztcbmltcG9ydCB7IExvY2FsRGV2QXBwRmlsZSB9IGZyb20gJy4vTG9jYWxEZXZBcHBGaWxlJztcbmltcG9ydCB7IEVudmlyb25tZW50Q29uZmlnLCBNYWluRmlsZSB9IGZyb20gJy4vTWFpbkZpbGUnO1xuaW1wb3J0IHsgTWFpblRlc3RGaWxlIH0gZnJvbSAnLi9NYWluVGVzdEZpbGUnO1xuaW1wb3J0IHsgUHJDbGVhbnVwV29ya2Zsb3cgfSBmcm9tICcuL1ByQ2xlYW51cFdvcmtmbG93JztcbmltcG9ydCB7IFByRGVwbG95V29ya2Zsb3cgfSBmcm9tICcuL1ByRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93IH0gZnJvbSAnLi9Qcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhZ2luZ0RlcGxveVdvcmtmbG93IH0gZnJvbSAnLi9TdGFnaW5nRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUgfSBmcm9tICcuL1N0YXRpY1dlYnNpdGVDb25zdHJ1Y3RGaWxlJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkVudmlyb25tZW50Q29uZmlnIGV4dGVuZHMgRW52aXJvbm1lbnRDb25maWcge1xuICByZWFkb25seSBnaXRodWJBY3Rpb25Sb2xlQXJuOiBgYXJuOmF3czppYW06OiR7c3RyaW5nfTpyb2xlLyR7c3RyaW5nfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25PcHRpb25zIHtcbiAgcmVhZG9ubHkgZ2l0aHViUmVwb3NpdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBkZXY6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IHByb2Q6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IGNsZXJrUHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgYWRkaXRpb25hbFRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEFwcGxpY2F0aW9uIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYWxsIHN0YW5kYXJkIHByb2plY3QgZmlsZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEJvb3RjYW1wQXBwbGljYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwLCBvcHRpb25zOiBBcHBsaWNhdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBDcmVhdGUgbWFpbiBlbnRyeSBwb2ludCBmaWxlc1xuXG4gICAgbmV3IE1haW5GaWxlKHByb2plY3QsIHtcbiAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG4gICAgICBkZXY6IG9wdGlvbnMuZGV2LFxuICAgICAgc3RhZ2luZzogb3B0aW9ucy5zdGFnaW5nLFxuICAgICAgcHJvZDogb3B0aW9ucy5wcm9kLFxuICAgICAgYWRkaXRpb25hbFRhZ3M6IG9wdGlvbnMuYWRkaXRpb25hbFRhZ3MsXG4gICAgfSk7XG5cbiAgICBuZXcgTG9jYWxEZXZBcHBGaWxlKHByb2plY3QsIHtcbiAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG4gICAgICBkZXY6IG9wdGlvbnMuZGV2LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrIGZpbGVzXG4gICAgbmV3IEdpdEh1YlJvbGVzU3RhY2tGaWxlKHByb2plY3QsIHtcbiAgICAgIGdpdGh1YlJlcG9zaXRvcnk6IG9wdGlvbnMuZ2l0aHViUmVwb3NpdG9yeSxcbiAgICB9KTtcblxuICAgIG5ldyBCYXNlQXBwbGljYXRpb25TdGFja0ZpbGUocHJvamVjdCk7XG4gICAgbmV3IEJvb3RjYW1wQXBwbGljYXRpb25TdGFja0ZpbGUocHJvamVjdCk7XG5cbiAgICAvLyBDcmVhdGUgY29uc3RydWN0IGZpbGVzXG4gICAgbmV3IEFwaUNvbnN0cnVjdEZpbGUocHJvamVjdCk7XG4gICAgbmV3IFN0YXRpY1dlYnNpdGVDb25zdHJ1Y3RGaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZXIgZmlsZXNcbiAgICBuZXcgQXBpRnVuY3Rpb25GaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIHRlc3QgZmlsZXNcbiAgICBuZXcgTWFpblRlc3RGaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIGNvbmZpZyBmaWxlc1xuICAgIG5ldyBDb2RlUmFiYml0RmlsZShwcm9qZWN0KTtcblxuICAgIC8vIENyZWF0ZSBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3NcbiAgICBuZXcgUHJEZXBsb3lXb3JrZmxvdyhwcm9qZWN0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLmRldi5naXRodWJBY3Rpb25Sb2xlQXJuLFxuICAgICAgYXdzUmVnaW9uOiBvcHRpb25zLmRldi5yZWdpb24sXG4gICAgICBjbGVya1B1Ymxpc2hhYmxlS2V5OiBvcHRpb25zLmNsZXJrUHVibGlzaGFibGVLZXksXG4gICAgfSk7XG5cbiAgICBuZXcgUHJDbGVhbnVwV29ya2Zsb3cocHJvamVjdCwge1xuICAgICAgcm9sZUFybjogb3B0aW9ucy5kZXYuZ2l0aHViQWN0aW9uUm9sZUFybixcbiAgICAgIGF3c1JlZ2lvbjogb3B0aW9ucy5kZXYucmVnaW9uLFxuICAgIH0pO1xuXG4gICAgbmV3IFN0YWdpbmdEZXBsb3lXb3JrZmxvdyhwcm9qZWN0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnN0YWdpbmcuZ2l0aHViQWN0aW9uUm9sZUFybixcbiAgICAgIGF3c1JlZ2lvbjogb3B0aW9ucy5zdGFnaW5nLnJlZ2lvbixcbiAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG4gICAgICBjbGVya1B1Ymxpc2hhYmxlS2V5OiBvcHRpb25zLnN0YWdpbmcuY2xlcmtQdWJsaXNoYWJsZUtleSxcbiAgICB9KTtcblxuICAgIG5ldyBQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cocHJvamVjdCwge1xuICAgICAgcm9sZUFybjogb3B0aW9ucy5wcm9kLmdpdGh1YkFjdGlvblJvbGVBcm4sXG4gICAgICBhd3NSZWdpb246IG9wdGlvbnMucHJvZC5yZWdpb24sXG4gICAgICBwcm9qZWN0TmFtZTogcHJvamVjdC5uYW1lLFxuICAgICAgY2xlcmtQdWJsaXNoYWJsZUtleTogb3B0aW9ucy5wcm9kLmNsZXJrUHVibGlzaGFibGVLZXksXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export declare class BootcampApplicationStackFile extends SampleFile {
4
+ constructor(project: AwsCdkTypeScriptApp);
5
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BootcampApplicationStackFile = void 0;
4
+ const projen_1 = require("projen");
5
+ class BootcampApplicationStackFile extends projen_1.SampleFile {
6
+ constructor(project) {
7
+ super(project, 'src/stacks/ApplicationStack.ts', {
8
+ contents: `import { Arn, ArnFormat, Fn, Stack } from 'aws-cdk-lib';
9
+ import { SecurityGroup, SubnetType, Vpc } from 'aws-cdk-lib/aws-ec2';
10
+ import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';
11
+ import { DatabaseInstance } from 'aws-cdk-lib/aws-rds';
12
+ import { Secret } from 'aws-cdk-lib/aws-secretsmanager';
13
+ import { Database, Provider, Role } from 'cdk-rds-sql';
14
+ import { Construct } from 'constructs';
15
+ import { BaseApplicationStack, BaseApplicationStackProps } from './BaseApplicationStack';
16
+
17
+ export interface ApplicationStackProps extends BaseApplicationStackProps {
18
+ readonly database: {
19
+ proxyEndpoint: string;
20
+ rootSecretArn: \`arn:aws:secretsmanager:\${string}:\${string}:secret:\${string}-\${string}-\${string}\`;
21
+ instanceIdentifier: string;
22
+ port: number;
23
+ databaseEndpointAddress: string;
24
+ securityGroup: \`sg-\${string}\`;
25
+ };
26
+ readonly vpcId: string;
27
+ }
28
+
29
+ export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps> {
30
+ constructor(scope: Construct, id: string, props: ApplicationStackProps) {
31
+ super(scope, id, props);
32
+ // extend the stack by adding constructs here
33
+ this.createDatabase();
34
+ }
35
+
36
+ protected createVpc() {
37
+ this.vpc = Vpc.fromLookup(this, 'Vpc', {
38
+ vpcId: this.props.vpcId,
39
+ });
40
+ }
41
+ protected createDatabase() {
42
+
43
+ const databaseSecurityGroup = SecurityGroup.fromSecurityGroupId(this, 'DatabaseSecurityGroup', this.props.database.securityGroup);
44
+
45
+ const database = DatabaseInstance.fromDatabaseInstanceAttributes(this, 'Database', {
46
+ instanceEndpointAddress: this.props.database.databaseEndpointAddress,
47
+ port: this.props.database.port,
48
+ securityGroups: [databaseSecurityGroup],
49
+ instanceIdentifier: this.props.database.instanceIdentifier,
50
+
51
+ });
52
+
53
+ const secret = Secret.fromSecretCompleteArn(this, 'DatabaseRootSecret', this.props.database.rootSecretArn);
54
+
55
+ const provider = new Provider(this, 'Provider', {
56
+ vpc: this.vpc,
57
+ cluster: database,
58
+ secret: secret,
59
+ vpcSubnets: {
60
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS,
61
+ },
62
+ logger: true,
63
+ });
64
+
65
+ const sqlDatabase = new Database(this, '${project.name}-db', {
66
+ databaseName: '${project.name}',
67
+ provider: provider,
68
+ });
69
+
70
+ const role = new Role(this, 'Role', {
71
+ provider: provider,
72
+ roleName: '${project.name}',
73
+ databaseName: '${project.name}',
74
+ enableIamAuth: true,
75
+ });
76
+ role.node.addDependency(sqlDatabase);
77
+
78
+
79
+ // Add environment variables pointing to the proxy endpoint
80
+ this.api.lambdaFunction.addEnvironment('DB_ENDPOINT', this.props.database.proxyEndpoint);
81
+ this.api.lambdaFunction.addEnvironment('DB_USER', '${project.name}');
82
+ this.api.lambdaFunction.addEnvironment('DB_PORT', this.props.database.port.toString());
83
+
84
+ // Grant Lambda IAM auth to connect through the proxy
85
+ this.api.lambdaFunction.addToRolePolicy(new PolicyStatement({
86
+ actions: ['rds-db:connect'],
87
+ resources: [Arn.format({
88
+ account: Stack.of(this).account,
89
+ region: Stack.of(this).region,
90
+ service: 'rds-db',
91
+ resource: 'dbuser',
92
+ partition: 'aws',
93
+ arnFormat: ArnFormat.COLON_RESOURCE_NAME,
94
+ resourceName: \`\${Fn.importValue('BootcampDbProxyId')}/${project.name}\`,
95
+ })],
96
+ effect: Effect.ALLOW,
97
+ }));
98
+ }
99
+ }
100
+ `,
101
+ });
102
+ }
103
+ }
104
+ exports.BootcampApplicationStackFile = BootcampApplicationStackFile;
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBBcHBsaWNhdGlvblN0YWNrRmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb290Y2FtcEFwcGxpY2F0aW9uU3RhY2tGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUdwQyxNQUFhLDRCQUE2QixTQUFRLG1CQUFVO0lBQzFELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtZQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0F5RDhCLE9BQU8sQ0FBQyxJQUFJO3VCQUNuQyxPQUFPLENBQUMsSUFBSTs7Ozs7O21CQU1oQixPQUFPLENBQUMsSUFBSTt1QkFDUixPQUFPLENBQUMsSUFBSTs7Ozs7Ozs7eURBUXNCLE9BQU8sQ0FBQyxJQUFJOzs7Ozs7Ozs7Ozs7O2tFQWFILE9BQU8sQ0FBQyxJQUFJOzs7Ozs7Q0FNN0U7U0FDSSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFsR0Qsb0VBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgY2xhc3MgQm9vdGNhbXBBcHBsaWNhdGlvblN0YWNrRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ3NyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgQXJuLCBBcm5Gb3JtYXQsIEZuLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAsIFN1Ym5ldFR5cGUsIFZwYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IERhdGFiYXNlSW5zdGFuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtcmRzJztcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBEYXRhYmFzZSwgUHJvdmlkZXIsIFJvbGUgfSBmcm9tICdjZGstcmRzLXNxbCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJhc2VBcHBsaWNhdGlvblN0YWNrLCBCYXNlQXBwbGljYXRpb25TdGFja1Byb3BzIH0gZnJvbSAnLi9CYXNlQXBwbGljYXRpb25TdGFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25TdGFja1Byb3BzIGV4dGVuZHMgQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcyB7XG4gIHJlYWRvbmx5IGRhdGFiYXNlOiB7XG4gICAgcHJveHlFbmRwb2ludDogc3RyaW5nO1xuICAgIHJvb3RTZWNyZXRBcm46IFxcYGFybjphd3M6c2VjcmV0c21hbmFnZXI6XFwke3N0cmluZ306XFwke3N0cmluZ306c2VjcmV0OlxcJHtzdHJpbmd9LVxcJHtzdHJpbmd9LVxcJHtzdHJpbmd9XFxgO1xuICAgIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBkYXRhYmFzZUVuZHBvaW50QWRkcmVzczogc3RyaW5nO1xuICAgIHNlY3VyaXR5R3JvdXA6IFxcYHNnLVxcJHtzdHJpbmd9XFxgO1xuICB9O1xuICByZWFkb25seSB2cGNJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25TdGFjayBleHRlbmRzIEJhc2VBcHBsaWNhdGlvblN0YWNrPEFwcGxpY2F0aW9uU3RhY2tQcm9wcz4ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXBwbGljYXRpb25TdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gZXh0ZW5kIHRoZSBzdGFjayBieSBhZGRpbmcgY29uc3RydWN0cyBoZXJlXG4gICAgdGhpcy5jcmVhdGVEYXRhYmFzZSgpO1xuICB9XG4gIFxuICBwcm90ZWN0ZWQgY3JlYXRlVnBjKCkge1xuICAgIHRoaXMudnBjID0gVnBjLmZyb21Mb29rdXAodGhpcywgJ1ZwYycsIHtcbiAgICAgIHZwY0lkOiB0aGlzLnByb3BzLnZwY0lkLFxuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVEYXRhYmFzZSgpIHtcblxuICAgIGNvbnN0IGRhdGFiYXNlU2VjdXJpdHlHcm91cCA9IFNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZCh0aGlzLCAnRGF0YWJhc2VTZWN1cml0eUdyb3VwJywgdGhpcy5wcm9wcy5kYXRhYmFzZS5zZWN1cml0eUdyb3VwKTtcblxuICAgIGNvbnN0IGRhdGFiYXNlID0gRGF0YWJhc2VJbnN0YW5jZS5mcm9tRGF0YWJhc2VJbnN0YW5jZUF0dHJpYnV0ZXModGhpcywgJ0RhdGFiYXNlJywge1xuICAgICAgaW5zdGFuY2VFbmRwb2ludEFkZHJlc3M6IHRoaXMucHJvcHMuZGF0YWJhc2UuZGF0YWJhc2VFbmRwb2ludEFkZHJlc3MsXG4gICAgICBwb3J0OiB0aGlzLnByb3BzLmRhdGFiYXNlLnBvcnQsXG4gICAgICBzZWN1cml0eUdyb3VwczogW2RhdGFiYXNlU2VjdXJpdHlHcm91cF0sXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHRoaXMucHJvcHMuZGF0YWJhc2UuaW5zdGFuY2VJZGVudGlmaWVyLFxuXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldENvbXBsZXRlQXJuKHRoaXMsICdEYXRhYmFzZVJvb3RTZWNyZXQnLCB0aGlzLnByb3BzLmRhdGFiYXNlLnJvb3RTZWNyZXRBcm4pO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGNsdXN0ZXI6IGRhdGFiYXNlLFxuICAgICAgc2VjcmV0OiBzZWNyZXQsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyxcbiAgICAgIH0sXG4gICAgICBsb2dnZXI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzcWxEYXRhYmFzZSA9IG5ldyBEYXRhYmFzZSh0aGlzLCAnJHtwcm9qZWN0Lm5hbWV9LWRiJywge1xuICAgICAgZGF0YWJhc2VOYW1lOiAnJHtwcm9qZWN0Lm5hbWV9JyxcbiAgICAgIHByb3ZpZGVyOiBwcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnUm9sZScsIHtcbiAgICAgIHByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgIHJvbGVOYW1lOiAnJHtwcm9qZWN0Lm5hbWV9JyxcbiAgICAgIGRhdGFiYXNlTmFtZTogJyR7cHJvamVjdC5uYW1lfScsXG4gICAgICBlbmFibGVJYW1BdXRoOiB0cnVlLFxuICAgIH0pO1xuICAgIHJvbGUubm9kZS5hZGREZXBlbmRlbmN5KHNxbERhdGFiYXNlKTtcblxuXG4gICAgLy8gQWRkIGVudmlyb25tZW50IHZhcmlhYmxlcyBwb2ludGluZyB0byB0aGUgcHJveHkgZW5kcG9pbnRcbiAgICB0aGlzLmFwaS5sYW1iZGFGdW5jdGlvbi5hZGRFbnZpcm9ubWVudCgnREJfRU5EUE9JTlQnLCB0aGlzLnByb3BzLmRhdGFiYXNlLnByb3h5RW5kcG9pbnQpO1xuICAgIHRoaXMuYXBpLmxhbWJkYUZ1bmN0aW9uLmFkZEVudmlyb25tZW50KCdEQl9VU0VSJywgJyR7cHJvamVjdC5uYW1lfScpO1xuICAgIHRoaXMuYXBpLmxhbWJkYUZ1bmN0aW9uLmFkZEVudmlyb25tZW50KCdEQl9QT1JUJywgdGhpcy5wcm9wcy5kYXRhYmFzZS5wb3J0LnRvU3RyaW5nKCkpO1xuXG4gICAgLy8gR3JhbnQgTGFtYmRhIElBTSBhdXRoIHRvIGNvbm5lY3QgdGhyb3VnaCB0aGUgcHJveHlcbiAgICB0aGlzLmFwaS5sYW1iZGFGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ3Jkcy1kYjpjb25uZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtBcm4uZm9ybWF0KHtcbiAgICAgICAgYWNjb3VudDogU3RhY2sub2YodGhpcykuYWNjb3VudCxcbiAgICAgICAgcmVnaW9uOiBTdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICAgIHNlcnZpY2U6ICdyZHMtZGInLFxuICAgICAgICByZXNvdXJjZTogJ2RidXNlcicsXG4gICAgICAgIHBhcnRpdGlvbjogJ2F3cycsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgIHJlc291cmNlTmFtZTogXFxgXFwke0ZuLmltcG9ydFZhbHVlKCdCb290Y2FtcERiUHJveHlJZCcpfS8ke3Byb2plY3QubmFtZX1cXGAsXG4gICAgICB9KV0sXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICB9KSk7XG4gIH1cbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { AwsCdkTypeScriptApp, AwsCdkTypeScriptAppOptions } from 'projen/lib/awscdk';
2
+ import { ApplicationEnvironmentConfig } from './Application';
3
+ export interface BootcampProjectOptions extends AwsCdkTypeScriptAppOptions {
4
+ /**
5
+ * Development environment configuration
6
+ */
7
+ readonly dev: ApplicationEnvironmentConfig;
8
+ /**
9
+ * Development environment configuration
10
+ */
11
+ readonly staging: ApplicationEnvironmentConfig;
12
+ /**
13
+ * Production environment configuration
14
+ */
15
+ readonly prod: ApplicationEnvironmentConfig;
16
+ /**
17
+ * Additional tags to apply to all stacks
18
+ */
19
+ readonly additionalTags?: {
20
+ [key: string]: string;
21
+ };
22
+ /**
23
+ * Additional code owners to add to the CODEOWNERS file
24
+ */
25
+ readonly additionalCodeOwners?: string[];
26
+ }
27
+ export declare class BootcampProject extends AwsCdkTypeScriptApp {
28
+ constructor(options: BootcampProjectOptions);
29
+ }
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BootcampProject = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const awscdk_1 = require("projen/lib/awscdk");
7
+ const github_1 = require("projen/lib/github");
8
+ const BootcampApplication_1 = require("./BootcampApplication");
9
+ const CodeOwnersFile_1 = require("./CodeOwnersFile");
10
+ const DataDogAspectFile_1 = require("./DataDogAspectFile");
11
+ const GitHubRolesFile_1 = require("./GitHubRolesFile");
12
+ const ViteReactProject_1 = require("./ViteReactProject");
13
+ class BootcampProject extends awscdk_1.AwsCdkTypeScriptApp {
14
+ constructor(options) {
15
+ super({
16
+ ...options,
17
+ cdkVersion: options.cdkVersion || '2.224.0',
18
+ defaultReleaseBranch: options.defaultReleaseBranch || 'main',
19
+ name: options.name,
20
+ projenrcTs: true,
21
+ buildWorkflow: false,
22
+ deps: [
23
+ '@types/aws-lambda',
24
+ '@types/express',
25
+ '@types/pg',
26
+ 'pg',
27
+ '@aws-sdk/rds-signer',
28
+ '@matthewbonig/secret',
29
+ 'datadog-cdk-constructs-v2',
30
+ '@cdklabs/aws-lambda-rust',
31
+ '@aws-lambda-powertools/parameters',
32
+ 'jsonwebtoken',
33
+ '@aws-sdk/client-secrets-manager',
34
+ 'express',
35
+ 'serverless-http',
36
+ 'cdk-rds-sql',
37
+ ...options.deps || [],
38
+ ],
39
+ devDeps: [
40
+ '@types/jsonwebtoken',
41
+ 'nodemon',
42
+ 'concurrently',
43
+ '@macedon-technologies/batman@^1.0.0',
44
+ ...options.devDeps || [],
45
+ ],
46
+ gitignore: [
47
+ 'src/constructs/handler/clerk-authorizer/target/**',
48
+ '**/.DS_Store',
49
+ ...options.gitignore || [],
50
+ ],
51
+ tsconfig: {
52
+ ...options.tsconfig,
53
+ compilerOptions: {
54
+ ...options.tsconfig?.compilerOptions,
55
+ isolatedModules: true,
56
+ allowImportingTsExtensions: true,
57
+ },
58
+ },
59
+ sampleCode: false,
60
+ minNodeVersion: options.minNodeVersion || '22',
61
+ depsUpgradeOptions: {
62
+ workflowOptions: {
63
+ projenCredentials: github_1.GithubCredentials.fromPersonalAccessToken({
64
+ secret: 'GITHUB_TOKEN',
65
+ }),
66
+ },
67
+ },
68
+ readme: {
69
+ contents: [
70
+ `# ${options.name}`,
71
+ '',
72
+ 'This project was bootstrapped with [Batman](https://github.com/macedon-technologies/platform-common).',
73
+ '',
74
+ '## What Batman Created',
75
+ '',
76
+ '### CDK Infrastructure (`src/`)',
77
+ '',
78
+ '| File | Description |',
79
+ '|------|-------------|',
80
+ '| `src/main.ts` | CDK app entry point — instantiates dev, staging, and prod `ApplicationStack`s |',
81
+ '| `src/LocalDevApp.ts` | Local development CDK app — used by `yarn cdk:dev` |',
82
+ '| `src/GitHubRoles.ts` | CDK app for deploying the GitHub OIDC IAM role (one-time bootstrap) |',
83
+ '| `src/stacks/ApplicationStack.ts` | Your primary stack — extend it to add resources |',
84
+ '| `src/stacks/BaseApplicationStack.ts` | Base stack with VPC, API, static website, Datadog, and Route 53 wired up |',
85
+ '| `src/stacks/GitHubRolesStack.ts` | IAM role stack for GitHub Actions OIDC authentication |',
86
+ '| `src/constructs/Api.ts` | API Gateway + Lambda construct with Clerk JWT authorizer |',
87
+ '| `src/constructs/StaticWebsite.ts` | CloudFront + S3 + ACM + Route 53 construct |',
88
+ '| `src/constructs/handler/Api.Function.ts` | Lambda handler entry point |',
89
+ '| `src/aspects/DataDogAspect.ts` | CDK aspect that wires all Lambda functions to Datadog |',
90
+ '',
91
+ '### Frontend (`web/`)',
92
+ '',
93
+ '| File | Description |',
94
+ '|------|-------------|',
95
+ '| `web/src/main.tsx` | React app entry point with Clerk and React Query providers |',
96
+ '| `web/src/App.tsx` | Root application component |',
97
+ '| `web/src/App.css` / `web/src/index.css` | Base stylesheets (Tailwind CSS v4) |',
98
+ '| `web/src/config.ts` | `useConfig()` hook — loads runtime config from `config.json` |',
99
+ '| `web/src/services/BaseService.ts` | `useBaseQuery()` — authenticated API fetch hook |',
100
+ '| `web/src/services/RootService.ts` | Example service using `useBaseQuery` |',
101
+ '| `web/public/config.json` | Runtime config (API base URL, Clerk publishable key) |',
102
+ '',
103
+ '### GitHub Actions Workflows (`.github/workflows/`)',
104
+ '',
105
+ '| File | Trigger |',
106
+ '|------|---------|',
107
+ '| `pr-deploy.yml` | On pull request open/update — deploys a per-PR dev stack |',
108
+ '| `pr-cleanup.yml` | On pull request close — tears down the per-PR dev stack |',
109
+ '| `staging-deploy.yml` | On push to `main` — deploys to staging |',
110
+ '| `production-deploy.yml` | Manually triggered — deploys to production |',
111
+ '',
112
+ '---',
113
+ '',
114
+ '## Files You Can Edit',
115
+ '',
116
+ 'These files are generated once and never overwritten by Batman. Modify them freely.',
117
+ '',
118
+ '| File | What to do with it |',
119
+ '|------|--------------------|',
120
+ '| `src/stacks/ApplicationStack.ts` | **Start here.** Add CDK constructs to build your infrastructure |',
121
+ '| `src/constructs/Api.ts` | Extend the API — add Lambda integrations, routes, or override methods |',
122
+ '| `src/constructs/StaticWebsite.ts` | Customize CloudFront behaviors, S3 settings, or deployment options |',
123
+ '| `src/constructs/handler/Api.Function.ts` | Implement your Lambda handler logic |',
124
+ '| `src/stacks/GitHubRolesStack.ts` | Add IAM permissions needed by GitHub Actions |',
125
+ '| `src/main.ts` | Adjust stack instantiation or add additional stacks |',
126
+ '| `web/src/App.tsx` | Build your UI here |',
127
+ '| `web/src/App.css` / `web/src/index.css` | Style your application |',
128
+ '| `web/src/main.tsx` | Adjust top-level providers or routing |',
129
+ '| `web/src/services/RootService.ts` | Add or replace API service hooks |',
130
+ '| `web/public/config.json` | Update for local development (API URL, Clerk key) |',
131
+ '',
132
+ '## Files You Cannot Edit',
133
+ '',
134
+ 'These files are **managed by Batman** and will be overwritten every time `npx projen` runs. Do not edit them directly — make changes in `.projenrc.ts` instead.',
135
+ '',
136
+ '> [!IMPORTANT]',
137
+ '> If you have ANY changes you want to make to these files, notify #team-batman on Slack. ',
138
+ '> We maintain these files as part of the core Batman experience, and your feedback is crucial to ensure they meet your needs.',
139
+ '',
140
+ '| File | Why it\'s managed |',
141
+ '|------|-----------------|',
142
+ '| `src/stacks/BaseApplicationStack.ts` | Core stack wiring — updated with Batman releases |',
143
+ '| `src/aspects/DataDogAspect.ts` | Datadog CDK aspect |',
144
+ '| `web/vite.config.ts` | Vite configuration |',
145
+ '| `web/eslint.config.js` | ESLint configuration |',
146
+ '| `web/postcss.config.js` | PostCSS / Tailwind configuration |',
147
+ '| `web/index.html` | HTML entry point |',
148
+ '| `web/tsconfig.json` / `web/tsconfig.app.json` / `web/tsconfig.node.json` | TypeScript configuration |',
149
+ '| `web/src/vite-env.d.ts` | Vite type declarations |',
150
+ '| `web/src/config.ts` | Runtime config hook — shape driven by `.projenrc.ts` |',
151
+ '| `web/src/services/BaseService.ts` | Base authenticated fetch hook |',
152
+ '| `.github/CODEOWNERS` | Code ownership policy |',
153
+ '| `.github/workflows/*.yml` | All CI/CD workflows |',
154
+ '',
155
+ '> **Tip:** Files with a `~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen". ~~` header are managed files.',
156
+ '',
157
+ '---',
158
+ '',
159
+ '## Where to Start',
160
+ '',
161
+ '1. **`src/stacks/ApplicationStack.ts`** — Add your CDK constructs here. The base stack already provides `this.api`, `this.vpc`, `this.hostedZone`, and `this.datadog` as protected properties.',
162
+ '',
163
+ '2. **`web/`** — Build your frontend. Start with `web/src/App.tsx` and add services alongside `web/src/services/RootService.ts`.',
164
+ '',
165
+ '3. **`src/constructs/handler/Api.Function.ts`** — Implement your backend Lambda handler logic here.',
166
+ '',
167
+ '---',
168
+ '',
169
+ '## Development Workflow',
170
+ '',
171
+ '```bash',
172
+ '# Install dependencies',
173
+ 'yarn install',
174
+ '',
175
+ '# Start local dev server (backend Lambda + Vite frontend in parallel)',
176
+ 'yarn dev',
177
+ '',
178
+ '# Deploy a personal dev stack to AWS',
179
+ 'yarn cdk:dev --context local-dev-prefix=your-handle deploy',
180
+ '',
181
+ '# Run tests',
182
+ 'yarn test',
183
+ '',
184
+ '# Re-synthesize project files after editing .projenrc.ts',
185
+ 'npx projen',
186
+ '```',
187
+ '',
188
+ '---',
189
+ '',
190
+ '## Upgrading Batman',
191
+ '',
192
+ '```bash',
193
+ 'yarn add @macedon-technologies/batman@latest',
194
+ 'npx projen',
195
+ '```',
196
+ '',
197
+ 'This updates all managed files to the latest Batman standards. Your editable sample files are never touched.',
198
+ ].join('\n'),
199
+ },
200
+ });
201
+ // Create standard project files
202
+ const PRIMARY_ACCOUNT = '015955817263';
203
+ const PRIMARY_REGION = 'us-east-1';
204
+ new BootcampApplication_1.BootcampApplication(this, {
205
+ githubRepository: `macedon-technologies/${options.name}`,
206
+ clerkPublishableKey: 'pk_test_aW50ZW5zZS1sZWVjaC0yMi5jbGVyay5hY2NvdW50cy5kZXYk',
207
+ dev: {
208
+ ...options.dev,
209
+ },
210
+ staging: {
211
+ ...options.staging,
212
+ },
213
+ prod: {
214
+ ...options.dev,
215
+ },
216
+ additionalTags: options.additionalTags,
217
+ });
218
+ new GitHubRolesFile_1.GitHubRolesFile(this, {
219
+ account: PRIMARY_ACCOUNT,
220
+ primaryRegion: PRIMARY_REGION,
221
+ });
222
+ new CodeOwnersFile_1.CodeOwnersFile(this, {
223
+ additionalOwners: options.additionalCodeOwners,
224
+ });
225
+ new DataDogAspectFile_1.DataDogAspectFile(this);
226
+ const viteReact = new ViteReactProject_1.ViteReactProject({
227
+ name: 'web',
228
+ defaultReleaseBranch: 'main',
229
+ parent: this,
230
+ outdir: 'web',
231
+ });
232
+ viteReact.addConfigField('something', 'number');
233
+ viteReact.addConfigField('somethingElse', 'string');
234
+ const concurrently = (...args) => {
235
+ return `concurrently ${args.map(a => `"${a}"`).join(' ')}`;
236
+ };
237
+ this.addTask('dev', {
238
+ exec: concurrently('nodemon --watch ./src/constructs/handler --watch ./local/dev.ts ./local/dev.ts', viteReact.devCommand),
239
+ });
240
+ this.addTask('cdk:dev', {
241
+ exec: 'yarn cdk -a "npx ts-node -P tsconfig.json --prefer-ts-exts src/LocalDevApp.ts"',
242
+ receiveArgs: true,
243
+ });
244
+ }
245
+ }
246
+ exports.BootcampProject = BootcampProject;
247
+ _a = JSII_RTTI_SYMBOL_1;
248
+ BootcampProject[_a] = { fqn: "@macedon-technologies/batman.BootcampProject", version: "1.9.0" };
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBQcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Jvb3RjYW1wUHJvamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhDQUFvRjtBQUNwRiw4Q0FBc0Q7QUFFdEQsK0RBQTREO0FBQzVELHFEQUFrRDtBQUNsRCwyREFBd0Q7QUFDeEQsdURBQW9EO0FBQ3BELHlEQUFzRDtBQStCdEQsTUFBYSxlQUFnQixTQUFRLDRCQUFtQjtJQUN0RCxZQUFZLE9BQStCO1FBQ3pDLEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxJQUFJLFNBQVM7WUFDM0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixJQUFJLE1BQU07WUFDNUQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLElBQUksRUFBRTtnQkFDSixtQkFBbUI7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsV0FBVztnQkFDWCxJQUFJO2dCQUNKLHFCQUFxQjtnQkFDckIsc0JBQXNCO2dCQUN0QiwyQkFBMkI7Z0JBQzNCLDBCQUEwQjtnQkFDMUIsbUNBQW1DO2dCQUNuQyxjQUFjO2dCQUNkLGlDQUFpQztnQkFDakMsU0FBUztnQkFDVCxpQkFBaUI7Z0JBQ2pCLGFBQWE7Z0JBQ2IsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUU7YUFDdEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AscUJBQXFCO2dCQUNyQixTQUFTO2dCQUNULGNBQWM7Z0JBQ2QscUNBQXFDO2dCQUNyQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRTthQUN6QjtZQUNELFNBQVMsRUFBRTtnQkFDVCxtREFBbUQ7Z0JBQ25ELGNBQWM7Z0JBQ2QsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7YUFDM0I7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxPQUFPLENBQUMsUUFBUTtnQkFDbkIsZUFBZSxFQUFFO29CQUNmLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxlQUFlO29CQUNwQyxlQUFlLEVBQUUsSUFBSTtvQkFDckIsMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRjtZQUNELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUk7WUFDOUMsa0JBQWtCLEVBQUU7Z0JBQ2xCLGVBQWUsRUFBRTtvQkFDZixpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDM0QsTUFBTSxFQUFFLGNBQWM7cUJBQ3ZCLENBQUM7aUJBQ0g7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixRQUFRLEVBQUU7b0JBQ1IsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFO29CQUNuQixFQUFFO29CQUNGLHVHQUF1RztvQkFDdkcsRUFBRTtvQkFDRix3QkFBd0I7b0JBQ3hCLEVBQUU7b0JBQ0YsaUNBQWlDO29CQUNqQyxFQUFFO29CQUNGLHdCQUF3QjtvQkFDeEIsd0JBQXdCO29CQUN4QixtR0FBbUc7b0JBQ25HLCtFQUErRTtvQkFDL0UsZ0dBQWdHO29CQUNoRyx3RkFBd0Y7b0JBQ3hGLHFIQUFxSDtvQkFDckgsOEZBQThGO29CQUM5Rix3RkFBd0Y7b0JBQ3hGLG9GQUFvRjtvQkFDcEYsMkVBQTJFO29CQUMzRSw0RkFBNEY7b0JBQzVGLEVBQUU7b0JBQ0YsdUJBQXVCO29CQUN2QixFQUFFO29CQUNGLHdCQUF3QjtvQkFDeEIsd0JBQXdCO29CQUN4QixxRkFBcUY7b0JBQ3JGLG9EQUFvRDtvQkFDcEQsa0ZBQWtGO29CQUNsRix3RkFBd0Y7b0JBQ3hGLHlGQUF5RjtvQkFDekYsOEVBQThFO29CQUM5RSxxRkFBcUY7b0JBQ3JGLEVBQUU7b0JBQ0YscURBQXFEO29CQUNyRCxFQUFFO29CQUNGLG9CQUFvQjtvQkFDcEIsb0JBQW9CO29CQUNwQixnRkFBZ0Y7b0JBQ2hGLGdGQUFnRjtvQkFDaEYsbUVBQW1FO29CQUNuRSwwRUFBMEU7b0JBQzFFLEVBQUU7b0JBQ0YsS0FBSztvQkFDTCxFQUFFO29CQUNGLHVCQUF1QjtvQkFDdkIsRUFBRTtvQkFDRixxRkFBcUY7b0JBQ3JGLEVBQUU7b0JBQ0YsK0JBQStCO29CQUMvQiwrQkFBK0I7b0JBQy9CLHdHQUF3RztvQkFDeEcscUdBQXFHO29CQUNyRyw0R0FBNEc7b0JBQzVHLG9GQUFvRjtvQkFDcEYscUZBQXFGO29CQUNyRix5RUFBeUU7b0JBQ3pFLDRDQUE0QztvQkFDNUMsc0VBQXNFO29CQUN0RSxnRUFBZ0U7b0JBQ2hFLDBFQUEwRTtvQkFDMUUsa0ZBQWtGO29CQUNsRixFQUFFO29CQUNGLDBCQUEwQjtvQkFDMUIsRUFBRTtvQkFDRixpS0FBaUs7b0JBQ2pLLEVBQUU7b0JBQ0YsZ0JBQWdCO29CQUNoQiwyRkFBMkY7b0JBQzNGLCtIQUErSDtvQkFDL0gsRUFBRTtvQkFDRiw4QkFBOEI7b0JBQzlCLDRCQUE0QjtvQkFDNUIsNkZBQTZGO29CQUM3Rix5REFBeUQ7b0JBQ3pELCtDQUErQztvQkFDL0MsbURBQW1EO29CQUNuRCxnRUFBZ0U7b0JBQ2hFLHlDQUF5QztvQkFDekMseUdBQXlHO29CQUN6RyxzREFBc0Q7b0JBQ3RELGdGQUFnRjtvQkFDaEYsdUVBQXVFO29CQUN2RSxrREFBa0Q7b0JBQ2xELHFEQUFxRDtvQkFDckQsRUFBRTtvQkFDRixtSUFBbUk7b0JBQ25JLEVBQUU7b0JBQ0YsS0FBSztvQkFDTCxFQUFFO29CQUNGLG1CQUFtQjtvQkFDbkIsRUFBRTtvQkFDRixnTUFBZ007b0JBQ2hNLEVBQUU7b0JBQ0YsaUlBQWlJO29CQUNqSSxFQUFFO29CQUNGLHFHQUFxRztvQkFDckcsRUFBRTtvQkFDRixLQUFLO29CQUNMLEVBQUU7b0JBQ0YseUJBQXlCO29CQUN6QixFQUFFO29CQUNGLFNBQVM7b0JBQ1Qsd0JBQXdCO29CQUN4QixjQUFjO29CQUNkLEVBQUU7b0JBQ0YsdUVBQXVFO29CQUN2RSxVQUFVO29CQUNWLEVBQUU7b0JBQ0Ysc0NBQXNDO29CQUN0Qyw0REFBNEQ7b0JBQzVELEVBQUU7b0JBQ0YsYUFBYTtvQkFDYixXQUFXO29CQUNYLEVBQUU7b0JBQ0YsMERBQTBEO29CQUMxRCxZQUFZO29CQUNaLEtBQUs7b0JBQ0wsRUFBRTtvQkFDRixLQUFLO29CQUNMLEVBQUU7b0JBQ0YscUJBQXFCO29CQUNyQixFQUFFO29CQUNGLFNBQVM7b0JBQ1QsOENBQThDO29CQUM5QyxZQUFZO29CQUNaLEtBQUs7b0JBQ0wsRUFBRTtvQkFDRiw4R0FBOEc7aUJBQy9HLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNiO1NBQ0YsQ0FBQyxDQUFDO1FBR0gsZ0NBQWdDO1FBQ2hDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN2QyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFFbkMsSUFBSSx5Q0FBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDNUIsZ0JBQWdCLEVBQUUsd0JBQXdCLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDeEQsbUJBQW1CLEVBQUUsMERBQTBEO1lBQy9FLEdBQUcsRUFBRTtnQkFDSCxHQUFHLE9BQU8sQ0FBQyxHQUFHO2FBQ2Y7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxPQUFPLENBQUMsT0FBTzthQUNuQjtZQUNELElBQUksRUFBRTtnQkFDSixHQUFHLE9BQU8sQ0FBQyxHQUFHO2FBQ2Y7WUFDRCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7U0FDdkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxpQ0FBZSxDQUFDLElBQUksRUFBRTtZQUN4QixPQUFPLEVBQUUsZUFBZTtZQUN4QixhQUFhLEVBQUUsY0FBYztTQUM5QixDQUFDLENBQUM7UUFFSCxJQUFJLCtCQUFjLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixNQUFNLFNBQVMsR0FBRyxJQUFJLG1DQUFnQixDQUFDO1lBQ3JDLElBQUksRUFBRSxLQUFLO1lBQ1gsb0JBQW9CLEVBQUUsTUFBTTtZQUM1QixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFcEQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQWMsRUFBRSxFQUFFO1lBQ3pDLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDbEIsSUFBSSxFQUFFLFlBQVksQ0FDaEIsZ0ZBQWdGLEVBQ2hGLFNBQVMsQ0FBQyxVQUFVLENBQ3JCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxFQUFFLGdGQUFnRjtZQUN0RixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7SUFHTCxDQUFDOztBQXRQSCwwQ0F1UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwLCBBd3NDZGtUeXBlU2NyaXB0QXBwT3B0aW9ucyB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcbmltcG9ydCB7IEdpdGh1YkNyZWRlbnRpYWxzIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWInO1xuaW1wb3J0IHsgQXBwbGljYXRpb25FbnZpcm9ubWVudENvbmZpZyB9IGZyb20gJy4vQXBwbGljYXRpb24nO1xuaW1wb3J0IHsgQm9vdGNhbXBBcHBsaWNhdGlvbiB9IGZyb20gJy4vQm9vdGNhbXBBcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb2RlT3duZXJzRmlsZSB9IGZyb20gJy4vQ29kZU93bmVyc0ZpbGUnO1xuaW1wb3J0IHsgRGF0YURvZ0FzcGVjdEZpbGUgfSBmcm9tICcuL0RhdGFEb2dBc3BlY3RGaWxlJztcbmltcG9ydCB7IEdpdEh1YlJvbGVzRmlsZSB9IGZyb20gJy4vR2l0SHViUm9sZXNGaWxlJztcbmltcG9ydCB7IFZpdGVSZWFjdFByb2plY3QgfSBmcm9tICcuL1ZpdGVSZWFjdFByb2plY3QnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdGNhbXBQcm9qZWN0T3B0aW9ucyBleHRlbmRzIEF3c0Nka1R5cGVTY3JpcHRBcHBPcHRpb25zIHtcblxuICAvKipcbiAgICogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGV2OiBBcHBsaWNhdGlvbkVudmlyb25tZW50Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nOiBBcHBsaWNhdGlvbkVudmlyb25tZW50Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBQcm9kdWN0aW9uIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByb2Q6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgdGFncyB0byBhcHBseSB0byBhbGwgc3RhY2tzXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsVGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgY29kZSBvd25lcnMgdG8gYWRkIHRvIHRoZSBDT0RFT1dORVJTIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDb2RlT3duZXJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBCb290Y2FtcFByb2plY3QgZXh0ZW5kcyBBd3NDZGtUeXBlU2NyaXB0QXBwIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQm9vdGNhbXBQcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjZGtWZXJzaW9uOiBvcHRpb25zLmNka1ZlcnNpb24gfHwgJzIuMjI0LjAnLFxuICAgICAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IG9wdGlvbnMuZGVmYXVsdFJlbGVhc2VCcmFuY2ggfHwgJ21haW4nLFxuICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgcHJvamVucmNUczogdHJ1ZSxcbiAgICAgIGJ1aWxkV29ya2Zsb3c6IGZhbHNlLFxuICAgICAgZGVwczogW1xuICAgICAgICAnQHR5cGVzL2F3cy1sYW1iZGEnLFxuICAgICAgICAnQHR5cGVzL2V4cHJlc3MnLFxuICAgICAgICAnQHR5cGVzL3BnJyxcbiAgICAgICAgJ3BnJyxcbiAgICAgICAgJ0Bhd3Mtc2RrL3Jkcy1zaWduZXInLFxuICAgICAgICAnQG1hdHRoZXdib25pZy9zZWNyZXQnLFxuICAgICAgICAnZGF0YWRvZy1jZGstY29uc3RydWN0cy12MicsXG4gICAgICAgICdAY2RrbGFicy9hd3MtbGFtYmRhLXJ1c3QnLFxuICAgICAgICAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9wYXJhbWV0ZXJzJyxcbiAgICAgICAgJ2pzb253ZWJ0b2tlbicsXG4gICAgICAgICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJyxcbiAgICAgICAgJ2V4cHJlc3MnLFxuICAgICAgICAnc2VydmVybGVzcy1odHRwJyxcbiAgICAgICAgJ2Nkay1yZHMtc3FsJyxcbiAgICAgICAgLi4ub3B0aW9ucy5kZXBzIHx8IFtdLFxuICAgICAgXSxcbiAgICAgIGRldkRlcHM6IFtcbiAgICAgICAgJ0B0eXBlcy9qc29ud2VidG9rZW4nLFxuICAgICAgICAnbm9kZW1vbicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAnQG1hY2Vkb24tdGVjaG5vbG9naWVzL2JhdG1hbkBeMS4wLjAnLFxuICAgICAgICAuLi5vcHRpb25zLmRldkRlcHMgfHwgW10sXG4gICAgICBdLFxuICAgICAgZ2l0aWdub3JlOiBbXG4gICAgICAgICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL2NsZXJrLWF1dGhvcml6ZXIvdGFyZ2V0LyoqJyxcbiAgICAgICAgJyoqLy5EU19TdG9yZScsXG4gICAgICAgIC4uLm9wdGlvbnMuZ2l0aWdub3JlIHx8IFtdLFxuICAgICAgXSxcbiAgICAgIHRzY29uZmlnOiB7XG4gICAgICAgIC4uLm9wdGlvbnMudHNjb25maWcsXG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIC4uLm9wdGlvbnMudHNjb25maWc/LmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgICBpc29sYXRlZE1vZHVsZXM6IHRydWUsXG4gICAgICAgICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2FtcGxlQ29kZTogZmFsc2UsXG4gICAgICBtaW5Ob2RlVmVyc2lvbjogb3B0aW9ucy5taW5Ob2RlVmVyc2lvbiB8fCAnMjInLFxuICAgICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93T3B0aW9uczoge1xuICAgICAgICAgIHByb2plbkNyZWRlbnRpYWxzOiBHaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7XG4gICAgICAgICAgICBzZWNyZXQ6ICdHSVRIVUJfVE9LRU4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlYWRtZToge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIGAjICR7b3B0aW9ucy5uYW1lfWAsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1RoaXMgcHJvamVjdCB3YXMgYm9vdHN0cmFwcGVkIHdpdGggW0JhdG1hbl0oaHR0cHM6Ly9naXRodWIuY29tL21hY2Vkb24tdGVjaG5vbG9naWVzL3BsYXRmb3JtLWNvbW1vbikuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgV2hhdCBCYXRtYW4gQ3JlYXRlZCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIyBDREsgSW5mcmFzdHJ1Y3R1cmUgKGBzcmMvYCknLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAgICAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgICAgICAgJ3wgYHNyYy9tYWluLnRzYCB8IENESyBhcHAgZW50cnkgcG9pbnQg4oCUIGluc3RhbnRpYXRlcyBkZXYsIHN0YWdpbmcsIGFuZCBwcm9kIGBBcHBsaWNhdGlvblN0YWNrYHMgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9Mb2NhbERldkFwcC50c2AgfCBMb2NhbCBkZXZlbG9wbWVudCBDREsgYXBwIOKAlCB1c2VkIGJ5IGB5YXJuIGNkazpkZXZgIHwnLFxuICAgICAgICAgICd8IGBzcmMvR2l0SHViUm9sZXMudHNgIHwgQ0RLIGFwcCBmb3IgZGVwbG95aW5nIHRoZSBHaXRIdWIgT0lEQyBJQU0gcm9sZSAob25lLXRpbWUgYm9vdHN0cmFwKSB8JyxcbiAgICAgICAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8IFlvdXIgcHJpbWFyeSBzdGFjayDigJQgZXh0ZW5kIGl0IHRvIGFkZCByZXNvdXJjZXMgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQmFzZSBzdGFjayB3aXRoIFZQQywgQVBJLCBzdGF0aWMgd2Vic2l0ZSwgRGF0YWRvZywgYW5kIFJvdXRlIDUzIHdpcmVkIHVwIHwnLFxuICAgICAgICAgICd8IGBzcmMvc3RhY2tzL0dpdEh1YlJvbGVzU3RhY2sudHNgIHwgSUFNIHJvbGUgc3RhY2sgZm9yIEdpdEh1YiBBY3Rpb25zIE9JREMgYXV0aGVudGljYXRpb24gfCcsXG4gICAgICAgICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL0FwaS50c2AgfCBBUEkgR2F0ZXdheSArIExhbWJkYSBjb25zdHJ1Y3Qgd2l0aCBDbGVyayBKV1QgYXV0aG9yaXplciB8JyxcbiAgICAgICAgICAnfCBgc3JjL2NvbnN0cnVjdHMvU3RhdGljV2Vic2l0ZS50c2AgfCBDbG91ZEZyb250ICsgUzMgKyBBQ00gKyBSb3V0ZSA1MyBjb25zdHJ1Y3QgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvQXBpLkZ1bmN0aW9uLnRzYCB8IExhbWJkYSBoYW5kbGVyIGVudHJ5IHBvaW50IHwnLFxuICAgICAgICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IENESyBhc3BlY3QgdGhhdCB3aXJlcyBhbGwgTGFtYmRhIGZ1bmN0aW9ucyB0byBEYXRhZG9nIHwnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyMgRnJvbnRlbmQgKGB3ZWIvYCknLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAgICAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvbWFpbi50c3hgIHwgUmVhY3QgYXBwIGVudHJ5IHBvaW50IHdpdGggQ2xlcmsgYW5kIFJlYWN0IFF1ZXJ5IHByb3ZpZGVycyB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IFJvb3QgYXBwbGljYXRpb24gY29tcG9uZW50IHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL0FwcC5jc3NgIC8gYHdlYi9zcmMvaW5kZXguY3NzYCB8IEJhc2Ugc3R5bGVzaGVldHMgKFRhaWx3aW5kIENTUyB2NCkgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IGB1c2VDb25maWcoKWAgaG9vayDigJQgbG9hZHMgcnVudGltZSBjb25maWcgZnJvbSBgY29uZmlnLmpzb25gIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL0Jhc2VTZXJ2aWNlLnRzYCB8IGB1c2VCYXNlUXVlcnkoKWAg4oCUIGF1dGhlbnRpY2F0ZWQgQVBJIGZldGNoIGhvb2sgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvUm9vdFNlcnZpY2UudHNgIHwgRXhhbXBsZSBzZXJ2aWNlIHVzaW5nIGB1c2VCYXNlUXVlcnlgIHwnLFxuICAgICAgICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFJ1bnRpbWUgY29uZmlnIChBUEkgYmFzZSBVUkwsIENsZXJrIHB1Ymxpc2hhYmxlIGtleSkgfCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIyBHaXRIdWIgQWN0aW9ucyBXb3JrZmxvd3MgKGAuZ2l0aHViL3dvcmtmbG93cy9gKScsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ3wgRmlsZSB8IFRyaWdnZXIgfCcsXG4gICAgICAgICAgJ3wtLS0tLS18LS0tLS0tLS0tfCcsXG4gICAgICAgICAgJ3wgYHByLWRlcGxveS55bWxgIHwgT24gcHVsbCByZXF1ZXN0IG9wZW4vdXBkYXRlIOKAlCBkZXBsb3lzIGEgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAgICAgICAnfCBgcHItY2xlYW51cC55bWxgIHwgT24gcHVsbCByZXF1ZXN0IGNsb3NlIOKAlCB0ZWFycyBkb3duIHRoZSBwZXItUFIgZGV2IHN0YWNrIHwnLFxuICAgICAgICAgICd8IGBzdGFnaW5nLWRlcGxveS55bWxgIHwgT24gcHVzaCB0byBgbWFpbmAg4oCUIGRlcGxveXMgdG8gc3RhZ2luZyB8JyxcbiAgICAgICAgICAnfCBgcHJvZHVjdGlvbi1kZXBsb3kueW1sYCB8IE1hbnVhbGx5IHRyaWdnZXJlZCDigJQgZGVwbG95cyB0byBwcm9kdWN0aW9uIHwnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICctLS0nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBGaWxlcyBZb3UgQ2FuIEVkaXQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdUaGVzZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIG9uY2UgYW5kIG5ldmVyIG92ZXJ3cml0dGVuIGJ5IEJhdG1hbi4gTW9kaWZ5IHRoZW0gZnJlZWx5LicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ3wgRmlsZSB8IFdoYXQgdG8gZG8gd2l0aCBpdCB8JyxcbiAgICAgICAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwnLFxuICAgICAgICAgICd8IGBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgIHwgKipTdGFydCBoZXJlLioqIEFkZCBDREsgY29uc3RydWN0cyB0byBidWlsZCB5b3VyIGluZnJhc3RydWN0dXJlIHwnLFxuICAgICAgICAgICd8IGBzcmMvY29uc3RydWN0cy9BcGkudHNgIHwgRXh0ZW5kIHRoZSBBUEkg4oCUIGFkZCBMYW1iZGEgaW50ZWdyYXRpb25zLCByb3V0ZXMsIG9yIG92ZXJyaWRlIG1ldGhvZHMgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL1N0YXRpY1dlYnNpdGUudHNgIHwgQ3VzdG9taXplIENsb3VkRnJvbnQgYmVoYXZpb3JzLCBTMyBzZXR0aW5ncywgb3IgZGVwbG95bWVudCBvcHRpb25zIHwnLFxuICAgICAgICAgICd8IGBzcmMvY29uc3RydWN0cy9oYW5kbGVyL0FwaS5GdW5jdGlvbi50c2AgfCBJbXBsZW1lbnQgeW91ciBMYW1iZGEgaGFuZGxlciBsb2dpYyB8JyxcbiAgICAgICAgICAnfCBgc3JjL3N0YWNrcy9HaXRIdWJSb2xlc1N0YWNrLnRzYCB8IEFkZCBJQU0gcGVybWlzc2lvbnMgbmVlZGVkIGJ5IEdpdEh1YiBBY3Rpb25zIHwnLFxuICAgICAgICAgICd8IGBzcmMvbWFpbi50c2AgfCBBZGp1c3Qgc3RhY2sgaW5zdGFudGlhdGlvbiBvciBhZGQgYWRkaXRpb25hbCBzdGFja3MgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBCdWlsZCB5b3VyIFVJIGhlcmUgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvQXBwLmNzc2AgLyBgd2ViL3NyYy9pbmRleC5jc3NgIHwgU3R5bGUgeW91ciBhcHBsaWNhdGlvbiB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9tYWluLnRzeGAgfCBBZGp1c3QgdG9wLWxldmVsIHByb3ZpZGVycyBvciByb3V0aW5nIHwnLFxuICAgICAgICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYCB8IEFkZCBvciByZXBsYWNlIEFQSSBzZXJ2aWNlIGhvb2tzIHwnLFxuICAgICAgICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFVwZGF0ZSBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKEFQSSBVUkwsIENsZXJrIGtleSkgfCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIEZpbGVzIFlvdSBDYW5ub3QgRWRpdCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1RoZXNlIGZpbGVzIGFyZSAqKm1hbmFnZWQgYnkgQmF0bWFuKiogYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZXZlcnkgdGltZSBgbnB4IHByb2plbmAgcnVucy4gRG8gbm90IGVkaXQgdGhlbSBkaXJlY3RseSDigJQgbWFrZSBjaGFuZ2VzIGluIGAucHJvamVucmMudHNgIGluc3RlYWQuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnPiBbIUlNUE9SVEFOVF0nLFxuICAgICAgICAgICc+IElmIHlvdSBoYXZlIEFOWSBjaGFuZ2VzIHlvdSB3YW50IHRvIG1ha2UgdG8gdGhlc2UgZmlsZXMsIG5vdGlmeSAjdGVhbS1iYXRtYW4gb24gU2xhY2suICcsXG4gICAgICAgICAgJz4gV2UgbWFpbnRhaW4gdGhlc2UgZmlsZXMgYXMgcGFydCBvZiB0aGUgY29yZSBCYXRtYW4gZXhwZXJpZW5jZSwgYW5kIHlvdXIgZmVlZGJhY2sgaXMgY3J1Y2lhbCB0byBlbnN1cmUgdGhleSBtZWV0IHlvdXIgbmVlZHMuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnfCBGaWxlIHwgV2h5IGl0XFwncyBtYW5hZ2VkIHwnLFxuICAgICAgICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCcsXG4gICAgICAgICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQ29yZSBzdGFjayB3aXJpbmcg4oCUIHVwZGF0ZWQgd2l0aCBCYXRtYW4gcmVsZWFzZXMgfCcsXG4gICAgICAgICAgJ3wgYHNyYy9hc3BlY3RzL0RhdGFEb2dBc3BlY3QudHNgIHwgRGF0YWRvZyBDREsgYXNwZWN0IHwnLFxuICAgICAgICAgICd8IGB3ZWIvdml0ZS5jb25maWcudHNgIHwgVml0ZSBjb25maWd1cmF0aW9uIHwnLFxuICAgICAgICAgICd8IGB3ZWIvZXNsaW50LmNvbmZpZy5qc2AgfCBFU0xpbnQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAgICAgICAnfCBgd2ViL3Bvc3Rjc3MuY29uZmlnLmpzYCB8IFBvc3RDU1MgLyBUYWlsd2luZCBjb25maWd1cmF0aW9uIHwnLFxuICAgICAgICAgICd8IGB3ZWIvaW5kZXguaHRtbGAgfCBIVE1MIGVudHJ5IHBvaW50IHwnLFxuICAgICAgICAgICd8IGB3ZWIvdHNjb25maWcuanNvbmAgLyBgd2ViL3RzY29uZmlnLmFwcC5qc29uYCAvIGB3ZWIvdHNjb25maWcubm9kZS5qc29uYCB8IFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy92aXRlLWVudi5kLnRzYCB8IFZpdGUgdHlwZSBkZWNsYXJhdGlvbnMgfCcsXG4gICAgICAgICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IFJ1bnRpbWUgY29uZmlnIGhvb2sg4oCUIHNoYXBlIGRyaXZlbiBieSBgLnByb2plbnJjLnRzYCB8JyxcbiAgICAgICAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AgfCBCYXNlIGF1dGhlbnRpY2F0ZWQgZmV0Y2ggaG9vayB8JyxcbiAgICAgICAgICAnfCBgLmdpdGh1Yi9DT0RFT1dORVJTYCB8IENvZGUgb3duZXJzaGlwIHBvbGljeSB8JyxcbiAgICAgICAgICAnfCBgLmdpdGh1Yi93b3JrZmxvd3MvKi55bWxgIHwgQWxsIENJL0NEIHdvcmtmbG93cyB8JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnPiAqKlRpcDoqKiBGaWxlcyB3aXRoIGEgYH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi4gfn5gIGhlYWRlciBhcmUgbWFuYWdlZCBmaWxlcy4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICctLS0nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBXaGVyZSB0byBTdGFydCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJzEuICoqYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AqKiDigJQgQWRkIHlvdXIgQ0RLIGNvbnN0cnVjdHMgaGVyZS4gVGhlIGJhc2Ugc3RhY2sgYWxyZWFkeSBwcm92aWRlcyBgdGhpcy5hcGlgLCBgdGhpcy52cGNgLCBgdGhpcy5ob3N0ZWRab25lYCwgYW5kIGB0aGlzLmRhdGFkb2dgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvUm9vdFNlcnZpY2UudHNgLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJzMuICoqYHNyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvQXBpLkZ1bmN0aW9uLnRzYCoqIOKAlCBJbXBsZW1lbnQgeW91ciBiYWNrZW5kIExhbWJkYSBoYW5kbGVyIGxvZ2ljIGhlcmUuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnLS0tJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRGV2ZWxvcG1lbnQgV29ya2Zsb3cnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdgYGBiYXNoJyxcbiAgICAgICAgICAnIyBJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgJ3lhcm4gaW5zdGFsbCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMgU3RhcnQgbG9jYWwgZGV2IHNlcnZlciAoYmFja2VuZCBMYW1iZGEgKyBWaXRlIGZyb250ZW5kIGluIHBhcmFsbGVsKScsXG4gICAgICAgICAgJ3lhcm4gZGV2JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyBEZXBsb3kgYSBwZXJzb25hbCBkZXYgc3RhY2sgdG8gQVdTJyxcbiAgICAgICAgICAneWFybiBjZGs6ZGV2IC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PXlvdXItaGFuZGxlIGRlcGxveScsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMgUnVuIHRlc3RzJyxcbiAgICAgICAgICAneWFybiB0ZXN0JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyBSZS1zeW50aGVzaXplIHByb2plY3QgZmlsZXMgYWZ0ZXIgZWRpdGluZyAucHJvamVucmMudHMnLFxuICAgICAgICAgICducHggcHJvamVuJyxcbiAgICAgICAgICAnYGBgJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnLS0tJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgVXBncmFkaW5nIEJhdG1hbicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2BgYGJhc2gnLFxuICAgICAgICAgICd5YXJuIGFkZCBAbWFjZWRvbi10ZWNobm9sb2dpZXMvYmF0bWFuQGxhdGVzdCcsXG4gICAgICAgICAgJ25weCBwcm9qZW4nLFxuICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdUaGlzIHVwZGF0ZXMgYWxsIG1hbmFnZWQgZmlsZXMgdG8gdGhlIGxhdGVzdCBCYXRtYW4gc3RhbmRhcmRzLiBZb3VyIGVkaXRhYmxlIHNhbXBsZSBmaWxlcyBhcmUgbmV2ZXIgdG91Y2hlZC4nLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICB9KTtcblxuXG4gICAgLy8gQ3JlYXRlIHN0YW5kYXJkIHByb2plY3QgZmlsZXNcbiAgICBjb25zdCBQUklNQVJZX0FDQ09VTlQgPSAnMDE1OTU1ODE3MjYzJztcbiAgICBjb25zdCBQUklNQVJZX1JFR0lPTiA9ICd1cy1lYXN0LTEnO1xuXG4gICAgbmV3IEJvb3RjYW1wQXBwbGljYXRpb24odGhpcywge1xuICAgICAgZ2l0aHViUmVwb3NpdG9yeTogYG1hY2Vkb24tdGVjaG5vbG9naWVzLyR7b3B0aW9ucy5uYW1lfWAsXG4gICAgICBjbGVya1B1Ymxpc2hhYmxlS2V5OiAncGtfdGVzdF9hVzUwWlc1elpTMXNaV1ZqYUMweU1pNWpiR1Z5YXk1aFkyTnZkVzUwY3k1a1pYWWsnLFxuICAgICAgZGV2OiB7XG4gICAgICAgIC4uLm9wdGlvbnMuZGV2LFxuICAgICAgfSxcbiAgICAgIHN0YWdpbmc6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5zdGFnaW5nLFxuICAgICAgfSxcbiAgICAgIHByb2Q6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5kZXYsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFRhZ3M6IG9wdGlvbnMuYWRkaXRpb25hbFRhZ3MsXG4gICAgfSk7XG5cbiAgICBuZXcgR2l0SHViUm9sZXNGaWxlKHRoaXMsIHtcbiAgICAgIGFjY291bnQ6IFBSSU1BUllfQUNDT1VOVCxcbiAgICAgIHByaW1hcnlSZWdpb246IFBSSU1BUllfUkVHSU9OLFxuICAgIH0pO1xuXG4gICAgbmV3IENvZGVPd25lcnNGaWxlKHRoaXMsIHtcbiAgICAgIGFkZGl0aW9uYWxPd25lcnM6IG9wdGlvbnMuYWRkaXRpb25hbENvZGVPd25lcnMsXG4gICAgfSk7XG5cbiAgICBuZXcgRGF0YURvZ0FzcGVjdEZpbGUodGhpcyk7XG5cbiAgICBjb25zdCB2aXRlUmVhY3QgPSBuZXcgVml0ZVJlYWN0UHJvamVjdCh7XG4gICAgICBuYW1lOiAnd2ViJyxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiAnbWFpbicsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBvdXRkaXI6ICd3ZWInLFxuICAgIH0pO1xuICAgIHZpdGVSZWFjdC5hZGRDb25maWdGaWVsZCgnc29tZXRoaW5nJywgJ251bWJlcicpO1xuICAgIHZpdGVSZWFjdC5hZGRDb25maWdGaWVsZCgnc29tZXRoaW5nRWxzZScsICdzdHJpbmcnKTtcblxuICAgIGNvbnN0IGNvbmN1cnJlbnRseSA9ICguLi5hcmdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgcmV0dXJuIGBjb25jdXJyZW50bHkgJHthcmdzLm1hcChhID0+IGBcIiR7YX1cImApLmpvaW4oJyAnKX1gO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZFRhc2soJ2RldicsIHtcbiAgICAgIGV4ZWM6IGNvbmN1cnJlbnRseShcbiAgICAgICAgJ25vZGVtb24gLS13YXRjaCAuL3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIgLS13YXRjaCAuL2xvY2FsL2Rldi50cyAuL2xvY2FsL2Rldi50cycsXG4gICAgICAgIHZpdGVSZWFjdC5kZXZDb21tYW5kLFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkVGFzaygnY2RrOmRldicsIHtcbiAgICAgIGV4ZWM6ICd5YXJuIGNkayAtYSBcIm5weCB0cy1ub2RlIC1QIHRzY29uZmlnLmpzb24gLS1wcmVmZXItdHMtZXh0cyBzcmMvTG9jYWxEZXZBcHAudHNcIicsXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICB9KTtcblxuXG4gIH1cbn1cbiJdfQ==
@@ -16,5 +16,5 @@ class CodeOwnersFile extends projen_1.TextFile {
16
16
  }
17
17
  exports.CodeOwnersFile = CodeOwnersFile;
18
18
  _a = JSII_RTTI_SYMBOL_1;
19
- CodeOwnersFile[_a] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.8.0" };
19
+ CodeOwnersFile[_a] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.9.0" };
20
20
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZU93bmVyc0ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ29kZU93bmVyc0ZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBa0M7QUFPbEMsTUFBYSxjQUFlLFNBQVEsaUJBQVE7SUFDMUMsWUFBWSxPQUE0QixFQUFFLFVBQWlDLEVBQUU7UUFDM0UsTUFBTSxhQUFhLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzNELE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxhQUFhLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUU7WUFDbkMsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDOztBQVRILHdDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlT3duZXJzRmlsZU9wdGlvbnMge1xuICByZWFkb25seSBhZGRpdGlvbmFsT3duZXJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDb2RlT3duZXJzRmlsZSBleHRlbmRzIFRleHRGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogQ29kZU93bmVyc0ZpbGVPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0T3duZXJzID0gWycqIEBtYWNlZG9uLXRlY2hub2xvZ2llcy9wbGF0Zm9ybSddO1xuICAgIGNvbnN0IGFsbE93bmVycyA9IFsuLi5kZWZhdWx0T3duZXJzLCAuLi4ob3B0aW9ucy5hZGRpdGlvbmFsT3duZXJzIHx8IFtdKV07XG5cbiAgICBzdXBlcihwcm9qZWN0LCAnLmdpdGh1Yi9DT0RFT1dORVJTJywge1xuICAgICAgbGluZXM6IGFsbE93bmVycyxcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuIl19