@theerapat-s28/ts-structural-eng-tools 2.2.0 → 3.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.
Files changed (120) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/README.md +8 -5
  3. package/dist/core/constants/frame.constant.d.ts +15 -0
  4. package/dist/core/constants/frame.constant.js +16 -1
  5. package/dist/core/constants/frame.constant.js.map +1 -1
  6. package/dist/core/errors/frame-analysis.error.d.ts +1 -0
  7. package/dist/core/errors/frame-analysis.error.js +18 -2
  8. package/dist/core/errors/frame-analysis.error.js.map +1 -1
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.js +2 -1
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/esm/core/constants/frame.constant.js +15 -0
  13. package/dist/esm/core/constants/frame.constant.js.map +1 -1
  14. package/dist/esm/core/errors/frame-analysis.error.js +18 -2
  15. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
  16. package/dist/esm/core/index.js +1 -1
  17. package/dist/esm/core/index.js.map +1 -1
  18. package/dist/esm/fea/frame/area/distribute-area-loads.js +10 -5
  19. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -1
  20. package/dist/esm/fea/frame/elements/shell/dkq-plate.js +109 -0
  21. package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  22. package/dist/esm/fea/frame/elements/shell/flat-shell.js +111 -0
  23. package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +1 -0
  24. package/dist/esm/fea/frame/elements/shell/membrane-quad.js +107 -0
  25. package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  26. package/dist/esm/fea/frame/elements/shell/quad-geometry.js +127 -0
  27. package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  28. package/dist/esm/fea/frame/elements/shell/rigidity.js +19 -0
  29. package/dist/esm/fea/frame/elements/shell/rigidity.js.map +1 -0
  30. package/dist/esm/fea/frame/elements/shell/shell-axes.js +97 -0
  31. package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +1 -0
  32. package/dist/esm/fea/frame/mesh/expand-model.js +129 -0
  33. package/dist/esm/fea/frame/mesh/expand-model.js.map +1 -0
  34. package/dist/esm/fea/frame/mesh/mesh-shells.js +239 -0
  35. package/dist/esm/fea/frame/mesh/mesh-shells.js.map +1 -0
  36. package/dist/esm/fea/frame/post/envelope.js +38 -1
  37. package/dist/esm/fea/frame/post/envelope.js.map +1 -1
  38. package/dist/esm/fea/frame/post/member-diagram.js +51 -2
  39. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
  40. package/dist/esm/fea/frame/post/present-state.js +34 -16
  41. package/dist/esm/fea/frame/post/present-state.js.map +1 -1
  42. package/dist/esm/fea/frame/post/shell-forces.js +111 -0
  43. package/dist/esm/fea/frame/post/shell-forces.js.map +1 -0
  44. package/dist/esm/fea/frame/solver/analyze-frame.js +27 -7
  45. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
  46. package/dist/esm/fea/frame/solver/auto-restraint.js +58 -10
  47. package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -1
  48. package/dist/esm/fea/frame/solver/frame-system.js +148 -40
  49. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
  50. package/dist/esm/fea/frame/solver/global-assembly.js +5 -3
  51. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -1
  52. package/dist/esm/fea/frame/solver/load-case-solver.js +111 -11
  53. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
  54. package/dist/esm/fea/frame/validation/validate-model.js +133 -3
  55. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
  56. package/dist/esm/index.js +1 -1
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/fea/frame/area/distribute-area-loads.d.ts +3 -2
  59. package/dist/fea/frame/area/distribute-area-loads.js +10 -5
  60. package/dist/fea/frame/area/distribute-area-loads.js.map +1 -1
  61. package/dist/fea/frame/elements/shell/dkq-plate.d.ts +50 -0
  62. package/dist/fea/frame/elements/shell/dkq-plate.js +115 -0
  63. package/dist/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  64. package/dist/fea/frame/elements/shell/flat-shell.d.ts +63 -0
  65. package/dist/fea/frame/elements/shell/flat-shell.js +118 -0
  66. package/dist/fea/frame/elements/shell/flat-shell.js.map +1 -0
  67. package/dist/fea/frame/elements/shell/membrane-quad.d.ts +61 -0
  68. package/dist/fea/frame/elements/shell/membrane-quad.js +113 -0
  69. package/dist/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  70. package/dist/fea/frame/elements/shell/quad-geometry.d.ts +71 -0
  71. package/dist/fea/frame/elements/shell/quad-geometry.js +136 -0
  72. package/dist/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  73. package/dist/fea/frame/elements/shell/rigidity.d.ts +14 -0
  74. package/dist/fea/frame/elements/shell/rigidity.js +23 -0
  75. package/dist/fea/frame/elements/shell/rigidity.js.map +1 -0
  76. package/dist/fea/frame/elements/shell/shell-axes.d.ts +43 -0
  77. package/dist/fea/frame/elements/shell/shell-axes.js +102 -0
  78. package/dist/fea/frame/elements/shell/shell-axes.js.map +1 -0
  79. package/dist/fea/frame/index.d.ts +2 -2
  80. package/dist/fea/frame/mesh/expand-model.d.ts +29 -0
  81. package/dist/fea/frame/mesh/expand-model.js +133 -0
  82. package/dist/fea/frame/mesh/expand-model.js.map +1 -0
  83. package/dist/fea/frame/mesh/mesh-shells.d.ts +38 -0
  84. package/dist/fea/frame/mesh/mesh-shells.js +244 -0
  85. package/dist/fea/frame/mesh/mesh-shells.js.map +1 -0
  86. package/dist/fea/frame/post/envelope.js +38 -1
  87. package/dist/fea/frame/post/envelope.js.map +1 -1
  88. package/dist/fea/frame/post/member-diagram.d.ts +21 -1
  89. package/dist/fea/frame/post/member-diagram.js +53 -3
  90. package/dist/fea/frame/post/member-diagram.js.map +1 -1
  91. package/dist/fea/frame/post/present-state.d.ts +3 -2
  92. package/dist/fea/frame/post/present-state.js +33 -15
  93. package/dist/fea/frame/post/present-state.js.map +1 -1
  94. package/dist/fea/frame/post/shell-forces.d.ts +27 -0
  95. package/dist/fea/frame/post/shell-forces.js +116 -0
  96. package/dist/fea/frame/post/shell-forces.js.map +1 -0
  97. package/dist/fea/frame/solver/analyze-frame.d.ts +8 -4
  98. package/dist/fea/frame/solver/analyze-frame.js +27 -7
  99. package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
  100. package/dist/fea/frame/solver/auto-restraint.d.ts +23 -10
  101. package/dist/fea/frame/solver/auto-restraint.js +60 -11
  102. package/dist/fea/frame/solver/auto-restraint.js.map +1 -1
  103. package/dist/fea/frame/solver/frame-system.d.ts +47 -8
  104. package/dist/fea/frame/solver/frame-system.js +146 -38
  105. package/dist/fea/frame/solver/frame-system.js.map +1 -1
  106. package/dist/fea/frame/solver/global-assembly.d.ts +11 -0
  107. package/dist/fea/frame/solver/global-assembly.js +7 -4
  108. package/dist/fea/frame/solver/global-assembly.js.map +1 -1
  109. package/dist/fea/frame/solver/load-case-solver.d.ts +11 -1
  110. package/dist/fea/frame/solver/load-case-solver.js +109 -9
  111. package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
  112. package/dist/fea/frame/types/model.type.d.ts +95 -3
  113. package/dist/fea/frame/types/results.type.d.ts +61 -1
  114. package/dist/fea/frame/validation/validate-model.d.ts +3 -2
  115. package/dist/fea/frame/validation/validate-model.js +133 -3
  116. package/dist/fea/frame/validation/validate-model.js.map +1 -1
  117. package/dist/index.d.ts +2 -2
  118. package/dist/index.js +3 -2
  119. package/dist/index.js.map +1 -1
  120. package/package.json +1 -1
