@drunk-pulumi/azure 0.0.36 → 0.0.38

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.
Files changed (176) hide show
  1. package/Aks/Helper.d.ts +6 -11
  2. package/Aks/Helper.js +40 -65
  3. package/Aks/Identity.d.ts +3 -10
  4. package/Aks/Identity.js +9 -8
  5. package/Aks/index.d.ts +67 -71
  6. package/Aks/index.js +198 -314
  7. package/Apim/ApiProduct/PolicyBuilder.js +25 -27
  8. package/Apim/ApiProduct/SwaggerHelper.js +1 -3
  9. package/Apim/ApiProduct/index.d.ts +3 -3
  10. package/Apim/ApiProduct/index.js +1 -2
  11. package/Automation/index.d.ts +7 -0
  12. package/Automation/index.js +55 -0
  13. package/AzAd/EnvRoles.Consts.d.ts +12 -0
  14. package/AzAd/EnvRoles.Consts.js +125 -0
  15. package/AzAd/EnvRoles.d.ts +16 -15
  16. package/AzAd/EnvRoles.js +69 -47
  17. package/AzAd/GraphDefinition.d.ts +2 -2
  18. package/AzAd/GraphDefinition.js +3055 -3056
  19. package/AzAd/Helper.d.ts +24 -13
  20. package/AzAd/Helper.js +98 -25
  21. package/AzAd/Identities/AzDevOpsIdentity.d.ts +12 -0
  22. package/AzAd/Identities/AzDevOpsIdentity.js +32 -0
  23. package/AzAd/Identities/AzDevOpsManagedIdentity.d.ts +7 -0
  24. package/AzAd/Identities/AzDevOpsManagedIdentity.js +15 -0
  25. package/AzAd/Identities/AzUserAdRevertSync.d.ts +2 -9
  26. package/AzAd/Identities/AzUserAdRevertSync.js +4 -5
  27. package/AzAd/Identities/index.d.ts +3 -0
  28. package/AzAd/Identities/index.js +10 -0
  29. package/AzAd/Identity.d.ts +10 -22
  30. package/AzAd/Identity.js +50 -61
  31. package/AzAd/Role.d.ts +2 -3
  32. package/AzAd/Role.js +4 -5
  33. package/AzAd/RoleAssignment.d.ts +34 -5
  34. package/AzAd/RoleAssignment.js +2 -2
  35. package/AzAd/RoleDefinitions/JustInTimeRequestRole.d.ts +2 -0
  36. package/AzAd/RoleDefinitions/JustInTimeRequestRole.js +25 -0
  37. package/AzAd/RolesBuiltIn.d.ts +29 -0
  38. package/AzAd/RolesBuiltIn.js +13034 -8058
  39. package/AzAd/UserAssignedIdentity.d.ts +6 -0
  40. package/AzAd/UserAssignedIdentity.js +27 -0
  41. package/Builder/AksBuilder.d.ts +3 -0
  42. package/Builder/AksBuilder.js +95 -0
  43. package/Builder/VnetBuilder.d.ts +3 -0
  44. package/Builder/VnetBuilder.js +279 -0
  45. package/Builder/index.d.ts +2 -0
  46. package/Builder/index.js +8 -0
  47. package/Builder/types.d.ts +120 -0
  48. package/Builder/types.js +18 -0
  49. package/Certificate/index.d.ts +1 -1
  50. package/Certificate/index.js +26 -28
  51. package/Common/AutoTags.js +2 -2
  52. package/Common/AzureEnv.d.ts +4 -3
  53. package/Common/AzureEnv.js +31 -24
  54. package/Common/GlobalEnv.d.ts +1 -2
  55. package/Common/GlobalEnv.js +7 -7
  56. package/Common/Location.d.ts +3 -3
  57. package/Common/Location.js +22 -9
  58. package/Common/LocationBuiltIn.d.ts +6 -81
  59. package/Common/LocationBuiltIn.js +491 -1923
  60. package/Common/Naming/index.d.ts +6 -4
  61. package/Common/Naming/index.js +64 -60
  62. package/Common/ResourceEnv.d.ts +2 -2
  63. package/Common/ResourceEnv.js +11 -10
  64. package/Common/StackEnv.js +2 -9
  65. package/Core/KeyGenetators.d.ts +16 -20
  66. package/Core/KeyGenetators.js +17 -16
  67. package/Core/Random.d.ts +4 -4
  68. package/Core/Random.js +10 -10
  69. package/Core/ResourceGroup.d.ts +12 -6
  70. package/Core/ResourceGroup.js +12 -24
  71. package/IOT/Hub/index.d.ts +4 -8
  72. package/IOT/Hub/index.js +19 -54
  73. package/KeyVault/Helper.d.ts +8 -6
  74. package/KeyVault/Helper.js +13 -19
  75. package/KeyVault/index.d.ts +1 -3
  76. package/KeyVault/index.js +2 -26
  77. package/Logs/Helpers.d.ts +35 -25
  78. package/Logs/Helpers.js +33 -20
  79. package/Logs/LogAnalytics.d.ts +2 -2
  80. package/Logs/LogAnalytics.js +15 -6
  81. package/Logs/index.d.ts +3 -3
  82. package/Logs/index.js +4 -4
  83. package/MySql/index.d.ts +2 -3
  84. package/MySql/index.js +16 -19
  85. package/{ReadMe.md → README.md} +6 -1
  86. package/Sql/index.d.ts +17 -10
  87. package/Sql/index.js +39 -42
  88. package/Storage/CdnEndpoint.d.ts +2 -2
  89. package/Storage/CdnEndpoint.js +14 -15
  90. package/Storage/Helper.d.ts +2 -2
  91. package/Storage/Helper.js +6 -6
  92. package/Storage/ManagementRules.d.ts +5 -23
  93. package/Storage/ManagementRules.js +3 -3
  94. package/Storage/index.d.ts +3 -3
  95. package/Storage/index.js +28 -28
  96. package/VM/AzureDevOpsExtension.d.ts +16 -0
  97. package/VM/AzureDevOpsExtension.js +14 -0
  98. package/VM/Extension.d.ts +15 -0
  99. package/VM/Extension.js +13 -0
  100. package/VM/GlobalSchedule.d.ts +10 -0
  101. package/VM/GlobalSchedule.js +20 -0
  102. package/VM/index.d.ts +18 -18
  103. package/VM/index.js +94 -57
  104. package/VNet/Bastion.d.ts +4 -4
  105. package/VNet/Bastion.js +12 -8
  106. package/VNet/Firewall.d.ts +19 -12
  107. package/VNet/Firewall.js +59 -40
  108. package/VNet/FirewallPolicies/AksFirewallPolicy.d.ts +16 -16
  109. package/VNet/FirewallPolicies/AksFirewallPolicy.js +193 -220
  110. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.d.ts +12 -10
  111. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.js +170 -282
  112. package/VNet/FirewallPolicies/DefaultFirewallPolicy.d.ts +3 -0
  113. package/VNet/FirewallPolicies/DefaultFirewallPolicy.js +25 -0
  114. package/VNet/FirewallPolicies/index.d.ts +4 -0
  115. package/VNet/FirewallPolicies/index.js +10 -0
  116. package/VNet/FirewallPolicy.d.ts +14 -11
  117. package/VNet/FirewallPolicy.js +67 -74
  118. package/VNet/FirewallRules/AksFirewallRules.d.ts +4 -3
  119. package/VNet/FirewallRules/AksFirewallRules.js +101 -100
  120. package/VNet/Helper.d.ts +8 -4
  121. package/VNet/Helper.js +42 -35
  122. package/VNet/IpAddress.d.ts +6 -8
  123. package/VNet/IpAddress.js +6 -11
  124. package/VNet/IpAddressPrefix.d.ts +12 -9
  125. package/VNet/IpAddressPrefix.js +14 -13
  126. package/VNet/NSGRules/AppGatewaySecurityRule.d.ts +9 -0
  127. package/VNet/NSGRules/AppGatewaySecurityRule.js +46 -0
  128. package/VNet/NSGRules/AzADSecurityRule.d.ts +6 -0
  129. package/VNet/NSGRules/AzADSecurityRule.js +39 -0
  130. package/VNet/NSGRules/BastionSecurityRule.d.ts +9 -0
  131. package/VNet/NSGRules/BastionSecurityRule.js +93 -0
  132. package/VNet/NatGateway.d.ts +10 -0
  133. package/VNet/NatGateway.js +21 -0
  134. package/VNet/NetworkPeering.d.ts +7 -7
  135. package/VNet/NetworkPeering.js +29 -20
  136. package/VNet/PrivateDns.d.ts +8 -10
  137. package/VNet/PrivateDns.js +12 -14
  138. package/VNet/PrivateEndpoint.js +5 -2
  139. package/VNet/RouteTable.d.ts +7 -8
  140. package/VNet/RouteTable.js +6 -6
  141. package/VNet/SecurityGroup.d.ts +4 -4
  142. package/VNet/SecurityGroup.js +7 -3
  143. package/VNet/Subnet.d.ts +10 -7
  144. package/VNet/Subnet.js +4 -3
  145. package/VNet/VPNGateway.d.ts +13 -0
  146. package/VNet/VPNGateway.js +73 -0
  147. package/VNet/VirtualWAN.d.ts +7 -10
  148. package/VNet/VirtualWAN.js +1 -1
  149. package/VNet/Vnet.d.ts +29 -23
  150. package/VNet/Vnet.js +58 -121
  151. package/VNet/index.d.ts +17 -18
  152. package/VNet/index.js +41 -54
  153. package/VNet/types.d.ts +94 -0
  154. package/VNet/types.js +3 -0
  155. package/Web/types.d.ts +2 -134
  156. package/package.json +8 -8
  157. package/types.d.ts +22 -8
  158. package/z_tests/_tools/Mocks.js +12 -13
  159. package/Automation/AutoAccount.d.ts +0 -5
  160. package/Automation/AutoAccount.js +0 -18
  161. package/AzAd/Identities/AzDevOps.d.ts +0 -23
  162. package/AzAd/Identities/AzDevOps.js +0 -61
  163. package/AzAd/KeyVaultRoles.d.ts +0 -8
  164. package/AzAd/KeyVaultRoles.js +0 -53
  165. package/AzAd/ManagedIdentity.d.ts +0 -6
  166. package/AzAd/ManagedIdentity.js +0 -20
  167. package/AzAd/UserIdentity.d.ts +0 -5
  168. package/AzAd/UserIdentity.js +0 -12
  169. package/Common/Naming/AzureRegions.d.ts +0 -4
  170. package/Common/Naming/AzureRegions.js +0 -49
  171. package/KeyVault/VaultPermissions.d.ts +0 -27
  172. package/KeyVault/VaultPermissions.js +0 -226
  173. package/VNet/FirewallRules/types.d.ts +0 -20
  174. package/VNet/FirewallRules/types.js +0 -5
  175. package/VNet/NSGRules/AzADService.d.ts +0 -10
  176. package/VNet/NSGRules/AzADService.js +0 -45
package/VNet/Vnet.js CHANGED
@@ -3,21 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const network = require("@pulumi/azure-native/network");
4
4
  const Helper_1 = require("./Helper");
5
5
  const Naming_1 = require("../Common/Naming");
6
- const Bastion_1 = require("./Bastion");
7
6
  const Subnet_1 = require("./Subnet");
8
- exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServers, features = {}, }) => {
7
+ const SecurityGroup_1 = require("./SecurityGroup");
8
+ const RouteTable_1 = require("./RouteTable");
9
+ const AppGatewaySecurityRule_1 = require("./NSGRules/AppGatewaySecurityRule");
10
+ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], natGateway, dnsServers, features = {}, dependsOn, }) => {
9
11
  const vName = (0, Naming_1.getVnetName)(name);
10
- const securityRules = features.securityGroup?.rules ||
11
- new Array();
12
+ const securityRules = features.securityGroup?.rules || [];
12
13
  //AppGateway
13
14
  if (features.appGatewaySubnet) {
14
15
  subnets.push({
15
16
  name: Helper_1.appGatewaySubnetName,
16
17
  addressPrefix: features.appGatewaySubnet.addressPrefix,
17
18
  allowedServiceEndpoints: false,
19
+ enableSecurityGroup: false,
20
+ enableRouteTable: false,
21
+ });
22
+ //TODO: Move this to vnetBuilder instead. Add Security Rules for App Gateway
23
+ securityRules.push(...(0, AppGatewaySecurityRule_1.default)(features.appGatewaySubnet));
24
+ }
25
+ //Gateway Subnet
26
+ if (features?.gatewaySubnet) {
27
+ subnets.push({
28
+ name: Helper_1.gatewaySubnetName,
29
+ addressPrefix: features.gatewaySubnet.addressPrefix,
30
+ allowedServiceEndpoints: false,
31
+ enableSecurityGroup: false,
32
+ enableRouteTable: false,
18
33
  });
19
- //Add Security Rules for App Gateway
20
- securityRules.push(...getAppGatewayRules(features.appGatewaySubnet));
21
34
  }
22
35
  //Bastion Host
23
36
  if (features.bastion) {
@@ -25,17 +38,8 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
25
38
  name: Helper_1.azBastionSubnetName,
26
39
  addressPrefix: features.bastion.addressPrefix,
27
40
  allowedServiceEndpoints: false,
28
- });
29
- securityRules.push({
30
- name: 'allow-internet-bastion',
31
- sourceAddressPrefix: '*',
32
- sourcePortRange: '*',
33
- destinationAddressPrefix: features.bastion.addressPrefix,
34
- destinationPortRange: '443',
35
- protocol: 'TCP',
36
- access: 'Allow',
37
- direction: 'Inbound',
38
- priority: 3000,
41
+ enableSecurityGroup: true,
42
+ enableRouteTable: false,
39
43
  });
40
44
  }
41
45
  //Firewall Subnet
@@ -44,43 +48,52 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
44
48
  name: Helper_1.azFirewallSubnet,
45
49
  addressPrefix: features.firewall.addressPrefix,
46
50
  allowedServiceEndpoints: false,
51
+ enableSecurityGroup: false,
52
+ enableRouteTable: true,
53
+ enableNatGateway: features.firewall.enableNatGateway,
47
54
  });
48
55
  if (features.firewall.managementAddressPrefix)
49
56
  subnets.push({
50
57
  name: Helper_1.azFirewallManagementSubnet,
51
58
  addressPrefix: features.firewall.managementAddressPrefix,
52
59
  allowedServiceEndpoints: false,
60
+ enableSecurityGroup: false,
61
+ enableNatGateway: false,
62
+ enableRouteTable: false,
53
63
  });
54
64
  }
55
65
  //NetworkSecurityGroup
56
66
  let securityGroup = undefined;
57
- if (features.securityGroup) {
67
+ if (features.securityGroup?.enabled) {
58
68
  //Allow outbound internet
59
69
  if (!features.securityGroup.allowOutboundInternetAccess) {
60
70
  securityRules.push({
61
- name: 'deny-internet',
62
- sourceAddressPrefix: '*',
63
- sourcePortRange: '*',
64
- destinationAddressPrefix: 'Internet',
65
- destinationPortRange: '*',
66
- protocol: '*',
67
- access: 'Deny',
68
- direction: 'Outbound',
71
+ name: "DefaultDeniedInternetOutbound",
72
+ sourceAddressPrefix: "*",
73
+ sourcePortRange: "*",
74
+ destinationAddressPrefix: "Internet",
75
+ destinationPortRange: "*",
76
+ protocol: "*",
77
+ access: "Deny",
78
+ direction: "Outbound",
69
79
  priority: 4096, //The last rule in the list;
70
80
  });
71
81
  }
72
- securityGroup = new network.NetworkSecurityGroup(`${vName}-sg`, {
73
- networkSecurityGroupName: `${vName}-sg`,
74
- ...group,
82
+ securityGroup = (0, SecurityGroup_1.default)({
83
+ name: vName,
84
+ group,
75
85
  securityRules,
76
86
  });
77
87
  }
78
88
  //Route Table
79
- const routeTable = new network.RouteTable(`${vName}-route`, {
80
- routeTableName: `${vName}-route`,
81
- ...group,
82
- routes: features.routeTable?.rules || [],
83
- });
89
+ const routeRules = features.routeTable?.rules || [];
90
+ const routeTable = features.routeTable?.enabled
91
+ ? (0, RouteTable_1.default)({
92
+ name: vName,
93
+ group,
94
+ routes: routeRules,
95
+ })
96
+ : undefined;
84
97
  //Create VNet
85
98
  const vnet = new network.VirtualNetwork(vName, {
86
99
  virtualNetworkName: vName,
@@ -94,101 +107,25 @@ exports.default = ({ name, group, ddosId, addressSpaces, subnets = [], dnsServer
94
107
  subnet: s,
95
108
  vnetName: name,
96
109
  group,
97
- securityGroup: s.enableSecurityGroup === false ||
98
- [Helper_1.azFirewallSubnet, Helper_1.azBastionSubnetName, Helper_1.gatewaySubnetName].includes(s.name)
99
- ? undefined
100
- : securityGroup,
101
- routeTable: [
102
- Helper_1.azBastionSubnetName,
103
- Helper_1.azFirewallSubnet,
104
- Helper_1.gatewaySubnetName,
105
- ].includes(s.name)
106
- ? undefined
107
- : routeTable,
110
+ natGateway: s.enableNatGateway ? natGateway : undefined,
111
+ securityGroup: s.enableSecurityGroup === false ? undefined : securityGroup,
112
+ routeTable: s.enableRouteTable === false ? undefined : routeTable,
108
113
  })),
109
114
  enableDdosProtection: ddosId !== undefined,
110
115
  ddosProtectionPlan: ddosId ? { id: ddosId } : undefined,
111
- });
112
- const subnetResults = {};
116
+ }, { dependsOn, ignoreChanges: ["virtualNetworkPeerings"] });
113
117
  const findSubnet = (name) => vnet.subnets.apply((ss) => ss.find((s) => s.name === name));
114
- subnets?.forEach((s) => {
115
- subnetResults[s.name] = findSubnet(s.name).apply((s) => s);
116
- });
117
- const bastionSubnet = subnetResults[Helper_1.azBastionSubnetName];
118
- //Create Bastion
119
- if (features.bastion && !features.bastion.disableBastionHostCreation) {
120
- (0, Bastion_1.default)({
121
- name,
122
- group,
123
- subnetId: bastionSubnet.apply((s) => s.id),
124
- dependsOn: [vnet],
125
- });
126
- }
127
118
  //Return the results
128
119
  return {
129
120
  vnet,
130
- firewallSubnet: subnetResults[Helper_1.azFirewallSubnet],
131
- firewallManageSubnet: subnetResults[Helper_1.azFirewallManagementSubnet],
132
- appGatewaySubnet: subnetResults[Helper_1.appGatewaySubnetName],
133
- bastionSubnet,
134
- subnets: subnetResults,
135
121
  securityGroup,
136
122
  routeTable,
123
+ findSubnet,
124
+ firewallSubnet: findSubnet(Helper_1.azFirewallSubnet),
125
+ firewallManageSubnet: findSubnet(Helper_1.azFirewallManagementSubnet),
126
+ appGatewaySubnet: findSubnet(Helper_1.appGatewaySubnetName),
127
+ gatewaySubnet: findSubnet(Helper_1.gatewaySubnetName),
128
+ bastionSubnet: findSubnet(Helper_1.azBastionSubnetName),
137
129
  };
138
130
  };
