@libs-ui/services-grid-layout 0.2.357-21 → 0.2.357-23

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.
@@ -1,3 +1,4 @@
1
+ import { uuid } from '@libs-ui/utils';
1
2
  /**
2
3
  * Checks whether the rectangular region [x, x + cols) x [y, y + rows)
3
4
  * is completely vacant among existing items.
@@ -252,4 +253,77 @@ export const calculateDropGhost = (event, canvasContainer, root, payload, totalC
252
253
  hoveredGridster: rootGridster ?? undefined,
253
254
  };
254
255
  };
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGlzaW9uLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvY29sbGlzaW9uLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FDMUIsUUFBa0MsRUFDbEMsQ0FBUyxFQUNULENBQVMsRUFDVCxJQUFZLEVBQ1osSUFBWSxFQUNaLFNBQWtCLEVBQ1QsRUFBRTtJQUNYLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXJFLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLFFBQWtDLEVBQ2xDLE1BQWMsRUFDZCxNQUFjLEVBQ2QsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsU0FBUyxHQUFHLEVBQUUsRUFDZ0IsRUFB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LElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELE9BQU87UUFDTCxHQUFHO1FBQ0gsR0FBRztRQUNILElBQUksRUFBRSxRQUFRO1FBQ2QsSUFBSSxFQUFFLFdBQVc7UUFDakIsU0FBUyxFQUFFLGlCQUFpQixHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTztRQUNyRCxRQUFRLEVBQUUsZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPO1FBQ25ELFVBQVUsRUFBRSxRQUFRLEdBQUcsT0FBTyxHQUFHLE1BQU07UUFDdkMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLEdBQUcsTUFBTTtRQUMzQyxhQUFhLEVBQUUsS0FBSztRQUNwQixTQUFTO1FBQ1QsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlLEVBQUcsWUFBNEIsSUFBSSxTQUFTO0tBQzVELENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25ld05vZGUsXG4gIFRfZ3JpZExheW91dF9ub2RlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyaWQtbGF5b3V0LmludGVyZmFjZSc7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBbeCwgeCArIGNvbHMpIHggW3ksIHkgKyByb3dzKVxuICogaXMgY29tcGxldGVseSB2YWNhbnQgYW1vbmcgZXhpc3RpbmcgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JlZ2lvbkZyZWUgPSAoXG4gIGNoaWxkcmVuOiBBcnJheTxUX2dyaWRMYXlvdXRfbm9kZT4sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBjb2xzOiBudW1iZXIsXG4gIHJvd3M6IG51bWJlcixcbiAgaWdub3JlZElkPzogc3RyaW5nLFxuKTogYm9vbGVhbiA9PiB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICBpZiAoaWdub3JlZElkICYmIGNoaWxkLmlkID09PSBpZ25vcmVkSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBoT3ZlcmxhcCA9ICEoY2hpbGQueCArIGNoaWxkLmNvbHMgPD0geCB8fCBjaGlsZC54ID49IHggKyBjb2xzKTtcbiAgICBjb25zdCB2T3ZlcmxhcCA9ICEoY2hpbGQueSArIGNoaWxkLnJvd3MgPD0geSB8fCBjaGlsZC55ID49IHkgKyByb3dzKTtcblxuICAgIGlmIChoT3ZlcmxhcCAmJiB2T3ZlcmxhcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyBvcHRpbWFsIChjb2wsIHJvdykgaW5zaWRlIGEgZ3JvdXAgY29udGFpbmVyLlxuICogU25hcHMgZmx1c2ggdG8gYWRqYWNlbnQgY2FyZCByaWdodCBlZGdlIGlmIHNsb3QgaXMgdmFjYW50LlxuICovXG5leHBvcnQgY29uc3QgZmluZFNuYXBQb3NpdGlvbkluc2lkZUdyb3VwID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICByYXdDb2w6IG51bWJlcixcbiAgcmF3Um93OiBudW1iZXIsXG4gIGlubmVyQ29sczogbnVtYmVyLFxuICBpbm5lclJvd3M6IG51bWJlcixcbiAgdG90YWxDb2xzID0gMjQsXG4pOiB7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9ID0+IHtcbiAgbGV0IGJlc3RDYW5kaWRhdGU6IHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBkaXN0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgcmlnaHRFZGdlID0gY2hpbGQueCArIGNoaWxkLmNvbHM7XG4gICAgY29uc3QgY2FuRml0ID0gcmlnaHRFZGdlICsgaW5uZXJDb2xzIDw9IHRvdGFsQ29scztcbiAgICBjb25zdCBpc0ZyZWUgPSBjYW5GaXQgJiYgaXNSZWdpb25GcmVlKGNoaWxkcmVuLCByaWdodEVkZ2UsIGNoaWxkLnksIGlubmVyQ29scywgaW5uZXJSb3dzKTtcblxuICAgIGlmICghaXNGcmVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZWFyWCA9IE1hdGguYWJzKHJhd0NvbCAtIHJpZ2h0RWRnZSkgPD0gMiB8fCAocmF3Q29sID49IGNoaWxkLnggKyBNYXRoLmZsb29yKGNoaWxkLmNvbHMgLyAyKSAmJiByYXdDb2wgPD0gcmlnaHRFZGdlICsgMSk7XG4gICAgY29uc3QgbmVhclkgPSBNYXRoLmFicyhyYXdSb3cgLSBjaGlsZC55KSA8PSAyO1xuXG4gICAgaWYgKG5lYXJYICYmIG5lYXJZKSB7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5hYnMocmF3Q29sIC0gcmlnaHRFZGdlKSArIE1hdGguYWJzKHJhd1JvdyAtIGNoaWxkLnkpO1xuXG4gICAgICBpZiAoIWJlc3RDYW5kaWRhdGUgfHwgZGlzdCA8IGJlc3RDYW5kaWRhdGUuZGlzdCkge1xuICAgICAgICBiZXN0Q2FuZGlkYXRlID0geyBjb2w6IHJpZ2h0RWRnZSwgcm93OiBjaGlsZC55LCBkaXN0IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGJlc3RDYW5kaWRhdGUpIHtcbiAgICByZXR1cm4geyBjb2w6IGJlc3RDYW5kaWRhdGUuY29sLCByb3c6IGJlc3RDYW5kaWRhdGUucm93IH07XG4gIH1cblxuICBjb25zdCBjbGFtcGVkQ29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG90YWxDb2xzIC0gaW5uZXJDb2xzLCByYXdDb2wpKTtcbiAgY29uc3QgY2xhbXBlZFJvdyA9IE1hdGgubWF4KDAsIHJhd1Jvdyk7XG5cbiAgcmV0dXJuIHsgY29sOiBjbGFtcGVkQ29sLCByb3c6IGNsYW1wZWRSb3cgfTtcbn07XG5cbi8qKlxuICogQWRqdXN0cyBwb3NpdGlvbiBvZiBwYWlyIGlmIGhvcml6b250YWwgb3ZlcmxhcCBvY2N1cnMuXG4gKi9cbmNvbnN0IGFkanVzdEl0ZW1QYWlyID0gKGE6IFRfZ3JpZExheW91dF9ub2RlLCBiOiBUX2dyaWRMYXlvdXRfbm9kZSk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBoT3ZlcmxhcCA9ICEoYS54ICsgYS5jb2xzIDw9IGIueCB8fCBhLnggPj0gYi54ICsgYi5jb2xzKTtcblxuICBpZiAoaE92ZXJsYXAgJiYgYi55IDwgYS55ICsgYS5yb3dzKSB7XG4gICAgYi55ID0gYS55ICsgYS5yb3dzO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHZlcnRpY2FsIGNvbGxpc2lvbnMgd2hlbiBpbnNlcnRpbmcgYSBuZXcgY2FyZCBhdCAobmV3Tm9kZS54LCBuZXdOb2RlLnkpLlxuICogQW55IGV4aXN0aW5nIGNhcmQgdGhhdCBob3Jpem9udGFsbHkgb3ZlcmxhcHMgYW5kIHdob3NlIHZlcnRpY2FsIHNwYW4gb3ZlcmxhcHNcbiAqIG9yIGlzIGJlbG93IHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgcHVzaGVkIGRvd24gc28gdGhlcmUgaXMgbm8gb3ZlcmxhcC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDb2xsaXNpb25zQW5kSW5zZXJ0ID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICBuZXdOb2RlOiBUX2dyaWRMYXlvdXRfbm9kZSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBpdGVtcyA9IFsuLi5jaGlsZHJlbl07XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgaE92ZXJsYXAgPSAhKGl0ZW0ueCArIGl0ZW0uY29scyA8PSBuZXdOb2RlLnggfHwgaXRlbS54ID49IG5ld05vZGUueCArIG5ld05vZGUuY29scyk7XG4gICAgY29uc3Qgdk92ZXJsYXAgPSAhKGl0ZW0ueSArIGl0ZW0ucm93cyA8PSBuZXdOb2RlLnkgfHwgaXRlbS55ID49IG5ld05vZGUueSArIG5ld05vZGUucm93cyk7XG5cbiAgICBpZiAoaE92ZXJsYXAgJiYgdk92ZXJsYXApIHtcbiAgICAgIGl0ZW0ueSA9IG5ld05vZGUueSArIG5ld05vZGUucm93cztcbiAgICB9XG4gIH1cblxuICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xuICBsZXQgY2hhbmdlZCA9IHRydWU7XG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hhbmdlZCA9IGFkanVzdEl0ZW1QYWlyKGl0ZW1zW2ldLCBpdGVtc1tqXSkgfHwgY2hhbmdlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHJvcFBheWxvYWQ8VD4oYWN0aXZlUGF5bG9hZDogVCB8IHVuZGVmaW5lZCwgZGF0YVRyYW5zZmVyOiBEYXRhVHJhbnNmZXIgfCBudWxsKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmIChhY3RpdmVQYXlsb2FkKSB7XG4gICAgcmV0dXJuIGFjdGl2ZVBheWxvYWQ7XG4gIH1cbiAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicpO1xuXG4gICAgICBpZiAocmF3KSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElfaG92ZXJlZEdyb3VwIHtcbiAgZ3JvdXBOb2RlOiBUX2dyaWRMYXlvdXRfbm9kZTtcbiAgZ3JvdXBHcmlkc3RlcjogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kSG92ZXJlZEdyb3VwID0gKFxuICBlbGVtZW50czogRWxlbWVudFtdLFxuICBjYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50LFxuICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSxcbik6IElfaG92ZXJlZEdyb3VwIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3Qgcm9vdEdyaWRzdGVyID0gY2FudmFzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJyk7XG5cbiAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGdyaWRzdGVyRWwgPSAoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ3JpZHN0ZXInID8gZWwgOiBlbC5jbG9zZXN0KCdncmlkc3RlcicpKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoZ3JpZHN0ZXJFbCAmJiBncmlkc3RlckVsICE9PSByb290R3JpZHN0ZXIpIHtcbiAgICAgIGNvbnN0IG91dGVySXRlbSA9IGdyaWRzdGVyRWwuY2xvc2VzdCgnZ3JpZHN0ZXItaXRlbScpO1xuICAgICAgY29uc3Qgcm9vdEl0ZW1zID0gcm9vdEdyaWRzdGVyID8gQXJyYXkuZnJvbShyb290R3JpZHN0ZXIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gZ3JpZHN0ZXItaXRlbScpKSA6IFtdO1xuICAgICAgY29uc3QgaWR4ID0gb3V0ZXJJdGVtID8gcm9vdEl0ZW1zLmluZGV4T2Yob3V0ZXJJdGVtKSA6IC0xO1xuXG4gICAgICBpZiAoaWR4ID49IDAgJiYgcm9vdC5jaGlsZHJlbj8uW2lkeF0pIHtcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBOb2RlOiByb290LmNoaWxkcmVuW2lkeF0sIGdyb3VwR3JpZHN0ZXI6IGdyaWRzdGVyRWwgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgaXRlbUVsID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ3JpZHN0ZXItaXRlbScgPyBlbCA6IGVsLmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcbiAgICBpZiAoIWl0ZW1FbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJvb3RJdGVtcyA9IHJvb3RHcmlkc3RlciA/IEFycmF5LmZyb20ocm9vdEdyaWRzdGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IGdyaWRzdGVyLWl0ZW0nKSkgOiBbXTtcbiAgICBjb25zdCBpZHggPSByb290SXRlbXMuaW5kZXhPZihpdGVtRWwpO1xuICAgIGlmIChpZHggPj0gMCAmJiByb290LmNoaWxkcmVuPy5baWR4XSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHJvb3QuY2hpbGRyZW5baWR4XTtcbiAgICAgIGlmICgobm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgICAgICByZXR1cm4geyBncm91cE5vZGU6IG5vZGUsIGdyb3VwR3JpZHN0ZXI6IChpdGVtRWwucXVlcnlTZWxlY3RvcignZ3JpZHN0ZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpID8/IChpdGVtRWwgYXMgSFRNTEVsZW1lbnQpIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBzbmFwcGVkIHNwYXRpYWwgY29vcmRpbmF0ZXMgYW5kIHBpeGVsIGRpbWVuc2lvbnMgZm9yIGRyb3AgZ2hvc3QgcHJldmlldyBib3guXG4gKi9cbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVEcm9wR2hvc3QgPSAoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGNhbnZhc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gIHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlLFxuICBwYXlsb2FkOiBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgdG90YWxDb2xzID0gMjQsXG4pOiBUX2dyaWRMYXlvdXRfZHJvcEdob3N0IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWNhbnZhc0NvbnRhaW5lcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjYXJkVGl0bGUgPSBwYXlsb2FkLnRpdGxlIHx8ICdUaOG6uyc7XG4gIGNvbnN0IGNhcmRJY29uQ2xhc3MgPSBwYXlsb2FkLmljb25DbGFzcztcbiAgY29uc3QgY2FyZEljb25UZXh0ID0gcGF5bG9hZC5pY29uVGV4dDtcbiAgY29uc3QgcGF5bG9hZEFueSA9IHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxldCBkZWZhdWx0Q29scyA9IHR5cGVvZiBwYXlsb2FkLmNvbHMgPT09ICdudW1iZXInXG4gICAgPyBwYXlsb2FkLmNvbHNcbiAgICA6ICh0eXBlb2YgcGF5bG9hZEFueVsnZGVmYXVsdENvbHMnXSA9PT0gJ251bWJlcicgPyAocGF5bG9hZEFueVsnZGVmYXVsdENvbHMnXSBhcyBudW1iZXIpIDogKHRvdGFsQ29scyA+PSAyNCA/IDEyIDogNikpO1xuICBsZXQgZGVmYXVsdFJvd3MgPSB0eXBlb2YgcGF5bG9hZC5yb3dzID09PSAnbnVtYmVyJ1xuICAgID8gcGF5bG9hZC5yb3dzXG4gICAgOiAodHlwZW9mIHBheWxvYWRBbnlbJ2RlZmF1bHRSb3dzJ10gPT09ICdudW1iZXInID8gKHBheWxvYWRBbnlbJ2RlZmF1bHRSb3dzJ10gYXMgbnVtYmVyKSA6IDQpO1xuXG4gIGlmICh0eXBlb2YgcGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW1wbGUgPSAocGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSBhcyAoaW5zaWRlOiBib29sZWFuKSA9PiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSB8IHVuZGVmaW5lZCkoZmFsc2UpO1xuICAgICAgaWYgKHNhbXBsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNhbXBsZS5jb2xzID09PSAnbnVtYmVyJykgeyBkZWZhdWx0Q29scyA9IHNhbXBsZS5jb2xzOyB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlLnJvd3MgPT09ICdudW1iZXInKSB7IGRlZmF1bHRSb3dzID0gc2FtcGxlLnJvd3M7IH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgY29scyBhbmQgcm93c1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YWdlRWwgPSAoY2FudmFzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNiaS1jYW52YXMtc3RhZ2UnKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpID8/IGNhbnZhc0NvbnRhaW5lcjtcbiAgY29uc3Qgc3RhZ2VSZWN0ID0gc3RhZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCByb290R3JpZHN0ZXIgPSBzdGFnZUVsLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBncmlkc3RlckVsID0gcm9vdEdyaWRzdGVyID8/IHN0YWdlRWw7XG4gIGNvbnN0IGdyaWRzdGVyUmVjdCA9IGdyaWRzdGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHVuc2NhbGVkV2lkdGggPSBncmlkc3RlckVsLm9mZnNldFdpZHRoIHx8IGdyaWRzdGVyRWwuY2xpZW50V2lkdGggfHwgMDtcbiAgY29uc3Qgem9vbSA9IChncmlkc3RlclJlY3Qud2lkdGggJiYgdW5zY2FsZWRXaWR0aCA+IDApXG4gICAgPyBNYXRoLm1heCgwLjIsIE1hdGgubWluKDMsIGdyaWRzdGVyUmVjdC53aWR0aCAvIHVuc2NhbGVkV2lkdGgpKVxuICAgIDogMTtcblxuICBjb25zdCBlbGVtZW50cyA9IHR5cGVvZiBkb2N1bWVudC5lbGVtZW50c0Zyb21Qb2ludCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcbiAgICA6IFtdO1xuICBjb25zdCBob3ZlcmVkID0gZmluZEhvdmVyZWRHcm91cChlbGVtZW50cywgY2FudmFzQ29udGFpbmVyLCByb290KTtcblxuICBjb25zdCBzdGFnZU1vdXNlWCA9IChldmVudC5jbGllbnRYIC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgY29uc3Qgc3RhZ2VNb3VzZVkgPSAoZXZlbnQuY2xpZW50WSAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcblxuICBpZiAoaG92ZXJlZCkge1xuICAgIGNvbnN0IHsgZ3JvdXBOb2RlLCBncm91cEdyaWRzdGVyIH0gPSBob3ZlcmVkO1xuICAgIGNvbnN0IGdyb3VwR3JpZHN0ZXJSZWN0ID0gZ3JvdXBHcmlkc3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBncm91cFN0YWdlTGVmdCA9IChncm91cEdyaWRzdGVyUmVjdC5sZWZ0IC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgICBjb25zdCBncm91cFN0YWdlVG9wID0gKGdyb3VwR3JpZHN0ZXJSZWN0LnRvcCAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcblxuICAgIGxldCBpbm5lckNvbHMgPSBkZWZhdWx0Q29scztcbiAgICBsZXQgaW5uZXJSb3dzID0gZGVmYXVsdFJvd3M7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkQW55WydyZXNvbHZlTm9kZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzYW1wbGVJbnNpZGUgPSAocGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSBhcyAoaW5zaWRlOiBib29sZWFuKSA9PiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSB8IHVuZGVmaW5lZCkodHJ1ZSk7XG4gICAgICAgIGlmIChzYW1wbGVJbnNpZGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZUluc2lkZS5jb2xzID09PSAnbnVtYmVyJykgeyBpbm5lckNvbHMgPSBzYW1wbGVJbnNpZGUuY29sczsgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlSW5zaWRlLnJvd3MgPT09ICdudW1iZXInKSB7IGlubmVyUm93cyA9IHNhbXBsZUluc2lkZS5yb3dzOyB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IGNvbHMgYW5kIHJvd3NcbiAgICAgIH1cbiAgICB9XG4gICAgaW5uZXJDb2xzID0gTWF0aC5taW4oaW5uZXJDb2xzLCB0b3RhbENvbHMpO1xuXG4gICAgY29uc3QgZ3JvdXBXaWR0aCA9IGdyb3VwR3JpZHN0ZXIuY2xpZW50V2lkdGggfHwgKGdyb3VwR3JpZHN0ZXJSZWN0LndpZHRoIC8gem9vbSkgfHwgNDAwO1xuICAgIGNvbnN0IGNvbFN0ZXAgPSAoZ3JvdXBXaWR0aCArIDIpIC8gdG90YWxDb2xzO1xuICAgIGNvbnN0IHJvd1N0ZXAgPSAxODtcbiAgICBjb25zdCByZWxYID0gKGV2ZW50LmNsaWVudFggLSBncm91cEdyaWRzdGVyUmVjdC5sZWZ0KSAvIHpvb20gKyBncm91cEdyaWRzdGVyLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcmVsWSA9IChldmVudC5jbGllbnRZIC0gZ3JvdXBHcmlkc3RlclJlY3QudG9wKSAvIHpvb20gKyBncm91cEdyaWRzdGVyLnNjcm9sbFRvcDtcbiAgICBjb25zdCByYXdDb2wgPSBNYXRoLmZsb29yKHJlbFggLyBjb2xTdGVwKTtcbiAgICBjb25zdCByYXdSb3cgPSBNYXRoLmZsb29yKHJlbFkgLyByb3dTdGVwKTtcbiAgICBjb25zdCBzbmFwID0gZmluZFNuYXBQb3NpdGlvbkluc2lkZUdyb3VwKFxuICAgICAgZ3JvdXBOb2RlLmNoaWxkcmVuID8/IFtdLFxuICAgICAgcmF3Q29sLFxuICAgICAgcmF3Um93LFxuICAgICAgaW5uZXJDb2xzLFxuICAgICAgaW5uZXJSb3dzLFxuICAgICAgdG90YWxDb2xzLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBzbmFwLmNvbCxcbiAgICAgIHJvdzogc25hcC5yb3csXG4gICAgICBjb2xzOiBpbm5lckNvbHMsXG4gICAgICByb3dzOiBpbm5lclJvd3MsXG4gICAgICBwaXhlbExlZnQ6IGdyb3VwU3RhZ2VMZWZ0ICsgc25hcC5jb2wgKiBjb2xTdGVwLFxuICAgICAgcGl4ZWxUb3A6IGdyb3VwU3RhZ2VUb3AgKyBzbmFwLnJvdyAqIHJvd1N0ZXAsXG4gICAgICBwaXhlbFdpZHRoOiBNYXRoLm1heCgzMCwgaW5uZXJDb2xzICogY29sU3RlcCAtIDIpLFxuICAgICAgcGl4ZWxIZWlnaHQ6IE1hdGgubWF4KDIwLCBpbm5lclJvd3MgKiByb3dTdGVwIC0gMiksXG4gICAgICBpc0luc2lkZUdyb3VwOiB0cnVlLFxuICAgICAgdGFyZ2V0UGFyZW50SWQ6IGdyb3VwTm9kZS5pZCxcbiAgICAgIGdyb3VwVGl0bGU6ICdLaOG7kWkgZ2jDqXAnLFxuICAgICAgY2FyZFRpdGxlLFxuICAgICAgY2FyZEljb25DbGFzcyxcbiAgICAgIGNhcmRJY29uVGV4dCxcbiAgICAgIGhvdmVyZWRHcmlkc3RlcjogZ3JvdXBHcmlkc3RlciBhcyBIVE1MRWxlbWVudCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWFyZ2luID0gMTI7XG4gIGNvbnN0IHJvd1N0ZXAgPSA2ODtcbiAgY29uc3QgZ3JpZHN0ZXJXaWR0aCA9IHVuc2NhbGVkV2lkdGggfHwgZ3JpZHN0ZXJFbC5jbGllbnRXaWR0aCB8fCAxMjAwO1xuICBjb25zdCBjb2xTdGVwID0gTWF0aC5tYXgoMjAsIChncmlkc3RlcldpZHRoIC0gbWFyZ2luKSAvIHRvdGFsQ29scyk7XG4gIGNvbnN0IGdyaWRzdGVyU3RhZ2VMZWZ0ID0gKGdyaWRzdGVyUmVjdC5sZWZ0IC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgY29uc3QgZ3JpZHN0ZXJTdGFnZVRvcCA9IChncmlkc3RlclJlY3QudG9wIC0gc3RhZ2VSZWN0LnRvcCkgLyB6b29tO1xuICBjb25zdCByZWxYID0gc3RhZ2VNb3VzZVggLSBncmlkc3RlclN0YWdlTGVmdCArIGdyaWRzdGVyRWwuc2Nyb2xsTGVmdCAtIG1hcmdpbjtcbiAgY29uc3QgcmVsWSA9IHN0YWdlTW91c2VZIC0gZ3JpZHN0ZXJTdGFnZVRvcCArIGdyaWRzdGVyRWwuc2Nyb2xsVG9wIC0gbWFyZ2luO1xuICBjb25zdCBpdGVtQ29scyA9IE1hdGgubWluKGRlZmF1bHRDb2xzLCB0b3RhbENvbHMpO1xuICBjb25zdCBjb2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0b3RhbENvbHMgLSBpdGVtQ29scywgTWF0aC5mbG9vcihyZWxYIC8gY29sU3RlcCkpKTtcbiAgY29uc3Qgcm93ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZWxZIC8gcm93U3RlcCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29sLFxuICAgIHJvdyxcbiAgICBjb2xzOiBpdGVtQ29scyxcbiAgICByb3dzOiBkZWZhdWx0Um93cyxcbiAgICBwaXhlbExlZnQ6IGdyaWRzdGVyU3RhZ2VMZWZ0ICsgbWFyZ2luICsgY29sICogY29sU3RlcCxcbiAgICBwaXhlbFRvcDogZ3JpZHN0ZXJTdGFnZVRvcCArIG1hcmdpbiArIHJvdyAqIHJvd1N0ZXAsXG4gICAgcGl4ZWxXaWR0aDogaXRlbUNvbHMgKiBjb2xTdGVwIC0gbWFyZ2luLFxuICAgIHBpeGVsSGVpZ2h0OiBkZWZhdWx0Um93cyAqIHJvd1N0ZXAgLSBtYXJnaW4sXG4gICAgaXNJbnNpZGVHcm91cDogZmFsc2UsXG4gICAgY2FyZFRpdGxlLFxuICAgIGNhcmRJY29uQ2xhc3MsXG4gICAgY2FyZEljb25UZXh0LFxuICAgIGhvdmVyZWRHcmlkc3RlcjogKHJvb3RHcmlkc3RlciBhcyBIVE1MRWxlbWVudCkgPz8gdW5kZWZpbmVkLFxuICB9O1xufTtcbiJdfQ==
256
+ /** Tìm khối theo id trong cây, đi sâu vào mọi container. */
257
+ export const findNodeRecursive = (root, id) => {
258
+ if (root.id === id) {
259
+ return root;
260
+ }
261
+ for (const child of root.children ?? []) {
262
+ const found = findNodeRecursive(child, id);
263
+ if (found) {
264
+ return found;
265
+ }
266
+ }
267
+ return undefined;
268
+ };
269
+ /** Tìm khối CHA trực tiếp của một khối, đi sâu vào mọi container. */
270
+ export const findParentRecursive = (root, id) => {
271
+ for (const child of root.children ?? []) {
272
+ if (child.id === id) {
273
+ return root;
274
+ }
275
+ const found = findParentRecursive(child, id);
276
+ if (found) {
277
+ return found;
278
+ }
279
+ }
280
+ return undefined;
281
+ };
282
+ /**
283
+ * Thả khối vào đúng ô mà ghost đang chỉ, đẩy các khối va chạm xuống dưới.
284
+ *
285
+ * Ghost đang nằm trong một container (`isInsideGroup`) thì thả vào ruột container đó; không tìm thấy
286
+ * container thì trả `false` chứ KHÔNG rơi về lưới gốc — thả nhầm cấp khó nhận ra hơn là không thả.
287
+ */
288
+ export const dropNodeAtCoordinates = (root, ghost, newNode) => {
289
+ const nodeToAdd = {
290
+ ...newNode,
291
+ id: newNode.id ?? uuid(),
292
+ x: ghost.col,
293
+ y: ghost.row,
294
+ cols: ghost.cols,
295
+ rows: ghost.rows,
296
+ };
297
+ if (ghost.isInsideGroup && ghost.targetParentId) {
298
+ const parentNode = findNodeRecursive(root, ghost.targetParentId);
299
+ if (!parentNode) {
300
+ return false;
301
+ }
302
+ parentNode.children = parentNode.children ?? [];
303
+ resolveCollisionsAndInsert(parentNode.children, nodeToAdd);
304
+ return true;
305
+ }
306
+ root.children = root.children ?? [];
307
+ resolveCollisionsAndInsert(root.children, nodeToAdd);
308
+ return true;
309
+ };
310
+ /** Khối có phải CONTAINER không — tức có khối con bên trong. */
311
+ export const isContainerNode = (node) => (node.children?.length ?? 0) > 0;
312
+ /** Khối có nằm LỒNG bên trong một container không (không phải con trực tiếp của gốc). */
313
+ export const isNodeNestedInside = (root, nodeId) => {
314
+ if (!root?.children) {
315
+ return false;
316
+ }
317
+ return !root.children.some((child) => child.id === nodeId);
318
+ };
319
+ /**
320
+ * Có được đổi khối đơn ↔ container không.
321
+ *
322
+ * 🔴 Ba hàm cờ này PHẢI là nguồn duy nhất cho cả thanh công cụ của thư viện lẫn menu do nơi dùng tự
323
+ * dựng. Trước đây nơi dùng phải chép lại quy tắc để dựng menu trước lúc render, và hai bản lệch nhau
324
+ * mỗi khi thư viện đổi trần lồng cấp mà không có gì báo.
325
+ */
326
+ export const canToggleTypeNode = (root, node) => isContainerNode(node) || !isNodeNestedInside(root, node.id);
327
+ /** Có được thêm khối vào BÊN TRONG khối này không. */
328
+ export const canAddInsideNode = (root, node) => isContainerNode(node) && !isNodeNestedInside(root, node.id);
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGlzaW9uLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvY29sbGlzaW9uLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLFFBQWtDLEVBQ2xDLENBQVMsRUFDVCxDQUFTLEVBQ1QsSUFBWSxFQUNaLElBQVksRUFDWixTQUFrQixFQUNULEVBQUU7SUFDWCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVyRSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxRQUFrQyxFQUNsQyxNQUFjLEVBQ2QsTUFBYyxFQUNkLFNBQWlC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dGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25ld05vZGUsXG4gIFRfZ3JpZExheW91dF9ub2RlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyaWQtbGF5b3V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSByZWN0YW5ndWxhciByZWdpb24gW3gsIHggKyBjb2xzKSB4IFt5LCB5ICsgcm93cylcbiAqIGlzIGNvbXBsZXRlbHkgdmFjYW50IGFtb25nIGV4aXN0aW5nIGl0ZW1zLlxuICovXG5leHBvcnQgY29uc3QgaXNSZWdpb25GcmVlID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgY29sczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4gIGlnbm9yZWRJZD86IHN0cmluZyxcbik6IGJvb2xlYW4gPT4ge1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKGlnbm9yZWRJZCAmJiBjaGlsZC5pZCA9PT0gaWdub3JlZElkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaE92ZXJsYXAgPSAhKGNoaWxkLnggKyBjaGlsZC5jb2xzIDw9IHggfHwgY2hpbGQueCA+PSB4ICsgY29scyk7XG4gICAgY29uc3Qgdk92ZXJsYXAgPSAhKGNoaWxkLnkgKyBjaGlsZC5yb3dzIDw9IHkgfHwgY2hpbGQueSA+PSB5ICsgcm93cyk7XG5cbiAgICBpZiAoaE92ZXJsYXAgJiYgdk92ZXJsYXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgb3B0aW1hbCAoY29sLCByb3cpIGluc2lkZSBhIGdyb3VwIGNvbnRhaW5lci5cbiAqIFNuYXBzIGZsdXNoIHRvIGFkamFjZW50IGNhcmQgcmlnaHQgZWRnZSBpZiBzbG90IGlzIHZhY2FudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRTbmFwUG9zaXRpb25JbnNpZGVHcm91cCA9IChcbiAgY2hpbGRyZW46IEFycmF5PFRfZ3JpZExheW91dF9ub2RlPixcbiAgcmF3Q29sOiBudW1iZXIsXG4gIHJhd1JvdzogbnVtYmVyLFxuICBpbm5lckNvbHM6IG51bWJlcixcbiAgaW5uZXJSb3dzOiBudW1iZXIsXG4gIHRvdGFsQ29scyA9IDI0LFxuKTogeyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXIgfSA9PiB7XG4gIGxldCBiZXN0Q2FuZGlkYXRlOiB7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlcjsgZGlzdDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGNvbnN0IHJpZ2h0RWRnZSA9IGNoaWxkLnggKyBjaGlsZC5jb2xzO1xuICAgIGNvbnN0IGNhbkZpdCA9IHJpZ2h0RWRnZSArIGlubmVyQ29scyA8PSB0b3RhbENvbHM7XG4gICAgY29uc3QgaXNGcmVlID0gY2FuRml0ICYmIGlzUmVnaW9uRnJlZShjaGlsZHJlbiwgcmlnaHRFZGdlLCBjaGlsZC55LCBpbm5lckNvbHMsIGlubmVyUm93cyk7XG5cbiAgICBpZiAoIWlzRnJlZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmVhclggPSBNYXRoLmFicyhyYXdDb2wgLSByaWdodEVkZ2UpIDw9IDIgfHwgKHJhd0NvbCA+PSBjaGlsZC54ICsgTWF0aC5mbG9vcihjaGlsZC5jb2xzIC8gMikgJiYgcmF3Q29sIDw9IHJpZ2h0RWRnZSArIDEpO1xuICAgIGNvbnN0IG5lYXJZID0gTWF0aC5hYnMocmF3Um93IC0gY2hpbGQueSkgPD0gMjtcblxuICAgIGlmIChuZWFyWCAmJiBuZWFyWSkge1xuICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKHJhd0NvbCAtIHJpZ2h0RWRnZSkgKyBNYXRoLmFicyhyYXdSb3cgLSBjaGlsZC55KTtcblxuICAgICAgaWYgKCFiZXN0Q2FuZGlkYXRlIHx8IGRpc3QgPCBiZXN0Q2FuZGlkYXRlLmRpc3QpIHtcbiAgICAgICAgYmVzdENhbmRpZGF0ZSA9IHsgY29sOiByaWdodEVkZ2UsIHJvdzogY2hpbGQueSwgZGlzdCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChiZXN0Q2FuZGlkYXRlKSB7XG4gICAgcmV0dXJuIHsgY29sOiBiZXN0Q2FuZGlkYXRlLmNvbCwgcm93OiBiZXN0Q2FuZGlkYXRlLnJvdyB9O1xuICB9XG5cbiAgY29uc3QgY2xhbXBlZENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRvdGFsQ29scyAtIGlubmVyQ29scywgcmF3Q29sKSk7XG4gIGNvbnN0IGNsYW1wZWRSb3cgPSBNYXRoLm1heCgwLCByYXdSb3cpO1xuXG4gIHJldHVybiB7IGNvbDogY2xhbXBlZENvbCwgcm93OiBjbGFtcGVkUm93IH07XG59O1xuXG4vKipcbiAqIEFkanVzdHMgcG9zaXRpb24gb2YgcGFpciBpZiBob3Jpem9udGFsIG92ZXJsYXAgb2NjdXJzLlxuICovXG5jb25zdCBhZGp1c3RJdGVtUGFpciA9IChhOiBUX2dyaWRMYXlvdXRfbm9kZSwgYjogVF9ncmlkTGF5b3V0X25vZGUpOiBib29sZWFuID0+IHtcbiAgY29uc3QgaE92ZXJsYXAgPSAhKGEueCArIGEuY29scyA8PSBiLnggfHwgYS54ID49IGIueCArIGIuY29scyk7XG5cbiAgaWYgKGhPdmVybGFwICYmIGIueSA8IGEueSArIGEucm93cykge1xuICAgIGIueSA9IGEueSArIGEucm93cztcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyB2ZXJ0aWNhbCBjb2xsaXNpb25zIHdoZW4gaW5zZXJ0aW5nIGEgbmV3IGNhcmQgYXQgKG5ld05vZGUueCwgbmV3Tm9kZS55KS5cbiAqIEFueSBleGlzdGluZyBjYXJkIHRoYXQgaG9yaXpvbnRhbGx5IG92ZXJsYXBzIGFuZCB3aG9zZSB2ZXJ0aWNhbCBzcGFuIG92ZXJsYXBzXG4gKiBvciBpcyBiZWxvdyB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIHB1c2hlZCBkb3duIHNvIHRoZXJlIGlzIG5vIG92ZXJsYXAuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQ29sbGlzaW9uc0FuZEluc2VydCA9IChcbiAgY2hpbGRyZW46IEFycmF5PFRfZ3JpZExheW91dF9ub2RlPixcbiAgbmV3Tm9kZTogVF9ncmlkTGF5b3V0X25vZGUsXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaXRlbXMgPSBbLi4uY2hpbGRyZW5dO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGhPdmVybGFwID0gIShpdGVtLnggKyBpdGVtLmNvbHMgPD0gbmV3Tm9kZS54IHx8IGl0ZW0ueCA+PSBuZXdOb2RlLnggKyBuZXdOb2RlLmNvbHMpO1xuICAgIGNvbnN0IHZPdmVybGFwID0gIShpdGVtLnkgKyBpdGVtLnJvd3MgPD0gbmV3Tm9kZS55IHx8IGl0ZW0ueSA+PSBuZXdOb2RlLnkgKyBuZXdOb2RlLnJvd3MpO1xuXG4gICAgaWYgKGhPdmVybGFwICYmIHZPdmVybGFwKSB7XG4gICAgICBpdGVtLnkgPSBuZXdOb2RlLnkgKyBuZXdOb2RlLnJvd3M7XG4gICAgfVxuICB9XG5cbiAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS55IC0gYi55KTtcbiAgbGV0IGNoYW5nZWQgPSB0cnVlO1xuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoYW5nZWQgPSBhZGp1c3RJdGVtUGFpcihpdGVtc1tpXSwgaXRlbXNbal0pIHx8IGNoYW5nZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURyb3BQYXlsb2FkPFQ+KGFjdGl2ZVBheWxvYWQ6IFQgfCB1bmRlZmluZWQsIGRhdGFUcmFuc2ZlcjogRGF0YVRyYW5zZmVyIHwgbnVsbCk6IFQgfCB1bmRlZmluZWQge1xuICBpZiAoYWN0aXZlUGF5bG9hZCkge1xuICAgIHJldHVybiBhY3RpdmVQYXlsb2FkO1xuICB9XG4gIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ2FwcGxpY2F0aW9uL2pzb24nKTtcblxuICAgICAgaWYgKHJhdykge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJX2hvdmVyZWRHcm91cCB7XG4gIGdyb3VwTm9kZTogVF9ncmlkTGF5b3V0X25vZGU7XG4gIGdyb3VwR3JpZHN0ZXI6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgZmluZEhvdmVyZWRHcm91cCA9IChcbiAgZWxlbWVudHM6IEVsZW1lbnRbXSxcbiAgY2FudmFzQ29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgcm9vdDogVF9ncmlkTGF5b3V0X25vZGUsXG4pOiBJX2hvdmVyZWRHcm91cCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJvb3RHcmlkc3RlciA9IGNhbnZhc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdncmlkc3RlcicpO1xuXG4gIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBncmlkc3RlckVsID0gKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dyaWRzdGVyJyA/IGVsIDogZWwuY2xvc2VzdCgnZ3JpZHN0ZXInKSkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKGdyaWRzdGVyRWwgJiYgZ3JpZHN0ZXJFbCAhPT0gcm9vdEdyaWRzdGVyKSB7XG4gICAgICBjb25zdCBvdXRlckl0ZW0gPSBncmlkc3RlckVsLmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcbiAgICAgIGNvbnN0IHJvb3RJdGVtcyA9IHJvb3RHcmlkc3RlciA/IEFycmF5LmZyb20ocm9vdEdyaWRzdGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IGdyaWRzdGVyLWl0ZW0nKSkgOiBbXTtcbiAgICAgIGNvbnN0IGlkeCA9IG91dGVySXRlbSA/IHJvb3RJdGVtcy5pbmRleE9mKG91dGVySXRlbSkgOiAtMTtcblxuICAgICAgaWYgKGlkeCA+PSAwICYmIHJvb3QuY2hpbGRyZW4/LltpZHhdKSB7XG4gICAgICAgIHJldHVybiB7IGdyb3VwTm9kZTogcm9vdC5jaGlsZHJlbltpZHhdLCBncm91cEdyaWRzdGVyOiBncmlkc3RlckVsIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGl0ZW1FbCA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dyaWRzdGVyLWl0ZW0nID8gZWwgOiBlbC5jbG9zZXN0KCdncmlkc3Rlci1pdGVtJyk7XG4gICAgaWYgKCFpdGVtRWwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByb290SXRlbXMgPSByb290R3JpZHN0ZXIgPyBBcnJheS5mcm9tKHJvb3RHcmlkc3Rlci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiBncmlkc3Rlci1pdGVtJykpIDogW107XG4gICAgY29uc3QgaWR4ID0gcm9vdEl0ZW1zLmluZGV4T2YoaXRlbUVsKTtcbiAgICBpZiAoaWR4ID49IDAgJiYgcm9vdC5jaGlsZHJlbj8uW2lkeF0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSByb290LmNoaWxkcmVuW2lkeF07XG4gICAgICBpZiAoKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBOb2RlOiBub2RlLCBncm91cEdyaWRzdGVyOiAoaXRlbUVsLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyAoaXRlbUVsIGFzIEhUTUxFbGVtZW50KSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgc25hcHBlZCBzcGF0aWFsIGNvb3JkaW5hdGVzIGFuZCBwaXhlbCBkaW1lbnNpb25zIGZvciBkcm9wIGdob3N0IHByZXZpZXcgYm94LlxuICovXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlRHJvcEdob3N0ID0gKFxuICBldmVudDogRHJhZ0V2ZW50LFxuICBjYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50LFxuICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSxcbiAgcGF5bG9hZDogVF9ncmlkTGF5b3V0X2V4dGVybmFsRHJhZ1BheWxvYWQsXG4gIHRvdGFsQ29scyA9IDI0LFxuKTogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICFjYW52YXNDb250YWluZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY2FyZFRpdGxlID0gcGF5bG9hZC50aXRsZSB8fCAnVGjhursnO1xuICBjb25zdCBjYXJkSWNvbkNsYXNzID0gcGF5bG9hZC5pY29uQ2xhc3M7XG4gIGNvbnN0IGNhcmRJY29uVGV4dCA9IHBheWxvYWQuaWNvblRleHQ7XG4gIGNvbnN0IHBheWxvYWRBbnkgPSBwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsZXQgZGVmYXVsdENvbHMgPSB0eXBlb2YgcGF5bG9hZC5jb2xzID09PSAnbnVtYmVyJ1xuICAgID8gcGF5bG9hZC5jb2xzXG4gICAgOiAodHlwZW9mIHBheWxvYWRBbnlbJ2RlZmF1bHRDb2xzJ10gPT09ICdudW1iZXInID8gKHBheWxvYWRBbnlbJ2RlZmF1bHRDb2xzJ10gYXMgbnVtYmVyKSA6ICh0b3RhbENvbHMgPj0gMjQgPyAxMiA6IDYpKTtcbiAgbGV0IGRlZmF1bHRSb3dzID0gdHlwZW9mIHBheWxvYWQucm93cyA9PT0gJ251bWJlcidcbiAgICA/IHBheWxvYWQucm93c1xuICAgIDogKHR5cGVvZiBwYXlsb2FkQW55WydkZWZhdWx0Um93cyddID09PSAnbnVtYmVyJyA/IChwYXlsb2FkQW55WydkZWZhdWx0Um93cyddIGFzIG51bWJlcikgOiA0KTtcblxuICBpZiAodHlwZW9mIHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FtcGxlID0gKHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gYXMgKGluc2lkZTogYm9vbGVhbikgPT4gVF9ncmlkTGF5b3V0X25ld05vZGUgfCB1bmRlZmluZWQpKGZhbHNlKTtcbiAgICAgIGlmIChzYW1wbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGUuY29scyA9PT0gJ251bWJlcicpIHsgZGVmYXVsdENvbHMgPSBzYW1wbGUuY29sczsgfVxuICAgICAgICBpZiAodHlwZW9mIHNhbXBsZS5yb3dzID09PSAnbnVtYmVyJykgeyBkZWZhdWx0Um93cyA9IHNhbXBsZS5yb3dzOyB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IGNvbHMgYW5kIHJvd3NcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGFnZUVsID0gKGNhbnZhc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYmktY2FudmFzLXN0YWdlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyBjYW52YXNDb250YWluZXI7XG4gIGNvbnN0IHN0YWdlUmVjdCA9IHN0YWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3Qgcm9vdEdyaWRzdGVyID0gc3RhZ2VFbC5xdWVyeVNlbGVjdG9yKCdncmlkc3RlcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY29uc3QgZ3JpZHN0ZXJFbCA9IHJvb3RHcmlkc3RlciA/PyBzdGFnZUVsO1xuICBjb25zdCBncmlkc3RlclJlY3QgPSBncmlkc3RlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB1bnNjYWxlZFdpZHRoID0gZ3JpZHN0ZXJFbC5vZmZzZXRXaWR0aCB8fCBncmlkc3RlckVsLmNsaWVudFdpZHRoIHx8IDA7XG4gIGNvbnN0IHpvb20gPSAoZ3JpZHN0ZXJSZWN0LndpZHRoICYmIHVuc2NhbGVkV2lkdGggPiAwKVxuICAgID8gTWF0aC5tYXgoMC4yLCBNYXRoLm1pbigzLCBncmlkc3RlclJlY3Qud2lkdGggLyB1bnNjYWxlZFdpZHRoKSlcbiAgICA6IDE7XG5cbiAgY29uc3QgZWxlbWVudHMgPSB0eXBlb2YgZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQgPT09ICdmdW5jdGlvbidcbiAgICA/IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG4gICAgOiBbXTtcbiAgY29uc3QgaG92ZXJlZCA9IGZpbmRIb3ZlcmVkR3JvdXAoZWxlbWVudHMsIGNhbnZhc0NvbnRhaW5lciwgcm9vdCk7XG5cbiAgY29uc3Qgc3RhZ2VNb3VzZVggPSAoZXZlbnQuY2xpZW50WCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gIGNvbnN0IHN0YWdlTW91c2VZID0gKGV2ZW50LmNsaWVudFkgLSBzdGFnZVJlY3QudG9wKSAvIHpvb207XG5cbiAgaWYgKGhvdmVyZWQpIHtcbiAgICBjb25zdCB7IGdyb3VwTm9kZSwgZ3JvdXBHcmlkc3RlciB9ID0gaG92ZXJlZDtcbiAgICBjb25zdCBncm91cEdyaWRzdGVyUmVjdCA9IGdyb3VwR3JpZHN0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZ3JvdXBTdGFnZUxlZnQgPSAoZ3JvdXBHcmlkc3RlclJlY3QubGVmdCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gICAgY29uc3QgZ3JvdXBTdGFnZVRvcCA9IChncm91cEdyaWRzdGVyUmVjdC50b3AgLSBzdGFnZVJlY3QudG9wKSAvIHpvb207XG5cbiAgICBsZXQgaW5uZXJDb2xzID0gZGVmYXVsdENvbHM7XG4gICAgbGV0IGlubmVyUm93cyA9IGRlZmF1bHRSb3dzO1xuICAgIGlmICh0eXBlb2YgcGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2FtcGxlSW5zaWRlID0gKHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gYXMgKGluc2lkZTogYm9vbGVhbikgPT4gVF9ncmlkTGF5b3V0X25ld05vZGUgfCB1bmRlZmluZWQpKHRydWUpO1xuICAgICAgICBpZiAoc2FtcGxlSW5zaWRlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGVJbnNpZGUuY29scyA9PT0gJ251bWJlcicpIHsgaW5uZXJDb2xzID0gc2FtcGxlSW5zaWRlLmNvbHM7IH1cbiAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZUluc2lkZS5yb3dzID09PSAnbnVtYmVyJykgeyBpbm5lclJvd3MgPSBzYW1wbGVJbnNpZGUucm93czsgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gZGVmYXVsdCBjb2xzIGFuZCByb3dzXG4gICAgICB9XG4gICAgfVxuICAgIGlubmVyQ29scyA9IE1hdGgubWluKGlubmVyQ29scywgdG90YWxDb2xzKTtcblxuICAgIGNvbnN0IGdyb3VwV2lkdGggPSBncm91cEdyaWRzdGVyLmNsaWVudFdpZHRoIHx8IChncm91cEdyaWRzdGVyUmVjdC53aWR0aCAvIHpvb20pIHx8IDQwMDtcbiAgICBjb25zdCBjb2xTdGVwID0gKGdyb3VwV2lkdGggKyAyKSAvIHRvdGFsQ29scztcbiAgICBjb25zdCByb3dTdGVwID0gMTg7XG4gICAgY29uc3QgcmVsWCA9IChldmVudC5jbGllbnRYIC0gZ3JvdXBHcmlkc3RlclJlY3QubGVmdCkgLyB6b29tICsgZ3JvdXBHcmlkc3Rlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHJlbFkgPSAoZXZlbnQuY2xpZW50WSAtIGdyb3VwR3JpZHN0ZXJSZWN0LnRvcCkgLyB6b29tICsgZ3JvdXBHcmlkc3Rlci5zY3JvbGxUb3A7XG4gICAgY29uc3QgcmF3Q29sID0gTWF0aC5mbG9vcihyZWxYIC8gY29sU3RlcCk7XG4gICAgY29uc3QgcmF3Um93ID0gTWF0aC5mbG9vcihyZWxZIC8gcm93U3RlcCk7XG4gICAgY29uc3Qgc25hcCA9IGZpbmRTbmFwUG9zaXRpb25JbnNpZGVHcm91cChcbiAgICAgIGdyb3VwTm9kZS5jaGlsZHJlbiA/PyBbXSxcbiAgICAgIHJhd0NvbCxcbiAgICAgIHJhd1JvdyxcbiAgICAgIGlubmVyQ29scyxcbiAgICAgIGlubmVyUm93cyxcbiAgICAgIHRvdGFsQ29scyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogc25hcC5jb2wsXG4gICAgICByb3c6IHNuYXAucm93LFxuICAgICAgY29sczogaW5uZXJDb2xzLFxuICAgICAgcm93czogaW5uZXJSb3dzLFxuICAgICAgcGl4ZWxMZWZ0OiBncm91cFN0YWdlTGVmdCArIHNuYXAuY29sICogY29sU3RlcCxcbiAgICAgIHBpeGVsVG9wOiBncm91cFN0YWdlVG9wICsgc25hcC5yb3cgKiByb3dTdGVwLFxuICAgICAgcGl4ZWxXaWR0aDogTWF0aC5tYXgoMzAsIGlubmVyQ29scyAqIGNvbFN0ZXAgLSAyKSxcbiAgICAgIHBpeGVsSGVpZ2h0OiBNYXRoLm1heCgyMCwgaW5uZXJSb3dzICogcm93U3RlcCAtIDIpLFxuICAgICAgaXNJbnNpZGVHcm91cDogdHJ1ZSxcbiAgICAgIHRhcmdldFBhcmVudElkOiBncm91cE5vZGUuaWQsXG4gICAgICBncm91cFRpdGxlOiAnS2jhu5FpIGdow6lwJyxcbiAgICAgIGNhcmRUaXRsZSxcbiAgICAgIGNhcmRJY29uQ2xhc3MsXG4gICAgICBjYXJkSWNvblRleHQsXG4gICAgICBob3ZlcmVkR3JpZHN0ZXI6IGdyb3VwR3JpZHN0ZXIgYXMgSFRNTEVsZW1lbnQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1hcmdpbiA9IDEyO1xuICBjb25zdCByb3dTdGVwID0gNjg7XG4gIGNvbnN0IGdyaWRzdGVyV2lkdGggPSB1bnNjYWxlZFdpZHRoIHx8IGdyaWRzdGVyRWwuY2xpZW50V2lkdGggfHwgMTIwMDtcbiAgY29uc3QgY29sU3RlcCA9IE1hdGgubWF4KDIwLCAoZ3JpZHN0ZXJXaWR0aCAtIG1hcmdpbikgLyB0b3RhbENvbHMpO1xuICBjb25zdCBncmlkc3RlclN0YWdlTGVmdCA9IChncmlkc3RlclJlY3QubGVmdCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gIGNvbnN0IGdyaWRzdGVyU3RhZ2VUb3AgPSAoZ3JpZHN0ZXJSZWN0LnRvcCAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcbiAgY29uc3QgcmVsWCA9IHN0YWdlTW91c2VYIC0gZ3JpZHN0ZXJTdGFnZUxlZnQgKyBncmlkc3RlckVsLnNjcm9sbExlZnQgLSBtYXJnaW47XG4gIGNvbnN0IHJlbFkgPSBzdGFnZU1vdXNlWSAtIGdyaWRzdGVyU3RhZ2VUb3AgKyBncmlkc3RlckVsLnNjcm9sbFRvcCAtIG1hcmdpbjtcbiAgY29uc3QgaXRlbUNvbHMgPSBNYXRoLm1pbihkZWZhdWx0Q29scywgdG90YWxDb2xzKTtcbiAgY29uc3QgY29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG90YWxDb2xzIC0gaXRlbUNvbHMsIE1hdGguZmxvb3IocmVsWCAvIGNvbFN0ZXApKSk7XG4gIGNvbnN0IHJvdyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVsWSAvIHJvd1N0ZXApKTtcblxuICByZXR1cm4ge1xuICAgIGNvbCxcbiAgICByb3csXG4gICAgY29sczogaXRlbUNvbHMsXG4gICAgcm93czogZGVmYXVsdFJvd3MsXG4gICAgcGl4ZWxMZWZ0OiBncmlkc3RlclN0YWdlTGVmdCArIG1hcmdpbiArIGNvbCAqIGNvbFN0ZXAsXG4gICAgcGl4ZWxUb3A6IGdyaWRzdGVyU3RhZ2VUb3AgKyBtYXJnaW4gKyByb3cgKiByb3dTdGVwLFxuICAgIHBpeGVsV2lkdGg6IGl0ZW1Db2xzICogY29sU3RlcCAtIG1hcmdpbixcbiAgICBwaXhlbEhlaWdodDogZGVmYXVsdFJvd3MgKiByb3dTdGVwIC0gbWFyZ2luLFxuICAgIGlzSW5zaWRlR3JvdXA6IGZhbHNlLFxuICAgIGNhcmRUaXRsZSxcbiAgICBjYXJkSWNvbkNsYXNzLFxuICAgIGNhcmRJY29uVGV4dCxcbiAgICBob3ZlcmVkR3JpZHN0ZXI6IChyb290R3JpZHN0ZXIgYXMgSFRNTEVsZW1lbnQpID8/IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cblxuLyoqIFTDrG0ga2jhu5FpIHRoZW8gaWQgdHJvbmcgY8OieSwgxJFpIHPDonUgdsOgbyBt4buNaSBjb250YWluZXIuICovXG5leHBvcnQgY29uc3QgZmluZE5vZGVSZWN1cnNpdmUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUsIGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyb290LmlkID09PSBpZCkge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiByb290LmNoaWxkcmVuID8/IFtdKSB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZVJlY3Vyc2l2ZShjaGlsZCwgaWQpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKiBUw6xtIGto4buRaSBDSEEgdHLhu7FjIHRp4bq/cCBj4bunYSBt4buZdCBraOG7kWksIMSRaSBzw6J1IHbDoG8gbeG7jWkgY29udGFpbmVyLiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRQYXJlbnRSZWN1cnNpdmUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUsIGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdC5jaGlsZHJlbiA/PyBbXSkge1xuICAgIGlmIChjaGlsZC5pZCA9PT0gaWQpIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIGNvbnN0IGZvdW5kID0gZmluZFBhcmVudFJlY3Vyc2l2ZShjaGlsZCwgaWQpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogVGjhuqMga2jhu5FpIHbDoG8gxJHDum5nIMO0IG3DoCBnaG9zdCDEkWFuZyBjaOG7iSwgxJHhuql5IGPDoWMga2jhu5FpIHZhIGNo4bqhbSB4deG7kW5nIGTGsOG7m2kuXG4gKlxuICogR2hvc3QgxJFhbmcgbuG6sW0gdHJvbmcgbeG7mXQgY29udGFpbmVyIChgaXNJbnNpZGVHcm91cGApIHRow6wgdGjhuqMgdsOgbyBydeG7mXQgY29udGFpbmVyIMSRw7M7IGtow7RuZyB0w6xtIHRo4bqleVxuICogY29udGFpbmVyIHRow6wgdHLhuqMgYGZhbHNlYCBjaOG7qSBLSMOUTkcgcsahaSB24buBIGzGsOG7m2kgZ+G7kWMg4oCUIHRo4bqjIG5o4bqnbSBj4bqlcCBraMOzIG5o4bqtbiByYSBoxqFuIGzDoCBraMO0bmcgdGjhuqMuXG4gKi9cbmV4cG9ydCBjb25zdCBkcm9wTm9kZUF0Q29vcmRpbmF0ZXMgPSAoXG4gIHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlLFxuICBnaG9zdDogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCxcbiAgbmV3Tm9kZTogVF9ncmlkTGF5b3V0X25ld05vZGVcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub2RlVG9BZGQ6IFRfZ3JpZExheW91dF9ub2RlID0ge1xuICAgIC4uLm5ld05vZGUsXG4gICAgaWQ6IG5ld05vZGUuaWQgPz8gdXVpZCgpLFxuICAgIHg6IGdob3N0LmNvbCxcbiAgICB5OiBnaG9zdC5yb3csXG4gICAgY29sczogZ2hvc3QuY29scyxcbiAgICByb3dzOiBnaG9zdC5yb3dzLFxuICB9O1xuXG4gIGlmIChnaG9zdC5pc0luc2lkZUdyb3VwICYmIGdob3N0LnRhcmdldFBhcmVudElkKSB7XG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IGZpbmROb2RlUmVjdXJzaXZlKHJvb3QsIGdob3N0LnRhcmdldFBhcmVudElkKTtcblxuICAgIGlmICghcGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwYXJlbnROb2RlLmNoaWxkcmVuID0gcGFyZW50Tm9kZS5jaGlsZHJlbiA/PyBbXTtcbiAgICByZXNvbHZlQ29sbGlzaW9uc0FuZEluc2VydChwYXJlbnROb2RlLmNoaWxkcmVuLCBub2RlVG9BZGQpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByb290LmNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbiA/PyBbXTtcbiAgcmVzb2x2ZUNvbGxpc2lvbnNBbmRJbnNlcnQocm9vdC5jaGlsZHJlbiwgbm9kZVRvQWRkKTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqIEto4buRaSBjw7MgcGjhuqNpIENPTlRBSU5FUiBraMO0bmcg4oCUIHThu6ljIGPDsyBraOG7kWkgY29uIGLDqm4gdHJvbmcuICovXG5leHBvcnQgY29uc3QgaXNDb250YWluZXJOb2RlID0gKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogYm9vbGVhbiA9PiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMDtcblxuLyoqIEto4buRaSBjw7MgbuG6sW0gTOG7kk5HIGLDqm4gdHJvbmcgbeG7mXQgY29udGFpbmVyIGtow7RuZyAoa2jDtG5nIHBo4bqjaSBjb24gdHLhu7FjIHRp4bq/cCBj4bunYSBn4buRYykuICovXG5leHBvcnQgY29uc3QgaXNOb2RlTmVzdGVkSW5zaWRlID0gKHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXJvb3Q/LmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICFyb290LmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gbm9kZUlkKTtcbn07XG5cbi8qKlxuICogQ8OzIMSRxrDhu6NjIMSR4buVaSBraOG7kWkgxJHGoW4g4oaUIGNvbnRhaW5lciBraMO0bmcuXG4gKlxuICog8J+UtCBCYSBow6BtIGPhu50gbsOgeSBQSOG6okkgbMOgIG5ndeG7k24gZHV5IG5o4bqldCBjaG8gY+G6oyB0aGFuaCBjw7RuZyBj4bulIGPhu6dhIHRoxrAgdmnhu4duIGzhuqtuIG1lbnUgZG8gbsahaSBkw7luZyB04buxXG4gKiBk4buxbmcuIFRyxrDhu5tjIMSRw6J5IG7GoWkgZMO5bmcgcGjhuqNpIGNow6lwIGzhuqFpIHF1eSB04bqvYyDEkeG7gyBk4buxbmcgbWVudSB0csaw4bubYyBsw7pjIHJlbmRlciwgdsOgIGhhaSBi4bqjbiBs4buHY2ggbmhhdVxuICogbeG7l2kga2hpIHRoxrAgdmnhu4duIMSR4buVaSB0cuG6p24gbOG7k25nIGPhuqVwIG3DoCBraMO0bmcgY8OzIGfDrCBiw6FvLlxuICovXG5leHBvcnQgY29uc3QgY2FuVG9nZ2xlVHlwZU5vZGUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQsIG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogYm9vbGVhbiA9PlxuICBpc0NvbnRhaW5lck5vZGUobm9kZSkgfHwgIWlzTm9kZU5lc3RlZEluc2lkZShyb290LCBub2RlLmlkKTtcblxuLyoqIEPDsyDEkcaw4bujYyB0aMOqbSBraOG7kWkgdsOgbyBCw4pOIFRST05HIGto4buRaSBuw6B5IGtow7RuZy4gKi9cbmV4cG9ydCBjb25zdCBjYW5BZGRJbnNpZGVOb2RlID0gKHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkLCBub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IGJvb2xlYW4gPT5cbiAgaXNDb250YWluZXJOb2RlKG5vZGUpICYmICFpc05vZGVOZXN0ZWRJbnNpZGUocm9vdCwgbm9kZS5pZCk7XG4iXX0=
@@ -0,0 +1,89 @@
1
+ import { calculateDropGhost } from './defines/collision.define';
2
+ /** Lớp CSS bật ô li của một lưới trong lúc người dùng đang kéo khối vào. */
3
+ const LOP_HIEN_O_LI = 'display-grid';
4
+ /**
5
+ * Giữ trạng thái một lượt kéo khối từ palette bên ngoài vào mặt phẳng.
6
+ *
7
+ * Việc nó lo: bật ô li của lưới đang được kéo tới (lưới gốc, và lưới của container khi con trỏ đi
8
+ * vào trong), tắt đúng lúc, và trả về ghost để nơi dùng vẽ khung xem trước.
9
+ *
10
+ * 🔴 Tự bật/tắt ô li bằng tay ở nơi dùng là chỗ rất dễ sót: kéo ra khỏi container rồi mà quên tắt
11
+ * thì ô li của nó nằm lại trên màn, kéo sang lưới khác lại chồng thêm một lớp nữa.
12
+ */
13
+ export class LibsUiGridLayoutDragController {
14
+ payload;
15
+ hoveredElement;
16
+ rootGridsterElement;
17
+ /** Payload của khối đang được kéo; `undefined` khi không có lượt kéo nào. */
18
+ get ActivePayload() {
19
+ return this.payload;
20
+ }
21
+ /** Gọi ở `dragstart` của thẻ trong palette. */
22
+ onDragStart(payload) {
23
+ this.payload = payload;
24
+ }
25
+ /** Gọi ở `dragend` — dọn sạch mọi ô li đang bật. */
26
+ onDragEnd(container) {
27
+ this.payload = undefined;
28
+ this.cleanupAll(container);
29
+ }
30
+ /** Tắt ô li của container đang hover. */
31
+ cleanupHoveredGroup() {
32
+ if (!this.hoveredElement) {
33
+ return;
34
+ }
35
+ this.hoveredElement.classList.remove(LOP_HIEN_O_LI);
36
+ this.hoveredElement = undefined;
37
+ }
38
+ /** Tắt ô li của lưới gốc, và quét sạch lớp còn sót trong khung chứa. */
39
+ cleanupRootGrid(container) {
40
+ if (this.rootGridsterElement) {
41
+ this.rootGridsterElement.classList.remove(LOP_HIEN_O_LI);
42
+ this.rootGridsterElement = undefined;
43
+ }
44
+ container?.querySelectorAll(`gridster.${LOP_HIEN_O_LI}`).forEach((el) => el.classList.remove(LOP_HIEN_O_LI));
45
+ }
46
+ /** Tắt toàn bộ ô li đang bật. */
47
+ cleanupAll(container) {
48
+ this.cleanupHoveredGroup();
49
+ this.cleanupRootGrid(container);
50
+ }
51
+ /**
52
+ * Gọi ở `dragover` của khung chứa mặt phẳng. Trả ghost để nơi dùng vẽ khung xem trước, đồng thời
53
+ * tự bật ô li của lưới đang được kéo tới.
54
+ */
55
+ onDragOver(event, container, root, totalCols) {
56
+ event.preventDefault();
57
+ if (event.dataTransfer) {
58
+ event.dataTransfer.dropEffect = 'copy';
59
+ }
60
+ if (!container || !root || !this.payload) {
61
+ return undefined;
62
+ }
63
+ this.showRootGrid(container);
64
+ const ghost = calculateDropGhost(event, container, root, this.payload, totalCols);
65
+ if (!ghost?.isInsideGroup || !ghost.hoveredGridster) {
66
+ this.cleanupHoveredGroup();
67
+ return ghost;
68
+ }
69
+ if (this.hoveredElement !== ghost.hoveredGridster) {
70
+ this.cleanupHoveredGroup();
71
+ ghost.hoveredGridster.classList.add(LOP_HIEN_O_LI);
72
+ this.hoveredElement = ghost.hoveredGridster;
73
+ }
74
+ return ghost;
75
+ }
76
+ /** Bật ô li của lưới CẤP TRANG trong suốt lượt kéo, tắt lưới cũ nếu khung chứa đã đổi. */
77
+ showRootGrid(container) {
78
+ const rootGridster = container.querySelector('gridster') ?? undefined;
79
+ if (!rootGridster) {
80
+ return;
81
+ }
82
+ if (this.rootGridsterElement && this.rootGridsterElement !== rootGridster) {
83
+ this.rootGridsterElement.classList.remove(LOP_HIEN_O_LI);
84
+ }
85
+ rootGridster.classList.add(LOP_HIEN_O_LI);
86
+ this.rootGridsterElement = rootGridster;
87
+ }
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9ncmlkLWxheW91dC9zcmMvZHJhZy1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLDRFQUE0RTtBQUM1RSxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFFckM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sOEJBQThCO0lBQ2pDLE9BQU8sQ0FBb0M7SUFDM0MsY0FBYyxDQUFlO0lBQzdCLG1CQUFtQixDQUFlO0lBRTFDLDZFQUE2RTtJQUM3RSxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxXQUFXLENBQUMsT0FBeUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxTQUFTLENBQUMsU0FBdUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsZUFBZSxDQUFDLFNBQXVCO1FBQ3JDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFlBQVksYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUVELGlDQUFpQztJQUNqQyxVQUFVLENBQUMsU0FBdUI7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUNSLEtBQWdCLEVBQ2hCLFNBQWtDLEVBQ2xDLElBQW1DLEVBQ25DLFNBQWtCO1FBRWxCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRixJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUUzQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixZQUFZLENBQUMsU0FBc0I7UUFDekMsTUFBTSxZQUFZLEdBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQXdCLElBQUksU0FBUyxDQUFDO1FBRTlGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQztJQUMxQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25vZGUsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHJvcEdob3N0IH0gZnJvbSAnLi9kZWZpbmVzL2NvbGxpc2lvbi5kZWZpbmUnO1xuXG4vKiogTOG7m3AgQ1NTIGLhuq10IMO0IGxpIGPhu6dhIG3hu5l0IGzGsOG7m2kgdHJvbmcgbMO6YyBuZ8aw4budaSBkw7luZyDEkWFuZyBrw6lvIGto4buRaSB2w6BvLiAqL1xuY29uc3QgTE9QX0hJRU5fT19MSSA9ICdkaXNwbGF5LWdyaWQnO1xuXG4vKipcbiAqIEdp4buvIHRy4bqhbmcgdGjDoWkgbeG7mXQgbMaw4bujdCBrw6lvIGto4buRaSB04burIHBhbGV0dGUgYsOqbiBuZ2/DoGkgdsOgbyBt4bq3dCBwaOG6s25nLlxuICpcbiAqIFZp4buHYyBuw7MgbG86IGLhuq10IMO0IGxpIGPhu6dhIGzGsOG7m2kgxJFhbmcgxJHGsOG7o2Mga8OpbyB04bubaSAobMaw4bubaSBn4buRYywgdsOgIGzGsOG7m2kgY+G7p2EgY29udGFpbmVyIGtoaSBjb24gdHLhu48gxJFpXG4gKiB2w6BvIHRyb25nKSwgdOG6r3QgxJHDum5nIGzDumMsIHbDoCB0cuG6oyB24buBIGdob3N0IMSR4buDIG7GoWkgZMO5bmcgduG6vSBraHVuZyB4ZW0gdHLGsOG7m2MuXG4gKlxuICog8J+UtCBU4buxIGLhuq10L3Thuq90IMO0IGxpIGLhurFuZyB0YXkg4bufIG7GoWkgZMO5bmcgbMOgIGNo4buXIHLhuqV0IGThu4Ugc8OzdDoga8OpbyByYSBraOG7j2kgY29udGFpbmVyIHLhu5NpIG3DoCBxdcOqbiB04bqvdFxuICogdGjDrCDDtCBsaSBj4bunYSBuw7MgbuG6sW0gbOG6oWkgdHLDqm4gbcOgbiwga8OpbyBzYW5nIGzGsOG7m2kga2jDoWMgbOG6oWkgY2jhu5NuZyB0aMOqbSBt4buZdCBs4bubcCBu4buvYS5cbiAqL1xuZXhwb3J0IGNsYXNzIExpYnNVaUdyaWRMYXlvdXREcmFnQ29udHJvbGxlciB7XG4gIHByaXZhdGUgcGF5bG9hZD86IFRfZ3JpZExheW91dF9leHRlcm5hbERyYWdQYXlsb2FkO1xuICBwcml2YXRlIGhvdmVyZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcm9vdEdyaWRzdGVyRWxlbWVudD86IEhUTUxFbGVtZW50O1xuXG4gIC8qKiBQYXlsb2FkIGPhu6dhIGto4buRaSDEkWFuZyDEkcaw4bujYyBrw6lvOyBgdW5kZWZpbmVkYCBraGkga2jDtG5nIGPDsyBsxrDhu6N0IGvDqW8gbsOgby4gKi9cbiAgZ2V0IEFjdGl2ZVBheWxvYWQoKTogVF9ncmlkTGF5b3V0X2V4dGVybmFsRHJhZ1BheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQ7XG4gIH1cblxuICAvKiogR+G7jWkg4bufIGBkcmFnc3RhcnRgIGPhu6dhIHRo4bq7IHRyb25nIHBhbGV0dGUuICovXG4gIG9uRHJhZ1N0YXJ0KHBheWxvYWQ6IFRfZ3JpZExheW91dF9leHRlcm5hbERyYWdQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKiBH4buNaSDhu58gYGRyYWdlbmRgIOKAlCBk4buNbiBz4bqhY2ggbeG7jWkgw7QgbGkgxJFhbmcgYuG6rXQuICovXG4gIG9uRHJhZ0VuZChjb250YWluZXI/OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFudXBBbGwoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKiBU4bqvdCDDtCBsaSBj4bunYSBjb250YWluZXIgxJFhbmcgaG92ZXIuICovXG4gIGNsZWFudXBIb3ZlcmVkR3JvdXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvdmVyZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaG92ZXJlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShMT1BfSElFTl9PX0xJKTtcbiAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFThuq90IMO0IGxpIGPhu6dhIGzGsOG7m2kgZ+G7kWMsIHbDoCBxdcOpdCBz4bqhY2ggbOG7m3AgY8OybiBzw7N0IHRyb25nIGtodW5nIGNo4bupYS4gKi9cbiAgY2xlYW51cFJvb3RHcmlkKGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm9vdEdyaWRzdGVyRWxlbWVudCkge1xuICAgICAgdGhpcy5yb290R3JpZHN0ZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoTE9QX0hJRU5fT19MSSk7XG4gICAgICB0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChgZ3JpZHN0ZXIuJHtMT1BfSElFTl9PX0xJfWApLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKExPUF9ISUVOX09fTEkpKTtcbiAgfVxuXG4gIC8qKiBU4bqvdCB0b8OgbiBi4buZIMO0IGxpIMSRYW5nIGLhuq10LiAqL1xuICBjbGVhbnVwQWxsKGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwSG92ZXJlZEdyb3VwKCk7XG4gICAgdGhpcy5jbGVhbnVwUm9vdEdyaWQoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBH4buNaSDhu58gYGRyYWdvdmVyYCBj4bunYSBraHVuZyBjaOG7qWEgbeG6t3QgcGjhurNuZy4gVHLhuqMgZ2hvc3QgxJHhu4MgbsahaSBkw7luZyB24bq9IGtodW5nIHhlbSB0csaw4bubYywgxJHhu5NuZyB0aOG7nWlcbiAgICogdOG7sSBi4bqtdCDDtCBsaSBj4bunYSBsxrDhu5tpIMSRYW5nIMSRxrDhu6NjIGvDqW8gdOG7m2kuXG4gICAqL1xuICBvbkRyYWdPdmVyKFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCxcbiAgICB0b3RhbENvbHM/OiBudW1iZXJcbiAgKTogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCB8IHVuZGVmaW5lZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgICB9XG4gICAgaWYgKCFjb250YWluZXIgfHwgIXJvb3QgfHwgIXRoaXMucGF5bG9hZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5zaG93Um9vdEdyaWQoY29udGFpbmVyKTtcblxuICAgIGNvbnN0IGdob3N0ID0gY2FsY3VsYXRlRHJvcEdob3N0KGV2ZW50LCBjb250YWluZXIsIHJvb3QsIHRoaXMucGF5bG9hZCwgdG90YWxDb2xzKTtcblxuICAgIGlmICghZ2hvc3Q/LmlzSW5zaWRlR3JvdXAgfHwgIWdob3N0LmhvdmVyZWRHcmlkc3Rlcikge1xuICAgICAgdGhpcy5jbGVhbnVwSG92ZXJlZEdyb3VwKCk7XG5cbiAgICAgIHJldHVybiBnaG9zdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3ZlcmVkRWxlbWVudCAhPT0gZ2hvc3QuaG92ZXJlZEdyaWRzdGVyKSB7XG4gICAgICB0aGlzLmNsZWFudXBIb3ZlcmVkR3JvdXAoKTtcbiAgICAgIGdob3N0LmhvdmVyZWRHcmlkc3Rlci5jbGFzc0xpc3QuYWRkKExPUF9ISUVOX09fTEkpO1xuICAgICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IGdob3N0LmhvdmVyZWRHcmlkc3RlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2hvc3Q7XG4gIH1cblxuICAvKiogQuG6rXQgw7QgbGkgY+G7p2EgbMaw4bubaSBD4bqkUCBUUkFORyB0cm9uZyBzdeG7kXQgbMaw4bujdCBrw6lvLCB04bqvdCBsxrDhu5tpIGPFqSBu4bq/dSBraHVuZyBjaOG7qWEgxJHDoyDEkeG7lWkuICovXG4gIHByaXZhdGUgc2hvd1Jvb3RHcmlkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByb290R3JpZHN0ZXIgPSAoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXJvb3RHcmlkc3Rlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgJiYgdGhpcy5yb290R3JpZHN0ZXJFbGVtZW50ICE9PSByb290R3JpZHN0ZXIpIHtcbiAgICAgIHRoaXMucm9vdEdyaWRzdGVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKExPUF9ISUVOX09fTEkpO1xuICAgIH1cbiAgICByb290R3JpZHN0ZXIuY2xhc3NMaXN0LmFkZChMT1BfSElFTl9PX0xJKTtcbiAgICB0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgPSByb290R3JpZHN0ZXI7XG4gIH1cbn1cbiJdfQ==