@@ -6,6 +6,7 @@ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.erro
6
6
  const matrix_1 = require("../../../utils/matrix");
7
7
  const skyline_1 = require("../../../utils/skyline");
8
8
  const fixed_end_forces_1 = require("../elements/fixed-end-forces");
9
+ const shell_forces_1 = require("../post/shell-forces");
9
10
  const validate_model_1 = require("../validation/validate-model");
10
11
  const global_assembly_1 = require("./global-assembly");
11
12
  const GLOBAL_DIRECTIONS = {
@@ -31,6 +32,13 @@ const toLocalLoads = (load, lambda, L) => {
31
32
  // kN·m/m = 10³ N·mm/mm
32
33
  return [{ type: "torque", t: load.t * 1e3, start: load.start ?? 0, end: load.end ?? L }];
33
34
  }
35
+ // per projected length → per member length: Lproj / L = |local 1 × d| = √(1 − (local 1 · d)²)
36
+ let projection = 1;
37
+ if (load.type !== "point" && load.projected) {
38
+ const v = GLOBAL_DIRECTIONS[load.direction];
39
+ const c = lambda[0][0] * v[0] + lambda[0][1] * v[1] + lambda[0][2] * v[2];
40
+ projection = Math.sqrt(Math.max(0, 1 - c * c));
41
+ }
34
42
  return components(load.direction).map(({ axis, factor }) => {
35
43
  if (load.type === "point")
36
44
  return { type: "point", axis, P: load.P * factor * 1e3, a: load.a };
@@ -38,13 +46,48 @@ const toLocalLoads = (load, lambda, L) => {
38
46
  return {
39
47
  type: "distributed",
40
48
  axis,
41
- w1: w1 * factor, // kN/m = N/mm
42
- w2: w2 * factor,
49
+ w1: w1 * factor * projection, // kN/m = N/mm
50
+ w2: w2 * factor * projection,
43
51
  start: load.start ?? 0,
44
52
  end: load.end ?? L,
45
53
  };
46
54
  });
47
55
  };
56
+ /**
57
+ * The part of a member's local loads that falls on one of its pieces, `[offset, offset + L]`,
58
+ * in the piece's own positions. A distributed load or torque is cut at the piece ends; a point
59
+ * load goes to the piece it lies in (at an interior node, to the piece that starts there).
60
+ */
61
+ const clipLoads = (loads, offset, L, last) => {
62
+ const end = offset + L;
63
+ const tolerance = 1e-9 * end;
64
+ const out = [];
65
+ for (const load of loads) {
66
+ if (load.type === "point") {
67
+ const inside = load.a >= offset - tolerance && (load.a < end - tolerance || last);
68
+ if (inside)
69
+ out.push({ ...load, a: Math.min(L, Math.max(0, load.a - offset)) });
70
+ continue;
71
+ }
72
+ const from = Math.max(load.start, offset);
73
+ const to = Math.min(load.end, end);
74
+ if (to - from <= tolerance)
75
+ continue;
76
+ if (load.type === "torque") {
77
+ out.push({ ...load, start: from - offset, end: to - offset });
78
+ }
79
+ else {
80
+ out.push({
81
+ ...load,
82
+ w1: (0, fixed_end_forces_1.loadIntensity)(load, from),
83
+ w2: (0, fixed_end_forces_1.loadIntensity)(load, to),
84
+ start: from - offset,
85
+ end: to - offset,
86
+ });
87
+ }
88
+ }
89
+ return out;
90
+ };
48
91
  /**
49
92
  * Solves one load case against the prepared, factorised system.
50
93
  *
@@ -53,6 +96,14 @@ const toLocalLoads = (load, lambda, L) => {
53
96
  * @param loadCase - The load case (id and self-weight multiplier)
54
97
  * @param loads - The nodal and member loads tagged with this load case
55
98
  *
99
+ * Shell areas take `selfWeight · unitWeight · thickness · modifiers.weight` per unit area along
100
+ * −Z and their `AreaLoad`s as forces at their corners, each corner the share `∫ Nᵢ dA` of the
101
+ * element's area on its mean plane (no corner moments, so a warped element's offsets do not load
102
+ * the rotations auto-restraint holds).
103
+ *
104
+ * @param loads - The nodal and member loads tagged with this load case, and its area loads on
105
+ * shell areas
106
+ *
56
107
  * @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
57
108
  * resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
58
109
  * requested for a member without `unitWeight`
@@ -60,15 +111,18 @@ const toLocalLoads = (load, lambda, L) => {
60
111
  const solveLoadCase = (system, loadCase, loads) => {
61
112
  const { members, dofCount, boundary, equation, free, factor, nodeIndex, memberIndex } = system;
62
113
  const F = new Array(dofCount).fill(0);
63
- const loadsByMember = members.map(() => []);
114
+ const groups = system.memberGroups;
115
+ const loadsByMember = groups.map(() => []);
64
116
  for (const load of loads.memberLoads) {
65
117
  loadsByMember[memberIndex.get(load.memberId)].push(load);
66
118
  }
67
119
  const selfWeight = loadCase.selfWeight ?? 0;
68
- const memberLoads = members.map((member, m) => {
69
- const memberLoadsHere = [...loadsByMember[m]];
120
+ // local loads of each model member, then of each piece it is analysed as
121
+ const memberLoads = members.map(() => []);
122
+ groups.forEach((group, g) => {
123
+ const memberLoadsHere = [...loadsByMember[g]];
70
124
  if (selfWeight !== 0) {
71
- const { unitWeight, A } = member.section;
125
+ const { unitWeight, A } = group.section;
72
126
  if (unitWeight === undefined)
73
127
  throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.MISSING_UNIT_WEIGHT);
74
128
  // kN/m³ · m² = kN/m
@@ -77,19 +131,58 @@ const solveLoadCase = (system, loadCase, loads) => {
77
131
  memberLoadsHere.push({
78
132
  loadCase: loadCase.id,
79
133
  type: "udl",
80
- memberId: member.id,
134
+ memberId: group.id,
81
135
  direction: "Z",
82
136
  w,
83
137
  });
84
138
  }
85
139
  }
86
- return memberLoadsHere.flatMap((load) => toLocalLoads(load, member.lambda, member.length));
140
+ const local = memberLoadsHere.flatMap((load) => toLocalLoads(load, group.lambda, group.length));
141
+ if (group.pieces.length === 1) {
142
+ memberLoads[group.pieces[0]] = local;
143
+ return;
144
+ }
145
+ group.pieces.forEach((p, k) => {
146
+ const piece = members[p];
147
+ memberLoads[p] = clipLoads(local, piece.offset, piece.length, k === group.pieces.length - 1);
148
+ });
87
149
  });
88
150
  const fixed = members.map((member, m) => {
89
151
  const condensed = member.condenseFixedEndForces((0, fixed_end_forces_1.fixedEndForces)(memberLoads[m], member.length));
90
152
  (0, global_assembly_1.scatterMemberForces)(F, member, condensed, -1);
91
153
  return condensed;
92
154
  });
155
+ // Shell surface loads, kN/m² as a global vector per shell, then N at the corners
156
+ const shellPressure = system.shells.map(() => [0, 0, 0]);
157
+ for (const load of loads.shellLoads ?? []) {
158
+ // every element of the area
159
+ for (const s of system.shellsByArea.get(load.areaId) ?? []) {
160
+ const normal = system.shells[s].element.axes.lambda[2];
161
+ const e = load.direction === "3" ? normal : GLOBAL_DIRECTIONS[load.direction];
162
+ // per projected area → per true area: Aproj / A = |n · e|
163
+ const q = load.projected
164
+ ? load.q * Math.abs(normal[0] * e[0] + normal[1] * e[1] + normal[2] * e[2])
165
+ : load.q;
166
+ for (let k = 0; k < 3; k++)
167
+ shellPressure[s][k] += q * e[k];
168
+ }
169
+ }
170
+ system.shells.forEach((shell, s) => {
171
+ if (selfWeight !== 0) {
172
+ // kN/m³ · mm · 10⁻³ = kN/m²
173
+ const { unitWeight = 0, thickness } = shell.section;
174
+ shellPressure[s][2] -=
175
+ selfWeight * unitWeight * thickness * (shell.modifiers.weight ?? 1) * 1e-3;
176
+ }
177
+ const p = shellPressure[s];
178
+ if (p[0] === 0 && p[1] === 0 && p[2] === 0)
179
+ return;
180
+ shell.nodeIndices.forEach((node, i) => {
181
+ // kN/m² = 10⁻³ N/mm², times mm²
182
+ for (let k = 0; k < 3; k++)
183
+ F[6 * node + k] += p[k] * 1e-3 * shell.cornerAreas[i];
184
+ });
185
+ });
93
186
  for (const load of loads.nodalLoads) {
94
187
  const base = 6 * nodeIndex.get(load.nodeId);
95
188
  [load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
@@ -127,8 +220,14 @@ const solveLoadCase = (system, loadCase, loads) => {
127
220
  (0, global_assembly_1.scatterMemberForces)(KU, member, elastic, 1);
128
221
  return elastic.map((v, i) => v + fixed[m][i]);
129
222
  });
223
+ for (const shell of system.shells) {
224
+ const dofs = (0, global_assembly_1.elementDofs)(shell.nodeIndices);
225
+ const forces = (0, matrix_1.matVec)(shell.element.kGlobal, dofs.map((d) => U[d]));
226
+ dofs.forEach((d, a) => (KU[d] += forces[a]));
227
+ }
130
228
  const R = KU.map((v, i) => (boundary.restrained[i] ? v - F[i] : 0));
131
- return { U, R, F, memberForces, memberLoads };
229
+ const shellForces = system.shells.map((shell) => (0, shell_forces_1.shellRawForces)(shell, U));
230
+ return { U, R, F, memberForces, shellForces, memberLoads };
132
231
  };
133
232
  exports.solveLoadCase = solveLoadCase;
134
233
  const scaleLoad = (load, factor) => {
@@ -153,6 +252,7 @@ const combineStates = (terms) => {
153
252
  R: add((s) => s.R, first.R.length),
154
253
  F: add((s) => s.F, first.F.length),
155
254
  memberForces: first.memberForces.map((_, m) => add((s) => s.memberForces[m], 12)),
255
+ shellForces: first.shellForces.map((f, sh) => add((s) => s.shellForces[sh], f.length)),
156
256
  memberLoads: first.memberLoads.map((_, m) => terms.flatMap(({ state, factor }) => factor === 0 ? [] : state.memberLoads[m].map((l) => scaleLoad(l, factor)))),
157
257
  };
158
258
  };
@@ -1 +1 @@
1
- {"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/load-case-solver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/load-case-solver.ts"],"names":[],"mappings":";;;AAAA,uEAA2E;AAC3E,gFAAwF;AACxF,8CAAwD;AACxD,gDAAkD;AAElD,mEAAmG;AACnG,uDAAsD;AAEtD,iEAAuE;AAEvE,uDAAiF;AAejF,MAAM,iBAAiB,GAAsD;IAC3E,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CACb,CAAC;AAEF,gEAAgE;AAChE,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAE,MAAc,EAAE,CAAS,EAAqB,EAAE;IACtF,MAAM,UAAU,GAAG,CAAC,SAAwB,EAAyC,EAAE;QACrF,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YAChE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAc,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACvC,OAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAW;aACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,IAAI;YACJ,MAAM,EACJ,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACvF,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,uBAAuB;QACvB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,8FAA8F;IAC9F,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAA4B,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAmB,EAAE;QAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAC/F,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,IAAI;YACJ,EAAE,EAAE,EAAE,GAAG,MAAM,GAAG,UAAU,EAAE,cAAc;YAC5C,EAAE,EAAE,EAAE,GAAG,MAAM,GAAG,UAAU;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;YACtB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;SACnB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,SAAS,GAAG,CAChB,KAAwB,EACxB,MAAc,EACd,CAAS,EACT,IAAa,EACM,EAAE;IACrB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC;IAC7B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;YAClF,IAAI,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,EAAE,GAAG,IAAI,IAAI,SAAS;YAAE,SAAS;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,IAAI;gBACP,EAAE,EAAE,IAAA,gCAAa,EAAC,IAAI,EAAE,IAAI,CAAC;gBAC7B,EAAE,EAAE,IAAA,gCAAa,EAAC,IAAI,EAAE,EAAE,CAAC;gBAC3B,KAAK,EAAE,IAAI,GAAG,MAAM;gBACpB,GAAG,EAAE,EAAE,GAAG,MAAM;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACI,MAAM,aAAa,GAAG,CAC3B,MAAmB,EACnB,QAAkB,EAClB,KAAsF,EAC5E,EAAE;IACZ,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC/F,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;IACnC,MAAM,aAAa,GAAmB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;IAC5C,yEAAyE;IACzE,MAAM,WAAW,GAAwB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,eAAe,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;YACxC,IAAI,UAAU,KAAK,SAAS;gBAAE,MAAM,IAAI,yCAAkB,CAAC,kCAAW,CAAC,mBAAmB,CAAC,CAAC;YAC5F,oBAAoB;YACpB,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,eAAe,CAAC,IAAI,CAAC;oBACnB,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACrB,IAAI,EAAE,KAAK;oBACX,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,SAAS,EAAE,GAAG;oBACd,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAChG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACrC,OAAO;QACT,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAA,iCAAc,EAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/F,IAAA,qCAAmB,EAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,iFAAiF;IACjF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,4BAA4B;QAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9E,0DAA0D;YAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS;gBACtB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,4BAA4B;YAC5B,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;YACpD,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjB,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO;QACnD,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACpC,gCAAgC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,GAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAY,CAAC;QACxD,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/E,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,4FAA4F;IAC5F,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,sCAAqB,GAAG,WAAW,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7F,IAAA,4BAAW,EAAC;gBACV,IAAA,2BAAU,EAAC,kCAAW,CAAC,kBAAkB,EAAE;oBACzC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;oBAC7B,GAAG,EAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAW,CAAC,IAAI,CAAC;oBACxC,UAAU,EAAE,QAAQ,CAAC,EAAE;iBACxB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,IAAA,sBAAY,EAC3B,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAC1B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,qFAAqF;IACrF,MAAM,EAAE,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAA,eAAM,EACnB,MAAM,CAAC,CAAC,EACR,IAAA,4BAAU,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpC,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,IAAA,qCAAmB,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAA,6BAAW,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAA,eAAM,EACnB,KAAK,CAAC,OAAO,CAAC,OAAO,EACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,6BAAc,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAC7D,CAAC,CAAC;AA1IW,QAAA,aAAa,iBA0IxB;AAEF,MAAM,SAAS,GAAG,CAAC,IAAqB,EAAE,MAAc,EAAmB,EAAE;IAC3E,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IAChG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;IACnE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,6FAA6F;AACtF,MAAM,aAAa,GAAG,CAAC,KAA4C,EAAY,EAAE;IACtF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7B,MAAM,GAAG,GAAG,CAAC,IAA+B,EAAE,MAAc,EAAE,EAAE;QAC9D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,OAAO;QACL,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACtF,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAClC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAC1E,CACF;KACF,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,aAAa,iBAqBxB"}
@@ -8,6 +8,21 @@ export interface FrameNode {
8
8
  }
9
9
  /** A restrained DOF: `true` is fixed, a number is a spring stiffness, omitted/`false` is free. */
10
10
  export type DofRestraint = boolean | number;
11
+ /**
12
+ * Fixed DOFs along a straight line: every node on the segment between two nodes, including the
13
+ * nodes the engine generates when it meshes shell areas, e.g. a wall base fixed along its
14
+ * length. `true` fixes the DOF; there are no line springs. Combined with point restraints at
15
+ * the same node, a fixed DOF stays fixed.
16
+ */
17
+ export interface LineRestraint {
18
+ nodeIds: [FrameId, FrameId];
19
+ ux?: boolean;
20
+ uy?: boolean;
21
+ uz?: boolean;
22
+ rx?: boolean;
23
+ ry?: boolean;
24
+ rz?: boolean;
25
+ }
11
26
  export interface Restraint {
12
27
  nodeId: FrameId;
13
28
  ux?: DofRestraint;
@@ -55,7 +70,12 @@ export interface NodalLoad {
55
70
  }
56
71
  /** Load direction: local member axes "1", "2", "3" or global axes "X", "Y", "Z". */
57
72
  export type LoadDirection = "1" | "2" | "3" | "X" | "Y" | "Z";
58
- /** Uniform load per unit length of member, along the whole member or from `start` to `end`. */
73
+ /**
74
+ * Uniform load per unit length of member, along the whole member or from `start` to `end`.
75
+ * With `projected: true` (global directions only) `w` is per unit length projected onto the
76
+ * plane normal to `direction`, e.g. snow on a rafter per unit plan length; it is applied as
77
+ * `w · Lproj / L` per member length.
78
+ */
59
79
  export interface UniformMemberLoad {
60
80
  loadCase: string;
61
81
  type: "udl";
@@ -64,6 +84,7 @@ export interface UniformMemberLoad {
64
84
  w: number;
65
85
  start?: number;
66
86
  end?: number;
87
+ projected?: boolean;
67
88
  }
68
89
  export interface PointMemberLoad {
69
90
  loadCase: string;
@@ -75,7 +96,8 @@ export interface PointMemberLoad {
75
96
  }
76
97
  /**
77
98
  * Linearly varying load per unit length of member, from `w1` at `start` to `w2` at `end`
78
- * (triangular when one of them is 0).
99
+ * (triangular when one of them is 0). `projected` works as for a uniform load; `start` and
100
+ * `end` stay measured along the member.
79
101
  */
80
102
  export interface TrapezoidalMemberLoad {
81
103
  loadCase: string;
@@ -86,6 +108,7 @@ export interface TrapezoidalMemberLoad {
86
108
  w2: number;
87
109
  start?: number;
88
110
  end?: number;
111
+ projected?: boolean;
89
112
  }
90
113
  /**
91
114
  * Uniform torque per unit length of member, about local axis 1 (right-hand rule), along the
@@ -120,13 +143,77 @@ export interface NullArea {
120
143
  /** Edge indices that carry the load: one-way supports, or the one cantilever support. */
121
144
  supportEdges?: number[];
122
145
  }
146
+ /**
147
+ * How a shell area carries load: in its plane and in bending (`"shell"`), in its plane only
148
+ * (`"membrane"`: u1, u2 and the rotation about local 3), or in bending only (`"plate"`: u3 and
149
+ * the rotations about local 1 and 2).
150
+ */
151
+ export type ShellType = "shell" | "membrane" | "plate";
152
+ /** Material and thickness of a shell area. */
153
+ export interface ShellSection {
154
+ thickness: number;
155
+ E: number;
156
+ nu: number;
157
+ unitWeight?: number;
158
+ }
159
+ /**
160
+ * Stiffness modifiers of a shell area along its local axes 1 and 2 (default 1 each), e.g. for
161
+ * cracked walls and slabs: f11, f22, f12 scale the membrane rigidity and m11, m22, m12 the
162
+ * bending rigidity (each matrix becomes S·D·S, S = diag(√f11, √f22, √f12)); weight scales the
163
+ * self-weight only.
164
+ */
165
+ export interface ShellModifiers {
166
+ f11?: number;
167
+ f22?: number;
168
+ f12?: number;
169
+ m11?: number;
170
+ m22?: number;
171
+ m12?: number;
172
+ weight?: number;
173
+ }
174
+ /**
175
+ * How the engine meshes a shell area: `maxSize` (mm) is the largest element side wanted;
176
+ * `divisions` the least number of elements along edges 0–1 and 1–2 (from `nodeIds[0]` to
177
+ * `nodeIds[1]` and from `nodeIds[1]` to `nodeIds[2]`). Counts may grow so that areas sharing an
178
+ * edge, or meeting it at a node, share their mesh nodes.
179
+ */
180
+ export interface ShellMesh {
181
+ maxSize?: number;
182
+ divisions?: [number, number];
183
+ }
184
+ /**
185
+ * A four-node flat shell area: a drilling-rotation membrane and a thin (DKQ) plate, built on
186
+ * the mean plane of its corners. Without `mesh` it is one element, unless a neighbour's mesh or
187
+ * a node lying on its edge forces divisions. Local axis 3 is the normal by the
188
+ * right-hand rule around `nodeIds`; local 2 is +Z projected onto the plane (upward on a wall)
189
+ * and local 1 = 2 × 3 is horizontal, except on a horizontal shell, where local 1 = +X.
190
+ * `angle` rotates local 1 and 2 about local 3. Its id shares one namespace with null areas, so
191
+ * `AreaLoad` can load it.
192
+ */
193
+ export interface ShellArea {
194
+ id: FrameId;
195
+ nodeIds: FrameId[];
196
+ type?: ShellType;
197
+ section: ShellSection;
198
+ angle?: number;
199
+ modifiers?: ShellModifiers;
200
+ mesh?: ShellMesh;
201
+ }
123
202
  /** Area load direction: the area's local normal "3" or a global axis. */
124
203
  export type AreaLoadDirection = "3" | "X" | "Y" | "Z";
204
+ /**
205
+ * Uniform load on a null area or a shell area. `q` is per unit true area, or with
206
+ * `projected: true` (global directions only) per unit area projected onto the plane normal to
207
+ * `direction`, e.g. per plan area on a ramp; it is then applied as `q · |n · direction|` on
208
+ * the true area. A null area sends it to the members along its edges; a shell area takes it
209
+ * as forces at its corners, each corner the share `∫ Nᵢ dA` of its area.
210
+ */
125
211
  export interface AreaLoad {
126
212
  loadCase: string;
127
213
  areaId: FrameId;
128
214
  direction: AreaLoadDirection;
129
215
  q: number;
216
+ projected?: boolean;
130
217
  }
131
218
  /** Descriptive category of a load case; it labels the case and does not change the analysis. */
132
219
  export type LoadCaseType = "dead" | "superDead" | "live" | "roofLive" | "snow" | "wind" | "seismic" | "other";
@@ -141,7 +228,8 @@ export interface LoadCase {
141
228
  type?: LoadCaseType;
142
229
  /**
143
230
  * Self-weight multiplier (1 = full self-weight). Applies `selfWeight · unitWeight · A` per unit
144
- * length of every member along global −Z. Default 0.
231
+ * length of every member and `selfWeight · unitWeight · thickness` (times `modifiers.weight`)
232
+ * per unit area of every shell, along global −Z. Default 0.
145
233
  */
146
234
  selfWeight?: number;
147
235
  }
@@ -163,6 +251,8 @@ export interface FrameModel {
163
251
  nodes: FrameNode[];
164
252
  members: Member[];
165
253
  restraints: Restraint[];
254
+ /** Fixed DOFs of every node along straight lines, generated mesh nodes included. */
255
+ lineRestraints?: LineRestraint[];
166
256
  loadCases: LoadCase[];
167
257
  /** Nodal loads of every load case, each tagged with its `loadCase`. */
168
258
  nodalLoads?: NodalLoad[];
@@ -170,6 +260,8 @@ export interface FrameModel {
170
260
  memberLoads?: MemberLoad[];
171
261
  /** Null areas that distribute `areaLoads` to the members along their edges. */
172
262
  areas?: NullArea[];
263
+ /** Shell areas: four-node flat shell elements with membrane and/or plate stiffness. */
264
+ shells?: ShellArea[];
173
265
  /** Area loads of every load case, each tagged with its `loadCase`. */
174
266
  areaLoads?: AreaLoad[];
175
267
  combinations?: LoadCombination[];
@@ -1,5 +1,5 @@
1
1
  import type { Warnings } from "../../../core/types/output-message.type";
2
- import type { FrameId, LoadCaseType } from "./model.type";
2
+ import type { FrameId, FrameNode, LoadCaseType } from "./model.type";
3
3
  export interface NodalDisplacement {
4
4
  nodeId: FrameId;
5
5
  ux: number;
@@ -94,6 +94,52 @@ export interface MemberDiagram {
94
94
  min: ExtremeValue;
95
95
  }>;
96
96
  }
97
+ /**
98
+ * Forces per unit width and face stresses at one corner of a shell element, in the shell's
99
+ * local axes 1, 2, 3. Membrane forces are positive in tension. M11 (M22) is the moment that
100
+ * stresses along local 1 (2), positive when it puts the −3 face in tension (sagging with local
101
+ * 3 up), as M3 of a member; V13 = −(∂M11/∂x₁ + ∂M12/∂x₂), as V2 = −dM3/dx. Top is the +3 face.
102
+ */
103
+ export interface ShellCornerForces {
104
+ nodeId: FrameId;
105
+ F11: number;
106
+ F22: number;
107
+ F12: number;
108
+ M11: number;
109
+ M22: number;
110
+ M12: number;
111
+ V13: number;
112
+ V23: number;
113
+ S11Top: number;
114
+ S22Top: number;
115
+ S12Top: number;
116
+ S11Bot: number;
117
+ S22Bot: number;
118
+ S12Bot: number;
119
+ }
120
+ /** A force or stress component of `ShellCornerForces`. */
121
+ export type ShellForceComponent = Exclude<keyof ShellCornerForces, "nodeId">;
122
+ /**
123
+ * Forces of one shell element at its four corners, in its node order. `shellId` is the shell
124
+ * area's id when the area is one element, and `"<areaId>:<i>,<j>"` for the elements the engine
125
+ * generated when it meshed the area (see `FrameResult.mesh`).
126
+ */
127
+ export interface ShellElementForces {
128
+ shellId: FrameId;
129
+ areaId: FrameId;
130
+ corners: ShellCornerForces[];
131
+ }
132
+ /** The shell elements analysed, and the nodes the engine generated to mesh them. */
133
+ export interface FrameMesh {
134
+ /** Generated nodes, in global coordinates (mm); empty when no area was subdivided. */
135
+ nodes: FrameNode[];
136
+ /** Every shell element, in model order of their areas, with its four corner nodes. */
137
+ shells: {
138
+ id: FrameId;
139
+ areaId: FrameId;
140
+ nodeIds: FrameId[];
141
+ }[];
142
+ }
97
143
  /** Max or min of a result across combinations, with the combination that produces it. */
98
144
  export interface GoverningValue {
99
145
  value: number;
@@ -118,6 +164,8 @@ export interface FrameCaseResult {
118
164
  /** One entry per member with any released or spring end DOF, in model order. */
119
165
  releaseDeformations: MemberReleaseDeformations[];
120
166
  memberDiagrams: MemberDiagram[];
167
+ /** One entry per shell area, in model order. */
168
+ shellForces: ShellElementForces[];
121
169
  equilibriumResidual: {
122
170
  force: number;
123
171
  moment: number;
@@ -137,15 +185,24 @@ export interface FrameEnvelope {
137
185
  memberId: FrameId;
138
186
  extremes: Record<StationComponent, Bound<GoverningExtremeValue>>;
139
187
  }[];
188
+ shells: {
189
+ shellId: FrameId;
190
+ corners: ({
191
+ nodeId: FrameId;
192
+ } & Record<ShellForceComponent, Bound<GoverningValue>>)[];
193
+ }[];
140
194
  }
141
195
  export interface FrameResult {
142
196
  cases: Record<string, FrameCaseResult>;
143
197
  combinations: Record<string, FrameCaseResult>;
144
198
  /** Envelope over all combinations; absent when the model has none. */
145
199
  envelope?: FrameEnvelope;
200
+ /** The shell mesh; absent when the model has no shells. */
201
+ mesh?: FrameMesh;
146
202
  calculationDetails: {
147
203
  nodeCount: number;
148
204
  memberCount: number;
205
+ shellCount: number;
149
206
  dofCount: number;
150
207
  freeDofCount: number;
151
208
  profileSize: number;
@@ -159,6 +216,9 @@ export interface FrameResult {
159
216
  moment: "kN·m";
160
217
  length: "mm";
161
218
  rotation: "rad";
219
+ forcePerLength: "kN/m";
220
+ momentPerLength: "kN·m/m";
221
+ stress: "MPa";
162
222
  };
163
223
  warnings: Warnings;
164
224
  }
@@ -10,9 +10,10 @@ export declare const throwIssues: (issues: FrameModelIssue[]) => never;
10
10
  /**
11
11
  * Checks a frame model without analysing it and returns every problem found, each with the
12
12
  * node, member, load case, combination and field it concerns. An empty array means the
13
- * model can be analysed, apart from an unstable structure (304), which only the solve detects.
13
+ * model can be analysed, apart from an unstable structure (304) and a translation that nothing
14
+ * resists at a node connected only to shells (328), which only assembling the stiffness detects.
14
15
  *
15
16
  * @param model - The model to check
16
- * @returns Every problem found (codes 301–303 and 305–317), in model order
17
+ * @returns Every problem found (codes 301–303, 305–317 and 326–327, 329), in model order
17
18
  */
18
19
  export declare const validateFrameModel: (model: FrameModel) => FrameModelIssue[];