139
- const getAppGatewayRules = ({ addressPrefix, version, }) => {
140
- let start = 100;
141
- return [
142
- //Add inbound rule for app gateway subnet
143
- {
144
- name: 'allow_internet_in_gateway_health',
145
- description: 'Allow Health check access from internet to Gateway',
146
- priority: 200 + start++,
147
- protocol: 'Tcp',
148
- access: 'Allow',
149
- direction: 'Inbound',
150
- sourceAddressPrefix: 'Internet',
151
- sourcePortRange: '*',
152
- destinationAddressPrefix: addressPrefix,
153
- destinationPortRanges: version === 'v1' ? ['65503-65534'] : ['65200-65535'],
154
- },
155
- {
156
- name: 'allow_https_internet_in_gateway',
157
- description: 'Allow HTTPS access from internet to Gateway',
158
- priority: 200 + start++,
159
- protocol: 'Tcp',
160
- access: 'Allow',
161
- direction: 'Inbound',
162
- sourceAddressPrefix: 'Internet',
163
- sourcePortRange: '*',
164
- destinationAddressPrefix: addressPrefix,
165
- destinationPortRange: '443',
166
- },
167
- {
168
- name: 'allow_loadbalancer_in_gateway',
169
- description: 'Allow Load balancer to Gateway',
170
- priority: 200 + start++,
171
- protocol: 'Tcp',
172
- access: 'Allow',
173
- direction: 'Inbound',
174
- sourceAddressPrefix: 'AzureLoadBalancer',
175
- sourcePortRange: '*',
176
- destinationAddressPrefix: addressPrefix,
177
- destinationPortRange: '*',
178
- },
179
- //Denied others
180
- // {
181
- // name: 'denied_others_in_gateway',
182
- // description: 'Denied others to Gateway',
183
- // priority: 3000 + start++,
184
- // protocol: 'Tcp',
185
- // access: 'Deny',
186
- // direction: 'Inbound',
187
- // sourceAddressPrefix: '*',
188
- // sourcePortRange: '*',
189
- // destinationAddressPrefix: addressPrefix,
190
- // destinationPortRange: '*',
191
- // },
192
- ];
193
- };
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm5ldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WTmV0L1ZuZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3REFBd0Q7QUFLeEQscUNBTWtCO0FBQ2xCLDZDQUErQztBQUMvQyx1Q0FBZ0M7QUFDaEMscUNBQXFEO0FBZ0RyRCxrQkFBZSxDQUFDLEVBQ2QsSUFBSSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sYUFBYSxFQUNiLE9BQU8sR0FBRyxFQUFFLEVBQ1osVUFBVSxFQUNWLFFBQVEsR0FBRyxFQUFFLEdBQ0gsRUFBRSxFQUFFO0lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBVyxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUNqQixRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUs7UUFDN0IsSUFBSSxLQUFLLEVBQWlELENBQUM7SUFFN0QsWUFBWTtJQUNaLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSw2QkFBb0I7WUFDMUIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO1lBQ3RELHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxjQUFjO0lBQ2QsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSw0QkFBbUI7WUFDekIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUM3Qyx1QkFBdUIsRUFBRSxLQUFLO1NBQy9CLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDakIs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
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm5ldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WTmV0L1ZuZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3REFBd0Q7QUFLeEQscUNBTWtCO0FBQ2xCLDZDQUErQztBQUMvQyxxQ0FBcUQ7QUFDckQsbURBQTRDO0FBQzVDLDZDQUFzQztBQUN0Qyw4RUFBdUU7QUF3RXZFLGtCQUFlLENBQUMsRUFDZCxJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sRUFDTixhQUFhLEVBQ2IsT0FBTyxHQUFHLEVBQUUsRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFFBQVEsR0FBRyxFQUFFLEVBQ2IsU0FBUyxHQUNDLEVBQWMsRUFBRTtJQUMxQixNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFXLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBRTFELFlBQVk7SUFDWixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDWCxJQUFJLEVBQUUsNkJBQW9CO1lBQzFCLGFBQWEsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtZQUN0RCx1QkFBdUIsRUFBRSxLQUFLO1lBQzlCLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsZ0NBQXNCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQUksUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDWCxJQUFJLEVBQUUsMEJBQWlCO1lBQ3ZCLGFBQWEsRUFBRSxRQUFRLENB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
package/VNet/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import * as network from '@pulumi/azure-native/network';
2
- import { input as inputs } from '@pulumi/azure-native/types';
3
- import { Input } from '@pulumi/pulumi';
4
- import * as pulumi from '@pulumi/pulumi';
5
- import { BasicMonitorArgs, ResourceGroupInfo } from '../types';
6
- import { FirewallSkus } from './Firewall';
7
- import { FirewallPolicyProps } from './FirewallRules/types';
8
- import { SubnetProps } from './Subnet';
1
+ import * as network from "@pulumi/azure-native/network";
2
+ import { Input } from "@pulumi/pulumi";
3
+ import * as pulumi from "@pulumi/pulumi";
4
+ import { BasicMonitorArgs, ResourceGroupInfo } from "../types";
5
+ import { CustomSecurityRuleArgs } from "./types";
6
+ import { FirewallSkus } from "./Firewall";
7
+ import { FirewallPolicyProps } from "./types";
8
+ import { SubnetProps } from "./Subnet";
9
9
  interface Props {
10
10
  name: string;
11
11
  group: ResourceGroupInfo;
@@ -17,7 +17,6 @@ interface Props {
17
17
  features?: {
18
18
  enableBastion?: {
19
19
  subnetPrefix: string;
20
- disableBastionHostCreation?: boolean;
21
20
  };
22
21
  enableAppGateway?: {
23
22
  subnetPrefix: string;
@@ -27,8 +26,7 @@ interface Props {
27
26
  /** Only required if Firewall is Basic tier */
28
27
  managementSubnetPrefix?: string;
29
28
  sku?: FirewallSkus;
30
- publicManageIpAddress?: network.PublicIPAddress;
31
- policy: Omit<FirewallPolicyProps, 'enabled'>;
29
+ policy: Omit<FirewallPolicyProps, "enabled">;
32
30
  /** set this is TRUE if want to create firewall subnet but not create firewall component */
33
31
  disabledFirewallCreation?: boolean;
34
32
  };
@@ -42,7 +40,7 @@ interface Props {
42
40
  allowInboundInternetAccess?: boolean;
43
41
  /**Add Security rule to block/allow internet if it is TRUE*/
44
42
  allowOutboundInternetAccess?: boolean;
45
- rules?: Input<inputs.network.SecurityRuleArgs>[];
43
+ rules?: Input<CustomSecurityRuleArgs>[];
46
44
  };
47
45
  };
48
46
  monitorConfig?: BasicMonitorArgs;
@@ -53,13 +51,14 @@ declare const _default: ({ group, name, ddosId, addressSpace, publicIpAddress, s
53
51
  policy: network.FirewallPolicy | undefined;
54
52
  } | undefined;
55
53
  vnet: import("@pulumi/azure-native/network/virtualNetwork").VirtualNetwork;
56
- firewallSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse> & pulumi.LiftedObject<import("@pulumi/azure-native/types/output").network.SubnetResponse, "type" | "id" | "name" | "etag" | "provisioningState" | "addressPrefix" | "ipConfigurations" | "addressPrefixes" | "purpose" | "serviceEndpoints" | "networkSecurityGroup" | "natGateway" | "applicationGatewayIPConfigurations" | "delegations" | "ipAllocations" | "ipConfigurationProfiles" | "privateEndpointNetworkPolicies" | "privateEndpoints" | "privateLinkServiceNetworkPolicies" | "resourceNavigationLinks" | "routeTable" | "serviceAssociationLinks" | "serviceEndpointPolicies" | "interfaceEndpoints" | undefined>;
57
- firewallManageSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse> & pulumi.LiftedObject<import("@pulumi/azure-native/types/output").network.SubnetResponse, "type" | "id" | "name" | "etag" | "provisioningState" | "addressPrefix" | "ipConfigurations" | "addressPrefixes" | "purpose" | "serviceEndpoints" | "networkSecurityGroup" | "natGateway" | "applicationGatewayIPConfigurations" | "delegations" | "ipAllocations" | "ipConfigurationProfiles" | "privateEndpointNetworkPolicies" | "privateEndpoints" | "privateLinkServiceNetworkPolicies" | "resourceNavigationLinks" | "routeTable" | "serviceAssociationLinks" | "serviceEndpointPolicies" | "interfaceEndpoints" | undefined>;
58
- appGatewaySubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse> & pulumi.LiftedObject<import("@pulumi/azure-native/types/output").network.SubnetResponse, "type" | "id" | "name" | "etag" | "provisioningState" | "addressPrefix" | "ipConfigurations" | "addressPrefixes" | "purpose" | "serviceEndpoints" | "networkSecurityGroup" | "natGateway" | "applicationGatewayIPConfigurations" | "delegations" | "ipAllocations" | "ipConfigurationProfiles" | "privateEndpointNetworkPolicies" | "privateEndpoints" | "privateLinkServiceNetworkPolicies" | "resourceNavigationLinks" | "routeTable" | "serviceAssociationLinks" | "serviceEndpointPolicies" | "interfaceEndpoints" | undefined>;
59
- bastionSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse> & pulumi.LiftedObject<import("@pulumi/azure-native/types/output").network.SubnetResponse, "type" | "id" | "name" | "etag" | "provisioningState" | "addressPrefix" | "ipConfigurations" | "addressPrefixes" | "purpose" | "serviceEndpoints" | "networkSecurityGroup" | "natGateway" | "applicationGatewayIPConfigurations" | "delegations" | "ipAllocations" | "ipConfigurationProfiles" | "privateEndpointNetworkPolicies" | "privateEndpoints" | "privateLinkServiceNetworkPolicies" | "resourceNavigationLinks" | "routeTable" | "serviceAssociationLinks" | "serviceEndpointPolicies" | "interfaceEndpoints" | undefined>;
60
- subnets: Record<string, pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse> & pulumi.LiftedObject<import("@pulumi/azure-native/types/output").network.SubnetResponse, "type" | "id" | "name" | "etag" | "provisioningState" | "addressPrefix" | "ipConfigurations" | "addressPrefixes" | "purpose" | "serviceEndpoints" | "networkSecurityGroup" | "natGateway" | "applicationGatewayIPConfigurations" | "delegations" | "ipAllocations" | "ipConfigurationProfiles" | "privateEndpointNetworkPolicies" | "privateEndpoints" | "privateLinkServiceNetworkPolicies" | "resourceNavigationLinks" | "routeTable" | "serviceAssociationLinks" | "serviceEndpointPolicies" | "interfaceEndpoints" | undefined>>;
54
+ appGatewaySubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
55
+ gatewaySubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
56
+ firewallManageSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
57
+ routeTable?: import("@pulumi/azure-native/network/routeTable").RouteTable | undefined;
58
+ firewallSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
59
+ bastionSubnet: pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
60
+ findSubnet: (name: string) => pulumi.OutputInstance<import("@pulumi/azure-native/types/output").network.SubnetResponse | undefined>;
61
61
  securityGroup: import("@pulumi/azure-native/network/networkSecurityGroup").NetworkSecurityGroup | undefined;
62
- routeTable: import("@pulumi/azure-native/network/routeTable").RouteTable;
63
62
  publicIpAddress: import("@pulumi/azure-native/network/publicIPAddress").PublicIPAddress | undefined;
64
63
  };
65
64
  export default _default;
package/VNet/index.js CHANGED
@@ -1,15 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const network = require("@pulumi/azure-native/network");
4
- const pulumi_1 = require("@pulumi/pulumi");
5
- const AzureEnv_1 = require("../Common/AzureEnv");
6
4
  const NetworkRuote_1 = require("@drunk-pulumi/azure-providers/NetworkRuote");
7
5
  const Firewall_1 = require("./Firewall");
8
6
  const NetworkPeering_1 = require("./NetworkPeering");
9
7
  const Vnet_1 = require("./Vnet");
8
+ const Helper_1 = require("./Helper");
10
9
  exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets, features = {}, monitorConfig, ...others }) => {
11
- const securities = features.securityGroup?.rules ||
12
- new Array();
10
+ const securities = features.securityGroup?.rules || [];
13
11
  const routes = new Array();
14
12
  if (publicIpAddress) {
15
13
  //Add route from IpAddress to internet
@@ -22,14 +20,14 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
22
20
  } //Allow Internet to public IpAddress security group
23
21
  else if (features.securityGroup?.allowInboundInternetAccess)
24
22
  securities.push({
25
- name: 'allow-inbound-internet-publicIpAddress',
26
- sourceAddressPrefix: '*',
27
- sourcePortRange: '*',
23
+ name: "allow-inbound-internet-publicIpAddress",
24
+ sourceAddressPrefix: "*",
25
+ sourcePortRange: "*",
28
26
  destinationAddressPrefix: publicIpAddress.ipAddress.apply((i) => `${i}/32`),
29
- destinationPortRanges: ['443', '80'],
30
- protocol: 'TCP',
31
- access: 'Allow',
32
- direction: 'Inbound',
27
+ destinationPortRanges: ["443", "80"],
28
+ protocol: "TCP",
29
+ access: "Allow",
30
+ direction: "Inbound",
33
31
  priority: 200 + securities.length + 1,
34
32
  });
35
33
  }
@@ -41,32 +39,32 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
41
39
  //Update route to firewall IpAddress
42
40
  routes.push({
43
41
  name: `vnet-to-firewall`,
44
- addressPrefix: '0.0.0.0/0',
42
+ addressPrefix: "0.0.0.0/0",
45
43
  nextHopType: network.RouteNextHopType.VirtualAppliance,
46
44
  nextHopIpAddress: pp.firewallPrivateIpAddress,
47
45
  });
48
46
  //Allow Vnet to Firewall
49
47
  securities.push({
50
48
  name: `allow-vnet-to-firewall`,
51
- sourceAddressPrefix: '*',
52
- sourcePortRange: '*',
49
+ sourceAddressPrefix: "*",
50
+ sourcePortRange: "*",
53
51
  destinationAddressPrefix: pp.firewallPrivateIpAddress,
54
- destinationPortRange: '*',
55
- protocol: '*',
56
- access: 'Allow',
57
- direction: 'Outbound',
52
+ destinationPortRange: "*",
53
+ protocol: "*",
54
+ access: "Allow",
55
+ direction: "Outbound",
58
56
  priority: 100,
59
57
  });
60
58
  }
