galhui
Version:
UI library using galho framework
880 lines • 82.1 kB
JavaScript
import { Component, G, clearEvent, div, g, m, onfocusout } from "galho";
import orray, { extend } from "galho/orray.js";
import { assign, byKey, call, def, filter, is, isA, isO, isS, isU, l } from "galho/util.js";
import { $, busy, cancel, confirm, errorMessage, ibt, icon, icons, label, menuitem, modal, selectRoot, setValue, tip, w, close } from "./galhui.js";
import { anyProp, arrayToDic } from "./util.js";
export const bot = (src, call) => assign(src, { srcs: {}, call });
export const error = (tp, msg, params) => ({ tp, params, render: () => msg });
export const req = () => error("req" /* ErrorType.required */, w.required);
export function setupbots(container) {
if (container.p.bots)
for (let bot of container.p.bots) {
let srcs = bot.srcs = {}; //, cb = bot.at(-1) as BotCallback<T>;
for (let field of bot)
srcs[field] = container.input(field).value;
setTimeout(bot.call, 0, srcs, container);
}
// if (bots) {
// // let calc = (input?: Input | void) => input ?
// // srcs[input.name] = input.value :
// // cb(srcs, container);
// for (let bot of bots) {
// let srcs: AnyDic = {}, cb = bot.at(-1) as BotCallback<T>;
// container.on("input", (input) => bot.includes(input.name) && calc(cb, input));
// // for (let i = 0; i < bot.length - 1; i++) {
// // let src = bot[i] as str;
// // let inp = container.input(src);
// // srcs[src] = inp.value;
// // inp.onset(["value", "off"], calc);
// // }
// setTimeout(calc, 0, cb);
// }
// }
}
/** */
export class FormBase extends Component {
inputs;
constructor(p, inputs) {
if (isA(p)) {
inputs = p;
p = {};
}
super(p);
this.inputs = filter(inputs);
// checkBot(this, i.bots);
}
view() { throw 1; }
get isDef() {
for (let input of this.inputs)
if (!input.isDef())
return false;
return true;
}
input(key) {
for (let input of this.inputs)
if (input.name == key || (is(input, CompostIn) && (input = input.input(key))))
return input;
}
errors = {};
setErrors(key, errors) {
this.errors[key] = errors;
this.input(key)?.error(!!errors);
}
valid(omit, focus = !omit) {
if (omit)
return !this.inputs.some(i => i.invalid(i.value, true));
for (let input of this.inputs) {
let inv = input.invalid(input.value, omit, focus);
this.setErrors(input.name, inv);
if (inv && focus) {
input.focus();
focus = false;
}
}
//use isto para incluir erros não gerados por inputs direitamente
return !anyProp(this.errors, e => e && l(e));
}
focus() {
for (let input of this.inputs)
if (!input.p.off) {
input.focus();
break;
}
return this;
}
// get def() {
// let r: Dic = {};
// for (let { key, def } of this.inputs)
// r[key] = def;
// return r;
// }
// /**default data */
// def(): Dic;
// def(value: Dic): this;
// def(value: null): this;
// def(v?: Dic) {
// if (isU(v)) {
// let r: Dic = {};
// for (let { key, def } of this.inputs)
// r[key] = def;
// return r;
// } else this.inputs.forEach(i => v ?
// i.key in v && i.set("def", v?.[i.key]) :
// i.set("def", null)
// );
// }
fill(value, setAsDefault) {
this
.emit("fill", value).inputs
.forEach(i => i.fill(value, setAsDefault));
return this;
}
reset(...fields) {
for (let i of l(fields) ? this.inputs.filter(i => fields.includes(i.name)) : this.inputs) {
i.visited = false;
i.value = i.def;
}
return this;
}
// clear(...fields: str[]) {
// for (let i of l(fields) ? this.inputs.filter(i => fields.includes(i.key)) : this.inputs)
// i.value(i.null);
// return this;
// }
/**
* get value of form
* @param edited se true only return fields that heve a value
* @param req se true fields required with default value will be returned too
*/
data(edited, req) {
let inputs = this.inputs;
let r = assign({}, this.p.hidden);
for (let input of edited ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs)
input.p.off || input.submit(r, edited, req);
this.emit("submit", r);
return r;
}
formData(edited, required) {
let r = new FormData(), data = this.data(edited, required);
for (let key in data)
r.append(key, data[key]);
return r;
}
}
export async function dataAsync(form, edited, req) {
let inputs = form.inputs;
let r = assign({}, form.p.hidden);
for (let input of edited ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs)
input.p.off || await input.submit(r, edited, req);
form.emit("submit", r);
return r;
}
function renderErrors(inputs, errs) {
let result = [];
for (let key in errs) {
let i = byKey(inputs, key, "name");
result.push(errs[key]?.map(err => div([i && [g("b", 0, i.p.text), ": "], err])));
// {
// (isS(error)) && (error = { tp: error });
// result.push(div([
// i && [g("b", 0, i.i.text), ": "],
// errors[error.tp](),
// error.info && g("sub", 0, error.info),
// ]));
// }
}
return result;
}
export const onOffHide = (e, isOff) => e.c("off", isOff);
export const onOffDisable = (e, isOff) => e.c("off", isOff);
export class Form extends FormBase {
errDiv;
constructor(p, inputs) {
super(p, inputs);
this.errDiv = (p = this.p).errorDiv || errorMessage();
if (p.outline == null)
p.outline = $.oform;
this.inputs.forEach(this.addInput, this);
this.on("input", (input) => {
if (p.bots)
for (let bot of p.bots)
if (bot.includes(input.name)) {
bot.call(assign(bot.srcs, { [input.name]: input.value }), this);
}
});
setupbots(this);
// this.p.labelSz ||= 40;
// this.on('input', (input: Input) => {
// let e = input.field(this).attr("edited", !input.isDef());
// (p as iForm).offFN?.(e, !!input.p.off)
// });
}
addInput(input) {
input.form = this;
input
.onset(["value", "off"], () => {
input.visited && this.setErrors(input.name, input.invalid(input.value));
let e = input.field(this.p).attr("edited", !input.isDef());
this.p.offFN?.(e, !!input.p.off);
this.emit("input", input);
})
.observeVisited(i => this.setErrors(i.name, i.invalid(i.value)));
}
view() {
let { p: i, inputs: inp } = this;
return g(i.tag || 'form', "_ form", [
inp.map(i => i.field(this.p)),
this.errDiv
]);
}
setErrors(key, errors) {
super.setErrors(key, errors);
this.errDiv.set(renderErrors(this.inputs, this.errors));
}
}
// export function mdform(hd: Label, inputs: Input[], cb?: (dt: Dic, form: FormBase) => Task<unk>, confirm?: S<HTMLButtonElement>, noCancel?: bool, sz?: Size): Promise<Dic>
// export function mdform(hd: Label, form: FormBase, cb?: (dt: Dic, form: FormBase) => Task<unk>, confirm?: S<HTMLButtonElement>, noCancel?: bool, sz?: Size): Promise<Dic>
/**modal form */
export function mdform(hd, form, cb, ok = confirm(), noCancel, sz) {
if (isA(form))
form = new Form(form);
return new Promise(res => {
modal(hd, g(form.set("tag", "div"), "bd"), (cl, md) => [
ok.p({ type: "submit" }).on("click", e => {
e.preventDefault();
if (form.valid()) {
clearEvent(e);
busy(md, async () => {
let dt = form.data();
res((await cb?.(dt, form)) || dt);
cl();
});
}
}),
noCancel || cancel(() => { cl(); res(null); })
], sz, !noCancel);
form.focus();
});
}
export function field(bd, i, container, sz = container.labelSz) {
let o = def(container.outline, i.outline);
let t = div("_ " + (o ? "oi" : "ii"), [
(!o || i.text) && g('label', "hd", [
i.text,
i.tip && tip(icon(icons.info), i.tip)
]).css("width", `${sz}%`).attr({ for: i.name }),
bd = g(bd, "bd").css("width", `${100 - sz}%`),
!!i.req && g("span", "req", "*"),
]);
if (i.off)
container.offFN?.(bd, true);
return t;
}
export function expand(form, ...main) {
for (let input of form.inputs)
g(input).c("sd" /* C.side */, !main.includes(input.name));
g(form).add(m(div(`ft _${"sd" /* C.side */}`, [
g("span", 0, "Mostrar todos"),
ibt(icons.down, null)
]), div(`ft ${"sd" /* C.side */}`, [
g("span", 0, "Mostrar principais"),
ibt(icons.up, null),
])).on("click", () => g(form).tcls("expand")));
}
export function valid(e) {
for (let c = 0; c < e.length; c++) {
let i = e[c];
if (!i.validity.valid)
return false;
}
return true;
}
export function value(e) {
let r = {};
for (let c = 0; c < e.length; c++) {
let i = e[c];
if (i.name)
switch (i.type) {
case 'radio':
if (i.checked)
r[i.name] = i.value;
break;
case 'checkbox':
r[i.name] = i.checked;
break;
case 'date':
case 'time':
case 'week':
r[i.name] = i.valueAsDate;
break;
case 'number':
case 'range':
r[i.name] = i.valueAsNumber;
break;
case 'submit':
break;
default:
r[i.name] = i.value;
break;
}
}
return r;
}
// export const text = (v: str) => v && (v[0].toUpperCase() + v.slice(1).replace(/_/g, ' '));
export const up = (v) => v && def(w[v], (v[0].toUpperCase() + v.slice(1).replace(/_/g, ' ')));
export class Input extends Component {
constructor(p) {
super(p);
if (isU(p.text))
p.text = up(p.name);
if (isU(p.value))
p.value = this.def;
}
get name() { return this.p.name; }
get value() { return def(this.p.value, this.null); }
set value(v) { this.set("value", v); }
fill(src, setAsDefault) {
let k = this.p.name;
if (k in src) {
if (setAsDefault)
this.set("def", src[k]);
this.value = src[k];
}
}
get def() { return def(this.p.def, this.null); }
isDef(value = this.value, def = this.def) {
return def === value;
}
isNull(value = this.value) { return this.isDef(value, this.null); }
visited;
observeVisited(handler) {
onfocusout(g(this), () => {
this.visited = true;
handler(this);
});
}
/**show or hide errors */
error(state) {
g(this).c("error", state);
return this;
}
invalid(value, omit, focus) {
if (this.p.off)
return null;
let v = this.validate(value, omit, focus);
return l(v) ? v : null;
}
validate(value) {
return (this.p.req && this.isNull(value)) ? [req()] : [];
}
#f;
field(container, sz) {
return this.#f ||= field(this, this.p, container, sz);
}
submit(data) {
let { name, value, submit } = this.p;
if (submit)
submit(data);
else
data[name] = value;
}
/**null value used for clear method */
get null() { return null; }
}
export class TextIn extends Input {
view() {
let p = this.p, r;
if (p.input == 'ta') {
r = g('textarea', "_ in v")
.on('keydown', (e) => {
if (e.key == "Enter") {
if (e.ctrlKey)
e.preventDefault();
else
e.stopPropagation();
}
});
}
else
r = g("input", "_ in").p('type', p.input || 'text');
r.p({
minLength: p.length || p.min, maxLength: p.length || p.max,
name: p.name, id: p.name,
placeholder: p.ph || ''
})
.on({
input: () => {
this.emit("input", r.v());
this.set("value", r.v() || null);
},
focus() { r.e.select(); }
});
// if (p.min) r.e.minLength = p.min;
// if (p.max) r.e.maxLength = p.max;
return this.bind(r, () => r.e.value = p.value || '', "value");
}
validate(value) {
let p = this.p;
let errs = [];
if (value) {
if (p.pattern && !p.pattern.test(value))
errs.push(error("invalid_format" /* ErrorType.invalidFormat */, w.invalidFmt));
if (p.max && value.length > p.max)
errs.push(error("text_too_long" /* ErrorType.textTooLong */, "", { max: p.max }));
if (p.min && value.length < p.min)
errs.push(error("text_too_short" /* ErrorType.textTooShort */, "", { min: p.min }));
}
else if (p.req)
errs.push(req());
return errs;
}
}
/**text input */
export const textIn = (k, req, input) => new TextIn({ name: k, req, input });
export class NumbIn extends Input {
view() {
let i = this.p, inp = g("input", {
type: 'number',
placeholder: i.ph || '',
step: i.integer ? 1 : 'any',
name: i.name, id: i.name, value: i.value,
min: (i.min ?? i.omin), max: (i.max ?? i.omax),
oninput: () => this.value = inp.v() ? inp.e.valueAsNumber : null,
onfocus() { inp.e.select(); }
});
this.onset(["value", "off"], () => {
inp.v(i.value);
inp.e.disabled = !!i.off;
});
return (i.unit ? g("span", 0, [inp, i.unit]) : inp).c("_ in");
}
validate(value) {
return validateNumber(this.p, value);
}
// calc(...values: number[]) {
// var r = 0;
// for (let value of values)
// r += value || 0;
// return r;
// }
focus() {
let { $, p: i } = this;
(i.unit ? $.first : $).focus();
return this;
}
}
export const numbIn = (k, req, text, unit) => new NumbIn({ name: k, req, text, unit });
export function validateNumber(p, value) {
let errs = [];
if (value == null) {
if (p.req)
errs.push(req());
}
else {
if (p.integer && Math.floor(value) != value)
errs.push(error("is_decimal" /* ErrorType.isDecimal */));
//if (i.unsigned && value < 0)
// errs.push({ type: form.ErrorType.isNegative, key });
let { min, max, omin, omax } = p;
if ((max != null) && value > max)
errs.push(error("number_too_big" /* ErrorType.numberTooBig */, "", { max }));
else if (omax != null && value >= omax)
errs.push(error("number_too_big" /* ErrorType.numberTooBig */, "", { max: omax }));
if ((min != null) && value < min)
errs.push(error("number_too_small" /* ErrorType.numberTooSmall */, "", { min }));
else if (omin != null && value <= omin)
errs.push(error("number_too_small" /* ErrorType.numberTooSmall */, "", { min: omin }));
}
return errs;
}
export class CheckIn extends Input {
view() {
let i = this.p;
switch (i.fmt) {
case "y" /* CBFmt.yesNo */:
return this.bind(div(null, [
g('label', `${"cb" /* C.checkbox */} i`, [
g("input", {
type: 'radio',
value: 1,
name: i.name,
oninput: () => {
this.set('value', true);
}
}),
'Sim'
]),
g('label', `${"cb" /* C.checkbox */} i`, [
g("input", {
type: 'radio',
name: i.name,
value: 0,
oninput: () => {
this.set('value', false);
}
}),
'No'
])
]), (s) => {
s.child(i.value ? 0 : 1).first.p('checked', true);
}, 'value');
default:
let inp = g("input", {
type: 'checkbox',
name: i.name, id: i.name,
checked: i.value,
onclick: i.clear && ((e) => {
if (e.altKey)
setTimeout(() => this.set('value', null));
}),
oninput: () => this.set('value', inp.p('checked'))
}).c("sw" /* C.switch */, i.fmt != "c" /* CBFmt.checkbox */);
return this.bind(inp, s => s.p({
checked: i.value,
placeholder: i.ph || (i.value == null ? '' : i.value ? w.yes : w.no)
}), 'value');
}
}
}
export class TimeIn extends Input {
view() {
let _this = this, i = this.p;
return this.bind(g("input").p({
type: 'time',
name: i.name, id: i.name,
placeholder: i.ph,
}).on('input', function () {
_this.set('value', this.value + ':00');
}), (s) => s.p('value', i.value && i.value.slice(0, 5)), 'value');
}
}
export class DateIn extends Input {
view() {
let i = this.p;
let inp = g("input", "_ in").p({
type: "date",
name: i.name, id: i.name,
placeholder: i.ph,
value: i.value
});
this.onset("value", () => inp.e.value = i.value);
return inp.on("input", () => this.set("value", inp.e.value || null));
}
get def() {
return this.p.def == "now" ? new Date().toISOString().slice(0, 10) : null;
}
fill(src, setAsDefault) {
let k = this.p.name;
if (k in src) {
let v = src[k];
this.value = v ? new Date(v).toISOString().slice(0, 10) : null;
if (setAsDefault)
this.set("def", v);
}
}
}
const monthV = (v) => v?.slice(0, 7) || null;
const dateDefV = (v) => monthV(v == "now" ? new Date().toISOString() : v);
export class MonthIn extends Input {
view() {
let i = this.p;
let inp = g("input", "_ in").p({
type: "month",
name: i.name, id: i.name,
placeholder: i.ph,
value: monthV(i.value),
});
;
// this.onset("value", () =>);
return this.bind(inp, (_, p) => {
if ("max" in p)
inp.e.max = p.max;
if ("min" in p)
inp.e.min = p.min;
if ("value" in p)
inp.e.value = monthV(i.value);
}).on("input", () => this.set("value", inp.e.value || null));
}
get def() { return dateDefV(this.p.def); }
isDef(value = this.value, def = this.def) {
return dateDefV(def) === monthV(value);
}
submit(data) {
data[this.p.name] = this.value ? this.value + "-01" : null;
}
}
/**date & time input */
export class DTIn extends Input {
view() {
let i = this.p, inp = g("input", "_ in").p({
type: "datetime-local",
name: i.name, id: i.name,
placeholder: i.ph
}).on("input", () => {
this.set("value", inp.v() || null);
});
return this.bind(inp, () => inp.v(i.value || ""));
}
}
export class SelectIn extends Input {
options;
get active() { return byKey(this.options, this.p.value, this.options.key); }
constructor(i, options, key = 0) {
super(i);
i.item ||= v => def(v[1], v[key]);
this.options = extend(options, {
key, parse: e => isO(e) ? e : { [key]: e }
});
}
get value() { return this.p.value; }
set value(v) { this.p.value === v || this.set("value", v); }
view() {
let { p, options } = this;
let label = g("span");
let items = options.bind(g("table"), {
insert: v => {
let t = p.item(v);
return (is(t, G) && t.is("tr") ? t : menuitem(v.i, t)).d(v[options.key]);
},
tag(active, i, p, tag) {
let s = p.child(i);
s.c(tag, active);
if (active) {
menu.e.scroll({ top: s.p('offsetTop') - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2 });
}
}
}).on("click", ({ currentTarget: ct, target: t }) => ct != t && (this.set("open", false).value = g(t).closest("tr").d()));
let menu = div("_ menu", items);
let root = selectRoot(this, options, label, menu, v => this.value = v).attr({ name: p.name });
setValue(this, label);
this.on(e => ("value" in e) && setValue(this, label));
return root;
}
option(k) { return this.options.find(k); }
}
export class MSelectIn extends Input {
options;
constructor(p, options, key = 0) {
super(p);
p.item ||= v => def(v[1], v[key]);
(p.value = orray(p.def).on(() => this.set(["value"])))
.parse = v => p.value.has(v) ? void 0 : v;
this.options = extend(options, { key, parse: e => isO(e) ? e : { [key]: e } });
}
option(k) { return this.options.find(k); }
view() {
let { p, options } = this;
let label = p.value.bind(div(), {
insert: k => g("span", "i", [p.item(this.option(k)), close(() => p.value.remove(k))]),
empty: v => label.c("ph", v).set(v && p.ph)
});
let items = g("table").on("click", ({ currentTarget: ct, target: t }) => {
if (ct != t) {
this.set("open", false);
p.value.push(g(t).closest("tr").d());
}
});
let menu = div("_ menu", items);
let root = selectRoot(this, options, label, menu, v => this.value.push(v)).attr({ name: p.name });
options.bind(items, {
insert: v => {
let t = p.item(v);
return (is(t, G) && t.is("tr") ? t : menuitem(v.i, t)).d(v[options.key]);
},
tag(active, i, p, tag) {
let s = p.child(i);
s.c(tag, active);
if (active) {
menu.e.scroll({ top: s.p('offsetTop') - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2 });
}
}
});
return root;
}
get value() { return this.p.value; }
set value(v) { this.p.value.set(v); }
isDef(val = this.value, def = this.def || []) {
return l(val) == l(def) && val.every(v => def.includes(v));
}
}
export class MobSelectIn extends Input {
options;
okey;
constructor(i, options, okey) {
super(i);
this.options = options;
this.okey = okey;
}
view() {
let { p, options, okey } = this;
return g("select", "_ in", options.map(v => g("option", { value: v[okey] }, p.item(v))))
.p("name", p.name);
}
}
export class RadioIn extends Input {
view() {
let i = this.p, o = i.options.map(v => isS(v) ? [v] : v);
i.layout ||= l(o) > 3 ? "column" : "wrap";
return this.bind(g("span", i.layout == 'column' ? "_ col" : '', o.map(([key, text, ico]) => g('label', "cb" /* C.checkbox */, [
g("input", {
type: 'radio',
value: key,
name: i.name,
checked: key == i.value,
oninput: () => { this.set('value', key); }
}),
ico && icon(ico),
text || key
]))).on('click', e => {
if (e.altKey) {
g(e.currentTarget).queryAll('input').p('checked', false);
this.set('value', null);
}
}), (s) => {
s.queryAll('input').forEach(input => {
input.checked = input.value == i.value;
});
}, 'value').css('position', 'relative');
}
}
export class ChecklistIn extends Input {
view() {
let p = this.p, v = p.value;
return g("span", "_ col", p.options.map(v => isS(v) ? [v] : v).map(([key, text, ico]) => g('label', "cb" /* C.checkbox */, [
call(g("input", {
type: 'checkbox',
name: `${p.name}_${key}`,
checked: v.includes(key),
}), i => i.on("input", () => {
i.e.checked ? v.push(key) : v.splice(v.indexOf(key), 1);
this.set(['value']);
})),
ico && icon(ico),
text || key
])));
}
get def() { return []; }
}
/**password input */
export class PWIn extends Input {
view() {
let i = this.p, inp = g("input", "_ in").p({
type: 'password', name: i.name,
placeholder: i.ph
}).attr('autocomplete', i.auto || false);
return inp.on("input", () => this.set("value", inp.e.value));
}
validate(value) {
var i = this.p,
// key = i.key,
errs = [];
if (i.req && !value)
errs.push(req());
return errs;
}
}
export class CustomIn extends Input {
view;
constructor(i, view) {
super(i);
this.view = view;
if (i.submit)
this.submit = i.submit;
if (i.isDef)
this.isDef = i.isDef;
if (i.validate)
this.validate = i.validate;
if (i.fill)
this.fill = i.fill;
}
}
export class CompostIn extends Input {
#f;
get form() { return this.#f; }
set form(v) {
this.#f = v;
for (let i of this.inputs)
i.form = v;
}
subfield(input) {
return g(input); //.field(container);
}
constructor(p, inputs) {
p.value = null;
super(p);
for (let input of this.inputs = filter(inputs))
input.onset(["value", "off"], () => {
// input.visited && this.setErrors(input.name, input.invalid);
let f = this.form;
let e = this.subfield(input, f.p).attr("edited", !input.isDef());
f.p.offFN?.(e, !!input.p.off);
f.emit("input", input);
this.set(["value"]);
if (p.bots)
for (let bot of p.bots)
if (bot.includes(input.name)) {
bot.call(assign(bot.srcs, { [input.name]: input.value }), this);
}
});
setupbots(this);
}
inputs;
get def() { return arrayToDic(this.inputs, v => [v.name, v.def]); }
get value() { return arrayToDic(this.inputs, v => [v.name, v.value]); }
set value(v) {
this.inputs.forEach(i => i.name in v && (i.value = v ? v[i.name] : i.null));
}
view() {
for (let input of this.inputs)
input.onset('value', () => this.set(['value']));
return g("span", "_ join", this.inputs);
}
fill(value, setAsDefault) {
if (this.p.sub)
if (!(value = value[this.p.name]))
return;
for (let i of this.inputs)
i.fill(value, setAsDefault);
}
validate(_v, omit, focus) {
let err = [];
for (let input of this.inputs) {
let inv = input.invalid(input.value, omit, focus);
inv && err.push(...inv);
if (inv && focus) {
input.focus();
focus = false;
}
}
return err;
}
focus() {
this.inputs[0]?.focus();
return this;
}
submit(data, edited, req) {
let { inputs, p: i } = this;
if (i.sub)
data = data[i.name] = i.sub == "array" ? [] : {};
for (let inp of edited && !i.sub ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs)
inp.p.off || inp.submit(data, edited, req);
}
input(key) {
for (let input of this.inputs)
if (input.name == key || (is(input, CompostIn) && (input = input.input(key))))
return input;
}
isDef(v = this.value, def = this.def) {
for (let i of this.inputs)
if (!i.isDef(v[i.name], def[i.name]))
return false;
return true;
}
}
export function fieldGroup(title, inputs, form, sz) {
return g("fieldset", "_ formg", [
//TODO: remove sub element in label
g("legend", 0, label(title)),
inputs.map(i => i.field(form.p, sz))
]);
}
export class GroupIn extends CompostIn {
view() { throw 1; }
subfield(input, container) {
let p = this.p;
return input.field(p.row ? { offFN: p.offFN, outline: true } : container, p.labelSz);
}
field(container) {
let { p, inputs } = this;
return this.$ ||= g("fieldset", "_ formg " + (p.row ? "row" : ""), [
//TODO: remove sub element in label
g("legend", 0, label(p.text)),
inputs.map(i => this.subfield(i, container))
]); //fieldGroup(this.p.text, this.inputs, form, this.p.labelSz);
}
observeVisited(handler) {
for (let i of this.inputs)
i.observeVisited(handler);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQWUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxFQUFZLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBcUMsTUFBTSxFQUFRLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFTLE1BQU0sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsQ0FBQyxFQUFtRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQWtDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDclAsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFrQmhELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFvQyxHQUFrQixFQUFFLElBQW9CLEVBQVUsRUFBRSxDQUN6RyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBaUJsQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFhLEVBQUUsR0FBUyxFQUFFLE1BQVksRUFBVSxFQUFFLENBQ3RFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLGlDQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFhL0QsTUFBTSxVQUFVLFNBQVMsQ0FBQyxTQUEyQjtJQUNuRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNsQixLQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ2hDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUEsc0NBQXNDO1lBQy9ELEtBQUssSUFBSSxLQUFLLElBQUksR0FBRztnQkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzdDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDMUM7SUFDSCxjQUFjO0lBQ2Qsb0RBQW9EO0lBQ3BELDBDQUEwQztJQUMxQyw4QkFBOEI7SUFDOUIsNEJBQTRCO0lBQzVCLGdFQUFnRTtJQUVoRSxxRkFBcUY7SUFDckYsb0RBQW9EO0lBQ3BELG9DQUFvQztJQUNwQywyQ0FBMkM7SUFDM0Msa0NBQWtDO0lBQ2xDLDhDQUE4QztJQUM5QyxXQUFXO0lBQ1gsK0JBQStCO0lBQy9CLE1BQU07SUFDTixJQUFJO0FBQ04sQ0FBQztBQVVELE1BQU07QUFDTixNQUFNLE9BQU8sUUFBaUUsU0FBUSxTQUFnQjtJQUNwRyxNQUFNLENBQVU7SUFHaEIsWUFBWSxDQUF3QixFQUFFLE1BQTBCO1FBQzlELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1YsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNYLENBQUMsR0FBRyxFQUFPLENBQUM7U0FDYjtRQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVCLDBCQUEwQjtJQUM1QixDQUFDO0lBQ0QsSUFBSSxLQUFVLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFJLEtBQUs7UUFDUCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO2dCQUNoQixPQUFPLEtBQUssQ0FBQztRQUVqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxLQUFLLENBQWtCLEdBQWdCO1FBQ3JDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPLEtBQVUsQ0FBQztJQUN4QixDQUFDO0lBQ0QsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFDN0IsU0FBUyxDQUFDLEdBQWdCLEVBQUUsTUFBZ0I7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxLQUFLLENBQUMsSUFBVyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUk7UUFDOUIsSUFBSSxJQUFJO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFMUQsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzdCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRTtnQkFDaEIsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNkLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDZjtTQUNGO1FBQ0QsaUVBQWlFO1FBQ2pFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsS0FBSztRQUNILEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2dCQUNoQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsTUFBTTthQUNQO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsY0FBYztJQUNkLHFCQUFxQjtJQUNyQiwwQ0FBMEM7SUFDMUMsb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCxJQUFJO0lBQ0oscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCLDRDQUE0QztJQUM1QyxzQkFBc0I7SUFDdEIsZ0JBQWdCO0lBQ2hCLHdDQUF3QztJQUN4QywrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSSxDQUFDLEtBQVUsRUFBRSxZQUFtQjtRQUNsQyxJQUFJO2FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNO2FBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsS0FBSyxDQUFDLEdBQUcsTUFBcUI7UUFDNUIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN4RixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNsQixDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDakI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCw0QkFBNEI7SUFDNUIsNkZBQTZGO0lBQzdGLHVCQUF1QjtJQUN2QixpQkFBaUI7SUFDakIsSUFBSTtJQUNKOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsTUFBYSxFQUFFLEdBQVU7UUFDNUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV6QixJQUFJLENBQUMsR0FBUSxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDcEYsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFhLEVBQUUsUUFBZTtRQUNyQyxJQUNFLENBQUMsR0FBRyxJQUFJLFFBQVEsRUFBRSxFQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJO1lBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGO0FBQ0QsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsSUFBYyxFQUFFLE1BQWEsRUFBRSxHQUFVO0lBQ3ZFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFekIsSUFBSSxDQUFDLEdBQVEsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQ3BGLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELFNBQVMsWUFBWSxDQUFDLE1BQWUsRUFBRSxJQUFrQjtJQUN2RCxJQUFJLE1BQU0sR0FBVSxFQUFFLENBQUM7SUFFdkIsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDcEIsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJO1FBQ0osMkNBQTJDO1FBQzNDLG9CQUFvQjtRQUNwQixzQ0FBc0M7UUFDdEMsd0JBQXdCO1FBQ3hCLDJDQUEyQztRQUMzQyxPQUFPO1FBQ1AsSUFBSTtLQUNMO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUksRUFBRSxLQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUksRUFBRSxLQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBWXJFLE1BQU0sT0FBTyxJQUFLLFNBQVEsUUFBZTtJQUN2QyxNQUFNLENBQUk7SUFJVixZQUFZLENBQTRCLEVBQUUsTUFBZ0I7UUFDeEQsS0FBSyxDQUFDLENBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDbkIsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixJQUFLLENBQVcsQ0FBQyxJQUFJO2dCQUNuQixLQUFLLElBQUksR0FBRyxJQUFLLENBQVcsQ0FBQyxJQUFJO29CQUMvQixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQ2pFO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEIseUJBQXlCO1FBQ3pCLHVDQUF1QztRQUN2Qyw4REFBOEQ7UUFDOUQsMkNBQTJDO1FBQzNDLE1BQU07SUFDUixDQUFDO0lBQ0QsUUFBUSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsS0FBSzthQUNGLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDNUIsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDO2FBQ0QsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSTtRQUNGLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLEVBQUUsUUFBUSxFQUFFO1lBQ2xDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTTtTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBZ0IsRUFBRSxNQUFnQjtRQUMxQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUFFRCw0S0FBNEs7QUFDNUssMktBQTJLO0FBQzNLLGdCQUFnQjtBQUNoQixNQUFNLFVBQVUsTUFBTSxDQUFVLEVBQVMsRUFBRSxJQUF3QixFQUFFLEVBQWdELEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQWUsRUFBRSxFQUFTO0lBQy9KLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4QixPQUFPLElBQUksT0FBTyxDQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLEtBQUssQ0FDSCxFQUFFLEVBQUUsQ0FBQyxDQUFFLElBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUM3QyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsSUFBSyxJQUFhLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzFCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDZCxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNsQixJQUFJLEVBQUUsR0FBSSxJQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQy9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQVksQ0FBQyxDQUFDLElBQUksRUFBUyxDQUFDLENBQUM7d0JBQ2pELEVBQUUsRUFBRSxDQUFDO29CQUNQLENBQUMsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQztTQUM5QyxFQUFFLEVBQUUsRUFDTCxDQUFDLFFBQVEsQ0FDVixDQUFDO1FBQ0QsSUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQVVELE1BQU0sVUFBVSxLQUFLLENBQUMsRUFBTyxFQUFFLENBQVEsRUFBRSxTQUF5QixFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTztJQUN4RixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNqQyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUN0QyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFXLEVBQUUsQ0FBQztRQUN0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztLQUNqQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsQ0FBQyxHQUFHO1FBQ1AsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFHRCxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQVUsRUFBRSxHQUFHLElBQW1CO0lBQ3ZELEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07UUFDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsb0JBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNYLEdBQUcsQ0FBQyxPQUFPLGlCQUFNLEVBQUUsRUFBRTtRQUNuQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUM7UUFDN0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0tBQ3RCLENBQUMsRUFDRixHQUFHLENBQUMsTUFBTSxpQkFBTSxFQUFFLEVBQUU7UUFDbEIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsb0JBQW9CLENBQUM7UUFDbEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO0tBQ3BCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUNELE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBa0I7SUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBcUIsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLO1lBQ25CLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBQ0QsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFrQjtJQUN0QyxJQUFJLENBQUMsR0FBMEIsRUFBRSxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXFCLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsSUFBSTtZQUNSLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDZCxLQUFLLE9BQU87b0JBQ1YsSUFBSSxDQUFDLENBQUMsT0FBTzt3QkFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3RCLE1BQU07Z0JBQ1IsS0FBSyxVQUFVO29CQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDdEIsTUFBTTtnQkFDUixLQUFLLE1BQU0sQ0FBQztnQkFDWixLQUFLLE1BQU0sQ0FBQztnQkFDWixLQUFLLE1BQU07b0JBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUMxQixNQUFNO2dCQUNSLEtBQUssUUFBUSxDQUFDO2dCQUNkLEtBQUssT0FBTztvQkFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLE1BQU07Z0JBQ1I7b0JBQ0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNwQixNQUFNO2FBQ1Q7S0FDSjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELDZGQUE2RjtBQUM3RixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFNLEVBQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFReEcsTUFBTSxPQUFnQixLQUF3RixTQUFRLFNBQWdCO0lBQ3BJLFlBQVksQ0FBSTtRQUNkLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBVyxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBSSxLQUFLLEtBQUssT0FBTyxHQUFHLENBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBRSxHQUFXLEVBQUUsWUFBbUI7UUFDcEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO1lBQ1osSUFBSSxZQUFZO2dCQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUNELElBQUksR0FBRyxLQUFLLE9BQU8sR0FBRyxDQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRztRQUN0QyxPQUFPLEdBQUcsS0FBSyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkUsT0FBTyxDQUFRO0lBQ2YsY0FBYyxDQUFDLE9BQThCO1FBQzNDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsS0FBSyxDQUFDLEtBQVc7UUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBUSxFQUFFLElBQVcsRUFBRSxLQUFZO1FBQ3pDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVE7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsRUFBRSxDQUFJO0lBQ04sS0FBSyxDQUFDLFNBQXlCLEVBQUUsRUFBUTtRQUN2QyxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLE1BQU07WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNELHNDQUFzQztJQUN0QyxJQUFJLElBQUksS0FBUSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDL0I7QUF3QkQsTUFBTSxPQUFPLE1BQU8sU0FBUSxLQUFxQztJQUMvRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUEwQixDQUFDO1FBQzNDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO2lCQUN4QixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxDQUFDLE9BQU87d0JBQ1gsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDOzt3QkFDaEIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUMxQjtZQUNI