@spinnaker/cloudrun 2025.4.1 → 2026.0.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.
- package/dist/index.js +1 -2597
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/common/componentUrlDetails.component.ts","../src/common/loadBalancerMessage.component.ts","../src/help/cloudrun.help.ts","../src/instance/details/details.controller.ts","../src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts","../src/loadBalancer/configure/wizard/basicSettings.component.ts","../src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts","../src/loadBalancer/loadBalancerTransformer.ts","../../../node_modules/style-inject/dist/style-inject.es.js","../src/loadBalancer/configure/wizard/wizard.controller.ts","../src/loadBalancer/details/details.controller.ts","../src/logo/cloudrun.logo.png","../src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts","../src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.ts","../src/pipeline/pipeline.module.ts","../src/pipeline/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/manifest/ManifestSource.ts","../src/manifest/wizard/BasicSettings.tsx","../src/pipeline/stages/deployManifest/serverGroupNamePreview.tsx","../src/pipeline/stages/deployManifest/DeployStageForm.tsx","../src/pipeline/stages/deployManifest/DeployStageConfig.tsx","../src/rolloutStrategy/redblack.strategy.ts","../src/pipeline/stages/deployManifest/deploy.validator.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipeline/stages/deployManifest/deployStage.ts","../src/cloudrun.settings.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.ts","../src/serverGroup/configure/wizard/BasicSettings.tsx","../src/serverGroup/configure/wizard/ConfigFiles.tsx","../src/serverGroup/configure/wizard/serverGroupWizard.tsx","../src/common/cloudrunHealth.ts","../src/serverGroup/details/details.controller.ts","../src/serverGroup/serverGroupTransformer.service.ts","../src/cloudrun.module.ts"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst cloudrunComponentUrlDetailsComponent: IComponentOptions = {\n bindings: { component: '<' },\n template: `\n <dt>HTTPS</dt>\n <dl class=\"small\">\n <a href=\"{{$ctrl.component.url}}\" target=\"_blank\">{{$ctrl.component.url}}</a>\n <copy-to-clipboard class=\"copy-to-clipboard copy-to-clipboard-sm\"\n tool-tip=\"'Copy URL to clipboard'\"\n text=\"$ctrl.component.httpsUrl\"></copy-to-clipboard>\n </dl>\n `,\n};\n\nexport const CLOUDRUN_COMPONENT_URL_DETAILS = 'spinnaker.cloudrun.componentUrlDetails.component';\n\nmodule(CLOUDRUN_COMPONENT_URL_DETAILS, []).component(\n 'cloudrunComponentUrlDetails',\n cloudrunComponentUrlDetailsComponent,\n);\n","import { module } from 'angular';\n\nconst cloudRunLoadBalancerMessageComponent: ng.IComponentOptions = {\n bindings: { showCreateMessage: '<', columnOffset: '@', columns: '@' },\n templateUrl: require('./loadBalancerMessage.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE = 'spinnaker.cloudrun.loadBalancer.createMessage.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE, []).component(\n 'cloudrunLoadBalancerMessage',\n cloudRunLoadBalancerMessageComponent,\n);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'cloudrun.serverGroup.stack',\n value:\n '(Optional) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n },\n\n {\n key: 'cloudrun.serverGroup.file',\n value: `<pre>\n apiVersion: serving.knative.dev/v1\n kind: Service\n metadata:\n name: spinappcloud1\n namespace: '135005621049'\n labels:\n cloud.googleapis.com/location: us-central1\n annotations:\n run.googleapis.com/client-name: cloud-console\n serving.knative.dev/creator: kiran@opsmx.io\n serving.knative.dev/lastModifier: kiran@opsmx.io\n client.knative.dev/user-image: us-docker.pkg.dev/cloudrun/container/hello\n run.googleapis.com/ingress-status: all\n spec:\n template:\n metagoogleapis.com/ingress: all\n run.data:\n name: spinappcloud1\n annotations:\n run.googleapis.com/client-name: cloud-console\n autoscaling.knative.dev/minScale: '1'\n autoscaling.knative.dev/maxScale: '3'\n spec:\n containerConcurrency: 80\n timeoutSeconds: 200\n serviceAccountName:spinnaker-cloudrun-account@my-orbit-project-71824.iam.gserviceaccount.com\n containers:\n - image:us-docker.pkg.dev/cloudrun/container/hello\n ports:\n - name: http1\n containerPort: 8080\n resources:\n limits:\n cpu: 1000m\n memory: 256Mi \n</pre>\n `,\n },\n\n {\n key: 'cloudrun.serverGroup.detail',\n value:\n ' (Optional) <b>Detail</b> is a string of free-form alphanumeric characters and hyphens to describe any other variables.',\n },\n {\n key: 'cloudrun.serverGroup.configFiles',\n value: `<p> The contents of a Cloud Run Service yaml </p>`,\n },\n {\n key: 'cloudrun.loadBalancer.allocations',\n value: 'An allocation is the percent of traffic directed to a server group.',\n },\n {\n key: 'cloudrun.manifest.source',\n value: `\n <p>Where the manifest file content is read from.</p>\n <p>\n <b>text:</b> The manifest is supplied statically to the pipeline from the below text-box.\n </p>\n <p>\n <b>artifact:</b> The manifest is read from an artifact supplied/created upstream. The expected artifact must be referenced here, and will be bound at runtime.\n </p>`,\n },\n {\n key: 'cloudrun.manifest.expectedArtifact',\n value:\n 'The artifact that is to be applied to the Cloud Run account for this stage. The artifact should represent a valid Cloud Run manifest.',\n },\n {\n key: 'cloudrun.manifest.skipExpressionEvaluation',\n value:\n '<p>Skip SpEL expression evaluation of the manifest artifact in this stage. Can be paired with the \"Evaluate SpEL expressions in overrides at bake time\" option in the Bake Manifest stage when baking a third-party manifest artifact with expressions not meant for Spinnaker to evaluate as SpEL.</p>',\n },\n {\n key: 'cloudrun.manifest.requiredArtifactsToBind',\n value:\n 'These artifacts must be present in the context for this stage to successfully complete. Artifacts specified will be <a href=\"https://www.spinnaker.io/reference/artifacts/in-cloudrun-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n },\n {\n key: 'cloudrun.manifest.account',\n value: `\n <p>A Spinnaker account corresponds to a physical Cloud Run cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","import type { IController, IQService } from 'angular';\nimport { module } from 'angular';\nimport { flattenDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { InstanceReader, RecentHistoryService } from '@spinnaker/core';\nimport type { ICloudrunInstance } from '../../common/domain';\n\ninterface InstanceFromStateParams {\n instanceId: string;\n}\n\ninterface InstanceManager {\n account: string;\n region: string;\n category: string; // e.g., serverGroup, loadBalancer.\n name: string; // Parent resource name, not instance name.\n instances: ICloudrunInstance[];\n}\n\nclass CloudrunInstanceDetailsController implements IController {\n public state = { loading: true };\n public instance: ICloudrunInstance;\n public instanceIdNotFound: string;\n public upToolTip = \"A Cloud Run instance is 'Up' if a load balancer is directing traffic to its server group.\";\n public outOfServiceToolTip = `\n A Cloud Run instance is 'Out Of Service' if no load balancers are directing traffic to its server group.`;\n\n public static $inject = ['$q', 'app', 'instance'];\n\n constructor(private $q: IQService, private app: Application, instance: InstanceFromStateParams) {\n this.app\n .ready()\n .then(() => this.retrieveInstance(instance))\n .then((instanceDetails) => {\n this.instance = instanceDetails;\n this.state.loading = false;\n })\n .catch(() => {\n this.instanceIdNotFound = instance.instanceId;\n this.state.loading = false;\n });\n }\n\n private retrieveInstance(instance: InstanceFromStateParams): PromiseLike<ICloudrunInstance> {\n const instanceLocatorPredicate = (dataSource: InstanceManager) => {\n return dataSource.instances.some((possibleMatch) => possibleMatch.id === instance.instanceId);\n };\n\n const dataSources: InstanceManager[] = flattenDeep([\n this.app.getDataSource('serverGroups').data,\n this.app.getDataSource('loadBalancers').data,\n this.app.getDataSource('loadBalancers').data.map((loadBalancer: ILoadBalancer) => loadBalancer.serverGroups),\n ]);\n\n const instanceManager = dataSources.find(instanceLocatorPredicate);\n\n if (instanceManager) {\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return InstanceReader.getInstanceDetails(\n instanceManager.account,\n instanceManager.region,\n instance.instanceId,\n ).then((instanceDetails: ICloudrunInstance) => {\n instanceDetails.account = instanceManager.account;\n instanceDetails.region = instanceManager.region;\n return instanceDetails;\n });\n } else {\n return this.$q.reject();\n }\n }\n}\n\nexport const CLOUDRUN_INSTANCE_DETAILS_CTRL = 'spinnaker.cloudrun.instanceDetails.controller';\nmodule(CLOUDRUN_INSTANCE_DETAILS_CTRL, []).controller('cloudrunInstanceDetailsCtrl', CloudrunInstanceDetailsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunAllocationConfigurationRowComponent: IComponentOptions = {\n bindings: {\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n template: `\n <div class=\"form-group\">\n <div class=\"row\">\n <div class=\"col-md-7\">\n <ui-select ng-model=\"$ctrl.allocationDescription.revisionName\"\n on-select=\"$ctrl.onAllocationChange()\"\n class=\"form-control input-sm\">\n <ui-select-match placeholder=\"Select...\">\n {{$select.selected}}\n </ui-select-match>\n <ui-select-choices repeat=\"serverGroup as serverGroup in $ctrl.getServerGroupOptions() | filter: $select.search\">\n <div ng-bind-html=\"serverGroup | highlight: $select.search\"></div>\n </ui-select-choices>\n </ui-select>\n </div>\n <div class=\"col-md-3\">\n <div class=\"input-group input-group-sm\">\n <input type=\"number\"\n ng-model=\"$ctrl.allocationDescription.percent\"\n required\n class=\"form-control input-sm\"\n min=\"0\"\n ng-change=\"$ctrl.onAllocationChange()\"\n max=\"100\"/>\n <span class=\"input-group-addon\">%</span>\n </div>\n </div>\n <div class=\"col-md-2\">\n <a class=\"btn btn-link sm-label\" ng-click=\"$ctrl.removeAllocation()\">\n <span class=\"glyphicon glyphicon-trash\"></span>\n </a>\n </div>\n </div>\n </div>\n `,\n controller: CloudrunAllocationConfigurationRowCtrl,\n};\n\nexport const CLOUDRUN_ALLOCATION_CONFIGURATION_ROW = 'spinnaker.cloudrun.allocationConfigurationRow.component';\n\nmodule(CLOUDRUN_ALLOCATION_CONFIGURATION_ROW, []).component(\n 'cloudrunAllocationConfigurationRow',\n cloudrunAllocationConfigurationRowComponent,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport { difference } from 'lodash';\n\nimport type { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunLoadBalancerSettingsController implements IController {\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public serverGroupOptions: string[];\n public forPipelineConfig: boolean;\n\n public $onInit(): void {\n this.updateServerGroupOptions();\n }\n\n public addAllocation(): void {\n const remainingServerGroups = this.serverGroupsWithoutAllocation();\n if (remainingServerGroups.length) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n revisionName: remainingServerGroups[0],\n percent: 0,\n });\n this.updateServerGroupOptions();\n } else if (this.forPipelineConfig) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n percent: 0,\n revisionName: '',\n });\n }\n }\n\n public removeAllocation(index: number): void {\n this.loadBalancer.splitDescription.allocationDescriptions.splice(index, 1);\n this.updateServerGroupOptions();\n }\n\n public allocationIsInvalid(): boolean {\n return (\n this.loadBalancer.splitDescription.allocationDescriptions.reduce(\n (sum, allocationDescription) => sum + allocationDescription.percent,\n 0,\n ) !== 100\n );\n }\n\n public updateServerGroupOptions(): void {\n this.serverGroupOptions = this.serverGroupsWithoutAllocation();\n }\n\n public showAddButton(): boolean {\n if (this.forPipelineConfig) {\n return true;\n } else {\n return this.serverGroupsWithoutAllocation().length > 0;\n }\n }\n\n public initializeAsTextInput(serverGroupName: string): boolean {\n if (this.forPipelineConfig) {\n return !this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name).includes(serverGroupName);\n } else {\n return false;\n }\n }\n\n private serverGroupsWithoutAllocation(): string[] {\n const serverGroupsWithAllocation = this.loadBalancer.splitDescription.allocationDescriptions.map(\n (description) => description.revisionName,\n );\n const allServerGroups = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n return difference(allServerGroups, serverGroupsWithAllocation);\n }\n}\n\nconst cloudrunLoadBalancerSettingsComponent: ng.IComponentOptions = {\n bindings: { loadBalancer: '=', forPipelineConfig: '<', application: '<' },\n controller: CloudrunLoadBalancerSettingsController,\n templateUrl: require('./basicSettings.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS = 'spinnaker.cloudrun.loadBalancerSettings.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS, []).component(\n 'cloudrunLoadBalancerBasicSettings',\n cloudrunLoadBalancerSettingsComponent,\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport { StageConstants } from '@spinnaker/core';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunStageAllocationLabelCtrl implements IController {\n public inputViewValue: string;\n private allocationDescription: ICloudrunAllocationDescription;\n\n private static mapTargetCoordinateToLabel(targetCoordinate: string): string {\n const target = StageConstants.TARGET_LIST.find((t) => t.val === targetCoordinate);\n if (target) {\n return target.label;\n } else {\n return null;\n }\n }\n\n public $doCheck(): void {\n this.setInputViewValue();\n }\n\n private setInputViewValue(): void {\n if (this.allocationDescription.cluster && this.allocationDescription.target) {\n const targetLabel = CloudrunStageAllocationLabelCtrl.mapTargetCoordinateToLabel(\n this.allocationDescription.target,\n );\n this.inputViewValue = `${targetLabel} (${this.allocationDescription.cluster})`;\n } else {\n this.inputViewValue = null;\n }\n }\n}\n\nconst cloudrunStageAllocationLabel: IComponentOptions = {\n bindings: { allocationDescription: '<' },\n controller: CloudrunStageAllocationLabelCtrl,\n template: `<input ng-model=\"$ctrl.inputViewValue\" type=\"text\" class=\"form-control input-sm\" readonly/>`,\n};\n\nclass CloudrunStageAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n public targets = StageConstants.TARGET_LIST;\n public clusterList: string[];\n public onAllocationChange: Function;\n private name: string;\n\n public $onInit() {\n this.allocationDescription.cluster = this.name;\n }\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunStageAllocationConfigurationRow: IComponentOptions = {\n bindings: {\n application: '<',\n region: '@',\n account: '@',\n name: '@',\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n controller: CloudrunStageAllocationConfigurationRowCtrl,\n templateUrl: require('./stageAllocationConfigurationRow.component.html'),\n};\n\nexport const CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW =\n 'spinnaker.cloudrun.stageAllocationConfigurationRow.component';\nmodule(CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW, [])\n .component('cloudrunStageAllocationConfigurationRow', cloudrunStageAllocationConfigurationRow)\n .component('cloudrunStageAllocationLabel', cloudrunStageAllocationLabel);\n","import { module } from 'angular';\nimport { camelCase, chain, cloneDeep, filter, get, has, reduce } from 'lodash';\n\nimport type {\n Application,\n IInstance,\n IInstanceCounts,\n ILoadBalancer,\n ILoadBalancerUpsertCommand,\n IServerGroup,\n} from '@spinnaker/core';\n//import type { ICloudrunLoadBalancer, ICloudrunTrafficSplit, ShardBy } from '../common/domain/index';\nimport type { ICloudrunLoadBalancer, ICloudrunTrafficSplit } from '../common/domain/index';\n\nexport interface ICloudrunAllocationDescription {\n revisionName?: string;\n target?: string;\n cluster?: string;\n percent: number;\n}\n\nexport interface ICloudrunTrafficSplitDescription {\n allocationDescriptions: ICloudrunAllocationDescription[];\n}\n\nexport class CloudrunLoadBalancerUpsertDescription implements ILoadBalancerUpsertCommand, ICloudrunLoadBalancer {\n public credentials: string;\n public account: string;\n public loadBalancerName: string;\n public name: string;\n public splitDescription: ICloudrunTrafficSplitDescription;\n public split?: ICloudrunTrafficSplit;\n public migrateTraffic: boolean;\n public region: string;\n public cloudProvider: string;\n public serverGroups?: any[];\n\n public static convertTrafficSplitToTrafficSplitDescription(\n split: ICloudrunTrafficSplit,\n ): ICloudrunTrafficSplitDescription {\n const allocationDescriptions = reduce(\n split.trafficTargets,\n (acc: any, trafficTarget: any) => {\n const { revisionName, percent } = trafficTarget;\n return acc.concat({ percent, revisionName });\n },\n [],\n );\n return { allocationDescriptions };\n }\n\n constructor(loadBalancer: ICloudrunLoadBalancer) {\n this.credentials = loadBalancer.account || loadBalancer.credentials;\n this.account = this.credentials;\n this.cloudProvider = loadBalancer.cloudProvider;\n this.loadBalancerName = loadBalancer.name;\n this.name = loadBalancer.name;\n this.region = loadBalancer.region;\n this.migrateTraffic = loadBalancer.migrateTraffic || false;\n this.serverGroups = loadBalancer.serverGroups;\n }\n\n public mapAllocationsToDecimals() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n description.percent = description.percent / 100;\n });\n }\n\n public mapAllocationsToPercentages() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n // An allocation percent has at most one decimal place.\n description.percent = Math.round(description.percent);\n });\n }\n}\n\nexport class CloudrunLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n public normalizeLoadBalancer(loadBalancer: ILoadBalancer): PromiseLike<ILoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n loadBalancer.instances = [];\n loadBalancer.serverGroups.forEach((serverGroup) => {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = (serverGroup.detachedInstances as any).map((id: string) => ({ id }));\n }\n serverGroup.instances = serverGroup.instances\n .concat(serverGroup.detachedInstances || [])\n .map((instance: any) => this.transformInstance(instance, loadBalancer));\n });\n\n const activeServerGroups = filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.instances = chain(activeServerGroups).map('instances').flatten().value() as IInstance[];\n return this.$q.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(\n loadBalancer: ICloudrunLoadBalancer,\n application: Application,\n ): PromiseLike<ICloudrunLoadBalancer> {\n return application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n const upToDateLoadBalancer = application\n .getDataSource('loadBalancers')\n .data.find((candidate: ILoadBalancer) => {\n return (\n candidate.name === loadBalancer.name &&\n (candidate.account === loadBalancer.account || candidate.account === loadBalancer.credentials)\n );\n });\n\n if (upToDateLoadBalancer) {\n loadBalancer.serverGroups = cloneDeep(upToDateLoadBalancer.serverGroups);\n }\n return loadBalancer;\n });\n }\n\n public convertLoadBalancerToUpsertDescription(\n loadBalancer: ICloudrunLoadBalancer,\n ): CloudrunLoadBalancerUpsertDescription {\n return new CloudrunLoadBalancerUpsertDescription(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts: IInstanceCounts = chain(serverGroups)\n .map('instances')\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n if (has(instance, 'health.state')) {\n acc[camelCase(instance.health.state)]++;\n }\n return acc;\n },\n { up: 0, down: 0, outOfService: 0, succeeded: 0, failed: 0, starting: 0, unknown: 0 },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups).map('detachedInstances').flatten().value().length;\n return instanceCounts;\n }\n\n private transformInstance(instance: any, loadBalancer: ILoadBalancer) {\n instance.provider = loadBalancer.type;\n instance.account = loadBalancer.account;\n instance.region = loadBalancer.region;\n instance.loadBalancers = [loadBalancer.name];\n const health = instance.health || {};\n instance.healthState = get(instance, 'health.state') || 'OutOfService';\n instance.health = [health];\n\n return instance as IInstance;\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_TRANSFORMER = 'spinnaker.cloudrun.loadBalancer.transformer.service';\n\nmodule(CLOUDRUN_LOAD_BALANCER_TRANSFORMER, []).service(\n 'cloudrunLoadBalancerTransformer',\n CloudrunLoadBalancerTransformer,\n);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application } from '@spinnaker/core';\nimport { LoadBalancerWriter, TaskMonitor } from '@spinnaker/core';\n\nimport type { CloudrunLoadBalancerTransformer, ICloudrunTrafficSplitDescription } from '../../loadBalancerTransformer';\nimport { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nimport './wizard.less';\n\nclass CloudrunLoadBalancerWizardController implements IController {\n public state = { loading: true };\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public heading: string;\n public submitButtonLabel: string;\n public taskMonitor: TaskMonitor;\n\n public static $inject = [\n '$scope',\n '$state',\n '$uibModalInstance',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'forPipelineConfig',\n 'cloudrunLoadBalancerTransformer',\n 'wizardSubFormValidation',\n ];\n constructor(\n public $scope: ng.IScope,\n private $state: StateService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n loadBalancer: CloudrunLoadBalancerUpsertDescription,\n public isNew: boolean,\n private forPipelineConfig: boolean,\n private cloudrunLoadBalancerTransformer: CloudrunLoadBalancerTransformer,\n private wizardSubFormValidation: any,\n ) {\n this.submitButtonLabel = this.forPipelineConfig ? 'Done' : 'Update';\n\n if (this.isNew) {\n this.heading = 'Create New Load Balancer';\n } else {\n this.heading = `Edit ${[\n loadBalancer.name,\n loadBalancer.region,\n loadBalancer.account || loadBalancer.credentials,\n ].join(':')}`;\n this.cloudrunLoadBalancerTransformer\n .convertLoadBalancerForEditing(loadBalancer, application)\n .then((convertedLoadBalancer) => {\n this.loadBalancer = this.cloudrunLoadBalancerTransformer.convertLoadBalancerToUpsertDescription(\n convertedLoadBalancer,\n );\n if (loadBalancer.split && !this.loadBalancer.splitDescription) {\n this.loadBalancer.splitDescription = CloudrunLoadBalancerUpsertDescription.convertTrafficSplitToTrafficSplitDescription(\n loadBalancer.split,\n );\n } else {\n this.loadBalancer.splitDescription = loadBalancer.splitDescription;\n }\n this.loadBalancer.mapAllocationsToPercentages();\n this.setTaskMonitor();\n this.initializeFormValidation();\n this.state.loading = false;\n });\n }\n }\n\n public submit(): any {\n const description = cloneDeep(this.loadBalancer);\n description.mapAllocationsToPercentages();\n delete description.serverGroups;\n\n if (this.forPipelineConfig) {\n return this.$uibModalInstance.close(description);\n } else {\n return this.taskMonitor.submit(() => {\n return LoadBalancerWriter.upsertLoadBalancer(description, this.application, 'Update');\n });\n }\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public showSubmitButton(): boolean {\n return this.wizardSubFormValidation.subFormsAreValid();\n }\n\n private setTaskMonitor(): void {\n this.taskMonitor = new TaskMonitor({\n application: this.application,\n title: 'Updating your load balancer',\n modalInstance: this.$uibModalInstance,\n onTaskComplete: () => this.onTaskComplete(),\n });\n }\n\n private initializeFormValidation(): void {\n this.wizardSubFormValidation.config({ form: 'form', scope: this.$scope }).register({\n page: 'basic-settings',\n subForm: 'basicSettingsForm',\n validators: [\n {\n watchString: 'ctrl.loadBalancer.splitDescription',\n validator: (splitDescription: ICloudrunTrafficSplitDescription): boolean => {\n return (\n splitDescription.allocationDescriptions.reduce((sum, description) => sum + description.percent, 0) === 100\n );\n },\n watchDeep: true,\n },\n ],\n });\n }\n\n private onTaskComplete(): void {\n this.application.getDataSource('loadBalancers').refresh();\n this.application.getDataSource('loadBalancers').onNextRefresh(this.$scope, () => this.onApplicationRefresh());\n }\n\n private onApplicationRefresh(): void {\n // If the user has already closed the modal, do not navigate to the new details view\n if ((this.$scope as any).$$destroyed) {\n // $$destroyed is not in the ng.IScope interface\n return;\n }\n\n this.$uibModalInstance.dismiss();\n const newStateParams = {\n name: this.loadBalancer.name,\n accountId: this.loadBalancer.credentials,\n region: this.loadBalancer.region,\n provider: 'cloudrun',\n };\n\n if (!this.$state.includes('**.loadBalancerDetails')) {\n this.$state.go('.loadBalancerDetails', newStateParams);\n } else {\n this.$state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL = 'spinnaker.cloudrun.loadBalancer.wizard.controller';\n\nmodule(CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL, []).controller(\n 'cloudrunLoadBalancerWizardCtrl',\n CloudrunLoadBalancerWizardController,\n);\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer, ILoadBalancerDeleteCommand } from '@spinnaker/core';\nimport { ConfirmationModalService, LoadBalancerWriter } from '@spinnaker/core';\nimport type { ICloudrunLoadBalancer } from '../../common/domain/index';\n\ninterface ILoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunLoadBalancerDetailsController implements IController {\n public state = { loading: true };\n private loadBalancerFromParams: ILoadBalancerFromStateParams;\n public loadBalancer: ICloudrunLoadBalancer;\n\n public static $inject = ['$uibModal', '$state', '$scope', 'loadBalancer', 'app'];\n constructor(\n private $uibModal: IModalService,\n private $state: StateService,\n private $scope: IScope,\n loadBalancer: ILoadBalancerFromStateParams,\n private app: Application,\n ) {\n this.loadBalancerFromParams = loadBalancer;\n this.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n // edit loadbalancer to change traffic\n\n public editLoadBalancer(): void {\n this.$uibModal.open({\n templateUrl: require('../configure/wizard/wizard.html'),\n controller: 'cloudrunLoadBalancerWizardCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: () => this.app,\n loadBalancer: () => cloneDeep(this.loadBalancer),\n isNew: () => false,\n forPipelineConfig: () => false,\n },\n });\n }\n\n private extractLoadBalancer(): void {\n this.loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {\n return test.name === this.loadBalancerFromParams.name && test.account === this.loadBalancerFromParams.accountId;\n }) as ICloudrunLoadBalancer;\n\n if (this.loadBalancer) {\n this.state.loading = false;\n this.app.getDataSource('loadBalancers').onRefresh(this.$scope, () => this.extractLoadBalancer());\n } else {\n this.autoClose();\n }\n }\n\n public deleteLoadBalancer(): void {\n const taskMonitor = {\n application: this.app,\n title: 'Deleting ' + this.loadBalancer.name,\n };\n\n const submitMethod = () => {\n const loadBalancer: ILoadBalancerDeleteCommand = {\n cloudProvider: this.loadBalancer.cloudProvider,\n loadBalancerName: this.loadBalancer.name,\n credentials: this.loadBalancer.account,\n };\n return LoadBalancerWriter.deleteLoadBalancer(loadBalancer, this.app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + this.loadBalancer.name + '?',\n buttonText: 'Delete ' + this.loadBalancer.name,\n body: this.getConfirmationModalBodyHtml(),\n account: this.loadBalancer.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n });\n }\n\n public canDeleteLoadBalancer(): boolean {\n return this.loadBalancer.name !== 'default';\n }\n\n private getConfirmationModalBodyHtml(): string {\n const serverGroupNames = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n const hasAny = serverGroupNames ? serverGroupNames.length > 0 : false;\n const hasMoreThanOne = serverGroupNames ? serverGroupNames.length > 1 : false;\n\n // HTML accepted by the confirmationModalService is static (i.e., not managed by angular).\n if (hasAny) {\n if (hasMoreThanOne) {\n const listOfServerGroupNames = serverGroupNames.map((name) => `<li>${name}</li>`).join('');\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy the following server groups:\n <ul>\n ${listOfServerGroupNames}\n </ul>\n </p>\n </div>\n `;\n } else {\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy <b>${serverGroupNames[0]}</b>.\n </p>\n </div>\n `;\n }\n } else {\n return null;\n }\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.cloudrun.loadBalancerDetails.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL, []).controller(\n 'cloudrunLoadBalancerDetailsCtrl',\n CloudrunLoadBalancerDetailsController,\n);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAFAUlEQVRYR82YfUwcRRjGn5m7veO4rZI2aKuk1kRNjQ012rRANB53YNpYtFHS1Aj9ktaPtGINpPWgKQ0sVNvUNGirgYBJSTSA1H6ltpTrVYtUS2u1aRS/LSRFEmqBPcC7vR2zixwc7N4tJ02c5P64zMwzv332fd+ZWYL/USNGWFL3MpvVJy4xMlZzTJA/7y0hw9HmR4VxlokVIGQzwOzRxCL0D4DgA4+bL4ykERHGKfiqAJb3HyAmTCXVniL7Bj09XRhXqZjBKJqnD2REicjIbNnOn9bS1YVxlvuOgrHl0w0DQo553PYswzAuQcxhwMFpB/lXkAC5LUV83UT9Sc44SpjZxPnaGLDoFsK0BwP2VG8JkcavMQnGWSYWgGD3rQIJ6TIUeor5PbowjrcGk6gktwFI0oKZk0Bw/SYLdSXNpOi6IcfK3SWbaap3a3zXqECYM85ycTcYCvTUX3JZ0NMn41D7iLt5Dgv6hhgavgrEBkSwZ3ztCcE4ynyLKGGKK2Y95ZT7TBBWxuHzH4LY2TSMBUkU+1bbcOn3IPZ95o/FJUlmJNVbbG9X0350YacgKtmTE+kRORNQs9GGO2+nyKsawrVeGe+vt+HyH0E88yiHmrP+WFyq8xTxuSEYV2n/ckbpUSNeFzxlxbKFZuxv9uPUFQkrUzgkz6U4/o2E7MUcbvgY3j01NZeILGe1bL/tmOpMernYTBgyjMBkLjBj29NWfNEhofKkH/MSKXatikPO/kEwBmQv4bA02YyD5wKGXWIEp8+4+UziFPrzAFplBEQZM4snqH8tHjcHGTZWD6nTKtfYUHvWr8aO0u6fTbHpSSt+6ZFR5THqkryBOAXfEYBplmc9wPfW2jD/Loqi+mH81C1jzeMWzEvU3lnmJFDUtfpx+GJYfdOSPkHSBbGHAIlGnRlN6efTOPU1KL+HkkzY8aw1okTLVQk1Xj+6+8bq1MQJJL1MrCYEL04FpjrPhnvvGHNm3RMWNai1mlIkFeBzHRL8QWBgSAeGkAbiKhWXMooTRmFmzSCo3xweMwfW29RYmthOfiepIP3jAAJBhP0PVV8Zy1QFpyDWAlhrBEhJ31cyLKFsevBuip3PxYVN7eyV8XFbABd+HQnoiU2Sgb7BMIc+9BTx61QYhyA+TAGl+oaragjtfSEOC+8xqXXG+72E3Mc4ZD3ChUYeuRRAw/kA/o4Sr0EZakYCGJaBVG8Rf3msApcPVoDJ26K50+K2QxF6tXYIf/mYuh0oG+hvPTLqWgO40qnthq5DQ2SXxx3/ptI/tjeViLMpp7ozTw8o7QETSrOVvUlSq2zyXBOKV1jRdCGgvpapNkrR+WcvW+wt4bvDYNTYKRNfB8E7eqJK5f365yC+vTby9EoWffmjhI7rsR0jgjLb2rSFfzsUxBMXdgnKKY+laAFZzQAfF/V2Y8ggAlysz7eHnSYnKbuEgVUM5CM9xekCCshs9adb+LBztuZjOgXfIYCt0AXiAN4au0MM9Hhjvm3SzUNT0VE64KCUnInkdxwH2GME8vtZ5uHCyXcn/XuT4DsAsJenG4gBNY35ds3tRxfGUd4/nzKqpHpCJCCbhSDeYihmAbB+2cTSPtk046rWjMh37dKBElCyI9pSRoEYUNGYb3fr6UWNQqcKRAuifYWItxDYdBwihIgyY5WRQCYVPT1io99nZvKc5jnCxKytDW+QkWNhhBbVmWgC09n/Dw0j4+SJOXQTAAAAAElFTkSuQmCC\"","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService, IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry } from '@spinnaker/core';\n\nclass CloudrunLoadBalancerChoiceModalCtrl implements IController {\n public state = { loading: true };\n public loadBalancers: ILoadBalancer[];\n public selectedLoadBalancer: ILoadBalancer;\n\n public static $inject = ['$uibModal', '$uibModalInstance', 'application'];\n constructor(\n private $uibModal: IModalService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.initialize();\n }\n\n public submit(): void {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n const updatedLoadBalancerPromise = this.$uibModal.open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.application,\n loadBalancer: () => cloneDeep(this.selectedLoadBalancer),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n }).result;\n\n this.$uibModalInstance.close(updatedLoadBalancerPromise);\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n private initialize(): void {\n this.application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n this.loadBalancers = (this.application.loadBalancers.data as ILoadBalancer[]).filter(\n (candidate) => candidate.cloudProvider === 'cloudrun',\n );\n\n if (this.loadBalancers.length) {\n this.selectedLoadBalancer = this.loadBalancers[0];\n }\n this.state.loading = false;\n });\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL = 'spinnaker.Cloudrun.loadBalancerChoiceModal.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL, []).controller(\n 'cloudrunLoadBalancerChoiceModelCtrl',\n CloudrunLoadBalancerChoiceModalCtrl,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry, Registry } from '@spinnaker/core';\n\nimport { CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL } from './loadBalancerChoice.modal.controller';\n\nclass CloudrunEditLoadBalancerStageCtrl implements IController {\n public static $inject = ['$scope', '$uibModal'];\n constructor(public $scope: any, private $uibModal: IModalService) {\n $scope.stage.loadBalancers = $scope.stage.loadBalancers || [];\n $scope.stage.cloudProvider = 'cloudrun';\n }\n\n public addLoadBalancer(): void {\n this.$uibModal\n .open({\n templateUrl: require('./loadBalancerChoice.modal.html'),\n controller: `cloudrunLoadBalancerChoiceModelCtrl as ctrl`,\n resolve: {\n application: () => this.$scope.application,\n },\n })\n .result.then((newLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers.push(newLoadBalancer);\n })\n .catch(() => {});\n }\n\n public editLoadBalancer(index: number) {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n this.$uibModal\n .open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.$scope.application,\n loadBalancer: () => cloneDeep(this.$scope.stage.loadBalancers[index]),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n })\n .result.then((updatedLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers[index] = updatedLoadBalancer;\n })\n .catch(() => {});\n }\n\n public removeLoadBalancer(index: number): void {\n this.$scope.stage.loadBalancers.splice(index, 1);\n }\n}\n\nexport const CLOUDRUN_EDIT_LOAD_BALANCER_STAGE = 'spinnaker.cloudrun.pipeline.stage.editLoadBalancerStage';\nmodule(CLOUDRUN_EDIT_LOAD_BALANCER_STAGE, [CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Edit Load Balancer (Cloud Run)',\n description: 'Edits a load balancer',\n key: 'upsertCloudrunLoadBalancers',\n cloudProvider: 'cloudrun',\n templateUrl: require('./editLoadBalancerStage.html'),\n executionDetailsUrl: require('./editLoadBalancerExecutionDetails.html'),\n executionConfigSections: ['editLoadBalancerConfig', 'taskStatus'],\n controller: 'cloudrunEditLoadBalancerStageCtrl',\n controllerAs: 'editLoadBalancerStageCtrl',\n validators: [],\n });\n })\n .controller('cloudrunEditLoadBalancerStageCtrl', CloudrunEditLoadBalancerStageCtrl);\n","import { module } from 'angular';\n\nimport { CLOUDRUN_EDIT_LOAD_BALANCER_STAGE } from './stages/editLoadBalancer/cloudrunEditLoadBalancerStage';\n\nexport const CLOUDRUN_PIPELINE_MODULE = 'spinnaker.cloudrun.pipeline.module';\nmodule(CLOUDRUN_PIPELINE_MODULE, [CLOUDRUN_EDIT_LOAD_BALANCER_STAGE]);\n","import React from 'react';\n\nimport type { IArtifact, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';\nimport { ArtifactTypePatterns, StageArtifactSelector } from '@spinnaker/core';\n\nexport interface IManifestBindArtifact {\n expectedArtifactId?: string;\n artifact?: IArtifact;\n}\n\nexport interface IManifestBindArtifactsSelectorProps {\n pipeline: IPipeline;\n stage: IStage;\n bindings?: IManifestBindArtifact[];\n onChangeBindings: (_: IManifestBindArtifact[]) => void;\n}\n\nexport class ManifestBindArtifactsSelector extends React.Component<IManifestBindArtifactsSelectorProps> {\n private onChangeBinding = (index: number, binding: IManifestBindArtifact) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings[index] = binding;\n this.props.onChangeBindings(bindings);\n };\n\n private onRemoveBinding = (index: number) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings.splice(index, 1);\n this.props.onChangeBindings(bindings);\n };\n\n public render() {\n const { stage, pipeline, bindings } = this.props;\n\n const renderSelect = (i: number, binding?: IManifestBindArtifact) => {\n const key = (!binding && 'new') || binding.expectedArtifactId || (binding.artifact && binding.artifact.id);\n return (\n <div className=\"row\" key={key}>\n <div className=\"col-md-10\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n expectedArtifactId={binding && binding.expectedArtifactId}\n artifact={!!binding && binding.artifact}\n onArtifactEdited={(artifact: IArtifact) => this.onChangeBinding(i, { artifact: artifact })}\n onExpectedArtifactSelected={(expectedArtifact: IExpectedArtifact) =>\n this.onChangeBinding(i, { expectedArtifactId: expectedArtifact.id })\n }\n excludedArtifactIds={bindings.map((b) => b.expectedArtifactId)}\n excludedArtifactTypePatterns={[ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE]}\n />\n </div>\n {binding && (\n <div className=\"col-md-2\">\n <a className=\"glyphicon glyphicon-trash\" onClick={() => this.onRemoveBinding(i)} />\n </div>\n )}\n </div>\n );\n };\n const renderSelectEditable = (binding: IManifestBindArtifact, i: number) => renderSelect(i, binding);\n\n return (\n <>\n {bindings.map(renderSelectEditable)}\n {renderSelect(bindings.length)}\n </>\n );\n }\n}\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IAccount } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField } from '@spinnaker/core';\n\nimport type { ICloudrunManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n}\n\nexport function ManifestBasicSettings({ accounts, onAccountSelect, selectedAccount }: IManifestBasicSettingsProps) {\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Account <HelpField id=\"cloudrun.manifest.account\" />\n </div>\n <div className=\"col-md-8\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<ICloudrunManifestCommandData>;\n}\n\nexport class WizardManifestBasicSettings extends React.Component<IWizardManifestBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n public render() {\n const { formik } = this.props;\n return (\n <ManifestBasicSettings\n accounts={formik.values.metadata.backingData.accounts}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command.account}\n />\n );\n }\n}\n","import React from 'react';\n\nexport interface IServerGroupNamePreviewProps {\n application: string;\n stack: string;\n details: string;\n}\n\nexport class ServerGroupNamePreview extends React.Component<IServerGroupNamePreviewProps> {\n public render() {\n const application = this.props.application ? this.props.application : '';\n const stack = this.props.stack ? `-${this.props.stack}` : '';\n\n const details = this.props.details ? `-${this.props.details}` : '';\n return (\n <pre style={{ textAlign: 'center' }}>\n <p> Your server group will be in the cluster:</p>\n <p>\n <b>\n {application}\n {stack}\n {details}\n </b>\n </p>\n </pre>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\nimport { ServerGroupNamePreview } from './serverGroupNamePreview';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n application: string;\n stack: string;\n details: string;\n}\n\nexport class DeployStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const stage = this.props.formik.values;\n const manifests: any[] = get(props.formik.values, 'manifests');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(manifests) && isTextManifest ? yamlDocumentsToString(manifests) : '',\n application: this.props.application.name,\n stack: get(stage, 'stack'),\n details: get(stage, 'details'),\n };\n }\n\n private getSourceOptions = (): Array<Option<string>> => {\n return map([ManifestSource.TEXT, ManifestSource.ARTIFACT], (option) => ({\n label: capitalize(option),\n value: option,\n }));\n };\n\n private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('manifests', manifests);\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.formik.setFieldValue('manifestArtifactId', expectedArtifactId);\n this.props.formik.setFieldValue('manifestArtifact', null);\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.formik.setFieldValue('manifestArtifactId', null);\n this.props.formik.setFieldValue('manifestArtifact', artifact);\n };\n\n private getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.formik.values;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.formik.setFieldValue(\n 'requiredArtifactIds',\n bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n );\n this.props.formik.setFieldValue(\n 'requiredArtifacts',\n bindings.filter((b) => b.artifact),\n );\n };\n\n public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n accounts={this.props.accounts}\n onAccountSelect={(accountName) => this.props.formik.setFieldValue('account', accountName)}\n selectedAccount={stage.account}\n />\n <StageConfigField label=\"Application\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={this.props.application.name}\n onChange={(event) => this.props.formik.setFieldValue('application', event.target.value)}\n disabled\n />\n </StageConfigField>\n <StageConfigField label=\"Stack\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.stack}\n onChange={(event) => this.props.formik.setFieldValue('stack', event.target.value)}\n />\n </StageConfigField>\n <StageConfigField label=\"Details\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.details}\n onChange={(event) => this.props.formik.setFieldValue('details', event.target.value)}\n />\n </StageConfigField>\n <ServerGroupNamePreview\n application={this.props.application.name}\n stack={stage.stack}\n details={stage.details}\n ></ServerGroupNamePreview>\n\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"cloudrun.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.formik.setFieldValue('source', e.target.value)}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <StageConfigField label=\"Manifest\">\n <YamlEditor onChange={this.handleRawManifestChange} value={this.state.rawManifest} />\n </StageConfigField>\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"cloudrun.manifest.expectedArtifact\"\n label=\"Manifest Artifact\"\n onArtifactEdited={this.onManifestArtifactEdited}\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onManifestArtifactSelected(artifact.id)}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n <StageConfigField label=\"Expression Evaluation\" helpKey=\"cloudrun.manifest.skipExpressionEvaluation\">\n <CheckboxInput\n checked={stage.skipExpressionEvaluation === true}\n onChange={(e: any) => this.props.formik.setFieldValue('skipExpressionEvaluation', e.target.checked)}\n text=\"Skip SpEL expression evaluation\"\n />\n </StageConfigField>\n </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"cloudrun.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n </div>\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type { IAccountDetails, IStage, IStageConfigProps } from '@spinnaker/core';\nimport { AccountService, FormikStageConfig } from '@spinnaker/core';\n\nimport { DeployStageForm } from './DeployStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployStageConfig extends React.Component<IStageConfigProps, IDeployManifestStageConfigState> {\n private stage: IStage;\n private destroy$ = new Subject();\n\n public constructor(props: IStageConfigProps) {\n super(props);\n this.state = {\n accounts: [],\n };\n const { stage: initialStageConfig } = props;\n const stage = cloneDeep(initialStageConfig);\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n if (!stage.skipExpressionEvaluation) {\n stage.skipExpressionEvaluation = false;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'cloudrun';\n }\n if (!stage.moniker) {\n stage.moniker = {};\n }\n if (!stage.moniker.app) {\n stage.moniker.app = props.application.name;\n }\n // Intentionally initializing the stage config only once in the constructor\n // The stage config is then completely owned within FormikStageConfig's Formik state\n this.stage = stage;\n }\n\n public componentDidMount() {\n this.fetchAccounts();\n }\n\n private fetchAccounts = (): void => {\n observableFrom(AccountService.getAllAccountDetailsForProvider('cloudrun'))\n .pipe(takeUntil(this.destroy$))\n .subscribe((accounts: IAccountDetails[]) => {\n this.setState({ accounts });\n });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <DeployStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\n}\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyRedBlack: IDeploymentStrategy = {\n label: 'Red/Black',\n description: 'Disables <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'redblack',\n};\n","import { get, isEmpty } from 'lodash';\n\nimport type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { strategyRedBlack } from '../../../rolloutStrategy/redblack.strategy';\n\nconst MAX_VERSION_HISTORY_ANNOTATION = 'strategy.spinnaker.io/max-version-history';\n\nexport const deployValidators = (): IValidatorConfig[] => {\n return [\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'source', fieldLabel: 'Source' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IStage) => {\n const enabled = get(stage, 'trafficManagement.enabled', false);\n const services = get(stage, 'trafficManagement.options.services', []);\n if (enabled && isEmpty(services)) {\n return `Select at least one <strong>Service</strong> to enable Spinnaker-managed rollout strategy options.`;\n }\n if (enabled && stage.source === ManifestSource.TEXT) {\n const manifests = get(stage, 'manifests', []);\n const replicaSetManifests = manifests.filter((m) => m.kind === 'ReplicaSet');\n const strategy = get(stage, 'trafficManagement.options.strategy');\n const maxVersionHistory = parseInt(\n get(replicaSetManifests, [0, 'metadata', 'annotations', MAX_VERSION_HISTORY_ANNOTATION]),\n 10,\n );\n if (strategy === strategyRedBlack.key && maxVersionHistory < 2) {\n return `The max version history specified in your manifest conflicts with the behavior of the Red/Black rollout strategy. Please update your <strong>${MAX_VERSION_HISTORY_ANNOTATION}</strong> annotation to a value greater than or equal to 2.`;\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import React from 'react';\nimport type { IManifest } from '@spinnaker/core';\n\ninterface IStatusClasses {\n [key: string]: string;\n}\n\nconst STATUS_PILLS: IStatusClasses = {\n available: 'success',\n stable: 'success',\n paused: 'warn',\n failed: 'danger',\n};\n\nexport interface IDeployManifestStatusProps {\n manifest: IManifest;\n}\n\nexport class DeployManifestStatusPills extends React.Component<IDeployManifestStatusProps> {\n public render() {\n const { manifest } = this.props;\n if (manifest == null || manifest.status == null) {\n return null;\n }\n return Object.keys(manifest.status).map((statusKey, i) => {\n const statusDescription = manifest.status[statusKey];\n const statusClass = STATUS_PILLS[statusKey] || '';\n const isStable = statusDescription.state;\n const isUnstableWithMessage = !isStable && statusDescription.message;\n return (\n <span key={i}>\n {isStable && (\n <span title={statusDescription.message} className={`pill ${statusClass}`}>\n {statusKey}\n </span>\n )}\n {isUnstableWithMessage && (\n <span title={statusDescription.message} className=\"pill warn\">\n {statusKey}\n </span>\n )}\n <span> </span>\n </span>\n );\n });\n }\n}\n","import { get, trim } from 'lodash';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { AccountService, ReactInjector } from '@spinnaker/core';\n\nconst UNMAPPED_K8S_RESOURCE_STATE_KEY = 'cloudrunResource';\n\nexport interface IManifestDetailsProps {\n manifest: IManifest;\n linkName: string;\n accountId: string;\n}\n\nexport interface IManifestDetailsState {\n url: string;\n}\n\nexport class ManifestDetailsLink extends React.Component<IManifestDetailsProps, IManifestDetailsState> {\n private spinnakerKindStateMap: { [k: string]: string } = {\n // keys from clouddriver's CloudrunSpinnakerKindMap\n serverGroupManagers: 'serverGroupManager',\n serverGroups: 'serverGroup',\n };\n\n constructor(props: IManifestDetailsProps) {\n super(props);\n this.state = {\n url: '',\n };\n this.loadUrl();\n }\n\n private canOpen(): boolean {\n return !!this.props.manifest.manifest && !!this.state.url;\n }\n\n private spinnakerKindFromCloudrunKind(kind: string, kindMap: { [k: string]: string }) {\n const foundKind = Object.keys(kindMap).find((k) => k.toLowerCase() === kind.toLowerCase());\n return kindMap[foundKind];\n }\n\n private resourceRegion(): string {\n return trim(\n get(this.props, ['manifest', 'manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n }\n\n private getStateParams(stateKey: string): any {\n const kind = this.props.manifest.manifest.kind.toLowerCase();\n const name = this.props.manifest.manifest.metadata.name;\n const region = this.resourceRegion();\n const params: { [k: string]: string } = {\n accountId: this.props.accountId,\n provider: 'cloudrun',\n region,\n reg: region, // Filters the list of clusters on the Clusters screen to those in the same namespace\n [stateKey]: `${kind} ${name}`,\n };\n if (!params.region && kind === 'namespace' && stateKey === UNMAPPED_K8S_RESOURCE_STATE_KEY) {\n params.region = name;\n }\n if (!params.region || params.region === '') {\n params.region = '_';\n }\n return params;\n }\n\n private loadUrl() {\n const kind: string = get(this.props, ['manifest', 'manifest', 'kind'], '');\n const { accountId } = this.props;\n AccountService.getAccountDetails(accountId).then((account) => {\n const spinnakerKind = this.spinnakerKindFromCloudrunKind(kind, account.spinnakerKindMap);\n const stateKey = this.spinnakerKindStateMap[spinnakerKind] || UNMAPPED_K8S_RESOURCE_STATE_KEY;\n const params = this.getStateParams(stateKey);\n const url = ReactInjector.$state.href(`home.applications.application.insight.clusters.${stateKey}`, params);\n this.setState({ url });\n });\n }\n\n public render() {\n if (this.canOpen()) {\n return (\n <a href={this.state.url} className=\"clickable\">\n {this.props.linkName}\n </a>\n );\n } else {\n return null;\n }\n }\n}\n","import { get, trim } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest, IManifestEvent } from '@spinnaker/core';\nimport { JobEventBasedPodNameProvider, JobManifestPodLogs, relativeTime } from '@spinnaker/core';\n\nexport interface IManifestEventsProps {\n manifest: IManifest;\n}\n\nexport class ManifestEvents extends React.Component<IManifestEventsProps> {\n private pillStyle(e: IManifestEvent): string {\n if (e.type === 'Warning') {\n return 'alert';\n } else if (e.type === 'Normal') {\n return 'success';\n } else {\n return '';\n }\n }\n\n public render() {\n if (!this.props.manifest) {\n return null;\n }\n if (this.props.manifest && (!this.props.manifest.events || this.props.manifest.events.length === 0)) {\n return <div>No recent events found - Cloud Run does not store events for long.</div>;\n }\n const { events } = this.props.manifest;\n const namespace = trim(\n get(this.props.manifest, ['manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n return events.map((e, i) => {\n const firstTimestamp = get(e, 'firstTimestamp', '');\n const lastTimestamp = get(e, 'lastTimestamp', '');\n let firstEpochMilliseconds = 0;\n let lastEpochMilliseconds = 0;\n if (firstTimestamp) {\n firstEpochMilliseconds = DateTime.fromISO(firstTimestamp).toMillis();\n }\n if (lastTimestamp) {\n lastEpochMilliseconds = DateTime.fromISO(lastTimestamp).toMillis();\n }\n return (\n <div key={get(e, ['metadata', 'uid'], String(i))} className=\"info\">\n <div className=\"horizontal\">\n {e.count && (\n <div className={`pill ${this.pillStyle(e)}`}>\n {e.count} × <b>{e.reason}</b>\n </div>\n )}\n </div>\n {(e.firstTimestamp || e.lastTimestamp) && (\n <div>\n {e.firstTimestamp === e.lastTimestamp && (\n <div>\n <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n )}\n {e.firstTimestamp !== e.lastTimestamp && (\n <div>\n <div>\n First Occurrence: <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n <div>\n Last Occurrence: <i>{relativeTime(lastEpochMilliseconds)}</i>\n </div>\n </div>\n )}\n </div>\n )}\n <div>{e.message}</div>\n <div>\n <JobManifestPodLogs\n account={this.props.manifest.account}\n location={namespace}\n podNamesProviders={[new JobEventBasedPodNameProvider(this.props.manifest, e)]}\n linkName=\"Console Output (Raw)\"\n />\n </div>\n {i !== events.length - 1 && <br />}\n </div>\n );\n });\n }\n}\n","import { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { CopyToClipboard, ManifestYaml } from '@spinnaker/core';\n\nimport { DeployManifestStatusPills } from './DeployStatusPills';\nimport { ManifestDetailsLink } from './ManifestDetailsLink';\nimport { ManifestEvents } from './ManifestEvents';\n\nimport './ManifestStatus.less';\n\nexport interface IManifestStatusProps {\n account: string;\n manifest: IManifest;\n}\n\nexport function ManifestStatus({ account, manifest }: IManifestStatusProps) {\n return (\n <>\n <dl className=\"manifest-status\" key=\"manifest-status\">\n <dt>{manifest.manifest.kind}</dt>\n <dd>\n <CopyToClipboard\n displayText={true}\n text={manifest.manifest.metadata.name}\n toolTip={`Copy ${manifest.manifest.metadata.name}`}\n />\n \n <DeployManifestStatusPills manifest={manifest} />\n </dd>\n </dl>\n <div className=\"manifest-support-links\" key=\"manifest-support-links\">\n <ManifestYaml\n linkName=\"YAML\"\n manifestText={dump(manifest.manifest)}\n modalTitle={manifest.manifest.metadata.name}\n />\n <ManifestDetailsLink linkName=\"Details\" manifest={manifest} accountId={account} />\n </div>\n <div className=\"manifest-events pad-left\" key=\"manifest-events\">\n <ManifestEvents manifest={manifest} />\n </div>\n </>\n );\n}\n","import type { Application, IManifest } from '@spinnaker/core';\nimport { ManifestReader } from '@spinnaker/core';\n\nexport interface IStageManifest {\n kind: string;\n apiVersion: string;\n metadata: {\n namespace: string;\n name: string;\n };\n}\n\nexport interface IManifestParams {\n account: string;\n location: string;\n name: string;\n}\n\nexport type IManifestCallback = (manifest: IManifest) => void;\n\nexport class CloudrunManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n CloudrunManifestService.updateManifest(params, fn);\n return app.onRefresh(null, () => CloudrunManifestService.updateManifest(params, fn));\n }\n\n private static updateManifest(params: IManifestParams, fn: IManifestCallback) {\n ManifestReader.getManifest(params.account, params.location, params.name).then((manifest) => fn(manifest));\n }\n\n public static manifestIdentifier(manifest: IStageManifest) {\n const kind = manifest.kind.toLowerCase();\n // manifest.metadata.namespace doesn't exist if it's a namespace being deployed\n const namespace = (manifest.metadata.namespace || '_').toLowerCase();\n const name = manifest.metadata.name.toLowerCase();\n const apiVersion = (manifest.apiVersion || '_').toLowerCase();\n // assuming this identifier is opaque and not parsed anywhere. Including the\n // apiVersion will prevent collisions with CRD kinds without having any visible\n // effect elsewhere\n return `${namespace} ${kind} ${apiVersion} ${name}`;\n }\n\n public static stageManifestToManifestParams(manifest: IStageManifest, account: string): IManifestParams {\n return {\n account,\n name: CloudrunManifestService.scopedKind(manifest) + ' ' + manifest.metadata.name,\n location: manifest.metadata.namespace == null ? '_' : manifest.metadata.namespace,\n };\n }\n\n private static apiGroup(manifest: IStageManifest): string {\n const parts = (manifest.apiVersion || '_').split('/');\n if (parts.length < 2) {\n return '';\n }\n return parts[0];\n }\n\n private static isCRDGroup(manifest: IStageManifest): boolean {\n return !CloudrunManifestService.BUILT_IN_GROUPS.includes(CloudrunManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (CloudrunManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + CloudrunManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n private static readonly BUILT_IN_GROUPS = [\n '',\n 'core',\n 'batch',\n 'apps',\n 'extensions',\n 'storage.k8s.io',\n 'apiextensions.k8s.io',\n 'apiregistration.k8s.io',\n 'policy',\n 'scheduling.k8s.io',\n 'settings.k8s.io',\n 'authorization.k8s.io',\n 'authentication.k8s.io',\n 'rbac.authorization.k8s.io',\n 'certifcates.k8s.io',\n 'networking.k8s.io',\n ];\n}\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IManifest } from '@spinnaker/core';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport { ManifestStatus } from './ManifestStatus';\nimport type { IStageManifest } from '../../../../manifest/manifest.service';\nimport { CloudrunManifestService } from '../../../../manifest/manifest.service';\n\nexport interface IManifestSubscription {\n id: string;\n unsubscribe: () => void;\n manifest: IManifest;\n}\n\nexport interface IDeployStatusState {\n subscriptions: IManifestSubscription[];\n manifestIds: string[];\n}\n\nexport class DeployStatus extends React.Component<IExecutionDetailsSectionProps, IDeployStatusState> {\n public static title = 'deployStatus';\n\n constructor(props: IExecutionDetailsSectionProps) {\n super(props);\n this.state = { subscriptions: [], manifestIds: [] };\n }\n\n public componentDidMount() {\n this.componentDidUpdate(this.props, this.state);\n }\n\n public componentWillUnmount() {\n this.unsubscribeAll();\n }\n\n public componentDidUpdate(_prevProps: IExecutionDetailsSectionProps, prevState: IDeployStatusState) {\n const manifests: IStageManifest[] = get(this.props.stage, ['context', 'outputs.manifests'], []).filter((m) => !!m);\n const manifestIds = manifests.map((m) => CloudrunManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = CloudrunManifestService.manifestIdentifier(manifest);\n return {\n id,\n unsubscribe: this.subscribeToManifestUpdates(id, manifest),\n manifest: this.stageManifestToIManifest(manifest, this.props.stage.context.account),\n };\n });\n this.setState({ subscriptions, manifestIds });\n }\n }\n\n private subscribeToManifestUpdates(id: string, manifest: IStageManifest): () => void {\n const params = CloudrunManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return CloudrunManifestService.subscribe(this.props.application, params, (updated: IManifest) => {\n const idx = this.state.subscriptions.findIndex((sub) => sub.id === id);\n if (idx !== -1) {\n const subscription = { ...this.state.subscriptions[idx], manifest: updated };\n const subscriptions = [...this.state.subscriptions];\n subscriptions[idx] = subscription;\n this.setState({ subscriptions });\n }\n });\n }\n\n private unsubscribeAll() {\n this.state.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n }\n\n private stageManifestToIManifest(manifest: IStageManifest, account: string): IManifest {\n return {\n name: get(manifest, 'metadata.name', ''),\n moniker: null,\n account,\n cloudProvider: 'cloudrun',\n location: get(manifest, 'metadata.namespace', ''),\n manifest: manifest,\n status: {},\n artifacts: [],\n events: [],\n };\n }\n\n public render() {\n const { name: sectionName, current: currentSection, stage } = this.props;\n const manifests: IManifest[] = this.state.subscriptions.filter((sub) => !!sub.manifest).map((sub) => sub.manifest);\n return (\n <ExecutionDetailsSection name={sectionName} current={currentSection}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {manifests && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n {manifests.map((manifest) => {\n const uid =\n manifest.manifest.metadata.uid || CloudrunManifestService.manifestIdentifier(manifest.manifest);\n return <ManifestStatus key={uid} manifest={manifest} account={stage.context.account} />;\n })}\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n }\n}\n","import type { IStage } from '@spinnaker/core';\nimport {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { DeployStageConfig } from './DeployStageConfig';\nimport { deployValidators } from './deploy.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Cloud Run)',\n description: 'Deploy a Cloud Run manifest yaml/json file.',\n key: 'deployCloudrunManifest',\n cloudProvider: 'cloudrun',\n component: DeployStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployValidators(),\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface ICloudrunProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n };\n}\n\nexport const CloudrunProviderSettings: ICloudrunProviderSettings = (SETTINGS.providers\n .cloudrun as ICloudrunProviderSettings) || { defaults: {} };\nif (CloudrunProviderSettings) {\n CloudrunProviderSettings.resetToOriginal = SETTINGS.resetProvider('cloudrun');\n}\n","import { module } from 'angular';\nimport { cloneDeep } from 'lodash';\nimport { $q } from 'ngimport';\n\nimport type {\n Application,\n IAccountDetails,\n IExpectedArtifact,\n IMoniker,\n IPipeline,\n IServerGroupCommand,\n IServerGroupCommandViewState,\n IStage,\n} from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { CloudrunProviderSettings } from '../../cloudrun.settings';\nimport type { CloudrunDeployDescription } from '../serverGroupTransformer.service';\n\nexport enum ServerGroupSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n\nexport interface ICloudrunServerGroupCommandData {\n command: ICloudrunServerGroupCommand;\n metadata: ICloudrunServerGroupCommandMetadata;\n stack: string;\n freeFormDetails: string;\n configFiles: string[];\n}\n\nexport interface ICloudrunServerGroupCommand extends Omit<IServerGroupCommand, 'source' | 'application'> {\n application?: string;\n stack?: string;\n detail?: string;\n account: string;\n configFiles: string[];\n freeFormDetails: string;\n region: string;\n regions: [];\n isNew?: boolean;\n cloudProvider: string;\n provider: string;\n selectedProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: ICloudrunServerGroupSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ServerGroupSource;\n versioned?: boolean;\n gitCredentialType?: string;\n viewState: IServerGroupCommandViewState;\n mode: string;\n credentials: string;\n sourceType: string;\n configArtifacts: any[];\n interestingHealthProviderNames: [];\n fromArtifact: boolean;\n}\n\nexport interface IViewState {\n mode: string;\n submitButtonLabel: string;\n disableStrategySelection: boolean;\n stage?: IStage;\n pipeline?: IPipeline;\n}\n\nexport interface ICloudrunServerGroupCommandMetadata {\n backingData: any;\n}\n\nexport interface ICloudrunServerGroupSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nconst getSubmitButtonLabel = (mode: string): string => {\n switch (mode) {\n case 'createPipeline':\n return 'Add';\n case 'editPipeline':\n return 'Done';\n default:\n return 'Create';\n }\n};\n\nexport class CloudrunV2ServerGroupCommandBuilder {\n // new add servergroup\n public buildNewServerGroupCommand(app: Application): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'create');\n }\n\n // add servergroup from deploy stage of pipeline\n public buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline) {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommandForPipeline(_stage, pipeline);\n }\n\n // edit servergroup from deploy stage of pipeline\n // add servergroup from deploy stage of pipeline\n public buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ) {\n return CloudrunServerGroupCommandBuilder.buildServerGroupCommandFromPipeline(app, cluster, _stage, pipeline);\n }\n}\n\nexport class CloudrunServerGroupCommandBuilder {\n public static $inject = ['$q'];\n public static ServerGroupCommandIsValid(command: ICloudrunServerGroupCommand): boolean {\n if (!command.moniker) {\n return false;\n }\n\n if (!command.moniker.app) {\n return false;\n }\n\n return true;\n }\n\n public static copyAndCleanCommand(input: ICloudrunServerGroupCommand): ICloudrunServerGroupCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n // deploy stage : construct servergroup command\n public static buildNewServerGroupCommandForPipeline(stage: IStage, pipeline: IPipeline): any {\n const command: any = this.buildNewServerGroupCommand(\n { name: pipeline.application } as Application,\n 'cloudrun',\n 'createPipeline',\n );\n command.viewState = {\n ...command.viewState,\n pipeline,\n requiresTemplateSelection: true,\n stage,\n };\n return command;\n }\n\n private static getExpectedArtifacts(pipeline: IPipeline): IExpectedArtifact[] {\n return pipeline.expectedArtifacts || [];\n }\n\n public static buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'editPipeline').then(\n (command: ICloudrunServerGroupCommandData) => {\n command = {\n ...command,\n ...cluster,\n\n backingData: {\n ...command.metadata.backingData.backingData,\n\n expectedArtifacts: CloudrunServerGroupCommandBuilder.getExpectedArtifacts(pipeline),\n },\n credentials: cluster.account || command.metadata.backingData.credentials,\n viewState: {\n ...command.metadata.backingData.viewState,\n stage: _stage,\n pipeline,\n },\n } as ICloudrunServerGroupCommandData;\n return command;\n },\n );\n }\n\n public static getCredentials(accounts: IAccountDetails[]): string {\n const accountNames: string[] = (accounts || []).map((account) => account.name);\n const defaultCredentials: string = CloudrunProviderSettings.defaults.account;\n\n return accountNames.includes(defaultCredentials) ? defaultCredentials : accountNames[0];\n }\n\n public static getRegion(accounts: any[], credentials: string): string {\n const account = accounts.find((_account) => _account.name === credentials);\n return account ? account.region : null;\n }\n\n // new servergroup command\n public static buildNewServerGroupCommand(\n app: Application,\n sourceAccount: string,\n mode: string,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('cloudrun'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n return $q.all(dataToFetch).then((backingData: { accounts: IAccountDetails[] }) => {\n const { accounts } = backingData;\n\n const account = accounts.some((a) => a.name === sourceAccount)\n ? accounts.find((a) => a.name === sourceAccount).name\n : accounts.length\n ? accounts[0].name\n : null;\n const viewState: IViewState = {\n mode,\n submitButtonLabel: getSubmitButtonLabel(mode),\n disableStrategySelection: mode === 'create',\n };\n const credentials = account ? account : this.getCredentials(accounts);\n const region = this.getRegion(backingData.accounts, credentials);\n const cloudProvider = 'cloudrun';\n\n return {\n command: {\n application: app.name,\n configFiles: [''],\n cloudProvider,\n selectedProvider: cloudProvider,\n provider: cloudProvider,\n region,\n credentials,\n gitCredentialType: 'NONE',\n manifest: null,\n sourceType: 'git',\n configArtifacts: [],\n interestingHealthProviderNames: [],\n fromArtifact: false,\n account,\n viewState,\n },\n metadata: {\n backingData,\n },\n } as ICloudrunServerGroupCommandData;\n });\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.cloudrun.serverGroup.commandBuilder.service';\n\nmodule(CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER, []).service(\n 'cloudrunV2ServerGroupCommandBuilder',\n CloudrunV2ServerGroupCommandBuilder,\n);\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { Application, IAccount, IServerGroup } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField, NameUtils, ReactInjector, ServerGroupNamePreview } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n formik: IWizardServerGroupBasicSettingsProps['formik'];\n onEnterStack: (stack: string) => void;\n detailsChanged: (detail: string) => void;\n app: Application;\n}\n\nexport interface IServerGroupBasicSettingsState {\n namePreview: string;\n createsNewCluster: boolean;\n latestServerGroup: IServerGroup;\n}\n\nexport function ServerGroupBasicSettings({\n accounts,\n onAccountSelect,\n selectedAccount,\n formik,\n onEnterStack,\n detailsChanged,\n app,\n}: IServerGroupBasicSettingsProps) {\n const { values } = formik;\n const { stack = '', freeFormDetails } = values;\n\n const namePreview = NameUtils.getClusterName(app.name, stack, freeFormDetails);\n const createsNewCluster = !app.clusters.find((c) => c.name === namePreview);\n const inCluster = (app.serverGroups.data as IServerGroup[])\n .filter((serverGroup) => {\n return (\n serverGroup.cluster === namePreview &&\n serverGroup.account === values.command.credentials &&\n serverGroup.region === values.command.region\n );\n })\n .sort((a, b) => a.createdTime - b.createdTime);\n const latestServerGroup = inCluster.length ? inCluster.pop() : null;\n\n const navigateToLatestServerGroup = () => {\n const { values } = formik;\n const params = {\n provider: values.command.selectedProvider,\n accountId: latestServerGroup.account,\n region: latestServerGroup.region,\n serverGroup: latestServerGroup.name,\n };\n\n const { $state } = ReactInjector;\n if ($state.is('home.applications.application.insight.clusters')) {\n $state.go('.serverGroup', params);\n } else {\n $state.go('^.serverGroup', params);\n }\n };\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Stack <HelpField id=\"cloudrun.serverGroup.stack\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={stack}\n onChange={(e) => onEnterStack(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Detail <HelpField id=\"cloudrun.serverGroup.detail\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={freeFormDetails}\n onChange={(e) => detailsChanged(e.target.value)}\n />\n </div>\n </div>\n {!values.command.viewState.hideClusterNamePreview && (\n <ServerGroupNamePreview\n createsNewCluster={createsNewCluster}\n latestServerGroupName={latestServerGroup?.name}\n mode={values.command.viewState.mode}\n namePreview={namePreview}\n navigateToLatestServerGroup={navigateToLatestServerGroup}\n />\n )}\n </div>\n );\n}\n\nexport interface IWizardServerGroupBasicSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n app: Application;\n}\n\nexport class WizardServerGroupBasicSettings extends React.Component<IWizardServerGroupBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n private stackChanged = (stack: string): void => {\n const { setFieldValue, values } = this.props.formik;\n values.command.stack = stack;\n setFieldValue('stack', stack);\n };\n\n private freeFormDetailsChanged = (freeFormDetails: string) => {\n const { setFieldValue, values } = this.props.formik;\n values.command.freeFormDetails = freeFormDetails;\n setFieldValue('freeFormDetails', freeFormDetails);\n };\n\n public render() {\n const { formik, app } = this.props;\n return (\n <ServerGroupBasicSettings\n accounts={formik.values.metadata?.backingData?.accounts || []}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command?.account || ''}\n onEnterStack={this.stackChanged}\n formik={formik}\n detailsChanged={this.freeFormDetailsChanged}\n app={app}\n />\n );\n }\n}\n","import type { FormikProps } from 'formik';\nimport React, { useState } from 'react';\n\nimport { HelpField, TextAreaInput } from '@spinnaker/core';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupConfigFilesSettingsProps {\n configFiles: string[];\n onEnterConfig: (file: string[]) => void;\n}\ntype configFiles = IServerGroupConfigFilesSettingsProps['configFiles'];\n\nexport function ServerGroupConfigFilesSettings({ configFiles, onEnterConfig }: IServerGroupConfigFilesSettingsProps) {\n const [configValues, setConfigValues] = useState<configFiles>(configFiles);\n\n function mapTabToSpaces(event: any, i: number) {\n if (event.which === 9) {\n event.preventDefault();\n const cursorPosition = event.target.selectionStart;\n const inputValue = event.target.value;\n event.target.value = `${inputValue.substring(0, cursorPosition)} ${inputValue.substring(cursorPosition)}`;\n event.target.selectionStart += 2;\n }\n const newConfigValues = [...configValues];\n newConfigValues[i] = event.target.value;\n setConfigValues(newConfigValues);\n onEnterConfig(newConfigValues);\n }\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n {configValues.map((configFile, index) => (\n <>\n <div className=\"col-md-3 sm-label-right\">\n Service Yaml\n <HelpField id=\"cloudrun.serverGroup.configFiles\" />{' '}\n </div>\n <div className=\"col-md-8\" key={index}>\n <TextAreaInput\n name={'text' + index}\n value={configFile}\n rows={10}\n onChange={(e) => mapTabToSpaces(e, index)}\n />\n </div>\n </>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface IWizardServerGroupConfigFilesSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n}\n\nexport class WizardServerGroupConfigFilesSettings extends React.Component<IWizardServerGroupConfigFilesSettingsProps> {\n private configUpdated = (configFiles: string[]): void => {\n const { formik } = this.props;\n formik.values.command.configFiles = configFiles;\n formik.setFieldValue('configFiles', configFiles);\n };\n\n // yaml config files input from server group wizard\n public render() {\n const { formik } = this.props;\n return (\n <ServerGroupConfigFilesSettings\n configFiles={formik.values.configFiles || formik.values.command.configFiles}\n onEnterConfig={this.configUpdated}\n />\n );\n }\n}\n","import React from 'react';\nimport type { Application, IModalComponentProps, IStage } from '@spinnaker/core';\n//import type { IModalInstanceService } from 'angular-ui-bootstrap';\nimport { noop, ReactInjector, ReactModal, TaskMonitor, WizardModal, WizardPage } from '@spinnaker/core';\nimport { WizardServerGroupBasicSettings } from './BasicSettings';\nimport { WizardServerGroupConfigFilesSettings } from './ConfigFiles';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\nimport { CloudrunServerGroupCommandBuilder } from '../serverGroupCommandBuilder.service';\n\nexport interface ICloudrunServerGroupModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: ICloudrunServerGroupCommandData;\n isNew?: boolean;\n}\n\nexport interface ICloudrunServerGroupModalState {\n command: ICloudrunServerGroupCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ServerGroupWizard extends React.Component<ICloudrunServerGroupModalProps, ICloudrunServerGroupModalState> {\n public static defaultProps: Partial<ICloudrunServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private _isUnmounted = false;\n\n /* private serverGroupWriter: ServerGroupWriter; */\n public static show(props: ICloudrunServerGroupModalProps): Promise<ICloudrunServerGroupCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ServerGroupWizard, props, modalProps);\n }\n\n constructor(props: ICloudrunServerGroupModalProps) {\n super(props);\n if (!props.command) {\n CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(props.application, 'cloudrun', 'create').then(\n (command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n },\n );\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as ICloudrunServerGroupCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${\n props.command.command.viewState.submitButtonLabel === 'Create' ? 'Creating' : 'Updating'\n } your Server Group`,\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n private onTaskComplete = () => {\n this.props.application.serverGroups.refresh();\n this.props.application.serverGroups.onNextRefresh(null, this.onApplicationRefresh);\n };\n\n protected onApplicationRefresh = (): void => {\n if (this._isUnmounted) {\n return;\n }\n\n const { command } = this.props;\n const { taskMonitor } = this.state;\n const cloneStage = taskMonitor.task.execution.stages.find((stage: IStage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][command.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: command.command.credentials,\n region: command.command.region,\n provider: 'cloudrun',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (ReactInjector.$state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n ReactInjector.$state.go(transitionTo, newStateParams);\n }\n }\n };\n\n private submit = (c: ICloudrunServerGroupCommandData): void => {\n const command: any = CloudrunServerGroupCommandBuilder.copyAndCleanCommand(c.command);\n const forPipelineConfig = command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline';\n if (forPipelineConfig) {\n this.props.closeModal && this.props.closeModal(command);\n } else {\n //command.viewState.mode = 'create';\n const submitMethod = () => ReactInjector.serverGroupWriter.cloneServerGroup(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n return null;\n }\n };\n public render() {\n const { dismissModal, application } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n const labelButton = this.state.command.command.viewState.submitButtonLabel;\n\n return (\n <WizardModal<ICloudrunServerGroupCommandData>\n heading={`${labelButton === 'Add' || labelButton === 'Create' ? 'Create New' : 'Update'} Server Group`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={labelButton}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => (\n <WizardServerGroupBasicSettings ref={innerRef} formik={formik} app={application} />\n )}\n />\n\n <WizardPage\n label=\"Service Yaml\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardServerGroupConfigFilesSettings ref={innerRef} formik={formik} />}\n />\n </>\n )}\n />\n );\n }\n}\n","export class CloudrunHealth {\n public static PLATFORM = 'Cloud Run Service';\n}\n","import type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { Application, ILoadBalancer, IServerGroup, ServerGroupWriter } from '@spinnaker/core';\nimport { ConfirmationModalService, SERVER_GROUP_WRITER, ServerGroupReader } from '@spinnaker/core';\nimport { CloudrunHealth } from '../../common/cloudrunHealth';\nimport type { ICloudrunServerGroup } from '../../interfaces';\n\ninterface IServerGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunServerGroupDetailsController implements IController {\n public state = { loading: true };\n public serverGroup: ICloudrunServerGroup;\n\n public static $inject = ['$state', '$scope', 'serverGroup', 'app', 'serverGroupWriter'];\n constructor(\n private $state: any,\n private $scope: IScope,\n serverGroup: IServerGroupFromStateParams,\n public app: Application,\n private serverGroupWriter: ServerGroupWriter,\n ) {\n this.extractServerGroup(serverGroup)\n .then(() => {\n if (!this.$scope.$$destroyed) {\n this.app.getDataSource('serverGroups').onRefresh(this.$scope, () => this.extractServerGroup(serverGroup));\n }\n })\n .catch(() => this.autoClose());\n }\n\n // destroy existing server group\n public canDestroyServerGroup(): boolean {\n if (this.serverGroup) {\n const isCurrentRevision = this.serverGroup.tags.isLatest;\n if (isCurrentRevision) {\n return false;\n } else if (this.serverGroup.disabled) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n public destroyServerGroup(): void {\n const stateParams = {\n name: this.serverGroup.name,\n accountId: this.serverGroup.account,\n region: this.serverGroup.region,\n };\n\n const taskMonitor = {\n application: this.app,\n title: 'Destroying ' + this.serverGroup.name,\n onTaskComplete: () => {\n if (this.$state.includes('**.serverGroup', stateParams)) {\n this.$state.go('^');\n }\n },\n };\n\n const submitMethod = (params: any) => this.serverGroupWriter.destroyServerGroup(this.serverGroup, this.app, params);\n\n const confirmationModalParams = {\n header: 'Really destroy ' + this.serverGroup.name + '?',\n buttonText: 'Destroy ' + this.serverGroup.name,\n account: this.serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: this.app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: CloudrunHealth.PLATFORM,\n\n interestingHealthProviderNames: [] as string[],\n };\n\n if (this.app.attributes.platformHealthOnlyShowOverride && this.app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = [CloudrunHealth.PLATFORM];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n\n private extractServerGroup({ name, accountId, region }: IServerGroupFromStateParams): PromiseLike<void> {\n return ServerGroupReader.getServerGroup(this.app.name, accountId, region, name).then(\n (serverGroupDetails: IServerGroup) => {\n let fromApp = this.app.getDataSource('serverGroups').data.find((toCheck: IServerGroup) => {\n return toCheck.name === name && toCheck.account === accountId && toCheck.region === region;\n });\n\n if (!fromApp) {\n this.app.getDataSource('loadBalancers').data.some((loadBalancer: ILoadBalancer) => {\n if (loadBalancer.account === accountId) {\n return loadBalancer.serverGroups.some((toCheck: IServerGroup) => {\n let result = false;\n if (toCheck.name === name) {\n fromApp = toCheck;\n result = true;\n }\n return result;\n });\n } else {\n return false;\n }\n });\n }\n\n this.serverGroup = { ...serverGroupDetails, ...fromApp };\n this.state.loading = false;\n },\n );\n }\n}\nexport const CLOUDRUN_SERVER_GROUP_DETAILS_CTRL = 'spinnaker.cloudrun.serverGroup.details.controller';\n\nmodule(CLOUDRUN_SERVER_GROUP_DETAILS_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'cloudrunV2ServerGroupDetailsCtrl',\n CloudrunServerGroupDetailsController,\n);\n","import { module } from 'angular';\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommand } from '../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport class CloudrunV2ServerGroupTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n\n public normalizeServerGroup(serverGroup: IServerGroup): PromiseLike<IServerGroup> {\n return this.$q.resolve(serverGroup);\n }\n\n public convertServerGroupCommandToDeployConfiguration(command: ICloudrunServerGroupCommand): any {\n return new CloudrunDeployDescription(command);\n }\n}\n\nexport class CloudrunDeployDescription {\n public cloudProvider = 'cloudrun';\n public provider = 'cloudrun';\n public credentials: string;\n public account: string;\n public application: string;\n public stack?: string;\n public freeFormDetails?: string;\n public configFiles: string[];\n public region: string;\n public strategy?: string;\n public type?: string;\n public fromArtifact: boolean;\n public configArtifacts: string[];\n public strategyApplication?: string;\n public strategyPipeline?: string;\n public gitCredentialType: string;\n public interestingHealthProviderNames: string[];\n public sourceType: string;\n\n constructor(command: ICloudrunServerGroupCommand) {\n this.credentials = command.credentials;\n this.account = command.credentials;\n this.application = command.application;\n this.stack = command.stack;\n this.freeFormDetails = command.freeFormDetails;\n this.region = command.region;\n this.strategy = command.strategy;\n this.type = command.type;\n this.fromArtifact = command.fromArtifact;\n this.gitCredentialType = command.gitCredentialType;\n this.configFiles = command.configFiles;\n this.sourceType = command.sourceType;\n this.interestingHealthProviderNames = command.interestingHealthProviderNames || [];\n this.configArtifacts = [];\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_TRANSFORMER = 'spinnaker.cloudrun.serverGroup.transformer.service';\nmodule(CLOUDRUN_SERVER_GROUP_TRANSFORMER, []).service(\n 'cloudrunV2ServerGroupTransformer',\n CloudrunV2ServerGroupTransformer,\n);\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { CLOUDRUN_COMPONENT_URL_DETAILS } from './common/componentUrlDetails.component';\nimport { CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE } from './common/loadBalancerMessage.component';\nimport './help/cloudrun.help';\nimport { CLOUDRUN_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';\nimport { CLOUDRUN_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/allocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS } from './loadBalancer/configure/wizard/basicSettings.component';\nimport { CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/stageAllocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL } from './loadBalancer/configure/wizard/wizard.controller';\nimport { CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL } from './loadBalancer/details/details.controller';\nimport { CLOUDRUN_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/loadBalancerTransformer';\nimport logo from './logo/cloudrun.logo.png';\nimport { CLOUDRUN_PIPELINE_MODULE } from './pipeline/pipeline.module';\nimport './pipeline/stages/deployManifest/deployStage';\nimport { CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ServerGroupWizard } from './serverGroup/configure/wizard/serverGroupWizard';\nimport { CLOUDRUN_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';\nimport { CLOUDRUN_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroupTransformer.service';\n\nimport './logo/cloudrun.logo.less';\n\nexport const CLOUDRUN_MODULE = 'spinnaker.cloudrun';\n\nconst requires = [\n CLOUDRUN_COMPONENT_URL_DETAILS,\n CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER,\n CLOUDRUN_SERVER_GROUP_DETAILS_CTRL,\n CLOUDRUN_SERVER_GROUP_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL,\n CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL,\n CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE,\n CLOUDRUN_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS,\n CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_PIPELINE_MODULE,\n CLOUDRUN_INSTANCE_DETAILS_CTRL,\n];\n\nmodule(CLOUDRUN_MODULE, requires).config(() => {\n CloudProviderRegistry.registerProvider('cloudrun', {\n name: 'cloudrun',\n logo: {\n path: logo,\n },\n\n instance: {\n detailsTemplateUrl: require('./instance/details/details.html'),\n detailsController: 'cloudrunInstanceDetailsCtrl',\n },\n serverGroup: {\n CloneServerGroupModal: ServerGroupWizard,\n commandBuilder: 'cloudrunV2ServerGroupCommandBuilder',\n detailsController: 'cloudrunV2ServerGroupDetailsCtrl',\n detailsTemplateUrl: require('./serverGroup/details/details.html'),\n transformer: 'cloudrunV2ServerGroupTransformer',\n skipUpstreamStageCheck: true,\n },\n\n loadBalancer: {\n transformer: 'cloudrunLoadBalancerTransformer',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/wizard/wizard.html'),\n createLoadBalancerController: 'cloudrunLoadBalancerWizardCtrl',\n detailsTemplateUrl: require('./loadBalancer/details/details.html'),\n detailsController: 'cloudrunLoadBalancerDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('cloudrun', ['custom', 'redblack', 'rollingpush', 'rollingredblack']);\n"],"names":["observableFrom","ServerGroupNamePreview"],"mappings":";;;;;;;;;;AAGA,MAAM,oCAA0D,GAAA;AAAA,EAC9D,QAAA,EAAU,EAAE,SAAW,EAAA,GAAA,EAAA;AAAA,EACvB,QAAU,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,CAAA,CAAA;AAWL,MAAM,8BAAiC,GAAA,kDAAA,CAAA;AAE9C,MAAO,CAAA,8BAAA,EAAgC,EAAI,CAAA,CAAA,SAAA,CACzC,6BACA,EAAA,oCAAA,CAAA;;AClBF,MAAM,oCAA6D,GAAA;AAAA,EACjE,UAAU,EAAE,iBAAA,EAAmB,GAAK,EAAA,YAAA,EAAc,KAAK,OAAS,EAAA,GAAA,EAAA;AAAA,EAChE,WAAa,EAAA,wDAAA;AAAA,CAAA,CAAA;AAGR,MAAM,qCAAwC,GAAA,yDAAA,CAAA;AAErD,MAAO,CAAA,qCAAA,EAAuC,EAAI,CAAA,CAAA,SAAA,CAChD,6BACA,EAAA,oCAAA,CAAA,CAAA;;;;;;;;;;;;;;;;ACTF,MAAM,YAAe,GAAA;AAAA,EACnB;AAAA,IACE,GAAK,EAAA,4BAAA;AAAA,IACL,KACE,EAAA,0JAAA;AAAA,GAAA;AAAA,EAGJ;AAAA,IACE,GAAK,EAAA,2BAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAwCT;AAAA,IACE,GAAK,EAAA,6BAAA;AAAA,IACL,KACE,EAAA,yHAAA;AAAA,GAAA;AAAA,EAEJ;AAAA,IACE,GAAK,EAAA,kCAAA;AAAA,IACL,KAAO,EAAA,CAAA,iDAAA,CAAA;AAAA,GAAA;AAAA,EAET;AAAA,IACE,GAAK,EAAA,mCAAA;AAAA,IACL,KAAO,EAAA,qEAAA;AAAA,GAAA;AAAA,EAET;AAAA,IACE,GAAK,EAAA,0BAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,GAAA;AAAA,EAST;AAAA,IACE,GAAK,EAAA,oCAAA;AAAA,IACL,KACE,EAAA,wIAAA;AAAA,GAAA;AAAA,EAEJ;AAAA,IACE,GAAK,EAAA,4CAAA;AAAA,IACL,KACE,EAAA,ySAAA;AAAA,GAAA;AAAA,EAEJ;AAAA,IACE,GAAK,EAAA,2CAAA;AAAA,IACL,KACE,EAAA,+QAAA;AAAA,GAAA;AAAA,EAEJ;AAAA,IACE,GAAK,EAAA,2BAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;AAMX,YAAA,CAAa,QAAQ,CAAC,KAAA,KAAU,qBAAqB,QAAS,CAAA,KAAA,CAAM,KAAK,KAAM,CAAA,KAAA,CAAA,CAAA;;AC9E/E,MAA+D,iCAAA,CAAA;AAAA,EAU7D,WAAA,CAAoB,EAAuB,EAAA,GAAA,EAAkB,QAAmC,EAAA;AAA5E,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA,CAAA;AAAuB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA,CAAA;AATpC,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAE,OAAS,EAAA,IAAA,EAAA,CAAA;AAGnB,IAAY,IAAA,CAAA,SAAA,GAAA,2FAAA,CAAA;AACZ,IAAsB,IAAA,CAAA,mBAAA,GAAA,CAAA;AAAA,4GAAA,CAAA,CAAA;AAM3B,IAAK,IAAA,CAAA,GAAA,CACF,QACA,IAAK,CAAA,MAAM,KAAK,gBAAiB,CAAA,QAAA,CAAA,CAAA,CACjC,IAAK,CAAA,CAAC,eAAoB,KAAA;AACzB,MAAA,IAAA,CAAK,QAAW,GAAA,eAAA,CAAA;AAChB,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAEtB,MAAM,MAAM;AACX,MAAA,IAAA,CAAK,qBAAqB,QAAS,CAAA,UAAA,CAAA;AACnC,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAInB,iBAAiB,QAAmE,EAAA;AAC1F,IAAM,MAAA,wBAAA,GAA2B,CAAC,UAAgC,KAAA;AAChE,MAAA,OAAO,WAAW,SAAU,CAAA,IAAA,CAAK,CAAC,aAAkB,KAAA,aAAA,CAAc,OAAO,QAAS,CAAA,UAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGpF,IAAA,MAAM,cAAiC,WAAY,CAAA;AAAA,MACjD,IAAA,CAAK,GAAI,CAAA,aAAA,CAAc,cAAgB,CAAA,CAAA,IAAA;AAAA,MACvC,IAAA,CAAK,GAAI,CAAA,aAAA,CAAc,eAAiB,CAAA,CAAA,IAAA;AAAA,MACxC,IAAA,CAAK,IAAI,aAAc,CAAA,eAAA,CAAA,CAAiB,KAAK,GAAI,CAAA,CAAC,iBAAgC,YAAa,CAAA,YAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGjG,IAAM,MAAA,eAAA,GAAkB,YAAY,IAAK,CAAA,wBAAA,CAAA,CAAA;AAEzC,IAAA,IAAI,eAAiB,EAAA;AACnB,MAAA,MAAM,sBAAoD,GAAA;AAAA,QACxD,QAAQ,eAAgB,CAAA,MAAA;AAAA,QACxB,SAAS,eAAgB,CAAA,OAAA;AAAA,OAAA,CAAA;AAE3B,MAAI,IAAA,eAAA,CAAgB,aAAa,aAAe,EAAA;AAC9C,QAAA,sBAAA,CAAuB,cAAc,eAAgB,CAAA,IAAA,CAAA;AAAA,OAAA;AAEvD,MAAA,oBAAA,CAAqB,qBAAqB,WAAa,EAAA,sBAAA,CAAA,CAAA;AAEvD,MAAO,OAAA,cAAA,CAAe,kBACpB,CAAA,eAAA,CAAgB,OAChB,EAAA,eAAA,CAAgB,QAChB,QAAS,CAAA,UAAA,CAAA,CACT,IAAK,CAAA,CAAC,eAAuC,KAAA;AAC7C,QAAA,eAAA,CAAgB,UAAU,eAAgB,CAAA,OAAA,CAAA;AAC1C,QAAA,eAAA,CAAgB,SAAS,eAAgB,CAAA,MAAA,CAAA;AACzC,QAAO,OAAA,eAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAEJ,MAAA;AACL,MAAA,OAAO,KAAK,EAAG,CAAA,MAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AAzDrB,iCAQgB,CAAA,OAAA,GAAU,CAAC,IAAA,EAAM,KAAO,EAAA,UAAA,CAAA,CAAA;AAsDjC,MAAM,8BAAiC,GAAA,+CAAA,CAAA;AAC9C,MAAO,CAAA,8BAAA,EAAgC,EAAI,CAAA,CAAA,UAAA,CAAW,6BAA+B,EAAA,iCAAA,CAAA;;AC7ErF,MAAoE,sCAAA,CAAA;AAAA,EAI3D,qBAAkC,GAAA;AACvC,IAAI,IAAA,IAAA,CAAK,sBAAsB,YAAc,EAAA;AAC3C,MAAA,OAAO,IAAK,CAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,CAAO,KAAK,qBAAsB,CAAA,YAAA,CAAA,CAAA,CAAA;AAAA,KACjE,MAAA;AACL,MAAA,OAAO,IAAK,CAAA,kBAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AAKlB,MAAM,2CAAiE,GAAA;AAAA,EACrE,QAAU,EAAA;AAAA,IACR,qBAAuB,EAAA,GAAA;AAAA,IACvB,gBAAkB,EAAA,GAAA;AAAA,IAClB,kBAAoB,EAAA,GAAA;AAAA,IACpB,kBAAoB,EAAA,GAAA;AAAA,GAAA;AAAA,EAEtB,QAAU,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAmCV,UAAY,EAAA,sCAAA;AAAA,CAAA,CAAA;AAGP,MAAM,qCAAwC,GAAA,yDAAA,CAAA;AAErD,MAAO,CAAA,qCAAA,EAAuC,EAAI,CAAA,CAAA,SAAA,CAChD,oCACA,EAAA,2CAAA,CAAA;;AC9DF,MAAoE,sCAAA,CAAA;AAAA,EAK3D,OAAgB,GAAA;AACrB,IAAK,IAAA,CAAA,wBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGA,aAAsB,GAAA;AAC3B,IAAA,MAAM,wBAAwB,IAAK,CAAA,6BAAA,EAAA,CAAA;AACnC,IAAA,IAAI,sBAAsB,MAAQ,EAAA;AAChC,MAAK,IAAA,CAAA,YAAA,CAAa,gBAAiB,CAAA,sBAAA,CAAuB,IAAK,CAAA;AAAA,QAC7D,cAAc,qBAAsB,CAAA,CAAA,CAAA;AAAA,QACpC,OAAS,EAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAEX,MAAK,IAAA,CAAA,wBAAA,EAAA,CAAA;AAAA,KAAA,MAAA,IACI,KAAK,iBAAmB,EAAA;AACjC,MAAK,IAAA,CAAA,YAAA,CAAa,gBAAiB,CAAA,sBAAA,CAAuB,IAAK,CAAA;AAAA,QAC7D,OAAS,EAAA,CAAA;AAAA,QACT,YAAc,EAAA,EAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAKb,iBAAiB,KAAqB,EAAA;AAC3C,IAAA,IAAA,CAAK,YAAa,CAAA,gBAAA,CAAiB,sBAAuB,CAAA,MAAA,CAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AACxE,IAAK,IAAA,CAAA,wBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGA,mBAA+B,GAAA;AACpC,IACE,OAAA,IAAA,CAAK,YAAa,CAAA,gBAAA,CAAiB,sBAAuB,CAAA,MAAA,CACxD,CAAC,GAAA,EAAK,qBAA0B,KAAA,GAAA,GAAM,qBAAsB,CAAA,OAAA,EAC5D,CACI,CAAA,KAAA,GAAA,CAAA;AAAA,GAAA;AAAA,EAIH,wBAAiC,GAAA;AACtC,IAAA,IAAA,CAAK,qBAAqB,IAAK,CAAA,6BAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAG1B,aAAyB,GAAA;AAC9B,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAO,OAAA,IAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAO,OAAA,IAAA,CAAK,gCAAgC,MAAS,GAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIlD,sBAAsB,eAAkC,EAAA;AAC7D,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAO,OAAA,CAAC,KAAK,YAAa,CAAA,YAAA,CAAa,IAAI,CAAC,WAAA,KAAgB,WAAY,CAAA,IAAA,CAAA,CAAM,QAAS,CAAA,eAAA,CAAA,CAAA;AAAA,KAClF,MAAA;AACL,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIH,6BAA0C,GAAA;AAChD,IAAM,MAAA,0BAAA,GAA6B,KAAK,YAAa,CAAA,gBAAA,CAAiB,uBAAuB,GAC3F,CAAA,CAAC,gBAAgB,WAAY,CAAA,YAAA,CAAA,CAAA;AAE/B,IAAA,MAAM,kBAAkB,IAAK,CAAA,YAAA,CAAa,aAAa,GAAI,CAAA,CAAC,gBAAgB,WAAY,CAAA,IAAA,CAAA,CAAA;AACxF,IAAA,OAAO,WAAW,eAAiB,EAAA,0BAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIvC,MAAM,qCAA8D,GAAA;AAAA,EAClE,UAAU,EAAE,YAAA,EAAc,GAAK,EAAA,iBAAA,EAAmB,KAAK,WAAa,EAAA,GAAA,EAAA;AAAA,EACpE,UAAY,EAAA,sCAAA;AAAA,EACZ,WAAa,EAAA,yEAAA;AAAA,CAAA,CAAA;AAGR,MAAM,qCAAwC,GAAA,mDAAA,CAAA;AAErD,MAAO,CAAA,qCAAA,EAAuC,EAAI,CAAA,CAAA,SAAA,CAChD,mCACA,EAAA,qCAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5EF,MAA8D,gCAAA,CAAA;AAAA,EAAA,OAI7C,2BAA2B,gBAAkC,EAAA;AAC1E,IAAA,MAAM,SAAS,cAAe,CAAA,WAAA,CAAY,KAAK,CAAC,CAAA,KAAM,EAAE,GAAQ,KAAA,gBAAA,CAAA,CAAA;AAChE,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,OAAO,MAAO,CAAA,KAAA,CAAA;AAAA,KACT,MAAA;AACL,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIJ,QAAiB,GAAA;AACtB,IAAK,IAAA,CAAA,iBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGC,iBAA0B,GAAA;AAChC,IAAA,IAAI,IAAK,CAAA,qBAAA,CAAsB,OAAW,IAAA,IAAA,CAAK,sBAAsB,MAAQ,EAAA;AAC3E,MAAA,MAAM,WAAc,GAAA,gCAAA,CAAiC,0BACnD,CAAA,IAAA,CAAK,qBAAsB,CAAA,MAAA,CAAA,CAAA;AAE7B,MAAA,IAAA,CAAK,cAAiB,GAAA,CAAA,EAAG,WAAgB,CAAA,EAAA,EAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAC/D,MAAA;AACL,MAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AAK5B,MAAM,4BAAkD,GAAA;AAAA,EACtD,QAAA,EAAU,EAAE,qBAAuB,EAAA,GAAA,EAAA;AAAA,EACnC,UAAY,EAAA,gCAAA;AAAA,EACZ,QAAU,EAAA,CAAA,2FAAA,CAAA;AAAA,CAAA,CAAA;AAGZ,MAAyE,2CAAA,CAAA;AAAA,EAAzE,WA3CA,GAAA;AA8CS,IAAA,IAAA,CAAA,OAAA,GAAU,cAAe,CAAA,WAAA,CAAA;AAAA,GAAA;AAAA,EAKzB,OAAU,GAAA;AACf,IAAK,IAAA,CAAA,qBAAA,CAAsB,UAAU,IAAK,CAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAGrC,qBAAkC,GAAA;AACvC,IAAI,IAAA,IAAA,CAAK,sBAAsB,YAAc,EAAA;AAC3C,MAAA,OAAO,IAAK,CAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,CAAO,KAAK,qBAAsB,CAAA,YAAA,CAAA,CAAA,CAAA;AAAA,KACjE,MAAA;AACL,MAAA,OAAO,IAAK,CAAA,kBAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AAKlB,MAAM,uCAA6D,GAAA;AAAA,EACjE,QAAU,EAAA;AAAA,IACR,WAAa,EAAA,GAAA;AAAA,IACb,MAAQ,EAAA,GAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,IAAM,EAAA,GAAA;AAAA,IACN,qBAAuB,EAAA,GAAA;AAAA,IACvB,gBAAkB,EAAA,GAAA;AAAA,IAClB,kBAAoB,EAAA,GAAA;AAAA,IACpB,kBAAoB,EAAA,GAAA;AAAA,GAAA;AAAA,EAEtB,UAAY,EAAA,2CAAA;AAAA,EACZ,WAAa,EAAA,2FAAA;AAAA,CAAA,CAAA;AAGR,MAAM,2CACX,GAAA,8DAAA,CAAA;AACF,MAAA,CAAO,6CAA6C,EACjD,CAAA,CAAA,SAAA,CAAU,yCAA2C,EAAA,uCAAA,CAAA,CACrD,UAAU,8BAAgC,EAAA,4BAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1DmE,MAAA,qCAAA,CAAA;AAAA,EAAA,OAYhG,6CACZ,KACkC,EAAA;AAClC,IAAA,MAAM,yBAAyB,MAC7B,CAAA,KAAA,CAAM,cACN,EAAA,CAAC,KAAU,aAAuB,KAAA;AAChC,MAAM,MAAA,EAAE,cAAc,OAAY,EAAA,GAAA,aAAA,CAAA;AAClC,MAAO,OAAA,GAAA,CAAI,MAAO,CAAA,EAAE,OAAS,EAAA,YAAA,EAAA,CAAA,CAAA;AAAA,KAE/B,EAAA,EAAA,CAAA,CAAA;AAEF,IAAA,OAAO,EAAE,sBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGX,YAAY,YAAqC,EAAA;AAC/C,IAAK,IAAA,CAAA,WAAA,GAAc,YAAa,CAAA,OAAA,IAAW,YAAa,CAAA,WAAA,CAAA;AACxD,IAAA,IAAA,CAAK,UAAU,IAAK,CAAA,WAAA,CAAA;AACpB,IAAA,IAAA,CAAK,gBAAgB,YAAa,CAAA,aAAA,CAAA;AAClC,IAAA,IAAA,CAAK,mBAAmB,YAAa,CAAA,IAAA,CAAA;AACrC,IAAA,IAAA,CAAK,OAAO,YAAa,CAAA,IAAA,CAAA;AACzB,IAAA,IAAA,CAAK,SAAS,YAAa,CAAA,MAAA,CAAA;AAC3B,IAAK,IAAA,CAAA,cAAA,GAAiB,aAAa,cAAkB,IAAA,KAAA,CAAA;AACrD,IAAA,IAAA,CAAK,eAAe,YAAa,CAAA,YAAA,CAAA;AAAA,GAAA;AAAA,EAG5B,wBAA2B,GAAA;AAChC,IAAA,IAAA,CAAK,gBAAiB,CAAA,sBAAA,CAAuB,OAAQ,CAAA,CAAC,WAAgB,KAAA;AACpE,MAAY,WAAA,CAAA,OAAA,GAAU,YAAY,OAAU,GAAA,GAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIzC,2BAA8B,GAAA;AACnC,IAAA,IAAA,CAAK,gBAAiB,CAAA,sBAAA,CAAuB,OAAQ,CAAA,CAAC,WAAgB,KAAA;AAEpE,MAAY,WAAA,CAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAKN,MAAA,+BAAA,CAAA;AAAA,EAE3C,YAAoB,EAAkB,EAAA;AAAlB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EACb,sBAAsB,YAAyD,EAAA;AACpF,IAAA,YAAA,CAAa,WAAW,YAAa,CAAA,IAAA,CAAA;AACrC,IAAa,YAAA,CAAA,cAAA,GAAiB,IAAK,CAAA,mBAAA,CAAoB,YAAa,CAAA,YAAA,CAAA,CAAA;AACpE,IAAA,YAAA,CAAa,SAAY,GAAA,EAAA,CAAA;AACzB,IAAa,YAAA,CAAA,YAAA,CAAa,OAAQ,CAAA,CAAC,WAAgB,KAAA;AACjD,MAAA,WAAA,CAAY,UAAU,YAAa,CAAA,OAAA,CAAA;AACnC,MAAA,WAAA,CAAY,SAAS,YAAa,CAAA,MAAA,CAAA;AAElC,MAAA,IAAI,YAAY,iBAAmB,EAAA;AACjC,QAAA,WAAA,CAAY,oBAAqB,WAAY,CAAA,iBAAA,CAA0B,GAAI,CAAA,CAAC,QAAkB,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAEhG,MAAA,WAAA,CAAY,SAAY,GAAA,WAAA,CAAY,SACjC,CAAA,MAAA,CAAO,WAAY,CAAA,iBAAA,IAAqB,EACxC,CAAA,CAAA,GAAA,CAAI,CAAC,QAAA,KAAkB,IAAK,CAAA,iBAAA,CAAkB,QAAU,EAAA,YAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG7D,IAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,YAAa,CAAA,YAAA,EAAc,EAAE,UAAY,EAAA,KAAA,EAAA,CAAA,CAAA;AAC3E,IAAA,YAAA,CAAa,SAAY,GAAA,KAAA,CAAM,kBAAoB,CAAA,CAAA,GAAA,CAAI,aAAa,OAAU,EAAA,CAAA,KAAA,EAAA,CAAA;AAC9E,IAAO,OAAA,IAAA,CAAK,GAAG,OAAQ,CAAA,YAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGlB,6BAAA,CACL,cACA,WACoC,EAAA;AACpC,IAAA,OAAO,WACJ,CAAA,aAAA,CAAc,eACd,CAAA,CAAA,KAAA,EAAA,CACA,KAAK,MAAM;AACV,MAAA,MAAM,uBAAuB,WAC1B,CAAA,aAAA,CAAc,iBACd,IAAK,CAAA,IAAA,CAAK,CAAC,SAA6B,KAAA;AACvC,QACE,OAAA,SAAA,CAAU,IAAS,KAAA,YAAA,CAAa,IAC/B,KAAA,SAAA,CAAU,YAAY,YAAa,CAAA,OAAA,IAAW,SAAU,CAAA,OAAA,KAAY,YAAa,CAAA,WAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAIxF,MAAA,IAAI,oBAAsB,EAAA;AACxB,QAAa,YAAA,CAAA,YAAA,GAAe,UAAU,oBAAqB,CAAA,YAAA,CAAA,CAAA;AAAA,OAAA;AAE7D,MAAO,OAAA,YAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIN,uCACL,YACuC,EAAA;AACvC,IAAA,OAAO,IAAI,qCAAsC,CAAA,YAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAG3C,oBAAoB,YAA+C,EAAA;AACzE,IAAM,MAAA,cAAA,GAAkC,MAAM,YAC3C,CAAA,CAAA,GAAA,CAAI,aACJ,OACA,EAAA,CAAA,MAAA,CACC,CAAC,GAAA,EAAsB,QAAkB,KAAA;AACvC,MAAI,IAAA,GAAA,CAAI,UAAU,cAAiB,CAAA,EAAA;AACjC,QAAI,GAAA,CAAA,SAAA,CAAU,SAAS,MAAO,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA;AAAA,OAAA;AAEhC,MAAO,OAAA,GAAA,CAAA;AAAA,KAAA,EAET,EAAE,EAAA,EAAI,CAAG,EAAA,IAAA,EAAM,GAAG,YAAc,EAAA,CAAA,EAAG,SAAW,EAAA,CAAA,EAAG,MAAQ,EAAA,CAAA,EAAG,QAAU,EAAA,CAAA,EAAG,SAAS,CAEnF,EAAA,CAAA,CAAA,KAAA,EAAA,CAAA;AAEH,IAAA,cAAA,CAAe,gBAAgB,KAAM,CAAA,YAAA,CAAA,CAAc,GAAI,CAAA,mBAAA,CAAA,CAAqB,UAAU,KAAQ,EAAA,CAAA,MAAA,CAAA;AAC9F,IAAO,OAAA,cAAA,CAAA;AAAA,GAAA;AAAA,EAGD,iBAAA,CAAkB,UAAe,YAA6B,EAAA;AACpE,IAAA,QAAA,CAAS,WAAW,YAAa,CAAA,IAAA,CAAA;AACjC,IAAA,QAAA,CAAS,UAAU,YAAa,CAAA,OAAA,CAAA;AAChC,IAAA,QAAA,CAAS,SAAS,YAAa,CAAA,MAAA,CAAA;AAC/B,IAAS,QAAA,CAAA,aAAA,GAAgB,CAAC,YAAa,CAAA,IAAA,CAAA,CAAA;AACvC,IAAM,MAAA,MAAA,GAAS,SAAS,MAAU,IAAA,EAAA,CAAA;AAClC,IAAS,QAAA,CAAA,WAAA,GAAc,GAAI,CAAA,QAAA,EAAU,cAAmB,CAAA,IAAA,cAAA,CAAA;AACxD,IAAA,QAAA,CAAS,SAAS,CAAC,MAAA,CAAA,CAAA;AAEnB,IAAO,OAAA,QAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAjFK,+BADT,CACS,UAAU,CAAC,IAAA,CAAA,CAAA;AAqFpB,MAAM,kCAAqC,GAAA,sDAAA;AAElD,MAAO,CAAA,kCAAA,EAAoC,EAAI,CAAA,CAAA,OAAA,CAC7C,iCACA,EAAA,+BAAA,CAAA;;ACtKF,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;AACjC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAC9B;AACA,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,EAAE;AAC1D;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC9C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AAC1B;AACA,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAChD,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B,KAAK;AACL,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;AACnC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,GAAG;AACH;;;;;ACXA,MAAkE,oCAAA,CAAA;AAAA,EAkBhE,WAAA,CACS,QACC,MACA,EAAA,iBAAA,EACA,aACR,YACO,EAAA,KAAA,EACC,iBACA,EAAA,+BAAA,EACA,uBACR,EAAA;AATO,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA,CAAA;AAED,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AACC,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AACA,IAAA,IAAA,CAAA,+BAAA,GAAA,+BAAA,CAAA;AACA,IAAA,IAAA,CAAA,uBAAA,GAAA,uBAAA,CAAA;AA1BH,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAE,OAAS,EAAA,IAAA,EAAA,CAAA;AA4BxB,IAAK,IAAA,CAAA,iBAAA,GAAoB,IAAK,CAAA,iBAAA,GAAoB,MAAS,GAAA,QAAA,CAAA;AAE3D,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAA,IAAA,CAAK,OAAU,GAAA,0BAAA,CAAA;AAAA,KACV,MAAA;AACL,MAAA,IAAA,CAAK,UAAU,CAAQ,KAAA,EAAA;AAAA,QACrB,YAAa,CAAA,IAAA;AAAA,QACb,YAAa,CAAA,MAAA;AAAA,QACb,YAAA,CAAa,WAAW,YAAa,CAAA,WAAA;AAAA,OAAA,CACrC,IAAK,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AACP,MAAA,IAAA,CAAK,gCACF,6BAA8B,CAAA,YAAA,EAAc,WAC5C,CAAA,CAAA,IAAA,CAAK,CAAC,qBAA0B,KAAA;AAC/B,QAAK,IAAA,CAAA,YAAA,GAAe,IAAK,CAAA,+BAAA,CAAgC,sCACvD,CAAA,qBAAA,CAAA,CAAA;AAEF,QAAA,IAAI,YAAa,CAAA,KAAA,IAAS,CAAC,IAAA,CAAK,aAAa,gBAAkB,EAAA;AAC7D,UAAA,IAAA,CAAK,YAAa,CAAA,gBAAA,GAAmB,qCAAsC,CAAA,4CAAA,CACzE,YAAa,CAAA,KAAA,CAAA,CAAA;AAAA,SAEV,MAAA;AACL,UAAK,IAAA,CAAA,YAAA,CAAa,mBAAmB,YAAa,CAAA,gBAAA,CAAA;AAAA,SAAA;AAEpD,QAAA,IAAA,CAAK,YAAa,CAAA,2BAAA,EAAA,CAAA;AAClB,QAAK,IAAA,CAAA,cAAA,EAAA,CAAA;AACL,QAAK,IAAA,CAAA,wBAAA,EAAA,CAAA;AACL,QAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAKtB,MAAc,GAAA;AACnB,IAAM,MAAA,WAAA,GAAc,UAAU,IAAK,CAAA,YAAA,CAAA,CAAA;AACnC,IAAY,WAAA,CAAA,2BAAA,EAAA,CAAA;AACZ,IAAA,OAAO,WAAY,CAAA,YAAA,CAAA;AAEnB,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAO,OAAA,IAAA,CAAK,kBAAkB,KAAM,CAAA,WAAA,CAAA,CAAA;AAAA,KAC/B,MAAA;AACL,MAAO,OAAA,IAAA,CAAK,WAAY,CAAA,MAAA,CAAO,MAAM;AACnC,QAAA,OAAO,kBAAmB,CAAA,kBAAA,CAAmB,WAAa,EAAA,IAAA,CAAK,WAAa,EAAA,QAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAK3E,MAAe,GAAA;AACpB,IAAA,IAAA,CAAK,iBAAkB,CAAA,OAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGlB,gBAA4B,GAAA;AACjC,IAAA,OAAO,KAAK,uBAAwB,CAAA,gBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAG9B,cAAuB,GAAA;AAC7B,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MACjC,aAAa,IAAK,CAAA,WAAA;AAAA,MAClB,KAAO,EAAA,6BAAA;AAAA,MACP,eAAe,IAAK,CAAA,iBAAA;AAAA,MACpB,cAAA,EAAgB,MAAM,IAAK,CAAA,cAAA,EAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIvB,wBAAiC,GAAA;AACvC,IAAK,IAAA,CAAA,uBAAA,CAAwB,OAAO,EAAE,IAAA,EAAM,QAAQ,KAAO,EAAA,IAAA,CAAK,UAAU,QAAS,CAAA;AAAA,MACjF,IAAM,EAAA,gBAAA;AAAA,MACN,OAAS,EAAA,mBAAA;AAAA,MACT,UAAY,EAAA;AAAA,QACV;AAAA,UACE,WAAa,EAAA,oCAAA;AAAA,UACb,SAAA,EAAW,CAAC,gBAAgE,KAAA;AAC1E,YACE,OAAA,gBAAA,CAAiB,uBAAuB,MAAO,CAAA,CAAC,KAAK,WAAgB,KAAA,GAAA,GAAM,WAAY,CAAA,OAAA,EAAS,CAAO,CAAA,KAAA,GAAA,CAAA;AAAA,WAAA;AAAA,UAG3G,SAAW,EAAA,IAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAMX,cAAuB,GAAA;AAC7B,IAAK,IAAA,CAAA,WAAA,CAAY,cAAc,eAAiB,CAAA,CAAA,OAAA,EAAA,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,aAAc,CAAA,eAAA,CAAA,CAAiB,cAAc,IAAK,CAAA,MAAA,EAAQ,MAAM,IAAK,CAAA,oBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGhF,oBAA6B,GAAA;AAEnC,IAAK,IAAA,IAAA,CAAK,OAAe,WAAa,EAAA;AAEpC,MAAA,OAAA;AAAA,KAAA;AAGF,IAAA,IAAA,CAAK,iBAAkB,CAAA,OAAA,EAAA,CAAA;AACvB,IAAA,MAAM,cAAiB,GAAA;AAAA,MACrB,IAAA,EAAM,KAAK,YAAa,CAAA,IAAA;AAAA,MACxB,SAAA,EAAW,KAAK,YAAa,CAAA,WAAA;AAAA,MAC7B,MAAA,EAAQ,KAAK,YAAa,CAAA,MAAA;AAAA,MAC1B,QAAU,EAAA,UAAA;AAAA,KAAA,CAAA;AAGZ,IAAA,IAAI,CAAC,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,wBAA2B,CAAA,EAAA;AACnD,MAAK,IAAA,CAAA,MAAA,CAAO,GAAG,sBAAwB,EAAA,cAAA,CAAA,CAAA;AAAA,KAClC,MAAA;AACL,MAAK,IAAA,CAAA,MAAA,CAAO,GAAG,uBAAyB,EAAA,cAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AApI9C,qCAOgB,OAAU,GAAA;AAAA,EACtB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,iCAAA;AAAA,EACA,yBAAA;AAAA,CAAA,CAAA;AAyHG,MAAM,kCAAqC,GAAA,oDAAA;AAElD,MAAO,CAAA,kCAAA,EAAoC,EAAI,CAAA,CAAA,UAAA,CAC7C,gCACA,EAAA,oCAAA,CAAA;;AC3IF,MAAmE,qCAAA,CAAA;AAAA,EAMjE,WACU,CAAA,SAAA,EACA,MACA,EAAA,MAAA,EACR,cACQ,GACR,EAAA;AALQ,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAEA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA,CAAA;AAVH,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAE,OAAS,EAAA,IAAA,EAAA,CAAA;AAYxB,IAAA,IAAA,CAAK,sBAAyB,GAAA,YAAA,CAAA;AAC9B,IAAA,IAAA,CAAK,IACF,aAAc,CAAA,eAAA,CAAA,CACd,KACA,EAAA,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKd,gBAAyB,GAAA;AAC9B,IAAA,IAAA,CAAK,UAAU,IAAK,CAAA;AAAA,MAClB,WAAa,EAAA,wDAAA;AAAA,MACb,UAAY,EAAA,wCAAA;AAAA,MACZ,IAAM,EAAA,IAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACP,WAAA,EAAa,MAAM,IAAK,CAAA,GAAA;AAAA,QACxB,YAAA,EAAc,MAAM,SAAA,CAAU,IAAK,CAAA,YAAA,CAAA;AAAA,QACnC,OAAO,MAAM,KAAA;AAAA,QACb,mBAAmB,MAAM,KAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKvB,mBAA4B,GAAA;AAClC,IAAK,IAAA,CAAA,YAAA,GAAe,KAAK,GAAI,CAAA,aAAA,CAAc,iBAAiB,IAAK,CAAA,IAAA,CAAK,CAAC,IAAwB,KAAA;AAC7F,MAAO,OAAA,IAAA,CAAK,SAAS,IAAK,CAAA,sBAAA,CAAuB,QAAQ,IAAK,CAAA,OAAA,KAAY,KAAK,sBAAuB,CAAA,SAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGxG,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AACrB,MAAA,IAAA,CAAK,IAAI,aAAc,CAAA,eAAA,CAAA,CAAiB,UAAU,IAAK,CAAA,MAAA,EAAQ,MAAM,IAAK,CAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KACrE,MAAA;AACL,MAAK,IAAA,CAAA,SAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIF,kBAA2B,GAAA;AAChC,IAAA,MAAM,WAAc,GAAA;AAAA,MAClB,aAAa,IAAK,CAAA,GAAA;AAAA,MAClB,KAAA,EAAO,WAAc,GAAA,IAAA,CAAK,YAAa,CAAA,IAAA;AAAA,KAAA,CAAA;AAGzC,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,YAA2C,GAAA;AAAA,QAC/C,aAAA,EAAe,KAAK,YAAa,CAAA,aAAA;AAAA,QACjC,gBAAA,EAAkB,KAAK,YAAa,CAAA,IAAA;AAAA,QACpC,WAAA,EAAa,KAAK,YAAa,CAAA,OAAA;AAAA,OAAA,CAAA;AAEjC,MAAO,OAAA,kBAAA,CAAmB,kBAAmB,CAAA,YAAA,EAAc,IAAK,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGlE,IAAA,wBAAA,CAAyB,OAAQ,CAAA;AAAA,MAC/B,MAAQ,EAAA,gBAAA,GAAmB,IAAK,CAAA,YAAA,CAAa,IAAO,GAAA,GAAA;AAAA,MACpD,UAAA,EAAY,SAAY,GAAA,IAAA,CAAK,YAAa,CAAA,IAAA;AAAA,MAC1C,MAAM,IAAK,CAAA,4BAAA,EAAA;AAAA,MACX,OAAA,EAAS,KAAK,YAAa,CAAA,OAAA;AAAA,MAC3B,iBAAmB,EAAA,WAAA;AAAA,MACnB,YAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIG,qBAAiC,GAAA;AACtC,IAAO,OAAA,IAAA,CAAK,aAAa,IAAS,KAAA,SAAA,CAAA;AAAA,GAAA;AAAA,EAG5B,4BAAuC,GAAA;AAC7C,IAAA,MAAM,mBAAmB,IAAK,CAAA,YAAA,CAAa,aAAa,GAAI,CAAA,CAAC,gBAAgB,WAAY,CAAA,IAAA,CAAA,CAAA;AACzF,IAAA,MAAM,MAAS,GAAA,gBAAA,GAAmB,gBAAiB,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,CAAA;AAChE,IAAA,MAAM,cAAiB,GAAA,gBAAA,GAAmB,gBAAiB,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,CAAA;AAGxE,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAA,MAAM,yBAAyB,gBAAiB,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,CAAA,IAAA,EAAO,aAAa,IAAK,CAAA,EAAA,CAAA,CAAA;AACvF,QAAO,OAAA,CAAA;AAAA;AAAA,0BAAA,EAEa,KAAK,YAAa,CAAA,IAAA,CAAA;AAAA;AAAA,gBAE5B,EAAA,sBAAA,CAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAAA;AAAA,OAKL,MAAA;AACL,QAAO,OAAA,CAAA;AAAA;AAAA,0BAEa,EAAA,IAAA,CAAK,YAAa,CAAA,IAAA,CAAA,qBAAA,EAA4B,gBAAiB,CAAA,CAAA,CAAA,CAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAKhF,MAAA;AACL,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIH,SAAkB,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,OAAO,WAAa,EAAA;AAC3B,MAAA,OAAA;AAAA,KACK,MAAA;AACL,MAAK,IAAA,CAAA,MAAA,CAAO,OAAO,oBAAuB,GAAA,IAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,GAAK,EAAA,IAAA,EAAM,EAAE,QAAU,EAAA,SAAA,EAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA;AAlH5C,sCAKgB,OAAU,GAAA,CAAC,WAAa,EAAA,QAAA,EAAU,UAAU,cAAgB,EAAA,KAAA,CAAA,CAAA;AAkHrE,MAAM,mCAAsC,GAAA,oDAAA;AACnD,MAAO,CAAA,mCAAA,EAAqC,EAAI,CAAA,CAAA,UAAA,CAC9C,iCACA,EAAA,qCAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1IF,WAAe;;ACQf,MAAiE,mCAAA,CAAA;AAAA,EAM/D,WAAA,CACU,SACA,EAAA,iBAAA,EACA,WACR,EAAA;AAHQ,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA,CAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA,CAAA;AARH,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAE,OAAS,EAAA,IAAA,EAAA,CAAA;AAUxB,IAAK,IAAA,CAAA,UAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGA,MAAe,GAAA;AACpB,IAAM,MAAA,MAAA,GAAS,qBAAsB,CAAA,QAAA,CAAS,UAAY,EAAA,cAAA,CAAA,CAAA;AAC1D,IAAM,MAAA,0BAAA,GAA6B,IAAK,CAAA,SAAA,CAAU,IAAK,CAAA;AAAA,MACrD,aAAa,MAAO,CAAA,6BAAA;AAAA,MACpB,UAAA,EAAY,GAAG,MAAO,CAAA,4BAAA,CAAA,QAAA,CAAA;AAAA,MACtB,IAAM,EAAA,IAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACP,WAAA,EAAa,MAAM,IAAK,CAAA,WAAA;AAAA,QACxB,YAAA,EAAc,MAAM,SAAA,CAAU,IAAK,CAAA,oBAAA,CAAA;AAAA,QACnC,OAAO,MAAM,KAAA;AAAA,QACb,mBAAmB,MAAM,IAAA;AAAA,OAAA;AAAA,KAE1B,CAAA,CAAA,MAAA,CAAA;AAEH,IAAA,IAAA,CAAK,kBAAkB,KAAM,CAAA,0BAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGxB,MAAe,GAAA;AACpB,IAAA,IAAA,CAAK,iBAAkB,CAAA,OAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGjB,UAAmB,GAAA;AACzB,IAAA,IAAA,CAAK,WACF,CAAA,aAAA,CAAc,eACd,CAAA,CAAA,KAAA,EAAA,CACA,KAAK,MAAM;AACV,MAAK,IAAA,CAAA,aAAA,GAAiB,KAAK,WAAY,CAAA,aAAA,CAAc,KAAyB,MAC5E,CAAA,CAAC,SAAc,KAAA,SAAA,CAAU,aAAkB,KAAA,UAAA,CAAA,CAAA;AAG7C,MAAI,IAAA,IAAA,CAAK,cAAc,MAAQ,EAAA;AAC7B,QAAK,IAAA,CAAA,oBAAA,GAAuB,KAAK,aAAc,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAEjD,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AA/C7B,mCAKgB,CAAA,OAAA,GAAU,CAAC,WAAA,EAAa,mBAAqB,EAAA,aAAA,CAAA,CAAA;AA+CtD,MAAM,wCAA2C,GAAA,uDAAA,CAAA;AACxD,MAAO,CAAA,wCAAA,EAA0C,EAAI,CAAA,CAAA,UAAA,CACnD,qCACA,EAAA,mCAAA,CAAA;;ACrDF,MAA+D,iCAAA,CAAA;AAAA,EAE7D,WAAA,CAAmB,QAAqB,SAA0B,EAAA;AAA/C,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAqB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA,CAAA;AACtC,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,GAAgB,MAAO,CAAA,KAAA,CAAM,aAAiB,IAAA,EAAA,CAAA;AAC3D,IAAA,MAAA,CAAO,MAAM,aAAgB,GAAA,UAAA,CAAA;AAAA,GAAA;AAAA,EAGxB,eAAwB,GAAA;AAC7B,IAAA,IAAA,CAAK,UACF,IAAK,CAAA;AAAA,MACJ,WAAa,EAAA,6EAAA;AAAA,MACb,UAAY,EAAA,CAAA,2CAAA,CAAA;AAAA,MACZ,OAAS,EAAA;AAAA,QACP,WAAA,EAAa,MAAM,IAAA,CAAK,MAAO,CAAA,WAAA;AAAA,OAAA;AAAA,KAGlC,CAAA,CAAA,MAAA,CAAO,IAAK,CAAA,CAAC,eAAmC,KAAA;AAC/C,MAAK,IAAA,CAAA,MAAA,CAAO,KAAM,CAAA,aAAA,CAAc,IAAK,CAAA,eAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAEtC,MAAM,MAAM;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGV,iBAAiB,KAAe,EAAA;AACrC,IAAM,MAAA,MAAA,GAAS,qBAAsB,CAAA,QAAA,CAAS,UAAY,EAAA,cAAA,CAAA,CAAA;AAC1D,IAAA,IAAA,CAAK,UACF,IAAK,CAAA;AAAA,MACJ,aAAa,MAAO,CAAA,6BAAA;AAAA,MACpB,UAAA,EAAY,GAAG,MAAO,CAAA,4BAAA,CAAA,QAAA,CAAA;AAAA,MACtB,IAAM,EAAA,IAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACP,WAAA,EAAa,MAAM,IAAA,CAAK,MAAO,CAAA,WAAA;AAAA,QAC/B,cAAc,MAAM,SAAA,CAAU,IAAK,CAAA,MAAA,CAAO,MAAM,aAAc,CAAA,KAAA,CAAA,CAAA;AAAA,QAC9D,OAAO,MAAM,KAAA;AAAA,QACb,mBAAmB,MAAM,IAAA;AAAA,OAAA;AAAA,KAG5B,CAAA,CAAA,MAAA,CAAO,IAAK,CAAA,CAAC,mBAAuC,KAAA;AACnD,MAAK,IAAA,CAAA,MAAA,CAAO,KAAM,CAAA,aAAA,CAAc,KAAS,CAAA,GAAA,mBAAA,CAAA;AAAA,KAAA,CAAA,CAE1C,MAAM,MAAM;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGV,mBAAmB,KAAqB,EAAA;AAC7C,IAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,aAAc,CAAA,MAAA,CAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AA1ClC,iCADhB,CACgB,OAAU,GAAA,CAAC,QAAU,EAAA,WAAA,CAAA,CAAA;AA8C9B,MAAM,iCAAoC,GAAA,yDAAA,CAAA;AACjD,MAAA,CAAO,iCAAmC,EAAA,CAAC,wCACxC,CAAA,CAAA,CAAA,MAAA,CAAO,MAAM;AACZ,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,KAAO,EAAA,gCAAA;AAAA,IACP,WAAa,EAAA,uBAAA;AAAA,IACb,GAAK,EAAA,6BAAA;AAAA,IACL,aAAe,EAAA,UAAA;AAAA,IACf,WAAa,EAAA,0EAAA;AAAA,IACb,mBAAqB,EAAA,qFAAA;AAAA,IACrB,uBAAA,EAAyB,CAAC,wBAA0B,EAAA,YAAA,CAAA;AAAA,IACpD,UAAY,EAAA,mCAAA;AAAA,IACZ,YAAc,EAAA,2BAAA;AAAA,IACd,UAAY,EAAA,EAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAGf,WAAW,mCAAqC,EAAA,iCAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrE5C,MAAM,wBAA2B,GAAA,oCAAA,CAAA;AACxC,MAAA,CAAO,0BAA0B,CAAC,iCAAA,CAAA,CAAA;;ACY3B,MAAA,6BAAA,SAA4C,MAAM,SAA+C,CAAA;AAAA,EAAjG,WAjBP,GAAA;AAiBO,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACG,IAAkB,IAAA,CAAA,eAAA,GAAA,CAAC,OAAe,OAAmC,KAAA;AAC3E,MAAA,MAAM,QAAY,GAAA,CAAA,IAAA,CAAK,KAAM,CAAA,QAAA,IAAY,IAAI,KAAM,CAAA,CAAA,CAAA,CAAA;AACnD,MAAA,QAAA,CAAS,KAAS,CAAA,GAAA,OAAA,CAAA;AAClB,MAAA,IAAA,CAAK,MAAM,gBAAiB,CAAA,QAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGtB,IAAA,IAAA,CAAA,eAAA,GAAkB,CAAC,KAAkB,KAAA;AAC3C,MAAA,MAAM,QAAY,GAAA,CAAA,IAAA,CAAK,KAAM,CAAA,QAAA,IAAY,IAAI,KAAM,CAAA,CAAA,CAAA,CAAA;AACnD,MAAA,QAAA,CAAS,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AACvB,MAAA,IAAA,CAAK,MAAM,gBAAiB,CAAA,QAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAGvB,MAAS,GAAA;AACd,IAAA,MAAM,EAAE,KAAA,EAAO,QAAU,EAAA,QAAA,EAAA,GAAa,IAAK,CAAA,KAAA,CAAA;AAE3C,IAAM,MAAA,YAAA,GAAe,CAAC,CAAA,EAAW,OAAoC,KAAA;AACnE,MAAM,MAAA,GAAA,GAAO,CAAC,OAAW,IAAA,KAAA,IAAU,QAAQ,kBAAuB,IAAA,OAAA,CAAQ,QAAY,IAAA,OAAA,CAAQ,QAAS,CAAA,EAAA,CAAA;AACvG,MAAA,2CACG,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,KAAA;AAAA,QAAM,GAAA;AAAA,OAAA,sCAClB,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,WAAA;AAAA,OAAA,sCACZ,qBAAD,EAAA;AAAA,QACE,QAAA;AAAA,QACA,KAAA;AAAA,QACA,kBAAA,EAAoB,WAAW,OAAQ,CAAA,kBAAA;AAAA,QACvC,QAAU,EAAA,CAAC,CAAC,OAAA,IAAW,OAAQ,CAAA,QAAA;AAAA,QAC/B,kBAAkB,CAAC,QAAA,KAAwB,IAAK,CAAA,eAAA,CAAgB,GAAG,EAAE,QAAA,EAAA,CAAA;AAAA,QACrE,0BAAA,EAA4B,CAAC,gBAC3B,KAAA,IAAA,CAAK,gBAAgB,CAAG,EAAA,EAAE,oBAAoB,gBAAiB,CAAA,EAAA,EAAA,CAAA;AAAA,QAEjE,mBAAqB,EAAA,QAAA,CAAS,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,kBAAA,CAAA;AAAA,QAC3C,4BAAA,EAA8B,CAAC,oBAAqB,CAAA,yBAAA,CAAA;AAAA,OAGvD,CAAA,CAAA,EAAA,OAAA,wCACE,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,UAAA;AAAA,OAAA,sCACZ,GAAD,EAAA;AAAA,QAAG,SAAU,EAAA,2BAAA;AAAA,QAA4B,OAAA,EAAS,MAAM,IAAA,CAAK,eAAgB,CAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAMvF,IAAA,MAAM,oBAAuB,GAAA,CAAC,OAAgC,EAAA,CAAA,KAAc,aAAa,CAAG,EAAA,OAAA,CAAA,CAAA;AAE5F,IAAA,uBAEK,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,QAAA,CAAS,GAAI,CAAA,oBAAA,CAAA,EACb,aAAa,QAAS,CAAA,MAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AChEnB,IAAA,cAAA,CAAA;AAAL,CAAA,SAAK,eAAL,EAAA;AACL,EAAO,eAAA,CAAA,MAAA,CAAA,GAAA,MAAA,CAAA;AACP,EAAW,eAAA,CAAA,UAAA,CAAA,GAAA,UAAA,CAAA;AAAA,CAFD,EAAA,cAAA,KAAA,cAAA,GAAA,EAAA,CAAA,CAAA;;ACc0B,SAAA,qBAAA,CAAA,EAAE,QAAU,EAAA,eAAA,EAAiB,eAAgD,EAAA,EAAA;AACjH,EAAA,2CACG,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,iBAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,YAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,yBAAA;AAAA,GAA0B,EAAA,UAAA,sCAC9B,SAAD,EAAA;AAAA,IAAW,EAAG,EAAA,2BAAA;AAAA,GAAA,CAAA,CAAA,sCAEvB,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,UAAA;AAAA,GAAA,sCACZ,kBAAD,EAAA;AAAA,IACE,KAAO,EAAA,eAAA;AAAA,IACP,QAAU,EAAA,CAAC,GAAa,KAAA,eAAA,CAAgB,IAAI,MAAO,CAAA,KAAA,CAAA;AAAA,IACnD,QAAU,EAAA,KAAA;AAAA,IACV,QAAA;AAAA,IACA,QAAS,EAAA,UAAA;AAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA;AAYd,MAAA,2BAAA,SAA0C,MAAM,SAA6C,CAAA;AAAA,EAA7F,WAvCP,GAAA;AAuCO,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACG,IAAA,IAAA,CAAA,cAAA,GAAiB,CAAC,OAA0B,KAAA;AAClD,MAAM,MAAA,EAAE,WAAW,IAAK,CAAA,KAAA,CAAA;AACxB,MAAO,MAAA,CAAA,MAAA,CAAO,QAAQ,OAAU,GAAA,OAAA,CAAA;AAChC,MAAA,MAAA,CAAO,cAAc,SAAW,EAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAG3B,MAAS,GAAA;AACd,IAAM,MAAA,EAAE,WAAW,IAAK,CAAA,KAAA,CAAA;AACxB,IAAA,2CACG,qBAAD,EAAA;AAAA,MACE,QAAU,EAAA,MAAA,CAAO,MAAO,CAAA,QAAA,CAAS,WAAY,CAAA,QAAA;AAAA,MAC7C,iBAAiB,IAAK,CAAA,cAAA;AAAA,MACtB,eAAA,EAAiB,MAAO,CAAA,MAAA,CAAO,OAAQ,CAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AC5CxC,MAAA,sBAAA,SAAqC,MAAM,SAAwC,CAAA;AAAA,EACjF,MAAS,GAAA;AACd,IAAA,MAAM,cAAc,IAAK,CAAA,KAAA,CAAM,WAAc,GAAA,IAAA,CAAK,MAAM,WAAc,GAAA,EAAA,CAAA;AACtE,IAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAI,CAAA,EAAA,IAAA,CAAK,MAAM,KAAU,CAAA,CAAA,GAAA,EAAA,CAAA;AAE1D,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,UAAU,CAAI,CAAA,EAAA,IAAA,CAAK,MAAM,OAAY,CAAA,CAAA,GAAA,EAAA,CAAA;AAChE,IAAA,2CACG,KAAD,EAAA;AAAA,MAAK,KAAA,EAAO,EAAE,SAAW,EAAA,QAAA,EAAA;AAAA,KACvB,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,EAAG,4CACH,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IACG,EAAA,WAAA,EACA,KACA,EAAA,OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACWN,MAAA,eAAA,SAA8B,MAAM,SAGzC,CAAA;AAAA,EAMO,YAAY,KAA8E,EAAA;AAC/F,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AANS,IAAgC,IAAA,CAAA,6BAAA,GAAA;AAAA,MAC/C,oBAAqB,CAAA,yBAAA;AAAA,MACrB,oBAAqB,CAAA,UAAA;AAAA,KAAA,CAAA;AAgBf,IAAA,IAAA,CAAA,gBAAA,GAAmB,MAA6B;AACtD,MAAA,OAAO,IAAI,CAAC,cAAA,CAAe,MAAM,cAAe,CAAA,QAAA,CAAA,EAAW,CAAC,MAAY,MAAA;AAAA,QACtE,OAAO,UAAW,CAAA,MAAA,CAAA;AAAA,QAClB,KAAO,EAAA,MAAA;AAAA,OAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIH,IAA0B,IAAA,CAAA,uBAAA,GAAA,CAAC,aAAqB,SAAyB,KAAA;AAC/E,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,WAAA;AAAA,OAAA,CAAA,CAAA;AAEF,MAAK,IAAA,CAAA,KAAA,CAAM,MAAO,CAAA,aAAA,CAAc,WAAa,EAAA,SAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGvC,IAAA,IAAA,CAAA,0BAAA,GAA6B,CAAC,kBAAqC,KAAA;AACzE,MAAK,IAAA,CAAA,KAAA,CAAM,MAAO,CAAA,aAAA,CAAc,oBAAsB,EAAA,kBAAA,CAAA,CAAA;AACtD,MAAK,IAAA,CAAA,KAAA,CAAM,MAAO,CAAA,aAAA,CAAc,kBAAoB,EAAA,IAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG9C,IAAA,IAAA,CAAA,wBAAA,GAA2B,CAAC,QAAwB,KAAA;AAC1D,MAAK,IAAA,CAAA,KAAA,CAAM,MAAO,CAAA,aAAA,CAAc,oBAAsB,EAAA,IAAA,CAAA,CAAA;AACtD,MAAK,IAAA,CAAA,KAAA,CAAM,MAAO,CAAA,aAAA,CAAc,kBAAoB,EAAA,QAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG9C,IAAA,IAAA,CAAA,oBAAA,GAAuB,MAA+B;AAC5D,MAAA,MAAM,EAAE,mBAAA,EAAqB,iBAAsB,EAAA,GAAA,IAAA,CAAK,MAAM,MAAO,CAAA,MAAA,CAAA;AACrE,MAAQ,OAAA,CAAA,mBAAA,IAAuB,IAC5B,GAAI,CAAA,CAAC,QAAkB,EAAA,kBAAA,EAAoB,EAC3C,EAAA,CAAA,CAAA,CAAA,MAAA,CAAO,iBAAqB,IAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGzB,IAAA,IAAA,CAAA,0BAAA,GAA6B,CAAC,QAA4C,KAAA;AAChF,MAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAO,aAChB,CAAA,qBAAA,EACA,QAAS,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAE,CAAA,kBAAA,CAAA,CAAoB,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,kBAAA,CAAA,CAAA,CAAA;AAE5D,MAAK,IAAA,CAAA,KAAA,CAAM,OAAO,aAChB,CAAA,mBAAA,EACA,SAAS,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAjD3B,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,MAAA,CAAA;AAChC,IAAA,MAAM,SAAmB,GAAA,GAAA,CAAI,KAAM,CAAA,MAAA,CAAO,MAAQ,EAAA,WAAA,CAAA,CAAA;AAClD,IAAA,MAAM,iBAA0B,GAAI,CAAA,KAAA,CAAM,MAAO,CAAA,MAAA,EAAQ,cAAc,cAAe,CAAA,IAAA,CAAA;AACtF,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,aAAa,CAAC,OAAA,CAAQ,SAAc,CAAA,IAAA,cAAA,GAAiB,sBAAsB,SAAa,CAAA,GAAA,EAAA;AAAA,MACxF,WAAA,EAAa,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,IAAA;AAAA,MACpC,KAAA,EAAO,IAAI,KAAO,EAAA,OAAA,CAAA;AAAA,MAClB,OAAA,EAAS,IAAI,KAAO,EAAA,SAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EA8CjB,MAAS,GAAA;AACd,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,MAAA,CAAA;AAChC,IAAA,2CACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,gBAAA,CAAA,sCACH,qBAAD,EAAA;AAAA,MACE,QAAA,EAAU,KAAK,KAAM,CAAA,QAAA;AAAA,MACrB,iBAAiB,CAAC,WAAA,KAAgB,KAAK,KAAM,CAAA,MAAA,CAAO,cAAc,SAAW,EAAA,WAAA,CAAA;AAAA,MAC7E,iBAAiB,KAAM,CAAA,OAAA;AAAA,KAAA,CAAA,sCAExB,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,aAAA;AAAA,KAAA,sCACrB,OAAD,EAAA;AAAA,MACE,SAAU,EAAA,uBAAA;AAAA,MACV,IAAK,EAAA,MAAA;AAAA,MACL,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,IAAA;AAAA,MAC9B,QAAA,EAAU,CAAC,KAAU,KAAA,IAAA,CAAK,MAAM,MAAO,CAAA,aAAA,CAAc,aAAe,EAAA,KAAA,CAAM,MAAO,CAAA,KAAA,CAAA;AAAA,MACjF,QAAQ,EAAA,IAAA;AAAA,KAAA,CAAA,CAAA,sCAGX,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,OAAA;AAAA,KAAA,sCACrB,OAAD,EAAA;AAAA,MACE,SAAU,EAAA,uBAAA;AAAA,MACV,IAAK,EAAA,MAAA;AAAA,MACL,OAAO,KAAM,CAAA,KAAA;AAAA,MACb,QAAA,EAAU,CAAC,KAAU,KAAA,IAAA,CAAK,MAAM,MAAO,CAAA,aAAA,CAAc,OAAS,EAAA,KAAA,CAAM,MAAO,CAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA,sCAG9E,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,SAAA;AAAA,KAAA,sCACrB,OAAD,EAAA;AAAA,MACE,SAAU,EAAA,uBAAA;AAAA,MACV,IAAK,EAAA,MAAA;AAAA,MACL,OAAO,KAAM,CAAA,OAAA;AAAA,MACb,QAAA,EAAU,CAAC,KAAU,KAAA,IAAA,CAAK,MAAM,MAAO,CAAA,aAAA,CAAc,SAAW,EAAA,KAAA,CAAM,MAAO,CAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA,sCAGhF,sBAAD,EAAA;AAAA,MACE,WAAA,EAAa,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,IAAA;AAAA,MACpC,OAAO,KAAM,CAAA,KAAA;AAAA,MACb,SAAS,KAAM,CAAA,OAAA;AAAA,KAGjB,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAD,IACA,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,wBAAA,CAAA,sCACH,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,iBAAA;AAAA,MAAkB,OAAQ,EAAA,0BAAA;AAAA,KAAA,sCAC/C,gBAAD,EAAA;AAAA,MACE,SAAS,IAAK,CAAA,gBAAA,EAAA;AAAA,MACd,QAAA,EAAU,CAAC,CAAW,KAAA,IAAA,CAAK,MAAM,MAAO,CAAA,aAAA,CAAc,QAAU,EAAA,CAAA,CAAE,MAAO,CAAA,KAAA,CAAA;AAAA,MACzE,OAAO,KAAM,CAAA,MAAA;AAAA,KAAA,CAAA,CAAA,EAGhB,KAAM,CAAA,MAAA,KAAW,cAAe,CAAA,IAAA,wCAC9B,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,UAAA;AAAA,KAAA,sCACrB,UAAD,EAAA;AAAA,MAAY,UAAU,IAAK,CAAA,uBAAA;AAAA,MAAyB,KAAA,EAAO,KAAK,KAAM,CAAA,WAAA;AAAA,KAAA,CAAA,CAAA,EAGzE,MAAM,MAAW,KAAA,cAAA,CAAe,QAC/B,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACG,6BAAD,EAAA;AAAA,MACE,UAAU,KAAM,CAAA,gBAAA;AAAA,MAChB,8BAA8B,IAAK,CAAA,6BAAA;AAAA,MACnC,oBAAoB,KAAM,CAAA,kBAAA;AAAA,MAC1B,OAAQ,EAAA,oCAAA;AAAA,MACR,KAAM,EAAA,mBAAA;AAAA,MACN,kBAAkB,IAAK,CAAA,wBAAA;AAAA,MACvB,0BAA4B,EAAA,CAAC,QAAgC,KAAA,IAAA,CAAK,2BAA2B,QAAS,CAAA,EAAA,CAAA;AAAA,MACtG,QAAA,EAAU,KAAK,KAAM,CAAA,QAAA;AAAA,MACrB,KAAA;AAAA,KAAA,CAAA,sCAED,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,uBAAA;AAAA,MAAwB,OAAQ,EAAA,4CAAA;AAAA,KAAA,sCACrD,aAAD,EAAA;AAAA,MACE,OAAA,EAAS,MAAM,wBAA6B,KAAA,IAAA;AAAA,MAC5C,QAAA,EAAU,CAAC,CAAW,KAAA,IAAA,CAAK,MAAM,MAAO,CAAA,aAAA,CAAc,0BAA4B,EAAA,CAAA,CAAE,MAAO,CAAA,OAAA,CAAA;AAAA,MAC3F,IAAK,EAAA,iCAAA;AAAA,KAAA,CAAA,CAAA,CAAA,sCAKZ,gBAAD,EAAA;AAAA,MAAkB,KAAM,EAAA,4BAAA;AAAA,MAA6B,OAAQ,EAAA,2CAAA;AAAA,KAAA,sCAC1D,6BAAD,EAAA;AAAA,MACE,UAAU,IAAK,CAAA,oBAAA,EAAA;AAAA,MACf,kBAAkB,IAAK,CAAA,0BAAA;AAAA,MACvB,QAAA,EAAU,KAAK,KAAM,CAAA,QAAA;AAAA,MACrB,KAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACnKL,MAAA,iBAAA,SAAgC,MAAM,SAA8D,CAAA;AAAA,EAIlG,YAAY,KAA0B,EAAA;AAC3C,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAHA,IAAA,IAAA,CAAA,QAAA,GAAW,IAAI,OAAA,EAAA,CAAA;AAiCf,IAAA,IAAA,CAAA,aAAA,GAAgB,MAAY;AAClC,MAAeA,IAAA,CAAA,cAAA,CAAe,gCAAgC,UAC3D,CAAA,CAAA,CAAA,IAAA,CAAK,UAAU,IAAK,CAAA,QAAA,CAAA,CAAA,CACpB,SAAU,CAAA,CAAC,QAAgC,KAAA;AAC1C,QAAA,IAAA,CAAK,SAAS,EAAE,QAAA,EAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAjCpB,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,QAAU,EAAA,EAAA;AAAA,KAAA,CAAA;AAEZ,IAAM,MAAA,EAAE,OAAO,kBAAuB,EAAA,GAAA,KAAA,CAAA;AACtC,IAAA,MAAM,QAAQ,SAAU,CAAA,kBAAA,CAAA,CAAA;AACxB,IAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,MAAA,KAAA,CAAM,SAAS,cAAe,CAAA,IAAA,CAAA;AAAA,KAAA;AAEhC,IAAI,IAAA,CAAC,MAAM,wBAA0B,EAAA;AACnC,MAAA,KAAA,CAAM,wBAA2B,GAAA,KAAA,CAAA;AAAA,KAAA;AAEnC,IAAI,IAAA,CAAC,MAAM,aAAe,EAAA;AACxB,MAAA,KAAA,CAAM,aAAgB,GAAA,UAAA,CAAA;AAAA,KAAA;AAExB,IAAI,IAAA,CAAC,MAAM,OAAS,EAAA;AAClB,MAAA,KAAA,CAAM,OAAU,GAAA,EAAA,CAAA;AAAA,KAAA;AAElB,IAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,GAAK,EAAA;AACtB,MAAM,KAAA,CAAA,OAAA,CAAQ,GAAM,GAAA,KAAA,CAAM,WAAY,CAAA,IAAA,CAAA;AAAA,KAAA;AAIxC,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAGR,iBAAoB,GAAA;AACzB,IAAK,IAAA,CAAA,aAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAWA,oBAAuB,GAAA;AAC5B,IAAA,IAAA,CAAK,QAAS,CAAA,IAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGT,MAAS,GAAA;AACd,IAAA,2CACG,iBAAD,EAAA;AAAA,MAAA,GACM,IAAK,CAAA,KAAA;AAAA,MACT,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,QAAA,EAAU,KAAK,KAAM,CAAA,WAAA;AAAA,MACrB,MAAQ,EAAA,CAAC,KAAU,qBAAA,KAAA,CAAA,aAAA,CAAC,eAAD,EAAA;AAAA,QAAqB,GAAA,KAAA;AAAA,QAAO,QAAA,EAAU,KAAK,KAAM,CAAA,QAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AClErE,MAAM,gBAAwC,GAAA;AAAA,EACnD,KAAO,EAAA,WAAA;AAAA,EACP,WAAa,EAAA,gGAAA;AAAA,EACb,GAAK,EAAA,UAAA;AAAA,CAAA;;ACEP,MAAM,8BAAiC,GAAA,2CAAA,CAAA;AAEhC,MAAM,mBAAmB,MAA0B;AACxD,EAAO,OAAA;AAAA,IACL,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,WAAW,UAAY,EAAA,SAAA,EAAA;AAAA,IAC3D,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,UAAU,UAAY,EAAA,QAAA,EAAA;AAAA,IAC1D;AAAA,MACE,IAAM,EAAA,QAAA;AAAA,MACN,QAAA,EAAU,CAAC,SAAA,EAAsB,KAAkB,KAAA;AACjD,QAAM,MAAA,OAAA,GAAU,GAAI,CAAA,KAAA,EAAO,2BAA6B,EAAA,KAAA,CAAA,CAAA;AACxD,QAAM,MAAA,QAAA,GAAW,GAAI,CAAA,KAAA,EAAO,oCAAsC,EAAA,EAAA,CAAA,CAAA;AAClE,QAAI,IAAA,OAAA,IAAW,QAAQ,QAAW,CAAA,EAAA;AAChC,UAAO,OAAA,CAAA,kGAAA,CAAA,CAAA;AAAA,SAAA;AAET,QAAA,IAAI,OAAW,IAAA,KAAA,CAAM,MAAW,KAAA,cAAA,CAAe,IAAM,EAAA;AACnD,UAAM,MAAA,SAAA,GAAY,GAAI,CAAA,KAAA,EAAO,WAAa,EAAA,EAAA,CAAA,CAAA;AAC1C,UAAA,MAAM,sBAAsB,SAAU,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAS,KAAA,YAAA,CAAA,CAAA;AAC/D,UAAM,MAAA,QAAA,GAAW,IAAI,KAAO,EAAA,oCAAA,CAAA,CAAA;AAC5B,UAAM,MAAA,iBAAA,GAAoB,SACxB,GAAI,CAAA,mBAAA,EAAqB,CAAC,CAAG,EAAA,UAAA,EAAY,eAAe,8BACxD,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA;AAEF,UAAA,IAAI,QAAa,KAAA,gBAAA,CAAiB,GAAO,IAAA,iBAAA,GAAoB,CAAG,EAAA;AAC9D,YAAA,OAAO,CAAgJ,6IAAA,EAAA,8BAAA,CAAA,2DAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAG3J,QAAO,OAAA,IAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAAA,CAAA;AAAA,CAAA;;AC1Bf,MAAM,YAA+B,GAAA;AAAA,EACnC,SAAW,EAAA,SAAA;AAAA,EACX,MAAQ,EAAA,SAAA;AAAA,EACR,MAAQ,EAAA,MAAA;AAAA,EACR,MAAQ,EAAA,QAAA;AAAA,CAAA,CAAA;AAOH,MAAA,yBAAA,SAAwC,MAAM,SAAsC,CAAA;AAAA,EAClF,MAAS,GAAA;AACd,IAAM,MAAA,EAAE,aAAa,IAAK,CAAA,KAAA,CAAA;AAC1B,IAAA,IAAI,QAAY,IAAA,IAAA,IAAQ,QAAS,CAAA,MAAA,IAAU,IAAM,EAAA;AAC/C,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA;AAET,IAAA,OAAO,OAAO,IAAK,CAAA,QAAA,CAAS,QAAQ,GAAI,CAAA,CAAC,WAAW,CAAM,KAAA;AACxD,MAAM,MAAA,iBAAA,GAAoB,SAAS,MAAO,CAAA,SAAA,CAAA,CAAA;AAC1C,MAAM,MAAA,WAAA,GAAc,aAAa,SAAc,CAAA,IAAA,EAAA,CAAA;AAC/C,MAAA,MAAM,WAAW,iBAAkB,CAAA,KAAA,CAAA;AACnC,MAAM,MAAA,qBAAA,GAAwB,CAAC,QAAA,IAAY,iBAAkB,CAAA,OAAA,CAAA;AAC7D,MAAA,2CACG,MAAD,EAAA;AAAA,QAAM,GAAK,EAAA,CAAA;AAAA,OACR,EAAA,QAAA,wCACE,MAAD,EAAA;AAAA,QAAM,OAAO,iBAAkB,CAAA,OAAA;AAAA,QAAS,WAAW,CAAQ,KAAA,EAAA,WAAA,CAAA,CAAA;AAAA,OACxD,EAAA,SAAA,CAAA,EAGJ,qBACC,oBAAA,KAAA,CAAA,aAAA,CAAC,MAAD,EAAA;AAAA,QAAM,OAAO,iBAAkB,CAAA,OAAA;AAAA,QAAS,SAAU,EAAA,WAAA;AAAA,OAC/C,EAAA,SAAA,CAAA,kBAGJ,KAAA,CAAA,aAAA,CAAA,MAAA,EAAD,IAAM,EAAA,MAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACnChB,MAAM,+BAAkC,GAAA,kBAAA,CAAA;AAYjC,MAAA,mBAAA,SAAkC,MAAM,SAAwD,CAAA;AAAA,EAOrG,YAAY,KAA8B,EAAA;AACxC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAPA,IAAiD,IAAA,CAAA,qBAAA,GAAA;AAAA,MAEvD,mBAAqB,EAAA,oBAAA;AAAA,MACrB,YAAc,EAAA,aAAA;AAAA,KAAA,CAAA;AAKd,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,GAAK,EAAA,EAAA;AAAA,KAAA,CAAA;AAEP,IAAK,IAAA,CAAA,OAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGC,OAAmB,GAAA;AACzB,IAAO,OAAA,CAAC,CAAC,IAAK,CAAA,KAAA,CAAM,SAAS,QAAY,IAAA,CAAC,CAAC,IAAA,CAAK,KAAM,CAAA,GAAA,CAAA;AAAA,GAAA;AAAA,EAGhD,6BAAA,CAA8B,MAAc,OAAkC,EAAA;AACpF,IAAM,MAAA,SAAA,GAAY,OAAO,IAAK,CAAA,OAAA,CAAA,CAAS,KAAK,CAAC,CAAA,KAAM,CAAE,CAAA,WAAA,EAAA,KAAkB,IAAK,CAAA,WAAA,EAAA,CAAA,CAAA;AAC5E,IAAA,OAAO,OAAQ,CAAA,SAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGT,cAAyB,GAAA;AAC/B,IAAO,OAAA,IAAA,CACL,IAAI,IAAK,CAAA,KAAA,EAAO,CAAC,UAAY,EAAA,UAAA,EAAY,UAAY,EAAA,aAAA,EAAe,gCAAmC,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAInG,eAAe,QAAuB,EAAA;AAC5C,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,SAAS,IAAK,CAAA,WAAA,EAAA,CAAA;AAC/C,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,SAAS,QAAS,CAAA,IAAA,CAAA;AACnD,IAAA,MAAM,SAAS,IAAK,CAAA,cAAA,EAAA,CAAA;AACpB,IAAA,MAAM,MAAkC,GAAA;AAAA,MACtC,SAAA,EAAW,KAAK,KAAM,CAAA,SAAA;AAAA,MACtB,QAAU,EAAA,UAAA;AAAA,MACV,MAAA;AAAA,MACA,GAAK,EAAA,MAAA;AAAA,MACJ,CAAA,QAAA,GAAW,GAAG,IAAQ,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAEzB,IAAA,IAAI,CAAC,MAAO,CAAA,MAAA,IAAU,IAAS,KAAA,WAAA,IAAe,aAAa,+BAAiC,EAAA;AAC1F,MAAA,MAAA,CAAO,MAAS,GAAA,IAAA,CAAA;AAAA,KAAA;AAElB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAU,IAAA,MAAA,CAAO,WAAW,EAAI,EAAA;AAC1C,MAAA,MAAA,CAAO,MAAS,GAAA,GAAA,CAAA;AAAA,KAAA;AAElB,IAAO,OAAA,MAAA,CAAA;AAAA,GAAA;AAAA,EAGD,OAAU,GAAA;AAChB,IAAA,MAAM,OAAe,GAAI,CAAA,IAAA,CAAK,OAAO,CAAC,UAAA,EAAY,YAAY,MAAS,CAAA,EAAA,EAAA,CAAA,CAAA;AACvE,IAAM,MAAA,EAAE,cAAc,IAAK,CAAA,KAAA,CAAA;AAC3B,IAAA,cAAA,CAAe,iBAAkB,CAAA,SAAA,CAAA,CAAW,IAAK,CAAA,CAAC,OAAY,KAAA;AAC5D,MAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,6BAA8B,CAAA,IAAA,EAAM,OAAQ,CAAA,gBAAA,CAAA,CAAA;AACvE,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,qBAAA,CAAsB,aAAkB,CAAA,IAAA,+BAAA,CAAA;AAC9D,MAAM,MAAA,MAAA,GAAS,KAAK,cAAe,CAAA,QAAA,CAAA,CAAA;AACnC,MAAA,MAAM,GAAM,GAAA,aAAA,CAAc,MAAO,CAAA,IAAA,CAAK,kDAAkD,QAAY,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA;AACpG,MAAA,IAAA,CAAK,SAAS,EAAE,GAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIb,MAAS,GAAA;AACd,IAAA,IAAI,KAAK,OAAW,EAAA,EAAA;AAClB,MAAA,2CACG,GAAD,EAAA;AAAA,QAAG,IAAA,EAAM,KAAK,KAAM,CAAA,GAAA;AAAA,QAAK,SAAU,EAAA,WAAA;AAAA,OAAA,EAChC,KAAK,KAAM,CAAA,QAAA,CAAA,CAAA;AAAA,KAGX,MAAA;AACL,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA;;AC7EN,MAAA,cAAA,SAA6B,MAAM,SAAgC,CAAA;AAAA,EAChE,UAAU,CAA2B,EAAA;AAC3C,IAAI,IAAA,CAAA,CAAE,SAAS,SAAW,EAAA;AACxB,MAAO,OAAA,OAAA,CAAA;AAAA,KACE,MAAA,IAAA,CAAA,CAAE,SAAS,QAAU,EAAA;AAC9B,MAAO,OAAA,SAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAO,OAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIJ,MAAS,GAAA;AACd,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,QAAU,EAAA;AACxB,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA;AAET,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,QAAa,KAAA,CAAC,IAAK,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,IAAU,IAAK,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,WAAW,CAAI,CAAA,EAAA;AACnG,MAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAD,IAAK,EAAA,oEAAA,CAAA,CAAA;AAAA,KAAA;AAEd,IAAM,MAAA,EAAE,MAAW,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAA;AAC9B,IAAM,MAAA,SAAA,GAAY,IAChB,CAAA,GAAA,CAAI,IAAK,CAAA,KAAA,CAAM,UAAU,CAAC,UAAA,EAAY,UAAY,EAAA,aAAA,EAAe,gCAAmC,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AAEtG,IAAA,OAAO,MAAO,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAM,KAAA;AAC1B,MAAM,MAAA,cAAA,GAAiB,GAAI,CAAA,CAAA,EAAG,gBAAkB,EAAA,EAAA,CAAA,CAAA;AAChD,MAAM,MAAA,aAAA,GAAgB,GAAI,CAAA,CAAA,EAAG,eAAiB,EAAA,EAAA,CAAA,CAAA;AAC9C,MAAA,IAAI,sBAAyB,GAAA,CAAA,CAAA;AAC7B,MAAA,IAAI,qBAAwB,GAAA,CAAA,CAAA;AAC5B,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAyB,sBAAA,GAAA,QAAA,CAAS,QAAQ,cAAgB,CAAA,CAAA,QAAA,EAAA,CAAA;AAAA,OAAA;AAE5D,MAAA,IAAI,aAAe,EAAA;AACjB,QAAwB,qBAAA,GAAA,QAAA,CAAS,QAAQ,aAAe,CAAA,CAAA,QAAA,EAAA,CAAA;AAAA,OAAA;AAE1D,MAAA,2CACG,KAAD,EAAA;AAAA,QAAK,KAAK,GAAI,CAAA,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,MAAO,CAAA,CAAA,CAAA,CAAA;AAAA,QAAK,SAAU,EAAA,MAAA;AAAA,OAAA,sCACzD,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,YAAA;AAAA,OACZ,EAAA,CAAA,CAAE,KACD,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,QAAK,SAAA,EAAW,CAAQ,KAAA,EAAA,IAAA,CAAK,SAAU,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA,EACpC,CAAE,CAAA,KAAA,EAAM,QAAG,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,EAAI,CAAE,CAAA,MAAA,CAAA,CAAA,CAAA,EAItB,CAAE,CAAA,CAAA,cAAA,IAAkB,CAAE,CAAA,aAAA,qBACrB,KAAA,CAAA,aAAA,CAAA,KAAA,EAAD,IACG,EAAA,CAAA,CAAE,cAAmB,KAAA,CAAA,CAAE,aACtB,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAI,EAAA,YAAA,CAAa,sBAGpB,CAAA,CAAA,CAAA,EAAA,CAAA,CAAE,cAAmB,KAAA,CAAA,CAAE,aACtB,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAD,IAAK,EAAA,oBAAA,kBACgB,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAI,EAAA,YAAA,CAAa,sBAErC,CAAA,CAAA,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,EAAK,mBACc,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,EAAI,YAAa,CAAA,qBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAM3C,KAAA,CAAA,aAAA,CAAA,KAAA,EAAD,IAAM,EAAA,CAAA,CAAE,OACR,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,sCACG,kBAAD,EAAA;AAAA,QACE,OAAA,EAAS,IAAK,CAAA,KAAA,CAAM,QAAS,CAAA,OAAA;AAAA,QAC7B,QAAU,EAAA,SAAA;AAAA,QACV,mBAAmB,CAAC,IAAI,4BAA6B,CAAA,IAAA,CAAK,MAAM,QAAU,EAAA,CAAA,CAAA,CAAA;AAAA,QAC1E,QAAS,EAAA,sBAAA;AAAA,OAAA,CAAA,CAAA,EAGZ,CAAM,KAAA,MAAA,CAAO,MAAS,GAAA,CAAA,wCAAM,IAAD,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;;;;AChEP,SAAA,cAAA,CAAA,EAAE,SAAS,QAAkC,EAAA,EAAA;AAC1E,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACG,IAAD,EAAA;AAAA,IAAI,SAAU,EAAA,iBAAA;AAAA,IAAkB,GAAI,EAAA,iBAAA;AAAA,GAClC,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,EAAK,QAAS,CAAA,QAAA,CAAS,uBACtB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAD,EAAA;AAAA,IACE,WAAa,EAAA,IAAA;AAAA,IACb,IAAA,EAAM,QAAS,CAAA,QAAA,CAAS,QAAS,CAAA,IAAA;AAAA,IACjC,OAAS,EAAA,CAAA,KAAA,EAAQ,QAAS,CAAA,QAAA,CAAS,QAAS,CAAA,IAAA,CAAA,CAAA;AAAA,GAC5C,CAAA,EAAA,MAAA,sCAED,yBAAD,EAAA;AAAA,IAA2B,QAAA;AAAA,GAAA,CAAA,CAAA,CAAA,sCAG9B,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,wBAAA;AAAA,IAAyB,GAAI,EAAA,wBAAA;AAAA,GAAA,sCACzC,YAAD,EAAA;AAAA,IACE,QAAS,EAAA,MAAA;AAAA,IACT,YAAA,EAAc,KAAK,QAAS,CAAA,QAAA,CAAA;AAAA,IAC5B,UAAA,EAAY,QAAS,CAAA,QAAA,CAAS,QAAS,CAAA,IAAA;AAAA,GAAA,CAAA,sCAExC,mBAAD,EAAA;AAAA,IAAqB,QAAS,EAAA,SAAA;AAAA,IAAU,QAAA;AAAA,IAAoB,SAAW,EAAA,OAAA;AAAA,GAAA,CAAA,CAAA,sCAExE,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,0BAAA;AAAA,IAA2B,GAAI,EAAA,iBAAA;AAAA,GAAA,sCAC3C,cAAD,EAAA;AAAA,IAAgB,QAAA;AAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AAAA;;ACrBjB,MAA8B,wBAAA,GAAA,MAAA;AAAA,EACrB,OAAA,SAAA,CAAU,GAAkB,EAAA,MAAA,EAAyB,EAAmC,EAAA;AACpG,IAAA,wBAAA,CAAwB,eAAe,MAAQ,EAAA,EAAA,CAAA,CAAA;AAC/C,IAAA,OAAO,IAAI,SAAU,CAAA,IAAA,EAAM,MAAM,wBAAA,CAAwB,eAAe,MAAQ,EAAA,EAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGnE,OAAA,cAAA,CAAe,QAAyB,EAAuB,EAAA;AAC5E,IAAe,cAAA,CAAA,WAAA,CAAY,MAAO,CAAA,OAAA,EAAS,MAAO,CAAA,QAAA,EAAU,OAAO,IAAM,CAAA,CAAA,IAAA,CAAK,CAAC,QAAA,KAAa,EAAG,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAGnF,mBAAmB,QAA0B,EAAA;AACzD,IAAM,MAAA,IAAA,GAAO,SAAS,IAAK,CAAA,WAAA,EAAA,CAAA;AAE3B,IAAA,MAAM,SAAa,GAAA,CAAA,QAAA,CAAS,QAAS,CAAA,SAAA,IAAa,GAAK,EAAA,WAAA,EAAA,CAAA;AACvD,IAAM,MAAA,IAAA,GAAO,QAAS,CAAA,QAAA,CAAS,IAAK,CAAA,WAAA,EAAA,CAAA;AACpC,IAAM,MAAA,UAAA,GAAc,CAAS,QAAA,CAAA,UAAA,IAAc,GAAK,EAAA,WAAA,EAAA,CAAA;AAIhD,IAAO,OAAA,CAAA,EAAG,SAAa,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,EAAQ,UAAc,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGjC,OAAA,6BAAA,CAA8B,UAA0B,OAAkC,EAAA;AACtG,IAAO,OAAA;AAAA,MACL,OAAA;AAAA,MACA,MAAM,wBAAwB,CAAA,UAAA,CAAW,QAAY,CAAA,GAAA,GAAA,GAAM,SAAS,QAAS,CAAA,IAAA;AAAA,MAC7E,UAAU,QAAS,CAAA,QAAA,CAAS,aAAa,IAAO,GAAA,GAAA,GAAM,SAAS,QAAS,CAAA,SAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAI7D,SAAS,QAAkC,EAAA;AACxD,IAAA,MAAM,KAAS,GAAA,CAAA,QAAA,CAAS,UAAc,IAAA,GAAA,EAAK,KAAM,CAAA,GAAA,CAAA,CAAA;AACjD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAO,OAAA,EAAA,CAAA;AAAA,KAAA;AAET,IAAA,OAAO,KAAM,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAGA,WAAW,QAAmC,EAAA;AAC3D,IAAA,OAAO,CAAC,wBAAA,CAAwB,eAAgB,CAAA,QAAA,CAAS,yBAAwB,QAAS,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAG7E,WAAW,QAAkC,EAAA;AAC1D,IAAI,IAAA,wBAAA,CAAwB,WAAW,QAAW,CAAA,EAAA;AAChD,MAAA,OAAO,QAAS,CAAA,IAAA,GAAO,GAAM,GAAA,wBAAA,CAAwB,QAAS,CAAA,QAAA,CAAA,CAAA;AAAA,KAAA;AAGhE,IAAA,OAAO,QAAS,CAAA,IAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;AA/Cb,IAAA,uBAAA,GAAA,wBAAA,CAAA;AAAA,wBAkDmB,eAAkB,GAAA;AAAA,EACxC,EAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,wBAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,uBAAA;AAAA,EACA,2BAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,CAAA;;ACjEG,MAAA,YAAA,SAA2B,MAAM,SAA6D,CAAA;AAAA,EAGnG,YAAY,KAAsC,EAAA;AAChD,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AACN,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,aAAe,EAAA,EAAA,EAAI,WAAa,EAAA,EAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAG1C,iBAAoB,GAAA;AACzB,IAAK,IAAA,CAAA,kBAAA,CAAmB,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGpC,oBAAuB,GAAA;AAC5B,IAAK,IAAA,CAAA,cAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGA,kBAAA,CAAmB,YAA2C,SAA+B,EAAA;AAClG,IAAA,MAAM,SAA8B,GAAA,GAAA,CAAI,IAAK,CAAA,KAAA,CAAM,KAAO,EAAA,CAAC,SAAW,EAAA,mBAAA,CAAA,EAAsB,EAAI,CAAA,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,CAAA,CAAA;AAChH,IAAA,MAAM,cAAc,SAAU,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,uBAAA,CAAwB,mBAAmB,CAAI,CAAA,CAAA,CAAA,IAAA,EAAA,CAAA;AACxF,IAAA,IAAI,UAAU,WAAY,CAAA,IAAA,CAAK,EAAQ,CAAA,KAAA,WAAA,CAAY,KAAK,EAAK,CAAA,EAAA;AAC3D,MAAK,IAAA,CAAA,cAAA,EAAA,CAAA;AACL,MAAA,MAAM,aAAgB,GAAA,SAAA,CAAU,GAAI,CAAA,CAAC,QAAa,KAAA;AAChD,QAAM,MAAA,EAAA,GAAK,wBAAwB,kBAAmB,CAAA,QAAA,CAAA,CAAA;AACtD,QAAO,OAAA;AAAA,UACL,EAAA;AAAA,UACA,WAAA,EAAa,IAAK,CAAA,0BAAA,CAA2B,EAAI,EAAA,QAAA,CAAA;AAAA,UACjD,UAAU,IAAK,CAAA,wBAAA,CAAyB,UAAU,IAAK,CAAA,KAAA,CAAM,MAAM,OAAQ,CAAA,OAAA,CAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAG/E,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,aAAe,EAAA,WAAA,EAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAI3B,0BAAA,CAA2B,IAAY,QAAsC,EAAA;AACnF,IAAA,MAAM,SAAS,uBAAwB,CAAA,6BAAA,CAA8B,UAAU,IAAK,CAAA,KAAA,CAAM,MAAM,OAAQ,CAAA,OAAA,CAAA,CAAA;AACxG,IAAA,OAAO,wBAAwB,SAAU,CAAA,IAAA,CAAK,MAAM,WAAa,EAAA,MAAA,EAAQ,CAAC,OAAuB,KAAA;AAC/F,MAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,aAAA,CAAc,UAAU,CAAC,GAAA,KAAQ,IAAI,EAAO,KAAA,EAAA,CAAA,CAAA;AACnE,MAAA,IAAI,QAAQ,CAAI,CAAA,EAAA;AACd,QAAA,MAAM,eAAe,EAAK,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,MAAM,QAAU,EAAA,OAAA,EAAA,CAAA;AACnE,QAAA,MAAM,aAAgB,GAAA,CAAC,GAAG,IAAA,CAAK,KAAM,CAAA,aAAA,CAAA,CAAA;AACrC,QAAA,aAAA,CAAc,GAAO,CAAA,GAAA,YAAA,CAAA;AACrB,QAAA,IAAA,CAAK,SAAS,EAAE,aAAA,EAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKd,cAAiB,GAAA;AACvB,IAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,EAAE,WAAkB,EAAA,KAAA,WAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGhD,wBAAA,CAAyB,UAA0B,OAA4B,EAAA;AACrF,IAAO,OAAA;AAAA,MACL,IAAA,EAAM,GAAI,CAAA,QAAA,EAAU,eAAiB,EAAA,EAAA,CAAA;AAAA,MACrC,OAAS,EAAA,IAAA;AAAA,MACT,OAAA;AAAA,MACA,aAAe,EAAA,UAAA;AAAA,MACf,QAAA,EAAU,GAAI,CAAA,QAAA,EAAU,oBAAsB,EAAA,EAAA,CAAA;AAAA,MAC9C,QAAA;AAAA,MACA,MAAQ,EAAA,EAAA;AAAA,MACR,SAAW,EAAA,EAAA;AAAA,MACX,MAAQ,EAAA,EAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIL,MAAS,GAAA;AACd,IAAA,MAAM,EAAE,IAAM,EAAA,WAAA,EAAa,OAAS,EAAA,cAAA,EAAgB,UAAU,IAAK,CAAA,KAAA,CAAA;AACnE,IAAA,MAAM,SAAyB,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,OAAO,CAAC,GAAA,KAAQ,CAAC,CAAC,GAAI,CAAA,QAAA,CAAA,CAAU,GAAI,CAAA,CAAC,QAAQ,GAAI,CAAA,QAAA,CAAA,CAAA;AACzG,IAAA,2CACG,uBAAD,EAAA;AAAA,MAAyB,IAAM,EAAA,WAAA;AAAA,MAAa,OAAS,EAAA,cAAA;AAAA,KAAA,sCAClD,mBAAD,EAAA;AAAA,MAAqB,KAAA;AAAA,MAAc,SAAS,KAAM,CAAA,cAAA;AAAA,KACjD,CAAA,EAAA,SAAA,wCACE,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,KAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,WAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,uBAAA;AAAA,KACZ,EAAA,SAAA,CAAU,GAAI,CAAA,CAAC,QAAa,KAAA;AAC3B,MAAA,MAAM,MACJ,QAAS,CAAA,QAAA,CAAS,SAAS,GAAO,IAAA,uBAAA,CAAwB,mBAAmB,QAAS,CAAA,QAAA,CAAA,CAAA;AACxF,MAAA,2CAAQ,cAAD,EAAA;AAAA,QAAgB,GAAK,EAAA,GAAA;AAAA,QAAK,QAAA;AAAA,QAAoB,OAAA,EAAS,MAAM,OAAQ,CAAA,OAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AA7EvF,aACS,KAAQ,GAAA,cAAA;;ACTxB,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,EAC9B,KAAO,EAAA,oBAAA;AAAA,EACP,WAAa,EAAA,6CAAA;AAAA,EACb,GAAK,EAAA,wBAAA;AAAA,EACL,aAAe,EAAA,UAAA;AAAA,EACf,SAAW,EAAA,iBAAA;AAAA,EACX,wBAAA,EAA0B,CAAC,YAAA,EAAc,qBAAuB,EAAA,oBAAA,CAAA;AAAA,EAChE,iBAAmB,EAAA,IAAA;AAAA,EACnB,qBAAuB,EAAA,IAAA;AAAA,EACvB,UAAY,EAAA,gBAAA,EAAA;AAAA,EACZ,kBAAkB,CAAC,KAAA,KAA6B,MAAM,OAAU,GAAA,CAAC,MAAM,OAAW,CAAA,GAAA,EAAA;AAAA,EAClF,wBAAwB,CAAC,KAAA,KAA0B,MAAM,OAAU,GAAA,CAAC,MAAM,OAAW,CAAA,GAAA,EAAA;AAAA,EACrF,iBAAmB,EAAA,uBAAA,CAAwB,mBAAoB,CAAA,CAAC,oBAAsB,EAAA,qBAAA,CAAA,CAAA;AAAA,EACtF,eAAiB,EAAA,wBAAA,CAAyB,wBAAyB,CAAA,CAAC,oBAAsB,EAAA,qBAAA,CAAA,CAAA;AAAA,CAAA,CAAA;;ACjBrF,MAAM,wBAAuD,GAAA,QAAA,CAAS,SAC1E,CAAA,QAAA,IAA0C,EAAE,QAAU,EAAA,EAAA,EAAA,CAAA;AACzD,IAAI,wBAA0B,EAAA;AAC5B,EAAyB,wBAAA,CAAA,eAAA,GAAkB,SAAS,aAAc,CAAA,UAAA,CAAA,CAAA;AAAA;;ACOxD,IAAA,kBAAA;AAAL,CAAA,SAAK,kBAAL,EAAA;AACL,EAAO,kBAAA,CAAA,MAAA,CAAA,GAAA,MAAA,CAAA;AACP,EAAW,kBAAA,CAAA,UAAA,CAAA,GAAA,UAAA,CAAA;AAAA,CAFD,EAAA,iBAAA,KAAA,iBAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AA6DZ,MAAM,oBAAA,GAAuB,CAAC,IAAyB,KAAA;AACrD,EAAQ,QAAA,IAAA;AAAA,IACD,KAAA,gBAAA;AACH,MAAO,OAAA,KAAA,CAAA;AAAA,IACJ,KAAA,cAAA;AACH,MAAO,OAAA,MAAA,CAAA;AAAA,IAAA;AAEP,MAAO,OAAA,QAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;AAIoC,MAAA,mCAAA,CAAA;AAAA,EAExC,2BAA2B,GAAgE,EAAA;AAChG,IAAO,OAAA,iCAAA,CAAkC,0BAA2B,CAAA,GAAA,EAAK,UAAY,EAAA,QAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIhF,qCAAA,CAAsC,QAAgB,QAAqB,EAAA;AAChF,IAAO,OAAA,iCAAA,CAAkC,sCAAsC,MAAQ,EAAA,QAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKlF,mCACL,CAAA,GAAA,EACA,OACA,EAAA,MAAA,EACA,QACA,EAAA;AACA,IAAA,OAAO,iCAAkC,CAAA,mCAAA,CAAoC,GAAK,EAAA,OAAA,EAAS,MAAQ,EAAA,QAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIhG,MAAwC,kCAAA,GAAA,MAAA;AAAA,EAAA,OAE/B,0BAA0B,OAA+C,EAAA;AACrF,IAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACpB,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAGT,IAAI,IAAA,CAAC,OAAQ,CAAA,OAAA,CAAQ,GAAK,EAAA;AACxB,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAGT,IAAO,OAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAGK,oBAAoB,KAAiE,EAAA;AACjG,IAAA,MAAM,UAAU,SAAU,CAAA,KAAA,CAAA,CAAA;AAC1B,IAAO,OAAA,OAAA,CAAA;AAAA,GAAA;AAAA,EAIK,OAAA,qCAAA,CAAsC,OAAe,QAA0B,EAAA;AAC3F,IAAA,MAAM,UAAe,IAAK,CAAA,0BAAA,CACxB,EAAE,IAAM,EAAA,QAAA,CAAS,eACjB,UACA,EAAA,gBAAA,CAAA,CAAA;AAEF,IAAA,OAAA,CAAQ,SAAY,GAAA;AAAA,MAAA,GACf,OAAQ,CAAA,SAAA;AAAA,MACX,QAAA;AAAA,MACA,yBAA2B,EAAA,IAAA;AAAA,MAC3B,KAAA;AAAA,KAAA,CAAA;AAEF,IAAO,OAAA,OAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAGM,qBAAqB,QAA0C,EAAA;AAC5E,IAAA,OAAO,SAAS,iBAAqB,IAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAGzB,mCACZ,CAAA,GAAA,EACA,OACA,EAAA,MAAA,EACA,QAC8C,EAAA;AAC9C,IAAA,OAAO,mCAAkC,0BAA2B,CAAA,GAAA,EAAK,YAAY,cAAgB,CAAA,CAAA,IAAA,CACnG,CAAC,OAA6C,KAAA;AAC5C,MAAU,OAAA,GAAA;AAAA,QACL,GAAA,OAAA;AAAA,QACA,GAAA,OAAA;AAAA,QAEH,WAAa,EAAA;AAAA,UACR,GAAA,OAAA,CAAQ,SAAS,WAAY,CAAA,WAAA;AAAA,UAEhC,iBAAA,EAAmB,mCAAkC,oBAAqB,CAAA,QAAA,CAAA;AAAA,SAAA;AAAA,QAE5E,WAAa,EAAA,OAAA,CAAQ,OAAW,IAAA,OAAA,CAAQ,SAAS,WAAY,CAAA,WAAA;AAAA,QAC7D,SAAW,EAAA;AAAA,UACN,GAAA,OAAA,CAAQ,SAAS,WAAY,CAAA,SAAA;AAAA,UAChC,KAAO,EAAA,MAAA;AAAA,UACP,QAAA;AAAA,SAAA;AAAA,OAAA,CAAA;AAGJ,MAAO,OAAA,OAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAKC,eAAe,QAAqC,EAAA;AAChE,IAAA,MAAM,eAA0B,CAAY,QAAA,IAAA,EAAA,EAAI,GAAI,CAAA,CAAC,YAAY,OAAQ,CAAA,IAAA,CAAA,CAAA;AACzE,IAAM,MAAA,kBAAA,GAA6B,yBAAyB,QAAS,CAAA,OAAA,CAAA;AAErE,IAAA,OAAO,YAAa,CAAA,QAAA,CAAS,kBAAsB,CAAA,GAAA,kBAAA,GAAqB,YAAa,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGzE,OAAA,SAAA,CAAU,UAAiB,WAA6B,EAAA;AACpE,IAAA,MAAM,UAAU,QAAS,CAAA,IAAA,CAAK,CAAC,QAAA,KAAa,SAAS,IAAS,KAAA,WAAA,CAAA,CAAA;AAC9D,IAAO,OAAA,OAAA,GAAU,QAAQ,MAAS,GAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAItB,OAAA,0BAAA,CACZ,GACA,EAAA,aAAA,EACA,IAC8C,EAAA;AAC9C,IAAA,MAAM,WAAc,GAAA;AAAA,MAClB,QAAA,EAAU,eAAe,+BAAgC,CAAA,UAAA,CAAA;AAAA,MACzD,kBAAkB,cAAe,CAAA,mBAAA,EAAA;AAAA,KAAA,CAAA;AAGnC,IAAA,OAAO,EAAG,CAAA,GAAA,CAAI,WAAa,CAAA,CAAA,IAAA,CAAK,CAAC,WAAiD,KAAA;AAChF,MAAA,MAAM,EAAE,QAAa,EAAA,GAAA,WAAA,CAAA;AAErB,MAAM,MAAA,OAAA,GAAU,SAAS,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,iBAC5C,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,aAAe,CAAA,CAAA,IAAA,GAC/C,SAAS,MACT,GAAA,QAAA,CAAS,GAAG,IACZ,GAAA,IAAA,CAAA;AACJ,MAAA,MAAM,SAAwB,GAAA;AAAA,QAC5B,IAAA;AAAA,QACA,mBAAmB,oBAAqB,CAAA,IAAA,CAAA;AAAA,QACxC,0BAA0B,IAAS,KAAA,QAAA;AAAA,OAAA,CAAA;AAErC,MAAA,MAAM,WAAc,GAAA,OAAA,GAAU,OAAU,GAAA,IAAA,CAAK,cAAe,CAAA,QAAA,CAAA,CAAA;AAC5D,MAAA,MAAM,MAAS,GAAA,IAAA,CAAK,SAAU,CAAA,WAAA,CAAY,QAAU,EAAA,WAAA,CAAA,CAAA;AACpD,MAAA,MAAM,aAAgB,GAAA,UAAA,CAAA;AAEtB,MAAO,OAAA;AAAA,QACL,OAAS,EAAA;AAAA,UACP,aAAa,GAAI,CAAA,IAAA;AAAA,UACjB,aAAa,CAAC,EAAA,CAAA;AAAA,UACd,aAAA;AAAA,UACA,gBAAkB,EAAA,aAAA;AAAA,UAClB,QAAU,EAAA,aAAA;AAAA,UACV,MAAA;AAAA,UACA,WAAA;AAAA,UACA,iBAAmB,EAAA,MAAA;AAAA,UACnB,QAAU,EAAA,IAAA;AAAA,UACV,UAAY,EAAA,KAAA;AAAA,UACZ,eAAiB,EAAA,EAAA;AAAA,UACjB,8BAAgC,EAAA,EAAA;AAAA,UAChC,YAAc,EAAA,KAAA;AAAA,UACd,OAAA;AAAA,UACA,SAAA;AAAA,SAAA;AAAA,QAEF,QAAU,EAAA;AAAA,UACR,WAAA;AAAA,SAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;AA/HH,IAAA,iCAAA,GAAA,mCAAA;AACS,iCADT,CACS,UAAU,CAAC,IAAA,CAAA,CAAA;AAqIpB,MAAM,qCAAwC,GAAA,wDAAA;AAErD,MAAO,CAAA,qCAAA,EAAuC,EAAI,CAAA,CAAA,OAAA,CAChD,qCACA,EAAA,mCAAA,CAAA;;ACpOuC,SAAA,wBAAA,CAAA;AAAA,EACvC,QAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAA;AAAA,CACiC,EAAA;AACjC,EAAA,MAAM,EAAE,MAAW,EAAA,GAAA,MAAA,CAAA;AACnB,EAAM,MAAA,EAAE,KAAQ,GAAA,EAAA,EAAI,eAAoB,EAAA,GAAA,MAAA,CAAA;AAExC,EAAA,MAAM,WAAc,GAAA,SAAA,CAAU,cAAe,CAAA,GAAA,CAAI,MAAM,KAAO,EAAA,eAAA,CAAA,CAAA;AAC9D,EAAM,MAAA,iBAAA,GAAoB,CAAC,GAAI,CAAA,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,EAAE,IAAS,KAAA,WAAA,CAAA,CAAA;AAC/D,EAAA,MAAM,YAAa,GAAI,CAAA,YAAA,CAAa,IACjC,CAAA,MAAA,CAAO,CAAC,WAAgB,KAAA;AACvB,IACE,OAAA,WAAA,CAAY,OAAY,KAAA,WAAA,IACxB,WAAY,CAAA,OAAA,KAAY,MAAO,CAAA,OAAA,CAAQ,WACvC,IAAA,WAAA,CAAY,MAAW,KAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,CAAA;AAAA,GAAA,CAAA,CAGzC,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,cAAc,CAAE,CAAA,WAAA,CAAA,CAAA;AACpC,EAAA,MAAM,iBAAoB,GAAA,SAAA,CAAU,MAAS,GAAA,SAAA,CAAU,GAAQ,EAAA,GAAA,IAAA,CAAA;AAE/D,EAAA,MAAM,8BAA8B,MAAM;AACxC,IAAA,MAAM,EAAE,MAAW,EAAA,OAAA,EAAA,GAAA,MAAA,CAAA;AACnB,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,QAAA,EAAU,QAAO,OAAQ,CAAA,gBAAA;AAAA,MACzB,WAAW,iBAAkB,CAAA,OAAA;AAAA,MAC7B,QAAQ,iBAAkB,CAAA,MAAA;AAAA,MAC1B,aAAa,iBAAkB,CAAA,IAAA;AAAA,KAAA,CAAA;AAGjC,IAAA,MAAM,EAAE,MAAW,EAAA,GAAA,aAAA,CAAA;AACnB,IAAI,IAAA,MAAA,CAAO,GAAG,gDAAmD,CAAA,EAAA;AAC/D,MAAA,MAAA,CAAO,GAAG,cAAgB,EAAA,MAAA,CAAA,CAAA;AAAA,KACrB,MAAA;AACL,MAAA,MAAA,CAAO,GAAG,eAAiB,EAAA,MAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA,CAAA;AAI/B,EAAA,2CACG,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,iBAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,YAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,yBAAA;AAAA,GAA0B,EAAA,SAAA,CAAA,sCACxC,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,UAAA;AAAA,GAAA,sCACZ,kBAAD,EAAA;AAAA,IACE,KAAO,EAAA,eAAA;AAAA,IACP,QAAU,EAAA,CAAC,GAAa,KAAA,eAAA,CAAgB,IAAI,MAAO,CAAA,KAAA,CAAA;AAAA,IACnD,QAAU,EAAA,KAAA;AAAA,IACV,QAAA;AAAA,IACA,QAAS,EAAA,UAAA;AAAA,GAAA,CAAA,CAAA,CAAA,sCAKd,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,YAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,yBAAA;AAAA,GAA0B,EAAA,QAAA,sCAChC,SAAD,EAAA;AAAA,IAAW,EAAG,EAAA,4BAAA;AAAA,GAAA,CAAA,CAAA,sCAErB,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,UAAA;AAAA,GAAA,sCACZ,OAAD,EAAA;AAAA,IACE,IAAK,EAAA,MAAA;AAAA,IACL,SAAU,EAAA,+BAAA;AAAA,IACV,KAAO,EAAA,KAAA;AAAA,IACP,QAAU,EAAA,CAAC,CAAM,KAAA,YAAA,CAAa,EAAE,MAAO,CAAA,KAAA,CAAA;AAAA,GAAA,CAAA,CAAA,CAAA,sCAK5C,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,YAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,yBAAA;AAAA,GAA0B,EAAA,SAAA,sCAC/B,SAAD,EAAA;AAAA,IAAW,EAAG,EAAA,6BAAA;AAAA,GAAA,CAAA,CAAA,sCAEtB,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,UAAA;AAAA,GAAA,sCACZ,OAAD,EAAA;AAAA,IACE,IAAK,EAAA,MAAA;AAAA,IACL,SAAU,EAAA,+BAAA;AAAA,IACV,KAAO,EAAA,eAAA;AAAA,IACP,QAAU,EAAA,CAAC,CAAM,KAAA,cAAA,CAAe,EAAE,MAAO,CAAA,KAAA,CAAA;AAAA,GAAA,CAAA,CAAA,CAAA,EAI9C,CAAC,MAAO,CAAA,OAAA,CAAQ,SAAU,CAAA,sBAAA,wCACxBC,wBAAD,EAAA;AAAA,IACE,iBAAA;AAAA,IACA,uBAAuB,iBAAmB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,IAAA;AAAA,IAC1C,IAAA,EAAM,MAAO,CAAA,OAAA,CAAQ,SAAU,CAAA,IAAA;AAAA,IAC/B,WAAA;AAAA,IACA,2BAAA;AAAA,GAAA,CAAA,CAAA,CAAA;AAAA,CAAA;AAYH,MAAA,8BAAA,SAA6C,MAAM,SAAgD,CAAA;AAAA,EAAnG,WA9HP,GAAA;AA8HO,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACG,IAAA,IAAA,CAAA,cAAA,GAAiB,CAAC,OAA0B,KAAA;AAClD,MAAM,MAAA,EAAE,WAAW,IAAK,CAAA,KAAA,CAAA;AACxB,MAAO,MAAA,CAAA,MAAA,CAAO,QAAQ,OAAU,GAAA,OAAA,CAAA;AAChC,MAAA,MAAA,CAAO,cAAc,SAAW,EAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG1B,IAAA,IAAA,CAAA,YAAA,GAAe,CAAC,KAAwB,KAAA;AAC9C,MAAA,MAAM,EAAE,aAAA,EAAe,MAAW,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAA;AAC7C,MAAA,MAAA,CAAO,QAAQ,KAAQ,GAAA,KAAA,CAAA;AACvB,MAAA,aAAA,CAAc,OAAS,EAAA,KAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,IAAA,CAAA,sBAAA,GAAyB,CAAC,eAA4B,KAAA;AAC5D,MAAA,MAAM,EAAE,aAAA,EAAe,MAAW,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAA;AAC7C,MAAA,MAAA,CAAO,QAAQ,eAAkB,GAAA,eAAA,CAAA;AACjC,MAAA,aAAA,CAAc,iBAAmB,EAAA,eAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAG5B,MAAS,GAAA;AAjJlB,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAkJI,IAAM,MAAA,EAAE,MAAQ,EAAA,GAAA,EAAA,GAAQ,IAAK,CAAA,KAAA,CAAA;AAC7B,IAAA,2CACG,wBAAD,EAAA;AAAA,MACE,UAAU,CAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAA,MAAA,CAAO,aAAd,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAxB,mBAAqC,QAAY,KAAA,EAAA;AAAA,MAC3D,iBAAiB,IAAK,CAAA,cAAA;AAAA,MACtB,eAAiB,EAAA,CAAA,CAAA,EAAA,GAAA,MAAA,CAAO,MAAO,CAAA,OAAA,KAAd,mBAAuB,OAAW,KAAA,EAAA;AAAA,MACnD,cAAc,IAAK,CAAA,YAAA;AAAA,MACnB,MAAA;AAAA,MACA,gBAAgB,IAAK,CAAA,sBAAA;AAAA,MACrB,GAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AC/IuC,SAAA,8BAAA,CAAA,EAAE,aAAa,aAAuD,EAAA,EAAA;AACnH,EAAM,MAAA,CAAC,YAAc,EAAA,eAAA,CAAA,GAAmB,QAAsB,CAAA,WAAA,CAAA,CAAA;AAE9D,EAAA,SAAA,cAAA,CAAwB,OAAY,CAAW,EAAA;AAC7C,IAAI,IAAA,KAAA,CAAM,UAAU,CAAG,EAAA;AACrB,MAAM,KAAA,CAAA,cAAA,EAAA,CAAA;AACN,MAAM,MAAA,cAAA,GAAiB,MAAM,MAAO,CAAA,cAAA,CAAA;AACpC,MAAM,MAAA,UAAA,GAAa,MAAM,MAAO,CAAA,KAAA,CAAA;AAChC,MAAM,KAAA,CAAA,MAAA,CAAO,QAAQ,CAAG,EAAA,UAAA,CAAW,UAAU,CAAG,EAAA,cAAA,CAAA,CAAA,EAAA,EAAoB,WAAW,SAAU,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA;AACzF,MAAA,KAAA,CAAM,OAAO,cAAkB,IAAA,CAAA,CAAA;AAAA,KAAA;AAEjC,IAAM,MAAA,eAAA,GAAkB,CAAC,GAAG,YAAA,CAAA,CAAA;AAC5B,IAAgB,eAAA,CAAA,CAAA,CAAA,GAAK,MAAM,MAAO,CAAA,KAAA,CAAA;AAClC,IAAgB,eAAA,CAAA,eAAA,CAAA,CAAA;AAChB,IAAc,aAAA,CAAA,eAAA,CAAA,CAAA;AAAA,GAAA;AAGhB,EAAA,2CACG,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,iBAAA;AAAA,GAAA,sCACZ,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,YAAA;AAAA,GAAA,EACZ,aAAa,GAAI,CAAA,CAAC,YAAY,KAC7B,qBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACG,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,yBAAA;AAAA,GAA0B,EAAA,cAAA,sCAEtC,SAAD,EAAA;AAAA,IAAW,EAAG,EAAA,kCAAA;AAAA,GAAsC,CAAA,EAAA,GAAA,CAAA,sCAErD,KAAD,EAAA;AAAA,IAAK,SAAU,EAAA,UAAA;AAAA,IAAW,GAAK,EAAA,KAAA;AAAA,GAAA,sCAC5B,aAAD,EAAA;AAAA,IACE,MAAM,MAAS,GAAA,KAAA;AAAA,IACf,KAAO,EAAA,UAAA;AAAA,IACP,IAAM,EAAA,EAAA;AAAA,IACN,QAAU,EAAA,CAAC,CAAM,KAAA,cAAA,CAAe,CAAG,EAAA,KAAA,CAAA;AAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA;AAc5C,MAAA,oCAAA,SAAmD,MAAM,SAAsD,CAAA;AAAA,EAA/G,WAzDP,GAAA;AAyDO,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACG,IAAA,IAAA,CAAA,aAAA,GAAgB,CAAC,WAAgC,KAAA;AACvD,MAAM,MAAA,EAAE,WAAW,IAAK,CAAA,KAAA,CAAA;AACxB,MAAO,MAAA,CAAA,MAAA,CAAO,QAAQ,WAAc,GAAA,WAAA,CAAA;AACpC,MAAA,MAAA,CAAO,cAAc,aAAe,EAAA,WAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAI/B,MAAS,GAAA;AACd,IAAM,MAAA,EAAE,WAAW,IAAK,CAAA,KAAA,CAAA;AACxB,IAAA,2CACG,8BAAD,EAAA;AAAA,MACE,aAAa,MAAO,CAAA,MAAA,CAAO,WAAe,IAAA,MAAA,CAAO,OAAO,OAAQ,CAAA,WAAA;AAAA,MAChE,eAAe,IAAK,CAAA,aAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AChDrB,MAAA,kBAAA,GAAA,cAAgC,MAAM,SAA0E,CAAA;AAAA,EAcrH,YAAY,KAAuC,EAAA;AACjD,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AATA,IAAe,IAAA,CAAA,YAAA,GAAA,KAAA,CAAA;AAiCf,IAAA,IAAA,CAAA,cAAA,GAAiB,MAAM;AAC7B,MAAK,IAAA,CAAA,KAAA,CAAM,YAAY,YAAa,CAAA,OAAA,EAAA,CAAA;AACpC,MAAA,IAAA,CAAK,KAAM,CAAA,WAAA,CAAY,YAAa,CAAA,aAAA,CAAc,MAAM,IAAK,CAAA,oBAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGrD,IAAA,IAAA,CAAA,oBAAA,GAAuB,MAAY;AAC3C,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAA,OAAA;AAAA,OAAA;AAGF,MAAM,MAAA,EAAE,YAAY,IAAK,CAAA,KAAA,CAAA;AACzB,MAAM,MAAA,EAAE,gBAAgB,IAAK,CAAA,KAAA,CAAA;AAC7B,MAAM,MAAA,UAAA,GAAa,YAAY,IAAK,CAAA,SAAA,CAAU,OAAO,IAAK,CAAA,CAAC,KAAkB,KAAA,KAAA,CAAM,IAAS,KAAA,kBAAA,CAAA,CAAA;AAC5F,MAAI,IAAA,UAAA,IAAc,UAAW,CAAA,OAAA,CAAQ,sBAAyB,CAAA,EAAA;AAC5D,QAAA,MAAM,kBAAqB,GAAA,UAAA,CAAW,OAAQ,CAAA,sBAAA,CAAA,CAAwB,QAAQ,OAAQ,CAAA,MAAA,CAAA,CAAA;AACtF,QAAA,IAAI,kBAAoB,EAAA;AACtB,UAAA,MAAM,cAAiB,GAAA;AAAA,YACrB,WAAa,EAAA,kBAAA;AAAA,YACb,SAAA,EAAW,QAAQ,OAAQ,CAAA,WAAA;AAAA,YAC3B,MAAA,EAAQ,QAAQ,OAAQ,CAAA,MAAA;AAAA,YACxB,QAAU,EAAA,UAAA;AAAA,WAAA,CAAA;AAEZ,UAAA,IAAI,YAAe,GAAA,4BAAA,CAAA;AACnB,UAAI,IAAA,aAAA,CAAc,MAAO,CAAA,QAAA,CAAS,yBAA4B,CAAA,EAAA;AAE5D,YAAe,YAAA,GAAA,eAAA,CAAA;AAAA,WAAA;AAEjB,UAAI,IAAA,aAAA,CAAc,MAAO,CAAA,QAAA,CAAS,iCAAoC,CAAA,EAAA;AAEpE,YAAe,YAAA,GAAA,iBAAA,CAAA;AAAA,WAAA;AAEjB,UAAI,IAAA,aAAA,CAAc,MAAO,CAAA,QAAA,CAAS,aAAgB,CAAA,EAAA;AAEhD,YAAe,YAAA,GAAA,cAAA,CAAA;AAAA,WAAA;AAEjB,UAAc,aAAA,CAAA,MAAA,CAAO,GAAG,YAAc,EAAA,cAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAKpC,IAAA,IAAA,CAAA,MAAA,GAAS,CAAC,CAA6C,KAAA;AAC7D,MAAM,MAAA,OAAA,GAAe,iCAAkC,CAAA,mBAAA,CAAoB,CAAE,CAAA,OAAA,CAAA,CAAA;AAC7E,MAAA,MAAM,oBAAoB,OAAQ,CAAA,SAAA,CAAU,SAAS,cAAkB,IAAA,OAAA,CAAQ,UAAU,IAAS,KAAA,gBAAA,CAAA;AAClG,MAAA,IAAI,iBAAmB,EAAA;AACrB,QAAA,IAAA,CAAK,KAAM,CAAA,UAAA,IAAc,IAAK,CAAA,KAAA,CAAM,UAAW,CAAA,OAAA,CAAA,CAAA;AAAA,OAC1C,MAAA;AAEL,QAAA,MAAM,eAAe,MAAM,aAAA,CAAc,kBAAkB,gBAAiB,CAAA,OAAA,EAAS,KAAK,KAAM,CAAA,WAAA,CAAA,CAAA;AAChG,QAAK,IAAA,CAAA,KAAA,CAAM,YAAY,MAAO,CAAA,YAAA,CAAA,CAAA;AAC9B,QAAO,OAAA,IAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAxET,IAAI,IAAA,CAAC,MAAM,OAAS,EAAA;AAClB,MAAA,iCAAA,CAAkC,2BAA2B,KAAM,CAAA,WAAA,EAAa,YAAY,QAAU,CAAA,CAAA,IAAA,CACpG,CAAC,OAAY,KAAA;AACX,QAAO,MAAA,CAAA,MAAA,CAAO,IAAK,CAAA,KAAA,CAAM,OAAS,EAAA,OAAA,CAAA,CAAA;AAClC,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,MAAQ,EAAA,IAAA,EAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAK9B,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,MAAA,EAAQ,CAAC,CAAC,KAAM,CAAA,OAAA;AAAA,MAChB,OAAA,EAAS,MAAM,OAAY,IAAA,EAAA;AAAA,MAC3B,WAAA,EAAa,IAAI,WAAY,CAAA;AAAA,QAC3B,aAAa,KAAM,CAAA,WAAA;AAAA,QACnB,KAAA,EAAO,GACL,KAAM,CAAA,OAAA,CAAQ,QAAQ,SAAU,CAAA,iBAAA,KAAsB,WAAW,UAAa,GAAA,UAAA,CAAA,kBAAA,CAAA;AAAA,QAEhF,aAAe,EAAA,WAAA,CAAY,sBAAuB,CAAA,MAAM,KAAK,KAAM,CAAA,YAAA,EAAA,CAAA;AAAA,QACnE,gBAAgB,IAAK,CAAA,cAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAAA,OAzBb,KAAK,KAAiF,EAAA;AAClG,IAAM,MAAA,UAAA,GAAa,EAAE,eAAiB,EAAA,uBAAA,EAAA,CAAA;AACtC,IAAO,OAAA,UAAA,CAAW,IAAK,CAAA,kBAAA,EAAmB,KAAO,EAAA,UAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAgF5C,MAAS,GAAA;AACd,IAAM,MAAA,EAAE,YAAc,EAAA,WAAA,EAAA,GAAgB,IAAK,CAAA,KAAA,CAAA;AAC3C,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAa,EAAA,OAAA,EAAA,GAAY,IAAK,CAAA,KAAA,CAAA;AAC9C,IAAA,MAAM,WAAc,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,QAAQ,SAAU,CAAA,iBAAA,CAAA;AAEzD,IAAA,2CACG,WAAD,EAAA;AAAA,MACE,SAAS,CAAG,EAAA,WAAA,KAAgB,KAAS,IAAA,WAAA,KAAgB,WAAW,YAAe,GAAA,QAAA,CAAA,aAAA,CAAA;AAAA,MAC/E,aAAe,EAAA,OAAA;AAAA,MACf,SAAS,CAAC,MAAA;AAAA,MACV,WAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAY,IAAK,CAAA,MAAA;AAAA,MACjB,iBAAmB,EAAA,WAAA;AAAA,MACnB,MAAA,EAAQ,CAAC,EAAE,MAAA,EAAQ,SAAS,MAC1B,EAAA,qBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACG,UAAD,EAAA;AAAA,QACE,KAAM,EAAA,gBAAA;AAAA,QACN,MAAA;AAAA,QACA,KAAO,EAAA,OAAA,EAAA;AAAA,QACP,MAAQ,EAAA,CAAC,EAAE,QAAA,EAAA,yCACR,8BAAD,EAAA;AAAA,UAAgC,GAAK,EAAA,QAAA;AAAA,UAAU,MAAA;AAAA,UAAgB,GAAK,EAAA,WAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,sCAIvE,UAAD,EAAA;AAAA,QACE,KAAM,EAAA,cAAA;AAAA,QACN,MAAA;AAAA,QACA,KAAO,EAAA,OAAA,EAAA;AAAA,QACP,MAAQ,EAAA,CAAC,EAAE,QAAA,EAAA,yCAAgB,oCAAD,EAAA;AAAA,UAAsC,GAAK,EAAA,QAAA;AAAA,UAAU,MAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;AAxHtF,IAAA,iBAAA,GAAA,kBAAA,CAAA;AAAA,kBACS,YAAwD,GAAA;AAAA,EACpE,UAAY,EAAA,IAAA;AAAA,EACZ,YAAc,EAAA,IAAA;AAAA,CAAA;;ACzBU,MAAA,cAAA,CAAA;AAAA,CAAA;AAArB,eACS,QAAW,GAAA,mBAAA;;ACY3B,MAAkE,oCAAA,CAAA;AAAA,EAKhE,WACU,CAAA,MAAA,EACA,MACR,EAAA,WAAA,EACO,KACC,iBACR,EAAA;AALQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAED,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA,CAAA;AACC,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AATH,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAE,OAAS,EAAA,IAAA,EAAA,CAAA;AAWxB,IAAK,IAAA,CAAA,kBAAA,CAAmB,WACrB,CAAA,CAAA,IAAA,CAAK,MAAM;AACV,MAAI,IAAA,CAAC,IAAK,CAAA,MAAA,CAAO,WAAa,EAAA;AAC5B,QAAK,IAAA,CAAA,GAAA,CAAI,cAAc,cAAgB,CAAA,CAAA,SAAA,CAAU,KAAK,MAAQ,EAAA,MAAM,KAAK,kBAAmB,CAAA,WAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAG/F,CAAA,CAAA,KAAA,CAAM,MAAM,IAAK,CAAA,SAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIf,qBAAiC,GAAA;AACtC,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,WAAA,CAAY,IAAK,CAAA,QAAA,CAAA;AAChD,MAAA,IAAI,iBAAmB,EAAA;AACrB,QAAO,OAAA,KAAA,CAAA;AAAA,OACE,MAAA,IAAA,IAAA,CAAK,YAAY,QAAU,EAAA;AACpC,QAAO,OAAA,IAAA,CAAA;AAAA,OACF,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA,OAAA;AAAA,KAEJ,MAAA;AACL,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIJ,kBAA2B,GAAA;AAChC,IAAA,MAAM,WAAc,GAAA;AAAA,MAClB,IAAA,EAAM,KAAK,WAAY,CAAA,IAAA;AAAA,MACvB,SAAA,EAAW,KAAK,WAAY,CAAA,OAAA;AAAA,MAC5B,MAAA,EAAQ,KAAK,WAAY,CAAA,MAAA;AAAA,KAAA,CAAA;AAG3B,IAAA,MAAM,WAAc,GAAA;AAAA,MAClB,aAAa,IAAK,CAAA,GAAA;AAAA,MAClB,KAAA,EAAO,aAAgB,GAAA,IAAA,CAAK,WAAY,CAAA,IAAA;AAAA,MACxC,gBAAgB,MAAM;AACpB,QAAA,IAAI,IAAK,CAAA,MAAA,CAAO,QAAS,CAAA,gBAAA,EAAkB,WAAc,CAAA,EAAA;AACvD,UAAA,IAAA,CAAK,OAAO,EAAG,CAAA,GAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAKrB,IAAM,MAAA,YAAA,GAAe,CAAC,MAAgB,KAAA,IAAA,CAAK,kBAAkB,kBAAmB,CAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,GAAK,EAAA,MAAA,CAAA,CAAA;AAE5G,IAAA,MAAM,uBAA0B,GAAA;AAAA,MAC9B,MAAQ,EAAA,iBAAA,GAAoB,IAAK,CAAA,WAAA,CAAY,IAAO,GAAA,GAAA;AAAA,MACpD,UAAA,EAAY,UAAa,GAAA,IAAA,CAAK,WAAY,CAAA,IAAA;AAAA,MAC1C,OAAA,EAAS,KAAK,WAAY,CAAA,OAAA;AAAA,MAC1B,iBAAmB,EAAA,WAAA;AAAA,MACnB,YAAA;AAAA,MACA,YAAc,EAAA,IAAA;AAAA,MACd,8BAAA,EAAgC,IAAK,CAAA,GAAA,CAAI,UAAW,CAAA,8BAAA;AAAA,MACpD,oBAAoB,cAAe,CAAA,QAAA;AAAA,MAEnC,8BAAgC,EAAA,EAAA;AAAA,KAAA,CAAA;AAGlC,IAAA,IAAI,KAAK,GAAI,CAAA,UAAA,CAAW,kCAAkC,IAAK,CAAA,GAAA,CAAI,WAAW,kBAAoB,EAAA;AAChG,MAAwB,uBAAA,CAAA,8BAAA,GAAiC,CAAC,cAAe,CAAA,QAAA,CAAA,CAAA;AAAA,KAAA;AAG3E,IAAA,wBAAA,CAAyB,OAAQ,CAAA,uBAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAG3B,SAAkB,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,OAAO,WAAa,EAAA;AAC3B,MAAA,OAAA;AAAA,KACK,MAAA;AACL,MAAK,IAAA,CAAA,MAAA,CAAO,OAAO,oBAAuB,GAAA,IAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,GAAK,EAAA,IAAA,EAAM,EAAE,QAAU,EAAA,SAAA,EAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIlC,kBAAmB,CAAA,EAAE,IAAM,EAAA,SAAA,EAAW,MAA0D,EAAA,EAAA;AACtG,IAAO,OAAA,iBAAA,CAAkB,cAAe,CAAA,IAAA,CAAK,GAAI,CAAA,IAAA,EAAM,WAAW,MAAQ,EAAA,IAAA,CAAA,CAAM,IAC9E,CAAA,CAAC,kBAAqC,KAAA;AACpC,MAAI,IAAA,OAAA,GAAU,KAAK,GAAI,CAAA,aAAA,CAAc,gBAAgB,IAAK,CAAA,IAAA,CAAK,CAAC,OAA0B,KAAA;AACxF,QAAA,OAAO,QAAQ,IAAS,KAAA,IAAA,IAAQ,QAAQ,OAAY,KAAA,SAAA,IAAa,QAAQ,MAAW,KAAA,MAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAGtF,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,IAAA,CAAK,IAAI,aAAc,CAAA,eAAA,CAAA,CAAiB,IAAK,CAAA,IAAA,CAAK,CAAC,YAAgC,KAAA;AACjF,UAAI,IAAA,YAAA,CAAa,YAAY,SAAW,EAAA;AACtC,YAAA,OAAO,YAAa,CAAA,YAAA,CAAa,IAAK,CAAA,CAAC,OAA0B,KAAA;AAC/D,cAAA,IAAI,MAAS,GAAA,KAAA,CAAA;AACb,cAAI,IAAA,OAAA,CAAQ,SAAS,IAAM,EAAA;AACzB,gBAAU,OAAA,GAAA,OAAA,CAAA;AACV,gBAAS,MAAA,GAAA,IAAA,CAAA;AAAA,eAAA;AAEX,cAAO,OAAA,MAAA,CAAA;AAAA,aAAA,CAAA,CAAA;AAAA,WAEJ,MAAA;AACL,YAAO,OAAA,KAAA,CAAA;AAAA,WAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA;AAKb,MAAK,IAAA,CAAA,WAAA,GAAc,KAAK,kBAAuB,EAAA,GAAA,OAAA,EAAA,CAAA;AAC/C,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AA9G7B,qCAIgB,OAAU,GAAA,CAAC,QAAU,EAAA,QAAA,EAAU,eAAe,KAAO,EAAA,mBAAA,CAAA,CAAA;AA+G9D,MAAM,kCAAqC,GAAA,oDAAA;AAElD,MAAA,CAAO,kCAAoC,EAAA,CAAC,mBAAsB,CAAA,CAAA,CAAA,UAAA,CAChE,kCACA,EAAA,oCAAA,CAAA;;AC/H4C,MAAA,gCAAA,CAAA;AAAA,EAE5C,YAAoB,EAAkB,EAAA;AAAlB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAEb,qBAAqB,WAAsD,EAAA;AAChF,IAAO,OAAA,IAAA,CAAK,GAAG,OAAQ,CAAA,WAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGlB,+CAA+C,OAA2C,EAAA;AAC/F,IAAA,OAAO,IAAI,yBAA0B,CAAA,OAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AARzB,gCADT,CACS,UAAU,CAAC,IAAA,CAAA,CAAA;AAYY,MAAA,yBAAA,CAAA;AAAA,EAoBrC,YAAY,OAAsC,EAAA;AAnB3C,IAAgB,IAAA,CAAA,aAAA,GAAA,UAAA,CAAA;AAChB,IAAW,IAAA,CAAA,QAAA,GAAA,UAAA,CAAA;AAmBhB,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,WAAA,CAAA;AACvB,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,KAAA,CAAA;AACrB,IAAA,IAAA,CAAK,kBAAkB,OAAQ,CAAA,eAAA,CAAA;AAC/B,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA,CAAA;AACtB,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA,CAAA;AACxB,IAAA,IAAA,CAAK,OAAO,OAAQ,CAAA,IAAA,CAAA;AACpB,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,oBAAoB,OAAQ,CAAA,iBAAA,CAAA;AACjC,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAQ,CAAA,UAAA,CAAA;AAC1B,IAAK,IAAA,CAAA,8BAAA,GAAiC,QAAQ,8BAAkC,IAAA,EAAA,CAAA;AAChF,IAAA,IAAA,CAAK,eAAkB,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIpB,MAAM,iCAAoC,GAAA,qDAAA;AACjD,MAAO,CAAA,iCAAA,EAAmC,EAAI,CAAA,CAAA,OAAA,CAC5C,kCACA,EAAA,gCAAA,CAAA;;;;;ACnCK,MAAM,eAAkB,GAAA,qBAAA;AAE/B,MAAM,QAAW,GAAA;AAAA,EACf,8BAAA;AAAA,EACA,qCAAA;AAAA,EACA,kCAAA;AAAA,EACA,iCAAA;AAAA,EACA,kCAAA;AAAA,EACA,mCAAA;AAAA,EACA,kCAAA;AAAA,EACA,qCAAA;AAAA,EACA,qCAAA;AAAA,EACA,qCAAA;AAAA,EACA,2CAAA;AAAA,EACA,wBAAA;AAAA,EACA,8BAAA;AAAA,CAAA,CAAA;AAGF,MAAO,CAAA,eAAA,EAAiB,QAAU,CAAA,CAAA,MAAA,CAAO,MAAM;AAC7C,EAAA,qBAAA,CAAsB,iBAAiB,UAAY,EAAA;AAAA,IACjD,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,IAAA;AAAA,KAAA;AAAA,IAGR,QAAU,EAAA;AAAA,MACR,kBAAoB,EAAA,4CAAA;AAAA,MACpB,iBAAmB,EAAA,6BAAA;AAAA,KAAA;AAAA,IAErB,WAAa,EAAA;AAAA,MACX,qBAAuB,EAAA,iBAAA;AAAA,MACvB,cAAgB,EAAA,qCAAA;AAAA,MAChB,iBAAmB,EAAA,kCAAA;AAAA,MACnB,kBAAoB,EAAA,+CAAA;AAAA,MACpB,WAAa,EAAA,kCAAA;AAAA,MACb,sBAAwB,EAAA,IAAA;AAAA,KAAA;AAAA,IAG1B,YAAc,EAAA;AAAA,MACZ,WAAa,EAAA,iCAAA;AAAA,MACb,6BAA+B,EAAA,wDAAA;AAAA,MAC/B,4BAA8B,EAAA,gCAAA;AAAA,MAC9B,kBAAoB,EAAA,gDAAA;AAAA,MACpB,iBAAmB,EAAA,iCAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA;AAKzB,0BAAA,CAA2B,gBAAiB,CAAA,UAAA,EAAY,CAAC,QAAA,EAAU,YAAY,aAAe,EAAA,iBAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/common/componentUrlDetails.component.ts","../src/common/loadBalancerMessage.component.ts","../src/help/cloudrun.help.ts","../src/instance/details/details.controller.ts","../src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts","../src/loadBalancer/configure/wizard/basicSettings.component.ts","../src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts","../src/loadBalancer/loadBalancerTransformer.ts","../../../node_modules/style-inject/dist/style-inject.es.js","../src/loadBalancer/configure/wizard/wizard.controller.ts","../src/loadBalancer/details/details.controller.ts","../src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts","../src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.ts","../src/pipeline/pipeline.module.ts","../src/pipeline/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/manifest/ManifestSource.ts","../src/manifest/wizard/BasicSettings.tsx","../src/pipeline/stages/deployManifest/serverGroupNamePreview.tsx","../src/pipeline/stages/deployManifest/DeployStageForm.tsx","../src/pipeline/stages/deployManifest/DeployStageConfig.tsx","../src/rolloutStrategy/redblack.strategy.ts","../src/pipeline/stages/deployManifest/deploy.validator.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipeline/stages/deployManifest/deployStage.ts","../src/cloudrun.settings.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.ts","../src/serverGroup/configure/wizard/BasicSettings.tsx","../src/serverGroup/configure/wizard/ConfigFiles.tsx","../src/serverGroup/configure/wizard/serverGroupWizard.tsx","../src/common/cloudrunHealth.ts","../src/serverGroup/details/details.controller.ts","../src/serverGroup/serverGroupTransformer.service.ts","../src/cloudrun.module.ts","../src/logo/cloudrun.logo.png"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst cloudrunComponentUrlDetailsComponent: IComponentOptions = {\n bindings: { component: '<' },\n template: `\n <dt>HTTPS</dt>\n <dl class=\"small\">\n <a href=\"{{$ctrl.component.url}}\" target=\"_blank\">{{$ctrl.component.url}}</a>\n <copy-to-clipboard class=\"copy-to-clipboard copy-to-clipboard-sm\"\n tool-tip=\"'Copy URL to clipboard'\"\n text=\"$ctrl.component.httpsUrl\"></copy-to-clipboard>\n </dl>\n `,\n};\n\nexport const CLOUDRUN_COMPONENT_URL_DETAILS = 'spinnaker.cloudrun.componentUrlDetails.component';\n\nmodule(CLOUDRUN_COMPONENT_URL_DETAILS, []).component(\n 'cloudrunComponentUrlDetails',\n cloudrunComponentUrlDetailsComponent,\n);\n","import { module } from 'angular';\n\nconst cloudRunLoadBalancerMessageComponent: ng.IComponentOptions = {\n bindings: { showCreateMessage: '<', columnOffset: '@', columns: '@' },\n templateUrl: require('./loadBalancerMessage.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE = 'spinnaker.cloudrun.loadBalancer.createMessage.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE, []).component(\n 'cloudrunLoadBalancerMessage',\n cloudRunLoadBalancerMessageComponent,\n);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'cloudrun.serverGroup.stack',\n value:\n '(Optional) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n },\n\n {\n key: 'cloudrun.serverGroup.file',\n value: `<pre>\n apiVersion: serving.knative.dev/v1\n kind: Service\n metadata:\n name: spinappcloud1\n namespace: '135005621049'\n labels:\n cloud.googleapis.com/location: us-central1\n annotations:\n run.googleapis.com/client-name: cloud-console\n serving.knative.dev/creator: kiran@opsmx.io\n serving.knative.dev/lastModifier: kiran@opsmx.io\n client.knative.dev/user-image: us-docker.pkg.dev/cloudrun/container/hello\n run.googleapis.com/ingress-status: all\n spec:\n template:\n metagoogleapis.com/ingress: all\n run.data:\n name: spinappcloud1\n annotations:\n run.googleapis.com/client-name: cloud-console\n autoscaling.knative.dev/minScale: '1'\n autoscaling.knative.dev/maxScale: '3'\n spec:\n containerConcurrency: 80\n timeoutSeconds: 200\n serviceAccountName:spinnaker-cloudrun-account@my-orbit-project-71824.iam.gserviceaccount.com\n containers:\n - image:us-docker.pkg.dev/cloudrun/container/hello\n ports:\n - name: http1\n containerPort: 8080\n resources:\n limits:\n cpu: 1000m\n memory: 256Mi \n</pre>\n `,\n },\n\n {\n key: 'cloudrun.serverGroup.detail',\n value:\n ' (Optional) <b>Detail</b> is a string of free-form alphanumeric characters and hyphens to describe any other variables.',\n },\n {\n key: 'cloudrun.serverGroup.configFiles',\n value: `<p> The contents of a Cloud Run Service yaml </p>`,\n },\n {\n key: 'cloudrun.loadBalancer.allocations',\n value: 'An allocation is the percent of traffic directed to a server group.',\n },\n {\n key: 'cloudrun.manifest.source',\n value: `\n <p>Where the manifest file content is read from.</p>\n <p>\n <b>text:</b> The manifest is supplied statically to the pipeline from the below text-box.\n </p>\n <p>\n <b>artifact:</b> The manifest is read from an artifact supplied/created upstream. The expected artifact must be referenced here, and will be bound at runtime.\n </p>`,\n },\n {\n key: 'cloudrun.manifest.expectedArtifact',\n value:\n 'The artifact that is to be applied to the Cloud Run account for this stage. The artifact should represent a valid Cloud Run manifest.',\n },\n {\n key: 'cloudrun.manifest.skipExpressionEvaluation',\n value:\n '<p>Skip SpEL expression evaluation of the manifest artifact in this stage. Can be paired with the \"Evaluate SpEL expressions in overrides at bake time\" option in the Bake Manifest stage when baking a third-party manifest artifact with expressions not meant for Spinnaker to evaluate as SpEL.</p>',\n },\n {\n key: 'cloudrun.manifest.requiredArtifactsToBind',\n value:\n 'These artifacts must be present in the context for this stage to successfully complete. Artifacts specified will be <a href=\"https://www.spinnaker.io/reference/artifacts/in-cloudrun-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n },\n {\n key: 'cloudrun.manifest.account',\n value: `\n <p>A Spinnaker account corresponds to a physical Cloud Run cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","import type { IController, IQService } from 'angular';\nimport { module } from 'angular';\nimport { flattenDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { InstanceReader, RecentHistoryService } from '@spinnaker/core';\nimport type { ICloudrunInstance } from '../../common/domain';\n\ninterface InstanceFromStateParams {\n instanceId: string;\n}\n\ninterface InstanceManager {\n account: string;\n region: string;\n category: string; // e.g., serverGroup, loadBalancer.\n name: string; // Parent resource name, not instance name.\n instances: ICloudrunInstance[];\n}\n\nclass CloudrunInstanceDetailsController implements IController {\n public state = { loading: true };\n public instance: ICloudrunInstance;\n public instanceIdNotFound: string;\n public upToolTip = \"A Cloud Run instance is 'Up' if a load balancer is directing traffic to its server group.\";\n public outOfServiceToolTip = `\n A Cloud Run instance is 'Out Of Service' if no load balancers are directing traffic to its server group.`;\n\n public static $inject = ['$q', 'app', 'instance'];\n\n constructor(private $q: IQService, private app: Application, instance: InstanceFromStateParams) {\n this.app\n .ready()\n .then(() => this.retrieveInstance(instance))\n .then((instanceDetails) => {\n this.instance = instanceDetails;\n this.state.loading = false;\n })\n .catch(() => {\n this.instanceIdNotFound = instance.instanceId;\n this.state.loading = false;\n });\n }\n\n private retrieveInstance(instance: InstanceFromStateParams): PromiseLike<ICloudrunInstance> {\n const instanceLocatorPredicate = (dataSource: InstanceManager) => {\n return dataSource.instances.some((possibleMatch) => possibleMatch.id === instance.instanceId);\n };\n\n const dataSources: InstanceManager[] = flattenDeep([\n this.app.getDataSource('serverGroups').data,\n this.app.getDataSource('loadBalancers').data,\n this.app.getDataSource('loadBalancers').data.map((loadBalancer: ILoadBalancer) => loadBalancer.serverGroups),\n ]);\n\n const instanceManager = dataSources.find(instanceLocatorPredicate);\n\n if (instanceManager) {\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return InstanceReader.getInstanceDetails(\n instanceManager.account,\n instanceManager.region,\n instance.instanceId,\n ).then((instanceDetails: ICloudrunInstance) => {\n instanceDetails.account = instanceManager.account;\n instanceDetails.region = instanceManager.region;\n return instanceDetails;\n });\n } else {\n return this.$q.reject();\n }\n }\n}\n\nexport const CLOUDRUN_INSTANCE_DETAILS_CTRL = 'spinnaker.cloudrun.instanceDetails.controller';\nmodule(CLOUDRUN_INSTANCE_DETAILS_CTRL, []).controller('cloudrunInstanceDetailsCtrl', CloudrunInstanceDetailsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunAllocationConfigurationRowComponent: IComponentOptions = {\n bindings: {\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n template: `\n <div class=\"form-group\">\n <div class=\"row\">\n <div class=\"col-md-7\">\n <ui-select ng-model=\"$ctrl.allocationDescription.revisionName\"\n on-select=\"$ctrl.onAllocationChange()\"\n class=\"form-control input-sm\">\n <ui-select-match placeholder=\"Select...\">\n {{$select.selected}}\n </ui-select-match>\n <ui-select-choices repeat=\"serverGroup as serverGroup in $ctrl.getServerGroupOptions() | filter: $select.search\">\n <div ng-bind-html=\"serverGroup | highlight: $select.search\"></div>\n </ui-select-choices>\n </ui-select>\n </div>\n <div class=\"col-md-3\">\n <div class=\"input-group input-group-sm\">\n <input type=\"number\"\n ng-model=\"$ctrl.allocationDescription.percent\"\n required\n class=\"form-control input-sm\"\n min=\"0\"\n ng-change=\"$ctrl.onAllocationChange()\"\n max=\"100\"/>\n <span class=\"input-group-addon\">%</span>\n </div>\n </div>\n <div class=\"col-md-2\">\n <a class=\"btn btn-link sm-label\" ng-click=\"$ctrl.removeAllocation()\">\n <span class=\"glyphicon glyphicon-trash\"></span>\n </a>\n </div>\n </div>\n </div>\n `,\n controller: CloudrunAllocationConfigurationRowCtrl,\n};\n\nexport const CLOUDRUN_ALLOCATION_CONFIGURATION_ROW = 'spinnaker.cloudrun.allocationConfigurationRow.component';\n\nmodule(CLOUDRUN_ALLOCATION_CONFIGURATION_ROW, []).component(\n 'cloudrunAllocationConfigurationRow',\n cloudrunAllocationConfigurationRowComponent,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport { difference } from 'lodash';\n\nimport type { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunLoadBalancerSettingsController implements IController {\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public serverGroupOptions: string[];\n public forPipelineConfig: boolean;\n\n public $onInit(): void {\n this.updateServerGroupOptions();\n }\n\n public addAllocation(): void {\n const remainingServerGroups = this.serverGroupsWithoutAllocation();\n if (remainingServerGroups.length) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n revisionName: remainingServerGroups[0],\n percent: 0,\n });\n this.updateServerGroupOptions();\n } else if (this.forPipelineConfig) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n percent: 0,\n revisionName: '',\n });\n }\n }\n\n public removeAllocation(index: number): void {\n this.loadBalancer.splitDescription.allocationDescriptions.splice(index, 1);\n this.updateServerGroupOptions();\n }\n\n public allocationIsInvalid(): boolean {\n return (\n this.loadBalancer.splitDescription.allocationDescriptions.reduce(\n (sum, allocationDescription) => sum + allocationDescription.percent,\n 0,\n ) !== 100\n );\n }\n\n public updateServerGroupOptions(): void {\n this.serverGroupOptions = this.serverGroupsWithoutAllocation();\n }\n\n public showAddButton(): boolean {\n if (this.forPipelineConfig) {\n return true;\n } else {\n return this.serverGroupsWithoutAllocation().length > 0;\n }\n }\n\n public initializeAsTextInput(serverGroupName: string): boolean {\n if (this.forPipelineConfig) {\n return !this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name).includes(serverGroupName);\n } else {\n return false;\n }\n }\n\n private serverGroupsWithoutAllocation(): string[] {\n const serverGroupsWithAllocation = this.loadBalancer.splitDescription.allocationDescriptions.map(\n (description) => description.revisionName,\n );\n const allServerGroups = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n return difference(allServerGroups, serverGroupsWithAllocation);\n }\n}\n\nconst cloudrunLoadBalancerSettingsComponent: ng.IComponentOptions = {\n bindings: { loadBalancer: '=', forPipelineConfig: '<', application: '<' },\n controller: CloudrunLoadBalancerSettingsController,\n templateUrl: require('./basicSettings.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS = 'spinnaker.cloudrun.loadBalancerSettings.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS, []).component(\n 'cloudrunLoadBalancerBasicSettings',\n cloudrunLoadBalancerSettingsComponent,\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport { StageConstants } from '@spinnaker/core';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunStageAllocationLabelCtrl implements IController {\n public inputViewValue: string;\n private allocationDescription: ICloudrunAllocationDescription;\n\n private static mapTargetCoordinateToLabel(targetCoordinate: string): string {\n const target = StageConstants.TARGET_LIST.find((t) => t.val === targetCoordinate);\n if (target) {\n return target.label;\n } else {\n return null;\n }\n }\n\n public $doCheck(): void {\n this.setInputViewValue();\n }\n\n private setInputViewValue(): void {\n if (this.allocationDescription.cluster && this.allocationDescription.target) {\n const targetLabel = CloudrunStageAllocationLabelCtrl.mapTargetCoordinateToLabel(\n this.allocationDescription.target,\n );\n this.inputViewValue = `${targetLabel} (${this.allocationDescription.cluster})`;\n } else {\n this.inputViewValue = null;\n }\n }\n}\n\nconst cloudrunStageAllocationLabel: IComponentOptions = {\n bindings: { allocationDescription: '<' },\n controller: CloudrunStageAllocationLabelCtrl,\n template: `<input ng-model=\"$ctrl.inputViewValue\" type=\"text\" class=\"form-control input-sm\" readonly/>`,\n};\n\nclass CloudrunStageAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n public targets = StageConstants.TARGET_LIST;\n public clusterList: string[];\n public onAllocationChange: Function;\n private name: string;\n\n public $onInit() {\n this.allocationDescription.cluster = this.name;\n }\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunStageAllocationConfigurationRow: IComponentOptions = {\n bindings: {\n application: '<',\n region: '@',\n account: '@',\n name: '@',\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n controller: CloudrunStageAllocationConfigurationRowCtrl,\n templateUrl: require('./stageAllocationConfigurationRow.component.html'),\n};\n\nexport const CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW =\n 'spinnaker.cloudrun.stageAllocationConfigurationRow.component';\nmodule(CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW, [])\n .component('cloudrunStageAllocationConfigurationRow', cloudrunStageAllocationConfigurationRow)\n .component('cloudrunStageAllocationLabel', cloudrunStageAllocationLabel);\n","import { module } from 'angular';\nimport { camelCase, chain, cloneDeep, filter, get, has, reduce } from 'lodash';\n\nimport type {\n Application,\n IInstance,\n IInstanceCounts,\n ILoadBalancer,\n ILoadBalancerUpsertCommand,\n IServerGroup,\n} from '@spinnaker/core';\n//import type { ICloudrunLoadBalancer, ICloudrunTrafficSplit, ShardBy } from '../common/domain/index';\nimport type { ICloudrunLoadBalancer, ICloudrunTrafficSplit } from '../common/domain/index';\n\nexport interface ICloudrunAllocationDescription {\n revisionName?: string;\n target?: string;\n cluster?: string;\n percent: number;\n}\n\nexport interface ICloudrunTrafficSplitDescription {\n allocationDescriptions: ICloudrunAllocationDescription[];\n}\n\nexport class CloudrunLoadBalancerUpsertDescription implements ILoadBalancerUpsertCommand, ICloudrunLoadBalancer {\n public credentials: string;\n public account: string;\n public loadBalancerName: string;\n public name: string;\n public splitDescription: ICloudrunTrafficSplitDescription;\n public split?: ICloudrunTrafficSplit;\n public migrateTraffic: boolean;\n public region: string;\n public cloudProvider: string;\n public serverGroups?: any[];\n\n public static convertTrafficSplitToTrafficSplitDescription(\n split: ICloudrunTrafficSplit,\n ): ICloudrunTrafficSplitDescription {\n const allocationDescriptions = reduce(\n split.trafficTargets,\n (acc: any, trafficTarget: any) => {\n const { revisionName, percent } = trafficTarget;\n return acc.concat({ percent, revisionName });\n },\n [],\n );\n return { allocationDescriptions };\n }\n\n constructor(loadBalancer: ICloudrunLoadBalancer) {\n this.credentials = loadBalancer.account || loadBalancer.credentials;\n this.account = this.credentials;\n this.cloudProvider = loadBalancer.cloudProvider;\n this.loadBalancerName = loadBalancer.name;\n this.name = loadBalancer.name;\n this.region = loadBalancer.region;\n this.migrateTraffic = loadBalancer.migrateTraffic || false;\n this.serverGroups = loadBalancer.serverGroups;\n }\n\n public mapAllocationsToDecimals() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n description.percent = description.percent / 100;\n });\n }\n\n public mapAllocationsToPercentages() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n // An allocation percent has at most one decimal place.\n description.percent = Math.round(description.percent);\n });\n }\n}\n\nexport class CloudrunLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n public normalizeLoadBalancer(loadBalancer: ILoadBalancer): PromiseLike<ILoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n loadBalancer.instances = [];\n loadBalancer.serverGroups.forEach((serverGroup) => {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = (serverGroup.detachedInstances as any).map((id: string) => ({ id }));\n }\n serverGroup.instances = serverGroup.instances\n .concat(serverGroup.detachedInstances || [])\n .map((instance: any) => this.transformInstance(instance, loadBalancer));\n });\n\n const activeServerGroups = filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.instances = chain(activeServerGroups).map('instances').flatten().value() as IInstance[];\n return this.$q.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(\n loadBalancer: ICloudrunLoadBalancer,\n application: Application,\n ): PromiseLike<ICloudrunLoadBalancer> {\n return application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n const upToDateLoadBalancer = application\n .getDataSource('loadBalancers')\n .data.find((candidate: ILoadBalancer) => {\n return (\n candidate.name === loadBalancer.name &&\n (candidate.account === loadBalancer.account || candidate.account === loadBalancer.credentials)\n );\n });\n\n if (upToDateLoadBalancer) {\n loadBalancer.serverGroups = cloneDeep(upToDateLoadBalancer.serverGroups);\n }\n return loadBalancer;\n });\n }\n\n public convertLoadBalancerToUpsertDescription(\n loadBalancer: ICloudrunLoadBalancer,\n ): CloudrunLoadBalancerUpsertDescription {\n return new CloudrunLoadBalancerUpsertDescription(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts: IInstanceCounts = chain(serverGroups)\n .map('instances')\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n if (has(instance, 'health.state')) {\n acc[camelCase(instance.health.state)]++;\n }\n return acc;\n },\n { up: 0, down: 0, outOfService: 0, succeeded: 0, failed: 0, starting: 0, unknown: 0 },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups).map('detachedInstances').flatten().value().length;\n return instanceCounts;\n }\n\n private transformInstance(instance: any, loadBalancer: ILoadBalancer) {\n instance.provider = loadBalancer.type;\n instance.account = loadBalancer.account;\n instance.region = loadBalancer.region;\n instance.loadBalancers = [loadBalancer.name];\n const health = instance.health || {};\n instance.healthState = get(instance, 'health.state') || 'OutOfService';\n instance.health = [health];\n\n return instance as IInstance;\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_TRANSFORMER = 'spinnaker.cloudrun.loadBalancer.transformer.service';\n\nmodule(CLOUDRUN_LOAD_BALANCER_TRANSFORMER, []).service(\n 'cloudrunLoadBalancerTransformer',\n CloudrunLoadBalancerTransformer,\n);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application } from '@spinnaker/core';\nimport { LoadBalancerWriter, TaskMonitor } from '@spinnaker/core';\n\nimport type { CloudrunLoadBalancerTransformer, ICloudrunTrafficSplitDescription } from '../../loadBalancerTransformer';\nimport { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nimport './wizard.less';\n\nclass CloudrunLoadBalancerWizardController implements IController {\n public state = { loading: true };\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public heading: string;\n public submitButtonLabel: string;\n public taskMonitor: TaskMonitor;\n\n public static $inject = [\n '$scope',\n '$state',\n '$uibModalInstance',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'forPipelineConfig',\n 'cloudrunLoadBalancerTransformer',\n 'wizardSubFormValidation',\n ];\n constructor(\n public $scope: ng.IScope,\n private $state: StateService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n loadBalancer: CloudrunLoadBalancerUpsertDescription,\n public isNew: boolean,\n private forPipelineConfig: boolean,\n private cloudrunLoadBalancerTransformer: CloudrunLoadBalancerTransformer,\n private wizardSubFormValidation: any,\n ) {\n this.submitButtonLabel = this.forPipelineConfig ? 'Done' : 'Update';\n\n if (this.isNew) {\n this.heading = 'Create New Load Balancer';\n } else {\n this.heading = `Edit ${[\n loadBalancer.name,\n loadBalancer.region,\n loadBalancer.account || loadBalancer.credentials,\n ].join(':')}`;\n this.cloudrunLoadBalancerTransformer\n .convertLoadBalancerForEditing(loadBalancer, application)\n .then((convertedLoadBalancer) => {\n this.loadBalancer = this.cloudrunLoadBalancerTransformer.convertLoadBalancerToUpsertDescription(\n convertedLoadBalancer,\n );\n if (loadBalancer.split && !this.loadBalancer.splitDescription) {\n this.loadBalancer.splitDescription = CloudrunLoadBalancerUpsertDescription.convertTrafficSplitToTrafficSplitDescription(\n loadBalancer.split,\n );\n } else {\n this.loadBalancer.splitDescription = loadBalancer.splitDescription;\n }\n this.loadBalancer.mapAllocationsToPercentages();\n this.setTaskMonitor();\n this.initializeFormValidation();\n this.state.loading = false;\n });\n }\n }\n\n public submit(): any {\n const description = cloneDeep(this.loadBalancer);\n description.mapAllocationsToPercentages();\n delete description.serverGroups;\n\n if (this.forPipelineConfig) {\n return this.$uibModalInstance.close(description);\n } else {\n return this.taskMonitor.submit(() => {\n return LoadBalancerWriter.upsertLoadBalancer(description, this.application, 'Update');\n });\n }\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public showSubmitButton(): boolean {\n return this.wizardSubFormValidation.subFormsAreValid();\n }\n\n private setTaskMonitor(): void {\n this.taskMonitor = new TaskMonitor({\n application: this.application,\n title: 'Updating your load balancer',\n modalInstance: this.$uibModalInstance,\n onTaskComplete: () => this.onTaskComplete(),\n });\n }\n\n private initializeFormValidation(): void {\n this.wizardSubFormValidation.config({ form: 'form', scope: this.$scope }).register({\n page: 'basic-settings',\n subForm: 'basicSettingsForm',\n validators: [\n {\n watchString: 'ctrl.loadBalancer.splitDescription',\n validator: (splitDescription: ICloudrunTrafficSplitDescription): boolean => {\n return (\n splitDescription.allocationDescriptions.reduce((sum, description) => sum + description.percent, 0) === 100\n );\n },\n watchDeep: true,\n },\n ],\n });\n }\n\n private onTaskComplete(): void {\n this.application.getDataSource('loadBalancers').refresh();\n this.application.getDataSource('loadBalancers').onNextRefresh(this.$scope, () => this.onApplicationRefresh());\n }\n\n private onApplicationRefresh(): void {\n // If the user has already closed the modal, do not navigate to the new details view\n if ((this.$scope as any).$$destroyed) {\n // $$destroyed is not in the ng.IScope interface\n return;\n }\n\n this.$uibModalInstance.dismiss();\n const newStateParams = {\n name: this.loadBalancer.name,\n accountId: this.loadBalancer.credentials,\n region: this.loadBalancer.region,\n provider: 'cloudrun',\n };\n\n if (!this.$state.includes('**.loadBalancerDetails')) {\n this.$state.go('.loadBalancerDetails', newStateParams);\n } else {\n this.$state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL = 'spinnaker.cloudrun.loadBalancer.wizard.controller';\n\nmodule(CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL, []).controller(\n 'cloudrunLoadBalancerWizardCtrl',\n CloudrunLoadBalancerWizardController,\n);\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer, ILoadBalancerDeleteCommand } from '@spinnaker/core';\nimport { ConfirmationModalService, LoadBalancerWriter } from '@spinnaker/core';\nimport type { ICloudrunLoadBalancer } from '../../common/domain/index';\n\ninterface ILoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunLoadBalancerDetailsController implements IController {\n public state = { loading: true };\n private loadBalancerFromParams: ILoadBalancerFromStateParams;\n public loadBalancer: ICloudrunLoadBalancer;\n\n public static $inject = ['$uibModal', '$state', '$scope', 'loadBalancer', 'app'];\n constructor(\n private $uibModal: IModalService,\n private $state: StateService,\n private $scope: IScope,\n loadBalancer: ILoadBalancerFromStateParams,\n private app: Application,\n ) {\n this.loadBalancerFromParams = loadBalancer;\n this.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n // edit loadbalancer to change traffic\n\n public editLoadBalancer(): void {\n this.$uibModal.open({\n templateUrl: require('../configure/wizard/wizard.html'),\n controller: 'cloudrunLoadBalancerWizardCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: () => this.app,\n loadBalancer: () => cloneDeep(this.loadBalancer),\n isNew: () => false,\n forPipelineConfig: () => false,\n },\n });\n }\n\n private extractLoadBalancer(): void {\n this.loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {\n return test.name === this.loadBalancerFromParams.name && test.account === this.loadBalancerFromParams.accountId;\n }) as ICloudrunLoadBalancer;\n\n if (this.loadBalancer) {\n this.state.loading = false;\n this.app.getDataSource('loadBalancers').onRefresh(this.$scope, () => this.extractLoadBalancer());\n } else {\n this.autoClose();\n }\n }\n\n public deleteLoadBalancer(): void {\n const taskMonitor = {\n application: this.app,\n title: 'Deleting ' + this.loadBalancer.name,\n };\n\n const submitMethod = () => {\n const loadBalancer: ILoadBalancerDeleteCommand = {\n cloudProvider: this.loadBalancer.cloudProvider,\n loadBalancerName: this.loadBalancer.name,\n credentials: this.loadBalancer.account,\n };\n return LoadBalancerWriter.deleteLoadBalancer(loadBalancer, this.app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + this.loadBalancer.name + '?',\n buttonText: 'Delete ' + this.loadBalancer.name,\n body: this.getConfirmationModalBodyHtml(),\n account: this.loadBalancer.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n });\n }\n\n public canDeleteLoadBalancer(): boolean {\n return this.loadBalancer.name !== 'default';\n }\n\n private getConfirmationModalBodyHtml(): string {\n const serverGroupNames = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n const hasAny = serverGroupNames ? serverGroupNames.length > 0 : false;\n const hasMoreThanOne = serverGroupNames ? serverGroupNames.length > 1 : false;\n\n // HTML accepted by the confirmationModalService is static (i.e., not managed by angular).\n if (hasAny) {\n if (hasMoreThanOne) {\n const listOfServerGroupNames = serverGroupNames.map((name) => `<li>${name}</li>`).join('');\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy the following server groups:\n <ul>\n ${listOfServerGroupNames}\n </ul>\n </p>\n </div>\n `;\n } else {\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy <b>${serverGroupNames[0]}</b>.\n </p>\n </div>\n `;\n }\n } else {\n return null;\n }\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.cloudrun.loadBalancerDetails.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL, []).controller(\n 'cloudrunLoadBalancerDetailsCtrl',\n CloudrunLoadBalancerDetailsController,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService, IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry } from '@spinnaker/core';\n\nclass CloudrunLoadBalancerChoiceModalCtrl implements IController {\n public state = { loading: true };\n public loadBalancers: ILoadBalancer[];\n public selectedLoadBalancer: ILoadBalancer;\n\n public static $inject = ['$uibModal', '$uibModalInstance', 'application'];\n constructor(\n private $uibModal: IModalService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.initialize();\n }\n\n public submit(): void {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n const updatedLoadBalancerPromise = this.$uibModal.open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.application,\n loadBalancer: () => cloneDeep(this.selectedLoadBalancer),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n }).result;\n\n this.$uibModalInstance.close(updatedLoadBalancerPromise);\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n private initialize(): void {\n this.application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n this.loadBalancers = (this.application.loadBalancers.data as ILoadBalancer[]).filter(\n (candidate) => candidate.cloudProvider === 'cloudrun',\n );\n\n if (this.loadBalancers.length) {\n this.selectedLoadBalancer = this.loadBalancers[0];\n }\n this.state.loading = false;\n });\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL = 'spinnaker.Cloudrun.loadBalancerChoiceModal.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL, []).controller(\n 'cloudrunLoadBalancerChoiceModelCtrl',\n CloudrunLoadBalancerChoiceModalCtrl,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry, Registry } from '@spinnaker/core';\n\nimport { CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL } from './loadBalancerChoice.modal.controller';\n\nclass CloudrunEditLoadBalancerStageCtrl implements IController {\n public static $inject = ['$scope', '$uibModal'];\n constructor(public $scope: any, private $uibModal: IModalService) {\n $scope.stage.loadBalancers = $scope.stage.loadBalancers || [];\n $scope.stage.cloudProvider = 'cloudrun';\n }\n\n public addLoadBalancer(): void {\n this.$uibModal\n .open({\n templateUrl: require('./loadBalancerChoice.modal.html'),\n controller: `cloudrunLoadBalancerChoiceModelCtrl as ctrl`,\n resolve: {\n application: () => this.$scope.application,\n },\n })\n .result.then((newLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers.push(newLoadBalancer);\n })\n .catch(() => {});\n }\n\n public editLoadBalancer(index: number) {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n this.$uibModal\n .open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.$scope.application,\n loadBalancer: () => cloneDeep(this.$scope.stage.loadBalancers[index]),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n })\n .result.then((updatedLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers[index] = updatedLoadBalancer;\n })\n .catch(() => {});\n }\n\n public removeLoadBalancer(index: number): void {\n this.$scope.stage.loadBalancers.splice(index, 1);\n }\n}\n\nexport const CLOUDRUN_EDIT_LOAD_BALANCER_STAGE = 'spinnaker.cloudrun.pipeline.stage.editLoadBalancerStage';\nmodule(CLOUDRUN_EDIT_LOAD_BALANCER_STAGE, [CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Edit Load Balancer (Cloud Run)',\n description: 'Edits a load balancer',\n key: 'upsertCloudrunLoadBalancers',\n cloudProvider: 'cloudrun',\n templateUrl: require('./editLoadBalancerStage.html'),\n executionDetailsUrl: require('./editLoadBalancerExecutionDetails.html'),\n executionConfigSections: ['editLoadBalancerConfig', 'taskStatus'],\n controller: 'cloudrunEditLoadBalancerStageCtrl',\n controllerAs: 'editLoadBalancerStageCtrl',\n validators: [],\n });\n })\n .controller('cloudrunEditLoadBalancerStageCtrl', CloudrunEditLoadBalancerStageCtrl);\n","import { module } from 'angular';\n\nimport { CLOUDRUN_EDIT_LOAD_BALANCER_STAGE } from './stages/editLoadBalancer/cloudrunEditLoadBalancerStage';\n\nexport const CLOUDRUN_PIPELINE_MODULE = 'spinnaker.cloudrun.pipeline.module';\nmodule(CLOUDRUN_PIPELINE_MODULE, [CLOUDRUN_EDIT_LOAD_BALANCER_STAGE]);\n","import React from 'react';\n\nimport type { IArtifact, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';\nimport { ArtifactTypePatterns, StageArtifactSelector } from '@spinnaker/core';\n\nexport interface IManifestBindArtifact {\n expectedArtifactId?: string;\n artifact?: IArtifact;\n}\n\nexport interface IManifestBindArtifactsSelectorProps {\n pipeline: IPipeline;\n stage: IStage;\n bindings?: IManifestBindArtifact[];\n onChangeBindings: (_: IManifestBindArtifact[]) => void;\n}\n\nexport class ManifestBindArtifactsSelector extends React.Component<IManifestBindArtifactsSelectorProps> {\n private onChangeBinding = (index: number, binding: IManifestBindArtifact) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings[index] = binding;\n this.props.onChangeBindings(bindings);\n };\n\n private onRemoveBinding = (index: number) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings.splice(index, 1);\n this.props.onChangeBindings(bindings);\n };\n\n public render() {\n const { stage, pipeline, bindings } = this.props;\n\n const renderSelect = (i: number, binding?: IManifestBindArtifact) => {\n const key = (!binding && 'new') || binding.expectedArtifactId || (binding.artifact && binding.artifact.id);\n return (\n <div className=\"row\" key={key}>\n <div className=\"col-md-10\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n expectedArtifactId={binding && binding.expectedArtifactId}\n artifact={!!binding && binding.artifact}\n onArtifactEdited={(artifact: IArtifact) => this.onChangeBinding(i, { artifact: artifact })}\n onExpectedArtifactSelected={(expectedArtifact: IExpectedArtifact) =>\n this.onChangeBinding(i, { expectedArtifactId: expectedArtifact.id })\n }\n excludedArtifactIds={bindings.map((b) => b.expectedArtifactId)}\n excludedArtifactTypePatterns={[ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE]}\n />\n </div>\n {binding && (\n <div className=\"col-md-2\">\n <a className=\"glyphicon glyphicon-trash\" onClick={() => this.onRemoveBinding(i)} />\n </div>\n )}\n </div>\n );\n };\n const renderSelectEditable = (binding: IManifestBindArtifact, i: number) => renderSelect(i, binding);\n\n return (\n <>\n {bindings.map(renderSelectEditable)}\n {renderSelect(bindings.length)}\n </>\n );\n }\n}\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IAccount } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField } from '@spinnaker/core';\n\nimport type { ICloudrunManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n}\n\nexport function ManifestBasicSettings({ accounts, onAccountSelect, selectedAccount }: IManifestBasicSettingsProps) {\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Account <HelpField id=\"cloudrun.manifest.account\" />\n </div>\n <div className=\"col-md-8\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<ICloudrunManifestCommandData>;\n}\n\nexport class WizardManifestBasicSettings extends React.Component<IWizardManifestBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n public render() {\n const { formik } = this.props;\n return (\n <ManifestBasicSettings\n accounts={formik.values.metadata.backingData.accounts}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command.account}\n />\n );\n }\n}\n","import React from 'react';\n\nexport interface IServerGroupNamePreviewProps {\n application: string;\n stack: string;\n details: string;\n}\n\nexport class ServerGroupNamePreview extends React.Component<IServerGroupNamePreviewProps> {\n public render() {\n const application = this.props.application ? this.props.application : '';\n const stack = this.props.stack ? `-${this.props.stack}` : '';\n\n const details = this.props.details ? `-${this.props.details}` : '';\n return (\n <pre style={{ textAlign: 'center' }}>\n <p> Your server group will be in the cluster:</p>\n <p>\n <b>\n {application}\n {stack}\n {details}\n </b>\n </p>\n </pre>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\nimport { ServerGroupNamePreview } from './serverGroupNamePreview';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n application: string;\n stack: string;\n details: string;\n}\n\nexport class DeployStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const stage = this.props.formik.values;\n const manifests: any[] = get(props.formik.values, 'manifests');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(manifests) && isTextManifest ? yamlDocumentsToString(manifests) : '',\n application: this.props.application.name,\n stack: get(stage, 'stack'),\n details: get(stage, 'details'),\n };\n }\n\n private getSourceOptions = (): Array<Option<string>> => {\n return map([ManifestSource.TEXT, ManifestSource.ARTIFACT], (option) => ({\n label: capitalize(option),\n value: option,\n }));\n };\n\n private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('manifests', manifests);\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.formik.setFieldValue('manifestArtifactId', expectedArtifactId);\n this.props.formik.setFieldValue('manifestArtifact', null);\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.formik.setFieldValue('manifestArtifactId', null);\n this.props.formik.setFieldValue('manifestArtifact', artifact);\n };\n\n private getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.formik.values;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.formik.setFieldValue(\n 'requiredArtifactIds',\n bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n );\n this.props.formik.setFieldValue(\n 'requiredArtifacts',\n bindings.filter((b) => b.artifact),\n );\n };\n\n public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n accounts={this.props.accounts}\n onAccountSelect={(accountName) => this.props.formik.setFieldValue('account', accountName)}\n selectedAccount={stage.account}\n />\n <StageConfigField label=\"Application\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={this.props.application.name}\n onChange={(event) => this.props.formik.setFieldValue('application', event.target.value)}\n disabled\n />\n </StageConfigField>\n <StageConfigField label=\"Stack\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.stack}\n onChange={(event) => this.props.formik.setFieldValue('stack', event.target.value)}\n />\n </StageConfigField>\n <StageConfigField label=\"Details\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.details}\n onChange={(event) => this.props.formik.setFieldValue('details', event.target.value)}\n />\n </StageConfigField>\n <ServerGroupNamePreview\n application={this.props.application.name}\n stack={stage.stack}\n details={stage.details}\n ></ServerGroupNamePreview>\n\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"cloudrun.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.formik.setFieldValue('source', e.target.value)}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <StageConfigField label=\"Manifest\">\n <YamlEditor onChange={this.handleRawManifestChange} value={this.state.rawManifest} />\n </StageConfigField>\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"cloudrun.manifest.expectedArtifact\"\n label=\"Manifest Artifact\"\n onArtifactEdited={this.onManifestArtifactEdited}\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onManifestArtifactSelected(artifact.id)}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n <StageConfigField label=\"Expression Evaluation\" helpKey=\"cloudrun.manifest.skipExpressionEvaluation\">\n <CheckboxInput\n checked={stage.skipExpressionEvaluation === true}\n onChange={(e: any) => this.props.formik.setFieldValue('skipExpressionEvaluation', e.target.checked)}\n text=\"Skip SpEL expression evaluation\"\n />\n </StageConfigField>\n </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"cloudrun.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n </div>\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type { IAccountDetails, IStage, IStageConfigProps } from '@spinnaker/core';\nimport { AccountService, FormikStageConfig } from '@spinnaker/core';\n\nimport { DeployStageForm } from './DeployStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployStageConfig extends React.Component<IStageConfigProps, IDeployManifestStageConfigState> {\n private stage: IStage;\n private destroy$ = new Subject();\n\n public constructor(props: IStageConfigProps) {\n super(props);\n this.state = {\n accounts: [],\n };\n const { stage: initialStageConfig } = props;\n const stage = cloneDeep(initialStageConfig);\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n if (!stage.skipExpressionEvaluation) {\n stage.skipExpressionEvaluation = false;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'cloudrun';\n }\n if (!stage.moniker) {\n stage.moniker = {};\n }\n if (!stage.moniker.app) {\n stage.moniker.app = props.application.name;\n }\n // Intentionally initializing the stage config only once in the constructor\n // The stage config is then completely owned within FormikStageConfig's Formik state\n this.stage = stage;\n }\n\n public componentDidMount() {\n this.fetchAccounts();\n }\n\n private fetchAccounts = (): void => {\n observableFrom(AccountService.getAllAccountDetailsForProvider('cloudrun'))\n .pipe(takeUntil(this.destroy$))\n .subscribe((accounts: IAccountDetails[]) => {\n this.setState({ accounts });\n });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <DeployStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\n}\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyRedBlack: IDeploymentStrategy = {\n label: 'Red/Black',\n description: 'Disables <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'redblack',\n};\n","import { get, isEmpty } from 'lodash';\n\nimport type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { strategyRedBlack } from '../../../rolloutStrategy/redblack.strategy';\n\nconst MAX_VERSION_HISTORY_ANNOTATION = 'strategy.spinnaker.io/max-version-history';\n\nexport const deployValidators = (): IValidatorConfig[] => {\n return [\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'source', fieldLabel: 'Source' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IStage) => {\n const enabled = get(stage, 'trafficManagement.enabled', false);\n const services = get(stage, 'trafficManagement.options.services', []);\n if (enabled && isEmpty(services)) {\n return `Select at least one <strong>Service</strong> to enable Spinnaker-managed rollout strategy options.`;\n }\n if (enabled && stage.source === ManifestSource.TEXT) {\n const manifests = get(stage, 'manifests', []);\n const replicaSetManifests = manifests.filter((m) => m.kind === 'ReplicaSet');\n const strategy = get(stage, 'trafficManagement.options.strategy');\n const maxVersionHistory = parseInt(\n get(replicaSetManifests, [0, 'metadata', 'annotations', MAX_VERSION_HISTORY_ANNOTATION]),\n 10,\n );\n if (strategy === strategyRedBlack.key && maxVersionHistory < 2) {\n return `The max version history specified in your manifest conflicts with the behavior of the Red/Black rollout strategy. Please update your <strong>${MAX_VERSION_HISTORY_ANNOTATION}</strong> annotation to a value greater than or equal to 2.`;\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import React from 'react';\nimport type { IManifest } from '@spinnaker/core';\n\ninterface IStatusClasses {\n [key: string]: string;\n}\n\nconst STATUS_PILLS: IStatusClasses = {\n available: 'success',\n stable: 'success',\n paused: 'warn',\n failed: 'danger',\n};\n\nexport interface IDeployManifestStatusProps {\n manifest: IManifest;\n}\n\nexport class DeployManifestStatusPills extends React.Component<IDeployManifestStatusProps> {\n public render() {\n const { manifest } = this.props;\n if (manifest == null || manifest.status == null) {\n return null;\n }\n return Object.keys(manifest.status).map((statusKey, i) => {\n const statusDescription = manifest.status[statusKey];\n const statusClass = STATUS_PILLS[statusKey] || '';\n const isStable = statusDescription.state;\n const isUnstableWithMessage = !isStable && statusDescription.message;\n return (\n <span key={i}>\n {isStable && (\n <span title={statusDescription.message} className={`pill ${statusClass}`}>\n {statusKey}\n </span>\n )}\n {isUnstableWithMessage && (\n <span title={statusDescription.message} className=\"pill warn\">\n {statusKey}\n </span>\n )}\n <span> </span>\n </span>\n );\n });\n }\n}\n","import { get, trim } from 'lodash';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { AccountService, ReactInjector } from '@spinnaker/core';\n\nconst UNMAPPED_K8S_RESOURCE_STATE_KEY = 'cloudrunResource';\n\nexport interface IManifestDetailsProps {\n manifest: IManifest;\n linkName: string;\n accountId: string;\n}\n\nexport interface IManifestDetailsState {\n url: string;\n}\n\nexport class ManifestDetailsLink extends React.Component<IManifestDetailsProps, IManifestDetailsState> {\n private spinnakerKindStateMap: { [k: string]: string } = {\n // keys from clouddriver's CloudrunSpinnakerKindMap\n serverGroupManagers: 'serverGroupManager',\n serverGroups: 'serverGroup',\n };\n\n constructor(props: IManifestDetailsProps) {\n super(props);\n this.state = {\n url: '',\n };\n this.loadUrl();\n }\n\n private canOpen(): boolean {\n return !!this.props.manifest.manifest && !!this.state.url;\n }\n\n private spinnakerKindFromCloudrunKind(kind: string, kindMap: { [k: string]: string }) {\n const foundKind = Object.keys(kindMap).find((k) => k.toLowerCase() === kind.toLowerCase());\n return kindMap[foundKind];\n }\n\n private resourceRegion(): string {\n return trim(\n get(this.props, ['manifest', 'manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n }\n\n private getStateParams(stateKey: string): any {\n const kind = this.props.manifest.manifest.kind.toLowerCase();\n const name = this.props.manifest.manifest.metadata.name;\n const region = this.resourceRegion();\n const params: { [k: string]: string } = {\n accountId: this.props.accountId,\n provider: 'cloudrun',\n region,\n reg: region, // Filters the list of clusters on the Clusters screen to those in the same namespace\n [stateKey]: `${kind} ${name}`,\n };\n if (!params.region && kind === 'namespace' && stateKey === UNMAPPED_K8S_RESOURCE_STATE_KEY) {\n params.region = name;\n }\n if (!params.region || params.region === '') {\n params.region = '_';\n }\n return params;\n }\n\n private loadUrl() {\n const kind: string = get(this.props, ['manifest', 'manifest', 'kind'], '');\n const { accountId } = this.props;\n AccountService.getAccountDetails(accountId).then((account) => {\n const spinnakerKind = this.spinnakerKindFromCloudrunKind(kind, account.spinnakerKindMap);\n const stateKey = this.spinnakerKindStateMap[spinnakerKind] || UNMAPPED_K8S_RESOURCE_STATE_KEY;\n const params = this.getStateParams(stateKey);\n const url = ReactInjector.$state.href(`home.applications.application.insight.clusters.${stateKey}`, params);\n this.setState({ url });\n });\n }\n\n public render() {\n if (this.canOpen()) {\n return (\n <a href={this.state.url} className=\"clickable\">\n {this.props.linkName}\n </a>\n );\n } else {\n return null;\n }\n }\n}\n","import { get, trim } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest, IManifestEvent } from '@spinnaker/core';\nimport { JobEventBasedPodNameProvider, JobManifestPodLogs, relativeTime } from '@spinnaker/core';\n\nexport interface IManifestEventsProps {\n manifest: IManifest;\n}\n\nexport class ManifestEvents extends React.Component<IManifestEventsProps> {\n private pillStyle(e: IManifestEvent): string {\n if (e.type === 'Warning') {\n return 'alert';\n } else if (e.type === 'Normal') {\n return 'success';\n } else {\n return '';\n }\n }\n\n public render() {\n if (!this.props.manifest) {\n return null;\n }\n if (this.props.manifest && (!this.props.manifest.events || this.props.manifest.events.length === 0)) {\n return <div>No recent events found - Cloud Run does not store events for long.</div>;\n }\n const { events } = this.props.manifest;\n const namespace = trim(\n get(this.props.manifest, ['manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n return events.map((e, i) => {\n const firstTimestamp = get(e, 'firstTimestamp', '');\n const lastTimestamp = get(e, 'lastTimestamp', '');\n let firstEpochMilliseconds = 0;\n let lastEpochMilliseconds = 0;\n if (firstTimestamp) {\n firstEpochMilliseconds = DateTime.fromISO(firstTimestamp).toMillis();\n }\n if (lastTimestamp) {\n lastEpochMilliseconds = DateTime.fromISO(lastTimestamp).toMillis();\n }\n return (\n <div key={get(e, ['metadata', 'uid'], String(i))} className=\"info\">\n <div className=\"horizontal\">\n {e.count && (\n <div className={`pill ${this.pillStyle(e)}`}>\n {e.count} × <b>{e.reason}</b>\n </div>\n )}\n </div>\n {(e.firstTimestamp || e.lastTimestamp) && (\n <div>\n {e.firstTimestamp === e.lastTimestamp && (\n <div>\n <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n )}\n {e.firstTimestamp !== e.lastTimestamp && (\n <div>\n <div>\n First Occurrence: <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n <div>\n Last Occurrence: <i>{relativeTime(lastEpochMilliseconds)}</i>\n </div>\n </div>\n )}\n </div>\n )}\n <div>{e.message}</div>\n <div>\n <JobManifestPodLogs\n account={this.props.manifest.account}\n location={namespace}\n podNamesProviders={[new JobEventBasedPodNameProvider(this.props.manifest, e)]}\n linkName=\"Console Output (Raw)\"\n />\n </div>\n {i !== events.length - 1 && <br />}\n </div>\n );\n });\n }\n}\n","import { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { CopyToClipboard, ManifestYaml } from '@spinnaker/core';\n\nimport { DeployManifestStatusPills } from './DeployStatusPills';\nimport { ManifestDetailsLink } from './ManifestDetailsLink';\nimport { ManifestEvents } from './ManifestEvents';\n\nimport './ManifestStatus.less';\n\nexport interface IManifestStatusProps {\n account: string;\n manifest: IManifest;\n}\n\nexport function ManifestStatus({ account, manifest }: IManifestStatusProps) {\n return (\n <>\n <dl className=\"manifest-status\" key=\"manifest-status\">\n <dt>{manifest.manifest.kind}</dt>\n <dd>\n <CopyToClipboard\n displayText={true}\n text={manifest.manifest.metadata.name}\n toolTip={`Copy ${manifest.manifest.metadata.name}`}\n />\n \n <DeployManifestStatusPills manifest={manifest} />\n </dd>\n </dl>\n <div className=\"manifest-support-links\" key=\"manifest-support-links\">\n <ManifestYaml\n linkName=\"YAML\"\n manifestText={dump(manifest.manifest)}\n modalTitle={manifest.manifest.metadata.name}\n />\n <ManifestDetailsLink linkName=\"Details\" manifest={manifest} accountId={account} />\n </div>\n <div className=\"manifest-events pad-left\" key=\"manifest-events\">\n <ManifestEvents manifest={manifest} />\n </div>\n </>\n );\n}\n","import type { Application, IManifest } from '@spinnaker/core';\nimport { ManifestReader } from '@spinnaker/core';\n\nexport interface IStageManifest {\n kind: string;\n apiVersion: string;\n metadata: {\n namespace: string;\n name: string;\n };\n}\n\nexport interface IManifestParams {\n account: string;\n location: string;\n name: string;\n}\n\nexport type IManifestCallback = (manifest: IManifest) => void;\n\nexport class CloudrunManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n CloudrunManifestService.updateManifest(params, fn);\n return app.onRefresh(null, () => CloudrunManifestService.updateManifest(params, fn));\n }\n\n private static updateManifest(params: IManifestParams, fn: IManifestCallback) {\n ManifestReader.getManifest(params.account, params.location, params.name).then((manifest) => fn(manifest));\n }\n\n public static manifestIdentifier(manifest: IStageManifest) {\n const kind = manifest.kind.toLowerCase();\n // manifest.metadata.namespace doesn't exist if it's a namespace being deployed\n const namespace = (manifest.metadata.namespace || '_').toLowerCase();\n const name = manifest.metadata.name.toLowerCase();\n const apiVersion = (manifest.apiVersion || '_').toLowerCase();\n // assuming this identifier is opaque and not parsed anywhere. Including the\n // apiVersion will prevent collisions with CRD kinds without having any visible\n // effect elsewhere\n return `${namespace} ${kind} ${apiVersion} ${name}`;\n }\n\n public static stageManifestToManifestParams(manifest: IStageManifest, account: string): IManifestParams {\n return {\n account,\n name: CloudrunManifestService.scopedKind(manifest) + ' ' + manifest.metadata.name,\n location: manifest.metadata.namespace == null ? '_' : manifest.metadata.namespace,\n };\n }\n\n private static apiGroup(manifest: IStageManifest): string {\n const parts = (manifest.apiVersion || '_').split('/');\n if (parts.length < 2) {\n return '';\n }\n return parts[0];\n }\n\n private static isCRDGroup(manifest: IStageManifest): boolean {\n return !CloudrunManifestService.BUILT_IN_GROUPS.includes(CloudrunManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (CloudrunManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + CloudrunManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n private static readonly BUILT_IN_GROUPS = [\n '',\n 'core',\n 'batch',\n 'apps',\n 'extensions',\n 'storage.k8s.io',\n 'apiextensions.k8s.io',\n 'apiregistration.k8s.io',\n 'policy',\n 'scheduling.k8s.io',\n 'settings.k8s.io',\n 'authorization.k8s.io',\n 'authentication.k8s.io',\n 'rbac.authorization.k8s.io',\n 'certifcates.k8s.io',\n 'networking.k8s.io',\n ];\n}\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IManifest } from '@spinnaker/core';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport { ManifestStatus } from './ManifestStatus';\nimport type { IStageManifest } from '../../../../manifest/manifest.service';\nimport { CloudrunManifestService } from '../../../../manifest/manifest.service';\n\nexport interface IManifestSubscription {\n id: string;\n unsubscribe: () => void;\n manifest: IManifest;\n}\n\nexport interface IDeployStatusState {\n subscriptions: IManifestSubscription[];\n manifestIds: string[];\n}\n\nexport class DeployStatus extends React.Component<IExecutionDetailsSectionProps, IDeployStatusState> {\n public static title = 'deployStatus';\n\n constructor(props: IExecutionDetailsSectionProps) {\n super(props);\n this.state = { subscriptions: [], manifestIds: [] };\n }\n\n public componentDidMount() {\n this.componentDidUpdate(this.props, this.state);\n }\n\n public componentWillUnmount() {\n this.unsubscribeAll();\n }\n\n public componentDidUpdate(_prevProps: IExecutionDetailsSectionProps, prevState: IDeployStatusState) {\n const manifests: IStageManifest[] = get(this.props.stage, ['context', 'outputs.manifests'], []).filter((m) => !!m);\n const manifestIds = manifests.map((m) => CloudrunManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = CloudrunManifestService.manifestIdentifier(manifest);\n return {\n id,\n unsubscribe: this.subscribeToManifestUpdates(id, manifest),\n manifest: this.stageManifestToIManifest(manifest, this.props.stage.context.account),\n };\n });\n this.setState({ subscriptions, manifestIds });\n }\n }\n\n private subscribeToManifestUpdates(id: string, manifest: IStageManifest): () => void {\n const params = CloudrunManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return CloudrunManifestService.subscribe(this.props.application, params, (updated: IManifest) => {\n const idx = this.state.subscriptions.findIndex((sub) => sub.id === id);\n if (idx !== -1) {\n const subscription = { ...this.state.subscriptions[idx], manifest: updated };\n const subscriptions = [...this.state.subscriptions];\n subscriptions[idx] = subscription;\n this.setState({ subscriptions });\n }\n });\n }\n\n private unsubscribeAll() {\n this.state.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n }\n\n private stageManifestToIManifest(manifest: IStageManifest, account: string): IManifest {\n return {\n name: get(manifest, 'metadata.name', ''),\n moniker: null,\n account,\n cloudProvider: 'cloudrun',\n location: get(manifest, 'metadata.namespace', ''),\n manifest: manifest,\n status: {},\n artifacts: [],\n events: [],\n };\n }\n\n public render() {\n const { name: sectionName, current: currentSection, stage } = this.props;\n const manifests: IManifest[] = this.state.subscriptions.filter((sub) => !!sub.manifest).map((sub) => sub.manifest);\n return (\n <ExecutionDetailsSection name={sectionName} current={currentSection}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {manifests && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n {manifests.map((manifest) => {\n const uid =\n manifest.manifest.metadata.uid || CloudrunManifestService.manifestIdentifier(manifest.manifest);\n return <ManifestStatus key={uid} manifest={manifest} account={stage.context.account} />;\n })}\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n }\n}\n","import type { IStage } from '@spinnaker/core';\nimport {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { DeployStageConfig } from './DeployStageConfig';\nimport { deployValidators } from './deploy.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Cloud Run)',\n description: 'Deploy a Cloud Run manifest yaml/json file.',\n key: 'deployCloudrunManifest',\n cloudProvider: 'cloudrun',\n component: DeployStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployValidators(),\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface ICloudrunProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n };\n}\n\nexport const CloudrunProviderSettings: ICloudrunProviderSettings = (SETTINGS.providers\n .cloudrun as ICloudrunProviderSettings) || { defaults: {} };\nif (CloudrunProviderSettings) {\n CloudrunProviderSettings.resetToOriginal = SETTINGS.resetProvider('cloudrun');\n}\n","import { module } from 'angular';\nimport { cloneDeep } from 'lodash';\nimport { $q } from 'ngimport';\n\nimport type {\n Application,\n IAccountDetails,\n IExpectedArtifact,\n IMoniker,\n IPipeline,\n IServerGroupCommand,\n IServerGroupCommandViewState,\n IStage,\n} from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { CloudrunProviderSettings } from '../../cloudrun.settings';\nimport type { CloudrunDeployDescription } from '../serverGroupTransformer.service';\n\nexport enum ServerGroupSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n\nexport interface ICloudrunServerGroupCommandData {\n command: ICloudrunServerGroupCommand;\n metadata: ICloudrunServerGroupCommandMetadata;\n stack: string;\n freeFormDetails: string;\n configFiles: string[];\n}\n\nexport interface ICloudrunServerGroupCommand extends Omit<IServerGroupCommand, 'source' | 'application'> {\n application?: string;\n stack?: string;\n detail?: string;\n account: string;\n configFiles: string[];\n freeFormDetails: string;\n region: string;\n regions: [];\n isNew?: boolean;\n cloudProvider: string;\n provider: string;\n selectedProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: ICloudrunServerGroupSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ServerGroupSource;\n versioned?: boolean;\n gitCredentialType?: string;\n viewState: IServerGroupCommandViewState;\n mode: string;\n credentials: string;\n sourceType: string;\n configArtifacts: any[];\n interestingHealthProviderNames: [];\n fromArtifact: boolean;\n}\n\nexport interface IViewState {\n mode: string;\n submitButtonLabel: string;\n disableStrategySelection: boolean;\n stage?: IStage;\n pipeline?: IPipeline;\n}\n\nexport interface ICloudrunServerGroupCommandMetadata {\n backingData: any;\n}\n\nexport interface ICloudrunServerGroupSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nconst getSubmitButtonLabel = (mode: string): string => {\n switch (mode) {\n case 'createPipeline':\n return 'Add';\n case 'editPipeline':\n return 'Done';\n default:\n return 'Create';\n }\n};\n\nexport class CloudrunV2ServerGroupCommandBuilder {\n // new add servergroup\n public buildNewServerGroupCommand(app: Application): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'create');\n }\n\n // add servergroup from deploy stage of pipeline\n public buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline) {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommandForPipeline(_stage, pipeline);\n }\n\n // edit servergroup from deploy stage of pipeline\n // add servergroup from deploy stage of pipeline\n public buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ) {\n return CloudrunServerGroupCommandBuilder.buildServerGroupCommandFromPipeline(app, cluster, _stage, pipeline);\n }\n}\n\nexport class CloudrunServerGroupCommandBuilder {\n public static $inject = ['$q'];\n public static ServerGroupCommandIsValid(command: ICloudrunServerGroupCommand): boolean {\n if (!command.moniker) {\n return false;\n }\n\n if (!command.moniker.app) {\n return false;\n }\n\n return true;\n }\n\n public static copyAndCleanCommand(input: ICloudrunServerGroupCommand): ICloudrunServerGroupCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n // deploy stage : construct servergroup command\n public static buildNewServerGroupCommandForPipeline(stage: IStage, pipeline: IPipeline): any {\n const command: any = this.buildNewServerGroupCommand(\n { name: pipeline.application } as Application,\n 'cloudrun',\n 'createPipeline',\n );\n command.viewState = {\n ...command.viewState,\n pipeline,\n requiresTemplateSelection: true,\n stage,\n };\n return command;\n }\n\n private static getExpectedArtifacts(pipeline: IPipeline): IExpectedArtifact[] {\n return pipeline.expectedArtifacts || [];\n }\n\n public static buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'editPipeline').then(\n (command: ICloudrunServerGroupCommandData) => {\n command = {\n ...command,\n ...cluster,\n\n backingData: {\n ...command.metadata.backingData.backingData,\n\n expectedArtifacts: CloudrunServerGroupCommandBuilder.getExpectedArtifacts(pipeline),\n },\n credentials: cluster.account || command.metadata.backingData.credentials,\n viewState: {\n ...command.metadata.backingData.viewState,\n stage: _stage,\n pipeline,\n },\n } as ICloudrunServerGroupCommandData;\n return command;\n },\n );\n }\n\n public static getCredentials(accounts: IAccountDetails[]): string {\n const accountNames: string[] = (accounts || []).map((account) => account.name);\n const defaultCredentials: string = CloudrunProviderSettings.defaults.account;\n\n return accountNames.includes(defaultCredentials) ? defaultCredentials : accountNames[0];\n }\n\n public static getRegion(accounts: any[], credentials: string): string {\n const account = accounts.find((_account) => _account.name === credentials);\n return account ? account.region : null;\n }\n\n // new servergroup command\n public static buildNewServerGroupCommand(\n app: Application,\n sourceAccount: string,\n mode: string,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('cloudrun'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n return $q.all(dataToFetch).then((backingData: { accounts: IAccountDetails[] }) => {\n const { accounts } = backingData;\n\n const account = accounts.some((a) => a.name === sourceAccount)\n ? accounts.find((a) => a.name === sourceAccount).name\n : accounts.length\n ? accounts[0].name\n : null;\n const viewState: IViewState = {\n mode,\n submitButtonLabel: getSubmitButtonLabel(mode),\n disableStrategySelection: mode === 'create',\n };\n const credentials = account ? account : this.getCredentials(accounts);\n const region = this.getRegion(backingData.accounts, credentials);\n const cloudProvider = 'cloudrun';\n\n return {\n command: {\n application: app.name,\n configFiles: [''],\n cloudProvider,\n selectedProvider: cloudProvider,\n provider: cloudProvider,\n region,\n credentials,\n gitCredentialType: 'NONE',\n manifest: null,\n sourceType: 'git',\n configArtifacts: [],\n interestingHealthProviderNames: [],\n fromArtifact: false,\n account,\n viewState,\n },\n metadata: {\n backingData,\n },\n } as ICloudrunServerGroupCommandData;\n });\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.cloudrun.serverGroup.commandBuilder.service';\n\nmodule(CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER, []).service(\n 'cloudrunV2ServerGroupCommandBuilder',\n CloudrunV2ServerGroupCommandBuilder,\n);\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { Application, IAccount, IServerGroup } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField, NameUtils, ReactInjector, ServerGroupNamePreview } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n formik: IWizardServerGroupBasicSettingsProps['formik'];\n onEnterStack: (stack: string) => void;\n detailsChanged: (detail: string) => void;\n app: Application;\n}\n\nexport interface IServerGroupBasicSettingsState {\n namePreview: string;\n createsNewCluster: boolean;\n latestServerGroup: IServerGroup;\n}\n\nexport function ServerGroupBasicSettings({\n accounts,\n onAccountSelect,\n selectedAccount,\n formik,\n onEnterStack,\n detailsChanged,\n app,\n}: IServerGroupBasicSettingsProps) {\n const { values } = formik;\n const { stack = '', freeFormDetails } = values;\n\n const namePreview = NameUtils.getClusterName(app.name, stack, freeFormDetails);\n const createsNewCluster = !app.clusters.find((c) => c.name === namePreview);\n const inCluster = (app.serverGroups.data as IServerGroup[])\n .filter((serverGroup) => {\n return (\n serverGroup.cluster === namePreview &&\n serverGroup.account === values.command.credentials &&\n serverGroup.region === values.command.region\n );\n })\n .sort((a, b) => a.createdTime - b.createdTime);\n const latestServerGroup = inCluster.length ? inCluster.pop() : null;\n\n const navigateToLatestServerGroup = () => {\n const { values } = formik;\n const params = {\n provider: values.command.selectedProvider,\n accountId: latestServerGroup.account,\n region: latestServerGroup.region,\n serverGroup: latestServerGroup.name,\n };\n\n const { $state } = ReactInjector;\n if ($state.is('home.applications.application.insight.clusters')) {\n $state.go('.serverGroup', params);\n } else {\n $state.go('^.serverGroup', params);\n }\n };\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Stack <HelpField id=\"cloudrun.serverGroup.stack\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={stack}\n onChange={(e) => onEnterStack(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Detail <HelpField id=\"cloudrun.serverGroup.detail\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={freeFormDetails}\n onChange={(e) => detailsChanged(e.target.value)}\n />\n </div>\n </div>\n {!values.command.viewState.hideClusterNamePreview && (\n <ServerGroupNamePreview\n createsNewCluster={createsNewCluster}\n latestServerGroupName={latestServerGroup?.name}\n mode={values.command.viewState.mode}\n namePreview={namePreview}\n navigateToLatestServerGroup={navigateToLatestServerGroup}\n />\n )}\n </div>\n );\n}\n\nexport interface IWizardServerGroupBasicSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n app: Application;\n}\n\nexport class WizardServerGroupBasicSettings extends React.Component<IWizardServerGroupBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n private stackChanged = (stack: string): void => {\n const { setFieldValue, values } = this.props.formik;\n values.command.stack = stack;\n setFieldValue('stack', stack);\n };\n\n private freeFormDetailsChanged = (freeFormDetails: string) => {\n const { setFieldValue, values } = this.props.formik;\n values.command.freeFormDetails = freeFormDetails;\n setFieldValue('freeFormDetails', freeFormDetails);\n };\n\n public render() {\n const { formik, app } = this.props;\n return (\n <ServerGroupBasicSettings\n accounts={formik.values.metadata?.backingData?.accounts || []}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command?.account || ''}\n onEnterStack={this.stackChanged}\n formik={formik}\n detailsChanged={this.freeFormDetailsChanged}\n app={app}\n />\n );\n }\n}\n","import type { FormikProps } from 'formik';\nimport React, { useState } from 'react';\n\nimport { HelpField, TextAreaInput } from '@spinnaker/core';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupConfigFilesSettingsProps {\n configFiles: string[];\n onEnterConfig: (file: string[]) => void;\n}\ntype configFiles = IServerGroupConfigFilesSettingsProps['configFiles'];\n\nexport function ServerGroupConfigFilesSettings({ configFiles, onEnterConfig }: IServerGroupConfigFilesSettingsProps) {\n const [configValues, setConfigValues] = useState<configFiles>(configFiles);\n\n function mapTabToSpaces(event: any, i: number) {\n if (event.which === 9) {\n event.preventDefault();\n const cursorPosition = event.target.selectionStart;\n const inputValue = event.target.value;\n event.target.value = `${inputValue.substring(0, cursorPosition)} ${inputValue.substring(cursorPosition)}`;\n event.target.selectionStart += 2;\n }\n const newConfigValues = [...configValues];\n newConfigValues[i] = event.target.value;\n setConfigValues(newConfigValues);\n onEnterConfig(newConfigValues);\n }\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n {configValues.map((configFile, index) => (\n <>\n <div className=\"col-md-3 sm-label-right\">\n Service Yaml\n <HelpField id=\"cloudrun.serverGroup.configFiles\" />{' '}\n </div>\n <div className=\"col-md-8\" key={index}>\n <TextAreaInput\n name={'text' + index}\n value={configFile}\n rows={10}\n onChange={(e) => mapTabToSpaces(e, index)}\n />\n </div>\n </>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface IWizardServerGroupConfigFilesSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n}\n\nexport class WizardServerGroupConfigFilesSettings extends React.Component<IWizardServerGroupConfigFilesSettingsProps> {\n private configUpdated = (configFiles: string[]): void => {\n const { formik } = this.props;\n formik.values.command.configFiles = configFiles;\n formik.setFieldValue('configFiles', configFiles);\n };\n\n // yaml config files input from server group wizard\n public render() {\n const { formik } = this.props;\n return (\n <ServerGroupConfigFilesSettings\n configFiles={formik.values.configFiles || formik.values.command.configFiles}\n onEnterConfig={this.configUpdated}\n />\n );\n }\n}\n","import React from 'react';\nimport type { Application, IModalComponentProps, IStage } from '@spinnaker/core';\n//import type { IModalInstanceService } from 'angular-ui-bootstrap';\nimport { noop, ReactInjector, ReactModal, TaskMonitor, WizardModal, WizardPage } from '@spinnaker/core';\nimport { WizardServerGroupBasicSettings } from './BasicSettings';\nimport { WizardServerGroupConfigFilesSettings } from './ConfigFiles';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\nimport { CloudrunServerGroupCommandBuilder } from '../serverGroupCommandBuilder.service';\n\nexport interface ICloudrunServerGroupModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: ICloudrunServerGroupCommandData;\n isNew?: boolean;\n}\n\nexport interface ICloudrunServerGroupModalState {\n command: ICloudrunServerGroupCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ServerGroupWizard extends React.Component<ICloudrunServerGroupModalProps, ICloudrunServerGroupModalState> {\n public static defaultProps: Partial<ICloudrunServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private _isUnmounted = false;\n\n /* private serverGroupWriter: ServerGroupWriter; */\n public static show(props: ICloudrunServerGroupModalProps): Promise<ICloudrunServerGroupCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ServerGroupWizard, props, modalProps);\n }\n\n constructor(props: ICloudrunServerGroupModalProps) {\n super(props);\n if (!props.command) {\n CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(props.application, 'cloudrun', 'create').then(\n (command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n },\n );\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as ICloudrunServerGroupCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${\n props.command.command.viewState.submitButtonLabel === 'Create' ? 'Creating' : 'Updating'\n } your Server Group`,\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n private onTaskComplete = () => {\n this.props.application.serverGroups.refresh();\n this.props.application.serverGroups.onNextRefresh(null, this.onApplicationRefresh);\n };\n\n protected onApplicationRefresh = (): void => {\n if (this._isUnmounted) {\n return;\n }\n\n const { command } = this.props;\n const { taskMonitor } = this.state;\n const cloneStage = taskMonitor.task.execution.stages.find((stage: IStage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][command.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: command.command.credentials,\n region: command.command.region,\n provider: 'cloudrun',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (ReactInjector.$state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n ReactInjector.$state.go(transitionTo, newStateParams);\n }\n }\n };\n\n private submit = (c: ICloudrunServerGroupCommandData): void => {\n const command: any = CloudrunServerGroupCommandBuilder.copyAndCleanCommand(c.command);\n const forPipelineConfig = command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline';\n if (forPipelineConfig) {\n this.props.closeModal && this.props.closeModal(command);\n } else {\n //command.viewState.mode = 'create';\n const submitMethod = () => ReactInjector.serverGroupWriter.cloneServerGroup(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n return null;\n }\n };\n public render() {\n const { dismissModal, application } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n const labelButton = this.state.command.command.viewState.submitButtonLabel;\n\n return (\n <WizardModal<ICloudrunServerGroupCommandData>\n heading={`${labelButton === 'Add' || labelButton === 'Create' ? 'Create New' : 'Update'} Server Group`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={labelButton}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => (\n <WizardServerGroupBasicSettings ref={innerRef} formik={formik} app={application} />\n )}\n />\n\n <WizardPage\n label=\"Service Yaml\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardServerGroupConfigFilesSettings ref={innerRef} formik={formik} />}\n />\n </>\n )}\n />\n );\n }\n}\n","export class CloudrunHealth {\n public static PLATFORM = 'Cloud Run Service';\n}\n","import type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { Application, ILoadBalancer, IServerGroup, ServerGroupWriter } from '@spinnaker/core';\nimport { ConfirmationModalService, SERVER_GROUP_WRITER, ServerGroupReader } from '@spinnaker/core';\nimport { CloudrunHealth } from '../../common/cloudrunHealth';\nimport type { ICloudrunServerGroup } from '../../interfaces';\n\ninterface IServerGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunServerGroupDetailsController implements IController {\n public state = { loading: true };\n public serverGroup: ICloudrunServerGroup;\n\n public static $inject = ['$state', '$scope', 'serverGroup', 'app', 'serverGroupWriter'];\n constructor(\n private $state: any,\n private $scope: IScope,\n serverGroup: IServerGroupFromStateParams,\n public app: Application,\n private serverGroupWriter: ServerGroupWriter,\n ) {\n this.extractServerGroup(serverGroup)\n .then(() => {\n if (!this.$scope.$$destroyed) {\n this.app.getDataSource('serverGroups').onRefresh(this.$scope, () => this.extractServerGroup(serverGroup));\n }\n })\n .catch(() => this.autoClose());\n }\n\n // destroy existing server group\n public canDestroyServerGroup(): boolean {\n if (this.serverGroup) {\n const isCurrentRevision = this.serverGroup.tags.isLatest;\n if (isCurrentRevision) {\n return false;\n } else if (this.serverGroup.disabled) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n public destroyServerGroup(): void {\n const stateParams = {\n name: this.serverGroup.name,\n accountId: this.serverGroup.account,\n region: this.serverGroup.region,\n };\n\n const taskMonitor = {\n application: this.app,\n title: 'Destroying ' + this.serverGroup.name,\n onTaskComplete: () => {\n if (this.$state.includes('**.serverGroup', stateParams)) {\n this.$state.go('^');\n }\n },\n };\n\n const submitMethod = (params: any) => this.serverGroupWriter.destroyServerGroup(this.serverGroup, this.app, params);\n\n const confirmationModalParams = {\n header: 'Really destroy ' + this.serverGroup.name + '?',\n buttonText: 'Destroy ' + this.serverGroup.name,\n account: this.serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: this.app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: CloudrunHealth.PLATFORM,\n\n interestingHealthProviderNames: [] as string[],\n };\n\n if (this.app.attributes.platformHealthOnlyShowOverride && this.app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = [CloudrunHealth.PLATFORM];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n\n private extractServerGroup({ name, accountId, region }: IServerGroupFromStateParams): PromiseLike<void> {\n return ServerGroupReader.getServerGroup(this.app.name, accountId, region, name).then(\n (serverGroupDetails: IServerGroup) => {\n let fromApp = this.app.getDataSource('serverGroups').data.find((toCheck: IServerGroup) => {\n return toCheck.name === name && toCheck.account === accountId && toCheck.region === region;\n });\n\n if (!fromApp) {\n this.app.getDataSource('loadBalancers').data.some((loadBalancer: ILoadBalancer) => {\n if (loadBalancer.account === accountId) {\n return loadBalancer.serverGroups.some((toCheck: IServerGroup) => {\n let result = false;\n if (toCheck.name === name) {\n fromApp = toCheck;\n result = true;\n }\n return result;\n });\n } else {\n return false;\n }\n });\n }\n\n this.serverGroup = { ...serverGroupDetails, ...fromApp };\n this.state.loading = false;\n },\n );\n }\n}\nexport const CLOUDRUN_SERVER_GROUP_DETAILS_CTRL = 'spinnaker.cloudrun.serverGroup.details.controller';\n\nmodule(CLOUDRUN_SERVER_GROUP_DETAILS_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'cloudrunV2ServerGroupDetailsCtrl',\n CloudrunServerGroupDetailsController,\n);\n","import { module } from 'angular';\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommand } from '../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport class CloudrunV2ServerGroupTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n\n public normalizeServerGroup(serverGroup: IServerGroup): PromiseLike<IServerGroup> {\n return this.$q.resolve(serverGroup);\n }\n\n public convertServerGroupCommandToDeployConfiguration(command: ICloudrunServerGroupCommand): any {\n return new CloudrunDeployDescription(command);\n }\n}\n\nexport class CloudrunDeployDescription {\n public cloudProvider = 'cloudrun';\n public provider = 'cloudrun';\n public credentials: string;\n public account: string;\n public application: string;\n public stack?: string;\n public freeFormDetails?: string;\n public configFiles: string[];\n public region: string;\n public strategy?: string;\n public type?: string;\n public fromArtifact: boolean;\n public configArtifacts: string[];\n public strategyApplication?: string;\n public strategyPipeline?: string;\n public gitCredentialType: string;\n public interestingHealthProviderNames: string[];\n public sourceType: string;\n\n constructor(command: ICloudrunServerGroupCommand) {\n this.credentials = command.credentials;\n this.account = command.credentials;\n this.application = command.application;\n this.stack = command.stack;\n this.freeFormDetails = command.freeFormDetails;\n this.region = command.region;\n this.strategy = command.strategy;\n this.type = command.type;\n this.fromArtifact = command.fromArtifact;\n this.gitCredentialType = command.gitCredentialType;\n this.configFiles = command.configFiles;\n this.sourceType = command.sourceType;\n this.interestingHealthProviderNames = command.interestingHealthProviderNames || [];\n this.configArtifacts = [];\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_TRANSFORMER = 'spinnaker.cloudrun.serverGroup.transformer.service';\nmodule(CLOUDRUN_SERVER_GROUP_TRANSFORMER, []).service(\n 'cloudrunV2ServerGroupTransformer',\n CloudrunV2ServerGroupTransformer,\n);\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { CLOUDRUN_COMPONENT_URL_DETAILS } from './common/componentUrlDetails.component';\nimport { CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE } from './common/loadBalancerMessage.component';\nimport './help/cloudrun.help';\nimport { CLOUDRUN_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';\nimport { CLOUDRUN_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/allocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS } from './loadBalancer/configure/wizard/basicSettings.component';\nimport { CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/stageAllocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL } from './loadBalancer/configure/wizard/wizard.controller';\nimport { CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL } from './loadBalancer/details/details.controller';\nimport { CLOUDRUN_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/loadBalancerTransformer';\nimport logo from './logo/cloudrun.logo.png';\nimport { CLOUDRUN_PIPELINE_MODULE } from './pipeline/pipeline.module';\nimport './pipeline/stages/deployManifest/deployStage';\nimport { CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ServerGroupWizard } from './serverGroup/configure/wizard/serverGroupWizard';\nimport { CLOUDRUN_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';\nimport { CLOUDRUN_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroupTransformer.service';\n\nimport './logo/cloudrun.logo.less';\n\nexport const CLOUDRUN_MODULE = 'spinnaker.cloudrun';\n\nconst requires = [\n CLOUDRUN_COMPONENT_URL_DETAILS,\n CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER,\n CLOUDRUN_SERVER_GROUP_DETAILS_CTRL,\n CLOUDRUN_SERVER_GROUP_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL,\n CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL,\n CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE,\n CLOUDRUN_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS,\n CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_PIPELINE_MODULE,\n CLOUDRUN_INSTANCE_DETAILS_CTRL,\n];\n\nmodule(CLOUDRUN_MODULE, requires).config(() => {\n CloudProviderRegistry.registerProvider('cloudrun', {\n name: 'cloudrun',\n logo: {\n path: logo,\n },\n\n instance: {\n detailsTemplateUrl: require('./instance/details/details.html'),\n detailsController: 'cloudrunInstanceDetailsCtrl',\n },\n serverGroup: {\n CloneServerGroupModal: ServerGroupWizard,\n commandBuilder: 'cloudrunV2ServerGroupCommandBuilder',\n detailsController: 'cloudrunV2ServerGroupDetailsCtrl',\n detailsTemplateUrl: require('./serverGroup/details/details.html'),\n transformer: 'cloudrunV2ServerGroupTransformer',\n skipUpstreamStageCheck: true,\n },\n\n loadBalancer: {\n transformer: 'cloudrunLoadBalancerTransformer',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/wizard/wizard.html'),\n createLoadBalancerController: 'cloudrunLoadBalancerWizardCtrl',\n detailsTemplateUrl: require('./loadBalancer/details/details.html'),\n detailsController: 'cloudrunLoadBalancerDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('cloudrun', ['custom', 'redblack', 'rollingpush', 'rollingredblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAFAUlEQVRYR82YfUwcRRjGn5m7veO4rZI2aKuk1kRNjQ012rRANB53YNpYtFHS1Aj9ktaPtGINpPWgKQ0sVNvUNGirgYBJSTSA1H6ltpTrVYtUS2u1aRS/LSRFEmqBPcC7vR2zixwc7N4tJ02c5P64zMwzv332fd+ZWYL/USNGWFL3MpvVJy4xMlZzTJA/7y0hw9HmR4VxlokVIGQzwOzRxCL0D4DgA4+bL4ykERHGKfiqAJb3HyAmTCXVniL7Bj09XRhXqZjBKJqnD2REicjIbNnOn9bS1YVxlvuOgrHl0w0DQo553PYswzAuQcxhwMFpB/lXkAC5LUV83UT9Sc44SpjZxPnaGLDoFsK0BwP2VG8JkcavMQnGWSYWgGD3rQIJ6TIUeor5PbowjrcGk6gktwFI0oKZk0Bw/SYLdSXNpOi6IcfK3SWbaap3a3zXqECYM85ycTcYCvTUX3JZ0NMn41D7iLt5Dgv6hhgavgrEBkSwZ3ztCcE4ynyLKGGKK2Y95ZT7TBBWxuHzH4LY2TSMBUkU+1bbcOn3IPZ95o/FJUlmJNVbbG9X0350YacgKtmTE+kRORNQs9GGO2+nyKsawrVeGe+vt+HyH0E88yiHmrP+WFyq8xTxuSEYV2n/ckbpUSNeFzxlxbKFZuxv9uPUFQkrUzgkz6U4/o2E7MUcbvgY3j01NZeILGe1bL/tmOpMernYTBgyjMBkLjBj29NWfNEhofKkH/MSKXatikPO/kEwBmQv4bA02YyD5wKGXWIEp8+4+UziFPrzAFplBEQZM4snqH8tHjcHGTZWD6nTKtfYUHvWr8aO0u6fTbHpSSt+6ZFR5THqkryBOAXfEYBplmc9wPfW2jD/Loqi+mH81C1jzeMWzEvU3lnmJFDUtfpx+GJYfdOSPkHSBbGHAIlGnRlN6efTOPU1KL+HkkzY8aw1okTLVQk1Xj+6+8bq1MQJJL1MrCYEL04FpjrPhnvvGHNm3RMWNai1mlIkFeBzHRL8QWBgSAeGkAbiKhWXMooTRmFmzSCo3xweMwfW29RYmthOfiepIP3jAAJBhP0PVV8Zy1QFpyDWAlhrBEhJ31cyLKFsevBuip3PxYVN7eyV8XFbABd+HQnoiU2Sgb7BMIc+9BTx61QYhyA+TAGl+oaragjtfSEOC+8xqXXG+72E3Mc4ZD3ChUYeuRRAw/kA/o4Sr0EZakYCGJaBVG8Rf3msApcPVoDJ26K50+K2QxF6tXYIf/mYuh0oG+hvPTLqWgO40qnthq5DQ2SXxx3/ptI/tjeViLMpp7ozTw8o7QETSrOVvUlSq2zyXBOKV1jRdCGgvpapNkrR+WcvW+wt4bvDYNTYKRNfB8E7eqJK5f365yC+vTby9EoWffmjhI7rsR0jgjLb2rSFfzsUxBMXdgnKKY+laAFZzQAfF/V2Y8ggAlysz7eHnSYnKbuEgVUM5CM9xekCCshs9adb+LBztuZjOgXfIYCt0AXiAN4au0MM9Hhjvm3SzUNT0VE64KCUnInkdxwH2GME8vtZ5uHCyXcn/XuT4DsAsJenG4gBNY35ds3tRxfGUd4/nzKqpHpCJCCbhSDeYihmAbB+2cTSPtk046rWjMh37dKBElCyI9pSRoEYUNGYb3fr6UWNQqcKRAuifYWItxDYdBwihIgyY5WRQCYVPT1io99nZvKc5jnCxKytDW+QkWNhhBbVmWgC09n/Dw0j4+SJOXQTAAAAAElFTkSuQmCC\""],"names":["cloudrunComponentUrlDetailsComponent","bindings","component","template","CLOUDRUN_COMPONENT_URL_DETAILS","module","CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE","showCreateMessage","columnOffset","columns","templateUrl","key","value","forEach","entry","HelpContentsRegistry","register","CloudrunInstanceDetailsController","constructor","$q","app","instance","this","state","loading","upToolTip","outOfServiceToolTip","ready","then","retrieveInstance","instanceDetails","catch","instanceIdNotFound","instanceId","instanceManager","flattenDeep","getDataSource","data","map","loadBalancer","serverGroups","find","dataSource","instances","some","possibleMatch","id","recentHistoryExtraData","region","account","category","serverGroup","name","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","reject","$inject","CLOUDRUN_INSTANCE_DETAILS_CTRL","controller","cloudrunAllocationConfigurationRowComponent","allocationDescription","removeAllocation","serverGroupOptions","onAllocationChange","getServerGroupOptions","revisionName","uniq","concat","CLOUDRUN_ALLOCATION_CONFIGURATION_ROW","cloudrunLoadBalancerSettingsComponent","forPipelineConfig","application","$onInit","updateServerGroupOptions","addAllocation","remainingServerGroups","serverGroupsWithoutAllocation","length","splitDescription","allocationDescriptions","push","percent","index","splice","allocationIsInvalid","reduce","sum","showAddButton","initializeAsTextInput","serverGroupName","includes","serverGroupsWithAllocation","description","allServerGroups","difference","CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS","CloudrunStageAllocationLabelCtrl","mapTargetCoordinateToLabel","targetCoordinate","target","StageConstants","TARGET_LIST","t","val","label","$doCheck","setInputViewValue","cluster","targetLabel","inputViewValue","cloudrunStageAllocationLabel","cloudrunStageAllocationConfigurationRow","targets","CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW","CloudrunLoadBalancerUpsertDescription","convertTrafficSplitToTrafficSplitDescription","split","trafficTargets","acc","trafficTarget","credentials","cloudProvider","loadBalancerName","migrateTraffic","mapAllocationsToDecimals","mapAllocationsToPercentages","Math","round","CloudrunLoadBalancerTransformer","normalizeLoadBalancer","provider","type","instanceCounts","buildInstanceCounts","detachedInstances","transformInstance","activeServerGroups","filter","isDisabled","chain","flatten","resolve","convertLoadBalancerForEditing","upToDateLoadBalancer","candidate","cloneDeep","convertLoadBalancerToUpsertDescription","has","camelCase","health","up","down","outOfService","succeeded","failed","starting","unknown","loadBalancers","healthState","get","CLOUDRUN_LOAD_BALANCER_TRANSFORMER","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","service","CloudrunLoadBalancerWizardController","$scope","$state","$uibModalInstance","isNew","cloudrunLoadBalancerTransformer","wizardSubFormValidation","submitButtonLabel","heading","join","convertedLoadBalancer","setTaskMonitor","initializeFormValidation","submit","close","taskMonitor","LoadBalancerWriter","upsertLoadBalancer","cancel","dismiss","showSubmitButton","subFormsAreValid","TaskMonitor","title","modalInstance","onTaskComplete","config","form","scope","page","subForm","validators","watchString","validator","watchDeep","refresh","onNextRefresh","onApplicationRefresh","$$destroyed","newStateParams","accountId","go","CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL","CloudrunLoadBalancerDetailsController","$uibModal","loadBalancerFromParams","extractLoadBalancer","editLoadBalancer","open","size","test","onRefresh","autoClose","deleteLoadBalancer","ConfirmationModalService","confirm","header","buttonText","body","getConfirmationModalBodyHtml","taskMonitorConfig","submitMethod","canDeleteLoadBalancer","serverGroupNames","hasAny","hasMoreThanOne","listOfServerGroupNames","params","allowModalToStayOpen","location","CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL","CloudrunLoadBalancerChoiceModalCtrl","initialize","CloudProviderRegistry","getValue","updatedLoadBalancerPromise","createLoadBalancerTemplateUrl","createLoadBalancerController","selectedLoadBalancer","result","CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL","CloudrunEditLoadBalancerStageCtrl","stage","addLoadBalancer","newLoadBalancer","updatedLoadBalancer","removeLoadBalancer","CLOUDRUN_EDIT_LOAD_BALANCER_STAGE","Registry","pipeline","registerStage","executionDetailsUrl","executionConfigSections","controllerAs","CLOUDRUN_PIPELINE_MODULE","ManifestBindArtifactsSelector","React","Component","super","arguments","onChangeBinding","binding","props","slice","onChangeBindings","onRemoveBinding","render","renderSelect","i","expectedArtifactId","artifact","className","StageArtifactSelector","onArtifactEdited","onExpectedArtifactSelected","expectedArtifact","excludedArtifactIds","b","excludedArtifactTypePatterns","ArtifactTypePatterns","FRONT50_PIPELINE_TEMPLATE","onClick","Fragment","ManifestSource","ManifestSource2","ManifestBasicSettings","accounts","onAccountSelect","selectedAccount","HelpField","AccountSelectInput","onChange","evt","readOnly","ServerGroupNamePreview","stack","details","textAlign","DeployStageForm","excludedManifestArtifactTypes","MAVEN_FILE","getSourceOptions","TEXT","ARTIFACT","option","capitalize","handleRawManifestChange","rawManifest","manifests","setState","formik","setFieldValue","onManifestArtifactSelected","onManifestArtifactEdited","getRequiredArtifacts","requiredArtifactIds","requiredArtifacts","values","onRequiredArtifactsChanged","isTextManifest","isEmpty","yamlDocumentsToString","accountName","StageConfigField","event","disabled","helpKey","RadioButtonInput","options","e","source","YamlEditor","StageArtifactSelectorDelegate","manifestArtifact","manifestArtifactId","CheckboxInput","checked","skipExpressionEvaluation","text","DeployStageConfig","destroy$","Subject","fetchAccounts","observableFrom","AccountService","getAllAccountDetailsForProvider","pipe","takeUntil","subscribe","initialStageConfig","moniker","componentDidMount","componentWillUnmount","next","FormikStageConfig","updateStage","strategyRedBlack","MAX_VERSION_HISTORY_ANNOTATION","STATUS_PILLS","available","stable","paused","DeployManifestStatusPills","manifest","status","Object","keys","statusKey","statusDescription","statusClass","isStable","isUnstableWithMessage","message","UNMAPPED_K8S_RESOURCE_STATE_KEY","ManifestDetailsLink","spinnakerKindStateMap","serverGroupManagers","url","loadUrl","canOpen","spinnakerKindFromCloudrunKind","kind","kindMap","k","toLowerCase","resourceRegion","trim","getStateParams","stateKey","metadata","reg","getAccountDetails","spinnakerKind","spinnakerKindMap","ReactInjector","href","linkName","ManifestEvents","pillStyle","events","namespace","firstTimestamp","lastTimestamp","firstEpochMilliseconds","lastEpochMilliseconds","DateTime","fromISO","toMillis","String","count","reason","relativeTime","JobManifestPodLogs","podNamesProviders","JobEventBasedPodNameProvider","ManifestStatus","CopyToClipboard","displayText","toolTip","ManifestYaml","manifestText","dump","modalTitle","_CloudrunManifestService","fn","updateManifest","ManifestReader","getManifest","manifestIdentifier","apiVersion","stageManifestToManifestParams","scopedKind","apiGroup","parts","isCRDGroup","BUILT_IN_GROUPS","CloudrunManifestService","DeployStatus","subscriptions","manifestIds","componentDidUpdate","unsubscribeAll","_prevProps","prevState","m","sort","unsubscribe","subscribeToManifestUpdates","stageManifestToIManifest","context","updated","idx","findIndex","sub","subscription","artifacts","sectionName","current","currentSection","ExecutionDetailsSection","StageFailureMessage","failureMessage","uid","executionDetailsSections","ExecutionDetailsTasks","ExecutionArtifactTab","producesArtifacts","supportsCustomTimeout","fieldName","fieldLabel","validate","_pipeline","enabled","services","replicaSetManifests","strategy","maxVersionHistory","parseInt","accountExtractor","configAccountExtractor","artifactExtractor","ExpectedArtifactService","accumulateArtifacts","artifactRemover","ArtifactReferenceService","removeArtifactFromFields","CloudrunProviderSettings","SETTINGS","providers","cloudrun","defaults","ServerGroupSource","ServerGroupSource2","resetToOriginal","resetProvider","getSubmitButtonLabel","mode","CloudrunV2ServerGroupCommandBuilder","buildNewServerGroupCommand","CloudrunServerGroupCommandBuilder","buildNewServerGroupCommandForPipeline","_stage","buildServerGroupCommandFromPipeline","_CloudrunServerGroupCommandBuilder","ServerGroupCommandIsValid","command","copyAndCleanCommand","input","viewState","requiresTemplateSelection","getExpectedArtifacts","expectedArtifacts","backingData","getCredentials","accountNames","defaultCredentials","getRegion","_account","sourceAccount","dataToFetch","artifactAccounts","getArtifactAccounts","all","a","disableStrategySelection","configFiles","selectedProvider","gitCredentialType","sourceType","configArtifacts","interestingHealthProviderNames","fromArtifact","CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER","ServerGroupBasicSettings","onEnterStack","detailsChanged","freeFormDetails","namePreview","NameUtils","getClusterName","createsNewCluster","clusters","c","inCluster","createdTime","latestServerGroup","pop","hideClusterNamePreview","latestServerGroupName","navigateToLatestServerGroup","values2","is","WizardServerGroupBasicSettings","accountUpdated","stackChanged","freeFormDetailsChanged","_a","_b","_c","ServerGroupConfigFilesSettings","onEnterConfig","configValues","setConfigValues","useState","configFile","TextAreaInput","rows","which","preventDefault","cursorPosition","selectionStart","inputValue","substring","newConfigValues","mapTabToSpaces","WizardServerGroupConfigFilesSettings","configUpdated","_ServerGroupWizard","_isUnmounted","cloneStage","task","execution","stages","newServerGroupName","transitionTo","serverGroupWriter","cloneServerGroup","closeModal","assign","loaded","modalInstanceEmulation","dismissModal","show","ReactModal","dialogClassName","labelButton","WizardModal","initialValues","nextIdx","wizard","WizardPage","order","innerRef","ServerGroupWizard","defaultProps","noop","CloudrunHealth","PLATFORM","CloudrunServerGroupDetailsController","extractServerGroup","canDestroyServerGroup","tags","isLatest","destroyServerGroup","stateParams","confirmationModalParams","askForReason","platformHealthOnlyShowOverride","attributes","platformHealthType","platformHealthOnly","ServerGroupReader","getServerGroup","serverGroupDetails","fromApp","toCheck","CLOUDRUN_SERVER_GROUP_DETAILS_CTRL","SERVER_GROUP_WRITER","CloudrunV2ServerGroupTransformer","normalizeServerGroup","convertServerGroupCommandToDeployConfiguration","CloudrunDeployDescription","CLOUDRUN_SERVER_GROUP_TRANSFORMER","CLOUDRUN_MODULE","registerProvider","logo","path","detailsTemplateUrl","detailsController","CloneServerGroupModal","commandBuilder","transformer","skipUpstreamStageCheck","DeploymentStrategyRegistry"],"mappings":"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"}
|