61
59
  securities.push({
62
60
  name: `allow-vnet-to-vnet-${index}`,
63
- sourceAddressPrefix: 'VirtualNetwork',
64
- sourcePortRange: '*',
65
- destinationAddressPrefix: 'VirtualNetwork',
66
- destinationPortRange: '*',
67
- protocol: '*',
68
- access: 'Allow',
69
- direction: 'Outbound',
61
+ sourceAddressPrefix: "VirtualNetwork",
62
+ sourcePortRange: "*",
63
+ destinationAddressPrefix: "VirtualNetwork",
64
+ destinationPortRange: "*",
65
+ protocol: "*",
66
+ access: "Allow",
67
+ direction: "Outbound",
70
68
  priority: 101,
71
69
  });
72
70
  });
@@ -89,7 +87,7 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
89
87
  appGatewaySubnet: features.enableAppGateway
90
88
  ? {
91
89
  addressPrefix: features.enableAppGateway.subnetPrefix,
92
- version: 'v1',
90
+ version: "v1",
93
91
  }
94
92
  : undefined,
95
93
  firewall: features.enableFirewall
@@ -101,7 +99,6 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
101
99
  bastion: features.enableBastion
102
100
  ? {
103
101
  addressPrefix: features.enableBastion.subnetPrefix,
104
- disableBastionHostCreation: features.enableBastion.disableBastionHostCreation,
105
102
  }
