UNPKG

@softchef/cdk-iot-device-management

Version:

IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.

265 lines 31.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ThingGroupApi = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const path = require("path"); const cdk_restapi_1 = require("@softchef/cdk-restapi"); const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs"); const constructs_1 = require("constructs"); const LAMBDA_ASSETS_PATH = path.resolve(__dirname, '../lambda-assets/thing-groups'); /** * Thing Group API construct. * * @stability stable */ class ThingGroupApi extends constructs_1.Construct { /** * @stability stable */ constructor(scope, id, props) { var _b, _c; super(scope, id); this._restApi = new cdk_restapi_1.RestApi(this, 'ThingGroupRestApi', { enableCors: true, authorizationType: (_b = props === null || props === void 0 ? void 0 : props.authorizationType) !== null && _b !== void 0 ? _b : aws_apigateway_1.AuthorizationType.NONE, authorizer: (_c = props === null || props === void 0 ? void 0 : props.authorizer) !== null && _c !== void 0 ? _c : undefined, resources: [ { path: '/thing-groups', httpMethod: cdk_restapi_1.HttpMethod.POST, lambdaFunction: this.createCreateThingGroupFunction(), }, { path: '/thing-groups', httpMethod: cdk_restapi_1.HttpMethod.GET, lambdaFunction: this.createListThingGroupsFunction(), }, { path: '/thing-groups/{thingGroupName}', httpMethod: cdk_restapi_1.HttpMethod.GET, lambdaFunction: this.createGetThingGroupFunction(), }, { path: '/thing-groups/{thingGroupName}', httpMethod: cdk_restapi_1.HttpMethod.PUT, lambdaFunction: this.createUpdateThingGroupFunction(), }, { path: '/thing-groups/{thingGroupName}', httpMethod: cdk_restapi_1.HttpMethod.DELETE, lambdaFunction: this.createDeleteThingGroupFunction(), }, { path: '/thing-groups/{thingGroupName}/things/{thingName}', httpMethod: cdk_restapi_1.HttpMethod.PUT, lambdaFunction: this.createAddThingToThingGroupFunction(), }, { path: '/thing-groups/{thingGroupName}/things/{thingName}', httpMethod: cdk_restapi_1.HttpMethod.DELETE, lambdaFunction: this.createRemoveThingFromThingGroupFunction(), }, { path: '/dynamic-thing-groups', httpMethod: cdk_restapi_1.HttpMethod.POST, lambdaFunction: this.createCreateDynamicThingGroupFunction(), }, { path: '/dynamic-thing-groups/{thingGroupName}', httpMethod: cdk_restapi_1.HttpMethod.PUT, lambdaFunction: this.createUpdateDynamicThingGroupFunction(), }, { path: '/dynamic-thing-groups/{thingGroupName}', httpMethod: cdk_restapi_1.HttpMethod.DELETE, lambdaFunction: this.createDeleteDynamicThingGroupFunction(), }, ], }); } /** * Thing Group API API ID. * * @stability stable */ get restApiId() { return this._restApi.restApiId; } createCreateThingGroupFunction() { var _b; const createThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'CreateThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/create-thing-group/app.ts`, }); (_b = createThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-create-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:CreateThingGroup', ], resources: ['*'], }), ], })); return createThingGroupFunction; } createListThingGroupsFunction() { var _b; const listThingGroupsFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'ListThingGroupsFunction', { entry: `${LAMBDA_ASSETS_PATH}/list-thing-groups/app.ts`, }); (_b = listThingGroupsFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-list-things-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:ListThingGroups', ], resources: ['*'], }), ], })); return listThingGroupsFunction; } createGetThingGroupFunction() { var _b; const getThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'GetThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/get-thing-group/app.ts`, }); (_b = getThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-describe-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:DescribeThingGroup', ], resources: ['*'], }), ], })); return getThingGroupFunction; } createUpdateThingGroupFunction() { var _b; const updateThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/update-thing-group/app.ts`, }); (_b = updateThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:UpdateThingGroup', ], resources: ['*'], }), ], })); return updateThingGroupFunction; } createDeleteThingGroupFunction() { var _b; const deleteThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/delete-thing-group/app.ts`, }); (_b = deleteThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:DeleteThingGroup', ], resources: ['*'], }), ], })); return deleteThingGroupFunction; } createAddThingToThingGroupFunction() { var _b; const addThingToThingGroup = new aws_lambda_nodejs_1.NodejsFunction(this, 'AddThingToThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/add-thing-to-thing-group/app.ts`, }); (_b = addThingToThingGroup.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-add-thing-to-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:AddThingToThingGroup', ], resources: ['*'], }), ], })); return addThingToThingGroup; } createRemoveThingFromThingGroupFunction() { var _b; const removeThingFromThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'RemoveThingFromThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/remove-thing-from-thing-group/app.ts`, }); (_b = removeThingFromThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-remove-thing-from-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:RemoveThingFromThingGroup', ], resources: ['*'], }), ], })); return removeThingFromThingGroupFunction; } createCreateDynamicThingGroupFunction() { var _b; const createDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'CreateDynamicThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/create-dynamic-thing-group/app.ts`, }); (_b = createDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-create-dynamic-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:CreateDynamicThingGroup', ], resources: ['*'], }), ], })); return createDynamicThingGroupFunction; } createUpdateDynamicThingGroupFunction() { var _b; const updateDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateDynamicThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/update-dynamic-thing-group/app.ts`, }); (_b = updateDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-dynamic-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:UpdateDynamicThingGroup', ], resources: ['*'], }), ], })); return updateDynamicThingGroupFunction; } createDeleteDynamicThingGroupFunction() { var _b; const deleteDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteDynamicThingGroupFunction', { entry: `${LAMBDA_ASSETS_PATH}/delete-dynamic-thing-group/app.ts`, }); (_b = deleteDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-dynamic-thing-group-policy', { statements: [ new aws_iam_1.PolicyStatement({ actions: [ 'iot:DeleteDynamicThingGroup', ], resources: ['*'], }), ], })); return deleteDynamicThingGroupFunction; } } exports.ThingGroupApi = ThingGroupApi; _a = JSII_RTTI_SYMBOL_1; ThingGroupApi[_a] = { fqn: "@softchef/cdk-iot-device-management.ThingGroupApi", version: "2.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpbmctZ3JvdXAtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RoaW5nLWdyb3VwLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3Qix1REFHK0I7QUFDL0IsK0RBR29DO0FBQ3BDLGlEQUc2QjtBQUM3QixxRUFFdUM7QUFDdkMsMkNBRW9CO0FBRXBCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsK0JBQStCLENBQUMsQ0FBQzs7Ozs7O0FBV3BGLE1BQWEsYUFBYyxTQUFRLHNCQUFTOzs7O0lBTTFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7O1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFCQUFPLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3JELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGlCQUFpQixRQUFFLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxpQkFBaUIsbUNBQUksa0NBQWlCLENBQUMsSUFBSTtZQUNyRSxVQUFVLFFBQUUsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFVBQVUsbUNBQUksU0FBUztZQUMxQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLElBQUk7b0JBQzNCLGNBQWMsRUFBRSxJQUFJLENBQUMsOEJBQThCLEVBQUU7aUJBQ3REO2dCQUNEO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixVQUFVLEVBQUUsd0JBQVUsQ0FBQyxHQUFHO29CQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFO2lCQUNyRDtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZ0NBQWdDO29CQUN0QyxVQUFVLEVBQUUsd0JBQVUsQ0FBQyxH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QUksZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsdUNBQXVDLEVBQUU7WUFDeEQsVUFBVSxFQUFFO2dCQUNWLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLDZCQUE2QjtxQkFDOUI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0g7U0FDRixDQUFDLEVBQ0Y7UUFDRixPQUFPLCtCQUErQixDQUFDO0lBQ3pDLENBQUM7O0FBcFFILHNDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBSZXN0QXBpLFxuICBIdHRwTWV0aG9kLFxufSBmcm9tICdAc29mdGNoZWYvY2RrLXJlc3RhcGknO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIElBdXRob3JpemVyLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQge1xuICBQb2xpY3ksXG4gIFBvbGljeVN0YXRlbWVudCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBOb2RlanNGdW5jdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0LFxufSBmcm9tICdjb25zdHJ1Y3RzJztcblxuY29uc3QgTEFNQkRBX0FTU0VUU19QQVRIID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL2xhbWJkYS1hc3NldHMvdGhpbmctZ3JvdXBzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIFRoaW5nR3JvdXBBcGlQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb25UeXBlPzogQXV0aG9yaXphdGlvblR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVGhpbmdHcm91cEFwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgVGhpbmcgR3JvdXAgQVBJIEdhdGV3YXlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3RBcGk6IFJlc3RBcGk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBUaGluZ0dyb3VwQXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuX3Jlc3RBcGkgPSBuZXcgUmVzdEFwaSh0aGlzLCAnVGhpbmdHcm91cFJlc3RBcGknLCB7XG4gICAgICBlbmFibGVDb3JzOiB0cnVlLFxuICAgICAgYXV0aG9yaXphdGlvblR5cGU6IHByb3BzPy5hdXRob3JpemF0aW9uVHlwZSA/PyBBdXRob3JpemF0aW9uVHlwZS5OT05FLFxuICAgICAgYXV0aG9yaXplcjogcHJvcHM/LmF1dGhvcml6ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3VwcycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMnLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVHZXRUaGluZ0dyb3VwRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmctZ3JvdXBzL3t0aGluZ0dyb3VwTmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuUFVULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZVVwZGF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlRGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9L3RoaW5ncy97dGhpbmdOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlQWRkVGhpbmdUb1RoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfS90aGluZ3Mve3RoaW5nTmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZVJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy9keW5hbWljLXRoaW5nLWdyb3VwcycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUNyZWF0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvZHluYW1pYy10aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlVXBkYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy9keW5hbWljLXRoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVEZWxldGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBnZXQgcmVzdEFwaUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3RBcGkucmVzdEFwaUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDcmVhdGVUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnQ3JlYXRlVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vY3JlYXRlLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgY3JlYXRlVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1jcmVhdGUtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6Q3JlYXRlVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTGlzdFRoaW5nR3JvdXBzRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdMaXN0VGhpbmdHcm91cHNGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2xpc3QtdGhpbmctZ3JvdXBzL2FwcC50c2AsXG4gICAgfSk7XG4gICAgbGlzdFRoaW5nR3JvdXBzRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWxpc3QtdGhpbmdzLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90Okxpc3RUaGluZ0dyb3VwcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZXRUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGdldFRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnR2V0VGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vZ2V0LXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgZ2V0VGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1kZXNjcmliZS10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpEZXNjcmliZVRoaW5nR3JvdXAnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBnZXRUaGluZ0dyb3VwRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgdXBkYXRlVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdVcGRhdGVUaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS91cGRhdGUtdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICB1cGRhdGVUaGluZ0dyb3VwRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LXVwZGF0ZS10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpVcGRhdGVUaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlVGhpbmdHcm91cEZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGRlbGV0ZVRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnRGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vZGVsZXRlLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgZGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1kZWxldGUtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6RGVsZXRlVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGRlbGV0ZVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQWRkVGhpbmdUb1RoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgYWRkVGhpbmdUb1RoaW5nR3JvdXAgPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0FkZFRoaW5nVG9UaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9hZGQtdGhpbmctdG8tdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICBhZGRUaGluZ1RvVGhpbmdHcm91cC5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtYWRkLXRoaW5nLXRvLXRoaW5nLWdyb3VwLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OkFkZFRoaW5nVG9UaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gYWRkVGhpbmdUb1RoaW5nR3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgcmVtb3ZlVGhpbmdGcm9tVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdSZW1vdmVUaGluZ0Zyb21UaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9yZW1vdmUtdGhpbmctZnJvbS10aGluZy1ncm91cC9hcHAudHNgLFxuICAgIH0pO1xuICAgIHJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtcmVtb3ZlLXRoaW5nLWZyb20tdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6UmVtb3ZlVGhpbmdGcm9tVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgY3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnQ3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2NyZWF0ZS1keW5hbWljLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgY3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtY3JlYXRlLWR5bmFtaWMtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6Q3JlYXRlRHluYW1pY1RoaW5nR3JvdXAnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uKCk6IE5vZGVqc0Z1bmN0aW9uIHtcbiAgICBjb25zdCB1cGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdVcGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vdXBkYXRlLWR5bmFtaWMtdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICB1cGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC11cGRhdGUtZHluYW1pYy10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpVcGRhdGVEeW5hbWljVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0RlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9kZWxldGUtZHluYW1pYy10aGluZy1ncm91cC9hcHAudHNgLFxuICAgIH0pO1xuICAgIGRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWRlbGV0ZS1keW5hbWljLXRoaW5nLWdyb3VwLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OkRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gZGVsZXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxufVxuIl19