@microsoft/terraform-cdk-constructs 1.3.1 → 1.5.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/.jsii +32238 -27310
- package/API.md +43714 -35942
- package/lib/azure-actiongroup/lib/action-group.js +1 -1
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
- package/lib/azure-aks/lib/aks-cluster.js +1 -1
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
- package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
- package/lib/azure-dnszone/lib/dns-zone.js +1 -1
- package/lib/azure-metricalert/lib/metric-alert.js +1 -1
- package/lib/azure-networkinterface/lib/network-interface.js +1 -1
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
- package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
- package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
- package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
- package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
- package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
- package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
- package/lib/azure-roledefinition/lib/role-definition.js +1 -1
- package/lib/azure-storageaccount/lib/storage-account.js +1 -1
- package/lib/azure-subnet/lib/subnet.js +1 -1
- package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
- package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
- package/lib/azure-virtualnetworkgateway/index.d.ts +4 -0
- package/lib/azure-virtualnetworkgateway/index.js +21 -0
- package/lib/azure-virtualnetworkgateway/lib/index.d.ts +5 -0
- package/lib/azure-virtualnetworkgateway/lib/index.js +22 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +298 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +368 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +285 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.d.ts +12 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.js +129 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.d.ts +8 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +691 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/index.d.ts +5 -0
- package/lib/azure-virtualnetworkmanager/lib/index.js +6 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.d.ts +24 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.js +169 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.d.ts +170 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +214 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.d.ts +175 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.d.ts +225 -0
- package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.js +389 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +56 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +29 -2
- package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.js +292 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.js +430 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.js +372 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +2 -1
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +30 -3
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +105 -1
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
- package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
- package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
- package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
- package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
- package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
- package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
- package/lib/index.d.ts +2 -0
- package/lib/index.js +4 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.js +1 -1
- package/lib/testing/lib/metadata.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.IpamPool = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Azure Virtual Network Manager IPAM Pool implementation using AzapiResource framework
|
|
8
|
+
*
|
|
9
|
+
* This class provides a unified implementation for Azure Virtual Network Manager IPAM Pools
|
|
10
|
+
* that automatically handles version management, schema validation, and property transformation
|
|
11
|
+
* across all supported API versions.
|
|
12
|
+
*
|
|
13
|
+
* Supported API Versions:
|
|
14
|
+
* - 2024-05-01 (Active, Latest)
|
|
15
|
+
*
|
|
16
|
+
* Features:
|
|
17
|
+
* - Automatic latest version resolution when no version is specified
|
|
18
|
+
* - Explicit version pinning for stability requirements
|
|
19
|
+
* - Schema-driven validation and transformation
|
|
20
|
+
* - CIDR validation and overlap detection
|
|
21
|
+
* - Hierarchical pool support
|
|
22
|
+
* - JSII compliance for multi-language support
|
|
23
|
+
*/
|
|
24
|
+
const cdktf = require("cdktf");
|
|
25
|
+
const ipam_pool_schemas_1 = require("./ipam-pool-schemas");
|
|
26
|
+
const cidr_validator_1 = require("./utils/cidr-validator");
|
|
27
|
+
const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
|
|
28
|
+
/**
|
|
29
|
+
* Azure Virtual Network Manager IPAM Pool implementation
|
|
30
|
+
*
|
|
31
|
+
* IPAM Pools provide centralized IP address management for virtual networks,
|
|
32
|
+
* enabling automatic CIDR allocation, overlap prevention, and hierarchical
|
|
33
|
+
* address space organization. They are essential for managing IP addresses
|
|
34
|
+
* at scale across multiple virtual networks and subscriptions.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* // Basic IPAM pool for production workloads:
|
|
38
|
+
* const ipamPool = new IpamPool(this, "prod-pool", {
|
|
39
|
+
* name: "production-pool",
|
|
40
|
+
* location: "eastus",
|
|
41
|
+
* networkManagerId: networkManager.id,
|
|
42
|
+
* addressPrefixes: ["10.0.0.0/8"],
|
|
43
|
+
* description: "Root IP address pool for production",
|
|
44
|
+
* displayName: "Production Pool"
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* // Hierarchical pool with parent reference:
|
|
49
|
+
* const childPool = new IpamPool(this, "eastus-pool", {
|
|
50
|
+
* name: "eastus-pool",
|
|
51
|
+
* location: "eastus",
|
|
52
|
+
* networkManagerId: networkManager.id,
|
|
53
|
+
* addressPrefixes: ["10.1.0.0/16"],
|
|
54
|
+
* parentPoolName: "production-pool",
|
|
55
|
+
* description: "East US regional pool"
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* @stability stable
|
|
59
|
+
*/
|
|
60
|
+
class IpamPool extends azapi_resource_1.AzapiResource {
|
|
61
|
+
/**
|
|
62
|
+
* Validates address prefixes for format and overlap
|
|
63
|
+
* Throws descriptive errors if validation fails
|
|
64
|
+
*
|
|
65
|
+
* @param prefixes - Array of CIDR blocks to validate
|
|
66
|
+
* @throws Error if validation fails
|
|
67
|
+
*/
|
|
68
|
+
static validateAddressPrefixes(prefixes) {
|
|
69
|
+
if (!prefixes || prefixes.length === 0) {
|
|
70
|
+
throw new Error("At least one address prefix is required");
|
|
71
|
+
}
|
|
72
|
+
// Validate each CIDR individually
|
|
73
|
+
prefixes.forEach((prefix, index) => {
|
|
74
|
+
if (!(0, cidr_validator_1.isValidCidr)(prefix)) {
|
|
75
|
+
throw new Error(`Invalid CIDR notation at index ${index}: ${prefix}. ` +
|
|
76
|
+
`Expected format: x.x.x.x/y where y is 0-32`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Check for overlaps within the same pool
|
|
80
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
81
|
+
for (let j = i + 1; j < prefixes.length; j++) {
|
|
82
|
+
if ((0, cidr_validator_1.cidrsOverlap)(prefixes[i], prefixes[j])) {
|
|
83
|
+
throw new Error(`Address prefixes overlap: ${prefixes[i]} and ${prefixes[j]}. ` +
|
|
84
|
+
`Each CIDR block within a pool must be non-overlapping.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a new Azure Virtual Network Manager IPAM Pool using the AzapiResource framework
|
|
91
|
+
*
|
|
92
|
+
* @param scope - The scope in which to define this construct
|
|
93
|
+
* @param id - The unique identifier for this instance
|
|
94
|
+
* @param props - Configuration properties for the IPAM Pool
|
|
95
|
+
*/
|
|
96
|
+
constructor(scope, id, props) {
|
|
97
|
+
// Validate CIDR prefixes before construction
|
|
98
|
+
IpamPool.validateAddressPrefixes(props.addressPrefixes);
|
|
99
|
+
super(scope, id, props);
|
|
100
|
+
this.props = props;
|
|
101
|
+
// Extract properties from the AZAPI resource outputs using Terraform interpolation
|
|
102
|
+
this.resourceName = `\${${this.terraformResource.fqn}.name}`;
|
|
103
|
+
// Create Terraform outputs for easy access and referencing from other resources
|
|
104
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
105
|
+
value: this.id,
|
|
106
|
+
description: "The ID of the IPAM Pool",
|
|
107
|
+
});
|
|
108
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
109
|
+
value: this.resourceName,
|
|
110
|
+
description: "The name of the IPAM Pool",
|
|
111
|
+
});
|
|
112
|
+
this.locationOutput = new cdktf.TerraformOutput(this, "location", {
|
|
113
|
+
value: `\${${this.terraformResource.fqn}.location}`,
|
|
114
|
+
description: "The location of the IPAM Pool",
|
|
115
|
+
});
|
|
116
|
+
// Override logical IDs to match naming convention
|
|
117
|
+
this.idOutput.overrideLogicalId("id");
|
|
118
|
+
this.nameOutput.overrideLogicalId("name");
|
|
119
|
+
this.locationOutput.overrideLogicalId("location");
|
|
120
|
+
// Apply ignore changes if specified
|
|
121
|
+
this._applyIgnoreChanges();
|
|
122
|
+
}
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// REQUIRED ABSTRACT METHODS FROM AzapiResource
|
|
125
|
+
// =============================================================================
|
|
126
|
+
/**
|
|
127
|
+
* Resolves the parent resource ID for the IPAM Pool
|
|
128
|
+
* IPAM Pools are scoped to Network Managers
|
|
129
|
+
*/
|
|
130
|
+
resolveParentId(props) {
|
|
131
|
+
const typedProps = props;
|
|
132
|
+
return typedProps.networkManagerId;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets the default API version to use when no explicit version is specified
|
|
136
|
+
*/
|
|
137
|
+
defaultVersion() {
|
|
138
|
+
return "2024-05-01";
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Gets the Azure resource type for IPAM Pools
|
|
142
|
+
*/
|
|
143
|
+
resourceType() {
|
|
144
|
+
return ipam_pool_schemas_1.IPAM_POOL_TYPE;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Gets the API schema for the resolved version
|
|
148
|
+
*/
|
|
149
|
+
apiSchema() {
|
|
150
|
+
return this.resolveSchema();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Creates the resource body for the Azure API call
|
|
154
|
+
*/
|
|
155
|
+
createResourceBody(props) {
|
|
156
|
+
const typedProps = props;
|
|
157
|
+
return {
|
|
158
|
+
location: typedProps.location,
|
|
159
|
+
tags: this.allTags(),
|
|
160
|
+
properties: {
|
|
161
|
+
addressPrefixes: typedProps.addressPrefixes,
|
|
162
|
+
description: typedProps.description,
|
|
163
|
+
displayName: typedProps.displayName,
|
|
164
|
+
parentPoolName: typedProps.parentPoolName,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// PUBLIC METHODS FOR IPAM POOL OPERATIONS
|
|
170
|
+
// =============================================================================
|
|
171
|
+
/**
|
|
172
|
+
* Calculate total number of IP addresses in this pool
|
|
173
|
+
* Sums up all addresses from all CIDR blocks
|
|
174
|
+
*
|
|
175
|
+
* @returns Total count of IP addresses across all prefixes
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* const pool = new IpamPool(this, "pool", {
|
|
179
|
+
* addressPrefixes: ["10.0.0.0/24", "10.1.0.0/24"]
|
|
180
|
+
* });
|
|
181
|
+
* console.log(pool.totalAddressCount); // 512 (256 + 256)
|
|
182
|
+
*/
|
|
183
|
+
get totalAddressCount() {
|
|
184
|
+
return this.props.addressPrefixes.reduce((sum, cidr) => sum + (0, cidr_validator_1.calculateAddressCount)(cidr), 0);
|
|
185
|
+
}
|
|
186
|
+
// =============================================================================
|
|
187
|
+
// PRIVATE HELPER METHODS
|
|
188
|
+
// =============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Applies ignore changes lifecycle rules if specified in props
|
|
191
|
+
*/
|
|
192
|
+
_applyIgnoreChanges() {
|
|
193
|
+
if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
|
|
194
|
+
this.terraformResource.addOverride("lifecycle", {
|
|
195
|
+
ignore_changes: this.props.ignoreChanges,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.IpamPool = IpamPool;
|
|
201
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
202
|
+
IpamPool[_a] = { fqn: "@microsoft/terraform-cdk-constructs.IpamPool", version: "1.5.0" };
|
|
203
|
+
(() => {
|
|
204
|
+
azapi_resource_1.AzapiResource.registerSchemas(ipam_pool_schemas_1.IPAM_POOL_TYPE, ipam_pool_schemas_1.ALL_IPAM_POOL_VERSIONS);
|
|
205
|
+
})();
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS1wb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXZpcnR1YWxuZXR3b3JrbWFuYWdlci9saWIvaXBhbS1wb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsK0JBQStCO0FBRS9CLDJEQUE2RTtBQUM3RSwyREFJZ0M7QUFDaEMsOEVBR21EO0FBb0VuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQWEsUUFBUyxTQUFRLDhCQUFhO0lBS3pDOzs7Ozs7T0FNRztJQUNLLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFrQjtRQUN2RCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsSUFBQSw0QkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0NBQWtDLEtBQUssS0FBSyxNQUFNLElBQUk7b0JBQ3BELDRDQUE0QyxDQUMvQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdDLElBQUksSUFBQSw2QkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMzQyxNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJO3dCQUM3RCx3REFBd0QsQ0FDM0QsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBZUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCw2Q0FBNkM7UUFDN0MsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUU3RCxnRkFBZ0Y7UUFDaEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNwRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUseUJBQXlCO1NBQ3ZDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3hCLFdBQVcsRUFBRSwyQkFBMkI7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNoRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxZQUFZO1lBQ25ELFdBQVcsRUFBRSwrQkFBK0I7U0FDN0MsQ0FBQyxDQUFDO1FBRUgsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLCtDQUErQztJQUMvQyxnRkFBZ0Y7SUFFaEY7OztPQUdHO0lBQ08sZUFBZSxDQUFDLEtBQVU7UUFDbEMsTUFBTSxVQUFVLEdBQUcsS0FBc0IsQ0FBQztRQUMxQyxPQUFPLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxjQUFjO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNPLFlBQVk7UUFDcEIsT0FBTyxrQ0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNPLFNBQVM7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCLENBQUMsS0FBVTtRQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFzQixDQUFDO1FBQzFDLE9BQU87WUFDTCxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDcEIsVUFBVSxFQUFFO2dCQUNWLGVBQWUsRUFBRSxVQUFVLENBQUMsZUFBZTtnQkFDM0MsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2dCQUNuQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7Z0JBQ25DLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYzthQUMxQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDBDQUEwQztJQUMxQyxnRkFBZ0Y7SUFFaEY7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBQSxzQ0FBcUIsRUFBQyxJQUFJLENBQUMsRUFDaEQsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBdkxILDRCQXdMQzs7O0FBdkxDO0lBQ0UsOEJBQWEsQ0FBQyxlQUFlLENBQUMsa0NBQWMsRUFBRSwwQ0FBc0IsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsR0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgTWFuYWdlciBJUEFNIFBvb2wgaW1wbGVtZW50YXRpb24gdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgQXp1cmUgVmlydHVhbCBOZXR3b3JrIE1hbmFnZXIgSVBBTSBQb29sc1xuICogdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiBtYW5hZ2VtZW50LCBzY2hlbWEgdmFsaWRhdGlvbiwgYW5kIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uXG4gKiBhY3Jvc3MgYWxsIHN1cHBvcnRlZCBBUEkgdmVyc2lvbnMuXG4gKlxuICogU3VwcG9ydGVkIEFQSSBWZXJzaW9uczpcbiAqIC0gMjAyNC0wNS0wMSAoQWN0aXZlLCBMYXRlc3QpXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uIHdoZW4gbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAqIC0gRXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nIGZvciBzdGFiaWxpdHkgcmVxdWlyZW1lbnRzXG4gKiAtIFNjaGVtYS1kcml2ZW4gdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb25cbiAqIC0gQ0lEUiB2YWxpZGF0aW9uIGFuZCBvdmVybGFwIGRldGVjdGlvblxuICogLSBIaWVyYXJjaGljYWwgcG9vbCBzdXBwb3J0XG4gKiAtIEpTSUkgY29tcGxpYW5jZSBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFMTF9JUEFNX1BPT0xfVkVSU0lPTlMsIElQQU1fUE9PTF9UWVBFIH0gZnJvbSBcIi4vaXBhbS1wb29sLXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIGlzVmFsaWRDaWRyLFxuICBjaWRyc092ZXJsYXAsXG4gIGNhbGN1bGF0ZUFkZHJlc3NDb3VudCxcbn0gZnJvbSBcIi4vdXRpbHMvY2lkci12YWxpZGF0b3JcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbFxuICpcbiAqIEV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHdpdGggSVBBTSBQb29sIHNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbFByb3BzIGV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFJlc291cmNlIElEIG9mIHRoZSBwYXJlbnQgTmV0d29yayBNYW5hZ2VyXG4gICAqIEBleGFtcGxlIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL3Jlc291cmNlR3JvdXBzL3JnL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrTWFuYWdlcnMvdm5tXCJcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNYW5hZ2VySWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSVAgYWRkcmVzcyBwcmVmaXhlcyBmb3IgdGhlIHBvb2xcbiAgICogTXVzdCBiZSB2YWxpZCBDSURSIG5vdGF0aW9uIChlLmcuLCBcIjEwLjAuMC4wLzhcIilcbiAgICogTXVsdGlwbGUgcHJlZml4ZXMgbXVzdCBub3Qgb3ZlcmxhcFxuICAgKiBAZXhhbXBsZSBbXCIxMC4wLjAuMC84XCIsIFwiMTcyLjE2LjAuMC8xMlwiXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeGVzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIElQQU0gcG9vbFxuICAgKiBAZXhhbXBsZSBcIlByb2R1Y3Rpb24gSVAgYWRkcmVzcyBwb29sIGZvciBFYXN0IFVTIHJlZ2lvblwiXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZnJpZW5kbHkgZGlzcGxheSBuYW1lXG4gICAqIEBleGFtcGxlIFwiRWFzdCBVUyBQcm9kdWN0aW9uIFBvb2xcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgcGFyZW50IHBvb2wgZm9yIGhpZXJhcmNoaWNhbCBwb29sc1xuICAgKiBMZWF2ZSBlbXB0eS91bmRlZmluZWQgZm9yIHJvb3QgcG9vbHNcbiAgICogQGV4YW1wbGUgXCJyb290LXBvb2xcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UG9vbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZlY3ljbGUgcnVsZXMgdG8gaWdub3JlIGNoYW5nZXNcbiAgICogQGV4YW1wbGUgW1widGFnc1wiXVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIElQQU0gUG9vbCBib2R5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVBvb2xQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRQb29sTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIElQQU0gUG9vbCBBUEkgY2FsbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbEJvZHkge1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvcGVydGllczogSXBhbVBvb2xQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIElQQU0gUG9vbHMgcHJvdmlkZSBjZW50cmFsaXplZCBJUCBhZGRyZXNzIG1hbmFnZW1lbnQgZm9yIHZpcnR1YWwgbmV0d29ya3MsXG4gKiBlbmFibGluZyBhdXRvbWF0aWMgQ0lEUiBhbGxvY2F0aW9uLCBvdmVybGFwIHByZXZlbnRpb24sIGFuZCBoaWVyYXJjaGljYWxcbiAqIGFkZHJlc3Mgc3BhY2Ugb3JnYW5pemF0aW9uLiBUaGV5IGFyZSBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIElQIGFkZHJlc3Nlc1xuICogYXQgc2NhbGUgYWNyb3NzIG11bHRpcGxlIHZpcnR1YWwgbmV0d29ya3MgYW5kIHN1YnNjcmlwdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIElQQU0gcG9vbCBmb3IgcHJvZHVjdGlvbiB3b3JrbG9hZHM6XG4gKiBjb25zdCBpcGFtUG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcInByb2QtcG9vbFwiLCB7XG4gKiAgIG5hbWU6IFwicHJvZHVjdGlvbi1wb29sXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICBuZXR3b3JrTWFuYWdlcklkOiBuZXR3b3JrTWFuYWdlci5pZCxcbiAqICAgYWRkcmVzc1ByZWZpeGVzOiBbXCIxMC4wLjAuMC84XCJdLFxuICogICBkZXNjcmlwdGlvbjogXCJSb290IElQIGFkZHJlc3MgcG9vbCBmb3IgcHJvZHVjdGlvblwiLFxuICogICBkaXNwbGF5TmFtZTogXCJQcm9kdWN0aW9uIFBvb2xcIlxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhpZXJhcmNoaWNhbCBwb29sIHdpdGggcGFyZW50IHJlZmVyZW5jZTpcbiAqIGNvbnN0IGNoaWxkUG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcImVhc3R1cy1wb29sXCIsIHtcbiAqICAgbmFtZTogXCJlYXN0dXMtcG9vbFwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgbmV0d29ya01hbmFnZXJJZDogbmV0d29ya01hbmFnZXIuaWQsXG4gKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMS4wLjAvMTZcIl0sXG4gKiAgIHBhcmVudFBvb2xOYW1lOiBcInByb2R1Y3Rpb24tcG9vbFwiLFxuICogICBkZXNjcmlwdGlvbjogXCJFYXN0IFVTIHJlZ2lvbmFsIHBvb2xcIlxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIElwYW1Qb29sIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoSVBBTV9QT09MX1RZUEUsIEFMTF9JUEFNX1BPT0xfVkVSU0lPTlMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzIHByZWZpeGVzIGZvciBmb3JtYXQgYW5kIG92ZXJsYXBcbiAgICogVGhyb3dzIGRlc2NyaXB0aXZlIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBwYXJhbSBwcmVmaXhlcyAtIEFycmF5IG9mIENJRFIgYmxvY2tzIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVBZGRyZXNzUHJlZml4ZXMocHJlZml4ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCFwcmVmaXhlcyB8fCBwcmVmaXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBhZGRyZXNzIHByZWZpeCBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIENJRFIgaW5kaXZpZHVhbGx5XG4gICAgcHJlZml4ZXMuZm9yRWFjaCgocHJlZml4LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpc1ZhbGlkQ2lkcihwcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBDSURSIG5vdGF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke3ByZWZpeH0uIGAgK1xuICAgICAgICAgICAgYEV4cGVjdGVkIGZvcm1hdDogeC54LngueC95IHdoZXJlIHkgaXMgMC0zMmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBmb3Igb3ZlcmxhcHMgd2l0aGluIHRoZSBzYW1lIHBvb2xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoY2lkcnNPdmVybGFwKHByZWZpeGVzW2ldLCBwcmVmaXhlc1tqXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWRkcmVzcyBwcmVmaXhlcyBvdmVybGFwOiAke3ByZWZpeGVzW2ldfSBhbmQgJHtwcmVmaXhlc1tqXX0uIGAgK1xuICAgICAgICAgICAgICBgRWFjaCBDSURSIGJsb2NrIHdpdGhpbiBhIHBvb2wgbXVzdCBiZSBub24tb3ZlcmxhcHBpbmcuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwcm9wZXJ0aWVzIGZvciB0aGlzIElQQU0gUG9vbCBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBJcGFtUG9vbFByb3BzO1xuXG4gIC8vIE91dHB1dCBwcm9wZXJ0aWVzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmdcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBsb2NhdGlvbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIC8vIFB1YmxpYyBwcm9wZXJ0aWVzXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgTWFuYWdlciBJUEFNIFBvb2wgdXNpbmcgdGhlIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIElQQU0gUG9vbFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElwYW1Qb29sUHJvcHMpIHtcbiAgICAvLyBWYWxpZGF0ZSBDSURSIHByZWZpeGVzIGJlZm9yZSBjb25zdHJ1Y3Rpb25cbiAgICBJcGFtUG9vbC52YWxpZGF0ZUFkZHJlc3NQcmVmaXhlcyhwcm9wcy5hZGRyZXNzUHJlZml4ZXMpO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IHByb3BlcnRpZXMgZnJvbSB0aGUgQVpBUEkgcmVzb3VyY2Ugb3V0cHV0cyB1c2luZyBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvblxuICAgIHRoaXMucmVzb3VyY2VOYW1lID0gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWA7XG5cbiAgICAvLyBDcmVhdGUgVGVycmFmb3JtIG91dHB1dHMgZm9yIGVhc3kgYWNjZXNzIGFuZCByZWZlcmVuY2luZyBmcm9tIG90aGVyIHJlc291cmNlc1xuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIElQQU0gUG9vbFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IHRoaXMucmVzb3VyY2VOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIElQQU0gUG9vbFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJsb2NhdGlvblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5sb2NhdGlvbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxvY2F0aW9uIG9mIHRoZSBJUEFNIFBvb2xcIixcbiAgICB9KTtcblxuICAgIC8vIE92ZXJyaWRlIGxvZ2ljYWwgSURzIHRvIG1hdGNoIG5hbWluZyBjb252ZW50aW9uXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImxvY2F0aW9uXCIpO1xuXG4gICAgLy8gQXBwbHkgaWdub3JlIGNoYW5nZXMgaWYgc3BlY2lmaWVkXG4gICAgdGhpcy5fYXBwbHlJZ25vcmVDaGFuZ2VzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVFVSVJFRCBBQlNUUkFDVCBNRVRIT0RTIEZST00gQXphcGlSZXNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGUgSVBBTSBQb29sXG4gICAqIElQQU0gUG9vbHMgYXJlIHNjb3BlZCB0byBOZXR3b3JrIE1hbmFnZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBJcGFtUG9vbFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLm5ldHdvcmtNYW5hZ2VySWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGVmYXVsdCBBUEkgdmVyc2lvbiB0byB1c2Ugd2hlbiBubyBleHBsaWNpdCB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNS0wMVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEF6dXJlIHJlc291cmNlIHR5cGUgZm9yIElQQU0gUG9vbHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSVBBTV9QT09MX1RZUEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBJcGFtUG9vbFByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogdHlwZWRQcm9wcy5sb2NhdGlvbixcbiAgICAgIHRhZ3M6IHRoaXMuYWxsVGFncygpLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBhZGRyZXNzUHJlZml4ZXM6IHR5cGVkUHJvcHMuYWRkcmVzc1ByZWZpeGVzLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZWRQcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZGlzcGxheU5hbWU6IHR5cGVkUHJvcHMuZGlzcGxheU5hbWUsXG4gICAgICAgIHBhcmVudFBvb2xOYW1lOiB0eXBlZFByb3BzLnBhcmVudFBvb2xOYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgRk9SIElQQU0gUE9PTCBPUEVSQVRJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgSVAgYWRkcmVzc2VzIGluIHRoaXMgcG9vbFxuICAgKiBTdW1zIHVwIGFsbCBhZGRyZXNzZXMgZnJvbSBhbGwgQ0lEUiBibG9ja3NcbiAgICpcbiAgICogQHJldHVybnMgVG90YWwgY291bnQgb2YgSVAgYWRkcmVzc2VzIGFjcm9zcyBhbGwgcHJlZml4ZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcInBvb2xcIiwge1xuICAgKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMC4wLjAvMjRcIiwgXCIxMC4xLjAuMC8yNFwiXVxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2cocG9vbC50b3RhbEFkZHJlc3NDb3VudCk7IC8vIDUxMiAoMjU2ICsgMjU2KVxuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbEFkZHJlc3NDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmFkZHJlc3NQcmVmaXhlcy5yZWR1Y2UoXG4gICAgICAoc3VtLCBjaWRyKSA9PiBzdW0gKyBjYWxjdWxhdGVBZGRyZXNzQ291bnQoY2lkciksXG4gICAgICAwLFxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIEhFTFBFUiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaWdub3JlIGNoYW5nZXMgbGlmZWN5Y2xlIHJ1bGVzIGlmIHNwZWNpZmllZCBpbiBwcm9wc1xuICAgKi9cbiAgcHJpdmF0ZSBfYXBwbHlJZ25vcmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMgJiYgdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UuYWRkT3ZlcnJpZGUoXCJsaWZlY3ljbGVcIiwge1xuICAgICAgICBpZ25vcmVfY2hhbmdlczogdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -156,7 +156,7 @@ class NetworkGroupStaticMember extends azapi_resource_1.AzapiResource {
|
|
|
156
156
|
}
|
|
157
157
|
exports.NetworkGroupStaticMember = NetworkGroupStaticMember;
|
|
158
158
|
_a = JSII_RTTI_SYMBOL_1;
|
|
159
|
-
NetworkGroupStaticMember[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroupStaticMember", version: "1.
|
|
159
|
+
NetworkGroupStaticMember[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroupStaticMember", version: "1.5.0" };
|
|
160
160
|
(() => {
|
|
161
161
|
azapi_resource_1.AzapiResource.registerSchemas(network_group_static_member_schemas_1.STATIC_MEMBER_TYPE, network_group_static_member_schemas_1.ALL_STATIC_MEMBER_VERSIONS);
|
|
162
162
|
})();
|
|
@@ -151,7 +151,7 @@ class NetworkGroup extends azapi_resource_1.AzapiResource {
|
|
|
151
151
|
}
|
|
152
152
|
exports.NetworkGroup = NetworkGroup;
|
|
153
153
|
_a = JSII_RTTI_SYMBOL_1;
|
|
154
|
-
NetworkGroup[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroup", version: "1.
|
|
154
|
+
NetworkGroup[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroup", version: "1.5.0" };
|
|
155
155
|
(() => {
|
|
156
156
|
azapi_resource_1.AzapiResource.registerSchemas(network_group_schemas_1.NETWORK_GROUP_TYPE, network_group_schemas_1.ALL_NETWORK_GROUP_VERSIONS);
|
|
157
157
|
})();
|
|
@@ -157,7 +157,7 @@ class SecurityAdminConfiguration extends azapi_resource_1.AzapiResource {
|
|
|
157
157
|
}
|
|
158
158
|
exports.SecurityAdminConfiguration = SecurityAdminConfiguration;
|
|
159
159
|
_a = JSII_RTTI_SYMBOL_1;
|
|
160
|
-
SecurityAdminConfiguration[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminConfiguration", version: "1.
|
|
160
|
+
SecurityAdminConfiguration[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminConfiguration", version: "1.5.0" };
|
|
161
161
|
(() => {
|
|
162
162
|
azapi_resource_1.AzapiResource.registerSchemas(security_admin_configuration_schemas_1.SECURITY_ADMIN_CONFIGURATION_TYPE, security_admin_configuration_schemas_1.ALL_SECURITY_ADMIN_CONFIGURATION_VERSIONS);
|
|
163
163
|
})();
|
|
@@ -155,7 +155,7 @@ class SecurityAdminRuleCollection extends azapi_resource_1.AzapiResource {
|
|
|
155
155
|
}
|
|
156
156
|
exports.SecurityAdminRuleCollection = SecurityAdminRuleCollection;
|
|
157
157
|
_a = JSII_RTTI_SYMBOL_1;
|
|
158
|
-
SecurityAdminRuleCollection[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRuleCollection", version: "1.
|
|
158
|
+
SecurityAdminRuleCollection[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRuleCollection", version: "1.5.0" };
|
|
159
159
|
(() => {
|
|
160
160
|
azapi_resource_1.AzapiResource.registerSchemas(security_admin_rule_collection_schemas_1.RULE_COLLECTION_TYPE, security_admin_rule_collection_schemas_1.ALL_RULE_COLLECTION_VERSIONS);
|
|
161
161
|
})();
|
|
@@ -197,7 +197,7 @@ class SecurityAdminRule extends azapi_resource_1.AzapiResource {
|
|
|
197
197
|
}
|
|
198
198
|
exports.SecurityAdminRule = SecurityAdminRule;
|
|
199
199
|
_a = JSII_RTTI_SYMBOL_1;
|
|
200
|
-
SecurityAdminRule[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRule", version: "1.
|
|
200
|
+
SecurityAdminRule[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRule", version: "1.5.0" };
|
|
201
201
|
(() => {
|
|
202
202
|
azapi_resource_1.AzapiResource.registerSchemas(security_admin_rule_schemas_1.SECURITY_ADMIN_RULE_TYPE, security_admin_rule_schemas_1.ALL_SECURITY_ADMIN_RULE_VERSIONS);
|
|
203
203
|
})();
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CIDR Validator Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive validation and parsing utilities for IPv4 CIDR notation.
|
|
5
|
+
* Used by IPAM constructs to ensure proper network address space management.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Result of CIDR validation operations
|
|
9
|
+
*/
|
|
10
|
+
export interface CidrValidationResult {
|
|
11
|
+
/** Whether the validation passed */
|
|
12
|
+
readonly valid: boolean;
|
|
13
|
+
/** List of validation errors */
|
|
14
|
+
readonly errors: string[];
|
|
15
|
+
/** List of validation warnings */
|
|
16
|
+
readonly warnings: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parsed CIDR information
|
|
20
|
+
*/
|
|
21
|
+
export interface ParsedCidr {
|
|
22
|
+
/** Original CIDR notation (e.g., "10.0.0.0/8") */
|
|
23
|
+
readonly cidr: string;
|
|
24
|
+
/** Network address (e.g., "10.0.0.0") */
|
|
25
|
+
readonly network: string;
|
|
26
|
+
/** Prefix length (e.g., 8) */
|
|
27
|
+
readonly prefix: number;
|
|
28
|
+
/** First usable IP address */
|
|
29
|
+
readonly firstIp: string;
|
|
30
|
+
/** Last usable IP address */
|
|
31
|
+
readonly lastIp: string;
|
|
32
|
+
/** Total number of addresses in the range */
|
|
33
|
+
readonly totalAddresses: number;
|
|
34
|
+
/** Network mask (e.g., "255.0.0.0") */
|
|
35
|
+
readonly netmask: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validates if a string is a valid CIDR notation
|
|
39
|
+
*
|
|
40
|
+
* @param cidr - CIDR string (e.g., "10.0.0.0/16")
|
|
41
|
+
* @returns boolean - true if valid CIDR format
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const valid = isValidCidr("10.0.0.0/16");
|
|
45
|
+
* console.log(valid); // true
|
|
46
|
+
*/
|
|
47
|
+
export declare function isValidCidr(cidr: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Validates if CIDR is within allowed private ranges (RFC 1918)
|
|
50
|
+
*
|
|
51
|
+
* @param cidr - CIDR string
|
|
52
|
+
* @returns boolean - true if within private IP range
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* const isPrivate = isPrivateRange("10.0.0.0/16");
|
|
56
|
+
* console.log(isPrivate); // true
|
|
57
|
+
*/
|
|
58
|
+
export declare function isPrivateRange(cidr: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Checks if two CIDR blocks overlap
|
|
61
|
+
*
|
|
62
|
+
* @param cidr1 - First CIDR
|
|
63
|
+
* @param cidr2 - Second CIDR
|
|
64
|
+
* @returns boolean - true if CIDRs overlap
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* const overlap = cidrsOverlap("10.0.0.0/8", "10.1.0.0/16");
|
|
68
|
+
* console.log(overlap); // true
|
|
69
|
+
*/
|
|
70
|
+
export declare function cidrsOverlap(cidr1: string, cidr2: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Validates if child CIDR is contained within parent CIDR
|
|
73
|
+
*
|
|
74
|
+
* @param childCidr - Child CIDR block
|
|
75
|
+
* @param parentCidr - Parent CIDR block
|
|
76
|
+
* @returns boolean - true if child is subnet of parent
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* const isSubnet = isSubnet("10.1.0.0/16", "10.0.0.0/8");
|
|
80
|
+
* console.log(isSubnet); // true
|
|
81
|
+
*/
|
|
82
|
+
export declare function isSubnet(childCidr: string, parentCidr: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Calculates number of IP addresses in a CIDR block
|
|
85
|
+
*
|
|
86
|
+
* @param cidr - CIDR string
|
|
87
|
+
* @returns number - Total IP addresses in the block
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* const count = calculateAddressCount("10.0.0.0/24");
|
|
91
|
+
* console.log(count); // 256
|
|
92
|
+
*/
|
|
93
|
+
export declare function calculateAddressCount(cidr: string): number;
|
|
94
|
+
/**
|
|
95
|
+
* Validates prefix length is within allowed range
|
|
96
|
+
*
|
|
97
|
+
* @param cidr - CIDR string
|
|
98
|
+
* @param minPrefix - Minimum allowed prefix (e.g., 8)
|
|
99
|
+
* @param maxPrefix - Maximum allowed prefix (e.g., 29)
|
|
100
|
+
* @returns boolean - true if prefix length is within range
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* const valid = isValidPrefixLength("10.0.0.0/24", 8, 29);
|
|
104
|
+
* console.log(valid); // true
|
|
105
|
+
*/
|
|
106
|
+
export declare function isValidPrefixLength(cidr: string, minPrefix: number, maxPrefix: number): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Validate CIDR format and structure
|
|
109
|
+
*
|
|
110
|
+
* @param cidr - CIDR notation string (e.g., "10.0.0.0/8")
|
|
111
|
+
* @returns Validation result with errors and warnings
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* const result = validateCidr("10.0.0.0/8");
|
|
115
|
+
* if (!result.valid) {
|
|
116
|
+
* console.error("Invalid CIDR:", result.errors);
|
|
117
|
+
* }
|
|
118
|
+
*/
|
|
119
|
+
export declare function validateCidr(cidr: string): CidrValidationResult;
|
|
120
|
+
/**
|
|
121
|
+
* Parse CIDR into structured information
|
|
122
|
+
*
|
|
123
|
+
* @param cidr - CIDR notation string
|
|
124
|
+
* @returns Parsed CIDR information
|
|
125
|
+
* @throws Error if CIDR format is invalid
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* const parsed = parseCidr("10.0.0.0/8");
|
|
129
|
+
* console.log(`Network: ${parsed.network}, Prefix: ${parsed.prefix}`);
|
|
130
|
+
* console.log(`Range: ${parsed.firstIp} - ${parsed.lastIp}`);
|
|
131
|
+
* console.log(`Total addresses: ${parsed.totalAddresses}`);
|
|
132
|
+
*/
|
|
133
|
+
export declare function parseCidr(cidr: string): ParsedCidr;
|
|
134
|
+
/**
|
|
135
|
+
* Check if two CIDRs overlap
|
|
136
|
+
*
|
|
137
|
+
* @param cidr1 - First CIDR block
|
|
138
|
+
* @param cidr2 - Second CIDR block
|
|
139
|
+
* @returns True if the CIDRs overlap
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* const overlaps = checkOverlap("10.0.0.0/16", "10.0.1.0/24");
|
|
143
|
+
* console.log(overlaps); // true
|
|
144
|
+
*/
|
|
145
|
+
export declare function checkOverlap(cidr1: string, cidr2: string): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Validate that multiple CIDRs don't overlap
|
|
148
|
+
*
|
|
149
|
+
* @param cidrs - Array of CIDR blocks to check
|
|
150
|
+
* @returns Validation result with details of any overlaps
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* const result = validateNoOverlaps([
|
|
154
|
+
* "10.0.0.0/16",
|
|
155
|
+
* "10.1.0.0/16",
|
|
156
|
+
* "10.0.1.0/24"
|
|
157
|
+
* ]);
|
|
158
|
+
* if (!result.valid) {
|
|
159
|
+
* console.error("Overlapping CIDRs:", result.errors);
|
|
160
|
+
* }
|
|
161
|
+
*/
|
|
162
|
+
export declare function validateNoOverlaps(cidrs: string[]): CidrValidationResult;
|
|
163
|
+
/**
|
|
164
|
+
* Check if a child CIDR is contained within a parent CIDR
|
|
165
|
+
*
|
|
166
|
+
* @param parentCidr - Parent CIDR block
|
|
167
|
+
* @param childCidr - Child CIDR block to check
|
|
168
|
+
* @returns True if child is fully contained in parent
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* const contained = isContained("10.0.0.0/16", "10.0.1.0/24");
|
|
172
|
+
* console.log(contained); // true
|
|
173
|
+
*/
|
|
174
|
+
export declare function isContained(parentCidr: string, childCidr: string): boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Validate that multiple child CIDRs are all contained within a parent CIDR
|
|
177
|
+
*
|
|
178
|
+
* @param parentCidr - Parent CIDR block
|
|
179
|
+
* @param childCidrs - Array of child CIDR blocks
|
|
180
|
+
* @returns Validation result with details of any containment violations
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* const result = validateContainment("10.0.0.0/16", [
|
|
184
|
+
* "10.0.1.0/24",
|
|
185
|
+
* "10.0.2.0/24"
|
|
186
|
+
* ]);
|
|
187
|
+
* if (!result.valid) {
|
|
188
|
+
* console.error("Containment violations:", result.errors);
|
|
189
|
+
* }
|
|
190
|
+
*/
|
|
191
|
+
export declare function validateContainment(parentCidr: string, childCidrs: string[]): CidrValidationResult;
|
|
192
|
+
/**
|
|
193
|
+
* Convert an IP address string to a 32-bit number
|
|
194
|
+
*
|
|
195
|
+
* @param ip - IP address string (e.g., "10.0.0.1")
|
|
196
|
+
* @returns 32-bit number representation
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* const num = ipToNumber("10.0.0.1");
|
|
200
|
+
* console.log(num); // 167772161
|
|
201
|
+
*/
|
|
202
|
+
export declare function ipToNumber(ip: string): number;
|
|
203
|
+
/**
|
|
204
|
+
* Convert a 32-bit number to an IP address string
|
|
205
|
+
*
|
|
206
|
+
* @param num - 32-bit number representation
|
|
207
|
+
* @returns IP address string
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* const ip = numberToIp(167772161);
|
|
211
|
+
* console.log(ip); // "10.0.0.1"
|
|
212
|
+
*/
|
|
213
|
+
export declare function numberToIp(num: number): string;
|
|
214
|
+
/**
|
|
215
|
+
* Convert a prefix length to a netmask number
|
|
216
|
+
*
|
|
217
|
+
* @param prefix - Prefix length (0-32)
|
|
218
|
+
* @returns 32-bit netmask number
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* const mask = prefixToMask(24);
|
|
222
|
+
* const maskIp = numberToIp(mask);
|
|
223
|
+
* console.log(maskIp); // "255.255.255.0"
|
|
224
|
+
*/
|
|
225
|
+
export declare function prefixToMask(prefix: number): number;
|