106
103
  : undefined,
107
104
  },
@@ -115,53 +112,43 @@ exports.default = ({ group, name, ddosId, addressSpace, publicIpAddress, subnets
115
112
  name,
116
113
  group,
117
114
  policy: {
118
- enabled: true,
119
115
  ...features.enableFirewall.policy,
120
116
  },
121
117
  outbound: [
122
118
  {
123
- name: `${name}-outbound`,
124
119
  publicIpAddress: publicIpAddress,
125
120
  subnetId: vnet.firewallSubnet.apply((c) => c.id),
126
121
  },
127
122
  ],
128
- management: features.enableFirewall.publicManageIpAddress
123
+ management: features?.enableFirewall.managementSubnetPrefix
129
124
  ? {
130
- name: `${name}-management`,
131
- publicIpAddress: features.enableFirewall.publicManageIpAddress,
132
125
  subnetId: vnet.firewallManageSubnet.apply((c) => c.id),
133
126
  }
134
127
  : undefined,
135
128
  sku: features.enableFirewall.sku,
136
- routeTableName: vnet.routeTable.name,
129
+ routeTableName: vnet.routeTable?.name,
137
130
  monitorConfig,
138
- dependsOn: [vnet.routeTable, vnet.vnet],
131
+ dependsOn: [vnet.vnet],
139
132
  });
140
133
  }
141
134
  //Vnet Peering
142
135
  if (features.vnetPeering) {
143
136
  features.vnetPeering.map((pp) => {
144
- //get info
145
- (0, pulumi_1.output)(pp.vnetId).apply((id) => {
146
- const info = (0, AzureEnv_1.getResourceInfoFromId)(id);
147
- if (info) {
148
- //peering
149
- (0, NetworkPeering_1.default)({
150
- name,
151
- firstVNetName: vnet.vnet.name,
152
- firstVNetResourceGroupName: group.resourceGroupName,
153
- secondVNetName: info.name,
154
- secondVNetResourceGroupName: info.group.resourceGroupName,
155
- });
156
- }
137
+ const info = (0, Helper_1.parseVnetInfoFromId)(pp.vnetId);
138
+ (0, NetworkPeering_1.default)({
139
+ firstVnet: {
140
+ vnetName: vnet.vnet.name,
141
+ resourceGroupName: group.resourceGroupName,
142
+ },
143
+ secondVnet: info,
157
144
  });
158
145
  //Update route to firewall IpAddress
159
- if (pp.firewallPrivateIpAddress) {
146
+ if (pp.firewallPrivateIpAddress && vnet.routeTable) {
160
147
  new NetworkRuote_1.NetworkRouteResource(`${name}-vnet-to-firewall`, {
161
- routeName: 'vnet-to-firewall',
148
+ routeName: "vnet-to-firewall",
162
149
  ...group,
163
150
  routeTableName: vnet.routeTable.name,
164
- addressPrefix: '0.0.0.0/0',
151
+ addressPrefix: "0.0.0.0/0",
165
152
  nextHopType: network.RouteNextHopType.VirtualAppliance,
166
153
  nextHopIpAddress: pp.firewallPrivateIpAddress,
167
154
  }, {
@@ -186,13 +173,13 @@ const createFirewall = ({ name, group, routeTableName, dependsOn = [], ...others
186
173
  routeName: `vnet-to-firewall`,
187
174
  ...group,
188
175
  routeTableName: routeTableName,
189
- addressPrefix: '0.0.0.0/0',
176
+ addressPrefix: "0.0.0.0/0",
190
177
  nextHopType: network.RouteNextHopType.VirtualAppliance,
191
- nextHopIpAddress: rs.firewall.ipConfigurations.apply((c) => c ? c[0].privateIPAddress : ''),
178
+ nextHopIpAddress: rs.firewall.ipConfigurations.apply((c) => c ? c[0].privateIPAddress : ""),
192
179
  }, {
193
- dependsOn: [...dependsOn, rs.firewall],
180
+ dependsOn: [rs.firewall],
194
181
  });
195
182
  }
196
183
  return rs;
197
184
  };
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVk5ldC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdEQUF3RDtBQUV4RCwyQ0FBeUQ7QUFHekQsaURBQTJEO0FBQzNELDZFQUFrRjtBQU9sRix5Q0FBc0U7QUFFdEUscURBQTJDO0FBRTNDLGlDQUEwQjtBQWtEMUIsa0JBQWUsQ0FBQyxFQUNkLEtBQUssRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBQ2YsT0FBTyxFQUNQLFFBQVEsR0FBRyxFQUFFLEVBQ2IsYUFBYSxFQUNiLEdBQUcsTUFBTSxFQUNILEVBQUUsRUFBRTtJQUNWLE1BQU0sVUFBVSxHQUNkLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSztRQUM3QixJQUFJLEtBQUssRUFBMEMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBbUMsQ0FBQztJQUU1RCxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLHNDQUFzQztRQUN0QyxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxzQkFBc0I7Z0JBQzVCLGFBQWEsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDaEUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxtREFBbUQ7YUFDaEQsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLDBCQUEwQjtZQUN6RCxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNkLElBQUksRUFBRSx3Q0FBd0M7Z0JBQzlDLG1CQUFtQixFQUFFLEdBQUc7Z0JBQ3hCLGVBQWUsRUFBRSxHQUFHO2dCQUNwQix3QkFBd0IsRUFB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
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVk5ldC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdEQUF3RDtBQUl4RCw2RUFBa0Y7QUFHbEYseUNBQW1FO0FBRW5FLHFEQUEyQztBQUUzQyxpQ0FBMEI7QUFDMUIscUNBQStDO0FBK0MvQyxrQkFBZSxDQUFDLEVBQ2QsS0FBSyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sWUFBWSxFQUNaLGVBQWUsRUFDZixPQUFPLEVBQ1AsUUFBUSxHQUFHLEVBQUUsRUFDYixhQUFhLEVBQ2IsR0FBRyxNQUFNLEVBQ0gsRUFBRSxFQUFFO0lBQ1YsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFtQyxDQUFDO0lBRTVELElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsc0NBQXNDO1FBQ3RDLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLHNCQUFzQjtnQkFDNUIsYUFBYSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxXQUFXLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVE7YUFDL0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLG1EQUFtRDthQUNoRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCO1lBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLHdDQUF3QztnQkFDOUMsbUJBQW1CLEVBQUUsR0FBRztnQkFDeEIsZUFBZSxFQUFFLEdBQUc7Z0JBQ3BCLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FB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